[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