mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
avcodec/hevcdec: sync SEI derived AVCodecContext fields across threads
Fixes ticket #8610. Found-by: Pavel Koshevoy <pkoshevoy@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
003b5c800f
commit
bd4ef145c0
@ -369,12 +369,22 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
|
|||||||
if (num != 0 && den != 0)
|
if (num != 0 && den != 0)
|
||||||
av_reduce(&avctx->framerate.den, &avctx->framerate.num,
|
av_reduce(&avctx->framerate.den, &avctx->framerate.num,
|
||||||
num, den, 1 << 30);
|
num, den, 1 << 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int export_stream_params_from_sei(HEVCContext *s)
|
||||||
|
{
|
||||||
|
AVCodecContext *avctx = s->avctx;
|
||||||
|
|
||||||
|
if (s->sei.a53_caption.buf_ref)
|
||||||
|
s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
|
||||||
|
|
||||||
if (s->sei.alternative_transfer.present &&
|
if (s->sei.alternative_transfer.present &&
|
||||||
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
|
av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
|
||||||
s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
|
s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
|
||||||
avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
|
avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||||
@ -582,6 +592,10 @@ static int hls_slice_header(HEVCContext *s)
|
|||||||
s->max_ra = INT_MAX;
|
s->max_ra = INT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = export_stream_params_from_sei(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
sh->dependent_slice_segment_flag = 0;
|
sh->dependent_slice_segment_flag = 0;
|
||||||
if (!sh->first_slice_in_pic_flag) {
|
if (!sh->first_slice_in_pic_flag) {
|
||||||
int slice_address_length;
|
int slice_address_length;
|
||||||
@ -2806,8 +2820,6 @@ static int set_side_data(HEVCContext *s)
|
|||||||
if (!sd)
|
if (!sd)
|
||||||
av_buffer_unref(&a53->buf_ref);
|
av_buffer_unref(&a53->buf_ref);
|
||||||
a53->buf_ref = NULL;
|
a53->buf_ref = NULL;
|
||||||
|
|
||||||
s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < s->sei.unregistered.nb_buf_ref; i++) {
|
for (int i = 0; i < s->sei.unregistered.nb_buf_ref; i++) {
|
||||||
@ -3250,6 +3262,11 @@ static int hevc_decode_extradata(HEVCContext *s, uint8_t *buf, int length, int f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* export stream parameters from SEI */
|
||||||
|
ret = export_stream_params_from_sei(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3537,6 +3554,10 @@ static int hevc_update_thread_context(AVCodecContext *dst,
|
|||||||
s->sei.content_light = s0->sei.content_light;
|
s->sei.content_light = s0->sei.content_light;
|
||||||
s->sei.alternative_transfer = s0->sei.alternative_transfer;
|
s->sei.alternative_transfer = s0->sei.alternative_transfer;
|
||||||
|
|
||||||
|
ret = export_stream_params_from_sei(s);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user