mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:16:13 +00:00
gst/realmedia/rmdemux.c: Add suport for mpeg4 and aac audio. See #556714.
Original commit message from CVS: * gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream), (gst_rmdemux_descramble_mp4a_audio), (gst_rmdemux_handle_scrambled_packet): Add suport for mpeg4 and aac audio. See #556714.
This commit is contained in:
parent
46c5294930
commit
5aa3023505
3 changed files with 69 additions and 9 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2008-10-24 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/realmedia/rmdemux.c: (gst_rmdemux_add_stream),
|
||||||
|
(gst_rmdemux_descramble_mp4a_audio),
|
||||||
|
(gst_rmdemux_handle_scrambled_packet):
|
||||||
|
Add suport for mpeg4 and aac audio. See #556714.
|
||||||
|
|
||||||
2008-10-14 Michael Smith <msmith@songbirdnest.com>
|
2008-10-14 Michael Smith <msmith@songbirdnest.com>
|
||||||
|
|
||||||
* gst/mpegaudioparse/gstmpegaudioparse.c:
|
* gst/mpegaudioparse/gstmpegaudioparse.c:
|
||||||
|
|
2
common
2
common
|
@ -1 +1 @@
|
||||||
Subproject commit 46eefd2f8474ee748864c59635be87b5a29317d1
|
Subproject commit 2802bb17517a6cfbbb1be6da61ec19151be0750b
|
|
@ -1375,18 +1375,21 @@ gst_rmdemux_add_stream (GstRMDemux * rmdemux, GstRMDemuxStream * stream)
|
||||||
stream->subpackets = NULL;
|
stream->subpackets = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* RealAudio 10 (AAC) */
|
|
||||||
case GST_RM_AUD_RAAC:
|
|
||||||
codec_name = "Real Audio 10 (AAC)";
|
|
||||||
version = 10;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* MPEG-4 based */
|
/* MPEG-4 based */
|
||||||
|
case GST_RM_AUD_RAAC:
|
||||||
case GST_RM_AUD_RACP:
|
case GST_RM_AUD_RACP:
|
||||||
/* FIXME: codec_name = */
|
codec_name = "MPEG4 audio";
|
||||||
stream_caps =
|
stream_caps =
|
||||||
gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT,
|
gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT,
|
||||||
(int) 4, NULL);
|
(int) 4, "framed", G_TYPE_BOOLEAN, TRUE, NULL);
|
||||||
|
if (stream->extra_data_size > 0) {
|
||||||
|
/* strip off an unknown byte in the extra data */
|
||||||
|
stream->extra_data_size--;
|
||||||
|
stream->extra_data++;
|
||||||
|
}
|
||||||
|
stream->needs_descrambling = TRUE;
|
||||||
|
stream->subpackets_needed = 1;
|
||||||
|
stream->subpackets = NULL;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Sony ATRAC3 */
|
/* Sony ATRAC3 */
|
||||||
|
@ -1978,6 +1981,52 @@ gst_rmdemux_descramble_dnet_audio (GstRMDemux * rmdemux,
|
||||||
return gst_pad_push (stream->pad, buf);
|
return gst_pad_push (stream->pad, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstFlowReturn
|
||||||
|
gst_rmdemux_descramble_mp4a_audio (GstRMDemux * rmdemux,
|
||||||
|
GstRMDemuxStream * stream)
|
||||||
|
{
|
||||||
|
GstFlowReturn res;
|
||||||
|
GstBuffer *buf, *outbuf;
|
||||||
|
guint frames, index, i;
|
||||||
|
guint8 *data;
|
||||||
|
guint size;
|
||||||
|
GstClockTime timestamp;
|
||||||
|
|
||||||
|
res = GST_FLOW_OK;
|
||||||
|
|
||||||
|
buf = g_ptr_array_index (stream->subpackets, 0);
|
||||||
|
g_ptr_array_index (stream->subpackets, 0) = NULL;
|
||||||
|
g_ptr_array_set_size (stream->subpackets, 0);
|
||||||
|
|
||||||
|
data = GST_BUFFER_DATA (buf);
|
||||||
|
size = GST_BUFFER_SIZE (buf);
|
||||||
|
timestamp = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
|
||||||
|
frames = (data[1] & 0xf0) >> 4;
|
||||||
|
index = 2 * frames + 2;
|
||||||
|
|
||||||
|
for (i = 0; i < frames; i++) {
|
||||||
|
guint len = (data[i * 2 + 2] << 8) | data[i * 2 + 3];
|
||||||
|
|
||||||
|
outbuf = gst_buffer_create_sub (buf, index, len);
|
||||||
|
if (i == 0)
|
||||||
|
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
|
||||||
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (stream->pad));
|
||||||
|
|
||||||
|
index += len;
|
||||||
|
|
||||||
|
if (stream->discont) {
|
||||||
|
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
|
||||||
|
stream->discont = FALSE;
|
||||||
|
}
|
||||||
|
res = gst_pad_push (stream->pad, outbuf);
|
||||||
|
if (res != GST_FLOW_OK)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_rmdemux_handle_scrambled_packet (GstRMDemux * rmdemux,
|
gst_rmdemux_handle_scrambled_packet (GstRMDemux * rmdemux,
|
||||||
GstRMDemuxStream * stream, GstBuffer * buf, gboolean keyframe)
|
GstRMDemuxStream * stream, GstBuffer * buf, gboolean keyframe)
|
||||||
|
@ -2008,6 +2057,10 @@ gst_rmdemux_handle_scrambled_packet (GstRMDemux * rmdemux,
|
||||||
case GST_RM_AUD_COOK:
|
case GST_RM_AUD_COOK:
|
||||||
ret = gst_rmdemux_descramble_cook_audio (rmdemux, stream);
|
ret = gst_rmdemux_descramble_cook_audio (rmdemux, stream);
|
||||||
break;
|
break;
|
||||||
|
case GST_RM_AUD_RAAC:
|
||||||
|
case GST_RM_AUD_RACP:
|
||||||
|
ret = gst_rmdemux_descramble_mp4a_audio (rmdemux, stream);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue