if (ctx->level == LEVEL_AUTO) {
const H264LevelDescriptor *desc;
int64_t bit_rate;
- int width, height;
+ int width, height, dpb_frames;
+ int framerate;
if (sps->vui.nal_hrd_parameters_present_flag) {
bit_rate = (sps->vui.nal_hrd_parameters.bit_rate_value_minus1[0] + 1) *
- (1 << (sps->vui.nal_hrd_parameters.bit_rate_scale + 6));
+ (INT64_C(1) << (sps->vui.nal_hrd_parameters.bit_rate_scale + 6));
} else if (sps->vui.vcl_hrd_parameters_present_flag) {
bit_rate = (sps->vui.vcl_hrd_parameters.bit_rate_value_minus1[0] + 1) *
- (1 << (sps->vui.vcl_hrd_parameters.bit_rate_scale + 6));
+ (INT64_C(1) << (sps->vui.vcl_hrd_parameters.bit_rate_scale + 6));
// Adjust for VCL vs. NAL limits.
bit_rate = bit_rate * 6 / 5;
} else {
bit_rate = 0;
}
+ // Don't use max_dec_frame_buffering if it is only inferred.
+ dpb_frames = sps->vui.bitstream_restriction_flag ?
+ sps->vui.max_dec_frame_buffering : H264_MAX_DPB_FRAMES;
+
width = 16 * (sps->pic_width_in_mbs_minus1 + 1);
height = 16 * (sps->pic_height_in_map_units_minus1 + 1) *
(2 - sps->frame_mbs_only_flag);
- desc = ff_h264_guess_level(sps->profile_idc, bit_rate,
- width, height,
- sps->vui.max_dec_frame_buffering);
+ if (sps->vui.timing_info_present_flag)
+ framerate = sps->vui.time_scale / sps->vui.num_units_in_tick / 2;
+ else
+ framerate = 0;
+
+ desc = ff_h264_guess_level(sps->profile_idc, bit_rate, framerate,
+ width, height, dpb_frames);
if (desc) {
level_idc = desc->level_idc;
} else {
if (sps->profile_idc == 66 ||
sps->profile_idc == 77 ||
sps->profile_idc == 88) {
- sps->level_idc = 10;
+ sps->level_idc = 11;
sps->constraint_set3_flag = 1;
} else {
sps->level_idc = 9;
err = 0;
fail:
- ff_cbs_fragment_uninit(ctx->cbc, au);
+ ff_cbs_fragment_reset(ctx->cbc, au);
av_freep(&displaymatrix_side_data);
if (err < 0)
err = 0;
fail:
- ff_cbs_fragment_uninit(ctx->cbc, au);
+ ff_cbs_fragment_reset(ctx->cbc, au);
return err;
}
static void h264_metadata_close(AVBSFContext *bsf)
{
H264MetadataContext *ctx = bsf->priv_data;
+
+ ff_cbs_fragment_free(ctx->cbc, &ctx->access_unit);
ff_cbs_close(&ctx->cbc);
}