Merge "Bug 5550980 test xaVideoDecoderCapabilities"
diff --git a/tests/examples/xaVideoDecoderCapabilities.cpp b/tests/examples/xaVideoDecoderCapabilities.cpp
index 0151228..67d7373 100644
--- a/tests/examples/xaVideoDecoderCapabilities.cpp
+++ b/tests/examples/xaVideoDecoderCapabilities.cpp
@@ -54,6 +54,171 @@
     }
 }
 
+// Use a table of [integer, string] entries to map an integer to a string
+
+typedef struct {
+    XAuint32 id;
+    const char *string;
+} id_to_string_t;
+
+const char *id_to_string(XAuint32 id, const id_to_string_t *table, size_t numEntries)
+{
+    size_t i;
+    for (i = 0; i < numEntries; ++i) {
+        if (id == table[i].id) {
+            return table[i].string;
+        }
+    }
+    return "Unknown";
+}
+
+// Use a table of [integer, table] entries to map a pair of integers to a string
+
+typedef struct {
+    XAuint32 id1;
+    const id_to_string_t *id2_table;
+    size_t id2_numEntries;
+} id_pair_to_string_t;
+
+const char *id_pair_to_string(XAuint32 id1, XAuint32 id2, const id_pair_to_string_t *table,
+        size_t numEntries)
+{
+    size_t i;
+    for (i = 0; i < numEntries; ++i) {
+        if (id1 == table[i].id1) {
+            return id_to_string(id2, table[i].id2_table, table[i].id2_numEntries);
+        }
+    }
+    return "Unknown";
+}
+
+// Map a video codec and profile to string
+
+const char *videoProfileToString(XAuint32 codec, XAuint32 profile) {
+    // http://en.wikipedia.org/wiki/H.262/MPEG-2_Part_2
+    static const id_to_string_t MPEG2[] = {
+        {XA_VIDEOPROFILE_MPEG2_SIMPLE,  "Simple"},
+        {XA_VIDEOPROFILE_MPEG2_MAIN,    "Main"},
+        {XA_VIDEOPROFILE_MPEG2_422,     "4:2:2"},
+        {XA_VIDEOPROFILE_MPEG2_SNR,     "SNR Scalable"},
+        {XA_VIDEOPROFILE_MPEG2_SPATIAL, "Spatially Scalable"},
+        {XA_VIDEOPROFILE_MPEG2_HIGH,    "High"},
+    }, H263[] = {
+        {XA_VIDEOPROFILE_H263_BASELINE,           "baseline"},
+        {XA_VIDEOPROFILE_H263_H320CODING,         "H320 coding"},
+        {XA_VIDEOPROFILE_H263_BACKWARDCOMPATIBLE, "backwards compatible"},
+        {XA_VIDEOPROFILE_H263_ISWV2,              "isw v2"},
+        {XA_VIDEOPROFILE_H263_ISWV3,              "isw v3"},
+        {XA_VIDEOPROFILE_H263_HIGHCOMPRESSION,    "high compression"},
+        {XA_VIDEOPROFILE_H263_INTERNET,           "internet"},
+        {XA_VIDEOPROFILE_H263_INTERLACE,          "interlace"},
+        {XA_VIDEOPROFILE_H263_HIGHLATENCY,        "high latency"},
+    }, MPEG4[] = {
+        {XA_VIDEOPROFILE_MPEG4_SIMPLE,           "simple"},
+        {XA_VIDEOPROFILE_MPEG4_SIMPLESCALABLE,   "simple scalable"},
+        {XA_VIDEOPROFILE_MPEG4_CORE,             "core"},
+        {XA_VIDEOPROFILE_MPEG4_MAIN,             "main"},
+        {XA_VIDEOPROFILE_MPEG4_NBIT,             "nbit"},
+        {XA_VIDEOPROFILE_MPEG4_SCALABLETEXTURE,  "scalable texture"},
+        {XA_VIDEOPROFILE_MPEG4_SIMPLEFACE,       "simple face"},
+        {XA_VIDEOPROFILE_MPEG4_SIMPLEFBA,        "simple fba"},
+        {XA_VIDEOPROFILE_MPEG4_BASICANIMATED,    "basic animated"},
+        {XA_VIDEOPROFILE_MPEG4_HYBRID,           "hybrid"},
+        {XA_VIDEOPROFILE_MPEG4_ADVANCEDREALTIME, "advanced realtime"},
+        {XA_VIDEOPROFILE_MPEG4_CORESCALABLE,     "core scalable"},
+        {XA_VIDEOPROFILE_MPEG4_ADVANCEDCODING,   "advanced coding"},
+        {XA_VIDEOPROFILE_MPEG4_ADVANCEDCORE,     "advanced core"},
+        {XA_VIDEOPROFILE_MPEG4_ADVANCEDSCALABLE, "advanced scalable"},
+        // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL
+        {16,                                     "advanced simple"},
+    }, AVC[] = {
+        {XA_VIDEOPROFILE_AVC_BASELINE, "Baseline"},
+        {XA_VIDEOPROFILE_AVC_MAIN,     "Main"},
+        {XA_VIDEOPROFILE_AVC_EXTENDED, "Extended"},
+        {XA_VIDEOPROFILE_AVC_HIGH,     "High"},
+        {XA_VIDEOPROFILE_AVC_HIGH10,   "High 10"},
+        {XA_VIDEOPROFILE_AVC_HIGH422,  "High 4:2:2"},
+        {XA_VIDEOPROFILE_AVC_HIGH444,  "High 4:4:4"},
+    }, VC1[] = {
+        // FIXME sic should be XA_VIDEOPROFILE_*
+        {XA_VIDEOLEVEL_VC1_SIMPLE,   "simple"},
+        {XA_VIDEOLEVEL_VC1_MAIN,     "main"},
+        {XA_VIDEOLEVEL_VC1_ADVANCED, "advanced"},
+    };
+    static const id_pair_to_string_t table[] = {
+        {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])},
+        {XA_VIDEOCODEC_H263,  H263,  sizeof(H263)  / sizeof(H263[0])},
+        {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])},
+        {XA_VIDEOCODEC_AVC,   AVC,   sizeof(AVC)   / sizeof(AVC[0])},
+        {XA_VIDEOCODEC_VC1,   VC1,   sizeof(VC1)   / sizeof(VC1[0])},
+    };
+    return id_pair_to_string(codec, profile, table, sizeof(table) / sizeof(table[0]));
+}
+
+// Map a video codec and level to string
+
+const char* videoLevelToString(XAuint32 codec, XAuint32 level) {
+    static const id_to_string_t MPEG2[] = {
+        {XA_VIDEOLEVEL_MPEG2_LL,  "Low"},
+        {XA_VIDEOLEVEL_MPEG2_ML,  "Main"},
+        {XA_VIDEOLEVEL_MPEG2_H14, "H-14"},
+        {XA_VIDEOLEVEL_MPEG2_HL,  "High"},
+    }, H263[]= {
+        {XA_VIDEOLEVEL_H263_10, "10"},
+        {XA_VIDEOLEVEL_H263_20, "20"},
+        {XA_VIDEOLEVEL_H263_30, "30"},
+        {XA_VIDEOLEVEL_H263_40, "40"},
+        {XA_VIDEOLEVEL_H263_45, "45"},
+        {XA_VIDEOLEVEL_H263_50, "50"},
+        {XA_VIDEOLEVEL_H263_60, "60"},
+        {XA_VIDEOLEVEL_H263_70, "70"},
+    }, MPEG4[] = {
+        {XA_VIDEOLEVEL_MPEG4_0,  "0"},
+        {XA_VIDEOLEVEL_MPEG4_0b, "0b"},
+        {XA_VIDEOLEVEL_MPEG4_1,  "1"},
+        {XA_VIDEOLEVEL_MPEG4_2,  "2"},
+        {XA_VIDEOLEVEL_MPEG4_3,  "3"},
+        {XA_VIDEOLEVEL_MPEG4_4,  "4"},
+        {XA_VIDEOLEVEL_MPEG4_4a, "4a"},
+        // FIXME OpenMAX AL is out-of-date with respect to OpenMAX IL
+        {8,                      "5"},
+    }, AVC[] = {
+        {XA_VIDEOLEVEL_AVC_1,  "1"},
+        {XA_VIDEOLEVEL_AVC_1B, "1B"},
+        {XA_VIDEOLEVEL_AVC_11, "1.1"},
+        {XA_VIDEOLEVEL_AVC_12, "1.2"},
+        {XA_VIDEOLEVEL_AVC_13, "1.3"},
+        {XA_VIDEOLEVEL_AVC_2,  "2"},
+        {XA_VIDEOLEVEL_AVC_21, "2.1"},
+        {XA_VIDEOLEVEL_AVC_22, "2.2"},
+        {XA_VIDEOLEVEL_AVC_3,  "3"},
+        {XA_VIDEOLEVEL_AVC_31, "3.1"},
+        {XA_VIDEOLEVEL_AVC_32, "3.2"},
+        {XA_VIDEOLEVEL_AVC_4,  "4"},
+        {XA_VIDEOLEVEL_AVC_41, "4.1"},
+        {XA_VIDEOLEVEL_AVC_42, "4.2"},
+        {XA_VIDEOLEVEL_AVC_5,  "5"},
+        {XA_VIDEOLEVEL_AVC_51, "5.1"},
+    }, VC1[] = {
+        {XA_VIDEOLEVEL_VC1_LOW,    "Low"},
+        {XA_VIDEOLEVEL_VC1_MEDIUM, "Medium"},
+        {XA_VIDEOLEVEL_VC1_HIGH,   "High"},
+        {XA_VIDEOLEVEL_VC1_L0,     "L0"},
+        {XA_VIDEOLEVEL_VC1_L1,     "L1"},
+        {XA_VIDEOLEVEL_VC1_L2,     "L2"},
+        {XA_VIDEOLEVEL_VC1_L3,     "L3"},
+        {XA_VIDEOLEVEL_VC1_L4,     "L4"},
+    };
+    static const id_pair_to_string_t table[] = {
+        {XA_VIDEOCODEC_MPEG2, MPEG2, sizeof(MPEG2) / sizeof(MPEG2[0])},
+        {XA_VIDEOCODEC_H263,  H263,  sizeof(H263)  / sizeof(H263[0])},
+        {XA_VIDEOCODEC_MPEG4, MPEG4, sizeof(MPEG4) / sizeof(MPEG4[0])},
+        {XA_VIDEOCODEC_AVC,   AVC,   sizeof(AVC)   / sizeof(AVC[0])},
+        {XA_VIDEOCODEC_VC1,   VC1,   sizeof(VC1)   / sizeof(VC1[0])},
+    };
+    return id_pair_to_string(codec, level, table, sizeof(table) / sizeof(table[0]));
+}
+
 //-----------------------------------------------------------------
 void TestVideoDecoderCapabilities() {
 
@@ -111,11 +276,15 @@
         /* display the profile / level combinations */
         for(XAuint32 pl = 0 ; pl < nbCombinations ; pl++) {
             XAVideoCodecDescriptor decDescriptor;
-            res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoderIds[i], &pl,
-                    &decDescriptor);
+            XAuint32 decoder = decoderIds[i];
+            res = (*decItf)->GetVideoDecoderCapabilities(decItf, decoder, &pl, &decDescriptor);
             ExitOnError(res);
-            fprintf(stdout, "%u/%u ", decDescriptor.profileSetting, decDescriptor.levelSetting);
+            XAuint32 profile = decDescriptor.profileSetting;
+            XAuint32 level = decDescriptor.levelSetting;
+            fprintf(stdout, "%u/%u ", profile, level);
             ExitOnError(res);
+            printf("(%s/%s) ", videoProfileToString(decoder, profile),
+                    videoLevelToString(decoder, level));
         }
         fprintf(stdout, "\n");
     }