[FFmpeg-cvslog] lavc/libopenh264enc: Rewrite profile handling

Linjie Fu git at videolan.org
Wed May 13 08:52:38 EEST 2020


ffmpeg | branch: master | Linjie Fu <linjie.fu at intel.com> | Wed May  6 21:47:50 2020 +0800| [d3a7bdd4ac54349aea9150a234478635d50ebd87] | committer: Linjie Fu

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 at martin.st>
Signed-off-by: Linjie Fu <linjie.fu at intel.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d3a7bdd4ac54349aea9150a234478635d50ebd87
---

 libavcodec/libopenh264enc.c | 44 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 40 insertions(+), 4 deletions(-)

diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
index 3bb3cceb64..12c71ca0e9 100644
--- a/libavcodec/libopenh264enc.c
+++ b/libavcodec/libopenh264enc.c
@@ -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;



More information about the ffmpeg-cvslog mailing list