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