On 01/20/2012 11:43 AM, Janne Grunau wrote:

> They are used to signal the number of slices and offsets of each slice
> out of band to the decoder.
> ---
>  libavcodec/pthread.c |   24 +++++++++++++++++++++---
>  1 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
> index 0688d9d..a4e3081 100644
> --- a/libavcodec/pthread.c
> +++ b/libavcodec/pthread.c
> @@ -413,7 +413,6 @@ static int update_context_from_thread(AVCodecContext 
> *dst, AVCodecContext *src,
>  
>          dst->has_b_frames = src->has_b_frames;
>          dst->idct_algo    = src->idct_algo;
> -        dst->slice_count  = src->slice_count;
>  
>          dst->bits_per_coded_sample = src->bits_per_coded_sample;
>          dst->sample_aspect_ratio   = src->sample_aspect_ratio;
> @@ -447,8 +446,9 @@ static int update_context_from_thread(AVCodecContext 
> *dst, AVCodecContext *src,
>   *
>   * @param dst The destination context.
>   * @param src The source context.
> + * @return 0 on success, negative error code on failure
>   */
> -static void update_context_from_user(AVCodecContext *dst, AVCodecContext 
> *src)
> +static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
>  {
>  #define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - 
> (char*)&dst->s);
>      dst->flags          = src->flags;
> @@ -469,6 +469,22 @@ static void update_context_from_user(AVCodecContext 
> *dst, AVCodecContext *src)
>  
>      dst->frame_number     = src->frame_number;
>      dst->reordered_opaque = src->reordered_opaque;
> +
> +    if (src->slice_count && src->slice_offset) {
> +        if (dst->slice_count < src->slice_count) {
> +            int *tmp = av_realloc(dst->slice_offset, src->slice_count *
> +                                  sizeof(*dst->slice_offset));
> +            if (!tmp) {
> +                av_free(dst->slice_offset);
> +                return AVERROR(ENOMEM);
> +            }
> +            dst->slice_offset = tmp;
> +        }
> +        memcpy(dst->slice_offset, src->slice_offset,
> +               src->slice_count * sizeof(*dst->slice_offset));
> +    }
> +    dst->slice_count = src->slice_count;
> +    return 0;
>  #undef copy_fields
>  }
>  
> @@ -579,7 +595,8 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
>       */
>  
>      p = &fctx->threads[fctx->next_decoding];
> -    update_context_from_user(p->avctx, avctx);
> +    err = update_context_from_user(p->avctx, avctx);
> +    if (err) return err;
>      err = submit_packet(p, avpkt);
>      if (err) return err;
>  
> @@ -750,6 +767,7 @@ static void frame_thread_free(AVCodecContext *avctx, int 
> thread_count)
>          if (i) {
>              av_freep(&p->avctx->priv_data);
>              av_freep(&p->avctx->internal);
> +            av_freep(&p->avctx->slice_offset);
>          }
>  
>          av_freep(&p->avctx);


Looks good.

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

Reply via email to