1 #include <gtest/gtest.h>
2 #include "codec_api.h"
3 #include <stddef.h>
4
CheckFunctionOrder(int expect,int actual,const char * name)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 {
~SVCEncoderImplSVCEncoderImpl24 virtual ~SVCEncoderImpl() {}
InitializeSVCEncoderImpl25 virtual int EXTAPI Initialize (const SEncParamBase* pParam) {
26 EXPECT_TRUE (gThis == this);
27 return 1;
28 }
InitializeExtSVCEncoderImpl29 virtual int EXTAPI InitializeExt (const SEncParamExt* pParam) {
30 EXPECT_TRUE (gThis == this);
31 return 2;
32 }
GetDefaultParamsSVCEncoderImpl33 virtual int EXTAPI GetDefaultParams (SEncParamExt* pParam) {
34 EXPECT_TRUE (gThis == this);
35 return 3;
36 }
UninitializeSVCEncoderImpl37 virtual int EXTAPI Uninitialize() {
38 EXPECT_TRUE (gThis == this);
39 return 4;
40 }
EncodeFrameSVCEncoderImpl41 virtual int EXTAPI EncodeFrame (const SSourcePicture* kpSrcPic,
42 SFrameBSInfo* pBsInfo) {
43 EXPECT_TRUE (gThis == this);
44 return 5;
45 }
EncodeParameterSetsSVCEncoderImpl46 virtual int EXTAPI EncodeParameterSets (SFrameBSInfo* pBsInfo) {
47 EXPECT_TRUE (gThis == this);
48 return 6;
49 }
ForceIntraFrameSVCEncoderImpl50 virtual int EXTAPI ForceIntraFrame (bool bIDR, int iLayerId = -1) {
51 EXPECT_TRUE (gThis == this);
52 return 7;
53 }
SetOptionSVCEncoderImpl54 virtual int EXTAPI SetOption (ENCODER_OPTION eOptionId, void* pOption) {
55 EXPECT_TRUE (gThis == this);
56 return 8;
57 }
GetOptionSVCEncoderImpl58 virtual int EXTAPI GetOption (ENCODER_OPTION eOptionId, void* pOption) {
59 EXPECT_TRUE (gThis == this);
60 return 9;
61 }
62 };
63
64 struct SVCDecoderImpl : public ISVCDecoder {
~SVCDecoderImplSVCDecoderImpl65 virtual ~SVCDecoderImpl() {}
InitializeSVCDecoderImpl66 virtual long EXTAPI Initialize (const SDecodingParam* pParam) {
67 EXPECT_TRUE (gThis == this);
68 return 1;
69 }
UninitializeSVCDecoderImpl70 virtual long EXTAPI Uninitialize() {
71 EXPECT_TRUE (gThis == this);
72 return 2;
73 }
DecodeFrameSVCDecoderImpl74 virtual DECODING_STATE EXTAPI DecodeFrame (const unsigned char* pSrc,
75 const int iSrcLen, unsigned char** ppDst, int* pStride,
76 int& iWidth, int& iHeight) {
77 EXPECT_TRUE (gThis == this);
78 return static_cast<DECODING_STATE> (3);
79 }
DecodeFrameNoDelaySVCDecoderImpl80 virtual DECODING_STATE EXTAPI DecodeFrameNoDelay (const unsigned char* pSrc,
81 const int iSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo) {
82 EXPECT_TRUE (gThis == this);
83 return static_cast<DECODING_STATE> (4);
84 }
DecodeFrame2SVCDecoderImpl85 virtual DECODING_STATE EXTAPI DecodeFrame2 (const unsigned char* pSrc,
86 const int iSrcLen, unsigned char** ppDst, SBufferInfo* pDstInfo) {
87 EXPECT_TRUE (gThis == this);
88 return static_cast<DECODING_STATE> (5);
89 }
FlushFrameSVCDecoderImpl90 virtual DECODING_STATE EXTAPI FlushFrame (unsigned char** ppDst, SBufferInfo* pDstInfo) {
91 EXPECT_TRUE (gThis == this);
92 return static_cast<DECODING_STATE> (10);
93 }
DecodeFrameExSVCDecoderImpl94 virtual DECODING_STATE EXTAPI DecodeFrameEx (const unsigned char* pSrc,
95 const int iSrcLen, unsigned char* pDst, int iDstStride,
96 int& iDstLen, int& iWidth, int& iHeight, int& iColorFormat) {
97 EXPECT_TRUE (gThis == this);
98 return static_cast<DECODING_STATE> (6);
99 }
DecodeParserSVCDecoderImpl100 virtual DECODING_STATE EXTAPI DecodeParser (const unsigned char* pSrc,
101 const int iSrcLen, SParserBsInfo* pDstInfo) {
102 EXPECT_TRUE (gThis == this);
103 return static_cast<DECODING_STATE> (7);
104 }
SetOptionSVCDecoderImpl105 virtual long EXTAPI SetOption (DECODER_OPTION eOptionId, void* pOption) {
106 EXPECT_TRUE (gThis == this);
107 return static_cast<DECODING_STATE> (8);
108 }
GetOptionSVCDecoderImpl109 virtual long EXTAPI GetOption (DECODER_OPTION eOptionId, void* pOption) {
110 EXPECT_TRUE (gThis == this);
111 return static_cast<DECODING_STATE> (9);
112 }
113 };
114
TEST(ISVCEncoderTest,CheckFunctionOrder)115 TEST (ISVCEncoderTest, CheckFunctionOrder) {
116 SVCEncoderImpl* p = new SVCEncoderImpl;
117 gThis = p;
118 CheckEncoderInterface (p, CheckFunctionOrder);
119 delete p;
120 }
121
TEST(ISVCDecoderTest,CheckFunctionOrder)122 TEST (ISVCDecoderTest, CheckFunctionOrder) {
123 SVCDecoderImpl* p = new SVCDecoderImpl;
124 gThis = p;
125 CheckDecoderInterface (p, CheckFunctionOrder);
126 delete p;
127 }
128
129 struct bool_test_struct {
130 char c;
131 bool b;
132 };
133
TEST(ISVCDecoderEncoderTest,CheckCAbi)134 TEST (ISVCDecoderEncoderTest, CheckCAbi) {
135 EXPECT_EQ (sizeof (bool), GetBoolSize()) << "Wrong size of bool type";
136 EXPECT_EQ (offsetof (bool_test_struct, b), GetBoolOffset()) << "Wrong alignment of bool in a struct";
137 EXPECT_EQ (sizeof (bool_test_struct), GetBoolStructSize()) << "Wrong size of struct with a bool";
138 }
139