1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker #include <stdlib.h>
18*bebae9c0SAndroid Build Coastguard Worker #include <stdio.h>
19*bebae9c0SAndroid Build Coastguard Worker #include <string.h>
20*bebae9c0SAndroid Build Coastguard Worker #include <unistd.h>
21*bebae9c0SAndroid Build Coastguard Worker #include <sys/time.h>
22*bebae9c0SAndroid Build Coastguard Worker #include <fcntl.h>
23*bebae9c0SAndroid Build Coastguard Worker
24*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL.h>
25*bebae9c0SAndroid Build Coastguard Worker #include <OMXAL/OpenMAXAL_Android.h> // for VP8 definitions
26*bebae9c0SAndroid Build Coastguard Worker
27*bebae9c0SAndroid Build Coastguard Worker #define NUM_ENGINE_INTERFACES 1
28*bebae9c0SAndroid Build Coastguard Worker
29*bebae9c0SAndroid Build Coastguard Worker char unknown[50];
30*bebae9c0SAndroid Build Coastguard Worker
31*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------
32*bebae9c0SAndroid Build Coastguard Worker /* Exits the application if an error is encountered */
33*bebae9c0SAndroid Build Coastguard Worker #define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
34*bebae9c0SAndroid Build Coastguard Worker
ExitOnErrorFunc(XAresult result,int line)35*bebae9c0SAndroid Build Coastguard Worker void ExitOnErrorFunc( XAresult result , int line)
36*bebae9c0SAndroid Build Coastguard Worker {
37*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
38*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "Error %u encountered at line %d, exiting\n", result, line);
39*bebae9c0SAndroid Build Coastguard Worker exit(EXIT_FAILURE);
40*bebae9c0SAndroid Build Coastguard Worker }
41*bebae9c0SAndroid Build Coastguard Worker }
42*bebae9c0SAndroid Build Coastguard Worker
videoCodecIdToString(XAuint32 decoderId)43*bebae9c0SAndroid Build Coastguard Worker const char* videoCodecIdToString(XAuint32 decoderId) {
44*bebae9c0SAndroid Build Coastguard Worker switch(decoderId) {
45*bebae9c0SAndroid Build Coastguard Worker case XA_VIDEOCODEC_MPEG2: return "XA_VIDEOCODEC_MPEG2"; break;
46*bebae9c0SAndroid Build Coastguard Worker case XA_VIDEOCODEC_H263: return "XA_VIDEOCODEC_H263"; break;
47*bebae9c0SAndroid Build Coastguard Worker case XA_VIDEOCODEC_MPEG4: return "XA_VIDEOCODEC_MPEG4"; break;
48*bebae9c0SAndroid Build Coastguard Worker case XA_VIDEOCODEC_AVC: return "XA_VIDEOCODEC_AVC"; break;
49*bebae9c0SAndroid Build Coastguard Worker case XA_VIDEOCODEC_VC1: return "XA_VIDEOCODEC_VC1"; break;
50*bebae9c0SAndroid Build Coastguard Worker case XA_ANDROID_VIDEOCODEC_VP8: return "XA_ANDROID_VIDEOCODEC_VP8"; break;
51*bebae9c0SAndroid Build Coastguard Worker default:
52*bebae9c0SAndroid Build Coastguard Worker sprintf(unknown, "Video codec %d unknown to OpenMAX AL", decoderId);
53*bebae9c0SAndroid Build Coastguard Worker return unknown;
54*bebae9c0SAndroid Build Coastguard Worker }
55*bebae9c0SAndroid Build Coastguard Worker }
56*bebae9c0SAndroid Build Coastguard Worker
57*bebae9c0SAndroid Build Coastguard Worker // Use a table of [integer, string] entries to map an integer to a string
58*bebae9c0SAndroid Build Coastguard Worker
59*bebae9c0SAndroid Build Coastguard Worker typedef struct {
60*bebae9c0SAndroid Build Coastguard Worker XAuint32 id;
61*bebae9c0SAndroid Build Coastguard Worker const char *string;
62*bebae9c0SAndroid Build Coastguard Worker } id_to_string_t;
63*bebae9c0SAndroid Build Coastguard Worker
id_to_string(XAuint32 id,const id_to_string_t * table,size_t numEntries)64*bebae9c0SAndroid Build Coastguard Worker const char *id_to_string(XAuint32 id, const id_to_string_t *table, size_t numEntries)
65*bebae9c0SAndroid Build Coastguard Worker {
66*bebae9c0SAndroid Build Coastguard Worker size_t i;
67*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < numEntries; ++i) {
68*bebae9c0SAndroid Build Coastguard Worker if (id == table[i].id) {
69*bebae9c0SAndroid Build Coastguard Worker return table[i].string;
70*bebae9c0SAndroid Build Coastguard Worker }
71*bebae9c0SAndroid Build Coastguard Worker }
72*bebae9c0SAndroid Build Coastguard Worker return "Unknown";
73*bebae9c0SAndroid Build Coastguard Worker }
74*bebae9c0SAndroid Build Coastguard Worker
75*bebae9c0SAndroid Build Coastguard Worker // Use a table of [integer, table] entries to map a pair of integers to a string
76*bebae9c0SAndroid Build Coastguard Worker
77*bebae9c0SAndroid Build Coastguard Worker typedef struct {
78*bebae9c0SAndroid Build Coastguard Worker XAuint32 id1;
79*bebae9c0SAndroid Build Coastguard Worker const id_to_string_t *id2_table;
80*bebae9c0SAndroid Build Coastguard Worker size_t id2_numEntries;
81*bebae9c0SAndroid Build Coastguard Worker } id_pair_to_string_t;
82*bebae9c0SAndroid Build Coastguard Worker
id_pair_to_string(XAuint32 id1,XAuint32 id2,const id_pair_to_string_t * table,size_t numEntries)83*bebae9c0SAndroid Build Coastguard Worker const char *id_pair_to_string(XAuint32 id1, XAuint32 id2, const id_pair_to_string_t *table,
84*bebae9c0SAndroid Build Coastguard Worker size_t numEntries)
85*bebae9c0SAndroid Build Coastguard Worker {
86*bebae9c0SAndroid Build Coastguard Worker size_t i;
87*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < numEntries; ++i) {
88*bebae9c0SAndroid Build Coastguard Worker if (id1 == table[i].id1) {
89*bebae9c0SAndroid Build Coastguard Worker return id_to_string(id2, table[i].id2_table, table[i].id2_numEntries);
90*bebae9c0SAndroid Build Coastguard Worker }
91*bebae9c0SAndroid Build Coastguard Worker }
92*bebae9c0SAndroid Build Coastguard Worker return "Unknown";
93*bebae9c0SAndroid Build Coastguard Worker }
94*bebae9c0SAndroid Build Coastguard Worker
95*bebae9c0SAndroid Build Coastguard Worker // Map a video codec and profile to string
96*bebae9c0SAndroid Build Coastguard Worker
videoProfileToString(XAuint32 codec,XAuint32 profile)97*bebae9c0SAndroid Build Coastguard Worker const char *videoProfileToString(XAuint32 codec, XAuint32 profile) {
98*bebae9c0SAndroid Build Coastguard Worker // http://en.wikipedia.org/wiki/H.262/MPEG-2_Part_2
99*bebae9c0SAndroid Build Coastguard Worker static const id_to_string_t MPEG2[] = {
100*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_SIMPLE, "Simple"},
101*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_MAIN, "Main"},
102*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_422, "4:2:2"},
103*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_SNR, "SNR Scalable"},
104*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_SPATIAL, "Spatially Scalable"},
105*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG2_HIGH, "High"},
106*bebae9c0SAndroid Build Coastguard Worker }, H263[] = {
107*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_BASELINE, "baseline"},
108*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_H320CODING, "H320 coding"},
109*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_BACKWARDCOMPATIBLE, "backwards compatible"},
110*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_ISWV2, "isw v2"},
111*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_ISWV3, "isw v3"},
112*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_HIGHCOMPRESSION, "high compression"},
113*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_INTERNET, "internet"},
114*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_INTERLACE, "interlace"},
115*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_H263_HIGHLATENCY, "high latency"},
116*bebae9c0SAndroid Build Coastguard Worker }, MPEG4[] = {
117*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_SIMPLE, "simple"},
118*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_SIMPLESCALABLE, "simple scalable"},
119*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_CORE, "core"},
120*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_MAIN, "main"},
121*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_NBIT, "nbit"},
122*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_SCALABLETEXTURE, "scalable texture"},
123*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_SIMPLEFACE, "simple face"},
124*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_SIMPLEFBA, "simple fba"},
125*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_BASICANIMATED, "basic animated"},
126*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_HYBRID, "hybrid"},
127*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_ADVANCEDREALTIME, "advanced realtime"},
128*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_CORESCALABLE, "core scalable"},
129*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_ADVANCEDCODING, "advanced coding"},
130*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_ADVANCEDCORE, "advanced core"},
131*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_MPEG4_ADVANCEDSCALABLE, "advanced scalable"},
132*bebae9c0SAndroid Build Coastguard Worker // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL
133*bebae9c0SAndroid Build Coastguard Worker {16, "advanced simple"},
134*bebae9c0SAndroid Build Coastguard Worker }, AVC[] = {
135*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_BASELINE, "Baseline"},
136*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_MAIN, "Main"},
137*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_EXTENDED, "Extended"},
138*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_HIGH, "High"},
139*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_HIGH10, "High 10"},
140*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_HIGH422, "High 4:2:2"},
141*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOPROFILE_AVC_HIGH444, "High 4:4:4"},
142*bebae9c0SAndroid Build Coastguard Worker }, VC1[] = {
143*bebae9c0SAndroid Build Coastguard Worker // FIXME sic should be XA_VIDEOPROFILE_*
144*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_SIMPLE, "simple"},
145*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_MAIN, "main"},
146*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_ADVANCED, "advanced"},
147*bebae9c0SAndroid Build Coastguard Worker };
148*bebae9c0SAndroid Build Coastguard Worker static const id_pair_to_string_t table[] = {
149*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])},
150*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_H263, H263, sizeof(H263) / sizeof(H263[0])},
151*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])},
152*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_AVC, AVC, sizeof(AVC) / sizeof(AVC[0])},
153*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_VC1, VC1, sizeof(VC1) / sizeof(VC1[0])},
154*bebae9c0SAndroid Build Coastguard Worker };
155*bebae9c0SAndroid Build Coastguard Worker return id_pair_to_string(codec, profile, table, sizeof(table) / sizeof(table[0]));
156*bebae9c0SAndroid Build Coastguard Worker }
157*bebae9c0SAndroid Build Coastguard Worker
158*bebae9c0SAndroid Build Coastguard Worker // Map a video codec and level to string
159*bebae9c0SAndroid Build Coastguard Worker
videoLevelToString(XAuint32 codec,XAuint32 level)160*bebae9c0SAndroid Build Coastguard Worker const char* videoLevelToString(XAuint32 codec, XAuint32 level) {
161*bebae9c0SAndroid Build Coastguard Worker static const id_to_string_t MPEG2[] = {
162*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG2_LL, "Low"},
163*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG2_ML, "Main"},
164*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG2_H14, "H-14"},
165*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG2_HL, "High"},
166*bebae9c0SAndroid Build Coastguard Worker }, H263[]= {
167*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_10, "10"},
168*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_20, "20"},
169*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_30, "30"},
170*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_40, "40"},
171*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_45, "45"},
172*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_50, "50"},
173*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_60, "60"},
174*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_H263_70, "70"},
175*bebae9c0SAndroid Build Coastguard Worker }, MPEG4[] = {
176*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_0, "0"},
177*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_0b, "0b"},
178*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_1, "1"},
179*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_2, "2"},
180*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_3, "3"},
181*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_4, "4"},
182*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_MPEG4_4a, "4a"},
183*bebae9c0SAndroid Build Coastguard Worker // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL
184*bebae9c0SAndroid Build Coastguard Worker {8, "5"},
185*bebae9c0SAndroid Build Coastguard Worker }, AVC[] = {
186*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_1, "1"},
187*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_1B, "1B"},
188*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_11, "1.1"},
189*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_12, "1.2"},
190*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_13, "1.3"},
191*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_2, "2"},
192*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_21, "2.1"},
193*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_22, "2.2"},
194*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_3, "3"},
195*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_31, "3.1"},
196*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_32, "3.2"},
197*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_4, "4"},
198*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_41, "4.1"},
199*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_42, "4.2"},
200*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_5, "5"},
201*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_AVC_51, "5.1"},
202*bebae9c0SAndroid Build Coastguard Worker }, VC1[] = {
203*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_LOW, "Low"},
204*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_MEDIUM, "Medium"},
205*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_HIGH, "High"},
206*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_L0, "L0"},
207*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_L1, "L1"},
208*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_L2, "L2"},
209*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_L3, "L3"},
210*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOLEVEL_VC1_L4, "L4"},
211*bebae9c0SAndroid Build Coastguard Worker };
212*bebae9c0SAndroid Build Coastguard Worker static const id_pair_to_string_t table[] = {
213*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])},
214*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_H263, H263, sizeof(H263) / sizeof(H263[0])},
215*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])},
216*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_AVC, AVC, sizeof(AVC) / sizeof(AVC[0])},
217*bebae9c0SAndroid Build Coastguard Worker {XA_VIDEOCODEC_VC1, VC1, sizeof(VC1) / sizeof(VC1[0])},
218*bebae9c0SAndroid Build Coastguard Worker };
219*bebae9c0SAndroid Build Coastguard Worker return id_pair_to_string(codec, level, table, sizeof(table) / sizeof(table[0]));
220*bebae9c0SAndroid Build Coastguard Worker }
221*bebae9c0SAndroid Build Coastguard Worker
222*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------
TestVideoDecoderCapabilities()223*bebae9c0SAndroid Build Coastguard Worker void TestVideoDecoderCapabilities() {
224*bebae9c0SAndroid Build Coastguard Worker
225*bebae9c0SAndroid Build Coastguard Worker XAObjectItf xa;
226*bebae9c0SAndroid Build Coastguard Worker XAresult res;
227*bebae9c0SAndroid Build Coastguard Worker
228*bebae9c0SAndroid Build Coastguard Worker /* parameters for the OpenMAX AL engine creation */
229*bebae9c0SAndroid Build Coastguard Worker XAEngineOption EngineOption[] = {
230*bebae9c0SAndroid Build Coastguard Worker {(XAuint32) XA_ENGINEOPTION_THREADSAFE, (XAuint32) XA_BOOLEAN_TRUE}
231*bebae9c0SAndroid Build Coastguard Worker };
232*bebae9c0SAndroid Build Coastguard Worker XAInterfaceID itfIidArray[NUM_ENGINE_INTERFACES] = { XA_IID_VIDEODECODERCAPABILITIES };
233*bebae9c0SAndroid Build Coastguard Worker XAboolean itfRequired[NUM_ENGINE_INTERFACES] = { XA_BOOLEAN_TRUE };
234*bebae9c0SAndroid Build Coastguard Worker
235*bebae9c0SAndroid Build Coastguard Worker /* create OpenMAX AL engine */
236*bebae9c0SAndroid Build Coastguard Worker res = xaCreateEngine( &xa, 1, EngineOption, NUM_ENGINE_INTERFACES, itfIidArray, itfRequired);
237*bebae9c0SAndroid Build Coastguard Worker ExitOnError(res);
238*bebae9c0SAndroid Build Coastguard Worker
239*bebae9c0SAndroid Build Coastguard Worker /* realize the engine in synchronous mode. */
240*bebae9c0SAndroid Build Coastguard Worker res = (*xa)->Realize(xa, XA_BOOLEAN_FALSE); ExitOnError(res);
241*bebae9c0SAndroid Build Coastguard Worker
242*bebae9c0SAndroid Build Coastguard Worker /* Get the video decoder capabilities interface which was explicitly requested */
243*bebae9c0SAndroid Build Coastguard Worker XAVideoDecoderCapabilitiesItf decItf;
244*bebae9c0SAndroid Build Coastguard Worker res = (*xa)->GetInterface(xa, XA_IID_VIDEODECODERCAPABILITIES, (void*)&decItf);
245*bebae9c0SAndroid Build Coastguard Worker ExitOnError(res);
246*bebae9c0SAndroid Build Coastguard Worker
247*bebae9c0SAndroid Build Coastguard Worker /* Query the platform capabilities */
248*bebae9c0SAndroid Build Coastguard Worker XAuint32 numDecoders = 0;
249*bebae9c0SAndroid Build Coastguard Worker XAuint32 *decoderIds = NULL;
250*bebae9c0SAndroid Build Coastguard Worker
251*bebae9c0SAndroid Build Coastguard Worker /* -> Number of decoders */
252*bebae9c0SAndroid Build Coastguard Worker res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, NULL); ExitOnError(res);
253*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "Found %d video decoders\n", numDecoders);
254*bebae9c0SAndroid Build Coastguard Worker if (0 == numDecoders) {
255*bebae9c0SAndroid Build Coastguard Worker fprintf(stderr, "0 video decoders is not an acceptable number, exiting\n");
256*bebae9c0SAndroid Build Coastguard Worker goto destroyRes;
257*bebae9c0SAndroid Build Coastguard Worker }
258*bebae9c0SAndroid Build Coastguard Worker
259*bebae9c0SAndroid Build Coastguard Worker /* -> Decoder list */
260*bebae9c0SAndroid Build Coastguard Worker decoderIds = (XAuint32 *) malloc(numDecoders * sizeof(XAuint32));
261*bebae9c0SAndroid Build Coastguard Worker res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, decoderIds); ExitOnError(res);
262*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "Decoders:\n");
263*bebae9c0SAndroid Build Coastguard Worker for(XAuint32 i = 0 ; i < numDecoders ; i++) {
264*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "decoder %d is %s\n", i, videoCodecIdToString(decoderIds[i]));
265*bebae9c0SAndroid Build Coastguard Worker }
266*bebae9c0SAndroid Build Coastguard Worker
267*bebae9c0SAndroid Build Coastguard Worker /* -> Decoder capabilities */
268*bebae9c0SAndroid Build Coastguard Worker /* for each decoder */
269*bebae9c0SAndroid Build Coastguard Worker for(XAuint32 i = 0 ; i < numDecoders ; i++) {
270*bebae9c0SAndroid Build Coastguard Worker XAuint32 nbCombinations = 0;
271*bebae9c0SAndroid Build Coastguard Worker /* get the number of profile / level combinations */
272*bebae9c0SAndroid Build Coastguard Worker res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &nbCombinations, NULL);
273*bebae9c0SAndroid Build Coastguard Worker ExitOnError(res);
274*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "decoder %s has %d profile/level combinations:\n\t",
275*bebae9c0SAndroid Build Coastguard Worker videoCodecIdToString(decoderIds[i]), nbCombinations);
276*bebae9c0SAndroid Build Coastguard Worker /* display the profile / level combinations */
277*bebae9c0SAndroid Build Coastguard Worker for(XAuint32 pl = 0 ; pl < nbCombinations ; pl++) {
278*bebae9c0SAndroid Build Coastguard Worker XAVideoCodecDescriptor decDescriptor;
279*bebae9c0SAndroid Build Coastguard Worker XAuint32 decoder = decoderIds[i];
280*bebae9c0SAndroid Build Coastguard Worker res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoder, &pl, &decDescriptor);
281*bebae9c0SAndroid Build Coastguard Worker ExitOnError(res);
282*bebae9c0SAndroid Build Coastguard Worker XAuint32 profile = decDescriptor.profileSetting;
283*bebae9c0SAndroid Build Coastguard Worker XAuint32 level = decDescriptor.levelSetting;
284*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "%u/%u ", profile, level);
285*bebae9c0SAndroid Build Coastguard Worker ExitOnError(res);
286*bebae9c0SAndroid Build Coastguard Worker printf("(%s/%s) ", videoProfileToString(decoder, profile),
287*bebae9c0SAndroid Build Coastguard Worker videoLevelToString(decoder, level));
288*bebae9c0SAndroid Build Coastguard Worker }
289*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "\n");
290*bebae9c0SAndroid Build Coastguard Worker }
291*bebae9c0SAndroid Build Coastguard Worker
292*bebae9c0SAndroid Build Coastguard Worker destroyRes:
293*bebae9c0SAndroid Build Coastguard Worker free(decoderIds);
294*bebae9c0SAndroid Build Coastguard Worker
295*bebae9c0SAndroid Build Coastguard Worker /* shutdown OpenMAX AL */
296*bebae9c0SAndroid Build Coastguard Worker (*xa)->Destroy(xa);
297*bebae9c0SAndroid Build Coastguard Worker }
298*bebae9c0SAndroid Build Coastguard Worker
299*bebae9c0SAndroid Build Coastguard Worker
300*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------
main(int argc __unused,char * const argv[])301*bebae9c0SAndroid Build Coastguard Worker int main(int argc __unused, char* const argv[])
302*bebae9c0SAndroid Build Coastguard Worker {
303*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "OpenMAX AL test %s: exercises SLAudioDecoderCapabiltiesItf ", argv[0]);
304*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "and displays the list of supported video decoders, and for each, lists the ");
305*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "profile / levels combinations, that map to the constants defined in ");
306*bebae9c0SAndroid Build Coastguard Worker fprintf(stdout, "\"XA_VIDEOPROFILE and XA_VIDEOLEVEL\" section of the specification\n\n");
307*bebae9c0SAndroid Build Coastguard Worker
308*bebae9c0SAndroid Build Coastguard Worker TestVideoDecoderCapabilities();
309*bebae9c0SAndroid Build Coastguard Worker
310*bebae9c0SAndroid Build Coastguard Worker return EXIT_SUCCESS;
311*bebae9c0SAndroid Build Coastguard Worker }
312