mirror of https://git.ffmpeg.org/ffmpeg.git
Merge commit 'b09ad37c83841c399abb7f2503a2ab214d0c2d48'
* commit 'b09ad37c83841c399abb7f2503a2ab214d0c2d48': h264: derive the delay from the level when it's not present Merged without changing the strict_std_compliance check, as it breaks FATE and changes decoding behavior. Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
This commit is contained in:
commit
10e55bd658
|
@ -906,18 +906,11 @@ static void decode_postinit(H264Context *h, int setup_finished)
|
||||||
// FIXME do something with unavailable reference frames
|
// FIXME do something with unavailable reference frames
|
||||||
|
|
||||||
/* Sort B-frames into display order */
|
/* Sort B-frames into display order */
|
||||||
|
if (h->sps.bitstream_restriction_flag ||
|
||||||
if (h->sps.bitstream_restriction_flag &&
|
h->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
|
||||||
h->avctx->has_b_frames < h->sps.num_reorder_frames) {
|
h->avctx->has_b_frames = FFMAX(h->avctx->has_b_frames, h->sps.num_reorder_frames);
|
||||||
h->avctx->has_b_frames = h->sps.num_reorder_frames;
|
|
||||||
h->low_delay = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT &&
|
|
||||||
!h->sps.bitstream_restriction_flag) {
|
|
||||||
h->avctx->has_b_frames = MAX_DELAYED_PIC_COUNT - 1;
|
|
||||||
h->low_delay = 0;
|
|
||||||
}
|
}
|
||||||
|
h->low_delay = !h->avctx->has_b_frames;
|
||||||
|
|
||||||
for (i = 0; 1; i++) {
|
for (i = 0; 1; i++) {
|
||||||
if(i == MAX_DELAYED_PIC_COUNT || cur->poc < h->last_pocs[i]){
|
if(i == MAX_DELAYED_PIC_COUNT || cur->poc < h->last_pocs[i]){
|
||||||
|
|
|
@ -107,6 +107,26 @@ static const uint8_t default_scaling8[2][64] = {
|
||||||
24, 25, 27, 28, 30, 32, 33, 35 }
|
24, 25, 27, 28, 30, 32, 33, 35 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* maximum number of MBs in the DPB for a given level */
|
||||||
|
static const int level_max_dpb_mbs[][2] = {
|
||||||
|
{ 10, 396 },
|
||||||
|
{ 11, 900 },
|
||||||
|
{ 12, 2376 },
|
||||||
|
{ 13, 2376 },
|
||||||
|
{ 20, 2376 },
|
||||||
|
{ 21, 4752 },
|
||||||
|
{ 22, 8100 },
|
||||||
|
{ 30, 8100 },
|
||||||
|
{ 31, 18000 },
|
||||||
|
{ 32, 20480 },
|
||||||
|
{ 40, 32768 },
|
||||||
|
{ 41, 32768 },
|
||||||
|
{ 42, 34816 },
|
||||||
|
{ 50, 110400 },
|
||||||
|
{ 51, 184320 },
|
||||||
|
{ 52, 184320 },
|
||||||
|
};
|
||||||
|
|
||||||
static inline int decode_hrd_parameters(H264Context *h, SPS *sps)
|
static inline int decode_hrd_parameters(H264Context *h, SPS *sps)
|
||||||
{
|
{
|
||||||
int cpb_count, i;
|
int cpb_count, i;
|
||||||
|
@ -535,6 +555,19 @@ int ff_h264_decode_seq_parameter_set(H264Context *h, int ignore_truncation)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if the maximum delay is not stored in the SPS, derive it based on the
|
||||||
|
* level */
|
||||||
|
if (!sps->bitstream_restriction_flag) {
|
||||||
|
sps->num_reorder_frames = MAX_DELAYED_PIC_COUNT - 1;
|
||||||
|
for (i = 0; i < FF_ARRAY_ELEMS(level_max_dpb_mbs); i++) {
|
||||||
|
if (level_max_dpb_mbs[i][0] == sps->level_idc) {
|
||||||
|
sps->num_reorder_frames = FFMIN(level_max_dpb_mbs[i][1] / (sps->mb_width * sps->mb_height),
|
||||||
|
sps->num_reorder_frames);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!sps->sar.den)
|
if (!sps->sar.den)
|
||||||
sps->sar.den = 1;
|
sps->sar.den = 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue