1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker *
4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker *
8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker *
10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker */
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*b7c941bbSAndroid Build Coastguard Worker #define LOG_TAG "NativeMediaFormatUnitTest"
19*b7c941bbSAndroid Build Coastguard Worker #include <log/log.h>
20*b7c941bbSAndroid Build Coastguard Worker
21*b7c941bbSAndroid Build Coastguard Worker #include <jni.h>
22*b7c941bbSAndroid Build Coastguard Worker #include <media/NdkMediaFormat.h>
23*b7c941bbSAndroid Build Coastguard Worker
24*b7c941bbSAndroid Build Coastguard Worker #include <cinttypes>
25*b7c941bbSAndroid Build Coastguard Worker #include <map>
26*b7c941bbSAndroid Build Coastguard Worker #include <string>
27*b7c941bbSAndroid Build Coastguard Worker
28*b7c941bbSAndroid Build Coastguard Worker static const char story[] = {"What if after you die, God asks you: 'so how was heaven'"};
29*b7c941bbSAndroid Build Coastguard Worker static const char dragon[] = {"e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6"};
30*b7c941bbSAndroid Build Coastguard Worker
31*b7c941bbSAndroid Build Coastguard Worker class Rect {
32*b7c941bbSAndroid Build Coastguard Worker public:
33*b7c941bbSAndroid Build Coastguard Worker int left;
34*b7c941bbSAndroid Build Coastguard Worker int top;
35*b7c941bbSAndroid Build Coastguard Worker int right;
36*b7c941bbSAndroid Build Coastguard Worker int bottom;
37*b7c941bbSAndroid Build Coastguard Worker
Rect(int a,int b,int c,int d)38*b7c941bbSAndroid Build Coastguard Worker Rect(int a, int b, int c, int d) : left{a}, top{b}, right{c}, bottom{d} {};
39*b7c941bbSAndroid Build Coastguard Worker };
40*b7c941bbSAndroid Build Coastguard Worker
41*b7c941bbSAndroid Build Coastguard Worker class Buffer {
42*b7c941bbSAndroid Build Coastguard Worker public:
43*b7c941bbSAndroid Build Coastguard Worker char* buffer;
44*b7c941bbSAndroid Build Coastguard Worker size_t size;
45*b7c941bbSAndroid Build Coastguard Worker
Buffer(char * buffer=nullptr,size_t size=0)46*b7c941bbSAndroid Build Coastguard Worker explicit Buffer(char* buffer = nullptr, size_t size = 0) : buffer{buffer}, size{size} {};
47*b7c941bbSAndroid Build Coastguard Worker };
48*b7c941bbSAndroid Build Coastguard Worker
49*b7c941bbSAndroid Build Coastguard Worker class NativeMediaFormatUnitTest {
50*b7c941bbSAndroid Build Coastguard Worker private:
51*b7c941bbSAndroid Build Coastguard Worker std::map<int32_t, const char*> mInt32KeyValuePairs;
52*b7c941bbSAndroid Build Coastguard Worker std::map<int64_t, const char*> mInt64KeyValuePairs;
53*b7c941bbSAndroid Build Coastguard Worker std::map<float, const char*> mFloatKeyValuePairs;
54*b7c941bbSAndroid Build Coastguard Worker std::map<double, const char*> mDoubleKeyValuePairs;
55*b7c941bbSAndroid Build Coastguard Worker std::map<size_t, const char*> mSizeKeyValuePairs;
56*b7c941bbSAndroid Build Coastguard Worker std::map<const char*, const char*> mStringKeyValuePairs;
57*b7c941bbSAndroid Build Coastguard Worker std::map<Rect*, const char*> mWindowKeyValuePairs;
58*b7c941bbSAndroid Build Coastguard Worker std::map<Buffer*, const char*> mBufferKeyValuePairs;
59*b7c941bbSAndroid Build Coastguard Worker
60*b7c941bbSAndroid Build Coastguard Worker public:
61*b7c941bbSAndroid Build Coastguard Worker NativeMediaFormatUnitTest();
62*b7c941bbSAndroid Build Coastguard Worker ~NativeMediaFormatUnitTest();
63*b7c941bbSAndroid Build Coastguard Worker
64*b7c941bbSAndroid Build Coastguard Worker bool validateFormatInt32(AMediaFormat* fmt, int offset = 0, bool isClear = false);
65*b7c941bbSAndroid Build Coastguard Worker bool validateFormatInt64(AMediaFormat* fmt, int offset = 0, bool isClear = false);
66*b7c941bbSAndroid Build Coastguard Worker bool validateFormatFloat(AMediaFormat* fmt, float offset = 0.0f, bool isClear = false);
67*b7c941bbSAndroid Build Coastguard Worker bool validateFormatDouble(AMediaFormat* fmt, double offset = 0.0, bool isClear = false);
68*b7c941bbSAndroid Build Coastguard Worker bool validateFormatSize(AMediaFormat* fmt, size_t offset = 0, bool isClear = false);
69*b7c941bbSAndroid Build Coastguard Worker bool validateFormatString(AMediaFormat* fmt, int offset = 0, bool isClear = false);
70*b7c941bbSAndroid Build Coastguard Worker bool validateFormatRect(AMediaFormat* fmt, int offset = 0, bool isClear = false);
71*b7c941bbSAndroid Build Coastguard Worker bool validateFormatBuffer(AMediaFormat* fmt, int offset = 0, bool isClear = false);
72*b7c941bbSAndroid Build Coastguard Worker bool validateFormat(AMediaFormat* fmt, int offset = 0, bool isClear = false);
73*b7c941bbSAndroid Build Coastguard Worker
74*b7c941bbSAndroid Build Coastguard Worker void configureFormatInt32(AMediaFormat* fmt, int offset = 0);
75*b7c941bbSAndroid Build Coastguard Worker void configureFormatInt64(AMediaFormat* fmt, int offset = 0);
76*b7c941bbSAndroid Build Coastguard Worker void configureFormatFloat(AMediaFormat* fmt, float offset = 0.0f);
77*b7c941bbSAndroid Build Coastguard Worker void configureFormatDouble(AMediaFormat* fmt, double offset = 0.0);
78*b7c941bbSAndroid Build Coastguard Worker void configureFormatSize(AMediaFormat* fmt, size_t offset = 0);
79*b7c941bbSAndroid Build Coastguard Worker void configureFormatString(AMediaFormat* fmt, int offset = 0);
80*b7c941bbSAndroid Build Coastguard Worker void configureFormatRect(AMediaFormat* fmt, int offset = 0);
81*b7c941bbSAndroid Build Coastguard Worker void configureFormatBuffer(AMediaFormat* fmt, int offset = 0);
82*b7c941bbSAndroid Build Coastguard Worker void configureFormat(AMediaFormat* fmt, int offset = 0);
83*b7c941bbSAndroid Build Coastguard Worker };
84*b7c941bbSAndroid Build Coastguard Worker
NativeMediaFormatUnitTest()85*b7c941bbSAndroid Build Coastguard Worker NativeMediaFormatUnitTest::NativeMediaFormatUnitTest() {
86*b7c941bbSAndroid Build Coastguard Worker mInt32KeyValuePairs.insert({118, "elements in periodic table"});
87*b7c941bbSAndroid Build Coastguard Worker mInt32KeyValuePairs.insert({5778, "surface temp. of sun in kelvin"});
88*b7c941bbSAndroid Build Coastguard Worker mInt32KeyValuePairs.insert({8611, "k2 peak in mts"});
89*b7c941bbSAndroid Build Coastguard Worker mInt32KeyValuePairs.insert({72, "heart rate in bpm"});
90*b7c941bbSAndroid Build Coastguard Worker mInt64KeyValuePairs.insert({299792458L, "vel. of em wave in free space m/s"});
91*b7c941bbSAndroid Build Coastguard Worker mInt64KeyValuePairs.insert({86400L, "number of seconds in a day"});
92*b7c941bbSAndroid Build Coastguard Worker mInt64KeyValuePairs.insert({1520200000L, "distance of earth from the sun in km"});
93*b7c941bbSAndroid Build Coastguard Worker mInt64KeyValuePairs.insert({39000000L, "forest area of the world km^2"});
94*b7c941bbSAndroid Build Coastguard Worker mFloatKeyValuePairs.insert({22.0f / 7.0f, "pi"});
95*b7c941bbSAndroid Build Coastguard Worker mFloatKeyValuePairs.insert({3.6f, "not great, not terrible"});
96*b7c941bbSAndroid Build Coastguard Worker mFloatKeyValuePairs.insert({15.999f, "atomic weight of oxygen 8"});
97*b7c941bbSAndroid Build Coastguard Worker mFloatKeyValuePairs.insert({2.7182f, "Euler's number"});
98*b7c941bbSAndroid Build Coastguard Worker mDoubleKeyValuePairs.insert({44.0 / 7, "tau"});
99*b7c941bbSAndroid Build Coastguard Worker mDoubleKeyValuePairs.insert({9.80665, "g on earth m/sec^2"});
100*b7c941bbSAndroid Build Coastguard Worker mSizeKeyValuePairs.insert({sizeof(int64_t), "size of int64_t"});
101*b7c941bbSAndroid Build Coastguard Worker mSizeKeyValuePairs.insert({sizeof(wchar_t), "size of wide char"});
102*b7c941bbSAndroid Build Coastguard Worker mSizeKeyValuePairs.insert({sizeof(intptr_t), "size of pointer variable"});
103*b7c941bbSAndroid Build Coastguard Worker mSizeKeyValuePairs.insert({sizeof *this, "size of class NativeMediaFormatUnitTest"});
104*b7c941bbSAndroid Build Coastguard Worker mStringKeyValuePairs.insert(
105*b7c941bbSAndroid Build Coastguard Worker {"Discovered radium and polonium, and made huge contribution to finding treatments "
106*b7c941bbSAndroid Build Coastguard Worker "for cancer", "Marie Curie"});
107*b7c941bbSAndroid Build Coastguard Worker mStringKeyValuePairs.insert({"Sun rises in the east has zero entropy", "Shannon"});
108*b7c941bbSAndroid Build Coastguard Worker mWindowKeyValuePairs.insert({new Rect{12, 15, 12, 21}, "trapezoid"});
109*b7c941bbSAndroid Build Coastguard Worker mWindowKeyValuePairs.insert({new Rect{12, 12, 12, 12}, "rhombus"});
110*b7c941bbSAndroid Build Coastguard Worker mWindowKeyValuePairs.insert({new Rect{12, 15, 12, 15}, "rectangle"});
111*b7c941bbSAndroid Build Coastguard Worker mWindowKeyValuePairs.insert({new Rect{12, 15, 18, 21}, "quadrilateral"});
112*b7c941bbSAndroid Build Coastguard Worker mBufferKeyValuePairs.insert({new Buffer(), "empty buffer"});
113*b7c941bbSAndroid Build Coastguard Worker size_t sz = strlen(story) + 1;
114*b7c941bbSAndroid Build Coastguard Worker auto* quote = new Buffer{new char[sz], sz};
115*b7c941bbSAndroid Build Coastguard Worker memcpy(quote->buffer, story, sz);
116*b7c941bbSAndroid Build Coastguard Worker mBufferKeyValuePairs.insert({quote, "one line story"});
117*b7c941bbSAndroid Build Coastguard Worker sz = strlen(dragon) + 1;
118*b7c941bbSAndroid Build Coastguard Worker auto* chess = new Buffer(new char[sz], sz);
119*b7c941bbSAndroid Build Coastguard Worker memcpy(chess->buffer, dragon, sz);
120*b7c941bbSAndroid Build Coastguard Worker mBufferKeyValuePairs.insert({chess, "sicilian dragon"});
121*b7c941bbSAndroid Build Coastguard Worker }
122*b7c941bbSAndroid Build Coastguard Worker
~NativeMediaFormatUnitTest()123*b7c941bbSAndroid Build Coastguard Worker NativeMediaFormatUnitTest::~NativeMediaFormatUnitTest() {
124*b7c941bbSAndroid Build Coastguard Worker for (auto it : mWindowKeyValuePairs) {
125*b7c941bbSAndroid Build Coastguard Worker delete it.first;
126*b7c941bbSAndroid Build Coastguard Worker }
127*b7c941bbSAndroid Build Coastguard Worker for (auto it : mBufferKeyValuePairs) {
128*b7c941bbSAndroid Build Coastguard Worker delete[] it.first->buffer;
129*b7c941bbSAndroid Build Coastguard Worker delete it.first;
130*b7c941bbSAndroid Build Coastguard Worker }
131*b7c941bbSAndroid Build Coastguard Worker }
132*b7c941bbSAndroid Build Coastguard Worker
validateFormatInt32(AMediaFormat * fmt,int offset,bool isClear)133*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatInt32(AMediaFormat* fmt, int offset, bool isClear) {
134*b7c941bbSAndroid Build Coastguard Worker bool status = true;
135*b7c941bbSAndroid Build Coastguard Worker int32_t val;
136*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
137*b7c941bbSAndroid Build Coastguard Worker for (auto it : mInt32KeyValuePairs) {
138*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getInt32(fmt, it.second, &val);
139*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
140*b7c941bbSAndroid Build Coastguard Worker if (result) {
141*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
142*b7c941bbSAndroid Build Coastguard Worker status &= false;
143*b7c941bbSAndroid Build Coastguard Worker }
144*b7c941bbSAndroid Build Coastguard Worker } else {
145*b7c941bbSAndroid Build Coastguard Worker if (!result) {
146*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
147*b7c941bbSAndroid Build Coastguard Worker status &= false;
148*b7c941bbSAndroid Build Coastguard Worker } else if (val != it.first + offset) {
149*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %d but %d", it.second, it.first + offset,
150*b7c941bbSAndroid Build Coastguard Worker val);
151*b7c941bbSAndroid Build Coastguard Worker status &= false;
152*b7c941bbSAndroid Build Coastguard Worker }
153*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
154*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
155*b7c941bbSAndroid Build Coastguard Worker status &= false;
156*b7c941bbSAndroid Build Coastguard Worker }
157*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first + offset).c_str()) == nullptr) {
158*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
159*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first + offset).c_str());
160*b7c941bbSAndroid Build Coastguard Worker status &= false;
161*b7c941bbSAndroid Build Coastguard Worker }
162*b7c941bbSAndroid Build Coastguard Worker }
163*b7c941bbSAndroid Build Coastguard Worker }
164*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getInt32(fmt, "hello world", &val)) {
165*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
166*b7c941bbSAndroid Build Coastguard Worker status &= false;
167*b7c941bbSAndroid Build Coastguard Worker }
168*b7c941bbSAndroid Build Coastguard Worker return status;
169*b7c941bbSAndroid Build Coastguard Worker }
170*b7c941bbSAndroid Build Coastguard Worker
validateFormatInt64(AMediaFormat * fmt,int offset,bool isClear)171*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatInt64(AMediaFormat* fmt, int offset, bool isClear) {
172*b7c941bbSAndroid Build Coastguard Worker bool status = true;
173*b7c941bbSAndroid Build Coastguard Worker int64_t val;
174*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
175*b7c941bbSAndroid Build Coastguard Worker for (auto it : mInt64KeyValuePairs) {
176*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getInt64(fmt, it.second, &val);
177*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
178*b7c941bbSAndroid Build Coastguard Worker if (result) {
179*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
180*b7c941bbSAndroid Build Coastguard Worker status &= false;
181*b7c941bbSAndroid Build Coastguard Worker }
182*b7c941bbSAndroid Build Coastguard Worker } else {
183*b7c941bbSAndroid Build Coastguard Worker if (!result) {
184*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
185*b7c941bbSAndroid Build Coastguard Worker status &= false;
186*b7c941bbSAndroid Build Coastguard Worker } else if (val != it.first + offset) {
187*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %" PRId64 "but %" PRId64, it.second,
188*b7c941bbSAndroid Build Coastguard Worker it.first + offset, val);
189*b7c941bbSAndroid Build Coastguard Worker status &= false;
190*b7c941bbSAndroid Build Coastguard Worker }
191*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
192*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
193*b7c941bbSAndroid Build Coastguard Worker status &= false;
194*b7c941bbSAndroid Build Coastguard Worker }
195*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first + offset).c_str()) == nullptr) {
196*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
197*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first + offset).c_str());
198*b7c941bbSAndroid Build Coastguard Worker status &= false;
199*b7c941bbSAndroid Build Coastguard Worker }
200*b7c941bbSAndroid Build Coastguard Worker }
201*b7c941bbSAndroid Build Coastguard Worker }
202*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getInt64(fmt, "hello world", &val)) {
203*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
204*b7c941bbSAndroid Build Coastguard Worker status &= false;
205*b7c941bbSAndroid Build Coastguard Worker }
206*b7c941bbSAndroid Build Coastguard Worker return status;
207*b7c941bbSAndroid Build Coastguard Worker }
208*b7c941bbSAndroid Build Coastguard Worker
validateFormatFloat(AMediaFormat * fmt,float offset,bool isClear)209*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatFloat(AMediaFormat* fmt, float offset, bool isClear) {
210*b7c941bbSAndroid Build Coastguard Worker bool status = true;
211*b7c941bbSAndroid Build Coastguard Worker float val;
212*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
213*b7c941bbSAndroid Build Coastguard Worker for (auto it : mFloatKeyValuePairs) {
214*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getFloat(fmt, it.second, &val);
215*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
216*b7c941bbSAndroid Build Coastguard Worker if (result) {
217*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
218*b7c941bbSAndroid Build Coastguard Worker status &= false;
219*b7c941bbSAndroid Build Coastguard Worker }
220*b7c941bbSAndroid Build Coastguard Worker } else {
221*b7c941bbSAndroid Build Coastguard Worker if (!result) {
222*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
223*b7c941bbSAndroid Build Coastguard Worker status &= false;
224*b7c941bbSAndroid Build Coastguard Worker } else if (val != it.first + offset) {
225*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %f but %f", it.second, it.first + offset,
226*b7c941bbSAndroid Build Coastguard Worker val);
227*b7c941bbSAndroid Build Coastguard Worker status &= false;
228*b7c941bbSAndroid Build Coastguard Worker }
229*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
230*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
231*b7c941bbSAndroid Build Coastguard Worker status &= false;
232*b7c941bbSAndroid Build Coastguard Worker }
233*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first + offset).c_str()) == nullptr) {
234*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
235*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first + offset).c_str());
236*b7c941bbSAndroid Build Coastguard Worker status &= false;
237*b7c941bbSAndroid Build Coastguard Worker }
238*b7c941bbSAndroid Build Coastguard Worker }
239*b7c941bbSAndroid Build Coastguard Worker }
240*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getFloat(fmt, "hello world", &val)) {
241*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
242*b7c941bbSAndroid Build Coastguard Worker status &= false;
243*b7c941bbSAndroid Build Coastguard Worker }
244*b7c941bbSAndroid Build Coastguard Worker return status;
245*b7c941bbSAndroid Build Coastguard Worker }
246*b7c941bbSAndroid Build Coastguard Worker
validateFormatDouble(AMediaFormat * fmt,double offset,bool isClear)247*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatDouble(AMediaFormat* fmt, double offset,
248*b7c941bbSAndroid Build Coastguard Worker bool isClear) {
249*b7c941bbSAndroid Build Coastguard Worker bool status = true;
250*b7c941bbSAndroid Build Coastguard Worker double val;
251*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
252*b7c941bbSAndroid Build Coastguard Worker for (auto it : mDoubleKeyValuePairs) {
253*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getDouble(fmt, it.second, &val);
254*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
255*b7c941bbSAndroid Build Coastguard Worker if (result) {
256*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
257*b7c941bbSAndroid Build Coastguard Worker status &= false;
258*b7c941bbSAndroid Build Coastguard Worker }
259*b7c941bbSAndroid Build Coastguard Worker } else {
260*b7c941bbSAndroid Build Coastguard Worker if (!result) {
261*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
262*b7c941bbSAndroid Build Coastguard Worker status &= false;
263*b7c941bbSAndroid Build Coastguard Worker } else if (val != it.first + offset) {
264*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %f but %f", it.second, it.first + offset,
265*b7c941bbSAndroid Build Coastguard Worker val);
266*b7c941bbSAndroid Build Coastguard Worker status &= false;
267*b7c941bbSAndroid Build Coastguard Worker }
268*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
269*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
270*b7c941bbSAndroid Build Coastguard Worker status &= false;
271*b7c941bbSAndroid Build Coastguard Worker }
272*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first + offset).c_str()) == nullptr) {
273*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
274*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first + offset).c_str());
275*b7c941bbSAndroid Build Coastguard Worker status &= false;
276*b7c941bbSAndroid Build Coastguard Worker }
277*b7c941bbSAndroid Build Coastguard Worker }
278*b7c941bbSAndroid Build Coastguard Worker }
279*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getDouble(fmt, "hello world", &val)) {
280*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
281*b7c941bbSAndroid Build Coastguard Worker status &= false;
282*b7c941bbSAndroid Build Coastguard Worker }
283*b7c941bbSAndroid Build Coastguard Worker return status;
284*b7c941bbSAndroid Build Coastguard Worker }
285*b7c941bbSAndroid Build Coastguard Worker
validateFormatSize(AMediaFormat * fmt,size_t offset,bool isClear)286*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatSize(AMediaFormat* fmt, size_t offset, bool isClear) {
287*b7c941bbSAndroid Build Coastguard Worker bool status = true;
288*b7c941bbSAndroid Build Coastguard Worker size_t val;
289*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
290*b7c941bbSAndroid Build Coastguard Worker for (auto it : mSizeKeyValuePairs) {
291*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getSize(fmt, it.second, &val);
292*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
293*b7c941bbSAndroid Build Coastguard Worker if (result) {
294*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
295*b7c941bbSAndroid Build Coastguard Worker status &= false;
296*b7c941bbSAndroid Build Coastguard Worker }
297*b7c941bbSAndroid Build Coastguard Worker } else {
298*b7c941bbSAndroid Build Coastguard Worker if (!result) {
299*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
300*b7c941bbSAndroid Build Coastguard Worker status &= false;
301*b7c941bbSAndroid Build Coastguard Worker } else if (val != it.first + offset) {
302*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %zu but %zu", it.second,
303*b7c941bbSAndroid Build Coastguard Worker it.first + offset, val);
304*b7c941bbSAndroid Build Coastguard Worker status &= false;
305*b7c941bbSAndroid Build Coastguard Worker }
306*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
307*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
308*b7c941bbSAndroid Build Coastguard Worker status &= false;
309*b7c941bbSAndroid Build Coastguard Worker }
310*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first + offset).c_str()) == nullptr) {
311*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
312*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first + offset).c_str());
313*b7c941bbSAndroid Build Coastguard Worker status &= false;
314*b7c941bbSAndroid Build Coastguard Worker }
315*b7c941bbSAndroid Build Coastguard Worker }
316*b7c941bbSAndroid Build Coastguard Worker }
317*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getSize(fmt, "hello world", &val)) {
318*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
319*b7c941bbSAndroid Build Coastguard Worker status &= false;
320*b7c941bbSAndroid Build Coastguard Worker }
321*b7c941bbSAndroid Build Coastguard Worker return status;
322*b7c941bbSAndroid Build Coastguard Worker }
323*b7c941bbSAndroid Build Coastguard Worker
validateFormatString(AMediaFormat * fmt,int offset,bool isClear)324*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatString(AMediaFormat* fmt, int offset, bool isClear) {
325*b7c941bbSAndroid Build Coastguard Worker bool status = true;
326*b7c941bbSAndroid Build Coastguard Worker const char* val;
327*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
328*b7c941bbSAndroid Build Coastguard Worker for (auto it : mStringKeyValuePairs) {
329*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getString(fmt, it.second, &val);
330*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
331*b7c941bbSAndroid Build Coastguard Worker if (result) {
332*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
333*b7c941bbSAndroid Build Coastguard Worker status &= false;
334*b7c941bbSAndroid Build Coastguard Worker }
335*b7c941bbSAndroid Build Coastguard Worker } else {
336*b7c941bbSAndroid Build Coastguard Worker std::string s = it.first + std::to_string(offset);
337*b7c941bbSAndroid Build Coastguard Worker if (!result) {
338*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
339*b7c941bbSAndroid Build Coastguard Worker status &= false;
340*b7c941bbSAndroid Build Coastguard Worker } else if (s != val) {
341*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %s but %s", it.second, s.c_str(), val);
342*b7c941bbSAndroid Build Coastguard Worker status &= false;
343*b7c941bbSAndroid Build Coastguard Worker }
344*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
345*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
346*b7c941bbSAndroid Build Coastguard Worker status &= false;
347*b7c941bbSAndroid Build Coastguard Worker }
348*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, s.c_str()) == nullptr) {
349*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, s.c_str());
350*b7c941bbSAndroid Build Coastguard Worker status &= false;
351*b7c941bbSAndroid Build Coastguard Worker }
352*b7c941bbSAndroid Build Coastguard Worker }
353*b7c941bbSAndroid Build Coastguard Worker }
354*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getString(fmt, "hello world", &val)) {
355*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
356*b7c941bbSAndroid Build Coastguard Worker status &= false;
357*b7c941bbSAndroid Build Coastguard Worker }
358*b7c941bbSAndroid Build Coastguard Worker return status;
359*b7c941bbSAndroid Build Coastguard Worker }
360*b7c941bbSAndroid Build Coastguard Worker
validateFormatRect(AMediaFormat * fmt,int offset,bool isClear)361*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatRect(AMediaFormat* fmt, int offset, bool isClear) {
362*b7c941bbSAndroid Build Coastguard Worker bool status = true;
363*b7c941bbSAndroid Build Coastguard Worker int left, top, right, bottom;
364*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
365*b7c941bbSAndroid Build Coastguard Worker for (auto it : mWindowKeyValuePairs) {
366*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getRect(fmt, it.second, &left, &top, &right, &bottom);
367*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
368*b7c941bbSAndroid Build Coastguard Worker if (result) {
369*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
370*b7c941bbSAndroid Build Coastguard Worker status &= false;
371*b7c941bbSAndroid Build Coastguard Worker }
372*b7c941bbSAndroid Build Coastguard Worker } else {
373*b7c941bbSAndroid Build Coastguard Worker if (!result) {
374*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
375*b7c941bbSAndroid Build Coastguard Worker status &= false;
376*b7c941bbSAndroid Build Coastguard Worker } else if (left != it.first->left + offset || top != it.first->top + offset ||
377*b7c941bbSAndroid Build Coastguard Worker right != it.first->right + offset || bottom != it.first->bottom + offset) {
378*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not (%d, %d, %d, %d)) but (%d, %d, %d, %d)",
379*b7c941bbSAndroid Build Coastguard Worker it.second, it.first->left, it.first->top, it.first->right, it.first->bottom,
380*b7c941bbSAndroid Build Coastguard Worker left, top, right, bottom);
381*b7c941bbSAndroid Build Coastguard Worker status &= false;
382*b7c941bbSAndroid Build Coastguard Worker }
383*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
384*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
385*b7c941bbSAndroid Build Coastguard Worker status &= false;
386*b7c941bbSAndroid Build Coastguard Worker }
387*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first->left + offset).c_str()) == nullptr) {
388*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
389*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first->left + offset).c_str());
390*b7c941bbSAndroid Build Coastguard Worker status &= false;
391*b7c941bbSAndroid Build Coastguard Worker }
392*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first->top + offset).c_str()) == nullptr) {
393*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
394*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first->top + offset).c_str());
395*b7c941bbSAndroid Build Coastguard Worker status &= false;
396*b7c941bbSAndroid Build Coastguard Worker }
397*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first->right + offset).c_str()) == nullptr) {
398*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
399*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first->right + offset).c_str());
400*b7c941bbSAndroid Build Coastguard Worker status &= false;
401*b7c941bbSAndroid Build Coastguard Worker }
402*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, std::to_string(it.first->bottom + offset).c_str()) == nullptr) {
403*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString,
404*b7c941bbSAndroid Build Coastguard Worker std::to_string(it.first->bottom + offset).c_str());
405*b7c941bbSAndroid Build Coastguard Worker status &= false;
406*b7c941bbSAndroid Build Coastguard Worker }
407*b7c941bbSAndroid Build Coastguard Worker }
408*b7c941bbSAndroid Build Coastguard Worker }
409*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getRect(fmt, "hello world", &left, &top, &right, &bottom)) {
410*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
411*b7c941bbSAndroid Build Coastguard Worker status &= false;
412*b7c941bbSAndroid Build Coastguard Worker }
413*b7c941bbSAndroid Build Coastguard Worker return status;
414*b7c941bbSAndroid Build Coastguard Worker }
415*b7c941bbSAndroid Build Coastguard Worker
validateFormatBuffer(AMediaFormat * fmt,int offset,bool isClear)416*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormatBuffer(AMediaFormat* fmt, int offset, bool isClear) {
417*b7c941bbSAndroid Build Coastguard Worker bool status = true;
418*b7c941bbSAndroid Build Coastguard Worker void* data;
419*b7c941bbSAndroid Build Coastguard Worker size_t size;
420*b7c941bbSAndroid Build Coastguard Worker const char* toString = AMediaFormat_toString(fmt);
421*b7c941bbSAndroid Build Coastguard Worker for (auto it : mBufferKeyValuePairs) {
422*b7c941bbSAndroid Build Coastguard Worker bool result = AMediaFormat_getBuffer(fmt, it.second, &data, &size);
423*b7c941bbSAndroid Build Coastguard Worker if (isClear) {
424*b7c941bbSAndroid Build Coastguard Worker if (result) {
425*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat is not expected to contain Key %s", it.second);
426*b7c941bbSAndroid Build Coastguard Worker status &= false;
427*b7c941bbSAndroid Build Coastguard Worker }
428*b7c941bbSAndroid Build Coastguard Worker } else {
429*b7c941bbSAndroid Build Coastguard Worker if (!result) {
430*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat doesn't contain key %s", it.second);
431*b7c941bbSAndroid Build Coastguard Worker status &= false;
432*b7c941bbSAndroid Build Coastguard Worker } else if (size != (offset == 0 ? it.first->size : it.first->size / 2)) {
433*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %zu but %zu", it.second,
434*b7c941bbSAndroid Build Coastguard Worker (offset == 0 ? it.first->size : it.first->size / 2), size);
435*b7c941bbSAndroid Build Coastguard Worker status &= false;
436*b7c941bbSAndroid Build Coastguard Worker } else {
437*b7c941bbSAndroid Build Coastguard Worker if (it.first->buffer != nullptr &&
438*b7c941bbSAndroid Build Coastguard Worker memcmp(data, it.first->buffer + it.first->size - size, size) != 0) {
439*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat Value for Key %s is not %s but %s {%zu}", it.second,
440*b7c941bbSAndroid Build Coastguard Worker it.first->buffer + it.first->size - size, (char*)data, size);
441*b7c941bbSAndroid Build Coastguard Worker status &= false;
442*b7c941bbSAndroid Build Coastguard Worker }
443*b7c941bbSAndroid Build Coastguard Worker }
444*b7c941bbSAndroid Build Coastguard Worker if (strstr(toString, it.second) == nullptr) {
445*b7c941bbSAndroid Build Coastguard Worker ALOGE("AMediaFormat_toString() of fmt %s doesn't contains %s", toString, it.second);
446*b7c941bbSAndroid Build Coastguard Worker status &= false;
447*b7c941bbSAndroid Build Coastguard Worker }
448*b7c941bbSAndroid Build Coastguard Worker }
449*b7c941bbSAndroid Build Coastguard Worker }
450*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getBuffer(fmt, "hello world", &data, &size)) {
451*b7c941bbSAndroid Build Coastguard Worker ALOGE("MediaFormat has value for key 'hello world' ");
452*b7c941bbSAndroid Build Coastguard Worker status &= false;
453*b7c941bbSAndroid Build Coastguard Worker }
454*b7c941bbSAndroid Build Coastguard Worker return status;
455*b7c941bbSAndroid Build Coastguard Worker }
456*b7c941bbSAndroid Build Coastguard Worker
validateFormat(AMediaFormat * fmt,int offset,bool isClear)457*b7c941bbSAndroid Build Coastguard Worker bool NativeMediaFormatUnitTest::validateFormat(AMediaFormat* fmt, int offset, bool isClear) {
458*b7c941bbSAndroid Build Coastguard Worker bool status = validateFormatInt32(fmt, offset, isClear);
459*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatInt64(fmt, offset, isClear);
460*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatFloat(fmt, offset, isClear);
461*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatDouble(fmt, offset, isClear);
462*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatSize(fmt, offset, isClear);
463*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatString(fmt, offset, isClear);
464*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatRect(fmt, offset, isClear);
465*b7c941bbSAndroid Build Coastguard Worker status &= validateFormatBuffer(fmt, offset, isClear);
466*b7c941bbSAndroid Build Coastguard Worker return status;
467*b7c941bbSAndroid Build Coastguard Worker }
468*b7c941bbSAndroid Build Coastguard Worker
configureFormatInt32(AMediaFormat * fmt,int offset)469*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatInt32(AMediaFormat* fmt, int offset) {
470*b7c941bbSAndroid Build Coastguard Worker for (auto it : mInt32KeyValuePairs) {
471*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setInt32(fmt, it.second, it.first + offset);
472*b7c941bbSAndroid Build Coastguard Worker }
473*b7c941bbSAndroid Build Coastguard Worker }
474*b7c941bbSAndroid Build Coastguard Worker
configureFormatInt64(AMediaFormat * fmt,int offset)475*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatInt64(AMediaFormat* fmt, int offset) {
476*b7c941bbSAndroid Build Coastguard Worker for (auto it : mInt64KeyValuePairs) {
477*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setInt64(fmt, it.second, it.first + offset);
478*b7c941bbSAndroid Build Coastguard Worker }
479*b7c941bbSAndroid Build Coastguard Worker }
480*b7c941bbSAndroid Build Coastguard Worker
configureFormatFloat(AMediaFormat * fmt,float offset)481*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatFloat(AMediaFormat* fmt, float offset) {
482*b7c941bbSAndroid Build Coastguard Worker for (auto it : mFloatKeyValuePairs) {
483*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setFloat(fmt, it.second, it.first + offset);
484*b7c941bbSAndroid Build Coastguard Worker }
485*b7c941bbSAndroid Build Coastguard Worker }
486*b7c941bbSAndroid Build Coastguard Worker
configureFormatDouble(AMediaFormat * fmt,double offset)487*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatDouble(AMediaFormat* fmt, double offset) {
488*b7c941bbSAndroid Build Coastguard Worker for (auto it : mDoubleKeyValuePairs) {
489*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setDouble(fmt, it.second, it.first + offset);
490*b7c941bbSAndroid Build Coastguard Worker }
491*b7c941bbSAndroid Build Coastguard Worker }
492*b7c941bbSAndroid Build Coastguard Worker
configureFormatSize(AMediaFormat * fmt,size_t offset)493*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatSize(AMediaFormat* fmt, size_t offset) {
494*b7c941bbSAndroid Build Coastguard Worker for (auto it : mSizeKeyValuePairs) {
495*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setSize(fmt, it.second, it.first + offset);
496*b7c941bbSAndroid Build Coastguard Worker }
497*b7c941bbSAndroid Build Coastguard Worker }
498*b7c941bbSAndroid Build Coastguard Worker
configureFormatString(AMediaFormat * fmt,int offset)499*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatString(AMediaFormat* fmt, int offset) {
500*b7c941bbSAndroid Build Coastguard Worker for (auto it : mStringKeyValuePairs) {
501*b7c941bbSAndroid Build Coastguard Worker std::string s1 = it.first + std::to_string(offset);
502*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setString(fmt, it.second, s1.c_str());
503*b7c941bbSAndroid Build Coastguard Worker }
504*b7c941bbSAndroid Build Coastguard Worker }
505*b7c941bbSAndroid Build Coastguard Worker
configureFormatRect(AMediaFormat * fmt,int offset)506*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatRect(AMediaFormat* fmt, int offset) {
507*b7c941bbSAndroid Build Coastguard Worker for (auto it : mWindowKeyValuePairs) {
508*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setRect(fmt, it.second, it.first->left + offset, it.first->top + offset,
509*b7c941bbSAndroid Build Coastguard Worker it.first->right + offset, it.first->bottom + offset);
510*b7c941bbSAndroid Build Coastguard Worker }
511*b7c941bbSAndroid Build Coastguard Worker }
512*b7c941bbSAndroid Build Coastguard Worker
configureFormatBuffer(AMediaFormat * fmt,int offset)513*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormatBuffer(AMediaFormat* fmt, int offset) {
514*b7c941bbSAndroid Build Coastguard Worker for (auto it : mBufferKeyValuePairs) {
515*b7c941bbSAndroid Build Coastguard Worker int sz = offset == 0 ? it.first->size : it.first->size / 2;
516*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_setBuffer(fmt, it.second, it.first->buffer + it.first->size - sz, sz);
517*b7c941bbSAndroid Build Coastguard Worker }
518*b7c941bbSAndroid Build Coastguard Worker }
519*b7c941bbSAndroid Build Coastguard Worker
configureFormat(AMediaFormat * fmt,int offset)520*b7c941bbSAndroid Build Coastguard Worker void NativeMediaFormatUnitTest::configureFormat(AMediaFormat* fmt, int offset) {
521*b7c941bbSAndroid Build Coastguard Worker configureFormatInt32(fmt, offset);
522*b7c941bbSAndroid Build Coastguard Worker configureFormatInt64(fmt, offset);
523*b7c941bbSAndroid Build Coastguard Worker configureFormatFloat(fmt, offset);
524*b7c941bbSAndroid Build Coastguard Worker configureFormatDouble(fmt, offset);
525*b7c941bbSAndroid Build Coastguard Worker configureFormatSize(fmt, offset);
526*b7c941bbSAndroid Build Coastguard Worker configureFormatString(fmt, offset);
527*b7c941bbSAndroid Build Coastguard Worker configureFormatRect(fmt, offset);
528*b7c941bbSAndroid Build Coastguard Worker configureFormatBuffer(fmt, offset);
529*b7c941bbSAndroid Build Coastguard Worker }
530*b7c941bbSAndroid Build Coastguard Worker
531*b7c941bbSAndroid Build Coastguard Worker // 1. configure format with default values and validate the same
532*b7c941bbSAndroid Build Coastguard Worker // 2. copy configured format to an empty format and validate the copied format
533*b7c941bbSAndroid Build Coastguard Worker // 3. overwrite copied format with default + offset values and validate the updated format
534*b7c941bbSAndroid Build Coastguard Worker // 4. overwrite updated format with default values using AMediaFormat_copy API and validate the same
535*b7c941bbSAndroid Build Coastguard Worker // 5. clear mediaformat and validate if keys are not present
testMediaFormatAllNative()536*b7c941bbSAndroid Build Coastguard Worker static bool testMediaFormatAllNative() {
537*b7c941bbSAndroid Build Coastguard Worker auto* nmf = new NativeMediaFormatUnitTest();
538*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* fmtOrig = AMediaFormat_new();
539*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* fmtDup = AMediaFormat_new();
540*b7c941bbSAndroid Build Coastguard Worker const int offset = 123;
541*b7c941bbSAndroid Build Coastguard Worker
542*b7c941bbSAndroid Build Coastguard Worker nmf->configureFormat(fmtOrig);
543*b7c941bbSAndroid Build Coastguard Worker bool status = nmf->validateFormat(fmtOrig);
544*b7c941bbSAndroid Build Coastguard Worker
545*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_copy(fmtDup, fmtOrig);
546*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat(fmtDup);
547*b7c941bbSAndroid Build Coastguard Worker
548*b7c941bbSAndroid Build Coastguard Worker nmf->configureFormat(fmtDup, offset);
549*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat(fmtDup, offset);
550*b7c941bbSAndroid Build Coastguard Worker
551*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_copy(fmtDup, fmtOrig);
552*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat(fmtDup);
553*b7c941bbSAndroid Build Coastguard Worker
554*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_clear(fmtDup);
555*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat(fmtDup, offset, true);
556*b7c941bbSAndroid Build Coastguard Worker
557*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(fmtOrig);
558*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(fmtDup);
559*b7c941bbSAndroid Build Coastguard Worker delete nmf;
560*b7c941bbSAndroid Build Coastguard Worker
561*b7c941bbSAndroid Build Coastguard Worker return status;
562*b7c941bbSAndroid Build Coastguard Worker }
563*b7c941bbSAndroid Build Coastguard Worker
564*b7c941bbSAndroid Build Coastguard Worker // 1. configure format with default values and validate the same
565*b7c941bbSAndroid Build Coastguard Worker // 2. copy configured format to an empty format and validate the copied format
566*b7c941bbSAndroid Build Coastguard Worker // 3. overwrite copied format with default + offset values and validate the updated format
567*b7c941bbSAndroid Build Coastguard Worker // 4. overwrite updated format with default values using AMediaFormat_copy API and validate the same
568*b7c941bbSAndroid Build Coastguard Worker #define testMediaFormatfuncNative(func) \
569*b7c941bbSAndroid Build Coastguard Worker static bool testMediaFormat##func##Native() { \
570*b7c941bbSAndroid Build Coastguard Worker auto* nmf = new NativeMediaFormatUnitTest(); \
571*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* fmtOrig = AMediaFormat_new(); \
572*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* fmtDup = AMediaFormat_new(); \
573*b7c941bbSAndroid Build Coastguard Worker const int offset = 12345; \
574*b7c941bbSAndroid Build Coastguard Worker \
575*b7c941bbSAndroid Build Coastguard Worker nmf->configureFormat##func(fmtOrig); \
576*b7c941bbSAndroid Build Coastguard Worker bool status = nmf->validateFormat##func(fmtOrig); \
577*b7c941bbSAndroid Build Coastguard Worker \
578*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_copy(fmtDup, fmtOrig); \
579*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat##func(fmtDup); \
580*b7c941bbSAndroid Build Coastguard Worker \
581*b7c941bbSAndroid Build Coastguard Worker nmf->configureFormat##func(fmtDup, offset); \
582*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat##func(fmtDup, offset); \
583*b7c941bbSAndroid Build Coastguard Worker \
584*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_copy(fmtDup, fmtOrig); \
585*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat##func(fmtDup); \
586*b7c941bbSAndroid Build Coastguard Worker \
587*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_clear(fmtDup); \
588*b7c941bbSAndroid Build Coastguard Worker status &= nmf->validateFormat##func(fmtDup, offset, true); \
589*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(fmtOrig); \
590*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(fmtDup); \
591*b7c941bbSAndroid Build Coastguard Worker delete nmf; \
592*b7c941bbSAndroid Build Coastguard Worker return status; \
593*b7c941bbSAndroid Build Coastguard Worker }
594*b7c941bbSAndroid Build Coastguard Worker
595*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Int32)
596*b7c941bbSAndroid Build Coastguard Worker
testMediaFormatfuncNative(Int64)597*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Int64)
598*b7c941bbSAndroid Build Coastguard Worker
599*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Float)
600*b7c941bbSAndroid Build Coastguard Worker
601*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Double)
602*b7c941bbSAndroid Build Coastguard Worker
603*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Size)
604*b7c941bbSAndroid Build Coastguard Worker
605*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(String)
606*b7c941bbSAndroid Build Coastguard Worker
607*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Rect)
608*b7c941bbSAndroid Build Coastguard Worker
609*b7c941bbSAndroid Build Coastguard Worker testMediaFormatfuncNative(Buffer)
610*b7c941bbSAndroid Build Coastguard Worker
611*b7c941bbSAndroid Build Coastguard Worker #define nativeTestMediaFormatfunc(func) \
612*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestMediaFormat##func(JNIEnv*, jobject) { \
613*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(testMediaFormat##func##Native()); \
614*b7c941bbSAndroid Build Coastguard Worker }
615*b7c941bbSAndroid Build Coastguard Worker
616*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getInt32", "AMediaFormat_setInt32",
617*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
618*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
619*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Int32)
620*b7c941bbSAndroid Build Coastguard Worker
621*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getInt64", "AMediaFormat_setInt64",
622*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
623*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
624*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Int64)
625*b7c941bbSAndroid Build Coastguard Worker
626*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getFloat", "AMediaFormat_setFloat",
627*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
628*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
629*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Float)
630*b7c941bbSAndroid Build Coastguard Worker
631*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getDouble", "AMediaFormat_setDouble",
632*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
633*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
634*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Double)
635*b7c941bbSAndroid Build Coastguard Worker
636*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getSize", "AMediaFormat_setSize",
637*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
638*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
639*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Size)
640*b7c941bbSAndroid Build Coastguard Worker
641*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getString", "AMediaFormat_setString",
642*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
643*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
644*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(String)
645*b7c941bbSAndroid Build Coastguard Worker
646*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getRect", "AMediaFormat_setRect",
647*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
648*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
649*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Rect)
650*b7c941bbSAndroid Build Coastguard Worker
651*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getBuffer", "AMediaFormat_setBuffer",
652*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
653*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
654*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(Buffer)
655*b7c941bbSAndroid Build Coastguard Worker
656*b7c941bbSAndroid Build Coastguard Worker //@ApiTest(apis = {"AMediaFormat_getInt32", "AMediaFormat_setInt32",
657*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getInt64", "AMediaFormat_setInt64",
658*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getFloat", "AMediaFormat_setFloat",
659*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getDouble", "AMediaFormat_setDouble",
660*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getString", "AMediaFormat_setString",
661*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getSize", "AMediaFormat_setSize",
662*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getRect", "AMediaFormat_setRect",
663*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_getBuffer", "AMediaFormat_setBuffer",
664*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_copy", "AMediaFormat_clear", "AMediaFormat_toString",
665*b7c941bbSAndroid Build Coastguard Worker // "AMediaFormat_new", "AMediaFormat_delete"})
666*b7c941bbSAndroid Build Coastguard Worker nativeTestMediaFormatfunc(All)
667*b7c941bbSAndroid Build Coastguard Worker
668*b7c941bbSAndroid Build Coastguard Worker int registerAndroidMediaV2CtsMediaFormatUnitTest(JNIEnv* env) {
669*b7c941bbSAndroid Build Coastguard Worker const JNINativeMethod methodTable[] = {
670*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatInt32", "()Z", (void*)nativeTestMediaFormatInt32},
671*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatInt64", "()Z", (void*)nativeTestMediaFormatInt64},
672*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatFloat", "()Z", (void*)nativeTestMediaFormatFloat},
673*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatDouble", "()Z", (void*)nativeTestMediaFormatDouble},
674*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatSize", "()Z", (void*)nativeTestMediaFormatSize},
675*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatString", "()Z", (void*)nativeTestMediaFormatString},
676*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatRect", "()Z", (void*)nativeTestMediaFormatRect},
677*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatBuffer", "()Z", (void*)nativeTestMediaFormatBuffer},
678*b7c941bbSAndroid Build Coastguard Worker {"nativeTestMediaFormatAll", "()Z", (void*)nativeTestMediaFormatAll},
679*b7c941bbSAndroid Build Coastguard Worker };
680*b7c941bbSAndroid Build Coastguard Worker jclass c = env->FindClass("android/mediav2/cts/MediaFormatUnitTest");
681*b7c941bbSAndroid Build Coastguard Worker return env->RegisterNatives(c, methodTable, sizeof(methodTable) / sizeof(JNINativeMethod));
682*b7c941bbSAndroid Build Coastguard Worker }
683*b7c941bbSAndroid Build Coastguard Worker
JNI_OnLoad(JavaVM * vm,void *)684*b7c941bbSAndroid Build Coastguard Worker extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
685*b7c941bbSAndroid Build Coastguard Worker JNIEnv* env;
686*b7c941bbSAndroid Build Coastguard Worker if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) return JNI_ERR;
687*b7c941bbSAndroid Build Coastguard Worker if (registerAndroidMediaV2CtsMediaFormatUnitTest(env) != JNI_OK) return JNI_ERR;
688*b7c941bbSAndroid Build Coastguard Worker return JNI_VERSION_1_6;
689*b7c941bbSAndroid Build Coastguard Worker }
690