avs_mtk_voice/meta/meta-mediatek/recipes-multimedia/gstreamer/gstreamer1.0-plugins-ugly/0001-rmdemux-porting-from-1...

152 lines
5.4 KiB
Diff
Raw Normal View History

2022-05-13 08:02:31 +00:00
From 72b18fc91dbb8869573755e289b379c8cc80e641 Mon Sep 17 00:00:00 2001
From: Chuanbing Xiang <chuanbing.xiang@mediatek.com>
Date: Fri, 2 Sep 2016 15:49:48 +0800
Subject: [PATCH] rmdemux: porting patch from 1.4.5 to 1.6.3
Porting the patch of rmdemux for gstreamer upgrade
from 1.4.5 to 1.6.3
Test: build pass only
Signed-off-by: Chuanbing Xiang <chuanbing.xiang@mediatek.com>
CR-Id: AUTO00001206
---
gst/realmedia/rmdemux.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 70 insertions(+), 3 deletions(-)
diff --git a/gst/realmedia/rmdemux.c b/gst/realmedia/rmdemux.c
index e670f98..7b0bc96 100644
--- a/gst/realmedia/rmdemux.c
+++ b/gst/realmedia/rmdemux.c
@@ -41,6 +41,7 @@
#define DATA_SIZE 8
#define MAX_FRAGS 256
+#define MAX_RPR_SIZE 20
static const guint8 sipr_subpk_size[4] = { 29, 19, 37, 20 };
@@ -95,6 +96,9 @@ struct _GstRMDemuxStream
GstAdapter *adapter;
GstTagList *pending_tags;
+
+ guint32 rpr_size;
+ guint32 rpr_size_array[MAX_RPR_SIZE];
};
struct _GstRMDemuxIndex
@@ -1508,7 +1512,7 @@ gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream)
stream->extra_data_size, GST_PAD_NAME (stream->pad));
/* add codec_data if there is any */
- if (stream->extra_data_size > 0) {
+ if ((stream->extra_data_size > 0) && (stream->subtype == GST_RMDEMUX_STREAM_AUDIO)) {
GstBuffer *buffer;
buffer = gst_buffer_new_and_alloc (stream->extra_data_size);
@@ -1745,6 +1749,33 @@ gst_rmdemux_parse_mdpr (GstRMDemux * rmdemux, const guint8 * data, int length)
stream->rate, stream->framerate_numerator,
stream->framerate_denominator, stream->subformat, stream->format,
stream->extra_data_size);
+ offset += 34;
+ GST_INFO_OBJECT (rmdemux, "stream->subformat=0x%x length=%d offset=%d", stream->subformat, length, offset);
+ if (stream->fourcc == GST_RM_VDO_RV30) {
+ guint32 index = 0;
+ guint8 val = 0;
+
+ memset (stream->rpr_size_array, 0, MAX_RPR_SIZE);
+ stream->rpr_size = (stream->subformat & 0x00070000) >> 16;
+
+ GST_INFO_OBJECT (rmdemux, "stream->rpr_size=%d", stream->rpr_size);
+ for (; index < stream->rpr_size; ++index) {
+ val = GST_READ_UINT8 (data + offset);
+ GST_INFO_OBJECT (rmdemux, "val=%d(0x%x)", val, val);
+ stream->rpr_size_array[2 * index + 2] = (guint32)(val << 2);
+
+ val = GST_READ_UINT8 (data + offset + 1);
+ GST_INFO_OBJECT (rmdemux, "val=%d(0x%x)", val, val);
+ stream->rpr_size_array[2 * index + 3] = (guint32)(val << 2);
+ offset += 2;
+ }
+
+ stream->rpr_size_array[0] = stream->width;
+ stream->rpr_size_array[1] = stream->height;
+ ++(stream->rpr_size);
+
+ GST_INFO_OBJECT (rmdemux, "offset=%d", offset);
+ }
break;
case GST_RMDEMUX_STREAM_AUDIO:{
stream->version = RMDEMUX_GUINT16_GET (data + offset + 4);
@@ -2324,6 +2355,8 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream,
guint8 *outdata;
guint header_size;
gint i, avail;
+ gsize alloc_size;
+ gsize rv30_header_size;
/* calculate header size, which is:
* 1 byte for the number of fragments - 1
@@ -2343,7 +2376,13 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream,
avail = gst_adapter_available (stream->adapter);
- out = gst_buffer_new_and_alloc (header_size + avail);
+ alloc_size = header_size + avail;
+ if (stream->fourcc == GST_RM_VDO_RV30) {
+ rv30_header_size = stream->rpr_size * 16 + 1;
+ alloc_size += rv30_header_size;
+ }
+ out = gst_buffer_new_and_alloc (alloc_size);
+
gst_buffer_map (out, &outmap, GST_MAP_WRITE);
outdata = outmap.data;
@@ -2356,6 +2395,34 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream,
outdata += 4;
}
+
+ if (stream->fourcc == GST_RM_VDO_RV30) {
+ guint8 index = 0;
+ guint32 *rpr_size_data = stream->rpr_size_array;
+
+ *outdata = stream->rpr_size;
+ GST_INFO_OBJECT (rmdemux, "outdata=%p *outdata=%d", outdata, *outdata);
+ ++outdata;
+
+ for (index = 0; index < stream->rpr_size; ++index) {
+ GST_WRITE_UINT32_LE (outdata, 0x00000001);
+ outdata += 4;
+ /*width*/
+ GST_WRITE_UINT32_LE (outdata, *rpr_size_data);
+ GST_INFO_OBJECT (rmdemux, "*rpr_size_data=%d", *rpr_size_data);
+ outdata += 4;
+ ++rpr_size_data;
+
+ GST_WRITE_UINT32_LE (outdata, 0x00000001);
+ outdata += 4;
+ /*height*/
+ GST_WRITE_UINT32_LE (outdata, *rpr_size_data);
+ GST_INFO_OBJECT (rmdemux, "*rpr_size_data=%d", *rpr_size_data);
+ outdata += 4;
+ ++rpr_size_data;
+ }
+ }
+
/* copy packet data after the header now */
gst_adapter_copy (stream->adapter, outdata, 0, avail);
gst_adapter_flush (stream->adapter, avail);
@@ -2377,7 +2444,7 @@ gst_rmdemux_parse_video_packet (GstRMDemux * rmdemux, GstRMDemuxStream * stream,
/* video has DTS */
GST_BUFFER_DTS (out) = timestamp;
- GST_BUFFER_PTS (out) = GST_CLOCK_TIME_NONE;
+ GST_BUFFER_PTS (out) = timestamp;
GST_LOG_OBJECT (rmdemux, "pushing timestamp %" GST_TIME_FORMAT,
GST_TIME_ARGS (timestamp));
--
1.9.1