summarylogtreecommitdiffstats
path: root/openh264-1.6-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'openh264-1.6-fix.patch')
-rw-r--r--openh264-1.6-fix.patch160
1 files changed, 160 insertions, 0 deletions
diff --git a/openh264-1.6-fix.patch b/openh264-1.6-fix.patch
new file mode 100644
index 000000000000..7237454cd013
--- /dev/null
+++ b/openh264-1.6-fix.patch
@@ -0,0 +1,160 @@
+---
+ configure | 2 +-
+ doc/encoders.texi | 25 ++++++++++++++---------
+ libavcodec/libopenh264enc.c | 48 ++++++++++++++++++++++-----------------------
+ libavcodec/version.h | 2 +-
+ 4 files changed, 42 insertions(+), 35 deletions(-)
+
+diff --git a/configure b/configure
+index f28aa8f..4bffd0f 100755
+--- a/configure
++++ b/configure
+@@ -5569,7 +5569,7 @@ enabled libopencv && { check_header opencv2/core/core_c.h &&
+ { use_pkg_config opencv opencv2/core/core_c.h cvCreateImageHeader ||
+ require opencv opencv2/core/core_c.h cvCreateImageHeader -lopencv_core -lopencv_imgproc; } ||
+ require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader; }
+-enabled libopenh264 && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion
++enabled libopenh264 && require_pkg_config "openh264 >= 1.6" wels/codec_api.h WelsGetCodecVersion
+ enabled libopenjpeg && { check_lib openjpeg-2.1/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC ||
+ check_lib openjpeg-2.0/openjpeg.h opj_version -lopenjp2 -DOPJ_STATIC ||
+ check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
+diff --git a/doc/encoders.texi b/doc/encoders.texi
+index f38cad3..dfab007 100644
+--- a/doc/encoders.texi
++++ b/doc/encoders.texi
+@@ -1393,16 +1393,18 @@ Set slice mode. Can assume one of the follwing possible values:
+
+ @table @samp
+ @item fixed
+-a fixed number of slices
+-@item rowmb
+-one slice per row of macroblocks
+-@item auto
+-automatic number of slices according to number of threads
+-@item dyn
+-dynamic slicing
++use a fixed numer of slices, depending on the value of
++@option{slices}. If set to 0, the number of slices is automatically
++selected.
++@item raster
++use a fixed number of macro-blocks per slice. The number of MBs is set
++through @option{slice_mbs}.
++@item sizelimited
++set slicing according to size. The slice size is set through
++@option{max_nal_size}.
+ @end table
+
+-Default value is @samp{auto}.
++Default value is @samp{fixed}.
+
+ @item loopfilter
+ Enable loop filter, if set to 1 (automatically enabled). To disable
+@@ -1414,7 +1416,12 @@ Set profile restrictions. If set to the value of @samp{main} enable
+ CABAC (set the @code{SEncParamExt.iEntropyCodingModeFlag} flag to 1).
+
+ @item max_nal_size
+-Set maximum NAL size in bytes.
++Set maximum nal size in bytes. This is only used when
++@option{slice_mode} is set to @samp{sizelimited}.
++
++@item slice_mbs
++Set number of MBs per slice. This is only used when
++@option{slice_mode} is set to @samp{raster}.
+
+ @item allow_skip_frames
+ Allow skipping frames to hit the target bitrate if set to 1.
+diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
+index 6850568..0c1b1b8 100644
+--- a/libavcodec/libopenh264enc.c
++++ b/libavcodec/libopenh264enc.c
+@@ -39,6 +39,7 @@ typedef struct SVCContext {
+ int loopfilter;
+ char *profile;
+ int max_nal_size;
++ int slice_mbs;
+ int skip_frames;
+ int skipped;
+ int cabac;
+@@ -51,14 +52,14 @@ typedef struct SVCContext {
+ #define OFFSET(x) offsetof(SVCContext, x)
+ #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+ static const AVOption options[] = {
+- { "slice_mode", "set slice mode", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_AUTO_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, VE, "slice_mode" },
+- { "fixed", "a fixed number of slices", 0, AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0, VE, "slice_mode" },
+- { "rowmb", "one slice per row of macroblocks", 0, AV_OPT_TYPE_CONST, { .i64 = SM_ROWMB_SLICE }, 0, 0, VE, "slice_mode" },
+- { "auto", "automatic number of slices according to number of threads", 0, AV_OPT_TYPE_CONST, { .i64 = SM_AUTO_SLICE }, 0, 0, VE, "slice_mode" },
+- { "dyn", "Dynamic slicing", 0, AV_OPT_TYPE_CONST, { .i64 = SM_DYN_SLICE }, 0, 0, VE, "slice_mode" },
++ { "slice_mode", "set slice mode", OFFSET(slice_mode), AV_OPT_TYPE_INT, { .i64 = SM_FIXEDSLCNUM_SLICE }, SM_FIXEDSLCNUM_SLICE, SM_RESERVED, VE, "slice_mode" },
++ { "fixed", "set a fixed number of slices, depending on slices option", 0, AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0, VE, "slice_mode" },
++ { "raster", "set a fixed number of MB per slice, depending on slice_mb option", 0, AV_OPT_TYPE_CONST, { .i64 = SM_RASTER_SLICE }, 0, 0, VE, "slice_mode" },
++ { "sizelimited", "set slice according to size", 0, AV_OPT_TYPE_CONST, { .i64 = SM_SIZELIMITED_SLICE }, 0, 0, VE, "slice_mode" },
+ { "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 },
+- { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
++ { "slice_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
++ { "slice_mbs", "set number of MBs per slice", OFFSET(slice_mbs), 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 },
+ { NULL }
+@@ -184,29 +185,28 @@ FF_ENABLE_DEPRECATION_WARNINGS
+ param.sSpatialLayers[0].iSpatialBitrate = param.iTargetBitrate;
+ param.sSpatialLayers[0].iMaxSpatialBitrate = param.iMaxBitrate;
+
+- if ((avctx->slices > 1) && (s->max_nal_size)){
+- av_log(avctx,AV_LOG_ERROR,"Invalid combination -slices %d and -max_nal_size %d.\n",avctx->slices,s->max_nal_size);
+- goto fail;
+- }
+-
+- if (avctx->slices > 1)
+- s->slice_mode = SM_FIXEDSLCNUM_SLICE;
+-
+- if (s->max_nal_size)
+- s->slice_mode = SM_DYN_SLICE;
+-
+- param.sSpatialLayers[0].sSliceCfg.uiSliceMode = s->slice_mode;
+- param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->slices;
++ param.sSpatialLayers[0].sSliceArgument.uiSliceMode = s->slice_mode;
+
+- if (s->slice_mode == SM_DYN_SLICE) {
+- if (s->max_nal_size){
++ if (s->slice_mode == SM_FIXEDSLCNUM_SLICE) {
++ param.sSpatialLayers[0].sSliceArgument.uiSliceNum = avctx->slices;
++ } else if (s->slice_mode == SM_RASTER_SLICE) {
++ if (s->slice_mbs) {
++ param.sSpatialLayers[0].sSliceArgument.uiSliceMbNum[0] = s->slice_mbs;
++ } else {
++ av_log(avctx, AV_LOG_ERROR, "The value slice_mbs must be set to use slice_mode raster\n");
++ goto fail;
++ }
++ } else if (s->slice_mode == SM_SIZELIMITED_SLICE) {
++ if (s->max_nal_size) {
+ param.uiMaxNalSize = s->max_nal_size;
+- param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = s->max_nal_size;
++ param.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = s->max_nal_size;
+ } else {
+- av_log(avctx, AV_LOG_ERROR, "Invalid -max_nal_size, "
+- "specify a valid max_nal_size to use -slice_mode dyn\n");
++ av_log(avctx, AV_LOG_ERROR, "The value max_nal_size must be set to use slice_mode sizelimited\n");
+ goto fail;
+ }
++ } else {
++ av_log(avctx, AV_LOG_ERROR, "Unknown or invalid selected slice mode %d\n", s->slice_mode);
++ goto fail;
+ }
+
+ if ((*s->encoder)->InitializeExt(s->encoder, &param) != cmResultSuccess) {
+diff --git a/libavcodec/version.h b/libavcodec/version.h
+index 95f4551..5df3ab2 100644
+--- a/libavcodec/version.h
++++ b/libavcodec/version.h
+@@ -29,7 +29,7 @@
+
+ #define LIBAVCODEC_VERSION_MAJOR 57
+ #define LIBAVCODEC_VERSION_MINOR 48
+-#define LIBAVCODEC_VERSION_MICRO 101
++#define LIBAVCODEC_VERSION_MICRO 102
+
+ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
+ LIBAVCODEC_VERSION_MINOR, \
+--
+1.9.1 \ No newline at end of file