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