• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <unistd.h>
21 #include <sys/time.h>
22 #include <fcntl.h>
23 
24 #include <OMXAL/OpenMAXAL.h>
25 #include <OMXAL/OpenMAXAL_Android.h> // for VP8 definitions
26 
27 #define NUM_ENGINE_INTERFACES 1
28 
29 char unknown[50];
30 
31 //-----------------------------------------------------------------
32 /* Exits the application if an error is encountered */
33 #define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
34 
ExitOnErrorFunc(XAresult result,int line)35 void ExitOnErrorFunc( XAresult result , int line)
36 {
37     if (XA_RESULT_SUCCESS != result) {
38         fprintf(stderr, "Error %u encountered at line %d, exiting\n", result, line);
39         exit(EXIT_FAILURE);
40     }
41 }
42 
videoCodecIdToString(XAuint32 decoderId)43 const char* videoCodecIdToString(XAuint32 decoderId) {
44     switch(decoderId) {
45     case XA_VIDEOCODEC_MPEG2: return "XA_VIDEOCODEC_MPEG2"; break;
46     case XA_VIDEOCODEC_H263: return "XA_VIDEOCODEC_H263"; break;
47     case XA_VIDEOCODEC_MPEG4: return "XA_VIDEOCODEC_MPEG4"; break;
48     case XA_VIDEOCODEC_AVC: return "XA_VIDEOCODEC_AVC"; break;
49     case XA_VIDEOCODEC_VC1: return "XA_VIDEOCODEC_VC1"; break;
50     case XA_ANDROID_VIDEOCODEC_VP8: return "XA_ANDROID_VIDEOCODEC_VP8"; break;
51     default:
52         sprintf(unknown, "Video codec %d unknown to OpenMAX AL", decoderId);
53         return unknown;
54     }
55 }
56 
57 //-----------------------------------------------------------------
TestVideoDecoderCapabilities()58 void TestVideoDecoderCapabilities() {
59 
60     XAObjectItf xa;
61     XAresult res;
62 
63     /* parameters for the OpenMAX AL engine creation */
64     XAEngineOption EngineOption[] = {
65             {(XAuint32) XA_ENGINEOPTION_THREADSAFE, (XAuint32) XA_BOOLEAN_TRUE}
66     };
67     XAInterfaceID itfIidArray[NUM_ENGINE_INTERFACES] = { XA_IID_VIDEODECODERCAPABILITIES };
68     XAboolean     itfRequired[NUM_ENGINE_INTERFACES] = { XA_BOOLEAN_TRUE };
69 
70     /* create OpenMAX AL engine */
71     res = xaCreateEngine( &xa, 1, EngineOption, NUM_ENGINE_INTERFACES, itfIidArray, itfRequired);
72     ExitOnError(res);
73 
74     /* realize the engine in synchronous mode. */
75     res = (*xa)->Realize(xa, XA_BOOLEAN_FALSE); ExitOnError(res);
76 
77     /* Get the video decoder capabilities interface which was explicitly requested */
78     XAVideoDecoderCapabilitiesItf decItf;
79     res = (*xa)->GetInterface(xa, XA_IID_VIDEODECODERCAPABILITIES, (void*)&decItf);
80     ExitOnError(res);
81 
82     /* Query the platform capabilities */
83     XAuint32 numDecoders = 0;
84     XAuint32 *decoderIds = NULL;
85 
86     /* -> Number of decoders */
87     res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, NULL); ExitOnError(res);
88     fprintf(stdout, "Found %d video decoders\n", numDecoders);
89     if (0 == numDecoders) {
90         fprintf(stderr, "0 video decoders is not an acceptable number, exiting\n");
91         goto destroyRes;
92     }
93 
94     /* -> Decoder list */
95     decoderIds = (XAuint32 *) malloc(numDecoders * sizeof(XAuint32));
96     res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, decoderIds); ExitOnError(res);
97     fprintf(stdout, "Decoders:\n");
98     for(XAuint32 i = 0 ; i < numDecoders ; i++) {
99         fprintf(stdout, "decoder %d is %s\n", i, videoCodecIdToString(decoderIds[i]));
100     }
101 
102     /* -> Decoder capabilities */
103     /*       for each decoder  */
104     for(XAuint32 i = 0 ; i < numDecoders ; i++) {
105         XAuint32 nbCombinations = 0;
106         /* get the number of profile / level combinations */
107         res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &nbCombinations, NULL);
108         ExitOnError(res);
109         fprintf(stdout, "decoder %s has %d profile/level combinations:\n\t",
110                 videoCodecIdToString(decoderIds[i]), nbCombinations);
111         /* display the profile / level combinations */
112         for(XAuint32 pl = 0 ; pl < nbCombinations ; pl++) {
113             XAVideoCodecDescriptor decDescriptor;
114             res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &pl, &decDescriptor);
115             ExitOnError(res);
116             fprintf(stdout, "%u/%u ", decDescriptor.profileSetting, decDescriptor.levelSetting);
117             ExitOnError(res);
118         }
119         fprintf(stdout, "\n");
120     }
121 
122 destroyRes:
123     free(decoderIds);
124 
125     /* shutdown OpenMAX AL */
126     (*xa)->Destroy(xa);
127 }
128 
129 
130 //-----------------------------------------------------------------
main(int argc,char * const argv[])131 int main(int argc, char* const argv[])
132 {
133     XAresult    result;
134     XAObjectItf sl;
135 
136     fprintf(stdout, "OpenMAX AL test %s: exercises SLAudioDecoderCapabiltiesItf ", argv[0]);
137     fprintf(stdout, "and displays the list of supported video decoders, and for each, lists the ");
138     fprintf(stdout, "profile / levels combinations, that map to the constants defined in ");
139     fprintf(stdout, "\"XA_VIDEOPROFILE and XA_VIDEOLEVEL\" section of the specification\n\n");
140 
141     TestVideoDecoderCapabilities();
142 
143     return EXIT_SUCCESS;
144 }
145