• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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