16e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi/* 26e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * Copyright (C) 2011 The Android Open Source Project 36e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * 46e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 56e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * you may not use this file except in compliance with the License. 66e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * You may obtain a copy of the License at 76e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * 86e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 96e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * 106e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 116e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 126e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * See the License for the specific language governing permissions and 146e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi * limitations under the License. 156e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi */ 166e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 176e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <stdlib.h> 186e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <stdio.h> 196e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <string.h> 206e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <unistd.h> 216e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <sys/time.h> 226e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#include <fcntl.h> 236e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 24c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <OMXAL/OpenMAXAL.h> 25c6853892c94800e72c0bd676d5d2136d48cea76eGlenn Kasten#include <OMXAL/OpenMAXAL_Android.h> // for VP8 definitions 266e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 276e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#define NUM_ENGINE_INTERFACES 1 286e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 296e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivichar unknown[50]; 306e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 316e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi//----------------------------------------------------------------- 326e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi/* Exits the application if an error is encountered */ 336e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#define ExitOnError(x) ExitOnErrorFunc(x,__LINE__) 346e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 356e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivivoid ExitOnErrorFunc( XAresult result , int line) 366e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi{ 376e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi if (XA_RESULT_SUCCESS != result) { 386e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stderr, "Error %u encountered at line %d, exiting\n", result, line); 396e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi exit(EXIT_FAILURE); 406e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 416e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi} 426e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 436e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Triviconst char* videoCodecIdToString(XAuint32 decoderId) { 446e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi switch(decoderId) { 456e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_VIDEOCODEC_MPEG2: return "XA_VIDEOCODEC_MPEG2"; break; 466e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_VIDEOCODEC_H263: return "XA_VIDEOCODEC_H263"; break; 476e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_VIDEOCODEC_MPEG4: return "XA_VIDEOCODEC_MPEG4"; break; 486e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_VIDEOCODEC_AVC: return "XA_VIDEOCODEC_AVC"; break; 496e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_VIDEOCODEC_VC1: return "XA_VIDEOCODEC_VC1"; break; 506e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi case XA_ANDROID_VIDEOCODEC_VP8: return "XA_ANDROID_VIDEOCODEC_VP8"; break; 516e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi default: 526e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi sprintf(unknown, "Video codec %d unknown to OpenMAX AL", decoderId); 536e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi return unknown; 546e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 556e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi} 566e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 57dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten// Use a table of [integer, string] entries to map an integer to a string 58dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 59dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastentypedef struct { 60dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten XAuint32 id; 61dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten const char *string; 62dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} id_to_string_t; 63dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 64dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastenconst char *id_to_string(XAuint32 id, const id_to_string_t *table, size_t numEntries) 65dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten{ 66dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten size_t i; 67dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten for (i = 0; i < numEntries; ++i) { 68dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten if (id == table[i].id) { 69dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return table[i].string; 70dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten } 71dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten } 72dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return "Unknown"; 73dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} 74dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 75dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten// Use a table of [integer, table] entries to map a pair of integers to a string 76dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 77dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastentypedef struct { 78dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten XAuint32 id1; 79dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten const id_to_string_t *id2_table; 80dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten size_t id2_numEntries; 81dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} id_pair_to_string_t; 82dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 83dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastenconst char *id_pair_to_string(XAuint32 id1, XAuint32 id2, const id_pair_to_string_t *table, 84dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten size_t numEntries) 85dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten{ 86dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten size_t i; 87dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten for (i = 0; i < numEntries; ++i) { 88dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten if (id1 == table[i].id1) { 89dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return id_to_string(id2, table[i].id2_table, table[i].id2_numEntries); 90dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten } 91dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten } 92dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return "Unknown"; 93dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} 94dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 95dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten// Map a video codec and profile to string 96dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 97dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastenconst char *videoProfileToString(XAuint32 codec, XAuint32 profile) { 98dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten // http://en.wikipedia.org/wiki/H.262/MPEG-2_Part_2 99dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten static const id_to_string_t MPEG2[] = { 100dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_SIMPLE, "Simple"}, 101dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_MAIN, "Main"}, 102dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_422, "4:2:2"}, 103dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_SNR, "SNR Scalable"}, 104dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_SPATIAL, "Spatially Scalable"}, 105dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG2_HIGH, "High"}, 106dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, H263[] = { 107dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_BASELINE, "baseline"}, 108dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_H320CODING, "H320 coding"}, 109dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_BACKWARDCOMPATIBLE, "backwards compatible"}, 110dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_ISWV2, "isw v2"}, 111dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_ISWV3, "isw v3"}, 112dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_HIGHCOMPRESSION, "high compression"}, 113dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_INTERNET, "internet"}, 114dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_INTERLACE, "interlace"}, 115dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_H263_HIGHLATENCY, "high latency"}, 116dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, MPEG4[] = { 117dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_SIMPLE, "simple"}, 118dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_SIMPLESCALABLE, "simple scalable"}, 119dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_CORE, "core"}, 120dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_MAIN, "main"}, 121dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_NBIT, "nbit"}, 122dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_SCALABLETEXTURE, "scalable texture"}, 123dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_SIMPLEFACE, "simple face"}, 124dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_SIMPLEFBA, "simple fba"}, 125dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_BASICANIMATED, "basic animated"}, 126dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_HYBRID, "hybrid"}, 127dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_ADVANCEDREALTIME, "advanced realtime"}, 128dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_CORESCALABLE, "core scalable"}, 129dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_ADVANCEDCODING, "advanced coding"}, 130dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_ADVANCEDCORE, "advanced core"}, 131dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_MPEG4_ADVANCEDSCALABLE, "advanced scalable"}, 132dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL 133dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {16, "advanced simple"}, 134dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, AVC[] = { 135dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_BASELINE, "Baseline"}, 136dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_MAIN, "Main"}, 137dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_EXTENDED, "Extended"}, 138dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_HIGH, "High"}, 139dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_HIGH10, "High 10"}, 140dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_HIGH422, "High 4:2:2"}, 141dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOPROFILE_AVC_HIGH444, "High 4:4:4"}, 142dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, VC1[] = { 143dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten // FIXME sic should be XA_VIDEOPROFILE_* 144dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_SIMPLE, "simple"}, 145dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_MAIN, "main"}, 146dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_ADVANCED, "advanced"}, 147dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }; 148dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten static const id_pair_to_string_t table[] = { 149dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])}, 150dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_H263, H263, sizeof(H263) / sizeof(H263[0])}, 151dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])}, 152dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_AVC, AVC, sizeof(AVC) / sizeof(AVC[0])}, 153dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_VC1, VC1, sizeof(VC1) / sizeof(VC1[0])}, 154dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }; 155dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return id_pair_to_string(codec, profile, table, sizeof(table) / sizeof(table[0])); 156dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} 157dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 158dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten// Map a video codec and level to string 159dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 160dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kastenconst char* videoLevelToString(XAuint32 codec, XAuint32 level) { 161dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten static const id_to_string_t MPEG2[] = { 162dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG2_LL, "Low"}, 163dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG2_ML, "Main"}, 164dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG2_H14, "H-14"}, 165dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG2_HL, "High"}, 166dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, H263[]= { 167dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_10, "10"}, 168dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_20, "20"}, 169dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_30, "30"}, 170dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_40, "40"}, 171dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_45, "45"}, 172dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_50, "50"}, 173dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_60, "60"}, 174dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_H263_70, "70"}, 175dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, MPEG4[] = { 176dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_0, "0"}, 177dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_0b, "0b"}, 178dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_1, "1"}, 179dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_2, "2"}, 180dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_3, "3"}, 181dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_4, "4"}, 182dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_MPEG4_4a, "4a"}, 183dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL 184dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {8, "5"}, 185dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, AVC[] = { 186dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_1, "1"}, 187dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_1B, "1B"}, 188dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_11, "1.1"}, 189dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_12, "1.2"}, 190dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_13, "1.3"}, 191dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_2, "2"}, 192dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_21, "2.1"}, 193dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_22, "2.2"}, 194dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_3, "3"}, 195dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_31, "3.1"}, 196dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_32, "3.2"}, 197dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_4, "4"}, 198dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_41, "4.1"}, 199dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_42, "4.2"}, 200dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_5, "5"}, 201dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_AVC_51, "5.1"}, 202dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }, VC1[] = { 203dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_LOW, "Low"}, 204dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_MEDIUM, "Medium"}, 205dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_HIGH, "High"}, 206dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_L0, "L0"}, 207dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_L1, "L1"}, 208dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_L2, "L2"}, 209dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_L3, "L3"}, 210dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOLEVEL_VC1_L4, "L4"}, 211dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }; 212dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten static const id_pair_to_string_t table[] = { 213dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])}, 214dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_H263, H263, sizeof(H263) / sizeof(H263[0])}, 215dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])}, 216dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_AVC, AVC, sizeof(AVC) / sizeof(AVC[0])}, 217dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten {XA_VIDEOCODEC_VC1, VC1, sizeof(VC1) / sizeof(VC1[0])}, 218dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten }; 219dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten return id_pair_to_string(codec, level, table, sizeof(table) / sizeof(table[0])); 220dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten} 221dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten 2226e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi//----------------------------------------------------------------- 2236e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivivoid TestVideoDecoderCapabilities() { 2246e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2256e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAObjectItf xa; 2266e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAresult res; 2276e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2286e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* parameters for the OpenMAX AL engine creation */ 2296e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAEngineOption EngineOption[] = { 2306e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi {(XAuint32) XA_ENGINEOPTION_THREADSAFE, (XAuint32) XA_BOOLEAN_TRUE} 2316e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi }; 2326e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAInterfaceID itfIidArray[NUM_ENGINE_INTERFACES] = { XA_IID_VIDEODECODERCAPABILITIES }; 2336e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAboolean itfRequired[NUM_ENGINE_INTERFACES] = { XA_BOOLEAN_TRUE }; 2346e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2356e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* create OpenMAX AL engine */ 2366e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = xaCreateEngine( &xa, 1, EngineOption, NUM_ENGINE_INTERFACES, itfIidArray, itfRequired); 2376e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi ExitOnError(res); 2386e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2396e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* realize the engine in synchronous mode. */ 2406e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = (*xa)->Realize(xa, XA_BOOLEAN_FALSE); ExitOnError(res); 2416e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2426e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* Get the video decoder capabilities interface which was explicitly requested */ 2436e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAVideoDecoderCapabilitiesItf decItf; 2446e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = (*xa)->GetInterface(xa, XA_IID_VIDEODECODERCAPABILITIES, (void*)&decItf); 2456e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi ExitOnError(res); 2466e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2476e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* Query the platform capabilities */ 2486e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAuint32 numDecoders = 0; 2496e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAuint32 *decoderIds = NULL; 2506e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2516e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* -> Number of decoders */ 2526e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, NULL); ExitOnError(res); 2536e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "Found %d video decoders\n", numDecoders); 2546e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi if (0 == numDecoders) { 2556e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stderr, "0 video decoders is not an acceptable number, exiting\n"); 2566e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi goto destroyRes; 2576e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 2586e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2596e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* -> Decoder list */ 2606e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi decoderIds = (XAuint32 *) malloc(numDecoders * sizeof(XAuint32)); 2616e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = (*decItf)->GetVideoDecoders(decItf, &numDecoders, decoderIds); ExitOnError(res); 2626e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "Decoders:\n"); 2636e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi for(XAuint32 i = 0 ; i < numDecoders ; i++) { 2646e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "decoder %d is %s\n", i, videoCodecIdToString(decoderIds[i])); 2656e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 2666e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2676e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* -> Decoder capabilities */ 2686e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* for each decoder */ 2696e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi for(XAuint32 i = 0 ; i < numDecoders ; i++) { 2706e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAuint32 nbCombinations = 0; 2716e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* get the number of profile / level combinations */ 2726e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &nbCombinations, NULL); 273947ccd3690e84649878f2583c701ca8de1b19ed4Glenn Kasten ExitOnError(res); 2746e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "decoder %s has %d profile/level combinations:\n\t", 2756e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi videoCodecIdToString(decoderIds[i]), nbCombinations); 2766e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* display the profile / level combinations */ 2776e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi for(XAuint32 pl = 0 ; pl < nbCombinations ; pl++) { 2786e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAVideoCodecDescriptor decDescriptor; 279dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten XAuint32 decoder = decoderIds[i]; 280dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoder, &pl, &decDescriptor); 2816e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi ExitOnError(res); 282dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten XAuint32 profile = decDescriptor.profileSetting; 283dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten XAuint32 level = decDescriptor.levelSetting; 284dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten fprintf(stdout, "%u/%u ", profile, level); 2856e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi ExitOnError(res); 286dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten printf("(%s/%s) ", videoProfileToString(decoder, profile), 287dcc6a97a16b6536f455f29a03c02295c39583dcdGlenn Kasten videoLevelToString(decoder, level)); 2886e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 2896e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "\n"); 2906e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi } 2916e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2926e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel TrividestroyRes: 2936e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi free(decoderIds); 2946e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2956e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi /* shutdown OpenMAX AL */ 2966e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi (*xa)->Destroy(xa); 2976e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi} 2986e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 2996e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 3006e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi//----------------------------------------------------------------- 3016e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Triviint main(int argc, char* const argv[]) 3026e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi{ 3036e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAresult result; 3046e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi XAObjectItf sl; 3056e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 3066e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "OpenMAX AL test %s: exercises SLAudioDecoderCapabiltiesItf ", argv[0]); 3076e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "and displays the list of supported video decoders, and for each, lists the "); 3086e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "profile / levels combinations, that map to the constants defined in "); 3096e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi fprintf(stdout, "\"XA_VIDEOPROFILE and XA_VIDEOLEVEL\" section of the specification\n\n"); 3106e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 3116e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi TestVideoDecoderCapabilities(); 3126e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi 3136e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi return EXIT_SUCCESS; 3146e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi} 315