<div dir="ltr">While adapting the encoding example to my use at some point I broke bitrate control... Basically, no matter what I set the bitrate to I get the same video out of libva. Here is my code:<br><div><br></div><div><div><font face="monospace, monospace">#include "VAKit/VAH264Encoder.h"</font></div><div><font face="monospace, monospace">#include "VAKit/BitStream.h"</font></div><div><font face="monospace, monospace">#include "VAKit/NALTypes.h"</font></div><div><font face="monospace, monospace">#include "XSDK/XException.h"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">using namespace VAKit;</font></div><div><font face="monospace, monospace">using namespace std;</font></div><div><font face="monospace, monospace">using namespace XSDK;</font></div><div><font face="monospace, monospace">using namespace AVKit;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">const size_t MAX_FRAME_NUM = (2<<16);</font></div><div><font face="monospace, monospace">const size_t MAX_PIC_ORDER_CNT_LSB = (2<<8);</font></div><div><font face="monospace, monospace">const size_t LOG_2_MAX_FRAME_NUM = 16;</font></div><div><font face="monospace, monospace">const size_t LOG_2_MAX_PIC_ORDER_CNT_LSB = 8;</font></div><div><font face="monospace, monospace">const int32_t H264_MAXREF = (1<<16|1);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">const int32_t FRAME_P = 0;</font></div><div><font face="monospace, monospace">const int32_t FRAME_I = 2;</font></div><div><font face="monospace, monospace">const int32_t FRAME_IDR = 7;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">static const size_t DEFAULT_PADDING = 16;</font></div><div><font face="monospace, monospace">static const size_t DEFAULT_ENCODE_BUFFER_SIZE = (1024*1024);</font></div><div><font face="monospace, monospace">static const size_t DEFAULT_EXTRADATA_BUFFER_SIZE = (1024*256);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">VAH264Encoder::VAH264Encoder( const struct AVKit::CodecOptions& options,</font></div><div><font face="monospace, monospace">                              bool annexB ) :</font></div><div><font face="monospace, monospace">    _devicePath(),</font></div><div><font face="monospace, monospace">    _annexB( annexB ),</font></div><div><font face="monospace, monospace">    _fd(-1),</font></div><div><font face="monospace, monospace">    _display(),</font></div><div><font face="monospace, monospace">    _h264Profile( VAProfileH264High ),</font></div><div><font face="monospace, monospace">    _configID( 0 ),</font></div><div><font face="monospace, monospace">    _srcSurfaceID( 0 ),</font></div><div><font face="monospace, monospace">    _codedBufID( 0 ),</font></div><div><font face="monospace, monospace">    _refSurfaceIDs(),</font></div><div><font face="monospace, monospace">    _contextID(0),</font></div><div><font face="monospace, monospace">    _seqParam(),</font></div><div><font face="monospace, monospace">    _picParam(),</font></div><div><font face="monospace, monospace">    _sliceParam(),</font></div><div><font face="monospace, monospace">    _currentCurrPic(),</font></div><div><font face="monospace, monospace">    _referenceFrames(),</font></div><div><font face="monospace, monospace">    _refPicListP(),</font></div><div><font face="monospace, monospace">    _constraintSetFlag( 0 ),</font></div><div><font face="monospace, monospace">    _h264EntropyMode( 1 ), /* cabac */</font></div><div><font face="monospace, monospace">    _frameWidth( 0 ),</font></div><div><font face="monospace, monospace">    _frameWidthMBAligned( 0 ),</font></div><div><font face="monospace, monospace">    _frameHeight( 0 ),</font></div><div><font face="monospace, monospace">    _frameHeightMBAligned( 0 ),</font></div><div><font face="monospace, monospace">    _frameBitRate( 0 ),</font></div><div><font face="monospace, monospace">    _intraPeriod( 15 ),</font></div><div><font face="monospace, monospace">    _currentIDRDisplay( 0 ),</font></div><div><font face="monospace, monospace">    _currentFrameNum( 0 ),</font></div><div><font face="monospace, monospace">    _currentFrameType( 0 ),</font></div><div><font face="monospace, monospace">    _timeBaseNum( 0 ),</font></div><div><font face="monospace, monospace">    _timeBaseDen( 0 ),</font></div><div><font face="monospace, monospace">    _extraData(),</font></div><div><font face="monospace, monospace">    _pkt(),</font></div><div><font face="monospace, monospace">    _options( options )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    if( options.device_path.IsNull() )</font></div><div><font face="monospace, monospace">        X_THROW(("device_path needed for VAH264Encoder."));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _devicePath = options.device_path.Value();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _fd = open( _devicePath.c_str(), O_RDWR );</font></div><div><font face="monospace, monospace">    if( _fd <= 0 )</font></div><div><font face="monospace, monospace">        X_THROW(("Unable to open %s",_devicePath.c_str()));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _display = (VADisplay)vaGetDisplayDRM( _fd );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.width.IsNull() )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _frameWidth = options.width.Value();</font></div><div><font face="monospace, monospace">        _frameWidthMBAligned = (_frameWidth + 15) & (~15);</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    else X_THROW(( "Required option missing: width" ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.height.IsNull() )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _frameHeight = options.height.Value();</font></div><div><font face="monospace, monospace">        _frameHeightMBAligned = (_frameHeight + 15) & (~15);</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    else X_THROW(( "Required option missing: height" ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.bit_rate.IsNull() )</font></div><div><font face="monospace, monospace">        _frameBitRate = options.bit_rate.Value();</font></div><div><font face="monospace, monospace">//        _frameBitRate = (options.bit_rate.Value() / 1024) / 8;</font></div><div><font face="monospace, monospace">    else X_THROW(( "Required option missing: bit_rate" ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.gop_size.IsNull() )</font></div><div><font face="monospace, monospace">        _intraPeriod = options.gop_size.Value();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.time_base_num.IsNull() )</font></div><div><font face="monospace, monospace">        _timeBaseNum = options.time_base_num.Value();</font></div><div><font face="monospace, monospace">    else X_THROW(("Required option missing: time_base.num"));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( !options.time_base_den.IsNull() )</font></div><div><font face="monospace, monospace">        _timeBaseDen = options.time_base_den.Value();</font></div><div><font face="monospace, monospace">    else X_THROW(("Required option missing: time_base.den"));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    int major_ver = 0, minor_ver = 0;</font></div><div><font face="monospace, monospace">    VAStatus status = vaInitialize( _display, &major_ver, &minor_ver );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaInitialize (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    switch( _h264Profile )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">    case VAProfileH264Baseline:</font></div><div><font face="monospace, monospace">        _constraintSetFlag |= (1 << 0); /* Annex A.2.1 */</font></div><div><font face="monospace, monospace">        _h264EntropyMode = 0;</font></div><div><font face="monospace, monospace">        break;</font></div><div><font face="monospace, monospace">    case VAProfileH264ConstrainedBaseline:</font></div><div><font face="monospace, monospace">        _constraintSetFlag |= (1 << 0 | 1 << 1); /* Annex A.2.2 */</font></div><div><font face="monospace, monospace">        _h264EntropyMode = 0;</font></div><div><font face="monospace, monospace">        break;</font></div><div><font face="monospace, monospace">    case VAProfileH264Main:</font></div><div><font face="monospace, monospace">        _constraintSetFlag |= (1 << 1); /* Annex A.2.2 */</font></div><div><font face="monospace, monospace">        break;</font></div><div><font face="monospace, monospace">    case VAProfileH264High:</font></div><div><font face="monospace, monospace">        _constraintSetFlag |= (1 << 3); /* Annex A.2.4 */</font></div><div><font face="monospace, monospace">        break;</font></div><div><font face="monospace, monospace">    default:</font></div><div><font face="monospace, monospace">        _h264Profile = VAProfileH264Baseline;</font></div><div><font face="monospace, monospace">        _constraintSetFlag |= (1 << 0); /* Annex A.2.1 */</font></div><div><font face="monospace, monospace">        break;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAConfigAttrib configAttrib[VAConfigAttribTypeMax];</font></div><div><font face="monospace, monospace">    int configAttribNum = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].type = VAConfigAttribRTFormat;</font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].value = VA_RT_FORMAT_YUV420;</font></div><div><font face="monospace, monospace">    configAttribNum++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].type = VAConfigAttribRateControl;</font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].value = VA_RC_VBR;</font></div><div><font face="monospace, monospace">    configAttribNum++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].type = VAConfigAttribEncPackedHeaders;</font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].value = VA_ENC_PACKED_HEADER_NONE;</font></div><div><font face="monospace, monospace">    configAttrib[configAttribNum].value = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE;</font></div><div><font face="monospace, monospace">    configAttribNum++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaCreateConfig( _display,</font></div><div><font face="monospace, monospace">                             _h264Profile,</font></div><div><font face="monospace, monospace">                             VAEntrypointEncSlice,</font></div><div><font face="monospace, monospace">                             &configAttrib[0],</font></div><div><font face="monospace, monospace">                             configAttribNum,</font></div><div><font face="monospace, monospace">                             &_configID );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateConfig (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    // Configuration below this point can be thought of as specific to a particular</font></div><div><font face="monospace, monospace">    // encoder channel. I point this out because we might want to split this out</font></div><div><font face="monospace, monospace">    // someday.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    /* create source surfaces */</font></div><div><font face="monospace, monospace">    status = vaCreateSurfaces( _display,</font></div><div><font face="monospace, monospace">                               VA_RT_FORMAT_YUV420,</font></div><div><font face="monospace, monospace">                               _frameWidthMBAligned,</font></div><div><font face="monospace, monospace">                               _frameHeightMBAligned,</font></div><div><font face="monospace, monospace">                               &_srcSurfaceID,</font></div><div><font face="monospace, monospace">                               1,</font></div><div><font face="monospace, monospace">                               NULL,</font></div><div><font face="monospace, monospace">                               0 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateSurfaces (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    /* create reference surfaces */</font></div><div><font face="monospace, monospace">    status = vaCreateSurfaces( _display,</font></div><div><font face="monospace, monospace">                               VA_RT_FORMAT_YUV420,</font></div><div><font face="monospace, monospace">                               _frameWidthMBAligned,</font></div><div><font face="monospace, monospace">                               _frameHeightMBAligned,</font></div><div><font face="monospace, monospace">                               &_refSurfaceIDs[0],</font></div><div><font face="monospace, monospace">                               SURFACE_NUM,</font></div><div><font face="monospace, monospace">                               NULL,</font></div><div><font face="monospace, monospace">                               0 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateSurfaces (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VASurfaceID* tmp_surfaceid = (VASurfaceID*)calloc( 2, sizeof(VASurfaceID) );</font></div><div><font face="monospace, monospace">    memcpy( tmp_surfaceid, &_srcSurfaceID, sizeof(VASurfaceID) );</font></div><div><font face="monospace, monospace">    memcpy( tmp_surfaceid + 1, &_refSurfaceIDs, sizeof(VASurfaceID) );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    /* Create a context for this encode pipe */</font></div><div><font face="monospace, monospace">    status = vaCreateContext( _display,</font></div><div><font face="monospace, monospace">                              _configID,</font></div><div><font face="monospace, monospace">                              _frameWidthMBAligned,</font></div><div><font face="monospace, monospace">                              _frameHeightMBAligned,</font></div><div><font face="monospace, monospace">                              VA_PROGRESSIVE,</font></div><div><font face="monospace, monospace">                              tmp_surfaceid,</font></div><div><font face="monospace, monospace">                              2,</font></div><div><font face="monospace, monospace">                              &_contextID );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    free(tmp_surfaceid);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateContext (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                             _contextID,</font></div><div><font face="monospace, monospace">                             VAEncCodedBufferType,</font></div><div><font face="monospace, monospace">                             (_frameWidthMBAligned * _frameHeightMBAligned * 400) / (16*16),</font></div><div><font face="monospace, monospace">                             1,</font></div><div><font face="monospace, monospace">                             NULL,</font></div><div><font face="monospace, monospace">                             &_codedBufID );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">VAH264Encoder::~VAH264Encoder() throw()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    vaDestroyBuffer( _display, _codedBufID );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaDestroyContext( _display, _contextID );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaDestroySurfaces( _display, &_refSurfaceIDs[0], SURFACE_NUM );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaDestroySurfaces( _display, &_srcSurfaceID, 1 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaDestroyConfig( _display, _configID );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaTerminate( _display );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    close( _fd );</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">size_t VAH264Encoder::EncodeYUV420P( uint8_t* pic,</font></div><div><font face="monospace, monospace">                                     uint8_t* output,</font></div><div><font face="monospace, monospace">                                     size_t outputSize,</font></div><div><font face="monospace, monospace">                                     AVKit::FrameType type )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    VAImage image;</font></div><div><font face="monospace, monospace">    vaDeriveImage( _display, _srcSurfaceID, &image );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _UploadImage( pic, image, _frameWidth, _frameHeight );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _currentFrameType = _ComputeCurrentFrameType( _currentFrameNum,</font></div><div><font face="monospace, monospace">                                                  _intraPeriod,</font></div><div><font face="monospace, monospace">                                                  type );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameType == FRAME_IDR )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _numShortTerm = 0;</font></div><div><font face="monospace, monospace">        _currentFrameNum = 0;</font></div><div><font face="monospace, monospace">        _currentIDRDisplay = _currentFrameNum;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAStatus status = vaBeginPicture( _display, _contextID, _srcSurfaceID );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaBeginPicture (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameType == FRAME_IDR )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _RenderSequence();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        _RenderPicture( false );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        _RenderPackedSPS();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        _RenderPackedPPS();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        if( !_extraData.Get() )</font></div><div><font face="monospace, monospace">        {</font></div><div><font face="monospace, monospace">            BitStream seqBS;</font></div><div><font face="monospace, monospace">            BuildPackedSeqBuffer( seqBS,</font></div><div><font face="monospace, monospace">                                  _seqParam,</font></div><div><font face="monospace, monospace">                                  _h264Profile,</font></div><div><font face="monospace, monospace">                                  _constraintSetFlag,</font></div><div><font face="monospace, monospace">                                  _timeBaseNum,</font></div><div><font face="monospace, monospace">                                  _timeBaseDen,</font></div><div><font face="monospace, monospace">                                  _frameBitRate / 8 );</font></div><div><font face="monospace, monospace">//                                  _frameBitRate * 1024 * 8 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">            BitStream ppsBS;</font></div><div><font face="monospace, monospace">            BuildPackedPicBuffer( ppsBS, _picParam );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">            _extraData = new XMemory;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">            memcpy( &_extraData->Extend(seqBS.Size()), seqBS.Map(), seqBS.Size() );</font></div><div><font face="monospace, monospace">            memcpy( &_extraData->Extend(ppsBS.Size()), ppsBS.Map(), ppsBS.Size() );</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    else _RenderPicture( false );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _RenderSlice();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaEndPicture( _display, _contextID );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaEndPicture (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _UpdateReferenceFrames();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaSyncSurface( _display, _srcSurfaceID );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaSyncSurface (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VACodedBufferSegment* bufList = NULL;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaMapBuffer( _display, _codedBufID, (void **)(&bufList) );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaMapBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VACodedBufferSegment* current = bufList;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    uint32_t accumSize = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    while( current != NULL )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        accumSize += current->size;</font></div><div><font face="monospace, monospace">        current = (VACodedBufferSegment*)current->next;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( outputSize < accumSize )</font></div><div><font face="monospace, monospace">        X_THROW(("Not enough room in output buffer."));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    uint8_t* dst = output;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    while( bufList != NULL )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        memcpy( dst, bufList->buf, bufList->size );</font></div><div><font face="monospace, monospace">        dst += bufList->size;</font></div><div><font face="monospace, monospace">        bufList = (VACodedBufferSegment*)bufList->next;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaUnmapBuffer( _display, _codedBufID );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return accumSize;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">XIRef<XMemory> VAH264Encoder::EncodeYUV420P( XIRef<XMemory> input,</font></div><div><font face="monospace, monospace">                                             AVKit::FrameType type )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    XIRef<XMemory> frame = new XMemory( DEFAULT_ENCODE_BUFFER_SIZE + DEFAULT_PADDING );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    uint8_t* p = &frame->Extend( DEFAULT_ENCODE_BUFFER_SIZE );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    size_t outputSize = EncodeYUV420P( input->Map(),</font></div><div><font face="monospace, monospace">                                       p,</font></div><div><font face="monospace, monospace">                                       frame->GetDataSize(),</font></div><div><font face="monospace, monospace">                                       type );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    frame->ResizeData( outputSize );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return frame;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">bool VAH264Encoder::LastWasKey() const</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    return (_currentFrameType == FRAME_IDR) ? true : (_currentFrameType == FRAME_I) ? true : false;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">struct CodecOptions VAH264Encoder::GetOptions() const</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    return _options;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">XIRef<XMemory> VAH264Encoder::GetExtraData() const</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    if( _extraData->GetDataSize() == 0 )</font></div><div><font face="monospace, monospace">        X_THROW(("Decode one frame before call to GetExtraData()."));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return _extraData;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int32_t VAH264Encoder::_ComputeCurrentFrameType( uint32_t currentFrameNum,</font></div><div><font face="monospace, monospace">                                                 int32_t intraPeriod,</font></div><div><font face="monospace, monospace">                                                 AVKit::FrameType type ) const</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    if( type == FRAME_TYPE_AUTO_GOP )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        if( (currentFrameNum % intraPeriod) == 0 )</font></div><div><font face="monospace, monospace">        {</font></div><div><font face="monospace, monospace">            if( currentFrameNum == 0 )</font></div><div><font face="monospace, monospace">                return FRAME_IDR;</font></div><div><font face="monospace, monospace">            else return FRAME_I;</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        return FRAME_P;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    else</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        if( type == FRAME_TYPE_KEY )</font></div><div><font face="monospace, monospace">        {</font></div><div><font face="monospace, monospace">            if( currentFrameNum == 0 )</font></div><div><font face="monospace, monospace">                return FRAME_IDR;</font></div><div><font face="monospace, monospace">            else return FRAME_I;</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace">        else return FRAME_P;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_UpdateReferenceFrames()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    _currentCurrPic.flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE;</font></div><div><font face="monospace, monospace">    _numShortTerm++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _numShortTerm > SURFACE_NUM )</font></div><div><font face="monospace, monospace">        _numShortTerm = SURFACE_NUM;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    for( int i = _numShortTerm - 1; i > 0; i-- )</font></div><div><font face="monospace, monospace">        _referenceFrames[i] = _referenceFrames[i-1];</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _referenceFrames[0] = _currentCurrPic;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _currentFrameNum++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameNum > MAX_FRAME_NUM )</font></div><div><font face="monospace, monospace">        _currentFrameNum = 0;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_UpdateRefPicList()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    uint32_t current_poc = _currentCurrPic.TopFieldOrderCnt;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameType == FRAME_P )</font></div><div><font face="monospace, monospace">        memcpy( _refPicListP, _referenceFrames, _numShortTerm * sizeof(VAPictureH264));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_RenderSequence()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    VABufferID seq_param_buf, rc_param_buf, misc_param_tmpbuf, render_id[2];</font></div><div><font face="monospace, monospace">    VAStatus status;</font></div><div><font face="monospace, monospace">    VAEncMiscParameterBuffer *misc_param, *misc_param_tmp;</font></div><div><font face="monospace, monospace">    VAEncMiscParameterRateControl *misc_rate_ctrl;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _seqParam.level_idc = 41 /*SH_LEVEL_3*/;</font></div><div><font face="monospace, monospace">    _seqParam.picture_width_in_mbs = _frameWidthMBAligned / 16;</font></div><div><font face="monospace, monospace">    _seqParam.picture_height_in_mbs = _frameHeightMBAligned / 16;</font></div><div><font face="monospace, monospace">//    _seqParam.bits_per_second = _frameBitRate * 1024 * 8;</font></div><div><font face="monospace, monospace">    _seqParam.bits_per_second = _frameBitRate / 8;</font></div><div><font face="monospace, monospace">    _seqParam.intra_period = _intraPeriod;</font></div><div><font face="monospace, monospace">    _seqParam.intra_idr_period = _intraPeriod * 64;</font></div><div><font face="monospace, monospace">    _seqParam.ip_period = 1;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _seqParam.max_num_ref_frames = NUM_REFERENCE_FRAMES;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.frame_mbs_only_flag = 1;</font></div><div><font face="monospace, monospace">    _seqParam.time_scale = 900;</font></div><div><font face="monospace, monospace">    _seqParam.num_units_in_tick = _timeBaseDen;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.log2_max_pic_order_cnt_lsb_minus4 = LOG_2_MAX_PIC_ORDER_CNT_LSB - 4;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.log2_max_frame_num_minus4 = LOG_2_MAX_FRAME_NUM - 4;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.frame_mbs_only_flag = 1;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.chroma_format_idc = 1;</font></div><div><font face="monospace, monospace">    _seqParam.seq_fields.bits.direct_8x8_inference_flag = 1;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _frameWidth != _frameWidthMBAligned || _frameHeight != _frameHeightMBAligned )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _seqParam.frame_cropping_flag = 1;</font></div><div><font face="monospace, monospace">        _seqParam.frame_crop_left_offset = 0;</font></div><div><font face="monospace, monospace">        _seqParam.frame_crop_right_offset = (_frameWidthMBAligned - _frameWidth) / 2;</font></div><div><font face="monospace, monospace">        _seqParam.frame_crop_top_offset = 0;</font></div><div><font face="monospace, monospace">        _seqParam.frame_crop_bottom_offset = (_frameHeightMBAligned - _frameHeight) / 2;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                             _contextID,</font></div><div><font face="monospace, monospace">                             VAEncSequenceParameterBufferType,</font></div><div><font face="monospace, monospace">                             sizeof(_seqParam),</font></div><div><font face="monospace, monospace">                             1,</font></div><div><font face="monospace, monospace">                             &_seqParam,</font></div><div><font face="monospace, monospace">                             &seq_param_buf );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    // Rate control...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                             _contextID,</font></div><div><font face="monospace, monospace">                             VAEncMiscParameterBufferType,</font></div><div><font face="monospace, monospace">                             sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),</font></div><div><font face="monospace, monospace">                             1,</font></div><div><font face="monospace, monospace">                             NULL,</font></div><div><font face="monospace, monospace">                             &rc_param_buf );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaMapBuffer( _display, rc_param_buf,(void **)&misc_param);</font></div><div><font face="monospace, monospace">    if( !misc_param )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaMapBuffer." ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    misc_param->type = VAEncMiscParameterTypeRateControl;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl = (VAEncMiscParameterRateControl *)misc_param->data;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    memset( misc_rate_ctrl, 0, sizeof(*misc_rate_ctrl) );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">//    misc_rate_ctrl->bits_per_second = _frameBitRate * 1024 * 8;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->bits_per_second = _frameBitRate / 8;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->target_percentage = 66;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->window_size = 1000;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->initial_qp = 26;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->min_qp = 1;</font></div><div><font face="monospace, monospace">    misc_rate_ctrl->basic_unit_size = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaUnmapBuffer( _display, rc_param_buf );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    // Push buffers to hardware...</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    render_id[0] = seq_param_buf;</font></div><div><font face="monospace, monospace">    render_id[1] = rc_param_buf;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    // According to documentation, vaRenderPicture recycles the buffers given to it</font></div><div><font face="monospace, monospace">    // so we apparently do not owe vaDestroyBuffers() for the above buffers.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaRenderPicture( _display, _contextID, &render_id[0], 2 );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaRenderPicture (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">int32_t VAH264Encoder::_CalcPOC( int32_t picOrderCntLSB )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    static int picOrderCntMsbRef = 0, picOrderCntLsbRef = 0;</font></div><div><font face="monospace, monospace">    int prevPicOrderCntMsb = 0, prevPicOrderCntLsb = 0;</font></div><div><font face="monospace, monospace">    int picOrderCntMsb = 0, topFieldOrderCnt = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameType == FRAME_IDR )</font></div><div><font face="monospace, monospace">        prevPicOrderCntMsb = prevPicOrderCntLsb = 0;</font></div><div><font face="monospace, monospace">    else {</font></div><div><font face="monospace, monospace">        prevPicOrderCntMsb = picOrderCntMsbRef;</font></div><div><font face="monospace, monospace">        prevPicOrderCntLsb = picOrderCntLsbRef;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( (picOrderCntLSB < prevPicOrderCntLsb) &&</font></div><div><font face="monospace, monospace">        ((prevPicOrderCntLsb - picOrderCntLSB) >= (int)(MAX_PIC_ORDER_CNT_LSB / 2)))</font></div><div><font face="monospace, monospace">        picOrderCntMsb = prevPicOrderCntMsb + MAX_PIC_ORDER_CNT_LSB;</font></div><div><font face="monospace, monospace">    else if( (picOrderCntLSB > prevPicOrderCntLsb) &&</font></div><div><font face="monospace, monospace">             ((picOrderCntLSB - prevPicOrderCntLsb) > (int)(MAX_PIC_ORDER_CNT_LSB / 2)))</font></div><div><font face="monospace, monospace">        picOrderCntMsb = prevPicOrderCntMsb - MAX_PIC_ORDER_CNT_LSB;</font></div><div><font face="monospace, monospace">    else</font></div><div><font face="monospace, monospace">        picOrderCntMsb = prevPicOrderCntMsb;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    topFieldOrderCnt = picOrderCntMsb + picOrderCntLSB;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    picOrderCntMsbRef = picOrderCntMsb;</font></div><div><font face="monospace, monospace">    picOrderCntLsbRef = picOrderCntLSB;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    return topFieldOrderCnt;</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_RenderPicture( bool done )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    VABufferID pic_param_buf;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _picParam.CurrPic.picture_id = _refSurfaceIDs[(_currentFrameNum % SURFACE_NUM)];</font></div><div><font face="monospace, monospace">    _picParam.CurrPic.frame_idx = _currentFrameNum;</font></div><div><font face="monospace, monospace">    _picParam.CurrPic.flags = 0;</font></div><div><font face="monospace, monospace">    _picParam.CurrPic.TopFieldOrderCnt =</font></div><div><font face="monospace, monospace">        _CalcPOC((_currentFrameNum - _currentIDRDisplay) % MAX_PIC_ORDER_CNT_LSB);</font></div><div><font face="monospace, monospace">    _picParam.CurrPic.BottomFieldOrderCnt = _picParam.CurrPic.TopFieldOrderCnt;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _currentCurrPic = _picParam.CurrPic;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    memcpy( _picParam.ReferenceFrames,</font></div><div><font face="monospace, monospace">            _referenceFrames,</font></div><div><font face="monospace, monospace">            _numShortTerm*sizeof(VAPictureH264) );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    for (int i = _numShortTerm; i < SURFACE_NUM; i++)</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        _picParam.ReferenceFrames[i].picture_id = VA_INVALID_SURFACE;</font></div><div><font face="monospace, monospace">        _picParam.ReferenceFrames[i].flags = VA_PICTURE_H264_INVALID;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _picParam.pic_fields.bits.idr_pic_flag = (_currentFrameType == FRAME_IDR);</font></div><div><font face="monospace, monospace">    _picParam.pic_fields.bits.reference_pic_flag = 1;</font></div><div><font face="monospace, monospace">    _picParam.pic_fields.bits.entropy_coding_mode_flag = _h264EntropyMode;</font></div><div><font face="monospace, monospace">    _picParam.pic_fields.bits.deblocking_filter_control_present_flag = 1;</font></div><div><font face="monospace, monospace">    _picParam.frame_num = _currentFrameNum;</font></div><div><font face="monospace, monospace">    _picParam.coded_buf = _codedBufID;</font></div><div><font face="monospace, monospace">    _picParam.last_picture = (done)?1:0;</font></div><div><font face="monospace, monospace">    _picParam.pic_init_qp = 26;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAStatus status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                      _contextID,</font></div><div><font face="monospace, monospace">                                      VAEncPictureParameterBufferType,</font></div><div><font face="monospace, monospace">                                      sizeof(_picParam),</font></div><div><font face="monospace, monospace">                                      1,</font></div><div><font face="monospace, monospace">                                      &_picParam,</font></div><div><font face="monospace, monospace">                                      &pic_param_buf );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaRenderPicture( _display,</font></div><div><font face="monospace, monospace">                              _contextID,</font></div><div><font face="monospace, monospace">                              &pic_param_buf,</font></div><div><font face="monospace, monospace">                              1 );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaRenderPicture (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_RenderPackedPPS()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    BitStream ppsBS;</font></div><div><font face="monospace, monospace">    BuildPackedPicBuffer( ppsBS, _picParam );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAEncPackedHeaderParameterBuffer packedheader_param_buffer;</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.type = VAEncPackedHeaderPicture;</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.bit_length = ppsBS.SizeInBits();</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.has_emulation_bytes = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID packedpic_para_bufid;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAStatus va_status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                         _contextID,</font></div><div><font face="monospace, monospace">                                         VAEncPackedHeaderParameterBufferType,</font></div><div><font face="monospace, monospace">                                         sizeof(packedheader_param_buffer),</font></div><div><font face="monospace, monospace">                                         1,</font></div><div><font face="monospace, monospace">                                         &packedheader_param_buffer,</font></div><div><font face="monospace, monospace">                                         &packedpic_para_bufid );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID packedpic_data_bufid;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    va_status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                _contextID,</font></div><div><font face="monospace, monospace">                                VAEncPackedHeaderDataBufferType,</font></div><div><font face="monospace, monospace">                                (ppsBS.SizeInBits() + 7) / 8,</font></div><div><font face="monospace, monospace">                                1,</font></div><div><font face="monospace, monospace">                                ppsBS.Map(),</font></div><div><font face="monospace, monospace">                                &packedpic_data_bufid );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID render_id[2];</font></div><div><font face="monospace, monospace">    render_id[0] = packedpic_para_bufid;</font></div><div><font face="monospace, monospace">    render_id[1] = packedpic_data_bufid;</font></div><div><font face="monospace, monospace">    va_status = vaRenderPicture( _display, _contextID, render_id, 2 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaRenderPicture (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_RenderPackedSPS()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    BitStream seqBS;</font></div><div><font face="monospace, monospace">    BuildPackedSeqBuffer( seqBS,</font></div><div><font face="monospace, monospace">                          _seqParam,</font></div><div><font face="monospace, monospace">                          _h264Profile,</font></div><div><font face="monospace, monospace">                          _constraintSetFlag,</font></div><div><font face="monospace, monospace">                          _timeBaseNum,</font></div><div><font face="monospace, monospace">                          _timeBaseDen,</font></div><div><font face="monospace, monospace">                          _frameBitRate / 8 );</font></div><div><font face="monospace, monospace">//                          _frameBitRate * 1024 * 8 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAEncPackedHeaderParameterBuffer packedheader_param_buffer;</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.type = VAEncPackedHeaderSequence;</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.bit_length = seqBS.SizeInBits();</font></div><div><font face="monospace, monospace">    packedheader_param_buffer.has_emulation_bytes = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID packedseq_para_bufid;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAStatus va_status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                         _contextID,</font></div><div><font face="monospace, monospace">                                         VAEncPackedHeaderParameterBufferType,</font></div><div><font face="monospace, monospace">                                         sizeof(packedheader_param_buffer),</font></div><div><font face="monospace, monospace">                                         1,</font></div><div><font face="monospace, monospace">                                         &packedheader_param_buffer,</font></div><div><font face="monospace, monospace">                                         &packedseq_para_bufid );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID packedseq_data_bufid;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    va_status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                _contextID,</font></div><div><font face="monospace, monospace">                                VAEncPackedHeaderDataBufferType,</font></div><div><font face="monospace, monospace">                                (seqBS.SizeInBits() + 7) / 8,</font></div><div><font face="monospace, monospace">                                1,</font></div><div><font face="monospace, monospace">                                seqBS.Map(),</font></div><div><font face="monospace, monospace">                                &packedseq_data_bufid);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VABufferID render_id[2];</font></div><div><font face="monospace, monospace">    render_id[0] = packedseq_para_bufid;</font></div><div><font face="monospace, monospace">    render_id[1] = packedseq_data_bufid;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    va_status = vaRenderPicture( _display, _contextID, render_id, 2 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( va_status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaRenderPicture (%s).", vaErrorStr(va_status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_RenderSlice()</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    VABufferID slice_param_buf;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _UpdateRefPicList();</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    /* one frame, one slice */</font></div><div><font face="monospace, monospace">    _sliceParam.macroblock_address = 0;</font></div><div><font face="monospace, monospace">    _sliceParam.num_macroblocks = _frameWidthMBAligned * _frameHeightMBAligned/(16*16); /*Measured by MB*/</font></div><div><font face="monospace, monospace">    _sliceParam.slice_type = (_currentFrameType == FRAME_IDR)?2:_currentFrameType;</font></div><div><font face="monospace, monospace">    _sliceParam.slice_qp_delta = 0;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    if( _currentFrameType == FRAME_IDR )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        if( _currentFrameNum != 0 )</font></div><div><font face="monospace, monospace">            ++_sliceParam.idr_pic_id;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    else if( _currentFrameType == FRAME_P )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        int refpiclist0_max = H264_MAXREF & 0xffff;</font></div><div><font face="monospace, monospace">        memcpy( _sliceParam.RefPicList0,</font></div><div><font face="monospace, monospace">                _refPicListP,</font></div><div><font face="monospace, monospace">                refpiclist0_max*sizeof(VAPictureH264) );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        for (int i = refpiclist0_max; i < 32; i++)</font></div><div><font face="monospace, monospace">        {</font></div><div><font face="monospace, monospace">            _sliceParam.RefPicList0[i].picture_id = VA_INVALID_SURFACE;</font></div><div><font face="monospace, monospace">            _sliceParam.RefPicList0[i].flags = VA_PICTURE_H264_INVALID;</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    _sliceParam.slice_alpha_c0_offset_div2 = 0;</font></div><div><font face="monospace, monospace">    _sliceParam.slice_beta_offset_div2 = 0;</font></div><div><font face="monospace, monospace">    _sliceParam.direct_spatial_mv_pred_flag = 1;</font></div><div><font face="monospace, monospace">    _sliceParam.pic_order_cnt_lsb = (_currentFrameNum - _currentIDRDisplay) % MAX_PIC_ORDER_CNT_LSB;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    VAStatus status = vaCreateBuffer( _display,</font></div><div><font face="monospace, monospace">                                      _contextID,</font></div><div><font face="monospace, monospace">                                      VAEncSliceParameterBufferType,</font></div><div><font face="monospace, monospace">                                      sizeof(_sliceParam),</font></div><div><font face="monospace, monospace">                                      1,</font></div><div><font face="monospace, monospace">                                      &_sliceParam,</font></div><div><font face="monospace, monospace">                                      &slice_param_buf );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    status = vaRenderPicture( _display,</font></div><div><font face="monospace, monospace">                              _contextID,</font></div><div><font face="monospace, monospace">                              &slice_param_buf,</font></div><div><font face="monospace, monospace">                              1 );</font></div><div><font face="monospace, monospace">    if( status != VA_STATUS_SUCCESS )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaCreateBuffer (%s).", vaErrorStr(status) ));</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">void VAH264Encoder::_UploadImage( uint8_t* yv12, VAImage& image, uint16_t width, uint16_t height )</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace">    assert( image.num_planes == 2 );</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    unsigned char* p = NULL;</font></div><div><font face="monospace, monospace">    vaMapBuffer( _display, image.buf, (void **)&p );</font></div><div><font face="monospace, monospace">    if( !p )</font></div><div><font face="monospace, monospace">        X_THROW(( "Unable to vaMapBuffer." ));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    uint8_t* sy = yv12;</font></div><div><font face="monospace, monospace">    uint8_t* su = sy + (width * height);</font></div><div><font face="monospace, monospace">    uint8_t* sv = su + ((width/2)*(height/2));</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    uint8_t* dy = p + image.offsets[0];</font></div><div><font face="monospace, monospace">    uint8_t* duv = p + image.offsets[1];</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    for( size_t i = 0; i < height; i++ )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        memcpy( dy, sy, width );</font></div><div><font face="monospace, monospace">        dy += image.pitches[0];</font></div><div><font face="monospace, monospace">        sy += width;</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    for( size_t i = 0; i < (height/2); i++ )</font></div><div><font face="monospace, monospace">    {</font></div><div><font face="monospace, monospace">        uint8_t* dst = duv;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        for( size_t ii = 0; ii < (width/2); ii++ )</font></div><div><font face="monospace, monospace">        {</font></div><div><font face="monospace, monospace">            *dst = *su;</font></div><div><font face="monospace, monospace">            dst++;</font></div><div><font face="monospace, monospace">            su++;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">            *dst = *sv;</font></div><div><font face="monospace, monospace">            dst++;</font></div><div><font face="monospace, monospace">            sv++;</font></div><div><font face="monospace, monospace">        }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">        duv += image.pitches[1];</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">    vaUnmapBuffer( _display, image.buf );</font></div><div><font face="monospace, monospace">}</font></div></div><div><br></div></div>