bug noticed by Vladimir, verified and tested by a patch to convert the libavformats custom frame header for rv34 to slice_count and slice_offset[].
Janne ---8<--- They are used to signal the number of slices and offsets of each slice out of band to the decoder. --- libavcodec/pthread.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 0688d9d..3f653dd 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; @@ -469,6 +468,17 @@ 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) { + av_free(dst->slice_offset); + dst->slice_offset = av_malloc(src->slice_count * + sizeof(*dst->slice_offset)); + } + memcpy(dst->slice_offset, src->slice_offset, + src->slice_count * sizeof(*dst->slice_offset)); + } + dst->slice_count = src->slice_count; #undef copy_fields } @@ -750,6 +760,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); -- 1.7.8.3 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel