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");
     }
