22 #include <wels/codec_api.h> 
   23 #include <wels/codec_ver.h> 
   42 #define OPENH264_VER_AT_LEAST(maj, min) \ 
   43     ((OPENH264_MAJOR  > (maj)) || \ 
   44      (OPENH264_MAJOR == (maj) && OPENH264_MINOR >= (min))) 
   46 #define OFFSET(x) offsetof(SVCContext, x) 
   47 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 
   49     { 
"slice_mode", 
"Slice mode", 
OFFSET(slice_mode), 
AV_OPT_TYPE_INT, { .i64 = SM_AUTO_SLICE }, SM_SINGLE_SLICE, SM_RESERVED, 
VE, 
"slice_mode" },
 
   50     { 
"fixed", 
"A fixed number of slices", 0, 
AV_OPT_TYPE_CONST, { .i64 = SM_FIXEDSLCNUM_SLICE }, 0, 0, 
VE, 
"slice_mode" },
 
   51     { 
"rowmb", 
"One slice per row of macroblocks", 0, 
AV_OPT_TYPE_CONST, { .i64 = SM_ROWMB_SLICE }, 0, 0, 
VE, 
"slice_mode" },
 
   52     { 
"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         WelsDestroySVCEncoder(s->
encoder);
 
   74     SEncParamExt param = { 0 };
 
   80 #if !defined(_WIN32) || !defined(__GNUC__) || !ARCH_X86_32 || AV_GCC_VERSION_AT_LEAST(4, 7) 
   81     OpenH264Version libver = WelsGetCodecVersion();
 
   82     if (memcmp(&libver, &g_stCodecVersion, 
sizeof(libver))) {
 
   88     if (WelsCreateSVCEncoder(&s->
encoder)) {
 
   96     param.iPicWidth                  = avctx->
width;
 
   97     param.iPicHeight                 = avctx->
height;
 
   98     param.iTargetBitrate             = avctx->
bit_rate;
 
  100     param.iRCMode                    = RC_QUALITY_MODE;
 
  101     param.iTemporalLayerNum          = 1;
 
  102     param.iSpatialLayerNum           = 1;
 
  103     param.bEnableDenoise             = 0;
 
  104     param.bEnableBackgroundDetection = 1;
 
  105     param.bEnableAdaptiveQuant       = 1;
 
  106     param.bEnableFrameSkip           = 0;
 
  107     param.bEnableLongTermReference   = 0;
 
  108     param.iLtrMarkPeriod             = 30;
 
  109     param.uiIntraPeriod              = avctx->
gop_size;
 
  110 #if OPENH264_VER_AT_LEAST(1, 4) 
  111     param.eSpsPpsIdStrategy          = CONSTANT_ID;
 
  113     param.bEnableSpsPpsIdAddition    = 0;
 
  115     param.bPrefixNalAddingCtrl       = 0;
 
  117     param.iEntropyCodingModeFlag     = 0;
 
  120         param.iEntropyCodingModeFlag = 1;
 
  122         param.iEntropyCodingModeFlag = 1;
 
  124     param.sSpatialLayers[0].iVideoWidth         = param.iPicWidth;
 
  125     param.sSpatialLayers[0].iVideoHeight        = param.iPicHeight;
 
  126     param.sSpatialLayers[0].fFrameRate          = param.fMaxFrameRate;
 
  127     param.sSpatialLayers[0].iSpatialBitrate     = param.iTargetBitrate;
 
  128     param.sSpatialLayers[0].iMaxSpatialBitrate  = param.iMaxBitrate;
 
  132     param.sSpatialLayers[0].sSliceCfg.uiSliceMode               = s->
slice_mode;
 
  133     param.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceNum = avctx->
slices;
 
  135     if ((*s->
encoder)->InitializeExt(s->
encoder, ¶m) != cmResultSuccess) {
 
  141         SFrameBSInfo fbi = { 0 };
 
  144         for (i = 0; i < fbi.sLayerInfo[0].iNalCount; i++)
 
  145             size += fbi.sLayerInfo[0].pNalLengthInByte[i];
 
  152         memcpy(avctx->
extradata, fbi.sLayerInfo[0].pBsBuf, size);
 
  166     SFrameBSInfo fbi = { 0 };
 
  169     SSourcePicture 
sp = { 0 };
 
  170     int size = 0, layer, first_layer = 0;
 
  171     int layer_size[MAX_LAYER_NUM_OF_FRAME] = { 0 };
 
  173     sp.iColorFormat = videoFormatI420;
 
  174     for (i = 0; i < 3; i++) {
 
  176         sp.pData[i]   = frame->
data[i];
 
  178     sp.iPicWidth  = avctx->
width;
 
  179     sp.iPicHeight = avctx->
height;
 
  182     if (encoded != cmResultSuccess) {
 
  186     if (fbi.eFrameType == videoFrameTypeSkip) {
 
  196         first_layer = fbi.iLayerNum - 1;
 
  198     for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
 
  199         for (i = 0; i < fbi.sLayerInfo[layer].iNalCount; i++)
 
  200             layer_size[layer] += fbi.sLayerInfo[layer].pNalLengthInByte[i];
 
  201         size += layer_size[layer];
 
  203     av_log(avctx, 
AV_LOG_DEBUG, 
"%d slices\n", fbi.sLayerInfo[fbi.iLayerNum - 1].iNalCount);
 
  210     for (layer = first_layer; layer < fbi.iLayerNum; layer++) {
 
  211         memcpy(avpkt->
data + size, fbi.sLayerInfo[layer].pBsBuf, layer_size[layer]);
 
  212         size += layer_size[layer];
 
  215     if (fbi.eFrameType == videoFrameTypeIDR)
 
  222     .
name           = 
"libopenh264",
 
  233     .priv_class     = &
class,
 
This structure describes decoded (raw) audio or video data. 
 
#define LIBAVUTIL_VERSION_INT
 
static av_cold int init(AVCodecContext *avctx)
 
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 CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe. 
 
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. 
 
#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 rc_max_rate
maximum bitrate 
 
const char * name
Name of the codec implementation. 
 
static av_cold int svc_encode_close(AVCodecContext *avctx)
 
Libavcodec external API header. 
 
int flags
A combination of AV_PKT_FLAG values. 
 
static av_cold int svc_encode_init(AVCodecContext *avctx)
 
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
 
int bit_rate
the average bitrate 
 
int width
picture width / height. 
 
#define CODEC_CAP_AUTO_THREADS
Codec supports avctx->thread_count == 0 (auto). 
 
int ff_alloc_packet(AVPacket *avpkt, int size)
 
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
 
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)
 
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes. 
 
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) 
 
common internal api header. 
 
common internal and external API header 
 
#define AVERROR_UNKNOWN
Unknown error, typically from an external library. 
 
int slices
Number of slices. 
 
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...