mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-30 19:34:43 +00:00
lavc/libopenh264enc: Rewrite profile handling
Support the profiles "constrained_baseline" and "high" for libopenh264 version >= 1.8, support "constrained_baseline" and "main" for earlier version. If option not supported with current version, convert to constrained baseline with a warning for users. Reviewed-by: Martin Storsjö <martin@martin.st> Signed-off-by: Linjie Fu <linjie.fu@intel.com>
This commit is contained in:
parent
4b7e13931f
commit
d3a7bdd4ac
@ -44,7 +44,7 @@ typedef struct SVCContext {
|
||||
ISVCEncoder *encoder;
|
||||
int slice_mode;
|
||||
int loopfilter;
|
||||
char *profile;
|
||||
int profile;
|
||||
int max_nal_size;
|
||||
int skip_frames;
|
||||
int skipped;
|
||||
@ -75,7 +75,12 @@ static const AVOption options[] = {
|
||||
#endif
|
||||
#endif
|
||||
{ "loopfilter", "enable loop filter", OFFSET(loopfilter), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
|
||||
{ "profile", "set profile restrictions", OFFSET(profile), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, VE },
|
||||
{ "profile", "set profile restrictions", OFFSET(profile), AV_OPT_TYPE_INT, { .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, 0xffff, VE, "profile" },
|
||||
#define PROFILE(name, value) name, NULL, 0, AV_OPT_TYPE_CONST, { .i64 = value }, 0, 0, VE, "profile"
|
||||
{ PROFILE("constrained_baseline", FF_PROFILE_H264_CONSTRAINED_BASELINE) },
|
||||
{ PROFILE("main", FF_PROFILE_H264_MAIN) },
|
||||
{ PROFILE("high", FF_PROFILE_H264_HIGH) },
|
||||
#undef PROFILE
|
||||
{ "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
|
||||
{ "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
|
||||
{ "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
|
||||
@ -176,10 +181,41 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
param.iLoopFilterDisableIdc = !s->loopfilter;
|
||||
param.iEntropyCodingModeFlag = 0;
|
||||
param.iMultipleThreadIdc = avctx->thread_count;
|
||||
if (s->profile && !strcmp(s->profile, "main"))
|
||||
|
||||
if (s->profile == FF_PROFILE_UNKNOWN)
|
||||
s->profile = !s->cabac ? FF_PROFILE_H264_CONSTRAINED_BASELINE :
|
||||
#if OPENH264_VER_AT_LEAST(1, 8)
|
||||
FF_PROFILE_H264_HIGH;
|
||||
#else
|
||||
FF_PROFILE_H264_MAIN;
|
||||
#endif
|
||||
|
||||
switch (s->profile) {
|
||||
#if OPENH264_VER_AT_LEAST(1, 8)
|
||||
case FF_PROFILE_H264_HIGH:
|
||||
param.iEntropyCodingModeFlag = 1;
|
||||
else if (!s->profile && s->cabac)
|
||||
av_log(avctx, AV_LOG_VERBOSE, "Using CABAC, "
|
||||
"select EProfileIdc PRO_HIGH in libopenh264.\n");
|
||||
break;
|
||||
#else
|
||||
case FF_PROFILE_H264_MAIN:
|
||||
param.iEntropyCodingModeFlag = 1;
|
||||
av_log(avctx, AV_LOG_VERBOSE, "Using CABAC, "
|
||||
"select EProfileIdc PRO_MAIN in libopenh264.\n");
|
||||
break;
|
||||
#endif
|
||||
case FF_PROFILE_H264_CONSTRAINED_BASELINE:
|
||||
case FF_PROFILE_UNKNOWN:
|
||||
param.iEntropyCodingModeFlag = 0;
|
||||
av_log(avctx, AV_LOG_VERBOSE, "Using CAVLC, "
|
||||
"select EProfileIdc PRO_BASELINE in libopenh264.\n");
|
||||
break;
|
||||
default:
|
||||
param.iEntropyCodingModeFlag = 0;
|
||||
av_log(avctx, AV_LOG_WARNING, "Unsupported profile, "
|
||||
"select EProfileIdc PRO_BASELINE in libopenh264.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
param.sSpatialLayers[0].iVideoWidth = param.iPicWidth;
|
||||
param.sSpatialLayers[0].iVideoHeight = param.iPicHeight;
|
||||
|
Loading…
Reference in New Issue
Block a user