From: "Ronald S. Bultje" <[email protected]>

---
 avconv.c             |   10 ++++++----
 libavcodec/pthread.c |    4 ++++
 libavcodec/utils.c   |    8 +++-----
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/avconv.c b/avconv.c
index b83662c..9e4e19f 100644
--- a/avconv.c
+++ b/avconv.c
@@ -424,9 +424,8 @@ static void reset_options(OptionsContext *o)
     init_opts();
 }
 
-static int alloc_buffer(InputStream *ist, FrameBuffer **pbuf)
+static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer 
**pbuf)
 {
-    AVCodecContext *s = ist->st->codec;
     FrameBuffer  *buf = av_mallocz(sizeof(*buf));
     int i, ret;
     const int pixel_size = 
av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
@@ -502,7 +501,7 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame 
*frame)
     FrameBuffer *buf;
     int ret, i;
 
-    if (!ist->buffer_pool && (ret = alloc_buffer(ist, &ist->buffer_pool)) < 0)
+    if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 
0)
         return ret;
 
     buf              = ist->buffer_pool;
@@ -511,7 +510,7 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame 
*frame)
     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, &buf)) < 0)
+        if ((ret = alloc_buffer(ist, s, &buf)) < 0)
             return ret;
     }
     buf->refcount++;
@@ -520,6 +519,9 @@ static int codec_get_buffer(AVCodecContext *s, AVFrame 
*frame)
     frame->type          = FF_BUFFER_TYPE_USER;
     frame->extended_data = frame->data;
     frame->pkt_pts       = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
+    frame->width         = buf->w;
+    frame->height        = buf->h;
+    frame->format        = buf->pix_fmt;
 
     for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
         frame->base[i]     = buf->base[i];  // XXX h264.c uses base though it 
shouldn't
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 2e4c6a8..19effa9 100644
--- a/libavcodec/pthread.c
+++ b/libavcodec/pthread.c
@@ -955,6 +955,10 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f)
             ff_thread_finish_setup(avctx);
     }
 
+    if (err) {
+        free_progress(f);
+        f->thread_opaque = NULL;
+    }
     pthread_mutex_unlock(&p->parent->buffer_mutex);
 
     return err;
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index a638bbf..d598748 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -392,11 +392,6 @@ static int video_get_buffer(AVCodecContext *s, AVFrame 
*pic)
     buf = &avci->buffer[avci->buffer_count];
 
     if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != 
s->pix_fmt)){
-        if(s->active_thread_type&FF_THREAD_FRAME) {
-            av_log_missing_feature(s, "Width/height changing with frame 
threads is", 0);
-            return -1;
-        }
-
         for (i = 0; i < AV_NUM_DATA_POINTERS; i++) {
             av_freep(&buf->base[i]);
             buf->data[i]= NULL;
@@ -480,6 +475,9 @@ static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
     }
     pic->extended_data = pic->data;
     avci->buffer_count++;
+    pic->width  = buf->width;
+    pic->height = buf->height;
+    pic->format = buf->pix_fmt;
 
     if(s->pkt) pic->pkt_pts= s->pkt->pts;
     else       pic->pkt_pts= AV_NOPTS_VALUE;
-- 
1.7.9.2

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

Reply via email to