diff options
Diffstat (limited to 'openh264-1.6-fix.patch')
-rw-r--r-- | openh264-1.6-fix.patch | 160 |
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, ¶m) != 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 |