amldemux: CB2 qtdemux remove support dolby vision unknown Compatibility ID [1/1]

PD#SWPL-135907

Problem:
qtdemux remove support dolby vision unknown compatibility ID

Solution:
00024-qtdemux-remove-support-dolby-vision-unknown-Compatibility-ID.patch

Verify:
Yocto

Signed-off-by: zengliang.li <zengliang.li@amlogic.com>
Change-Id: I3d7b837fd94b59c706e2c4d9e8096c12e07d514b
diff --git a/aml-qtdemux/fourcc.h b/aml-qtdemux/fourcc.h
index 5be6921..7b837b3 100644
--- a/aml-qtdemux/fourcc.h
+++ b/aml-qtdemux/fourcc.h
@@ -136,6 +136,8 @@
 #define FOURCC_dvh1     GST_MAKE_FOURCC('d','v','h','1')
 #define FOURCC_dvhe     GST_MAKE_FOURCC('d','v','h','e')
 #define FOURCC_dvcC     GST_MAKE_FOURCC('d','v','c','C')
+#define FOURCC_dvvC     GST_MAKE_FOURCC('d','v','v','C')
+#define FOURCC_dvwC     GST_MAKE_FOURCC('d','v','w','C')
 #define FOURCC_edts     GST_MAKE_FOURCC('e','d','t','s')
 #define FOURCC_elst     GST_MAKE_FOURCC('e','l','s','t')
 #define FOURCC_enda     GST_MAKE_FOURCC('e','n','d','a')
diff --git a/aml-qtdemux/qtdemux.c b/aml-qtdemux/qtdemux.c
index 815792a..2c5dce5 100644
--- a/aml-qtdemux/qtdemux.c
+++ b/aml-qtdemux/qtdemux.c
@@ -8272,6 +8272,56 @@
         qtdemux_parse_container (qtdemux, node, buffer + 36, end);
         break;
       }
+      case FOURCC_dvcC:
+      case FOURCC_dvvC:
+      case FOURCC_dvwC:
+      {
+        guint32 dv_version_major = QT_UINT8(buffer+8);
+        guint32 dv_version_minor = QT_UINT8(buffer+9);
+        guint32 tmp = QT_UINT16(buffer+10);
+        guint32 dv_profile = (tmp >> 9) & 0x7f;	  // 7 bits
+        guint32 dv_level = (tmp >> 3) & 0x3f;	// 6 bits
+        guint32 rpu_present_flag = (tmp >> 2) & 0x01;
+        guint32 el_present_flag = (tmp >> 1) & 0x01;    // 1 bit
+        guint32 bl_present_flag = tmp & 0x01;	// 1 bit
+
+        guint32 dv_bl_signal_compatibility_id = 0;// 0 stands for None
+        if (node_length >= 24) {
+          guint32 id = QT_UINT8(buffer+12);
+          dv_bl_signal_compatibility_id = (id >> 4) & 0x0f; // 4 bits
+        }
+        GST_DEBUG_OBJECT (qtdemux,"DOVI in dvcC/dvvC box, version: %d.%d, profile: %d, level: %d, "
+           "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+            dv_version_major, dv_version_minor,
+            dv_profile, dv_level,
+            rpu_present_flag,
+            el_present_flag,
+            bl_present_flag,
+            dv_bl_signal_compatibility_id
+        );
+        /*
+        Expected results are:
+        • If the test vector (MP4) carries an undefined/unknown Base Layer Signal Compatibility ID (dv_bl_signal_
+           compatibility_id), the device under test rejects the playback.
+        • If the test vector (MP4) is of an undefined/unknown Dolby Vision profile, but its Base Layer Signal
+           Compatibility ID (dv_bl_signal_compatibility_id) is valid, the device under test plays the content
+           properly and TV displays in Dolby Vision picture mode.
+           Note: Level 11 metadata changes when the embedded label on the left side of the test pattern
+           changes.
+        • If the Dolby Vision configuration box contains unknown elements (reserved fields with non-zero value),
+            the device under test ignores the unknown elements properly and play the MP4 test vector properly and
+            TV displays in Dolby Vision picture mode.
+        */
+        if (dv_bl_signal_compatibility_id != 0 &&
+              dv_bl_signal_compatibility_id != 1 &&
+              dv_bl_signal_compatibility_id != 2 &&
+              dv_bl_signal_compatibility_id != 4 &&
+              dv_bl_signal_compatibility_id != 6) {
+                GST_ERROR_OBJECT(qtdemux,"Not support dolby vision config box");
+           goto broken_atom_size;
+        }
+
+      } break;
       default:
         if (!strcmp (type->name, "unknown"))
           GST_MEMDUMP ("Unknown tag", buffer + 4, end - buffer - 4);
@@ -11456,7 +11506,56 @@
 
                   break;
                 }
