91 lines
2.1 KiB
C++
91 lines
2.1 KiB
C++
#include "XvidEnc.h"
|
|
#include <Windows.h>
|
|
|
|
#ifdef _DEBUG
|
|
#pragma comment(lib, "libxvidcored.lib")
|
|
#else
|
|
#pragma comment(lib, "libxvidcore.lib")
|
|
#endif // _DEBUG
|
|
|
|
CXvidEnc::CXvidEnc(int version, unsigned int cpu_flags, int debug)
|
|
{
|
|
m_version = version;
|
|
m_bOpened = false;
|
|
/* XviD core initialization */
|
|
m_xvid_gbl_init.version = version;
|
|
m_xvid_gbl_init.cpu_flags = cpu_flags;
|
|
m_xvid_gbl_init.debug = debug;
|
|
if (xvid_global(NULL, XVID_GBL_INIT, &m_xvid_gbl_init, NULL) < 0)
|
|
m_bInited = false;
|
|
else
|
|
m_bInited = true;
|
|
}
|
|
|
|
CXvidEnc::~CXvidEnc()
|
|
{
|
|
|
|
}
|
|
|
|
bool CXvidEnc::Open(int width, int height, int fps, int cbit)
|
|
{
|
|
if (!m_bInited) return false;
|
|
if (m_bOpened) return false;
|
|
|
|
int csp;
|
|
switch (cbit)
|
|
{
|
|
case 16:
|
|
csp = XVID_CSP_RGB555 | XVID_CSP_VFLIP;
|
|
break;
|
|
case 24:
|
|
csp = XVID_CSP_BGR | XVID_CSP_VFLIP;
|
|
break;
|
|
case 32:
|
|
csp = XVID_CSP_BGRA | XVID_CSP_VFLIP;
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
/* XviD encoder initialization */
|
|
memset(&m_xvid_enc_create, 0, sizeof(m_xvid_enc_create));
|
|
m_xvid_enc_create.version = m_version;
|
|
m_xvid_enc_create.profile = XVID_PROFILE_S_L0;
|
|
m_xvid_enc_create.width = width;
|
|
m_xvid_enc_create.height = height;
|
|
m_xvid_enc_create.fincr = 1;
|
|
m_xvid_enc_create.fbase = fps; // ÉèÖÃFPSÖµ(Ö¡ÂÊ), ±ØÐëÉèÖÃ
|
|
if (xvid_encore(NULL, XVID_ENC_CREATE, &m_xvid_enc_create, NULL) < 0)
|
|
return false;
|
|
|
|
/* XviD frame initialization */
|
|
memset(&m_xvid_enc_frame, 0, sizeof(m_xvid_enc_frame));
|
|
m_xvid_enc_frame.version = m_version;
|
|
m_xvid_enc_frame.input.csp = csp;
|
|
m_xvid_enc_frame.input.stride[0] = (m_xvid_enc_create.width * cbit / 8 + 3) / 4 * 4;
|
|
|
|
m_bOpened = true;
|
|
return true;
|
|
}
|
|
|
|
int CXvidEnc::Encode(void *input, void *output, int outlen)
|
|
{
|
|
if (!m_bOpened) return -1;
|
|
|
|
m_xvid_enc_frame.input.plane[0] = input;
|
|
m_xvid_enc_frame.bitstream = output;
|
|
m_xvid_enc_frame.length = outlen;
|
|
|
|
return xvid_encore(m_xvid_enc_create.handle, XVID_ENC_ENCODE, &m_xvid_enc_frame, NULL);
|
|
}
|
|
|
|
bool CXvidEnc::Close()
|
|
{
|
|
if (m_bOpened && xvid_encore(m_xvid_enc_create.handle, XVID_ENC_DESTROY, NULL, NULL) >= 0)
|
|
{
|
|
m_bOpened = false;
|
|
return true;
|
|
}
|
|
else return false;
|
|
}
|