xref: /aosp_15_r20/frameworks/wilhelm/tests/examples/xaVideoDecoderCapabilities.cpp (revision bebae9c0e76121f8312ccb50385c080b3a0b023c)
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