+                case FOURCC_dvcC:
+                case FOURCC_dvvC:
+                case FOURCC_dvwC:
+                {
+                  guint32 dv_version_major = QT_UINT8(avc_data+8);
+                  guint32 dv_version_minor = QT_UINT8(avc_data+9);
+                  guint32 tmp = QT_UINT16(avc_data+10);
+                  guint32 dv_profile = (tmp >> 9) & 0x7f;	  // 7 bits
+                  guint32 dv_level = (tmp >> 3) & 0x3f;	// 6 bits
+                  guint32 rpu_present_flag = (tmp >> 2) & 0x01;
+                  guint32 el_present_flag = (tmp >> 1) & 0x01;    // 1 bit
+                  guint32 bl_present_flag = tmp & 0x01;	// 1 bit
 
+                  guint32 dv_bl_signal_compatibility_id = 0;// 0 stands for None
+                  if (len >= 24) {
+                    guint32 id = QT_UINT8(avc_data+12);
+                    dv_bl_signal_compatibility_id = (id >> 4) & 0x0f; // 4 bits
+                  }
+                  GST_DEBUG_OBJECT (qtdemux,"DOVI in dvcC/dvvC box, version: %d.%d, profile: %d, level: %d, "
+                    "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+                    dv_version_major, dv_version_minor,
+                    dv_profile, dv_level,
+                    rpu_present_flag,
+                    el_present_flag,
+                    bl_present_flag,
+                    dv_bl_signal_compatibility_id
+                  );
+                  /*
+                  Expected results are:
+                  • If the test vector (MP4) carries an undefined/unknown Base Layer Signal Compatibility ID (dv_bl_signal_
+                  compatibility_id), the device under test rejects the playback.
+                  • If the test vector (MP4) is of an undefined/unknown Dolby Vision profile, but its Base Layer Signal
+                  Compatibility ID (dv_bl_signal_compatibility_id) is valid, the device under test plays the content
+                  properly and TV displays in Dolby Vision picture mode.
+                  Note: Level 11 metadata changes when the embedded label on the left side of the test pattern
+                  changes.
+                  • If the Dolby Vision configuration box contains unknown elements (reserved fields with non-zero value),
+                  the device under test ignores the unknown elements properly and play the MP4 test vector properly and
+                  TV displays in Dolby Vision picture mode.
+                  */
+                 if (dv_bl_signal_compatibility_id != 0 &&
+                       dv_bl_signal_compatibility_id != 1 &&
+                       dv_bl_signal_compatibility_id != 2 &&
+                       dv_bl_signal_compatibility_id != 4 &&
+                       dv_bl_signal_compatibility_id != 6) {
+                         GST_ERROR_OBJECT(qtdemux,"Not support dolby vision config box");
+                    goto corrupt_file;
+                  }
+
+                } break;
                 default:
                   break;
               }
@@ -12033,6 +12132,56 @@
 
                   break;
                 }
+                case FOURCC_dvcC:
+                case FOURCC_dvvC:
+                case FOURCC_dvwC:
+                {
+                   guint32 dv_version_major = QT_UINT8(avc_data+8);
+                   guint32 dv_version_minor = QT_UINT8(avc_data+9);
+                   guint32 tmp = QT_UINT16(avc_data+10);
+                   guint32 dv_profile = (tmp >> 9) & 0x7f;	  // 7 bits
+                   guint32 dv_level = (tmp >> 3) & 0x3f;	// 6 bits
+                   guint32 rpu_present_flag = (tmp >> 2) & 0x01;
+                   guint32 el_present_flag = (tmp >> 1) & 0x01;    // 1 bit
+                   guint32 bl_present_flag = tmp & 0x01;	// 1 bit
+
+                   guint32 dv_bl_signal_compatibility_id = 0;// 0 stands for None
+                   if (len >= 24) {
+                   guint32 id = QT_UINT8(avc_data+12);
+                   dv_bl_signal_compatibility_id = (id >> 4) & 0x0f; // 4 bits
+                   }
+                   GST_DEBUG_OBJECT (qtdemux,"DOVI in dvcC/dvvC box, version: %d.%d, profile: %d, level: %d, "
+                     "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n",
+                     dv_version_major, dv_version_minor,
+                     dv_profile, dv_level,
+                     rpu_present_flag,
+                     el_present_flag,
+                     bl_present_flag,
+                     dv_bl_signal_compatibility_id
+                   );
+                  /*
+                  Expected results are:
+                  • If the test vector (MP4) carries an undefined/unknown Base Layer Signal Compatibility ID (dv_bl_signal_
+                      compatibility_id), the device under test rejects the playback.
+                  • If the test vector (MP4) is of an undefined/unknown Dolby Vision profile, but its Base Layer Signal
+                      Compatibility ID (dv_bl_signal_compatibility_id) is valid, the device under test plays the content
+                      properly and TV displays in Dolby Vision picture mode.
+                      Note: Level 11 metadata changes when the embedded label on the left side of the test pattern
+                      changes.
+                  • If the Dolby Vision configuration box contains unknown elements (reserved fields with non-zero value),
+                      the device under test ignores the unknown elements properly and play the MP4 test vector properly and
+                      TV displays in Dolby Vision picture mode.
+                  */
+                  if (dv_bl_signal_compatibility_id != 0 &&
+                        dv_bl_signal_compatibility_id != 1 &&
+                        dv_bl_signal_compatibility_id != 2 &&
+                        dv_bl_signal_compatibility_id != 4 &&
+                        dv_bl_signal_compatibility_id != 6) {
+                          GST_ERROR_OBJECT(qtdemux,"Not support dolby vision config box");
+                        goto corrupt_file;
+                  }
+
+                } break;
                 default:
                   break;
               }
diff --git a/aml-qtdemux/qtdemux_types.c b/aml-qtdemux/qtdemux_types.c
index a78415a..5c301b9 100644
--- a/aml-qtdemux/qtdemux_types.c
+++ b/aml-qtdemux/qtdemux_types.c
@@ -230,6 +230,9 @@
   {FOURCC_aavd, "AAX encrypted audio", 0},
   {FOURCC_adrm, "AAX DRM key data", 0},
   {FOURCC_vttc, "VTTCueBox 14496-30", QT_FLAG_CONTAINER},
+  {FOURCC_dvcC, "DOVI in dvcC box", 0},
+  {FOURCC_dvvC, "DOVI in dvvC box", 0},
+  {FOURCC_dvwC, "DOVI in dvwC box", 0},
   {0, "unknown", 0,},
 };