22 #include <wels/codec_api.h>
23 #include <wels/codec_ver.h>
47 #define OPENH264_VER_AT_LEAST(maj, min) \
48 ((OPENH264_MAJOR > (maj)) || \
49 (OPENH264_MAJOR == (maj) && OPENH264_MINOR >= (min)))
51 #define OFFSET(x) offsetof(SVCContext, x)
52 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
54 {
"slice_mode",
"set slice mode",
OFFSET(slice_mode),
AV_OPT_TYPE_INT, { .i64 = SM_AUTO_SLICE }, SM_SINGLE_SLICE, SM_RESERVED,
VE,
"slice_mode" },
55 {
"fixed",
"a fixed number of slices", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0,
VE,
"slice_mode" },
56 {
"rowmb",
"one slice per row of macroblocks", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_ROWMB_SLICE }, 0, 0,
VE,
"slice_mode" },
57 {
"auto",
"automatic number of slices according to number of threads", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_AUTO_SLICE }, 0, 0,
VE,
"slice_mode" },
58 {
"dyn",
"Dynamic slicing", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_DYN_SLICE }, 0, 0,
VE,
"slice_mode" },
61 {
"max_nal_size",
"set maximum NAL size in bytes",
OFFSET(max_nal_size),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX,
VE },
62 {
"allow_skip_frames",
"allow skipping frames to hit the target bitrate",
OFFSET(skip_frames),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1,
VE },
74 if (libopenh264_log_level >= WELS_LOG_DETAIL)
return AV_LOG_TRACE;
75 else if (libopenh264_log_level >= WELS_LOG_DEBUG)
return AV_LOG_DEBUG;
76 else if (libopenh264_log_level >= WELS_LOG_INFO)
return AV_LOG_VERBOSE;
77 else if (libopenh264_log_level >= WELS_LOG_WARNING)
return AV_LOG_WARNING;
78 else if (libopenh264_log_level >= WELS_LOG_ERROR)
return AV_LOG_ERROR;
93 av_log(ctx, equiv_ffmpeg_log_level,
"%s\n", msg);
101 WelsDestroySVCEncoder(s->
encoder);
110 SEncParamExt param = { 0 };
113 WelsTraceCallback callback_function;
119 #if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7)
120 OpenH264Version libver = WelsGetCodecVersion();
121 if (memcmp(&libver, &g_stCodecVersion,
sizeof(libver))) {
127 if (WelsCreateSVCEncoder(&s->
encoder)) {
133 log_level = WELS_LOG_DETAIL;
134 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_LEVEL, &log_level);
138 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_CALLBACK, (
void *)&callback_function);
141 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, (
void *)&avctx);
145 #if FF_API_CODER_TYPE
153 param.iPicWidth = avctx->
width;
154 param.iPicHeight = avctx->
height;
155 param.iTargetBitrate = avctx->
bit_rate;
157 param.iRCMode = RC_QUALITY_MODE;
158 param.iTemporalLayerNum = 1;
159 param.iSpatialLayerNum = 1;
160 param.bEnableDenoise = 0;
161 param.bEnableBackgroundDetection = 1;
162 param.bEnableAdaptiveQuant = 1;
164 param.bEnableLongTermReference = 0;
165 param.iLtrMarkPeriod = 30;
166 param.uiIntraPeriod = avctx->
gop_size;
167 #if OPENH264_VER_AT_LEAST(1, 4)
168 param.eSpsPpsIdStrategy = CONSTANT_ID;
170 param.bEnableSpsPpsIdAddition = 0;
172 param.bPrefixNalAddingCtrl = 0;
174 param.iEntropyCodingModeFlag = 0;
177 param.iEntropyCodingModeFlag = 1;
179 param.iEntropyCodingModeFlag = 1;
181 param.sSpatialLayers[0].iVideoWidth = param.iPicWidth;
182 param.sSpatialLayers[0].iVideoHeight = param.iPicHeight;
183 param.sSpatialLayers[0].fFrameRate = param.fMaxFrameRate;
184 param.sSpatialLayers[0].iSpatialBitrate = param.iTargetBitrate;
185 param.sSpatialLayers[0].iMaxSpatialBitrate = param.iMaxBitrate;
198 param.sSpatialLayers[0].sSliceCfg.uiSliceMode = s->
slice_mode;
199 param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->
slices;
204 param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = s->
max_nal_size;
207 "specify a valid max_nal_size to use -slice_mode dyn\n");
212 if ((*s->
encoder)->InitializeExt(s->
encoder, ¶m) != cmResultSuccess) {
218 SFrameBSInfo fbi = { 0 };
221 for (i = 0; i < fbi.sLayerInfo[0].iNalCount; i++)
222 size += fbi.sLayerInfo[0].pNalLengthInByte[i];
229 memcpy(avctx->
extradata, fbi.sLayerInfo[0].pBsBuf, size);
251 SFrameBSInfo fbi = { 0 };
254 SSourcePicture
sp = { 0 };
255 int size = 0, layer, first_layer = 0;
256 int layer_size[MAX_LAYER_NUM_OF_FRAME] = { 0 };
258 sp.iColorFormat = videoFormatI420;
259 for (i = 0; i < 3; i++) {
261 sp.pData[i] = frame->
data[i];
263 sp.iPicWidth = avctx->
width;
264 sp.iPicHeight = avctx->
height;
267 if (encoded != cmResultSuccess) {
271 if (fbi.eFrameType == videoFrameTypeSkip) {
282 first_layer = fbi.iLayerNum - 1;
284 for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
285 for (i = 0; i < fbi.sLayerInfo[layer].iNalCount; i++)
286 layer_size[layer] += fbi.sLayerInfo[layer].pNalLengthInByte[i];
287 size += layer_size[layer];
289 av_log(avctx,
AV_LOG_DEBUG,
"%d slices\n", fbi.sLayerInfo[fbi.iLayerNum - 1].iNalCount);
296 for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
297 memcpy(avpkt->
data + size, fbi.sLayerInfo[layer].pBsBuf, layer_size[layer]);
298 size += layer_size[layer];
301 if (fbi.eFrameType == videoFrameTypeIDR)
308 .
name =
"libopenh264",
319 .priv_class = &
class,
This structure describes decoded (raw) audio or video data.
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define LIBAVUTIL_VERSION_INT
static av_cold int init(AVCodecContext *avctx)
int max_bitrate
Maximum bitrate of the stream, in bits per second.
#define AV_CODEC_CAP_AUTO_THREADS
Codec supports avctx->thread_count == 0 (auto).
Macro definitions for various function/variable attributes.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
#define AV_LOG_QUIET
Print no output.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static double av_q2d(AVRational a)
Convert rational to double.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
static const AVOption options[]
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
static av_cold int svc_encode_close(AVCodecContext *avctx)
int flags
A combination of AV_PKT_FLAG values.
static av_cold int svc_encode_init(AVCodecContext *avctx)
common internal API header
int width
picture width / height.
static int libopenh264_to_ffmpeg_log_level(int libopenh264_log_level)
attribute_deprecated int coder_type
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
This structure describes the bitrate properties of an encoded bitstream.
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
Describe the class of an AVClass context structure.
static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet)
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
static enum AVPixelFormat pix_fmts[]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define AV_CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define FF_DISABLE_DEPRECATION_WARNINGS
common internal api header.
common internal and external API header
static void libopenh264_trace_callback(void *ctx, int level, const char *msg)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int slices
Number of slices.
#define FF_ENABLE_DEPRECATION_WARNINGS
int avg_bitrate
Average bitrate of the stream, in bits per second.
AVCodec ff_libopenh264_encoder
AVPixelFormat
Pixel format.
This structure stores compressed data.
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t rc_max_rate
maximum bitrate