49f4dad1b7
This avoids the struct type casting and having to pass a parameter that says which kind of struct it actually is.
131 lines
4.0 KiB
C++
131 lines
4.0 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 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;
|
|
}
|
|
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";
|
|
}
|