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