mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
threads: update slice_count and slice_offset from user context
They are used to signal the number of slices and offsets of each slice out of band to the decoder.
This commit is contained in:
parent
7ba34575fd
commit
afb8b207d6
@ -413,7 +413,6 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
|||||||
|
|
||||||
dst->has_b_frames = src->has_b_frames;
|
dst->has_b_frames = src->has_b_frames;
|
||||||
dst->idct_algo = src->idct_algo;
|
dst->idct_algo = src->idct_algo;
|
||||||
dst->slice_count = src->slice_count;
|
|
||||||
|
|
||||||
dst->bits_per_coded_sample = src->bits_per_coded_sample;
|
dst->bits_per_coded_sample = src->bits_per_coded_sample;
|
||||||
dst->sample_aspect_ratio = src->sample_aspect_ratio;
|
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 dst The destination context.
|
||||||
* @param src The source 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);
|
#define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
|
||||||
dst->flags = src->flags;
|
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->frame_number = src->frame_number;
|
||||||
dst->reordered_opaque = src->reordered_opaque;
|
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
|
#undef copy_fields
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,7 +595,8 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
p = &fctx->threads[fctx->next_decoding];
|
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);
|
err = submit_packet(p, avpkt);
|
||||||
if (err) return err;
|
if (err) return err;
|
||||||
|
|
||||||
@ -750,6 +767,7 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count)
|
|||||||
if (i) {
|
if (i) {
|
||||||
av_freep(&p->avctx->priv_data);
|
av_freep(&p->avctx->priv_data);
|
||||||
av_freep(&p->avctx->internal);
|
av_freep(&p->avctx->internal);
|
||||||
|
av_freep(&p->avctx->slice_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_freep(&p->avctx);
|
av_freep(&p->avctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user