[FFmpeg-devel] [PATCH] libavfilter: pass QP table through the filter chain
Stefano Sabatini
stefasab at gmail.com
Wed Sep 5 16:53:52 CEST 2012
On date Wednesday 2012-09-05 12:46:43 +0200, Michael Niedermayer encoded:
> Any volunteers to port the pp and spp filters from libmpcodec?
>
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
> libavfilter/avcodec.c | 8 ++++++++
> libavfilter/avfilter.h | 2 ++
> libavfilter/buffer.c | 23 ++++++++++++++++++++++-
> libavfilter/version.h | 4 ++--
> libavfilter/video.c | 1 +
> 5 files changed, 35 insertions(+), 3 deletions(-)
>
> diff --git a/libavfilter/avcodec.c b/libavfilter/avcodec.c
> index f452303..51de6f5 100644
> --- a/libavfilter/avcodec.c
> +++ b/libavfilter/avcodec.c
> @@ -42,6 +42,14 @@ int avfilter_copy_frame_props(AVFilterBufferRef *dst, const AVFrame *src)
> dst->video->top_field_first = src->top_field_first;
> dst->video->key_frame = src->key_frame;
> dst->video->pict_type = src->pict_type;
> + av_freep(&dst->video->qp_table);
> + dst->video->qp_stride = 0;
> + if (src->qscale_table) {
> + int qsize = src->qstride ? src->qstride * ((src->height+15)/16) : (src->width+15)/16;
> + dst->video->qp_stride = src->qstride;
> + dst->video->qp_table = av_malloc(qsize);
> + memcpy(dst->video->qp_table, src->qscale_table, qsize);
What if malloc fails?
Also maybe we should factorize the code.
> + }
> break;
> case AVMEDIA_TYPE_AUDIO:
> dst->audio->sample_rate = src->sample_rate;
> diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h
> index c0575ce..5316559 100644
> --- a/libavfilter/avfilter.h
> +++ b/libavfilter/avfilter.h
> @@ -131,6 +131,8 @@ typedef struct AVFilterBufferRefVideoProps {
> int top_field_first; ///< field order
> enum AVPictureType pict_type; ///< picture type of the frame
> int key_frame; ///< 1 -> keyframe, 0-> not
> + int qp_stride; ///< qp_table stride
> + int8_t *qp_table; ///< array of Quantization Parameters
"stride" is kinda an MPlayerism.
Some alternatives:
qp_table | qp_linesize
qp | qp_linesize
qp_data | qp_linesize
qp_data | qp_data_linesize
qp_table | qp_table_linesize
> } AVFilterBufferRefVideoProps;
>
> /**
> diff --git a/libavfilter/buffer.c b/libavfilter/buffer.c
> index 3431c91..d73275d 100644
> --- a/libavfilter/buffer.c
> +++ b/libavfilter/buffer.c
> @@ -52,6 +52,11 @@ AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask)
> return NULL;
> }
> *ret->video = *ref->video;
> + if(ret->video->qp_table) {
> + int qsize = ref->video->qp_stride ? ref->video->qp_stride * ((ref->video->h+15)/16) : (ref->video->w+15)/16;
> + ret->video->qp_table = av_malloc(qsize);
> + memcpy(ret->video->qp_table, ref->video->qp_table, qsize);
> + }
> ret->extended_data = ret->data;
> } else if (ref->type == AVMEDIA_TYPE_AUDIO) {
> ret->audio = av_malloc(sizeof(AVFilterBufferRefAudioProps));
> @@ -95,6 +100,7 @@ void ff_free_pool(AVFilterPool *pool)
> av_freep(&picref->buf);
>
> av_freep(&picref->audio);
> + av_assert0(!picref->video || !picref->video->qp_table);
> av_freep(&picref->video);
> av_freep(&pool->pic[i]);
> pool->count--;
> @@ -116,6 +122,9 @@ static void store_in_pool(AVFilterBufferRef *ref)
> av_assert0(ref->buf->data[0]);
> av_assert0(pool->refcount>0);
>
> + if(ref->video)
> + av_freep(&ref->video->qp_table);
> +
> if (pool->count == POOL_SIZE) {
> AVFilterBufferRef *ref1 = pool->pic[0];
> av_freep(&ref1->video);
> @@ -155,6 +164,8 @@ void avfilter_unref_buffer(AVFilterBufferRef *ref)
> }
> if (ref->extended_data != ref->data)
> av_freep(&ref->extended_data);
> + if(ref->video)
> + av_freep(&ref->video->qp_table);
> av_freep(&ref->video);
> av_freep(&ref->audio);
> av_free(ref);
> @@ -173,7 +184,17 @@ void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *s
> dst->pos = src->pos;
>
> switch (src->type) {
> - case AVMEDIA_TYPE_VIDEO: *dst->video = *src->video; break;
> + case AVMEDIA_TYPE_VIDEO: {
> + if(dst->video->qp_table)
> + av_freep(&dst->video->qp_table);
> + *dst->video = *src->video;
> + if(dst->video->qp_table) {
^^^
src->video->qp_table?
> + int qsize = src->video->qp_stride ? src->video->qp_stride * ((src->video->h+15)/16) : (src->video->w+15)/16;
> + dst->video->qp_table = av_malloc(qsize);
> + memcpy(dst->video->qp_table, src->video->qp_table, qsize);
> + }
> + break;
> + }
> case AVMEDIA_TYPE_AUDIO: *dst->audio = *src->audio; break;
> default: break;
> }
[...]
--
FFmpeg = Fast and Funny Mind-dumbing Perfectionist Easy Goblin
More information about the ffmpeg-devel
mailing list