目前最常用的264工程师x264;
最近有又有一个开源工程OpenH264,WebRTC再用用,具体工程具体没有详细研究;
编译完成工程后,用h264dec.exe命令行测试解码x264编码的文件,解码后正常显示,也就是说这两个工程编码的格式应该相互兼容;
地址:http://www.openh264.org/faq.html
提供C语言接口和C++接口;
目前网络可以找到的文档相对较少,大概浏览了一下这个工程,觉得还不错;
工程编译Win7:
我在win7上简单编译了一些工程,没有特别需要配置的地方,
1:下载源码,解压;
2:msys进入解压目录,直接执行 make 命令;
3:几分钟后编译完成,在解压目录生成相关exe文件,几个.a文件,和一个libopenh264.dll文件;
4:在目录openh264-1.0.0\codec\build\win32\enc下有VS工程,打开可以编译出控制台程序和相关dll文件夹;生成的文件在\openh264-1.0.0\bin\win32\Debug;
当然其它平台也有相关的工程IDE文件;
5:还有一个方法:进入目录\openh264-1.0.0\testbin,用管理员权限执行 AutoBuild_Windows_VS2008.bat 文件,注意修改文件中的VS路径与计算机上的安装路径一直;
然后编译就可以了,文件在openh264-1.0.0\bin\win32目录中,有debug和release两个文件夹;
示例目录:
OpenSource\openh264\test //这个目录下有相关的一些示例;
也可以 OpenSource\openh264\codec\build\win32\enc 通过VC打开这个目录,查看更加完整的例子,这个是exe实力,更全面;
以下是工程中的说明文档:
OpenH264_API_v1.0.docx文档
Contents
Step#1: create and destroy the encoder 2
Step#2: initialize the encoder 2
Step#3: invoker the encoding 2
Step#4: control the encoding 3
Encoder Return Value: CM_RETURN 9
Encoder Return Value: EVideoFrameType: 9
Step#1: create and destroy the decoder 10
Step#2: initialize the decoder 10
Step#3: invoker the decoding 10
Step#4: control the decoding 11
Revisions history
Date | Version | Author | Description |
12/23/2013 | 0.1 | Sijia Chen, Wayne Liu | Initial version |
12/25/2013 | 0.2 | Sijia Chen | Add encoder return value explanation |
12/25/2013 | 0.3 | Sijia Chen | Add explanation on range of some parameters in encoder |
03/04/2014 | 0.4 | Karina Li | Interface and parameters update |
05/23/2014 | 1.0 | Wayne Liu, Karina Li | Update for v1.0 release |
int WelsCreateSVCEncoder(ISVCEncoder** ppEncoder);
void WelsDestroySVCEncoder(ISVCEncoder* pEncoder);
/*
Initilaize encoder by using base parameters.
*/
virtual int Initialize (const SEncParamBase* pParam) = 0;
Initilaize encoder by using extension parameters. If the user needs to set the more details, refer to use this interface.
*/
virtual int InitializeExt (const SEncParamExt* pParam) = 0;
/*
Get the default extension parameters . some time the user doesn’t care about all of the parameters. So he can get use the interface to get the default parameter, then updates these parameters he cares.
*/
virtual int GetDefaultParams (SEncParamExt* pParam) = 0;
virtual int Unintialize() = 0;
/*
* return: 0 - success; otherwise - failed;
*/
virtual int EncodeFrame(const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) = 0;
SSourcePicture:
Format | Parameter Name | Meaning/Constraint |
int | iColorFormat | the input image color space format, currently only supports videoFormatI420 |
int | iStride[4] | The stride of picture buffer |
unsigned char | pData[4] | Pointer to the source data |
int | iPicWidth | width of picture in luminance samples |
int | iPicHeight | height of picture in luminance samples |
Long long | uiTimeStamp | Time stamp of the frame. |
// kpSrc = the pointer to the source luminance plane
// chrominance data:
// CbData = kpSrc + m_iMaxPicWidth * m_iMaxPicHeight;
// CrData = CbData + (m_iMaxPicWidth * m_iMaxPicHeight)/4;
//the application calling this interface needs to ensure the data validation between the location of [kpSrc, kpSrc+framesize-1]
The upper layer application should ensure threading safety between calling these control interfaces and calling the encoding.
* return: 0 - success; otherwise - failed;
*/
virtual int PauseFrame(const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) = 0;
/*
* return: 0 - success; otherwise - failed;
*/
virtual int ForceIntraFrame(bool bIDR) = 0;
/***********************************************************************
* InDataFormat, IDRInterval, SVC Encode Param, Frame Rate, Bitrate,..
**************************** ******************************************/
/*
* return: CM_RETURN: 0 - success; otherwise - failed;
*/
virtual int SetOption(ENCODER_OPTION eOptionId, void* pOption) = 0;
virtual int GetOption(ENCODER_OPTION eOptionId, void* pOption) = 0;
int CWelsH264SVCEncoder::SetOption(ENCODER_OPTION eOptionId, void* pOption)
Option ID | Input Format | Meaning/Constraint |
ENCODER_OPTION_SVC_ENCODE_PARAM_BASE | Structure of Base Param |
|
ENCODER_OPTION_SVC_ENCODE_PARAM_EXT | Structure of Extension Param |
|
ENCODER_OPTION_IDR_INTERVAL | int | IDR period, 0/-1 means no Intra period (only the first frame) >0 means the desired IDR period, must be multiple of (2^temporal_layer) |
ENCODER_OPTION_FRAME_RATE | float | Maximal input frame rate, current supported range: MAX_FRAME_RATE = 30 MIN_FRAME_RATE = 1 |
ENCODER_OPTION_BITRATE | int |
|
ENCODER_OPTION_MAX_BITRATE | int |
|
ENCODER_PADDING_PADDING | int | 0:disable padding;1:padding |
ENCODER_LTR_RECOVERY_REQUEST | Structure of SLTRRecoverRequest |
|
ENCODER_LTR_MARKING_FEEDBACK | Structure of SLTRMarkingFeedback |
|
ENCOCER_LTR_MARKING_PERIOD | Unsigned int |
|
ENCODER_OPTION_LTR | Unsigned int | 0:not enable LTR;>0 enable LTR; LTR number is fixed to be 2 in current encoder |
ENCODER_OPTION_ENABLE_PREFIX_NAL_ADDING | Bool | false:not use Prefix NAL; true: use Prefix NAL |
ENCODER_OPTION_ENABLE_SPS_PPS_ID_ADDITION | Bool | false:not adjust ID in SPS/PPS; true: adjust ID in SPS/PPS |
ENCODER_OPTION_CURRENT_PATH | string |
|
ENCODER_OPTION_DUMP_FILE | Structure of SDumpLayer | Dump layer reconstruct frame to a specified file |
ENCODER_OPTION_TRACE_LEVEL | int | Output some info accoding to the trace level |
(Note: some parameters in mentioned structure are not explained because they are to be removed)
SEncParamBase:
Format | Parameter Name | Meaning/Constraint |
int | iUsageType | Currently two type applications are supported. 0: camera video 1: screen content |
int | iInputCsp | color space of input sequence currently only supports videoFormatI420 |
int | iPicWidth | width of picture in luminance samples (the maximum of all layers if multiple spatial layers presents) |
int | iPicHeight | height of picture in luminance samples((the maximum of all layers if multiple spatial layers presents) |
int | iTargetBitrate | target bitrate |
int | iRCMode | Rate control mode |
float | fMaxFrameRate | maximal input frame rate |
Format | Parameter Name | Meaning/Constraint |
int | iUsageType | Currently two type applications are supported. 0: camera video 1: screen content |
int | iInputCsp | color space of input sequence currently only supports videoFormatI420 |
int | iPicWidth | width of picture in luminance samples (the maximum of all layers if multiple spatial layers presents) |
int | iPicHeight | height of picture in luminance samples((the maximum of all layers if multiple spatial layers presents) |
int | iTargetBitrate | target bitrate |
int | iRCMode | Rate control mode |
float | fMaxFrameRate | maximal input frame rate |
int | iTemporalLayerNum | temporal layer number, max temporal layer = 4 |
int | iSpatialLayerNum | spatial layer number, 1<= iSpatialLayerNum <= MAX_SPATIAL_LAYER_NUM MAX_SPATIAL_LAYER_NUM = 4 |
SSpatialLayerConfig | sSpatialLayers[MAX_SPATIAL_LAYER_NUM]; |
|
int | iInputCsp | color space of input sequence |
int | iTemporalLayerNum | temporal layer number, max temporal layer = 4 |
int | iSpatialLayerNum | spatial layer number, 1<= iSpatialLayerNum <= MAX_SPATIAL_LAYER_NUM MAX_SPATIAL_LAYER_NUM = 4 |
unsigned int | uiIntraPeriod | period of IDR frame |
int | iNumRefFrame | The number of the reference frame |
Unsigned int | uiFrameToBeCoded | The number of the frames to be encoded. the user doesn’t know the number or doesn’t care the number,can set 0xFFFFFFFF. |
bool | bEnableSpsPpsIdAddition | false:not adjust ID in SPS/PPS; true: adjust ID in SPS/PPS |
bool | bPrefixNalAddingCtrl | false:not use Prefix NAL; true: use Prefix NAL |
bool | bEnableSSEI | false:not use SSEI; true: use SSEI |
int | iPaddingFlag | 0:disable padding;1:padding |
int | iEntropyCodingModeFlag | 0:CAVLC 1:CABAC. Currently only supports CAVLC. |
bool | bEnableRc | False: don’t use rate control; true: use rate control |
bool | bEnableFrameSKip | False: don’t skip frame even if VBV buffer overflow. True: allow skipping frames to keep the bitrate within limits |
int | iMaxBitrate | the maximum bitrate |
int | iMaxQp | the maximum QP encoder supports |
int | iMinQp | The minmum QP encoder supports |
Unsigned int | uiMaxNalSize | The maximum NAL size. This value should be not 0 for dynamic slice mode |
bool | bEnableLongTermReference; | 0: on, 1: off |
int | iLTRRefNum | The number of LTR(long term reference) |
int | iLtrMarkPeriod | The LTR marked period that is used in feedback. |
Short | iMultipleThreadIdc | # 0: auto(dynamic imp. internal encoder); 1: multiple threads imp. disabled; > 1: count number of threads; |
Int | iLoopFilterDisableIdc | 0: on, 1: off, 2: on except for slice boundaries |
Int | iLoopFilterAlphaC0Offset | AlphaOffset: valid range [-6, 6], default 0 |
Int | iLoopFilterBetaOffset | BetaOffset: valid range [-6, 6], default 0 |
bool | bEnableDenoise; | denoise control |
bool | bEnableBackgroundDetection | background detection control |
bool | bEnableAdaptiveQuant | adaptive quantization control |
bool | bEnableFrameCroppingFlag; | enable cropping source picture |
int | bEnableSceneChangeDetect | Enable scene change detection |
SSpatialLayerConfig
Format | Parameter Name | Meaning/Constraint |
int | iVideoWidth | width of picture in luminance samples of a layer |
int | iVideoHeight | height of picture in luminance samples of a layer |
float | fFrameRate | frame rate for a layer |
int | iSpatialBitrate | target bitrate for a spatial layer |
int | iMaxSpatialBitrate | Maximum bitrate for a spatial layer |
EProfileIdc | uiProfileIdc | value of profile IDC (0 for auto-detection) |
ELevelIdc | uiLevelIdc | value of level IDC (0 for auto-detection) |
Int | iDLayerQp | Each layer QP for fixed quant case |
SSliceConfig | sSliceCfg | slicing configuration |
| sSliceCfg.uiSliceMode | 0: SM_SINGLE_SLICE: SliceNum==1 1: SM_FIXEDSLCNUM_SLICE: according to SliceNum, Enabled dynamic slicing for multi-thread 2: SM_RASTER_SLICE: according to SlicesAssign, Need input of MB numbers each slice. In addition, if other constraint in SSliceArgument is presented, need to follow the constraints. Typically if MB num and slice size are both constrained, re-encoding may be involved. 3: SM_ROWMB_SLICE: according to PictureMBHeight, a row of mbs per slice 4: SM_DYN_SLICE: according to SliceSize, Dynamic slicing (have no idea about slice_nums until encoding current frame) |
| sSliceCfg. sSliceArgument uiSliceMbNum | Used in uiSliceMode=2 |
| sSliceCfg. sSliceArgument uiSliceNum | Used in uiSliceMode=1 |
| sSliceCfg. sSliceArgument uiSliceSizeConstraint | Used in uiSliceMode=4 |
Return value of parameter Initializtion: Initialize() and set option SetOption()
Value | Parameter Name | Meaning/Constraint |
0 | cmResultSuccess | Successful initialized |
1 | cmInitParaError | Found error in input parameters |
2 | cmMachPerfIsBad | Not supported yet |
3 | cmUnkonwReason | Not supported yet |
4 | cmMallocMemeError | Input source picture is NULL |
5 | cmInitExpected | Encoder is not created correctly |
Return value of encode one frame: EncodeFrame()
Value | Parameter Name | Meaning/Constraint |
0 | videoFrameTypeInvalid | Encoder not ready or parameters are invalidate |
1 | videoFrameTypeIDR | IDR frame in H.264 |
2 | videoFrameTypeI | I frame type |
3 | videoFrameTypeP | P frame type |
4 | videoFrameTypeSkip | Encoder decides to skip the frame, no bit stream will be ouputed |
5 | videoFrameTypeIPMixed | A frame where I and P slices are mixing, not supported yet |
int WelsCreateDecoder(ISVCDecoder** ppDecoder);
void WelsDestroyDecoder(ISVCDecoder* pDecoder);
virtual long Initialize(const SDecodingParam* pParam) = 0;
virtual long Unintialize() = 0;
/***************************************************************************
* Description:
* Decompress one frame or slice, and output I420 decoded data.
*
*Input parameters:
* ParameterTYPE Description
* kpSrcconst unsigned char* the h264 stream to be decoded
* kiSrcLenconst int the length of h264 steam
* ppDst unsigned char** buffer pointer of decoded data (YUV)
* pDstInfo SBufferInfo*information provided to API including width, height, etc
*pStrideint*output stride
*iWidthint&output width
*iHeightint&output height
*
*return: if decode frame success return 0, otherwise corresponding error returned.
/***************************************************************************/
//the following API is for slice level decoding
virtual DECODING_STATE DecodeFrame2(
const unsigned char* kpSrc,
const int kiSrcLen,
unsigned char** ppDst,
SBufferInfo* pDstInfo);
//the following API is for frame level decoding
Virtual DECODING_STATE DecodeFrame(
const unsigned char* kpSrc,
const int kiSrcLen,
unsigned char** ppDst,
int* pStride,
int& iWidth,
int& iHeight );
//Note: DecodeFrameEx() is not used.
//Note: for slice level DecodeFrame2() (4 parameters input), whatever the function return value is, the outputted data of I420 format will only be available when pDstInfo->iBufferStatus == 1,. (e.g., in multi-slice cases, only when the whole picture is completely reconstructed, this variable would be set as 1.)
virtual int SetOption(DECODER_OPTION eOptionId, void* pOption) = 0;
virtual int GetOption(DECODER_OPTION eOptionId, void* pOption) = 0;
Option ID | Input Format | Meaning/Constraint |
DECODER_OPTION_DATAFORMAT | int | color format, now supports 23 only (I420) |
DECODER_OPTION_END_OF_STREAM | bool | end of stream flag |
DECODER_OPTION_VCL_NAL | bool | feedback whether or not have VCL NAL in current AU for application layer |
DECODER_OPTION_TEMPORAL_ID | int | if have VCL NAL in current AU, then feedback the temporal ID |
DECODER_OPTION_FRAME_NUM | int | Indicate frame_num |
DECODER_OPTION_IDR_PIC_ID | int | Indicate current IDR_ID |
DECODER_OPTION_LTR_MARKING_FLAG | bool | read only, indicating if LTR_marking SE flag is used in current AU |
DECODER_OPTION_LTR_MARKED_FRAME_NUM | int | Read only, indicating the frame_num of current AU marked as LTR |
DECODER_OPTION_ERROR_CON_IDC | int | Indicate error concealment method 0: disable 1: frame_copy 2: slice_copy (default) |
(Note: some parameters in mentioned structure are not explained because they are to be removed)
SDecodingParam: (Note: some of the members may not be used for now.)
Format | Parameter Name | Meaning/Constraint |
char* | pFileNameRestructed | File name of restructed frame used for PSNR calculation based debug; |
int | iOutputColorFormat | color space format to be outputed |
unsigned int | uiCpuLoad | CPU load |
unsigned char | uiTargetDqLayer | target dq layer number |
unsigned char | uiEcActiveFlag | Whether active error concealment feature in decoder |
SVideoProperty | sVideoProperty | Video stream property |
SVideoProperty
Format | Parameter Name | Meaning/Constraint |
unsigned int | size | size of structure |
VIDEO_BITSTREAM_TYPE | eVideoBsType | Video stream type (AVC/SVC) |
SBufferInfo:
Format | Parameter Name | Meaning/Constraint |
int | iBufferStatus | 0: data not ready, 1: data ready |
union UsrData |
| Output buffer info, see following tables |
union UsrData:
Format | Parameter Name | Meaning/Constraint |
SSysMEMBuffer | sSysMEMBuffer | output with memory, see following tables |
SSysMEMBuffer
Format | Parameter Name | Meaning/Constraint |
int | iWidth | width of decoded pic |
int | iHeight | height of decoded pic |
int | iFormat | type is “EVideoFormatType”, see codec_def.h |
int | iStride[2] | stride |
A dummy process for using the decoder could be: (for static library)
1. ISVCDecoder *pSvcDecoder; //declare a decoder
unsigned char *pBuf = …; //input: encoded bitstream start position; should include start code prefix
int iSize = …; //input: encoded bitsteam length; should include the size of start code prefix
unsigned char *pData[3] = …; //output: [0~2] for Y,U,V buffer
SBufferInfo sDstBufInfo; //in-out: declare the output buffer info
memset(&sDstBufInfo, 0, sizeof(SBufferInfo));
2. CreateDecoder(pSvcDecoder); //create a decoder
3. SDecodingParam sDecParam = {0}; //declare required param
sDecParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
4. Initialize(&sDecParam); //initialize the param and decoder context, allocate memory
5. DecodeFrame2(pBuf, iSize, pData, &sDstBufInfo); //do actual decoding for slice/frame level; this can be done in a loop until data ends
//if (sDstBufInfo.iBufferStatus==1), pData can be used for render.
6. Uninitialize(); //Uninitialize the decoder and memory free.
7. DestroyDecoder(); //Destroy the decoder
README.md文档
OpenH264
========
OpenH264 is a codec library which supports H.264 encoding and decoding. It is suitable for use in real time applications such as WebRTC. See http://www.openh264.org/ for more details.
Encoder Features
----------------
- Constrained Baseline Profile up to Level 5.2 (4096x2304)
- Arbitrary resolution, support cropping
- Rate control with adaptive quantization, or constant quantization
- Slice options: 1 slice per frame, N slices per frame, N macroblocks per slice, or N bytes per slice
- Multiple threads automatically used for multiple slices
- Temporal scalability up to 4 layers in a dyadic hierarchy
- Spatial simulcast up to 4 resolutions from a single input
- Long Term Reference (LTR) frames
- Memory Management Control Operation (MMCO)
- Reference picture list modification
- Single reference frame for inter prediction
- Multiple reference frames when using LTR and/or 3-4 temporal layers
- Periodic and on-demand Instantaneous Decoder Refresh (IDR) frame insertion
- Dynamic changes to bit rate, frame rate, and resolution
- Annex B byte stream output
- YUV 4:2:0 planar input
Decoder Features
----------------
- Constrained Baseline Profile up to Level 5.2 (4096x2304)
- Arbitrary resolution, not constrained to multiples of 16x16
- Single thread for all slices
- Long Term Reference (LTR) frames
- Memory Management Control Operation (MMCO)
- Reference picture list modification
- Multiple reference frames when specified in Sequence Parameter Set (SPS)
- Annex B byte stream input
- YUV 4:2:0 planar output
- Decoder output timing conformance
- Error concealment support with slice copy as default method
OS Support
----------
- Windows 64-bit and 32-bit
- Mac OS X 64-bit and 32-bit
- Linux 64-bit and 32-bit
- Android 32-bit
- iOS 64-bit and 32-bit (not fully tested)
Processor Support
-----------------
- Intel x86 optionally with MMX/SSE (no AVX yet, help is welcome)
- ARMv7 optionally with NEON
- Any architecture using C/C++ fallback functions
Building the Library
--------------------
NASM needed to be installed for assembly code: workable version 2.07 or above, nasm can downloaded from http://www.nasm.us/
To build the arm assembly for Windows Phone, gas-preprocessor is required. It can be downloaded from git://git.libav.org/gas-preprocessor.git
For Android Builds
------------------
To build for android platform, You need to install android sdk and ndk. You also need to export **ANDROID_SDK**/tools to PATH. On Linux, this can be done by
'export PATH=**ANDROID_SDK**/tools:$PATH'
The codec and demo can be built by
'make OS=android NDKROOT=**ANDROID_NDK** TARGET= **ANDROID_TARGET**'
Valid **ANDROID_TARGET** can be found in **ANDROID_SDK**/platforms, such as android-12.
You can also set ARCH, NDKLEVEL, GCCVERSION according to your device and NDK version.
ARCH specifies the architecture of android device. Currently only arm and x86 are supported, the default is arm.
NDKLEVEL specifies android api level, the api level can be 12-19, the default is 12.
GCCVERSION specifies which gcc in NDK is used, the default is 4.8.
By default these commands build for the armeabi-v7a ABI. To build for the other android
ABIs, add "ARCH=mips" or "ARCH=x86". To build for the older armeabi ABI (which has
armv5te as baseline), add "APP_ABI=armeabi" (ARCH=arm is implicit).
For iOS Builds
--------------
You can build the libraries and demo applications using xcode project files
located in codec/build/iOS/dec and codec/build/iOS/enc.
You can also build the libraries (but not the demo applications) using the
make based build system from the command line. Build with
'make OS=ios ARCH=**ARCH**'
Valid values for **ARCH** are the normal iOS architecture names such as
armv7, armv7s, arm64, and i386 and x86_64 for the simulator. Additionally,
one might need to add 'SDK=X.Y' to the make command line in case the default
SDK version isn't available. Another settable iOS specific parameter
is SDK_MIN, specifying the minimum deployment target for the built library.
For other details on building using make on the command line, see
'For All Platforms' below.
For Windows Builds
------------------
Our Windows builds use MinGW which can be found here - http://www.mingw.org/
To build with gcc, add the MinGW bin directory (e.g. /c/MinGW/bin) to your path and follow the 'For All Platforms' instructions below.
To build with Visual Studio you will need to set up your path to run cl.exe. The easiest way is to start MSYS from a developer command line session - http://msdn.microsoft.com/en-us/library/ms229859(v=vs.110).aspx If you need to do it by hand here is an example from a Windows 64bit install of VS2012:
export PATH="$PATH:/c/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin:/c/Program Files (x86)/Microsoft Visual Studio 11.0/Common7/IDE"
You will also need to set your INCLUDE and LIB paths to point to your VS and SDK installs. Something like this, again from Win64 with VS2012 (note the use of Windows-style paths here).
export INCLUDE="C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include;C:\Program Files (x86)\Windows Kits\8.0\Include\um;C:\Program Files (x86)\Windows Kits\8.0\Include\shared"
export LIB="C:\Program Files (x86)\Windows Kits\8.0\Lib\Win8\um\x86;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib"
Then add 'OS=msvc' to the make line of the 'For All Platforms' instructions.
For All Platforms
-------------------
From the main project directory:
'make' for automatically detecting 32/64bit and building accordingly
'make ENABLE64BIT=No' for 32bit builds
'make ENABLE64BIT=Yes' for 64bit builds
'make V=No' for a silent build (not showing the actual compiler commands)
The command line programs h264enc and h264dec will appear in the main project directory.
A shell script to run the command-line apps is in testbin/CmdLineExample.sh
Usage information can be found in testbin/CmdLineReadMe
Using the Source
----------------
codec - encoder, decoder, console (test app), build (makefile, vcproj)
build - scripts for Makefile build system.
test - GTest unittest files.
testbin - autobuild scripts, test app config files
res - yuv and bitstream test files
Known Issues
------------
See the issue tracker on https://github.com/cisco/openh264/issues
- Encoder errors when resolution exceeds 3840x2160
- Encoder errors when compressed frame size exceeds half uncompressed size
- Encoder does not support QP < 10 encoding
- Encoder does not support slice number > 35 encoding
- The result of float-point calculation in rate control will be affected by preciseness of double-typed variable on different platform
- Decoder errors when compressed frame size exceeds 1MB
- Encoder RC requires frame skipping to be enabled to hit the target bitrate,
if frame skipping is disabled the target bitrate may be exceeded
License
-------
BSD, see LICENSE file for details.