openh264/test/cpp_interface_test.cpp
Martin Storsjö 49f4dad1b7 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.
2014-02-18 22:51:54 +02:00

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";
}