for (i = 0; i < s->sh.nb_refs[L0]; i++) {
if (luma_weight_l0_flag[i]) {
int delta_luma_weight_l0 = get_se_golomb(gb);
+ if ((int8_t)delta_luma_weight_l0 != delta_luma_weight_l0)
+ return AVERROR_INVALIDDATA;
s->sh.luma_weight_l0[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l0;
s->sh.luma_offset_l0[i] = get_se_golomb(gb);
}
for (i = 0; i < s->sh.nb_refs[L1]; i++) {
if (luma_weight_l1_flag[i]) {
int delta_luma_weight_l1 = get_se_golomb(gb);
+ if ((int8_t)delta_luma_weight_l1 != delta_luma_weight_l1)
+ return AVERROR_INVALIDDATA;
s->sh.luma_weight_l1[i] = (1 << s->sh.luma_log2_weight_denom) + delta_luma_weight_l1;
s->sh.luma_offset_l1[i] = get_se_golomb(gb);
}
return 0;
}
-static void export_stream_params(AVCodecContext *avctx, const HEVCParamSets *ps,
- const HEVCSPS *sps)
+static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
{
+ AVCodecContext *avctx = s->avctx;
+ const HEVCParamSets *ps = &s->ps;
const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data;
const HEVCWindow *ow = &sps->output_window;
unsigned int num = 0, den = 0;
if (num != 0 && den != 0)
av_reduce(&avctx->framerate.den, &avctx->framerate.num,
num, den, 1 << 30);
+
+ if (s->sei.alternative_transfer.present &&
+ av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
+ s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
+ avctx->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
+ }
}
static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
*fmt++ = AV_PIX_FMT_CUDA;
#endif
break;
- case AV_PIX_FMT_YUV420P12:
case AV_PIX_FMT_YUV444P:
+#if CONFIG_HEVC_VDPAU_HWACCEL
+ *fmt++ = AV_PIX_FMT_VDPAU;
+#endif
+#if CONFIG_HEVC_NVDEC_HWACCEL
+ *fmt++ = AV_PIX_FMT_CUDA;
+#endif
+ break;
+ case AV_PIX_FMT_YUV420P12:
case AV_PIX_FMT_YUV444P10:
case AV_PIX_FMT_YUV444P12:
#if CONFIG_HEVC_NVDEC_HWACCEL
if (ret < 0)
goto fail;
- export_stream_params(s->avctx, &s->ps, sps);
+ export_stream_params(s, sps);
s->avctx->pix_fmt = pix_fmt;
sh->first_slice_in_pic_flag = get_bits1(gb);
if (s->ref && sh->first_slice_in_pic_flag) {
av_log(s->avctx, AV_LOG_ERROR, "Two slices reporting being the first in the same frame.\n");
- return 1; // This slice will be skiped later, do not corrupt state
+ return 1; // This slice will be skipped later, do not corrupt state
}
if ((IS_IDR(s) || IS_BLA(s)) && sh->first_slice_in_pic_flag) {
s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
}
- if (s->sei.alternative_transfer.present &&
- av_color_transfer_name(s->sei.alternative_transfer.preferred_transfer_characteristics) &&
- s->sei.alternative_transfer.preferred_transfer_characteristics != AVCOL_TRC_UNSPECIFIED) {
- s->avctx->color_trc = out->color_trc = s->sei.alternative_transfer.preferred_transfer_characteristics;
- }
-
return 0;
}
for (i = 0; i < FF_ARRAY_ELEMS(s->ps.sps_list); i++) {
if (first && s->ps.sps_list[i]) {
const HEVCSPS *sps = (const HEVCSPS*)s->ps.sps_list[i]->data;
- export_stream_params(s->avctx, &s->ps, sps);
+ export_stream_params(s, sps);
break;
}
}
ff_h2645_packet_uninit(&s->pkt);
+ ff_hevc_reset_sei(&s->sei);
+
return 0;
}
{
HEVCContext *s = avctx->priv_data;
ff_hevc_flush_dpb(s);
+ ff_hevc_reset_sei(&s->sei);
s->max_ra = INT_MAX;
s->eos = 1;
}