2002-10-17 21:41:47 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2003-06-29 19:46:09 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
Riff, EBML, fourcc etc. work. Not fully finished, but better than what we used to have and definately worth a first b...
Original commit message from CVS:
Riff, EBML, fourcc etc. work. Not fully finished, but better than
what we used to have and definately worth a first broad testing.
I've revived rifflib. Rifflib used to be a bytestream-for-riff, which
just dup'ed bytestream. I've rewritten rifflib to be a modern riff-
chunk parser that uses bytestream fully, plus adds some extra functions
so that riff file parsing becomes extremely easy. It also contains some
small usability functions for strh/strf and metadata parsing. Note that
it doesn't use the new tagging yet, that's a TODO.
Avidemux has been rewritten to use this. I think we all agreed that
avidemux was pretty much a big mess, which is because it used all
sort of bytestream magic all around the place. It was just ugly.
This is a lot nicer, very complete and safe. I think this is far more
robust than what the old avidemux could ever have been. Of course, it
might contain bugs, please let me know.
EBML writing has also been implemented. This is useful for matroska.
I'm intending to modify avidemux (with a riffwriter) similarly. Maybe
I'll change wavparse/-enc too to use rifflib.
Lastly, several plugins have been modified to use rifflib's fourcc
parsing instead of their own. this puts fourcc parsing in one central
place, which should make it a lot simpler to add new fourccs. We might
want to move this to its own lib instead of rifflib.
Enjoy!
2003-12-07 20:00:33 +00:00
|
|
|
#include <gst/riff/riff-ids.h>
|
2002-10-17 21:41:47 +00:00
|
|
|
#include "gstasfdemux.h"
|
2004-03-15 19:32:25 +00:00
|
|
|
#include "gstasfmux.h" /* for the type registering */
|
2003-01-31 21:41:07 +00:00
|
|
|
#include "asfheaders.h"
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
/* elementfactory information */
|
|
|
|
static GstElementDetails gst_asf_demux_details = {
|
|
|
|
"ASF Demuxer",
|
|
|
|
"Codec/Demuxer",
|
|
|
|
"Demultiplexes ASF Streams",
|
|
|
|
"Owen Fraser-Green <owen@discobabe.net>",
|
|
|
|
};
|
|
|
|
|
2003-12-22 01:47:08 +00:00
|
|
|
static GstStaticPadTemplate gst_asf_demux_sink_template =
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
|
|
|
GST_STATIC_CAPS ("video/x-ms-asf")
|
|
|
|
);
|
2004-01-27 01:27:04 +00:00
|
|
|
|
|
|
|
GST_DEBUG_CATEGORY_STATIC (asf_debug);
|
|
|
|
#define GST_CAT_DEFAULT asf_debug
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
static void gst_asf_demux_base_init (gpointer g_class);
|
|
|
|
static void gst_asf_demux_class_init (GstASFDemuxClass * klass);
|
|
|
|
static void gst_asf_demux_init (GstASFDemux * asf_demux);
|
|
|
|
static gboolean gst_asf_demux_send_event (GstElement * element,
|
|
|
|
GstEvent * event);
|
|
|
|
static void gst_asf_demux_loop (GstElement * element);
|
|
|
|
static gboolean gst_asf_demux_process_object (GstASFDemux * asf_demux);
|
|
|
|
static void gst_asf_demux_get_property (GObject * object,
|
|
|
|
guint prop_id, GValue * value, GParamSpec * pspec);
|
|
|
|
static guint32 gst_asf_demux_identify_guid (GstASFDemux * asf_demux,
|
|
|
|
ASFGuidHash * guids, ASFGuid * guid_raw);
|
|
|
|
static gboolean gst_asf_demux_process_chunk (GstASFDemux * asf_demux,
|
|
|
|
asf_packet_info * packet_info, asf_segment_info * segment_info);
|
|
|
|
static const GstEventMask *gst_asf_demux_get_src_event_mask (GstPad * pad);
|
|
|
|
static gboolean gst_asf_demux_handle_sink_event (GstASFDemux * asf_demux,
|
|
|
|
GstEvent * event, guint32 remaining);
|
|
|
|
static gboolean gst_asf_demux_handle_src_event (GstPad * pad, GstEvent * event);
|
|
|
|
static const GstFormat *gst_asf_demux_get_src_formats (GstPad * pad);
|
|
|
|
static const GstQueryType *gst_asf_demux_get_src_query_types (GstPad * pad);
|
|
|
|
static gboolean gst_asf_demux_handle_src_query (GstPad * pad,
|
|
|
|
GstQueryType type, GstFormat * format, gint64 * value);
|
|
|
|
static gboolean gst_asf_demux_add_video_stream (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_video_format * video_format, guint16 id);
|
|
|
|
static gboolean gst_asf_demux_add_audio_stream (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_audio * audio, guint16 id);
|
|
|
|
static gboolean gst_asf_demux_setup_pad (GstASFDemux * asf_demux,
|
|
|
|
GstPad * src_pad, GstCaps * caps, guint16 id);
|
|
|
|
|
|
|
|
static GstElementStateReturn gst_asf_demux_change_state (GstElement * element);
|
|
|
|
static GstCaps *gst_asf_demux_video_caps (guint32 codec_fcc,
|
|
|
|
asf_stream_video_format * video, char **codec_name);
|
|
|
|
static GstCaps *gst_asf_demux_audio_caps (guint16 codec_id,
|
|
|
|
asf_stream_audio * audio, guint8 * extradata, char **codec_name);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
static GstPadTemplate *videosrctempl, *audiosrctempl;
|
2002-10-17 21:41:47 +00:00
|
|
|
static GstElementClass *parent_class = NULL;
|
|
|
|
|
|
|
|
GType
|
|
|
|
asf_demux_get_type (void)
|
|
|
|
{
|
|
|
|
static GType asf_demux_type = 0;
|
|
|
|
|
|
|
|
if (!asf_demux_type) {
|
|
|
|
static const GTypeInfo asf_demux_info = {
|
2004-03-14 22:34:30 +00:00
|
|
|
sizeof (GstASFDemuxClass),
|
2003-11-01 11:28:53 +00:00
|
|
|
gst_asf_demux_base_init,
|
2002-10-17 21:41:47 +00:00
|
|
|
NULL,
|
2004-03-14 22:34:30 +00:00
|
|
|
(GClassInitFunc) gst_asf_demux_class_init,
|
2002-10-17 21:41:47 +00:00
|
|
|
NULL,
|
|
|
|
NULL,
|
2004-03-14 22:34:30 +00:00
|
|
|
sizeof (GstASFDemux),
|
2002-10-17 21:41:47 +00:00
|
|
|
0,
|
2004-03-14 22:34:30 +00:00
|
|
|
(GInstanceInitFunc) gst_asf_demux_init,
|
2002-10-17 21:41:47 +00:00
|
|
|
};
|
2004-03-15 19:32:25 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_demux_type =
|
2004-03-15 19:32:25 +00:00
|
|
|
g_type_register_static (GST_TYPE_ELEMENT, "GstASFDemux",
|
|
|
|
&asf_demux_info, 0);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
return asf_demux_type;
|
|
|
|
}
|
|
|
|
|
2003-11-01 11:28:53 +00:00
|
|
|
static void
|
|
|
|
gst_asf_demux_base_init (gpointer g_class)
|
|
|
|
{
|
|
|
|
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
|
|
|
|
int i;
|
2003-12-22 01:47:08 +00:00
|
|
|
GstCaps *audcaps, *vidcaps, *temp;
|
2003-11-01 11:28:53 +00:00
|
|
|
guint32 vid_list[] = {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_MAKE_FOURCC ('I', '4', '2', '0'),
|
|
|
|
GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'),
|
|
|
|
GST_MAKE_FOURCC ('M', 'J', 'P', 'G'),
|
|
|
|
GST_MAKE_FOURCC ('D', 'V', 'S', 'D'),
|
|
|
|
GST_MAKE_FOURCC ('W', 'M', 'V', '1'),
|
|
|
|
GST_MAKE_FOURCC ('W', 'M', 'V', '2'),
|
|
|
|
GST_MAKE_FOURCC ('M', 'P', 'G', '4'),
|
|
|
|
GST_MAKE_FOURCC ('M', 'P', '4', '2'),
|
|
|
|
GST_MAKE_FOURCC ('M', 'P', '4', '3'),
|
|
|
|
GST_MAKE_FOURCC ('D', 'I', 'V', '3'),
|
|
|
|
GST_MAKE_FOURCC ('D', 'X', '5', '0'),
|
2004-03-15 19:32:25 +00:00
|
|
|
0 /* end */
|
2003-11-01 11:28:53 +00:00
|
|
|
};
|
|
|
|
gint aud_list[] = {
|
|
|
|
GST_RIFF_WAVE_FORMAT_MPEGL3,
|
|
|
|
GST_RIFF_WAVE_FORMAT_MPEGL12,
|
|
|
|
GST_RIFF_WAVE_FORMAT_PCM,
|
|
|
|
GST_RIFF_WAVE_FORMAT_VORBIS1,
|
|
|
|
GST_RIFF_WAVE_FORMAT_A52,
|
|
|
|
GST_RIFF_WAVE_FORMAT_DIVX_WMAV1,
|
|
|
|
GST_RIFF_WAVE_FORMAT_DIVX_WMAV2,
|
|
|
|
GST_RIFF_WAVE_FORMAT_WMAV9,
|
2004-03-15 19:32:25 +00:00
|
|
|
-1 /* end */
|
2003-11-01 11:28:53 +00:00
|
|
|
};
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
audcaps = gst_caps_new_empty ();
|
2003-11-01 11:28:53 +00:00
|
|
|
for (i = 0; aud_list[i] != -1; i++) {
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
temp = gst_asf_demux_audio_caps (aud_list[i], NULL, NULL, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_caps_append (audcaps, temp);
|
2003-11-01 11:28:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
audiosrctempl = gst_pad_template_new ("audio_%02d",
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_PAD_SRC, GST_PAD_SOMETIMES, audcaps);
|
2003-12-22 01:47:08 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
vidcaps = gst_caps_new_empty ();
|
2003-11-01 11:28:53 +00:00
|
|
|
for (i = 0; vid_list[i] != 0; i++) {
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
temp = gst_asf_demux_video_caps (vid_list[i], NULL, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_caps_append (vidcaps, temp);
|
2003-11-01 11:28:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
videosrctempl = gst_pad_template_new ("video_%02d",
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_PAD_SRC, GST_PAD_SOMETIMES, vidcaps);
|
2003-11-01 11:28:53 +00:00
|
|
|
gst_element_class_add_pad_template (element_class, audiosrctempl);
|
|
|
|
gst_element_class_add_pad_template (element_class, videosrctempl);
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_element_class_add_pad_template (element_class,
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_static_pad_template_get (&gst_asf_demux_sink_template));
|
2003-11-01 11:28:53 +00:00
|
|
|
gst_element_class_set_details (element_class, &gst_asf_demux_details);
|
|
|
|
}
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_class_init (GstASFDemuxClass * klass)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
GObjectClass *gobject_class;
|
|
|
|
GstElementClass *gstelement_class;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gstelement_class = (GstElementClass *) klass;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
gobject_class->get_property = gst_asf_demux_get_property;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
gstelement_class->change_state = gst_asf_demux_change_state;
|
|
|
|
gstelement_class->send_event = gst_asf_demux_send_event;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_init (GstASFDemux * asf_demux)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2003-01-31 18:23:38 +00:00
|
|
|
guint i;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_demux->sinkpad =
|
|
|
|
gst_pad_new_from_template (gst_static_pad_template_get
|
|
|
|
(&gst_asf_demux_sink_template), "sink");
|
2002-10-17 21:41:47 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (asf_demux), asf_demux->sinkpad);
|
|
|
|
|
|
|
|
gst_element_set_loop_function (GST_ELEMENT (asf_demux), gst_asf_demux_loop);
|
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
/* We should zero everything to be on the safe side */
|
|
|
|
for (i = 0; i < GST_ASF_DEMUX_NUM_VIDEO_PADS; i++) {
|
2002-10-17 21:41:47 +00:00
|
|
|
asf_demux->video_pad[i] = NULL;
|
|
|
|
asf_demux->video_PTS[i] = 0;
|
|
|
|
}
|
2003-01-31 18:23:38 +00:00
|
|
|
|
|
|
|
for (i = 0; i < GST_ASF_DEMUX_NUM_AUDIO_PADS; i++) {
|
2002-10-17 21:41:47 +00:00
|
|
|
asf_demux->audio_pad[i] = NULL;
|
|
|
|
asf_demux->audio_PTS[i] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
asf_demux->num_audio_streams = 0;
|
|
|
|
asf_demux->num_video_streams = 0;
|
|
|
|
asf_demux->num_streams = 0;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
GST_FLAG_SET (asf_demux, GST_ELEMENT_EVENT_AWARE);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_send_event (GstElement * element, GstEvent * event)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
const GList *pads;
|
|
|
|
|
|
|
|
pads = gst_element_get_pad_list (element);
|
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
while (pads) {
|
2002-10-17 21:41:47 +00:00
|
|
|
GstPad *pad = GST_PAD (pads->data);
|
|
|
|
|
|
|
|
if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) {
|
|
|
|
/* we ref the event here as we might have to try again if the event
|
|
|
|
* failed on this pad */
|
|
|
|
gst_event_ref (event);
|
|
|
|
if (gst_asf_demux_handle_src_event (pad, event)) {
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
return TRUE;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
pads = g_list_next (pads);
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_loop (GstElement * element)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
GstASFDemux *asf_demux;
|
|
|
|
|
|
|
|
g_return_if_fail (element != NULL);
|
|
|
|
g_return_if_fail (GST_IS_ASF_DEMUX (element));
|
|
|
|
|
|
|
|
asf_demux = GST_ASF_DEMUX (element);
|
|
|
|
|
|
|
|
/* this is basically an infinite loop */
|
2003-10-09 09:06:04 +00:00
|
|
|
gst_asf_demux_process_object (asf_demux);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static guint32
|
|
|
|
_read_var_length (GstASFDemux * asf_demux, guint8 type, guint32 * rsize)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
guint32 got_bytes;
|
2003-06-30 06:45:29 +00:00
|
|
|
guint8 *var;
|
2002-10-17 21:41:47 +00:00
|
|
|
guint32 ret = 0;
|
|
|
|
GstByteStream *bs = asf_demux->bs;
|
|
|
|
|
|
|
|
if (type == 0) {
|
|
|
|
return 0;
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-06-30 06:45:29 +00:00
|
|
|
got_bytes = gst_bytestream_peek_bytes (bs, &var, 4);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
while (got_bytes < 4) {
|
|
|
|
guint32 remaining;
|
|
|
|
GstEvent *event;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
gst_bytestream_get_status (bs, &remaining, &event);
|
|
|
|
gst_event_unref (event);
|
|
|
|
|
2003-06-30 06:45:29 +00:00
|
|
|
got_bytes = gst_bytestream_peek_bytes (bs, &var, 4);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
switch (type) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case 1:
|
|
|
|
ret = GUINT32_FROM_LE (*(guint32 *) var) & 0xff;
|
|
|
|
gst_bytestream_flush (bs, 1);
|
|
|
|
*rsize += 1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
ret = GUINT32_FROM_LE (*(guint32 *) var) & 0xffff;
|
|
|
|
gst_bytestream_flush (bs, 2);
|
|
|
|
*rsize += 2;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
ret = GUINT32_FROM_LE (*(guint32 *) var);
|
|
|
|
gst_bytestream_flush (bs, 4);
|
|
|
|
*rsize += 4;
|
|
|
|
break;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
#define READ_UINT_BITS_FUNCTION(bits) \
|
|
|
|
static gboolean \
|
|
|
|
_read_uint ## bits (GstASFDemux *asf_demux, guint ## bits *ret) \
|
|
|
|
{ \
|
|
|
|
GstEvent *event; \
|
|
|
|
guint32 remaining; \
|
|
|
|
guint8* data; \
|
|
|
|
\
|
|
|
|
g_return_val_if_fail (ret != NULL, FALSE); \
|
|
|
|
\
|
|
|
|
do { \
|
|
|
|
if (gst_bytestream_peek_bytes (asf_demux->bs, &data, bits / 8) == bits / 8) { \
|
|
|
|
*ret = GUINT ## bits ## _FROM_LE (*((guint ## bits *) data)); \
|
|
|
|
gst_bytestream_flush (asf_demux->bs, bits / 8); \
|
|
|
|
return TRUE; \
|
|
|
|
} \
|
|
|
|
gst_bytestream_get_status (asf_demux->bs, &remaining, &event); \
|
|
|
|
} while (gst_asf_demux_handle_sink_event (asf_demux, event, remaining)); \
|
|
|
|
\
|
|
|
|
return FALSE; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef GUINT8_FROM_LE
|
|
|
|
# define GUINT8_FROM_LE(x) (x)
|
|
|
|
#endif
|
|
|
|
READ_UINT_BITS_FUNCTION (8)
|
2004-03-14 22:34:30 +00:00
|
|
|
READ_UINT_BITS_FUNCTION (16)
|
|
|
|
READ_UINT_BITS_FUNCTION (32)
|
|
|
|
READ_UINT_BITS_FUNCTION (64)
|
2004-01-27 01:27:04 +00:00
|
|
|
#define GET_UINT(a,b)
|
2004-03-14 22:34:30 +00:00
|
|
|
static gboolean _read_guid (GstASFDemux * asf_demux, ASFGuid * guid)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint32 (asf_demux, &guid->v1) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint32 (asf_demux, &guid->v2) &&
|
|
|
|
_read_uint32 (asf_demux, &guid->v3) &&
|
|
|
|
_read_uint32 (asf_demux, &guid->v4));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_file (GstASFDemux * asf_demux, asf_obj_file * object)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_guid (asf_demux, &object->file_id) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint64 (asf_demux, &object->file_size) &&
|
|
|
|
_read_uint64 (asf_demux, &object->creation_time) &&
|
|
|
|
_read_uint64 (asf_demux, &object->packets_count) &&
|
|
|
|
_read_uint64 (asf_demux, &object->play_time) &&
|
|
|
|
_read_uint64 (asf_demux, &object->send_time) &&
|
|
|
|
_read_uint64 (asf_demux, &object->preroll) &&
|
|
|
|
_read_uint32 (asf_demux, &object->flags) &&
|
|
|
|
_read_uint32 (asf_demux, &object->min_pktsize) &&
|
|
|
|
_read_uint32 (asf_demux, &object->max_pktsize) &&
|
|
|
|
_read_uint32 (asf_demux, &object->min_bitrate));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_bitrate_record (GstASFDemux * asf_demux, asf_bitrate_record * record)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint16 (asf_demux, &record->stream_id) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint32 (asf_demux, &record->bitrate));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_comment (GstASFDemux * asf_demux, asf_obj_comment * comment)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint16 (asf_demux, &comment->title_length) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint16 (asf_demux, &comment->author_length) &&
|
|
|
|
_read_uint16 (asf_demux, &comment->copyright_length) &&
|
|
|
|
_read_uint16 (asf_demux, &comment->description_length) &&
|
|
|
|
_read_uint16 (asf_demux, &comment->rating_length));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_header (GstASFDemux * asf_demux, asf_obj_header * header)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint32 (asf_demux, &header->num_objects) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &header->unknown1) &&
|
|
|
|
_read_uint8 (asf_demux, &header->unknown2));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_stream (GstASFDemux * asf_demux, asf_obj_stream * stream)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_guid (asf_demux, &stream->type) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_guid (asf_demux, &stream->correction) &&
|
|
|
|
_read_uint64 (asf_demux, &stream->unknown1) &&
|
|
|
|
_read_uint32 (asf_demux, &stream->type_specific_size) &&
|
|
|
|
_read_uint32 (asf_demux, &stream->stream_specific_size) &&
|
|
|
|
_read_uint16 (asf_demux, &stream->id) &&
|
|
|
|
_read_uint32 (asf_demux, &stream->unknown2));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_replicated_data (GstASFDemux * asf_demux, asf_replicated_data * rep)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint32 (asf_demux, &rep->object_size) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint32 (asf_demux, &rep->frag_timestamp));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_data (GstASFDemux * asf_demux, asf_obj_data * object)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_guid (asf_demux, &object->file_id) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint64 (asf_demux, &object->packets) &&
|
|
|
|
_read_uint8 (asf_demux, &object->unknown1) &&
|
2004-03-15 19:32:25 +00:00
|
|
|
/*_read_uint8 (asf_demux, &object->unknown2) && */
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &object->correction));
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_data_correction (GstASFDemux * asf_demux,
|
|
|
|
asf_obj_data_correction * object)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint8 (asf_demux, &object->type) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &object->cycle));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_data_packet (GstASFDemux * asf_demux, asf_obj_data_packet * object)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint8 (asf_demux, &object->flags) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &object->property));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_stream_audio (GstASFDemux * asf_demux, asf_stream_audio * audio)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint16 (asf_demux, &audio->codec_tag) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint16 (asf_demux, &audio->channels) &&
|
|
|
|
_read_uint32 (asf_demux, &audio->sample_rate) &&
|
|
|
|
_read_uint32 (asf_demux, &audio->byte_rate) &&
|
|
|
|
_read_uint16 (asf_demux, &audio->block_align) &&
|
|
|
|
_read_uint16 (asf_demux, &audio->word_size) &&
|
|
|
|
_read_uint16 (asf_demux, &audio->size));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_stream_correction (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_correction * object)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint8 (asf_demux, &object->span) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint16 (asf_demux, &object->packet_size) &&
|
|
|
|
_read_uint16 (asf_demux, &object->chunk_size) &&
|
|
|
|
_read_uint16 (asf_demux, &object->data_size) &&
|
|
|
|
_read_uint8 (asf_demux, &object->silence_data));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_stream_video (GstASFDemux * asf_demux, asf_stream_video * video)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint32 (asf_demux, &video->width) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint32 (asf_demux, &video->height) &&
|
|
|
|
_read_uint8 (asf_demux, &video->unknown) &&
|
|
|
|
_read_uint16 (asf_demux, &video->size));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_stream_video_format (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_video_format * fmt)
|
2004-01-27 01:27:04 +00:00
|
|
|
{
|
|
|
|
return (_read_uint32 (asf_demux, &fmt->size) &&
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint32 (asf_demux, &fmt->width) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->height) &&
|
|
|
|
_read_uint16 (asf_demux, &fmt->planes) &&
|
|
|
|
_read_uint16 (asf_demux, &fmt->depth) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->tag) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->image_size) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->xpels_meter) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->ypels_meter) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->num_colors) &&
|
|
|
|
_read_uint32 (asf_demux, &fmt->imp_colors));
|
2004-01-27 01:27:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_file (GstASFDemux * asf_demux, guint64 * obj_size)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_obj_file object;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* Get the rest of the header's header */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_obj_file (asf_demux, &object);
|
|
|
|
asf_demux->packet_size = object.max_pktsize;
|
|
|
|
asf_demux->play_time = (guint32) object.play_time / 10;
|
|
|
|
asf_demux->preroll = object.preroll;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_INFO ("Object is a file with %" G_GUINT64_FORMAT " data packets",
|
|
|
|
object.packets_count);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_bitrate_props_object (GstASFDemux * asf_demux,
|
|
|
|
guint64 * obj_size)
|
2003-01-31 21:10:00 +00:00
|
|
|
{
|
2004-03-14 22:34:30 +00:00
|
|
|
guint16 num_streams;
|
|
|
|
guint8 stream_id;
|
|
|
|
guint16 i;
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_bitrate_record bitrate_record;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
if (!_read_uint16 (asf_demux, &num_streams))
|
|
|
|
return FALSE;
|
2003-01-31 21:10:00 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is a bitrate properties object with %u streams.",
|
|
|
|
num_streams);
|
2003-01-31 21:10:00 +00:00
|
|
|
|
|
|
|
for (i = 0; i < num_streams; i++) {
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_bitrate_record (asf_demux, &bitrate_record);
|
|
|
|
stream_id = bitrate_record.stream_id & 0x7f;
|
|
|
|
asf_demux->bitrate[stream_id] = bitrate_record.bitrate;
|
2003-01-31 21:10:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_comment (GstASFDemux * asf_demux, guint64 * obj_size)
|
2003-01-31 21:10:00 +00:00
|
|
|
{
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_obj_comment object;
|
2003-01-31 21:10:00 +00:00
|
|
|
GstByteStream *bs = asf_demux->bs;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is a comment.");
|
2003-01-31 21:10:00 +00:00
|
|
|
|
|
|
|
/* Get the rest of the comment's header */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_obj_comment (asf_demux, &object);
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG
|
|
|
|
("Comment lengths: title=%d author=%d copyright=%d description=%d rating=%d",
|
|
|
|
object.title_length, object.author_length, object.copyright_length,
|
|
|
|
object.description_length, object.rating_length);
|
2003-01-31 21:10:00 +00:00
|
|
|
|
|
|
|
/* We don't do anything with them at the moment so just skip them */
|
2004-01-27 01:27:04 +00:00
|
|
|
gst_bytestream_flush (bs, object.title_length);
|
|
|
|
gst_bytestream_flush (bs, object.author_length);
|
|
|
|
gst_bytestream_flush (bs, object.copyright_length);
|
|
|
|
gst_bytestream_flush (bs, object.description_length);
|
|
|
|
gst_bytestream_flush (bs, object.rating_length);
|
2003-01-31 21:10:00 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_header (GstASFDemux * asf_demux, guint64 * obj_size)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_obj_header object;
|
2002-10-17 21:41:47 +00:00
|
|
|
guint32 i;
|
|
|
|
|
|
|
|
/* Get the rest of the header's header */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_obj_header (asf_demux, &object);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is a header with %u parts", object.num_objects);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
/* Loop through the header's objects, processing those */
|
2004-01-27 01:27:04 +00:00
|
|
|
for (i = 0; i < object.num_objects; i++) {
|
2003-10-09 09:06:04 +00:00
|
|
|
if (!gst_asf_demux_process_object (asf_demux)) {
|
2002-10-17 21:41:47 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_segment (GstASFDemux * asf_demux,
|
|
|
|
asf_packet_info * packet_info)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2004-03-14 22:34:30 +00:00
|
|
|
guint8 byte;
|
2002-10-17 21:41:47 +00:00
|
|
|
gboolean key_frame;
|
2004-03-14 22:34:30 +00:00
|
|
|
guint32 replic_size;
|
|
|
|
guint8 time_delta;
|
|
|
|
guint32 time_start;
|
|
|
|
guint32 frag_size;
|
|
|
|
guint32 rsize;
|
2002-10-17 21:41:47 +00:00
|
|
|
asf_segment_info segment_info;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &byte);
|
|
|
|
rsize = 1;
|
2004-01-27 01:27:04 +00:00
|
|
|
segment_info.stream_number = byte & 0x7f;
|
|
|
|
key_frame = (byte & 0x80) >> 7;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_INFO ("Processing segment for stream %u", segment_info.stream_number);
|
|
|
|
segment_info.sequence =
|
|
|
|
_read_var_length (asf_demux, packet_info->seqtype, &rsize);
|
|
|
|
segment_info.frag_offset =
|
|
|
|
_read_var_length (asf_demux, packet_info->fragoffsettype, &rsize);
|
|
|
|
replic_size =
|
|
|
|
_read_var_length (asf_demux, packet_info->replicsizetype, &rsize);
|
|
|
|
GST_DEBUG ("sequence = %x, frag_offset = %x, replic_size = %x",
|
|
|
|
segment_info.sequence, segment_info.frag_offset, replic_size);
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
if (replic_size > 1) {
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_replicated_data replicated_data_header;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
segment_info.compressed = FALSE;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
/* It's uncompressed with replic data */
|
2002-10-17 21:41:47 +00:00
|
|
|
if (replic_size < 8) {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_ELEMENT_ERROR (asf_demux, STREAM, DEMUX, (NULL),
|
2004-03-15 19:32:25 +00:00
|
|
|
("The payload has replicated data but the size is less than 8"));
|
2002-10-17 21:41:47 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_replicated_data (asf_demux, &replicated_data_header);
|
|
|
|
segment_info.frag_timestamp = replicated_data_header.frag_timestamp;
|
|
|
|
segment_info.segment_size = replicated_data_header.object_size;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
if (replic_size > 8) {
|
2004-01-27 01:27:04 +00:00
|
|
|
gst_bytestream_flush (asf_demux->bs, replic_size - 8);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rsize += replic_size;
|
|
|
|
} else {
|
|
|
|
if (replic_size == 1) {
|
|
|
|
/* It's compressed */
|
|
|
|
segment_info.compressed = TRUE;
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &time_delta);
|
|
|
|
rsize++;
|
2003-06-29 19:46:09 +00:00
|
|
|
GST_DEBUG ("time_delta %u", time_delta);
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
|
|
|
segment_info.compressed = FALSE;
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
time_start = segment_info.frag_offset;
|
|
|
|
segment_info.frag_offset = 0;
|
2003-01-23 11:15:49 +00:00
|
|
|
segment_info.frag_timestamp = asf_demux->timestamp;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("multiple = %u compressed = %u", packet_info->multiple,
|
|
|
|
segment_info.compressed);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
if (packet_info->multiple) {
|
2004-01-27 01:27:04 +00:00
|
|
|
frag_size = _read_var_length (asf_demux, packet_info->segsizetype, &rsize);
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
|
|
|
frag_size = packet_info->size_left - rsize;
|
|
|
|
}
|
|
|
|
|
|
|
|
packet_info->size_left -= rsize;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_DEBUG ("size left = %u frag size = %u rsize = %u", packet_info->size_left,
|
|
|
|
frag_size, rsize);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
if (segment_info.compressed) {
|
|
|
|
while (frag_size > 0) {
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_uint8 (asf_demux, &byte);
|
2002-10-17 21:41:47 +00:00
|
|
|
packet_info->size_left--;
|
2004-01-27 01:27:04 +00:00
|
|
|
segment_info.chunk_size = byte;
|
2003-01-31 18:23:38 +00:00
|
|
|
segment_info.segment_size = segment_info.chunk_size;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
if (segment_info.chunk_size > packet_info->size_left) {
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_ELEMENT_ERROR (asf_demux, STREAM, DEMUX, (NULL),
|
|
|
|
("Payload chunk overruns packet size."));
|
|
|
|
return FALSE;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gst_asf_demux_process_chunk (asf_demux, packet_info, &segment_info);
|
|
|
|
|
|
|
|
frag_size -= segment_info.chunk_size + 1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
segment_info.chunk_size = frag_size;
|
|
|
|
gst_asf_demux_process_chunk (asf_demux, packet_info, &segment_info);
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_data (GstASFDemux * asf_demux, guint64 * obj_size)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_obj_data object;
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_obj_data_packet packet_properties_object;
|
2004-03-14 22:34:30 +00:00
|
|
|
gboolean correction;
|
|
|
|
guint64 packets;
|
|
|
|
guint64 packet;
|
|
|
|
guint8 buf;
|
|
|
|
guint32 sequence;
|
|
|
|
guint32 packet_length;
|
|
|
|
guint16 duration;
|
|
|
|
guint8 segment;
|
|
|
|
guint8 segments;
|
|
|
|
guint8 flags;
|
|
|
|
guint8 property;
|
|
|
|
asf_packet_info packet_info;
|
|
|
|
guint32 rsize;
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* Get the rest of the header */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_obj_data (asf_demux, &object);
|
|
|
|
packets = object.packets;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is data with %" G_GUINT64_FORMAT " packets", packets);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
for (packet = 0; packet < packets; packet++) {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("\n\nProcess packet %" G_GUINT64_FORMAT, packet);
|
|
|
|
|
|
|
|
_read_uint8 (asf_demux, &buf);
|
|
|
|
rsize = 1;
|
2004-01-27 01:27:04 +00:00
|
|
|
if (buf & 0x80) {
|
|
|
|
asf_obj_data_correction correction_object;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* Uses error correction */
|
|
|
|
correction = TRUE;
|
2004-01-27 01:27:04 +00:00
|
|
|
GST_DEBUG ("Data has error correction (%x)", buf);
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_data_correction (asf_demux, &correction_object);
|
|
|
|
rsize += 2;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* Read the packet flags */
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_obj_data_packet (asf_demux, &packet_properties_object);
|
|
|
|
rsize += 2;
|
2004-01-27 01:27:04 +00:00
|
|
|
flags = packet_properties_object.flags;
|
|
|
|
property = packet_properties_object.property;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
packet_info.multiple = flags & 0x01;
|
2004-01-27 01:27:04 +00:00
|
|
|
sequence = _read_var_length (asf_demux, (flags >> 1) & 0x03, &rsize);
|
2004-03-14 22:34:30 +00:00
|
|
|
packet_info.padsize =
|
2004-03-15 19:32:25 +00:00
|
|
|
_read_var_length (asf_demux, (flags >> 3) & 0x03, &rsize);
|
2004-03-14 22:34:30 +00:00
|
|
|
packet_length = _read_var_length (asf_demux, (flags >> 5) & 0x03, &rsize);
|
2002-10-17 21:41:47 +00:00
|
|
|
if (packet_length == 0)
|
|
|
|
packet_length = asf_demux->packet_size;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_DEBUG ("Multiple = %u, Sequence = %u, Padsize = %u, Packet length = %u",
|
2004-03-15 19:32:25 +00:00
|
|
|
packet_info.multiple, sequence, packet_info.padsize, packet_length);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* Read the property flags */
|
|
|
|
packet_info.replicsizetype = property & 0x03;
|
|
|
|
packet_info.fragoffsettype = (property >> 2) & 0x03;
|
|
|
|
packet_info.seqtype = (property >> 4) & 0x03;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_uint32 (asf_demux, &asf_demux->timestamp);
|
|
|
|
_read_uint16 (asf_demux, &duration);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
rsize += 6;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
GST_DEBUG ("Timestamp = %x, Duration = %x", asf_demux->timestamp, duration);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
if (packet_info.multiple) {
|
|
|
|
/* There are multiple payloads */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_uint8 (asf_demux, &buf);
|
2002-10-17 21:41:47 +00:00
|
|
|
rsize++;
|
2004-01-27 01:27:04 +00:00
|
|
|
packet_info.segsizetype = (buf >> 6) & 0x03;
|
|
|
|
segments = buf & 0x3f;
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
|
|
|
packet_info.segsizetype = 2;
|
|
|
|
segments = 1;
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
packet_info.size_left = packet_length - packet_info.padsize - rsize;
|
|
|
|
|
2003-06-29 19:46:09 +00:00
|
|
|
GST_DEBUG ("rsize: %u size left: %u", rsize, packet_info.size_left);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
for (segment = 0; segment < segments; segment++) {
|
|
|
|
if (!gst_asf_demux_process_segment (asf_demux, &packet_info))
|
2004-03-15 19:32:25 +00:00
|
|
|
return FALSE;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Skip the padding */
|
|
|
|
if (packet_info.padsize > 0)
|
|
|
|
gst_bytestream_flush (asf_demux->bs, packet_info.padsize);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2003-06-29 19:46:09 +00:00
|
|
|
GST_DEBUG ("Remaining size left: %u", packet_info.size_left);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
if (packet_info.size_left > 0)
|
|
|
|
gst_bytestream_flush (asf_demux->bs, packet_info.size_left);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_stream (GstASFDemux * asf_demux, guint64 * obj_size)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_obj_stream object;
|
|
|
|
guint32 stream_id;
|
|
|
|
guint32 correction;
|
|
|
|
asf_stream_audio audio_object;
|
|
|
|
asf_stream_correction correction_object;
|
|
|
|
asf_stream_video video_object;
|
2004-01-27 01:27:04 +00:00
|
|
|
asf_stream_video_format video_format_object;
|
2004-03-14 22:34:30 +00:00
|
|
|
guint16 size;
|
|
|
|
GstBuffer *buf;
|
|
|
|
guint32 got_bytes;
|
|
|
|
guint16 id;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
/* Get the rest of the header's header */
|
2004-01-27 01:27:04 +00:00
|
|
|
_read_obj_stream (asf_demux, &object);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
/* Identify the stream type */
|
2004-03-14 22:34:30 +00:00
|
|
|
stream_id =
|
|
|
|
gst_asf_demux_identify_guid (asf_demux, asf_stream_guids, &(object.type));
|
|
|
|
correction =
|
|
|
|
gst_asf_demux_identify_guid (asf_demux, asf_correction_guids,
|
|
|
|
&(object.correction));
|
2004-01-27 01:27:04 +00:00
|
|
|
id = object.id;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
switch (stream_id) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case ASF_STREAM_AUDIO:
|
|
|
|
_read_stream_audio (asf_demux, &audio_object);
|
|
|
|
size = audio_object.size;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is an audio stream with %u bytes of additional data.",
|
2004-03-15 19:32:25 +00:00
|
|
|
size);
|
2003-01-31 18:23:38 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
if (!gst_asf_demux_add_audio_stream (asf_demux, &audio_object, id))
|
2004-03-15 19:32:25 +00:00
|
|
|
return FALSE;
|
2003-01-31 18:23:38 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
switch (correction) {
|
2004-03-15 19:32:25 +00:00
|
|
|
case ASF_CORRECTION_ON:
|
|
|
|
GST_INFO ("Using error correction");
|
|
|
|
|
|
|
|
_read_stream_correction (asf_demux, &correction_object);
|
|
|
|
asf_demux->span = correction_object.span;
|
|
|
|
|
|
|
|
GST_DEBUG ("Descrambling: ps:%d cs:%d ds:%d s:%d sd:%d",
|
|
|
|
correction_object.packet_size, correction_object.chunk_size,
|
|
|
|
correction_object.data_size, (guint) correction_object.span,
|
|
|
|
(guint) correction_object.silence_data);
|
|
|
|
|
|
|
|
if (asf_demux->span > 1) {
|
|
|
|
if (!correction_object.chunk_size
|
|
|
|
|| ((correction_object.packet_size /
|
|
|
|
correction_object.chunk_size) <= 1))
|
|
|
|
/* Disable descrambling */
|
|
|
|
asf_demux->span = 0;
|
|
|
|
} else {
|
|
|
|
/* Descambling is enabled */
|
|
|
|
asf_demux->ds_packet_size = correction_object.packet_size;
|
|
|
|
asf_demux->ds_chunk_size = correction_object.chunk_size;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now skip the rest of the silence data */
|
|
|
|
if (correction_object.data_size > 1)
|
|
|
|
gst_bytestream_flush (asf_demux->bs,
|
|
|
|
correction_object.data_size - 1);
|
|
|
|
|
|
|
|
break;
|
|
|
|
case ASF_CORRECTION_OFF:
|
|
|
|
GST_INFO ("Error correction off");
|
|
|
|
gst_bytestream_flush (asf_demux->bs, object.stream_specific_size);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
GST_ELEMENT_ERROR (asf_demux, STREAM, DEMUX, (NULL),
|
|
|
|
("Audio stream using unknown error correction"));
|
|
|
|
return FALSE;
|
2003-01-31 18:23:38 +00:00
|
|
|
}
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
break;
|
2004-03-14 22:34:30 +00:00
|
|
|
case ASF_STREAM_VIDEO:
|
|
|
|
_read_stream_video (asf_demux, &video_object);
|
2004-03-15 19:32:25 +00:00
|
|
|
size = video_object.size - 40; /* Byte order gets offset by single byte */
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Object is a video stream with %u bytes of additional data.",
|
2004-03-15 19:32:25 +00:00
|
|
|
size);
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_stream_video_format (asf_demux, &video_format_object);
|
|
|
|
|
|
|
|
if (!gst_asf_demux_add_video_stream (asf_demux, &video_format_object, id))
|
2004-03-15 19:32:25 +00:00
|
|
|
return FALSE;
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
/* Read any additional information */
|
|
|
|
if (size) {
|
2004-03-15 19:32:25 +00:00
|
|
|
got_bytes = gst_bytestream_read (asf_demux->bs, &buf, size);
|
|
|
|
/* There is additional data */
|
|
|
|
while (got_bytes < size) {
|
|
|
|
guint32 remaining;
|
|
|
|
GstEvent *event;
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_bytestream_get_status (asf_demux->bs, &remaining, &event);
|
|
|
|
gst_event_unref (event);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
got_bytes = gst_bytestream_read (asf_demux->bs, &buf, size);
|
|
|
|
}
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
GST_ELEMENT_ERROR (asf_demux, STREAM, WRONG_TYPE, (NULL),
|
2004-03-15 19:32:25 +00:00
|
|
|
("unknown asf stream (id %08x)", (guint) stream_id));
|
2004-03-14 22:34:30 +00:00
|
|
|
return FALSE;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_skip_object (GstASFDemux * asf_demux, guint64 * obj_size)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
GstByteStream *bs = asf_demux->bs;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Skipping object...");
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
gst_bytestream_flush (bs, *obj_size - 24);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
static inline gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
_read_object_header (GstASFDemux * asf_demux, guint32 * obj_id,
|
|
|
|
guint64 * obj_size)
|
2003-01-31 21:10:00 +00:00
|
|
|
{
|
2004-03-14 22:34:30 +00:00
|
|
|
ASFGuid guid;
|
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
/* First get the GUID */
|
2004-01-27 01:27:04 +00:00
|
|
|
if (!_read_guid (asf_demux, &guid))
|
2003-01-31 21:10:00 +00:00
|
|
|
return FALSE;
|
2004-01-27 01:27:04 +00:00
|
|
|
*obj_id = gst_asf_demux_identify_guid (asf_demux, asf_object_guids, &guid);
|
2003-01-31 21:10:00 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
if (!_read_uint64 (asf_demux, obj_size))
|
2003-01-31 21:10:00 +00:00
|
|
|
return FALSE;
|
2003-10-09 09:06:04 +00:00
|
|
|
|
|
|
|
if (*obj_id == ASF_OBJ_UNDEFINED) {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_WARNING_OBJECT (asf_demux,
|
2004-03-15 19:32:25 +00:00
|
|
|
"Could not identify object (0x%08x/0x%08x/0x%08x/0x%08x) with size=%llu",
|
|
|
|
guid.v1, guid.v2, guid.v3, guid.v4, *obj_size);
|
2003-10-09 09:06:04 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-01-31 21:10:00 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_process_object (GstASFDemux * asf_demux)
|
|
|
|
{
|
2002-10-17 21:41:47 +00:00
|
|
|
|
|
|
|
guint32 obj_id;
|
|
|
|
guint64 obj_size;
|
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
if (!_read_object_header (asf_demux, &obj_id, &obj_size)) {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG (" ***** Error reading object at filepos %" G_GUINT64_FORMAT
|
2004-03-15 19:32:25 +00:00
|
|
|
" (EOS?)\n", /**filepos*/ gst_bytestream_tell (asf_demux->bs));
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_handle_sink_event (asf_demux, gst_event_new (GST_EVENT_EOS),
|
2004-03-15 19:32:25 +00:00
|
|
|
0);
|
2002-10-17 21:41:47 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Found object %u with size %" G_GUINT64_FORMAT, obj_id, obj_size);
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2003-01-31 21:41:07 +00:00
|
|
|
switch (obj_id) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case ASF_OBJ_STREAM:
|
|
|
|
return gst_asf_demux_process_stream (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_DATA:
|
|
|
|
gst_asf_demux_process_data (asf_demux, &obj_size);
|
|
|
|
/* This is the last object */
|
|
|
|
return FALSE;
|
|
|
|
case ASF_OBJ_FILE:
|
|
|
|
return gst_asf_demux_process_file (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_HEADER:
|
|
|
|
return gst_asf_demux_process_header (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_CONCEAL_NONE:
|
|
|
|
break;
|
|
|
|
case ASF_OBJ_COMMENT:
|
|
|
|
return gst_asf_demux_process_comment (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_CODEC_COMMENT:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_INDEX:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_HEAD1:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_HEAD2:
|
|
|
|
break;
|
|
|
|
case ASF_OBJ_PADDING:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_EXT_CONTENT_DESC:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_BITRATE_PROPS:
|
|
|
|
return gst_asf_demux_process_bitrate_props_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_BITRATE_MUTEX:
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
|
|
|
case ASF_OBJ_UNDEFINED:
|
|
|
|
default:
|
|
|
|
/* unknown object read, just ignore it, we hate fatal errors */
|
|
|
|
return gst_asf_demux_skip_object (asf_demux, &obj_size);
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
|
|
|
|
static asf_stream_context *
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_get_stream (GstASFDemux * asf_demux, guint16 id)
|
2003-01-31 18:23:38 +00:00
|
|
|
{
|
|
|
|
guint8 i;
|
|
|
|
asf_stream_context *stream;
|
|
|
|
|
|
|
|
for (i = 0; i < asf_demux->num_streams; i++) {
|
|
|
|
stream = &asf_demux->stream[i];
|
|
|
|
if (stream->id == id) {
|
|
|
|
/* We've found the one with the matching id */
|
|
|
|
return &asf_demux->stream[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Base case if we haven't found one at all */
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_ELEMENT_ERROR (asf_demux, STREAM, DEMUX, (NULL),
|
|
|
|
("Segment found for undefined stream: (%d)", id));
|
2003-11-06 13:16:24 +00:00
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_descramble_segment (GstASFDemux * asf_demux,
|
|
|
|
asf_segment_info * segment_info, asf_stream_context * stream)
|
|
|
|
{
|
2003-01-31 18:23:38 +00:00
|
|
|
GstBuffer *scrambled_buffer;
|
|
|
|
GstBuffer *descrambled_buffer;
|
|
|
|
GstBuffer *sub_buffer;
|
2004-03-14 22:34:30 +00:00
|
|
|
guint offset;
|
|
|
|
guint off;
|
|
|
|
guint row;
|
|
|
|
guint col;
|
|
|
|
guint idx;
|
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
/* descrambled_buffer is initialised in the first iteration */
|
|
|
|
descrambled_buffer = NULL;
|
|
|
|
scrambled_buffer = stream->payload;
|
|
|
|
|
|
|
|
offset = 0;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
for (offset = 0; offset < segment_info->segment_size;
|
|
|
|
offset += asf_demux->ds_chunk_size) {
|
2003-01-31 18:23:38 +00:00
|
|
|
off = offset / asf_demux->ds_chunk_size;
|
|
|
|
row = off / asf_demux->span;
|
|
|
|
col = off % asf_demux->span;
|
|
|
|
idx = row + col * asf_demux->ds_packet_size / asf_demux->ds_chunk_size;
|
2004-03-14 22:34:30 +00:00
|
|
|
sub_buffer =
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_buffer_create_sub (scrambled_buffer, idx * asf_demux->ds_chunk_size,
|
|
|
|
asf_demux->ds_chunk_size);
|
2003-01-31 18:23:38 +00:00
|
|
|
if (!offset) {
|
|
|
|
descrambled_buffer = sub_buffer;
|
|
|
|
} else {
|
2004-03-06 01:25:57 +00:00
|
|
|
GstBuffer *newbuf;
|
|
|
|
|
|
|
|
newbuf = gst_buffer_merge (descrambled_buffer, sub_buffer);
|
2003-01-31 18:23:38 +00:00
|
|
|
gst_buffer_unref (sub_buffer);
|
2004-03-06 01:25:57 +00:00
|
|
|
gst_buffer_unref (descrambled_buffer);
|
|
|
|
descrambled_buffer = newbuf;
|
|
|
|
|
2003-01-31 18:23:38 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
stream->payload = descrambled_buffer;
|
|
|
|
gst_buffer_unref (scrambled_buffer);
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static gboolean
|
|
|
|
gst_asf_demux_process_chunk (GstASFDemux * asf_demux,
|
|
|
|
asf_packet_info * packet_info, asf_segment_info * segment_info)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
asf_stream_context *stream;
|
2004-03-14 22:34:30 +00:00
|
|
|
guint32 got_bytes;
|
|
|
|
GstByteStream *bs = asf_demux->bs;
|
|
|
|
GstBuffer *buffer;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
if (!(stream =
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_asf_demux_get_stream (asf_demux, segment_info->stream_number)))
|
2002-10-17 21:41:47 +00:00
|
|
|
return FALSE;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_DEBUG ("Processing chunk of size %u (fo = %d)", segment_info->chunk_size,
|
|
|
|
stream->frag_offset);
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
if (stream->frag_offset == 0) {
|
|
|
|
/* new packet */
|
|
|
|
stream->sequence = segment_info->sequence;
|
2003-01-23 11:15:49 +00:00
|
|
|
asf_demux->pts = segment_info->frag_timestamp - asf_demux->preroll;
|
|
|
|
got_bytes = gst_bytestream_peek (bs, &buffer, segment_info->chunk_size);
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("BUFFER: Copied stream to buffer (%p - %d)", buffer,
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_BUFFER_REFCOUNT_VALUE (buffer));
|
2003-01-23 11:15:49 +00:00
|
|
|
stream->payload = buffer;
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG
|
2004-03-15 19:32:25 +00:00
|
|
|
("segment_info->sequence = %d, stream->sequence = %d, segment_info->frag_offset = %d, stream->frag_offset = %d",
|
|
|
|
segment_info->sequence, stream->sequence, segment_info->frag_offset,
|
|
|
|
stream->frag_offset);
|
2004-03-14 22:34:30 +00:00
|
|
|
if (segment_info->sequence == stream->sequence
|
2004-03-15 19:32:25 +00:00
|
|
|
&& segment_info->frag_offset == stream->frag_offset) {
|
2003-01-23 11:15:49 +00:00
|
|
|
GstBuffer *new_buffer;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* continuing packet */
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("A continuation packet");
|
2003-01-23 11:15:49 +00:00
|
|
|
got_bytes = gst_bytestream_peek (bs, &buffer, segment_info->chunk_size);
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("Copied stream to buffer (%p - %d)", buffer,
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_BUFFER_REFCOUNT_VALUE (buffer));
|
2003-01-23 11:15:49 +00:00
|
|
|
new_buffer = gst_buffer_merge (stream->payload, buffer);
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG
|
2004-03-15 19:32:25 +00:00
|
|
|
("BUFFER: Merged new_buffer (%p - %d) from stream->payload(%p - %d) and buffer (%p - %d)",
|
|
|
|
new_buffer, GST_BUFFER_REFCOUNT_VALUE (new_buffer), stream->payload,
|
|
|
|
GST_BUFFER_REFCOUNT_VALUE (stream->payload), buffer,
|
|
|
|
GST_BUFFER_REFCOUNT_VALUE (buffer));
|
2003-01-31 18:23:38 +00:00
|
|
|
gst_buffer_unref (stream->payload);
|
|
|
|
gst_buffer_unref (buffer);
|
2003-01-23 11:15:49 +00:00
|
|
|
stream->payload = new_buffer;
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
|
|
|
/* cannot continue current packet: free it */
|
|
|
|
stream->frag_offset = 0;
|
|
|
|
if (segment_info->frag_offset != 0) {
|
2004-03-15 19:32:25 +00:00
|
|
|
/* cannot create new packet */
|
|
|
|
GST_DEBUG ("BUFFER: Freeing stream->payload (%p)", stream->payload);
|
|
|
|
gst_buffer_unref (stream->payload);
|
|
|
|
gst_bytestream_flush (bs, segment_info->chunk_size);
|
|
|
|
packet_info->size_left -= segment_info->chunk_size;
|
|
|
|
return TRUE;
|
2002-10-17 21:41:47 +00:00
|
|
|
} else {
|
2004-03-15 19:32:25 +00:00
|
|
|
/* create new packet */
|
|
|
|
stream->sequence = segment_info->sequence;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
stream->frag_offset += segment_info->chunk_size;
|
2003-01-31 18:23:38 +00:00
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("frag_offset = %d segment_size = %d ", stream->frag_offset,
|
|
|
|
segment_info->segment_size);
|
2003-01-31 18:23:38 +00:00
|
|
|
|
|
|
|
if (stream->frag_offset < segment_info->segment_size) {
|
2003-01-23 11:15:49 +00:00
|
|
|
/* We don't have the whole packet yet */
|
2003-01-31 18:23:38 +00:00
|
|
|
} else {
|
|
|
|
/* We have the whole packet now so we should push the packet to
|
|
|
|
the src pad now. First though we should check if we need to do
|
|
|
|
descrambling */
|
|
|
|
if (asf_demux->span > 1) {
|
|
|
|
gst_asf_demux_descramble_segment (asf_demux, segment_info, stream);
|
|
|
|
}
|
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
if (GST_PAD_IS_USABLE (stream->pad)) {
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("New buffer is at: %p size: %u",
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_BUFFER_DATA (stream->payload), GST_BUFFER_SIZE (stream->payload));
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_BUFFER_TIMESTAMP (stream->payload) =
|
2004-03-15 19:32:25 +00:00
|
|
|
(GST_SECOND / 1000) * asf_demux->pts;
|
2003-01-23 11:15:49 +00:00
|
|
|
|
|
|
|
/*!!! Should handle flush events here? */
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_DEBUG ("Sending strem %d of size %d", stream->id,
|
2004-03-15 19:32:25 +00:00
|
|
|
segment_info->chunk_size);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
GST_INFO ("Pushing pad");
|
2003-10-08 16:08:10 +00:00
|
|
|
gst_pad_push (stream->pad, GST_DATA (stream->payload));
|
2003-01-23 11:15:49 +00:00
|
|
|
}
|
2003-01-31 18:23:38 +00:00
|
|
|
|
|
|
|
stream->frag_offset = 0;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_bytestream_flush (bs, segment_info->chunk_size);
|
2002-10-17 21:41:47 +00:00
|
|
|
packet_info->size_left -= segment_info->chunk_size;
|
|
|
|
|
2003-06-29 19:46:09 +00:00
|
|
|
GST_DEBUG (" ");
|
2003-01-31 18:23:38 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
/*
|
|
|
|
* Event stuff
|
|
|
|
*/
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_handle_sink_event (GstASFDemux * asf_demux,
|
|
|
|
GstEvent * event, guint32 remaining)
|
2003-01-23 11:15:49 +00:00
|
|
|
{
|
|
|
|
GstEventType type;
|
2004-01-27 01:53:27 +00:00
|
|
|
gboolean ret = TRUE;
|
2003-11-05 23:14:52 +00:00
|
|
|
|
2004-01-27 01:53:27 +00:00
|
|
|
type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN;
|
2003-01-23 11:15:49 +00:00
|
|
|
|
|
|
|
switch (type) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_EVENT_EOS:{
|
2003-10-09 09:06:04 +00:00
|
|
|
asf_stream_context *stream;
|
|
|
|
GstEvent *event = gst_event_new (GST_EVENT_EOS);
|
|
|
|
gint n;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-10-09 09:06:04 +00:00
|
|
|
for (n = 0; n < asf_demux->num_streams; n++) {
|
2004-03-15 19:32:25 +00:00
|
|
|
stream = &asf_demux->stream[n];
|
|
|
|
gst_pad_push (stream->pad, GST_DATA (gst_event_ref (event)));
|
2003-10-09 09:06:04 +00:00
|
|
|
}
|
|
|
|
gst_event_unref (event);
|
2003-01-23 11:15:49 +00:00
|
|
|
gst_bytestream_flush (asf_demux->bs, remaining);
|
2003-10-09 09:06:04 +00:00
|
|
|
gst_element_set_eos (GST_ELEMENT (asf_demux));
|
2004-01-27 01:53:27 +00:00
|
|
|
ret = FALSE;
|
2003-01-23 11:15:49 +00:00
|
|
|
break;
|
2003-10-09 09:06:04 +00:00
|
|
|
}
|
2003-01-23 11:15:49 +00:00
|
|
|
case GST_EVENT_DISCONTINUOUS:
|
|
|
|
{
|
|
|
|
gint i;
|
|
|
|
GstEvent *discont;
|
|
|
|
|
|
|
|
for (i = 0; i < asf_demux->num_streams; i++) {
|
2004-03-15 19:32:25 +00:00
|
|
|
asf_stream_context *stream = &asf_demux->stream[i];
|
|
|
|
|
|
|
|
if (GST_PAD_IS_USABLE (stream->pad)) {
|
|
|
|
GST_DEBUG ("sending discont on %d %" G_GINT64_FORMAT " + %"
|
|
|
|
G_GINT64_FORMAT " = %" G_GINT64_FORMAT, i, asf_demux->last_seek,
|
|
|
|
stream->delay, asf_demux->last_seek + stream->delay);
|
|
|
|
discont =
|
|
|
|
gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME,
|
|
|
|
asf_demux->last_seek + stream->delay, NULL);
|
|
|
|
gst_pad_push (stream->pad, GST_DATA (discont));
|
|
|
|
}
|
2003-01-23 11:15:49 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2004-01-15 02:14:54 +00:00
|
|
|
case GST_EVENT_FLUSH:
|
|
|
|
GST_WARNING_OBJECT (asf_demux, "flush event");
|
|
|
|
break;
|
2003-01-23 11:15:49 +00:00
|
|
|
default:
|
2004-01-15 02:14:54 +00:00
|
|
|
GST_WARNING_OBJECT (asf_demux, "unhandled event %d", type);
|
2003-01-23 11:15:49 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
gst_event_unref (event);
|
|
|
|
|
2004-01-27 01:53:27 +00:00
|
|
|
return ret;
|
2003-01-23 11:15:49 +00:00
|
|
|
}
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_handle_src_event (GstPad * pad, GstEvent * event)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2003-06-29 19:46:09 +00:00
|
|
|
GST_DEBUG ("asfdemux: handle_src_event");
|
2002-10-17 21:41:47 +00:00
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static const GstEventMask *
|
|
|
|
gst_asf_demux_get_src_event_mask (GstPad * pad)
|
|
|
|
{
|
2002-10-17 21:41:47 +00:00
|
|
|
static const GstEventMask masks[] = {
|
2004-03-14 22:34:30 +00:00
|
|
|
{GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT},
|
|
|
|
{0,}
|
2002-10-17 21:41:47 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
return masks;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static const GstFormat *
|
|
|
|
gst_asf_demux_get_src_formats (GstPad * pad)
|
|
|
|
{
|
2002-10-17 21:41:47 +00:00
|
|
|
static const GstFormat formats[] = {
|
|
|
|
GST_FORMAT_TIME,
|
|
|
|
0
|
|
|
|
};
|
2004-03-15 19:32:25 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
return formats;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static const GstQueryType *
|
|
|
|
gst_asf_demux_get_src_query_types (GstPad * pad)
|
|
|
|
{
|
2002-12-30 17:53:18 +00:00
|
|
|
static const GstQueryType types[] = {
|
|
|
|
GST_QUERY_TOTAL,
|
|
|
|
GST_QUERY_POSITION,
|
2002-10-17 21:41:47 +00:00
|
|
|
0
|
|
|
|
};
|
|
|
|
|
|
|
|
return types;
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_handle_src_query (GstPad * pad,
|
|
|
|
GstQueryType type, GstFormat * format, gint64 * value)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
GstASFDemux *asf_demux;
|
|
|
|
gboolean res = TRUE;
|
|
|
|
|
|
|
|
asf_demux = GST_ASF_DEMUX (gst_pad_get_parent (pad));
|
|
|
|
|
|
|
|
switch (type) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_QUERY_TOTAL:
|
|
|
|
switch (*format) {
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_FORMAT_DEFAULT:
|
|
|
|
*format = GST_FORMAT_TIME;
|
|
|
|
/* fall through */
|
|
|
|
case GST_FORMAT_TIME:
|
|
|
|
*value = (GST_SECOND / 1000) * asf_demux->pts;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
res = FALSE;
|
2004-03-14 22:34:30 +00:00
|
|
|
}
|
2002-10-17 21:41:47 +00:00
|
|
|
break;
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_QUERY_POSITION:
|
|
|
|
switch (*format) {
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_FORMAT_DEFAULT:
|
|
|
|
*format = GST_FORMAT_TIME;
|
|
|
|
/* fall through */
|
|
|
|
case GST_FORMAT_TIME:
|
|
|
|
*value = (GST_SECOND / 1000) * asf_demux->timestamp;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
res = FALSE;
|
2004-03-14 22:34:30 +00:00
|
|
|
}
|
2002-10-17 21:41:47 +00:00
|
|
|
default:
|
|
|
|
res = FALSE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_get_property (GObject * object,
|
|
|
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
GstASFDemux *src;
|
|
|
|
|
|
|
|
g_return_if_fail (GST_IS_ASF_DEMUX (object));
|
|
|
|
|
|
|
|
src = GST_ASF_DEMUX (object);
|
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstElementStateReturn
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_change_state (GstElement * element)
|
|
|
|
{
|
2002-10-17 21:41:47 +00:00
|
|
|
GstASFDemux *asf_demux = GST_ASF_DEMUX (element);
|
|
|
|
gint i;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
switch (GST_STATE_TRANSITION (element)) {
|
|
|
|
case GST_STATE_READY_TO_PAUSED:
|
|
|
|
asf_demux->bs = gst_bytestream_new (asf_demux->sinkpad);
|
2003-01-23 11:15:49 +00:00
|
|
|
asf_demux->last_seek = 0;
|
2002-10-17 21:41:47 +00:00
|
|
|
break;
|
|
|
|
case GST_STATE_PAUSED_TO_READY:
|
|
|
|
gst_bytestream_destroy (asf_demux->bs);
|
2004-03-14 22:34:30 +00:00
|
|
|
for (i = 0; i < GST_ASF_DEMUX_NUM_VIDEO_PADS; i++) {
|
2004-03-15 19:32:25 +00:00
|
|
|
asf_demux->video_PTS[i] = 0;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
for (i = 0; i < GST_ASF_DEMUX_NUM_AUDIO_PADS; i++) {
|
2004-03-15 19:32:25 +00:00
|
|
|
asf_demux->audio_PTS[i] = 0;
|
2002-10-17 21:41:47 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case GST_STATE_READY_TO_NULL:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
|
|
|
|
}
|
|
|
|
|
|
|
|
static guint32
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_identify_guid (GstASFDemux * asf_demux,
|
|
|
|
ASFGuidHash * guids, ASFGuid * guid)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
|
|
|
guint32 i;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_LOG_OBJECT (asf_demux, "identifying 0x%08x/0x%08x/0x%08x/0x%08x",
|
|
|
|
guid->v1, guid->v2, guid->v3, guid->v4);
|
2002-10-17 21:41:47 +00:00
|
|
|
i = 0;
|
|
|
|
while (guids[i].obj_id != ASF_OBJ_UNDEFINED) {
|
2004-01-27 01:27:04 +00:00
|
|
|
if (guids[i].guid.v1 == guid->v1 &&
|
2004-03-15 19:32:25 +00:00
|
|
|
guids[i].guid.v2 == guid->v2 &&
|
|
|
|
guids[i].guid.v3 == guid->v3 && guids[i].guid.v4 == guid->v4) {
|
2002-10-17 21:41:47 +00:00
|
|
|
return guids[i].obj_id;
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* The base case if none is found */
|
|
|
|
return ASF_OBJ_UNDEFINED;
|
|
|
|
}
|
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
static GstCaps *
|
|
|
|
gst_asf_demux_audio_caps (guint16 codec_id,
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_stream_audio * audio, guint8 * extradata, char **codec_name)
|
2003-07-06 20:49:50 +00:00
|
|
|
{
|
2003-12-22 01:47:08 +00:00
|
|
|
GstCaps *caps;
|
2003-11-05 23:14:52 +00:00
|
|
|
gint flags1, flags2;
|
|
|
|
|
|
|
|
flags1 = 0;
|
|
|
|
flags2 = 0;
|
2003-07-06 20:49:50 +00:00
|
|
|
|
|
|
|
switch (codec_id) {
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_from_string ("audio/mpeg, mpegversion = (int) 1, "
|
2004-03-15 19:32:25 +00:00
|
|
|
"layer = (int) 3");
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("MPEG 1 layer 3");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_from_string ("audio/mpeg, mpegversion = (int) 1, "
|
2004-03-15 19:32:25 +00:00
|
|
|
"layer = (int) 2");
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("MPEG 1 layer 2");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_RIFF_WAVE_FORMAT_PCM: /* PCM/wav */ {
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-raw-int, "
|
2004-03-15 19:32:25 +00:00
|
|
|
"endianness = (int) LITTLE_ENDIAN,"
|
|
|
|
"signed = (boolean) { true, false }, "
|
|
|
|
"width = (int) { 8, 16 }, " "depth = (int) { 8, 16 }");
|
2003-07-06 20:49:50 +00:00
|
|
|
|
|
|
|
if (audio != NULL) {
|
2004-03-15 19:32:25 +00:00
|
|
|
gint ba = audio->block_align;
|
|
|
|
gint ch = audio->channels;
|
|
|
|
gint ws = audio->word_size;
|
2003-07-06 20:49:50 +00:00
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_caps_set_simple (caps,
|
|
|
|
"width", G_TYPE_INT, (int) (ba * 8 / ch),
|
|
|
|
"depth", G_TYPE_INT, ws, "signed", G_TYPE_BOOLEAN, (ws != 8), NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
}
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("PCM WAV");
|
2003-07-06 20:49:50 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2004-03-15 19:32:25 +00:00
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS1: /* vorbis mode 1 */
|
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS2: /* vorbis mode 2 */
|
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS3: /* vorbis mode 3 */
|
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS: /* vorbis mode 1+ */
|
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS: /* vorbis mode 2+ */
|
|
|
|
case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS: /* vorbis mode 3+ */
|
2004-03-14 22:34:30 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-vorbis");
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Vorbis");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GST_RIFF_WAVE_FORMAT_A52:
|
2004-03-14 22:34:30 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-ac3");
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("AC3");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GST_RIFF_WAVE_FORMAT_DIVX_WMAV1:
|
2003-11-05 23:14:52 +00:00
|
|
|
/* get flags1 and flags2 ripped from ffmpeg (wmadec.c) */
|
|
|
|
if (audio && audio->size >= 4) {
|
2004-03-15 19:32:25 +00:00
|
|
|
flags1 = extradata[0] | (extradata[1] << 8);
|
|
|
|
flags2 = extradata[2] | (extradata[3] << 8);
|
2003-11-05 23:14:52 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-wma, "
|
2004-03-15 19:32:25 +00:00
|
|
|
"wmaversion = (int) 1, "
|
|
|
|
"flags1 = (int) [ MIN, MAX ], "
|
|
|
|
"flags2 = (int) [ MIN, MAX ], "
|
|
|
|
"block_align = (int) [ 0, MAX ], " "bitrate = (int) [ 0, MAX ]");
|
2003-12-22 01:47:08 +00:00
|
|
|
if (audio != NULL) {
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_caps_set_simple (caps,
|
|
|
|
"flags1", G_TYPE_INT, flags1,
|
|
|
|
"flags2", G_TYPE_INT, flags2,
|
|
|
|
"block_align", G_TYPE_INT, audio->block_align,
|
|
|
|
"bitrate", G_TYPE_INT, audio->byte_rate * 8, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
}
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft WMA V1");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GST_RIFF_WAVE_FORMAT_DIVX_WMAV2:
|
2003-11-05 23:14:52 +00:00
|
|
|
/* get flags1 and flags2 ripped from ffmpeg (wmadec.c) */
|
|
|
|
if (audio && audio->size >= 6) {
|
2004-03-15 19:32:25 +00:00
|
|
|
flags1 = extradata[0] | (extradata[1] << 8) |
|
|
|
|
(extradata[2] << 16) | (extradata[3] << 24);
|
|
|
|
flags2 = extradata[4] | (extradata[5] << 8);
|
2003-11-05 23:14:52 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-wma, "
|
2004-03-15 19:32:25 +00:00
|
|
|
"wmaversion = (int) 2, "
|
|
|
|
"flags1 = (int) [ MIN, MAX ], "
|
|
|
|
"flags2 = (int) [ MIN, MAX ], "
|
|
|
|
"block_align = (int) [ 0, MAX ], " "bitrate = (int) [ 0, MAX ]");
|
2003-12-22 01:47:08 +00:00
|
|
|
if (audio != NULL) {
|
2004-03-15 19:32:25 +00:00
|
|
|
gst_caps_set_simple (caps,
|
|
|
|
"flags1", G_TYPE_INT, flags1,
|
|
|
|
"flags2", G_TYPE_INT, flags2,
|
|
|
|
"block_align", G_TYPE_INT, audio->block_align,
|
|
|
|
"bitrate", G_TYPE_INT, audio->byte_rate * 8, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
}
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft WMA V2");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case GST_RIFF_WAVE_FORMAT_WMAV9:
|
2004-03-14 22:34:30 +00:00
|
|
|
caps = gst_caps_from_string ("audio/x-wma, " "wmaversion = (int) 9");
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft WMA V9");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_WARNING ("asfdemux: unknown audio format 0x%04x", codec_id);
|
2003-12-22 01:47:08 +00:00
|
|
|
return GST_CAPS_ANY;
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2003-12-22 01:47:08 +00:00
|
|
|
if (audio != NULL) {
|
|
|
|
gst_caps_set_simple (caps,
|
2004-03-15 19:32:25 +00:00
|
|
|
"rate", G_TYPE_INT, audio->sample_rate,
|
|
|
|
"channels", G_TYPE_INT, audio->channels, NULL);
|
2004-03-14 22:34:30 +00:00
|
|
|
} else {
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_caps_set_simple (caps,
|
2004-03-15 19:32:25 +00:00
|
|
|
"rate", GST_TYPE_INT_RANGE, 8000, 96000,
|
|
|
|
"channels", GST_TYPE_INT_RANGE, 1, 2, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
}
|
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
return caps;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static gboolean
|
|
|
|
gst_asf_demux_add_audio_stream (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_audio * audio, guint16 id)
|
2003-01-23 11:15:49 +00:00
|
|
|
{
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
GstPad *src_pad;
|
|
|
|
GstCaps *caps;
|
|
|
|
gchar *name = NULL;
|
|
|
|
guint16 size_left = 0;
|
|
|
|
char *codec_name = NULL;
|
|
|
|
GstTagList *list = gst_tag_list_new ();
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
size_left = audio->size;
|
2003-01-23 11:15:49 +00:00
|
|
|
|
|
|
|
/* Create the audio pad */
|
|
|
|
name = g_strdup_printf ("audio_%02d", asf_demux->num_audio_streams);
|
2003-11-05 23:14:52 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
src_pad = gst_pad_new_from_template (audiosrctempl, name);
|
|
|
|
g_free (name);
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2004-01-02 07:09:23 +00:00
|
|
|
gst_pad_use_explicit_caps (src_pad);
|
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
/* Swallow up any left over data and set up the standard propertis from the header info */
|
2003-11-05 23:14:52 +00:00
|
|
|
if (size_left) {
|
2004-01-27 01:27:04 +00:00
|
|
|
guint8 *extradata;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_WARNING_OBJECT (asf_demux,
|
2004-03-15 19:32:25 +00:00
|
|
|
"asfdemux: Audio header contains %d bytes of surplus data", size_left);
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_bytestream_peek_bytes (asf_demux->bs, &extradata, size_left);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_asf_demux_audio_caps (audio->codec_tag, audio, extradata,
|
2004-03-15 19:32:25 +00:00
|
|
|
&codec_name);
|
2004-01-27 01:27:04 +00:00
|
|
|
gst_bytestream_flush (asf_demux->bs, size_left);
|
|
|
|
} else {
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_asf_demux_audio_caps (audio->codec_tag, audio, NULL,
|
2004-03-15 19:32:25 +00:00
|
|
|
&codec_name);
|
2003-11-05 23:14:52 +00:00
|
|
|
}
|
2004-03-14 22:34:30 +00:00
|
|
|
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
/* Informing about that audio format we just added */
|
|
|
|
gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC,
|
2004-03-14 22:34:30 +00:00
|
|
|
codec_name, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
gst_element_found_tags (GST_ELEMENT (asf_demux), list);
|
|
|
|
gst_tag_list_free (list);
|
2004-03-14 22:34:30 +00:00
|
|
|
if (codec_name)
|
|
|
|
g_free (codec_name);
|
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
GST_INFO ("Adding audio stream %u codec %u (0x%x)",
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_demux->num_video_streams, audio->codec_tag, audio->codec_tag);
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2003-11-05 23:14:52 +00:00
|
|
|
asf_demux->num_audio_streams++;
|
2003-01-31 18:23:38 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
return gst_asf_demux_setup_pad (asf_demux, src_pad, caps, id);
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstCaps *
|
|
|
|
gst_asf_demux_video_caps (guint32 codec_fcc,
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_stream_video_format * video, char **codec_name)
|
2003-07-06 20:49:50 +00:00
|
|
|
{
|
|
|
|
GstCaps *caps = NULL;
|
|
|
|
gint width = 0, height = 0;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
if (video != NULL) {
|
2004-01-27 01:27:04 +00:00
|
|
|
width = video->width;
|
|
|
|
height = video->height;
|
2003-07-06 20:49:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (codec_fcc) {
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
2004-03-15 19:32:25 +00:00
|
|
|
"format", GST_TYPE_FOURCC, codec_fcc, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Raw, uncompressed I420");
|
2004-04-06 23:46:01 +00:00
|
|
|
break;
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
2004-03-15 19:32:25 +00:00
|
|
|
"format", GST_TYPE_FOURCC, codec_fcc, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Raw, uncompressed YUV 4:2:2");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('M', 'J', 'P', 'G'):
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-jpeg", NULL);
|
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Motion JPEG");
|
2004-04-06 23:46:01 +00:00
|
|
|
break;
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('J', 'P', 'E', 'G'):
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-jpeg", NULL);
|
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("JPEG Still Image");
|
2004-04-06 23:46:01 +00:00
|
|
|
break;
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('P', 'I', 'X', 'L'):
|
|
|
|
case GST_MAKE_FOURCC ('V', 'I', 'X', 'L'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-jpeg", NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Miro/Pinnacle Video XL");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('D', 'V', 'S', 'D'):
|
|
|
|
case GST_MAKE_FOURCC ('d', 'v', 's', 'd'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-dv",
|
2004-03-15 19:32:25 +00:00
|
|
|
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Generic DV");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('W', 'M', 'V', '1'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-wmv",
|
2004-03-15 19:32:25 +00:00
|
|
|
"wmvversion", G_TYPE_INT, 1, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Windows Media Video 7");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('W', 'M', 'V', '2'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-wmv",
|
2004-03-15 19:32:25 +00:00
|
|
|
"wmvversion", G_TYPE_INT, 2, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Windows Media Video 8");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('M', 'P', 'G', '4'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-msmpeg",
|
2004-03-15 19:32:25 +00:00
|
|
|
"msmpegversion", G_TYPE_INT, 41, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft MPEG-4 4.1");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('M', 'P', '4', '2'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-msmpeg",
|
2004-03-15 19:32:25 +00:00
|
|
|
"msmpegversion", G_TYPE_INT, 42, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft MPEG-4 4.2");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('M', 'P', '4', '3'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-msmpeg",
|
2004-03-15 19:32:25 +00:00
|
|
|
"msmpegversion", G_TYPE_INT, 43, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("Microsoft MPEG-4 4.3");
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('D', 'I', 'V', '3'):
|
|
|
|
case GST_MAKE_FOURCC ('D', 'I', 'V', '4'):
|
|
|
|
case GST_MAKE_FOURCC ('D', 'I', 'V', '5'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-divx",
|
2004-03-15 19:32:25 +00:00
|
|
|
"divxversion", G_TYPE_INT, 3, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("DivX MPEG-4 Version 3");
|
2003-08-26 19:28:20 +00:00
|
|
|
break;
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
|
|
|
|
case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'):
|
|
|
|
case GST_MAKE_FOURCC ('D', 'X', '5', '0'):
|
2003-12-22 01:47:08 +00:00
|
|
|
caps = gst_caps_new_simple ("video/x-divx",
|
2004-03-15 19:32:25 +00:00
|
|
|
"divxversion", G_TYPE_INT, 5, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
if (codec_name)
|
2004-03-15 19:32:25 +00:00
|
|
|
*codec_name = g_strdup ("DivX MPEG-4 Version 5");
|
2003-10-09 09:06:04 +00:00
|
|
|
break;
|
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
default:
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_WARNING ("asfdemux: unknown video format " GST_FOURCC_FORMAT
|
2004-03-15 19:32:25 +00:00
|
|
|
"(0x%08x)", GST_FOURCC_ARGS (codec_fcc), codec_fcc);
|
2003-12-22 01:47:08 +00:00
|
|
|
return NULL;
|
2003-07-06 20:49:50 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2003-12-22 01:47:08 +00:00
|
|
|
if (video != NULL) {
|
|
|
|
gst_caps_set_simple (caps,
|
2004-03-15 19:32:25 +00:00
|
|
|
"width", G_TYPE_INT, video->width,
|
|
|
|
"height", G_TYPE_INT, video->height,
|
|
|
|
"framerate", G_TYPE_DOUBLE, (double) 25, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
} else {
|
|
|
|
gst_caps_set_simple (caps,
|
2004-03-15 19:32:25 +00:00
|
|
|
"width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
|
|
|
|
"height", GST_TYPE_INT_RANGE, 1, G_MAXINT,
|
|
|
|
"framerate", GST_TYPE_DOUBLE_RANGE, 25.0, G_MAXDOUBLE, NULL);
|
2003-12-22 01:47:08 +00:00
|
|
|
}
|
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
return caps;
|
2003-01-23 11:15:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_add_video_stream (GstASFDemux * asf_demux,
|
|
|
|
asf_stream_video_format * video, guint16 id)
|
|
|
|
{
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
GstPad *src_pad;
|
|
|
|
GstCaps *caps;
|
|
|
|
gchar *name = NULL;
|
|
|
|
char *codec_name = NULL;
|
|
|
|
GstTagList *list = gst_tag_list_new ();
|
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
/* Create the audio pad */
|
|
|
|
name = g_strdup_printf ("video_%02d", asf_demux->num_video_streams);
|
2003-07-06 20:49:50 +00:00
|
|
|
src_pad = gst_pad_new_from_template (videosrctempl, name);
|
|
|
|
g_free (name);
|
2003-01-23 11:15:49 +00:00
|
|
|
|
|
|
|
/* Now try some gstreamer formatted MIME types (from gst_avi_demux_strf_vids) */
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
caps = gst_asf_demux_video_caps (video->tag, video, &codec_name);
|
|
|
|
gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
|
2004-03-14 22:34:30 +00:00
|
|
|
codec_name, NULL);
|
gst/: First batch implementing audio and video codec tags in demuxers.
Original commit message from CVS:
2004-02-23 Julien MOUTTE <julien@moutte.net>
* gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps),
(gst_riff_create_audio_caps), (gst_riff_create_iavs_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps),
(gst_riff_create_iavs_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst/asfdemux/gstasfdemux.c: (gst_asf_demux_base_init),
(gst_asf_demux_audio_caps), (gst_asf_demux_add_audio_stream),
(gst_asf_demux_video_caps), (gst_asf_demux_add_video_stream):
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
* gst/matroska/matroska-demux.c: (gst_matroska_demux_add_stream),
(gst_matroska_demux_video_caps), (gst_matroska_demux_audio_caps),
(gst_matroska_demux_plugin_init): First batch implementing audio and
video codec tags in demuxers.
2004-02-23 22:16:21 +00:00
|
|
|
gst_element_found_tags (GST_ELEMENT (asf_demux), list);
|
|
|
|
gst_tag_list_free (list);
|
2004-03-14 22:34:30 +00:00
|
|
|
if (codec_name)
|
|
|
|
g_free (codec_name);
|
2003-07-06 20:49:50 +00:00
|
|
|
GST_INFO ("Adding video stream %u codec " GST_FOURCC_FORMAT " (0x%08x)",
|
2004-03-14 22:34:30 +00:00
|
|
|
asf_demux->num_video_streams, GST_FOURCC_ARGS (video->tag), video->tag);
|
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
asf_demux->num_video_streams++;
|
2003-11-05 23:14:52 +00:00
|
|
|
|
2003-07-06 20:49:50 +00:00
|
|
|
return gst_asf_demux_setup_pad (asf_demux, src_pad, caps, id);
|
2003-01-23 11:15:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_asf_demux_setup_pad (GstASFDemux * asf_demux,
|
|
|
|
GstPad * src_pad, GstCaps * caps, guint16 id)
|
2003-01-23 11:15:49 +00:00
|
|
|
{
|
|
|
|
asf_stream_context *stream;
|
2003-11-05 23:14:52 +00:00
|
|
|
|
2004-03-14 03:31:51 +00:00
|
|
|
gst_pad_use_explicit_caps (src_pad);
|
2004-01-02 07:09:23 +00:00
|
|
|
gst_pad_set_explicit_caps (src_pad, caps);
|
2003-01-23 11:15:49 +00:00
|
|
|
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);
|
|
|
|
gst_pad_set_event_function (src_pad, gst_asf_demux_handle_src_event);
|
|
|
|
gst_pad_set_query_type_function (src_pad, gst_asf_demux_get_src_query_types);
|
|
|
|
gst_pad_set_query_function (src_pad, gst_asf_demux_handle_src_query);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
stream = &asf_demux->stream[asf_demux->num_streams];
|
|
|
|
stream->pad = src_pad;
|
2003-01-31 18:23:38 +00:00
|
|
|
stream->id = id;
|
2003-01-23 11:15:49 +00:00
|
|
|
stream->frag_offset = 0;
|
|
|
|
stream->sequence = 0;
|
|
|
|
stream->delay = 0LL;
|
|
|
|
|
|
|
|
gst_pad_set_element_private (src_pad, stream);
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_INFO ("Adding pad for stream %u", asf_demux->num_streams);
|
2003-01-23 11:15:49 +00:00
|
|
|
|
2003-11-05 23:14:52 +00:00
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
asf_demux->num_streams++;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (asf_demux), src_pad);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2003-01-23 11:15:49 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
static gboolean
|
2004-03-14 22:34:30 +00:00
|
|
|
plugin_init (GstPlugin * plugin)
|
2002-10-17 21:41:47 +00:00
|
|
|
{
|
2003-10-28 20:52:41 +00:00
|
|
|
if (!gst_library_load ("gstbytestream"))
|
|
|
|
return FALSE;
|
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
/* create an elementfactory for the asf_demux element */
|
2004-03-14 22:34:30 +00:00
|
|
|
if (!gst_element_register (plugin, "asfdemux", GST_RANK_PRIMARY,
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_TYPE_ASF_DEMUX)
|
2004-03-14 22:34:30 +00:00
|
|
|
|| !gst_element_register (plugin, "asfmux", GST_RANK_NONE,
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_TYPE_ASFMUX))
|
2003-11-01 11:28:53 +00:00
|
|
|
return FALSE;
|
2002-10-17 21:41:47 +00:00
|
|
|
|
2004-01-27 01:27:04 +00:00
|
|
|
GST_DEBUG_CATEGORY_INIT (asf_debug, "asfdemux", 0, "asf demuxer element");
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2002-10-17 21:41:47 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
|
|
GST_VERSION_MINOR,
|
|
|
|
"asf",
|
|
|
|
"Demuxes and muxes audio and video in Microsofts ASF format",
|
|
|
|
plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN)
|