Split the encoder Initialize method into two

This avoids the struct type casting and having to pass a parameter
that says which kind of struct it actually is.
This commit is contained in:
Martin Storsjö 2014-02-18 12:29:43 +02:00
parent 622694935b
commit 49f4dad1b7
7 changed files with 42 additions and 29 deletions

View File

@ -56,7 +56,8 @@ class ISVCEncoder {
/*
* return: CM_RETURN: 0 - success; otherwise - failed;
*/
virtual int EXTAPI Initialize (const void* pParam, const INIT_TYPE kiInitType = INIT_TYPE_PARAMETER_BASED) = 0;
virtual int EXTAPI Initialize (const SEncParamBase* pParam) = 0;
virtual int EXTAPI InitializeExt (const SEncParamExt* pParam) = 0;
virtual int EXTAPI Uninitialize() = 0;
@ -140,7 +141,8 @@ typedef struct ISVCEncoderVtbl ISVCEncoderVtbl;
typedef const ISVCEncoderVtbl* ISVCEncoder;
struct ISVCEncoderVtbl {
int (*Initialize) (ISVCEncoder*, const void* pParam, const INIT_TYPE kiInitType);
int (*Initialize) (ISVCEncoder*, const SEncParamBase* pParam);
int (*InitializeExt) (ISVCEncoder*, const SEncParamExt* pParam);
int (*Uninitialize) (ISVCEncoder*);

View File

@ -763,7 +763,7 @@ int ProcessEncodingSvcWithParam (ISVCEncoder* pPtrEnc, int argc, char** argv) {
goto ERROR_RET;
}
if (cmResultSuccess != pPtrEnc->Initialize (&sSvcParam, INIT_TYPE_PARAMETER_EXT)) {
if (cmResultSuccess != pPtrEnc->InitializeExt (&sSvcParam)) {
fprintf (stderr, "Encoder Initialization failed!\n");
ret = 1;
goto ERROR_RET;
@ -932,7 +932,7 @@ int ProcessEncodingSvcWithConfig (ISVCEncoder* pPtrEnc, int argc, char** argv) {
sSvcParam.iPicHeight = sSvcParam.sSpatialLayers[sSvcParam.iSpatialLayerNum - 1].iVideoHeight;
if (cmResultSuccess != pPtrEnc->Initialize (&sSvcParam, INIT_TYPE_PARAMETER_EXT)) { // SVC encoder initialization
if (cmResultSuccess != pPtrEnc->InitializeExt (&sSvcParam)) { // SVC encoder initialization
fprintf (stderr, "SVC encoder Initialize failed\n");
iRet = 1;
goto INSIDE_MEM_FREE;

View File

@ -66,7 +66,8 @@ class CWelsH264SVCEncoder : public ISVCEncoder {
/*
* return: CM_RETURN: 0 - success; otherwise - failed;
*/
virtual int EXTAPI Initialize (const void* argv, const INIT_TYPE init_type);
virtual int EXTAPI Initialize (const SEncParamBase* argv);
virtual int EXTAPI InitializeExt (const SEncParamExt* argv);
virtual int EXTAPI Uninitialize();

View File

@ -200,33 +200,39 @@ void CWelsH264SVCEncoder::InitEncoder (void) {
/*
* SVC Encoder Initialization
*/
int CWelsH264SVCEncoder::Initialize (const void* argv, const INIT_TYPE iInitType) {
int CWelsH264SVCEncoder::Initialize (const SEncParamBase* argv) {
if ((INIT_TYPE_PARAMETER_BASED != iInitType && INIT_TYPE_PARAMETER_EXT != iInitType)|| NULL == argv) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), invalid iInitType= %d, argv= 0x%p\n",
iInitType, (void*)argv);
if (NULL == argv) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), invalid argv= 0x%p\n",
argv);
return cmInitParaError;
}
SWelsSvcCodingParam sConfig (true);
if(iInitType == INIT_TYPE_PARAMETER_BASED)
{
// Convert SEncParamBase into WelsSVCParamConfig here..
if (sConfig.ParamBaseTranscode (*(const SEncParamBase*)argv, true)) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
Uninitialize();
return cmInitParaError;
}
// Convert SEncParamBase into WelsSVCParamConfig here..
if (sConfig.ParamBaseTranscode (*argv, true)) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
Uninitialize();
return cmInitParaError;
}
else if(iInitType == INIT_TYPE_PARAMETER_EXT)
{
// Convert SEncParamExt into WelsSVCParamConfig here..
if (sConfig.ParamTranscode (*(const SEncParamExt*)argv)) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
Uninitialize();
return cmInitParaError;
}
return Initialize2 (&sConfig);
}
int CWelsH264SVCEncoder::InitializeExt (const SEncParamExt* argv) {
if (NULL == argv) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), invalid argv= 0x%p\n",
argv);
return cmInitParaError;
}
SWelsSvcCodingParam sConfig (true);
// Convert SEncParamExt into WelsSVCParamConfig here..
if (sConfig.ParamTranscode (*argv)) {
WelsLog (m_pEncContext, WELS_LOG_ERROR, "CWelsH264SVCEncoder::Initialize(), parameter_translation failed.\n");
Uninitialize();
return cmInitParaError;
}
return Initialize2 (&sConfig);

View File

@ -15,7 +15,7 @@ static int InitWithParam(ISVCEncoder* encoder, int width,
param.iPicHeight = height;
param.iTargetBitrate = 5000000;
param.iInputCsp = videoFormatI420;
return encoder->Initialize(&param, INIT_TYPE_PARAMETER_BASED);
return encoder->Initialize(&param);
}
BaseEncoderTest::BaseEncoderTest() : encoder_(NULL) {}

View File

@ -11,6 +11,7 @@ typedef void(*CheckFunc)(int, int, const char*);
void CheckEncoderInterface(ISVCEncoder* p, CheckFunc check) {
CHECK(1, p, Initialize);
CHECK(2, p, InitializeExt);
CHECK(3, p, Uninitialize);
CHECK(4, p, EncodeFrame);
CHECK(5, p, EncodeFrame2);

View File

@ -22,11 +22,14 @@ static void* gThis;
*/
struct SVCEncoderImpl : public ISVCEncoder {
virtual ~SVCEncoderImpl() {}
virtual int EXTAPI Initialize(const void* pParam,
const INIT_TYPE kiInitType) {
virtual int EXTAPI Initialize(const SEncParamBase* pParam) {
EXPECT_TRUE(gThis == this);
return 1;
}
virtual int EXTAPI InitializeExt(const SEncParamExt* pParam) {
EXPECT_TRUE(gThis == this);
return 2;
}
virtual int EXTAPI Uninitialize() {
EXPECT_TRUE(gThis == this);
return 3;