22 #include <wels/codec_api.h> 23 #include <wels/codec_ver.h> 36 #if !OPENH264_VER_AT_LEAST(1, 6) 37 #define SM_SIZELIMITED_SLICE SM_DYN_SLICE 52 #define OFFSET(x) offsetof(SVCContext, x) 53 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 55 #if OPENH264_VER_AT_LEAST(1, 6) 60 {
"fixed",
"a fixed number of slices", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0,
VE,
"slice_mode" },
61 #if OPENH264_VER_AT_LEAST(1, 6) 65 {
"rowmb",
"one slice per row of macroblocks", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_ROWMB_SLICE }, 0, 0,
VE,
"slice_mode" },
66 {
"auto",
"automatic number of slices according to number of threads", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_AUTO_SLICE }, 0, 0,
VE,
"slice_mode" },
67 {
"dyn",
"Dynamic slicing", 0,
AV_OPT_TYPE_CONST, { .i64 = SM_DYN_SLICE }, 0, 0,
VE,
"slice_mode" },
89 WelsDestroySVCEncoder(s->
encoder);
98 SEncParamExt param = { 0 };
101 WelsTraceCallback callback_function;
107 if (WelsCreateSVCEncoder(&s->
encoder)) {
113 log_level = WELS_LOG_DETAIL;
114 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_LEVEL, &log_level);
118 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_CALLBACK, &callback_function);
121 (*s->
encoder)->SetOption(s->
encoder, ENCODER_OPTION_TRACE_CALLBACK_CONTEXT, &avctx);
125 #if FF_API_CODER_TYPE 133 param.iPicWidth = avctx->
width;
134 param.iPicHeight = avctx->
height;
135 param.iTargetBitrate = avctx->
bit_rate;
137 param.iRCMode = RC_QUALITY_MODE;
138 param.iTemporalLayerNum = 1;
139 param.iSpatialLayerNum = 1;
140 param.bEnableDenoise = 0;
141 param.bEnableBackgroundDetection = 1;
142 param.bEnableAdaptiveQuant = 1;
144 param.bEnableLongTermReference = 0;
145 param.iLtrMarkPeriod = 30;
146 param.uiIntraPeriod = avctx->
gop_size;
147 #if OPENH264_VER_AT_LEAST(1, 4) 148 param.eSpsPpsIdStrategy = CONSTANT_ID;
150 param.bEnableSpsPpsIdAddition = 0;
152 param.bPrefixNalAddingCtrl = 0;
154 param.iEntropyCodingModeFlag = 0;
157 param.iEntropyCodingModeFlag = 1;
159 param.iEntropyCodingModeFlag = 1;
161 param.sSpatialLayers[0].iVideoWidth = param.iPicWidth;
162 param.sSpatialLayers[0].iVideoHeight = param.iPicHeight;
163 param.sSpatialLayers[0].fFrameRate = param.fMaxFrameRate;
164 param.sSpatialLayers[0].iSpatialBitrate = param.iTargetBitrate;
165 param.sSpatialLayers[0].iMaxSpatialBitrate = param.iMaxBitrate;
167 #if OPENH264_VER_AT_LEAST(1, 7) 172 { 1, 1 }, { 12, 11 }, { 10, 11 }, { 16, 11 },
173 { 40, 33 }, { 24, 11 }, { 20, 11 }, { 32, 11 },
174 { 80, 33 }, { 18, 11 }, { 15, 11 }, { 64, 33 },
177 static const ESampleAspectRatio asp_idc[] = {
179 ASP_1x1, ASP_12x11, ASP_10x11, ASP_16x11,
180 ASP_40x33, ASP_24x11, ASP_20x11, ASP_32x11,
181 ASP_80x33, ASP_18x11, ASP_15x11, ASP_64x33,
190 if (num == sar_idc[i].num &&
191 den == sar_idc[i].den)
195 param.sSpatialLayers[0].eAspectRatio = ASP_EXT_SAR;
196 param.sSpatialLayers[0].sAspectRatioExtWidth = num;
197 param.sSpatialLayers[0].sAspectRatioExtHeight = den;
199 param.sSpatialLayers[0].eAspectRatio = asp_idc[
i];
201 param.sSpatialLayers[0].bAspectRatioPresent =
true;
204 param.sSpatialLayers[0].bAspectRatioPresent =
false;
210 "Invalid combination -slices %d and -max_nal_size %d.\n",
221 #if OPENH264_VER_AT_LEAST(1, 6) 222 param.sSpatialLayers[0].sSliceArgument.uiSliceMode = s->
slice_mode;
223 param.sSpatialLayers[0].sSliceArgument.uiSliceNum = avctx->
slices;
225 param.sSpatialLayers[0].sSliceCfg.uiSliceMode = s->
slice_mode;
226 param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->
slices;
232 #if OPENH264_VER_AT_LEAST(1, 6) 233 param.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint = s->
max_nal_size;
235 param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = s->
max_nal_size;
239 "specify a valid max_nal_size to use -slice_mode dyn\n");
244 if ((*s->
encoder)->InitializeExt(s->
encoder, ¶m) != cmResultSuccess) {
250 SFrameBSInfo fbi = { 0 };
253 for (i = 0; i < fbi.sLayerInfo[0].iNalCount; i++)
254 size += fbi.sLayerInfo[0].pNalLengthInByte[i];
259 memcpy(avctx->
extradata, fbi.sLayerInfo[0].pBsBuf, size);
275 SFrameBSInfo fbi = { 0 };
278 SSourcePicture
sp = { 0 };
279 int size = 0, layer, first_layer = 0;
280 int layer_size[MAX_LAYER_NUM_OF_FRAME] = { 0 };
282 sp.iColorFormat = videoFormatI420;
283 for (i = 0; i < 3; i++) {
285 sp.pData[
i] = frame->
data[
i];
287 sp.iPicWidth = avctx->
width;
288 sp.iPicHeight = avctx->
height;
295 if (encoded != cmResultSuccess) {
299 if (fbi.eFrameType == videoFrameTypeSkip) {
310 first_layer = fbi.iLayerNum - 1;
312 for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
313 for (i = 0; i < fbi.sLayerInfo[layer].iNalCount; i++)
314 layer_size[layer] += fbi.sLayerInfo[layer].pNalLengthInByte[i];
315 size += layer_size[layer];
317 av_log(avctx,
AV_LOG_DEBUG,
"%d slices\n", fbi.sLayerInfo[fbi.iLayerNum - 1].iNalCount);
324 for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
325 memcpy(avpkt->
data + size, fbi.sLayerInfo[layer].pBsBuf, layer_size[layer]);
326 size += layer_size[layer];
329 if (fbi.eFrameType == videoFrameTypeIDR)
336 .
name =
"libopenh264",
348 .priv_class = &
class,
349 .wrapper_name =
"libopenh264",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
void ff_libopenh264_trace_callback(void *ctx, int level, const char *msg)
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.
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
#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...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
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 an AVRational to a double.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define i(width, name, range_min, range_max)
#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_*.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
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
enum AVPictureType pict_type
Picture type of the frame.
static const AVOption options[]
int width
picture width / height.
attribute_deprecated int coder_type
#define FF_ARRAY_ELEMS(a)
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.
Rational number (pair of numerator and denominator).
static int svc_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet)
#define SM_SIZELIMITED_SLICE
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
#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.
int ff_libopenh264_check_version(void *logctx)
AVCodec ff_libopenh264_encoder
AVPixelFormat
Pixel format.
This structure stores compressed data.
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