On Tue, Dec 16, 2014 at 11:14:58AM +0530, arwa arif wrote: > On Tue, Dec 16, 2014 at 6:06 AM, Michael Niedermayer <michae...@gmx.at> > wrote: > > > > On Mon, Dec 15, 2014 at 10:55:26PM +0530, arwa arif wrote: > > > This patch seems to be working. Sorry for the previous one. > > > > > doc/filters.texi | 24 > > > libavfilter/Makefile | 1 > > > libavfilter/allfilters.c | 1 > > > libavfilter/libmpcodecs/vf_fspp.c | 4 > > > libavfilter/version.h | 2 > > > libavfilter/vf_fspp.c | 400 ++++++++++ > > > libavfilter/vf_fspp.h | 352 +++++++++ > > > libavfilter/x86/Makefile | 1 > > > libavfilter/x86/vf_fspp.c | 1391 > > ++++++++++++++++++++++++++++++++++++++ > > > 9 files changed, 2173 insertions(+), 3 deletions(-) > > > d945d17d2227a2628acbcba387267734c3914841 0001-Port-fspp-to-FFmpeg.patch > > > From 97d90c5a1a8c10a1b19a5250c90d02fb74e79735 Mon Sep 17 00:00:00 2001 > > > From: Arwa Arif <arwaarif1...@gmail.com> > > > Date: Sun, 14 Dec 2014 12:03:31 +0530 > > > Subject: [PATCH] Port fspp to FFmpeg > > > > [...] > > > + if (fspp->log2_count && !ctx->is_disabled) { > > > + if (!fspp->use_bframe_qp && fspp->non_b_qp_table) > > > + qp_table = fspp->non_b_qp_table; > > > + > > > + if (qp_table || fspp->qp) { > > > + > > > + /* get a new frame if in-place is not possible or if the > > dimensions > > > + * are not multiple of 8 */ > > > + if (!av_frame_is_writable(in) || (inlink->w & 7) || > > (inlink->h & 7)) { > > > + const int aligned_w = FFALIGN(inlink->w, 8); > > > + const int aligned_h = FFALIGN(inlink->h, 8); > > > + > > > + out = ff_get_video_buffer(outlink, aligned_w, > > aligned_h); > > > + if (!out) { > > > + av_frame_free(&in); > > > + return AVERROR(ENOMEM); > > > + } > > > + av_frame_copy_props(out, in); > > > + out->width = in->width; > > > + out->height = in->height; > > > + } > > > + > > > > > + filter(fspp , out->data[0] , in->data[0] , out->linesize[0] > > , in->linesize[0] , > > > + inlink->w , inlink->h , qp_table , qp_stride , 1); > > > > > + filter(fspp , out->data[1] , in->data[1] , out->linesize[1] > > , in->linesize[1] , > > > + inlink->w , inlink->h , qp_table , qp_stride , 0); > > > + filter(fspp , out->data[2] , in->data[2] , out->linesize[2] > > , in->linesize[2] , > > > + inlink->w , inlink->h , qp_table , qp_stride , 0); > > > > the 2 chroma planes are smaller than luma, thus > > "inlink->w , inlink->h" is wrong for them > > > > you can calculate the sizes of the chroma plane with > > log2_chroma_w and log2_chroma_h from av_pix_fmt_desc_get() > > see similar code in other filters > > > > [...] > > > > -- > > Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB > > > > No human being will ever know the Truth, for even if they happen to say it > > by chance, they would not even known they had done so. -- Xenophanes > > > > _______________________________________________ > > ffmpeg-devel mailing list > > ffmpeg-devel@ffmpeg.org > > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > > >
> configure | 1 > doc/filters.texi | 24 > libavfilter/Makefile | 1 > libavfilter/allfilters.c | 1 > libavfilter/libmpcodecs/vf_fspp.c | 4 > libavfilter/version.h | 2 > libavfilter/vf_fspp.c | 662 ++++++++++++++++++ > libavfilter/vf_fspp.h | 95 ++ > libavfilter/x86/Makefile | 1 > libavfilter/x86/vf_fspp.c | 1397 > ++++++++++++++++++++++++++++++++++++++ > 10 files changed, 2185 insertions(+), 3 deletions(-) > 629ed1fb3bebe6f56eefc9515a14178c09f5d6ba 0001-Port-fspp-to-FFmpeg.patch > From d17fd6e84ee1d20d498975f8de26fe963e2baa57 Mon Sep 17 00:00:00 2001 > From: Arwa Arif <arwaarif1...@gmail.com> > Date: Sun, 14 Dec 2014 12:03:31 +0530 > Subject: [PATCH] Port fspp to FFmpeg > > --- > configure | 1 + > doc/filters.texi | 24 + > libavfilter/Makefile | 1 + > libavfilter/allfilters.c | 1 + > libavfilter/libmpcodecs/vf_fspp.c | 4 +- > libavfilter/version.h | 2 +- > libavfilter/vf_fspp.c | 662 ++++++++++++++++++ > libavfilter/vf_fspp.h | 95 +++ > libavfilter/x86/Makefile | 1 + > libavfilter/x86/vf_fspp.c | 1397 > +++++++++++++++++++++++++++++++++++++ > 10 files changed, 2185 insertions(+), 3 deletions(-) > create mode 100644 libavfilter/vf_fspp.c > create mode 100644 libavfilter/vf_fspp.h > create mode 100644 libavfilter/x86/vf_fspp.c > > diff --git a/configure b/configure > index e37285a..29f5534 100755 > --- a/configure > +++ b/configure > @@ -2575,6 +2575,7 @@ ebur128_filter_deps="gpl" > flite_filter_deps="libflite" > frei0r_filter_deps="frei0r dlopen" > frei0r_src_filter_deps="frei0r dlopen" > +fspp_filter_deps="gpl" > geq_filter_deps="gpl" > histeq_filter_deps="gpl" > hqdn3d_filter_deps="gpl" > diff --git a/doc/filters.texi b/doc/filters.texi > index 882caa0..eefc507 100644 > --- a/doc/filters.texi > +++ b/doc/filters.texi > @@ -4997,6 +4997,30 @@ frei0r=perspective:0.2/0.2|0.8/0.2 > For more information, see > @url{http://frei0r.dyne.org} > > +@section fspp > + > +Faster version of the simple postprocessing filter - @ref{spp}. *** Undefined node `spp' in @ref (in doc/filters.texi l. 5002) i think this needs a @anchor{} [...] > +static void filter(FSPPContext *p , uint8_t *dst , uint8_t *src, > + int dst_stride , int src_stride , > + int width , int height , > + uint8_t *qp_store , int qp_stride , int is_luma) { > + > + int x, x0, y, es, qy, t; > + > + const int stride = is_luma ? p->temp_stride : (width+16); > + const int step = 6 - p->log2_count; > + const int qps = 3 + is_luma; this should be something like qpsh = 4 - hsub * !is_luma qpsv = 4 - vsub * !is_luma [...] > +static int config_input(AVFilterLink *inlink) > +{ > + > + AVFilterContext *ctx = inlink->dst; > + FSPPContext *fspp = ctx->priv; > + const int h = FFALIGN(inlink->h + 16, 16); > + const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); > + > + fspp->hsub = desc->log2_chroma_w; > + fspp->vsub = desc->log2_chroma_h; > + > + fspp->temp_stride = FFALIGN(inlink->w + 16, 16); > + fspp->temp = av_malloc_array(fspp->temp_stride, h * sizeof(*fspp->temp)); > + fspp->src = av_malloc_array(fspp->temp_stride, h * sizeof(*fspp->src)); > + if (!fspp->use_bframe_qp) { > + /* we are assuming here the qp blocks will not be smaller that 16x16 > */ > + fspp->non_b_qp_alloc_size = FF_CEIL_RSHIFT(inlink->w, 4) * > FF_CEIL_RSHIFT(inlink->h, 4); > + fspp->non_b_qp_table = av_calloc(fspp->non_b_qp_alloc_size, > sizeof(*fspp->non_b_qp_table)); > + if (!fspp->non_b_qp_table) > + return AVERROR(ENOMEM); > + } this can allocate a too small array, this bug is in the original spp filter see e8dbecb99569e2054babab973e74a69017d02f09 > + > + if (!fspp->temp || !fspp->src) > + return AVERROR(ENOMEM); > + > + fspp->store_slice = store_slice_c; > + fspp->store_slice2 = store_slice2_c; > + fspp->mul_thrmat = mul_thrmat_c; > + fspp->column_fidct = column_fidct_c; > + fspp->row_idct = row_idct_c; > + fspp->row_fdct = row_fdct_c; > + > + if (ARCH_X86) > + ff_fspp_init_x86(fspp); > + > + return 0; > +} > + > +static int filter_frame(AVFilterLink *inlink, AVFrame *in) > +{ > + AVFilterContext *ctx = inlink->dst; > + FSPPContext *fspp = ctx->priv; > + AVFilterLink *outlink = ctx->outputs[0]; > + AVFrame *out = in; > + > + int qp_stride = 0; > + uint8_t *qp_table = NULL; > + > + /* if we are not in a constant user quantizer mode and we don't want to > use > + * the quantizers from the B-frames (B-frames often have a higher QP), we > + * need to save the qp table from the last non B-frame; this is what the > + * following code block does */ > + if (!fspp->qp) { > + qp_table = av_frame_get_qp_table(in, &qp_stride, &fspp->qscale_type); > + > + if (qp_table && !fspp->use_bframe_qp && in->pict_type != > AV_PICTURE_TYPE_B) { > + int w, h; > + > + /* if the qp stride is not set, it means the QP are only defined > on > + * a line basis */ > + if (!qp_stride) { > + w = FF_CEIL_RSHIFT(inlink->w, 4); > + h = 1; > + } else { > + w = FF_CEIL_RSHIFT(qp_stride, 4); this is another bug from the original code see 2a8eb0d1565afe1c6f6a805a743987926a8dbaa7 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Dictatorship naturally arises out of democracy, and the most aggravated form of tyranny and slavery out of the most extreme liberty. -- Plato
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel