amltsdemux: CB1 support sample aes  [1/1]

PD#SWPL-179875

Problem:
support sample aes

Solution:
sync patch:0048-OTT-44638-modify-hls-
ts-demux-videoparser-to-parse-sampleAES.patch

Verify:
AH212

Change-Id: I17ee87237bce84dd52a3b443bc0ed4da8ec46a24
Signed-off-by: kaiqiang.xiang <kaiqiang.xiang@amlogic.com>
diff --git a/aml-tsdemux/amltsbase.c b/aml-tsdemux/amltsbase.c
index d8753a9..bbd65b1 100644
--- a/aml-tsdemux/amltsbase.c
+++ b/aml-tsdemux/amltsbase.c
@@ -1519,7 +1519,7 @@
   AmlTSBase *base;
   AmlTSPacketizerPacketReturn pret;
   AmlTSPacketizer2 *packetizer;
-  AmlTSPacketizerPacket packet;
+  AmlTSPacketizerPacket packet = {0};
   AmlTSBaseClass *klass;
 
   base = GST_AMLTS_BASE (parent);
diff --git a/aml-tsdemux/amltsdemux.c b/aml-tsdemux/amltsdemux.c
index b952003..86a6a56 100644
--- a/aml-tsdemux/amltsdemux.c
+++ b/aml-tsdemux/amltsdemux.c
@@ -51,6 +51,7 @@
 #include <gst/video/video-color.h>
 
 #include <math.h>
+#include <gst/base/gstbytewriter.h>
 
 #define _gst_log2(x) (log(x)/log(2))
 
@@ -227,6 +228,7 @@
   AmlTSDemuxH264ParsingInfos h264infos;
   AmlTSDemuxJP2KParsingInfos jp2kInfos;
   AmlTSDemuxADTSParsingInfos atdsInfos;
+  GstStructure *protection_info;
 
   //for hdcp parse
   gboolean hdcp_content_flag;
@@ -483,6 +485,11 @@
   gst_event_replace (&demux->segment_event, NULL);
   g_mutex_unlock (&demux->lock);
 
+  if (demux->protection_event) {
+    gst_event_unref (demux->protection_event);
+    demux->protection_event = NULL;
+  }
+
   if (demux->global_tags) {
     gst_tag_list_unref (demux->global_tags);
     demux->global_tags = NULL;
@@ -1115,6 +1122,11 @@
     /* tags are stored to be used after if there are no streams yet,
      * so we should never reject */
     early_ret = TRUE;
+  } else if (GST_EVENT_TYPE (event) == GST_EVENT_PROTECTION) {
+    if (demux->program == NULL) {
+      gst_event_replace(&demux->protection_event, event);
+      early_ret = TRUE;
+    }
   }
 
   if (G_UNLIKELY (demux->program == NULL)) {
@@ -1821,6 +1833,19 @@
 
       stream->atdsInfos.mpegversion = 4;
       break;
+    case GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS_AES_128_CBC:
+      is_audio = TRUE;
+      /* prefer mpegversion 4 since it's more commonly supported one */
+      caps = gst_caps_new_simple ("application/x-aes128-cbc",
+          "mpegversion", G_TYPE_INT, 4,
+          "stream-format", G_TYPE_STRING, "adts",
+          "original-media-type", G_TYPE_STRING, "audio/mpeg",
+          "encryption-algorithm", G_TYPE_STRING, "AES",
+          "cipher-mode", G_TYPE_STRING, "cbcs",
+          "parsed", G_TYPE_BOOLEAN, FALSE, NULL);
+      /* we will set caps later once parsing adts header is done */
+      stream->atdsInfos.mpegversion = 4;
+      break;
     case GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_LATM:
       is_audio = TRUE;
       if (program->registration_id == DRF_ID_HDCP) {
@@ -1836,12 +1861,46 @@
           "stream-format", G_TYPE_STRING, "loas", NULL);
       }
       break;
+    case GST_MPEGTS_STREAM_TYPE_AUDIO_AC3_AES_128_CBC:
+      is_audio = TRUE;
+      caps = gst_caps_new_simple ("application/x-aes128-cbc",
+          "original-media-type", G_TYPE_STRING, "audio/x-ac3",
+          "encryption-algorithm", G_TYPE_STRING, "AES",
+          "cipher-mode", G_TYPE_STRING, "cbcs",
+          "parsed", G_TYPE_BOOLEAN, FALSE, NULL);
+      /* we will set caps later once parsing adts header is done */
+      break;
+    case GST_MPEGTS_STREAM_TYPE_AUDIO_EAC3_AES_128_CBC:
+      is_audio = TRUE;
+      caps = gst_caps_new_simple ("application/x-aes128-cbc",
+          "original-media-type", G_TYPE_STRING, "audio/x-eac3",
+          "encryption-algorithm", G_TYPE_STRING, "AES",
+          "cipher-mode", G_TYPE_STRING, "cbcs",
+          "parsed", G_TYPE_BOOLEAN, FALSE, NULL);
+      /* we will set caps later once parsing adts header is done */
+      break;
     case GST_MPEGTS_STREAM_TYPE_VIDEO_MPEG4:
       is_video = TRUE;
       caps = gst_caps_new_simple ("video/mpeg",
           "mpegversion", G_TYPE_INT, 4,
           "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
       break;
+    case GST_MPEGTS_STREAM_TYPE_VIDEO_H264_AES_128_CBC:
+      is_video = TRUE;
+      caps = gst_caps_new_simple ("application/x-aes128-cbc",
+          "stream-format", G_TYPE_STRING, "byte-stream",
+          "original-media-type", G_TYPE_STRING, "video/x-h264",
+          "encryption-algorithm", G_TYPE_STRING, "AES",
+          "cipher-mode", G_TYPE_STRING, "cbcs", NULL);
+      break;
+    case GST_MPEGTS_STREAM_TYPE_VIDEO_HEVC_AES_128_CBC:
+      is_video = TRUE;
+      caps = gst_caps_new_simple ("application/x-aes128-cbc",
+          "stream-format", G_TYPE_STRING, "byte-stream",
+          "original-media-type", G_TYPE_STRING, "video/x-h265",
+          "encryption-algorithm", G_TYPE_STRING, "AES",
+          "cipher-mode", G_TYPE_STRING, "cbcs", NULL);
+      break;
     case GST_MPEGTS_STREAM_TYPE_VIDEO_H264:
     case GST_MPEGTS_STREAM_TYPE_VIDEO_HEVC:
       is_video = TRUE;
@@ -2201,7 +2260,8 @@
     }
 
     if (base->mode != BASE_MODE_PUSHING
-        && bstream->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_H264) {
+        && (bstream->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_H264
+          || bstream->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_H264_AES_128_CBC)) {
       stream->scan_function =
           (GstAmlTsDemuxKeyFrameScanFunction) aml_scan_keyframe_h264;
     } else {
@@ -2487,8 +2547,13 @@
         GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
         gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
       }
+      if (demux->protection_event) {
+        GstEvent *evt = gst_event_ref(demux->protection_event);
+        gst_pad_push_event(stream->pad, evt);
+      }
     }
 
+    gst_event_replace(&demux->protection_event, NULL);
     gst_element_no_more_pads ((GstElement *) demux);
   }
 }
@@ -2949,6 +3014,9 @@
       GST_LOG_OBJECT (demux, "HEADER: Parsing PES header");
 
       /* parse the header */
+      if (packet->protection_info) {
+        stream->protection_info = gst_structure_copy(packet->protection_info);
+      }
       gst_amltsdemux_parse_pes_header (demux, stream, data, size, packet->offset);
       break;
     }
