/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include // for VP8 definitions #define NUM_ENGINE_INTERFACES 1 char unknown[50]; //----------------------------------------------------------------- /* Exits the application if an error is encountered */ #define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) void ExitOnErrorFunc( XAresult result , int line) { if (XA_RESULT_SUCCESS != result) { fprintf(stderr, "Error %u encountered at line %d, exiting\n", result, line); exit(EXIT_FAILURE); } } const char* videoCodecIdToString(XAuint32 decoderId) { switch(decoderId) { case XA_VIDEOCODEC_MPEG2: return "XA_VIDEOCODEC_MPEG2"; break; case XA_VIDEOCODEC_H263: return "XA_VIDEOCODEC_H263"; break; case XA_VIDEOCODEC_MPEG4: return "XA_VIDEOCODEC_MPEG4"; break; case XA_VIDEOCODEC_AVC: return "XA_VIDEOCODEC_AVC"; break; case XA_VIDEOCODEC_VC1: return "XA_VIDEOCODEC_VC1"; break; case XA_ANDROID_VIDEOCODEC_VP8: return "XA_ANDROID_VIDEOCODEC_VP8"; break; default: sprintf(unknown, "Video codec %d unknown to OpenMAX AL", decoderId); return unknown; } } //----------------------------------------------------------------- void TestVideoDecoderCapabilities() { XAObjectItf xa; XAresult res; /* parameters for the OpenMAX AL engine creation */ XAEngineOption EngineOption[] = { {(XAuint32) XA_ENGINEOPTION_THREADSAFE, (XAuint32) XA_BOOLEAN_TRUE} }; XAInterfaceID itfIidArray[NUM_ENGINE_INTERFACES] = { XA_IID_VIDEODECODERCAPABILITIES }; XAboolean itfRequired[NUM_ENGINE_INTERFACES] = { XA_BOOLEAN_TRUE }; /* create OpenMAX AL engine */ res = xaCreateEngine( &xa, 1, EngineOption, NUM_ENGINE_INTERFACES, itfIidArray, itfRequired); ExitOnError(res); /* realize the engine in synchronous mode. */ res = (*xa)->Realize(xa, XA_BOOLEAN_FALSE); ExitOnError(res); /* Get the video decoder capabilities interface which was explicitly requested */ XAVideoDecoderCapabilitiesItf decItf; res = (*xa)->GetInterface(xa, XA_IID_VIDEODECODERCAPABILITIES, (void*)&decItf); ExitOnError(res); /* Query the platform capabilities */ XAuint32 numDecoders = 0; XAuint32 *decoderIds = NULL; /* -> Number of decoders */ res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, NULL); ExitOnError(res); fprintf(stdout, "Found %d video decoders\n", numDecoders); if (0 == numDecoders) { fprintf(stderr, "0 video decoders is not an acceptable number, exiting\n"); goto destroyRes; } /* -> Decoder list */ decoderIds = (XAuint32 *) malloc(numDecoders * sizeof(XAuint32)); res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, decoderIds); ExitOnError(res); fprintf(stdout, "Decoders:\n"); for(XAuint32 i = 0 ; i < numDecoders ; i++) { fprintf(stdout, "decoder %d is %s\n", i, videoCodecIdToString(decoderIds[i])); } /* -> Decoder capabilities */ /* for each decoder */ for(XAuint32 i = 0 ; i < numDecoders ; i++) { XAuint32 nbCombinations = 0; /* get the number of profile / level combinations */ res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &nbCombinations, NULL); ExitOnError(res); fprintf(stdout, "decoder %s has %d profile/level combinations:\n\t", videoCodecIdToString(decoderIds[i]), nbCombinations); /* display the profile / level combinations */ for(XAuint32 pl = 0 ; pl < nbCombinations ; pl++) { XAVideoCodecDescriptor decDescriptor; res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &pl, &decDescriptor); ExitOnError(res); fprintf(stdout, "%u/%u ", decDescriptor.profileSetting, decDescriptor.levelSetting); ExitOnError(res); } fprintf(stdout, "\n"); } destroyRes: free(decoderIds); /* shutdown OpenMAX AL */ (*xa)->Destroy(xa); } //----------------------------------------------------------------- int main(int argc, char* const argv[]) { XAresult result; XAObjectItf sl; fprintf(stdout, "OpenMAX AL test %s: exercises SLAudioDecoderCapabiltiesItf ", argv[0]); fprintf(stdout, "and displays the list of supported video decoders, and for each, lists the "); fprintf(stdout, "profile / levels combinations, that map to the constants defined in "); fprintf(stdout, "\"XA_VIDEOPROFILE and XA_VIDEOLEVEL\" section of the specification\n\n"); TestVideoDecoderCapabilities(); return EXIT_SUCCESS; }