mirror of https://git.ffmpeg.org/ffmpeg.git
libavcodec/libx264: fix reference frame computation based on level
The current implementation allows passing levels to libavcodec as integers (such as "31" instead of "3.1"). However, in this case, the maximum reference frame value per level was ignored because libavcodec converted the string to 310 instead of 31. Since libx264 has correctly parsed the level to int (x4->params.i_level_idc), we should rely on this value instead of attempting to parse the level string on our own. Signed-off-by: Josh Brewster <josh.brewster@protonmail.com> Signed-off-by: Josh de Kock <josh@itanimul.li>
This commit is contained in:
parent
280383a897
commit
79f001675a
|
@ -692,25 +692,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||
x4->params.rc.f_qcompress = avctx->qcompress; /* 0.0 => cbr, 1.0 => constant qp */
|
||||
if (avctx->refs >= 0)
|
||||
x4->params.i_frame_reference = avctx->refs;
|
||||
else if (x4->level) {
|
||||
else if (x4->params.i_level_idc > 0) {
|
||||
int i;
|
||||
int mbn = AV_CEIL_RSHIFT(avctx->width, 4) * AV_CEIL_RSHIFT(avctx->height, 4);
|
||||
int level_id = -1;
|
||||
char *tail;
|
||||
int scale = X264_BUILD < 129 ? 384 : 1;
|
||||
|
||||
if (!strcmp(x4->level, "1b")) {
|
||||
level_id = 9;
|
||||
} else if (strlen(x4->level) <= 3){
|
||||
level_id = av_strtod(x4->level, &tail) * 10 + 0.5;
|
||||
if (*tail)
|
||||
level_id = -1;
|
||||
}
|
||||
if (level_id <= 0)
|
||||
av_log(avctx, AV_LOG_WARNING, "Failed to parse level\n");
|
||||
|
||||
for (i = 0; i<x264_levels[i].level_idc; i++)
|
||||
if (x264_levels[i].level_idc == level_id)
|
||||
if (x264_levels[i].level_idc == x4->params.i_level_idc)
|
||||
x4->params.i_frame_reference = av_clip(x264_levels[i].dpb / mbn / scale, 1, x4->params.i_frame_reference);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue