
文件:VideoEncoderX2.h
class CVideoEncoderX2 :
{
public:
CVideoEncoderX2(void);
~CVideoEncoderX2(void);
virtual bool Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item);
virtual void Release(void);
virtual void Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame);
private:
x2_picture_t m_Pic;
x2_t *h;
x2_param_t param;
void Flush(void);
};
文件:VideoEncoderX2.cpp
bool CVideoEncoderX2::Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item)
{
CBase::Connect(pNotify, Item);
ParseSize(Item.m_stSize);
x2_param_default( ¶m );
param.i_threads = 1;
param.i_frame_total = 0;
param.i_width = m_nWidth;
param.i_height = m_nHeight;
param.i_keyint_min = Item.m_nKeyInterval;
param.i_keyint_max = Item.m_nKeyInterval * 10;
param.i_fps_num = Item.m_nFps;*/
param.i_log_level = X2_LOG_NONE;
if( ( h = x2_encoder_open( ¶m ) ) == NULL )
{
return false;
}
/* Create a new pic */
x2_picture_alloc( &m_Pic, X2_CSP_I420, param.i_width, param.i_height );
return true;
}
void CVideoEncoderX2::Release(void)
{
Flush();
x2_picture_clean( &m_Pic );
x2_encoder_close( h );
CBase::Release();
}
void CVideoEncoderX2::Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame)
{
if(nLen != param.i_width * param.i_height * 3)
return;
param.i_frame_total ++;
memcpy(m_Pic.img.plane[0], pInData, param.i_width * param.i_height);
memcpy(m_Pic.img.plane[1], pInData + param.i_width * param.i_height, param.i_width * param.i_height / 4);
memcpy(m_Pic.img.plane[2], pInData + param.i_width * param.i_height * 5 / 4, param.i_width * param.i_height / 4);
m_Pic.i_pts = (int_t)param.i_frame_total * param.i_fps_den;
static x2_picture_t pic_out;
x2_nal_t *nal = NULL;
int i_nal, i;
if( &m_Pic )
{
m_Pic.i_type = X2_TYPE_AUTO;
m_Pic.i_qpplus1 = 0;
}
//TraceTime("x2_encoder_encode begin");
if( x2_encoder_encode( h, &nal, &i_nal, &m_Pic, &pic_out ) < 0 ) {
return;
}
//TraceTime("x2_encoder_encode end");
int nOutCanUse = nOutLen;
nOutLen = 0;
for( i = 0; i < i_nal; i++ )
{
int i_size = 0;
if( ( i_size = x2_nal_encode( pOutBuf + nOutLen, &nOutCanUse, 1, &nal[i] ) ) > 0 )
{
nOutLen += i_size;
nOutCanUse -= i_size;
}
}
nKeyFrame = pic_out.i_type==X2_TYPE_IDR;// || (pic_out.i_type==X2_TYPE_I && coCfg->x2_max_ref_frames==1);
}
void CVideoEncoderX2::Flush(void)
{
x2_picture_t pic_out;
x2_nal_t *nal;
int i_nal, i;
int i_file = 0;
if( x2_encoder_encode( h, &nal, &i_nal, NULL, &pic_out ) < 0 ){
}
}
