X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibopenh264enc.c;h=6434de5cacbc39f9481e7284c4fa5db659c0be2e;hb=a240aefc7a2591f7b307e2910df655801ae6ca44;hp=2f63da1219a462e691e7d52e2506378b4642e13f;hpb=503153a96782801bf3274e7aef74831801a002c6;p=ffmpeg diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 2f63da1219a..6434de5cacb 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -25,6 +25,7 @@ #include "libavutil/attributes.h" #include "libavutil/common.h" #include "libavutil/opt.h" +#include "libavutil/internal.h" #include "libavutil/intreadwrite.h" #include "libavutil/mathematics.h" @@ -40,6 +41,7 @@ typedef struct SVCContext { int max_nal_size; int skip_frames; int skipped; + int cabac; } SVCContext; #define OPENH264_VER_AT_LEAST(maj, min) \ @@ -56,8 +58,9 @@ static const AVOption options[] = { { "dyn", "Dynamic slicing", 0, AV_OPT_TYPE_CONST, { .i64 = SM_DYN_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 }, - { "allow_skip_frames", "Allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, + { "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 }, { NULL } }; @@ -108,6 +111,7 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) int err = AVERROR_UNKNOWN; int log_level; WelsTraceCallback callback_function; + AVCPBProperties *props; // Mingw GCC < 4.7 on x86_32 uses an incorrect/buggy ABI for the WelsGetCodecVersion // function (for functions returning larger structs), thus skip the check in those @@ -138,6 +142,13 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) (*s->encoder)->GetDefaultParams(s->encoder, ¶m); +#if FF_API_CODER_TYPE +FF_DISABLE_DEPRECATION_WARNINGS + if (!s->cabac) + s->cabac = avctx->coder_type == FF_CODER_TYPE_AC; +FF_ENABLE_DEPRECATION_WARNINGS +#endif + param.fMaxFrameRate = 1/av_q2d(avctx->time_base); param.iPicWidth = avctx->width; param.iPicHeight = avctx->height; @@ -164,7 +175,7 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) param.iMultipleThreadIdc = avctx->thread_count; if (s->profile && !strcmp(s->profile, "main")) param.iEntropyCodingModeFlag = 1; - else if (!s->profile && avctx->coder_type == FF_CODER_TYPE_AC) + else if (!s->profile && s->cabac) param.iEntropyCodingModeFlag = 1; param.sSpatialLayers[0].iVideoWidth = param.iPicWidth; @@ -223,6 +234,14 @@ static av_cold int svc_encode_init(AVCodecContext *avctx) memcpy(avctx->extradata, fbi.sLayerInfo[0].pBsBuf, size); } + props = ff_add_cpb_side_data(avctx); + if (!props) { + err = AVERROR(ENOMEM); + goto fail; + } + props->max_bitrate = param.iMaxBitrate; + props->avg_bitrate = param.iTargetBitrate; + return 0; fail: