Showing the changes to test/api/cpp_interface_test.cpp (1 of 23 files). Show all
Unified · Split
| @@ -0,0 +1,129 @@ | |||
| 1 | #include <gtest/gtest.h> | ||
| 2 | #include "codec_api.h" | ||
| 3 | #include <stddef.h> | ||
| 4 | |||
| 5 | static void CheckFunctionOrder(int expect, int actual, const char* name) { | ||
| 6 | EXPECT_EQ(expect, actual) << "Wrong function order: " << name; | ||
| 7 | } | ||
| 8 | |||
| 9 | typedef void(*CheckFunc)(int, int, const char*); | ||
| 10 | extern "C" void CheckEncoderInterface(ISVCEncoder* p, CheckFunc); | ||
| 11 | extern "C" void CheckDecoderInterface(ISVCDecoder* p, CheckFunc); | ||
| 12 | extern "C" size_t GetBoolSize(void); | ||
| 13 | extern "C" size_t GetBoolOffset(void); | ||
| 14 | extern "C" size_t GetBoolStructSize(void); | ||
| 15 | |||
| 16 | // Store the 'this' pointer to verify 'this' is received as expected from C code. | ||
| 17 | static void* gThis; | ||
| 18 | |||
| 19 | /** | ||
| 20 | * Return a unique number for each virtual function so that we are able to | ||
| 21 | * check if the order of functions in the virtual table is as expected. | ||
| 22 | */ | ||
| 23 | struct SVCEncoderImpl : public ISVCEncoder { | ||
| 24 | virtual ~SVCEncoderImpl() {} | ||
| 25 | virtual int EXTAPI Initialize(const SEncParamBase* pParam) { | ||
| 26 | EXPECT_TRUE(gThis == this); | ||
| 27 | return 1; | ||
| 28 | } | ||
| 29 | virtual int EXTAPI InitializeExt(const SEncParamExt* pParam) { | ||
| 30 | EXPECT_TRUE(gThis == this); | ||
| 31 | return 2; | ||
| 32 | } | ||
| 33 | virtual int EXTAPI GetDefaultParams(SEncParamExt* pParam) { | ||
| 34 | EXPECT_TRUE(gThis == this); | ||
| 35 | return 3; | ||
| 36 | } | ||
| 37 | virtual int EXTAPI Uninitialize() { | ||
| 38 | EXPECT_TRUE(gThis == this); | ||
| 39 | return 4; | ||
| 40 | } | ||
| 41 | virtual int EXTAPI EncodeFrame(const SSourcePicture* kpSrcPic, | ||
| 42 | SFrameBSInfo* pBsInfo) { | ||
| 43 | EXPECT_TRUE(gThis == this); | ||
| 44 | return 5; | ||
| 45 | } | ||
| 46 | virtual int EXTAPI EncodeParameterSets(SFrameBSInfo* pBsInfo) { | ||
| 47 | EXPECT_TRUE(gThis == this); | ||
| 48 | return 6; | ||
| 49 | } | ||
| 50 | virtual int EXTAPI PauseFrame(const SSourcePicture* kpSrcPic, | ||
| 51 | SFrameBSInfo* pBsInfo) { | ||
| 52 | EXPECT_TRUE(gThis == this); | ||
| 53 | return 7; | ||
| 54 | } | ||
| 55 | virtual int EXTAPI ForceIntraFrame(bool bIDR) { | ||
| 56 | EXPECT_TRUE(gThis == this); | ||
| 57 | return 8; | ||
| 58 | } | ||
| 59 | virtual int EXTAPI SetOption(ENCODER_OPTION eOptionId, void* pOption) { | ||
| 60 | EXPECT_TRUE(gThis == this); | ||
| 61 | return 9; | ||
| 62 | } | ||
| 63 | virtual int EXTAPI GetOption(ENCODER_OPTION eOptionId, void* pOption) { | ||
| 64 | EXPECT_TRUE(gThis == this); | ||
| 65 | return 10; | ||
| 66 | } | ||
| 67 | }; | ||
| 68 | |||
| 69 | struct SVCDecoderImpl : public ISVCDecoder { | ||
| 70 | virtual ~SVCDecoderImpl() {} | ||
| 71 | virtual long EXTAPI Initialize(const SDecodingParam* pParam) { | ||
| 72 | EXPECT_TRUE(gThis == this); | ||
| 73 | return 1; | ||
| 74 | } | ||
| 75 | virtual long EXTAPI Uninitialize() { | ||
| 76 | EXPECT_TRUE(gThis == this); | ||
| 77 | return 2; | ||
| 78 | } | ||
| 79 | virtual DECODING_STATE EXTAPI DecodeFrame(const unsigned char* pSrc, | ||
| 80 | const int iSrcLen, unsigned char** ppDst, int* pStride, | ||
| 81 | int& iWidth, int& iHeight) { | ||
| 82 | EXPECT_TRUE(gThis == this); | ||
| 83 | return static_cast<DECODING_STATE>(3); | ||
| 84 | } | ||
| 85 | virtual DECODING_STATE EXTAPI DecodeFrame2(const unsigned char* pSrc, | ||
| 86 | const int iSrcLen, void** ppDst, SBufferInfo* pDstInfo) { | ||
| 87 | EXPECT_TRUE(gThis == this); | ||
| 88 | return static_cast<DECODING_STATE>(4); | ||
| 89 | } | ||
| 90 | virtual DECODING_STATE EXTAPI DecodeFrameEx(const unsigned char* pSrc, | ||
| 91 | const int iSrcLen, unsigned char* pDst, int iDstStride, | ||
| 92 | int& iDstLen, int& iWidth, int& iHeight, int& iColorFormat) { | ||
| 93 | EXPECT_TRUE(gThis == this); | ||
| 94 | return static_cast<DECODING_STATE>(5); | ||
| 95 | } | ||
| 96 | virtual long EXTAPI SetOption (DECODER_OPTION eOptionId, void* pOption) { | ||
| 97 | EXPECT_TRUE(gThis == this); | ||
| 98 | return 6; | ||
| 99 | } | ||
| 100 | virtual long EXTAPI GetOption (DECODER_OPTION eOptionId, void* pOption) { | ||
| 101 | EXPECT_TRUE(gThis == this); | ||
| 102 | return 7; | ||
| 103 | } | ||
| 104 | }; | ||
| 105 | |||
| 106 | TEST(ISVCEncoderTest, CheckFunctionOrder) { | ||
| 107 | SVCEncoderImpl* p = new SVCEncoderImpl; | ||
| 108 | gThis = p; | ||
| 109 | CheckEncoderInterface(p, CheckFunctionOrder); | ||
| 110 | delete p; | ||
| 111 | } | ||
| 112 | |||
| 113 | TEST(ISVCDecoderTest, CheckFunctionOrder) { | ||
| 114 | SVCDecoderImpl* p = new SVCDecoderImpl; | ||
| 115 | gThis = p; | ||
| 116 | CheckDecoderInterface(p, CheckFunctionOrder); | ||
| 117 | delete p; | ||
| 118 | } | ||
| 119 | |||
| 120 | struct bool_test_struct { | ||
| 121 | char c; | ||
| 122 | bool b; | ||
| 123 | }; | ||
| 124 | |||
| 125 | TEST(ISVCDecoderEncoderTest, CheckCAbi) { | ||
| 126 | EXPECT_EQ(sizeof(bool), GetBoolSize()) << "Wrong size of bool type"; | ||
| 127 | EXPECT_EQ(offsetof(bool_test_struct, b), GetBoolOffset()) << "Wrong alignment of bool in a struct"; | ||
| 128 | EXPECT_EQ(sizeof(bool_test_struct), GetBoolStructSize()) << "Wrong size of struct with a bool"; | ||
| 129 | } | ||