From 93493a1033bc20199b105770e338ae413378d693 Mon Sep 17 00:00:00 2001 From: Jeremy Simon Date: Wed, 5 Nov 2003 23:14:52 +0000 Subject: [PATCH] Handle the audio extradata Original commit message from CVS: Handle the audio extradata Compute the 2 flags for ffmpeg wma codecs --- gst/asfdemux/gstasfdemux.c | 89 +++++++++++++++++++++++++++++--------- 1 file changed, 68 insertions(+), 21 deletions(-) diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c index 66b980e116..2a40f9555a 100644 --- a/gst/asfdemux/gstasfdemux.c +++ b/gst/asfdemux/gstasfdemux.c @@ -84,7 +84,7 @@ static GstElementStateReturn gst_asf_demux_change_state (GstElement *element); static GstCaps * gst_asf_demux_video_caps (guint32 codec_fcc, asf_stream_video_format *video); static GstCaps * gst_asf_demux_audio_caps (guint16 codec_id, - asf_stream_audio *audio); + asf_stream_audio *audio, guint8 *extradata); static GstPadTemplate *videosrctempl, *audiosrctempl; static GstElementClass *parent_class = NULL; @@ -144,7 +144,7 @@ gst_asf_demux_base_init (gpointer g_class) }; for (i = 0; aud_list[i] != -1; i++) { - temp = gst_asf_demux_audio_caps (aud_list[i], NULL); + temp = gst_asf_demux_audio_caps (aud_list[i], NULL, NULL); audcaps = gst_caps_append (audcaps, temp); } @@ -661,7 +661,7 @@ gst_asf_demux_process_stream (GstASFDemux *asf_demux, guint64 *obj_size) audio_object = (asf_stream_audio *)ptr; size = GUINT16_FROM_LE (audio_object->size); - GST_INFO ( "Object is an audio stream with %u bytes of additional data.", size); + GST_INFO ("Object is an audio stream with %u bytes of additional data.", size); if (!gst_asf_demux_add_audio_stream (asf_demux, audio_object, id)) return FALSE; @@ -993,7 +993,7 @@ gst_asf_demux_handle_sink_event (GstASFDemux *asf_demux, guint32 remaining) { GstEventType type; - + type = event? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { @@ -1242,9 +1242,13 @@ gst_asf_demux_identify_guid (GstASFDemux *asf_demux, static GstCaps * gst_asf_demux_audio_caps (guint16 codec_id, - asf_stream_audio *audio) + asf_stream_audio *audio, guint8 *extradata) { GstCaps *caps = NULL; + gint flags1, flags2; + + flags1 = 0; + flags2 = 0; switch (codec_id) { case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */ @@ -1315,15 +1319,54 @@ gst_asf_demux_audio_caps (guint16 codec_id, break; case GST_RIFF_WAVE_FORMAT_DIVX_WMAV1: - caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav1", - "audio/x-wma", - "wmaversion", GST_PROPS_INT (1)); + /* get flags1 and flags2 ripped from ffmpeg (wmadec.c) */ + if (audio && audio->size >= 4) { + flags1 = extradata[0] | (extradata[1] << 8); + flags2 = extradata[2] | (extradata[3] << 8); + } + if (audio != NULL) + caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav1", + "audio/x-wma", + "wmaversion", GST_PROPS_INT (1), + "flags1", GST_PROPS_INT (flags1), + "flags2", GST_PROPS_INT (flags2), + "block_align", GST_PROPS_INT (audio->block_align), + "bitrate", GST_PROPS_INT (audio->byte_rate * 8)); + else + caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav1", + "audio/x-wma", + "wmaversion", GST_PROPS_INT (1), + "flags1", GST_PROPS_INT_RANGE (G_MININT, G_MAXINT), + "flags2", GST_PROPS_INT_RANGE (G_MININT, G_MAXINT), + "block_align", GST_PROPS_INT_RANGE (0, G_MAXINT), + "bitrate", GST_PROPS_INT_RANGE (0, G_MAXINT) + ); break; case GST_RIFF_WAVE_FORMAT_DIVX_WMAV2: - caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav2", - "audio/x-wma", - "wmaversion", GST_PROPS_INT (2)); + /* get flags1 and flags2 ripped from ffmpeg (wmadec.c) */ + if (audio && audio->size >= 6) { + flags1 = extradata[0] | (extradata[1] << 8) | + (extradata[2] << 16) | (extradata[3] << 24); + flags2 = extradata[4] | (extradata[5] << 8); + } + if (audio != NULL) + caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav2", + "audio/x-wma", + "wmaversion", GST_PROPS_INT (2), + "flags1", GST_PROPS_INT (flags1), + "flags2", GST_PROPS_INT (flags2), + "block_align", GST_PROPS_INT (audio->block_align), + "bitrate", GST_PROPS_INT (audio->byte_rate * 8)); + else + caps = GST_ASF_AUD_CAPS_NEW ("asf_demux_audio_src_wmav2", + "audio/x-wma", + "wmaversion", GST_PROPS_INT (2), + "flags1", GST_PROPS_INT_RANGE (G_MININT, G_MAXINT), + "flags2", GST_PROPS_INT_RANGE (G_MININT, G_MAXINT), + "block_align", GST_PROPS_INT_RANGE (0, G_MAXINT), + "bitrate", GST_PROPS_INT_RANGE (0, G_MAXINT) + ); break; case GST_RIFF_WAVE_FORMAT_WMAV9: @@ -1350,31 +1393,34 @@ gst_asf_demux_add_audio_stream (GstASFDemux *asf_demux, GstCaps *caps; gchar *name = NULL; guint16 size_left = 0; + guint8 *extradata=NULL; size_left = GUINT16_FROM_LE(audio->size); /* Create the audio pad */ name = g_strdup_printf ("audio_%02d", asf_demux->num_audio_streams); + src_pad = gst_pad_new_from_template (audiosrctempl, name); g_free (name); + /* Swallow up any left over data */ + if (size_left) { + g_warning ("asfdemux: Audio header contains %d bytes of surplus data", size_left); + gst_asf_demux_read_object_header_rest (asf_demux, &extradata, size_left); +/* gst_bytestream_flush (asf_demux->bs, size_left);*/ + } + /* Now set up the standard propertis from the header info */ caps = gst_asf_demux_audio_caps (GUINT16_FROM_LE(audio->codec_tag), - audio); + audio, extradata); GST_INFO ("Adding audio stream %u codec %u (0x%x)", asf_demux->num_video_streams, GUINT16_FROM_LE(audio->codec_tag), GUINT16_FROM_LE(audio->codec_tag)); - asf_demux->num_audio_streams++; + asf_demux->num_audio_streams++; - /* Swallow up any left over data */ - if (size_left) { - g_warning ("asfdemux: Audio header contains %d bytes of surplus data", size_left); - gst_bytestream_flush (asf_demux->bs, size_left); - } - return gst_asf_demux_setup_pad (asf_demux, src_pad, caps, id); } @@ -1529,7 +1575,7 @@ gst_asf_demux_add_video_stream (GstASFDemux *asf_demux, GUINT32_FROM_LE(video->tag)); asf_demux->num_video_streams++; - + return gst_asf_demux_setup_pad (asf_demux, src_pad, caps, id); } @@ -1541,7 +1587,7 @@ gst_asf_demux_setup_pad (GstASFDemux *asf_demux, guint16 id) { asf_stream_context *stream; - + gst_pad_try_set_caps (src_pad, caps_list); gst_pad_set_formats_function (src_pad, gst_asf_demux_get_src_formats); gst_pad_set_event_mask_function (src_pad, gst_asf_demux_get_src_event_mask); @@ -1561,6 +1607,7 @@ gst_asf_demux_setup_pad (GstASFDemux *asf_demux, GST_INFO ("Adding pad for stream %u", asf_demux->num_streams); + asf_demux->num_streams++; gst_element_add_pad (GST_ELEMENT (asf_demux), src_pad);