On 2012-05-30 11:36:43 +0200, Anton Khirnov wrote:
> Use just the pointer to the head of the buffer pool.
> 
> This will allow sharing the code with avplay.
> ---
>  avconv.c |   41 +++++++++++++++++++++--------------------
>  1 file changed, 21 insertions(+), 20 deletions(-)
> 
> diff --git a/avconv.c b/avconv.c
> index cbf66c4..34dc50d 100644
> --- a/avconv.c
> +++ b/avconv.c
> @@ -180,7 +180,7 @@ typedef struct FrameBuffer {
>      enum PixelFormat pix_fmt;
>  
>      int refcount;
> -    struct InputStream *ist;
> +    struct FrameBuffer **pool;  ///< head of the buffer pool
>      struct FrameBuffer *next;
>  } FrameBuffer;
>  
> @@ -449,7 +449,7 @@ static void reset_options(OptionsContext *o)
>      init_opts();
>  }
>  
> -static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer 
> **pbuf)
> +static int alloc_buffer(FrameBuffer **pool, AVCodecContext *s, FrameBuffer 
> **pbuf)
>  {
>      FrameBuffer  *buf = av_mallocz(sizeof(*buf));
>      int i, ret;
> @@ -493,49 +493,51 @@ static int alloc_buffer(InputStream *ist, 
> AVCodecContext *s, FrameBuffer **pbuf)
>      buf->w       = s->width;
>      buf->h       = s->height;
>      buf->pix_fmt = s->pix_fmt;
> -    buf->ist     = ist;
> +    buf->pool    = pool;
>  
>      *pbuf = buf;
>      return 0;
>  }
>  
> -static void free_buffer_pool(InputStream *ist)
> +static void free_buffer_pool(FrameBuffer **pool)
>  {
> -    FrameBuffer *buf = ist->buffer_pool;
> +    FrameBuffer *buf = *pool;
>      while (buf) {
> -        ist->buffer_pool = buf->next;
> +        *pool = buf->next;
>          av_freep(&buf->base[0]);
>          av_free(buf);
> -        buf = ist->buffer_pool;
> +        buf = *pool;
>      }
>  }
>  
> -static void unref_buffer(InputStream *ist, FrameBuffer *buf)
> +static void unref_buffer(FrameBuffer *buf)
>  {
> +    FrameBuffer **pool = buf->pool;
> +
>      av_assert0(buf->refcount);
>      buf->refcount--;
>      if (!buf->refcount) {
> -        buf->next = ist->buffer_pool;
> -        ist->buffer_pool = buf;
> +        buf->next = *pool;
> +        *pool = buf;
>      }
>  }
>  
>  static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
>  {
> -    InputStream *ist = s->opaque;
> +    FrameBuffer **pool = s->opaque;
>      FrameBuffer *buf;
>      int ret, i;
>  
> -    if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) 
> < 0)
> +    if (!*pool && (ret = alloc_buffer(pool, s, pool)) < 0)
>          return ret;
>  
> -    buf              = ist->buffer_pool;
> -    ist->buffer_pool = buf->next;
> +    buf              = *pool;
> +    *pool            = buf->next;
>      buf->next        = NULL;
>      if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != 
> s->pix_fmt) {
>          av_freep(&buf->base[0]);
>          av_free(buf);
> -        if ((ret = alloc_buffer(ist, s, &buf)) < 0)
> +        if ((ret = alloc_buffer(pool, s, &buf)) < 0)
>              return ret;
>      }
>      buf->refcount++;
> @@ -560,21 +562,20 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame 
> *frame)
>  
>  static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
>  {
> -    InputStream *ist = s->opaque;
>      FrameBuffer *buf = frame->opaque;
>      int i;
>  
>      for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
>          frame->data[i] = NULL;
>  
> -    unref_buffer(ist, buf);
> +    unref_buffer(buf);
>  }
>  
>  static void filter_release_buffer(AVFilterBuffer *fb)
>  {
>      FrameBuffer *buf = fb->priv;
>      av_free(fb);
> -    unref_buffer(buf->ist, buf);
> +    unref_buffer(buf);
>  }
>  
>  /**
> @@ -1205,7 +1206,7 @@ void exit_program(int ret)
>      for (i = 0; i < nb_input_streams; i++) {
>          av_freep(&input_streams[i]->decoded_frame);
>          av_dict_free(&input_streams[i]->opts);
> -        free_buffer_pool(input_streams[i]);
> +        free_buffer_pool(&input_streams[i]->buffer_pool);
>          av_freep(&input_streams[i]->filters);
>          av_freep(&input_streams[i]);
>      }
> @@ -2420,7 +2421,7 @@ static int init_input_stream(int ist_index, char 
> *error, int error_len)
>          if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & 
> CODEC_CAP_DR1) {
>              ist->st->codec->get_buffer     = codec_get_buffer;
>              ist->st->codec->release_buffer = codec_release_buffer;
> -            ist->st->codec->opaque         = ist;
> +            ist->st->codec->opaque         = &ist->buffer_pool;
>          }
>  
>          if (!av_dict_get(ist->opts, "threads", NULL, 0))

lgtm

Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to