@@ -3769,6 +3837,17 @@
   }
 
   if (buffer) {
+    if (stream->protection_info) {
+      if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_H264_AES_128_CBC
+            || bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_HEVC_AES_128_CBC) {
+        gst_structure_set (stream->protection_info,
+            "crypt_byte_block", G_TYPE_UINT, 1,
+            "skip_byte_block", G_TYPE_UINT, 9,
+            NULL
+        );
+      }
+      gst_buffer_add_protection_meta (buffer, gst_structure_copy(stream->protection_info));
+    }
     res = gst_pad_push (stream->pad, buffer);
     /* Record that a buffer was pushed */
     stream->nb_out_buffers += 1;
@@ -3821,7 +3900,10 @@
   stream->data = NULL;
   stream->allocated_size = 0;
   stream->current_size = 0;
-
+  if (stream->protection_info) {
+    gst_structure_free(stream->protection_info);
+    stream->protection_info = NULL;
+  }
   return res;
 }
 
diff --git a/aml-tsdemux/amltsdemux.h b/aml-tsdemux/amltsdemux.h
index c4f541c..1d798fa 100644
--- a/aml-tsdemux/amltsdemux.h
+++ b/aml-tsdemux/amltsdemux.h
@@ -112,6 +112,8 @@
 
   /* This is to protect demux->segment_event */
   GMutex lock;
+
+  GstEvent *protection_event;
 };
 
 struct _GstAmlTSDemuxClass
diff --git a/aml-tsdemux/amltspacketizer.c b/aml-tsdemux/amltspacketizer.c
index e2a4537..acf0e85 100644
--- a/aml-tsdemux/amltspacketizer.c
+++ b/aml-tsdemux/amltspacketizer.c
@@ -848,6 +848,10 @@
   gsize sync_offset;
 
   packet_size = packetizer->packet_size;
+  if (G_UNLIKELY(packet->protection_info)) {
+    gst_structure_free(packet->protection_info);
+    packet->protection_info = NULL;
+  }
   if (G_UNLIKELY (!packet_size)) {
     if (!amlts_try_discover_packet_size (packetizer))
       return PACKET_NEED_MORE;
@@ -887,6 +891,14 @@
       packetizer->offset += packet_size;
       GST_MEMDUMP ("data_start", packet->data_start, 16);
 
+      GstBufferList *list = gst_adapter_get_buffer_list(packetizer->adapter, gst_adapter_available (packetizer->adapter));
+      GstBuffer *buffer = gst_buffer_list_get(list, 0);
+      GstProtectionMeta *meta = gst_buffer_get_protection_meta(buffer);
+      if (meta) {
+        packet->protection_info = gst_structure_copy(meta->info);
+      }
+      gst_buffer_list_unref(list);
+
       return amlts_packetizer_parse_packet (packetizer, packet);
     }
   }
@@ -898,8 +910,7 @@
   AmlTSPacketizerPacket packet;
   AmlTSPacketizerPacketReturn ret;
 
-  //xiaobo-patch 0048-OTT-44638
-  //memset(&packet, 0, sizeof(MpegTSPacketizerPacket));
+  memset(&packet, 0, sizeof(AmlTSPacketizerPacket));
 
   ret = amlts_packetizer_next_packet (packetizer, &packet);
   if (ret != PACKET_NEED_MORE)
@@ -919,6 +930,10 @@
     if (packetizer->map_size - packetizer->map_offset < packet_size)
       amlts_packetizer_flush_bytes (packetizer, packetizer->map_offset);
   }
+  if (G_LIKELY(packet->protection_info)) {
+    gst_structure_free(packet->protection_info);
+    packet->protection_info = NULL;
+  }
 }
 
 gboolean
diff --git a/aml-tsdemux/amltspacketizer.h b/aml-tsdemux/amltspacketizer.h
index 5cdf803..ff7651e 100644
--- a/aml-tsdemux/amltspacketizer.h
+++ b/aml-tsdemux/amltspacketizer.h
@@ -316,6 +316,7 @@
   guint8  afc_flags;
   guint64 pcr;
   guint64 offset;
+  GstStructure *protection_info;
 } AmlTSPacketizerPacket;
 
 typedef struct