a899f05f2d
Instead just duplicate the common fields. These fields had to be duplicated for the C interface compatibility anyway - but this way there is no risk to accidentally introduce an ABI break since there is no need for the layout of SEncParamBase to actually match the start of SEncParamExt.
128 lines
3.9 KiB
C++
128 lines
3.9 KiB
C++
#include <gtest/gtest.h>
|
|
#include "codec_api.h"
|
|
#include <stddef.h>
|
|
|
|
static void CheckFunctionOrder(int expect, int actual, const char* name) {
|
|
EXPECT_EQ(expect, actual) << "Wrong function order: " << name;
|
|
}
|
|
|
|
typedef void(*CheckFunc)(int, int, const char*);
|
|
extern "C" void CheckEncoderInterface(ISVCEncoder* p, CheckFunc);
|
|
extern "C" void CheckDecoderInterface(ISVCDecoder* p, CheckFunc);
|
|
extern "C" size_t GetBoolSize(void);
|
|
extern "C" size_t GetBoolOffset(void);
|
|
extern "C" size_t GetBoolStructSize(void);
|
|
|
|
// Store the 'this' pointer to verify 'this' is received as expected from C code.
|
|
static void* gThis;
|
|
|
|
/**
|
|
* Return a unique number for each virtual function so that we are able to
|
|
* check if the order of functions in the virtual table is as expected.
|
|
*/
|
|
struct SVCEncoderImpl : public ISVCEncoder {
|
|
virtual ~SVCEncoderImpl() {}
|
|
virtual int EXTAPI Initialize(const void* pParam,
|
|
const INIT_TYPE kiInitType) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 1;
|
|
}
|
|
virtual int EXTAPI Uninitialize() {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 3;
|
|
}
|
|
virtual int EXTAPI EncodeFrame(const unsigned char* kpSrc,
|
|
SFrameBSInfo* pBsInfo) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 4;
|
|
}
|
|
virtual int EXTAPI EncodeFrame2(const SSourcePicture** kppSrcPicList,
|
|
int nSrcPicNum, SFrameBSInfo* pBsInfo) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 5;
|
|
}
|
|
virtual int EXTAPI EncodeParameterSets(SFrameBSInfo* pBsInfo) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 6;
|
|
}
|
|
virtual int EXTAPI PauseFrame(const unsigned char* kpSrc,
|
|
SFrameBSInfo* pBsInfo) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 7;
|
|
}
|
|
virtual int EXTAPI ForceIntraFrame(bool bIDR) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 8;
|
|
}
|
|
virtual int EXTAPI SetOption(ENCODER_OPTION eOptionId, void* pOption) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 9;
|
|
}
|
|
virtual int EXTAPI GetOption(ENCODER_OPTION eOptionId, void* pOption) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 10;
|
|
}
|
|
};
|
|
|
|
struct SVCDecoderImpl : public ISVCDecoder {
|
|
virtual ~SVCDecoderImpl() {}
|
|
virtual long EXTAPI Initialize(const SDecodingParam* pParam) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 1;
|
|
}
|
|
virtual long EXTAPI Uninitialize() {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 2;
|
|
}
|
|
virtual DECODING_STATE EXTAPI DecodeFrame(const unsigned char* pSrc,
|
|
const int iSrcLen, unsigned char** ppDst, int* pStride,
|
|
int& iWidth, int& iHeight) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return static_cast<DECODING_STATE>(3);
|
|
}
|
|
virtual DECODING_STATE EXTAPI DecodeFrame2(const unsigned char* pSrc,
|
|
const int iSrcLen, void** ppDst, SBufferInfo* pDstInfo) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return static_cast<DECODING_STATE>(4);
|
|
}
|
|
virtual DECODING_STATE EXTAPI DecodeFrameEx(const unsigned char* pSrc,
|
|
const int iSrcLen, unsigned char* pDst, int iDstStride,
|
|
int& iDstLen, int& iWidth, int& iHeight, int& iColorFormat) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return static_cast<DECODING_STATE>(5);
|
|
}
|
|
virtual long EXTAPI SetOption (DECODER_OPTION eOptionId, void* pOption) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 6;
|
|
}
|
|
virtual long EXTAPI GetOption (DECODER_OPTION eOptionId, void* pOption) {
|
|
EXPECT_TRUE(gThis == this);
|
|
return 7;
|
|
}
|
|
};
|
|
|
|
TEST(ISVCEncoderTest, CheckFunctionOrder) {
|
|
SVCEncoderImpl* p = new SVCEncoderImpl;
|
|
gThis = p;
|
|
CheckEncoderInterface(p, CheckFunctionOrder);
|
|
delete p;
|
|
}
|
|
|
|
TEST(ISVCDecoderTest, CheckFunctionOrder) {
|
|
SVCDecoderImpl* p = new SVCDecoderImpl;
|
|
gThis = p;
|
|
CheckDecoderInterface(p, CheckFunctionOrder);
|
|
delete p;
|
|
}
|
|
|
|
struct bool_test_struct {
|
|
char c;
|
|
bool b;
|
|
};
|
|
|
|
TEST(ISVCDecoderEncoderTest, CheckCAbi) {
|
|
EXPECT_EQ(sizeof(bool), GetBoolSize()) << "Wrong size of bool type";
|
|
EXPECT_EQ(offsetof(bool_test_struct, b), GetBoolOffset()) << "Wrong alignment of bool in a struct";
|
|
EXPECT_EQ(sizeof(bool_test_struct), GetBoolStructSize()) << "Wrong size of struct with a bool";
|
|
}
|