xaVideoDecoderCapabilities.cpp revision 947ccd3690e84649878f2583c701ca8de1b19ed4
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
29char unknown[50];
30
31//-----------------------------------------------------------------
32/* Exits the application if an error is encountered */
33#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__)
34
35void 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
43const 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//-----------------------------------------------------------------
58void 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
122destroyRes:
123    free(decoderIds);
124
125    /* shutdown OpenMAX AL */
126    (*xa)->Destroy(xa);
127}
128
129
130//-----------------------------------------------------------------
131int 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