|
|
|
@@ -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; |
|
|
|
|