On 2012-03-23 15:03:03 -0700, Ronald S. Bultje wrote:
> 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;

ok

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

Reply via email to