avconv: don't use InputStream in the buffer management code.
authorAnton Khirnov <anton@khirnov.net>
Wed, 30 May 2012 05:32:43 +0000 (07:32 +0200)
committerAnton Khirnov <anton@khirnov.net>
Tue, 5 Jun 2012 07:35:39 +0000 (09:35 +0200)
Use just the pointer to the head of the buffer pool.

This will allow sharing the code with avplay.

avconv.c

index f01dad0..045fb27 100644 (file)
--- 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))