diff options
Diffstat (limited to 'gst/avi')
-rw-r--r-- | gst/avi/avi-ids.h | 25 | ||||
-rw-r--r-- | gst/avi/gstavi.c | 26 | ||||
-rw-r--r-- | gst/avi/gstavidecoder.c | 273 | ||||
-rw-r--r-- | gst/avi/gstavidemux.c | 774 | ||||
-rw-r--r-- | gst/avi/gstavidemux.h | 88 | ||||
-rw-r--r-- | gst/avi/gstavimux.c | 1241 | ||||
-rw-r--r-- | gst/avi/gstavimux.h | 121 |
7 files changed, 1270 insertions, 1278 deletions
diff --git a/gst/avi/avi-ids.h b/gst/avi/avi-ids.h index f9e2dd31..f7e773ec 100644 --- a/gst/avi/avi-ids.h +++ b/gst/avi/avi-ids.h @@ -22,21 +22,22 @@ #include <gst/gst.h> -typedef struct _gst_riff_avih { - guint32 us_frame; /* microsec per frame */ - guint32 max_bps; /* byte/s overall */ - guint32 pad_gran; /* pad_granularity */ +typedef struct _gst_riff_avih +{ + guint32 us_frame; /* microsec per frame */ + guint32 max_bps; /* byte/s overall */ + guint32 pad_gran; /* pad_granularity */ guint32 flags; /* flags values */ -#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ -#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ -#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ -#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ -#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ - guint32 tot_frames; /* # of frames (all) */ - guint32 init_frames; /* initial frames (???) */ +#define GST_RIFF_AVIH_HASINDEX 0x00000010 /* has idx1 chunk */ +#define GST_RIFF_AVIH_MUSTUSEINDEX 0x00000020 /* must use idx1 chunk to determine order */ +#define GST_RIFF_AVIH_ISINTERLEAVED 0x00000100 /* AVI file is interleaved */ +#define GST_RIFF_AVIH_WASCAPTUREFILE 0x00010000 /* specially allocated used for capturing real time video */ +#define GST_RIFF_AVIH_COPYRIGHTED 0x00020000 /* contains copyrighted data */ + guint32 tot_frames; /* # of frames (all) */ + guint32 init_frames; /* initial frames (???) */ guint32 streams; - guint32 bufsize; /* suggested buffer size */ + guint32 bufsize; /* suggested buffer size */ guint32 width; guint32 height; guint32 scale; diff --git a/gst/avi/gstavi.c b/gst/avi/gstavi.c index fa17fa47..dbdc7859 100644 --- a/gst/avi/gstavi.c +++ b/gst/avi/gstavi.c @@ -29,7 +29,7 @@ #include "gstavimux.h" static gboolean -plugin_init (GstPlugin *plugin) +plugin_init (GstPlugin * plugin) { if (!gst_library_load ("riff")) return FALSE; @@ -40,21 +40,13 @@ plugin_init (GstPlugin *plugin) #endif /* ENABLE_NLS */ return (gst_element_register (plugin, "avidemux", - GST_RANK_PRIMARY, - GST_TYPE_AVI_DEMUX) && - gst_element_register (plugin, "avimux", - GST_RANK_NONE, - GST_TYPE_AVIMUX)); + GST_RANK_PRIMARY, + GST_TYPE_AVI_DEMUX) && + gst_element_register (plugin, "avimux", GST_RANK_NONE, GST_TYPE_AVIMUX)); } -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "avi", - "AVI stream handling", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "avi", + "AVI stream handling", + plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN) diff --git a/gst/avi/gstavidecoder.c b/gst/avi/gstavidecoder.c index 9f9a5968..d4cb493f 100644 --- a/gst/avi/gstavidecoder.c +++ b/gst/avi/gstavidecoder.c @@ -31,12 +31,11 @@ static GstElementDetails gst_avi_decoder_details = { "Decoder/Video", "Decodes a .avi file into audio and video", VERSION, - "Erik Walthinsen <omega@cse.ogi.edu>\n" - "Wim Taymans <wim.taymans@tvd.be>", + "Erik Walthinsen <omega@cse.ogi.edu>\n" "Wim Taymans <wim.taymans@tvd.be>", "(C) 1999", }; -static GstCaps* avi_typefind (GstBuffer *buf, gpointer private); +static GstCaps *avi_typefind (GstBuffer * buf, gpointer private); /* typefactory for 'avi' */ static GstTypeDefinition avidefinition = { @@ -47,12 +46,14 @@ static GstTypeDefinition avidefinition = { }; /* AviDecoder signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BITRATE, ARG_MEDIA_TIME, @@ -61,118 +62,104 @@ enum { }; GST_PADTEMPLATE_FACTORY (sink_templ, - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "avidecoder_sink", - "video/avi", - "RIFF", GST_PROPS_STRING ("AVI") - ) -) - -GST_PADTEMPLATE_FACTORY (src_video_templ, - "video_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "wincodec_src", - "video/raw", - "format", GST_PROPS_LIST ( - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y','U','Y','2')), - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')), - GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R','G','B',' ')) - ), - "width", GST_PROPS_INT_RANGE (16, 4096), - "height", GST_PROPS_INT_RANGE (16, 4096) - ) -) - -GST_PADTEMPLATE_FACTORY (src_audio_templ, - "audio_src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "src_audio", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_LIST ( - GST_PROPS_BOOLEAN (TRUE), - GST_PROPS_BOOLEAN (FALSE) - ), - "width", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "depth", GST_PROPS_LIST ( - GST_PROPS_INT (8), - GST_PROPS_INT (16) - ), - "rate", GST_PROPS_INT_RANGE (11025, 48000), - "channels", GST_PROPS_INT_RANGE (1, 2) - ) -) - -static void gst_avi_decoder_class_init (GstAviDecoderClass *klass); -static void gst_avi_decoder_init (GstAviDecoder *avi_decoder); - -static void gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - - - -static GstElementClass *parent_class = NULL; + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("avidecoder_sink", + "video/avi", "RIFF", GST_PROPS_STRING ("AVI") + ) + ) + + GST_PADTEMPLATE_FACTORY (src_video_templ, + "video_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("wincodec_src", + "video/raw", + "format", GST_PROPS_LIST (GST_PROPS_FOURCC (GST_MAKE_FOURCC ('Y', 'U', 'Y', + '2')), GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I', '4', '2', '0')), + GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R', 'G', 'B', ' ')) + ), "width", GST_PROPS_INT_RANGE (16, 4096), "height", + GST_PROPS_INT_RANGE (16, 4096) + ) + ) + + GST_PADTEMPLATE_FACTORY (src_audio_templ, + "audio_src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_CAPS_NEW ("src_audio", + "audio/raw", + "format", GST_PROPS_STRING ("int"), + "law", GST_PROPS_INT (0), + "endianness", GST_PROPS_INT (G_BYTE_ORDER), + "signed", GST_PROPS_LIST (GST_PROPS_BOOLEAN (TRUE), + GST_PROPS_BOOLEAN (FALSE) + ), "width", GST_PROPS_LIST (GST_PROPS_INT (8), GST_PROPS_INT (16) + ), "depth", GST_PROPS_LIST (GST_PROPS_INT (8), GST_PROPS_INT (16) + ), + "rate", GST_PROPS_INT_RANGE (11025, 48000), + "channels", GST_PROPS_INT_RANGE (1, 2) + ) + ) + + static void gst_avi_decoder_class_init (GstAviDecoderClass * klass); + static void gst_avi_decoder_init (GstAviDecoder * avi_decoder); + + static void gst_avi_decoder_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + + + + static GstElementClass *parent_class = NULL; + /*static guint gst_avi_decoder_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avi_decoder_get_type(void) +gst_avi_decoder_get_type (void) { static GType avi_decoder_type = 0; if (!avi_decoder_type) { static const GTypeInfo avi_decoder_info = { - sizeof(GstAviDecoderClass), + sizeof (GstAviDecoderClass), NULL, NULL, - (GClassInitFunc)gst_avi_decoder_class_init, + (GClassInitFunc) gst_avi_decoder_class_init, NULL, NULL, - sizeof(GstAviDecoder), + sizeof (GstAviDecoder), 0, - (GInstanceInitFunc)gst_avi_decoder_init, + (GInstanceInitFunc) gst_avi_decoder_init, }; - avi_decoder_type = g_type_register_static(GST_TYPE_BIN, "GstAviDecoder", &avi_decoder_info, 0); + avi_decoder_type = + g_type_register_static (GST_TYPE_BIN, "GstAviDecoder", + &avi_decoder_info, 0); } return avi_decoder_type; } static void -gst_avi_decoder_class_init (GstAviDecoderClass *klass) +gst_avi_decoder_class_init (GstAviDecoderClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_BITRATE, - g_param_spec_long ("bitrate","bitrate","bitrate", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_MEDIA_TIME, - g_param_spec_long ("media_time","media_time","media_time", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ - g_object_class_install_property (G_OBJECT_CLASS(klass), ARG_CURRENT_TIME, - g_param_spec_long ("current_time","current_time","current_time", - G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BITRATE, g_param_spec_long ("bitrate", "bitrate", "bitrate", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MEDIA_TIME, g_param_spec_long ("media_time", "media_time", "media_time", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_CURRENT_TIME, g_param_spec_long ("current_time", "current_time", "current_time", G_MINLONG, G_MAXLONG, 0, G_PARAM_READABLE)); /* CHECKME */ parent_class = g_type_class_ref (GST_TYPE_BIN); - + gobject_class->get_property = gst_avi_decoder_get_property; } -static void -gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_decoder) +static void +gst_avi_decoder_new_pad (GstElement * element, GstPad * pad, + GstAviDecoder * avi_decoder) { GstCaps *caps; GstCaps *targetcaps = NULL; @@ -182,38 +169,40 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de GstElement *new_element = NULL; gchar *padname = NULL; gchar *gpadname = NULL; + #define AVI_TYPE_VIDEO 1 #define AVI_TYPE_AUDIO 2 gint media_type = 0; - - GST_DEBUG (0, "avidecoder: new pad for element \"%s\"", gst_element_get_name (element)); + + GST_DEBUG (0, "avidecoder: new pad for element \"%s\"", + gst_element_get_name (element)); caps = gst_pad_get_caps (pad); format = gst_caps_get_string (caps, "format"); - if (!strcmp (format, "strf_vids")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); + if (!strcmp (format, "strf_vids")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); media_type = AVI_TYPE_VIDEO; gpadname = g_strdup_printf ("video_%02d", avi_decoder->video_count++); - } - else if (!strcmp (format, "strf_auds")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_audio_templ)); + } else if (!strcmp (format, "strf_auds")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_audio_templ)); media_type = AVI_TYPE_AUDIO; gpadname = g_strdup_printf ("audio_%02d", avi_decoder->audio_count++); - } - else if (!strcmp (format, "strf_iavs")) { - targetcaps = gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); + } else if (!strcmp (format, "strf_iavs")) { + targetcaps = + gst_padtemplate_get_caps (GST_PADTEMPLATE_GET (src_video_templ)); media_type = AVI_TYPE_VIDEO; gpadname = g_strdup_printf ("video_%02d", avi_decoder->video_count++); - } - else { + } else { g_assert_not_reached (); } gst_element_set_state (GST_ELEMENT (avi_decoder), GST_STATE_PAUSED); - type = gst_elementfactory_make ("avitypes", - g_strdup_printf ("typeconvert%d", avi_decoder->count)); + type = gst_elementfactory_make ("avitypes", + g_strdup_printf ("typeconvert%d", avi_decoder->count)); /* brin the element to the READY state so it can do our caps negotiation */ gst_element_set_state (type, GST_STATE_READY); @@ -224,13 +213,13 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de if (type_found) { gst_bin_add (GST_BIN (avi_decoder), type); - + pad = gst_element_get_pad (type, "src"); caps = gst_pad_get_caps (pad); if (gst_caps_is_always_compatible (caps, targetcaps)) { - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (type, "src"), gpadname); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (type, "src"), gpadname); avi_decoder->count++; goto done; @@ -238,7 +227,8 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de #ifndef GST_DISABLE_AUTOPLUG else { GstAutoplug *autoplug; - autoplug = gst_autoplugfactory_make("static"); + + autoplug = gst_autoplugfactory_make ("static"); new_element = gst_autoplug_to_caps (autoplug, caps, targetcaps, NULL); @@ -249,45 +239,43 @@ gst_avi_decoder_new_pad (GstElement *element, GstPad *pad, GstAviDecoder *avi_de if (!new_element && (media_type == AVI_TYPE_VIDEO)) { padname = "src"; - } - else if (!new_element && (media_type == AVI_TYPE_AUDIO)) { + } else if (!new_element && (media_type == AVI_TYPE_AUDIO)) { /*FIXME */ padname = "src"; } if (new_element) { gst_pad_connect (pad, gst_element_get_pad (new_element, "sink")); - gst_element_set_name (new_element, g_strdup_printf ("element%d", avi_decoder->count)); + gst_element_set_name (new_element, g_strdup_printf ("element%d", + avi_decoder->count)); gst_bin_add (GST_BIN (avi_decoder), new_element); - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (new_element, padname), gpadname); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (new_element, padname), gpadname); avi_decoder->count++; - } - else { + } else { g_warning ("avidecoder: could not autoplug\n"); } -done: +done: gst_element_set_state (GST_ELEMENT (avi_decoder), GST_STATE_PLAYING); } -static void -gst_avi_decoder_init (GstAviDecoder *avi_decoder) +static void +gst_avi_decoder_init (GstAviDecoder * avi_decoder) { avi_decoder->demuxer = gst_elementfactory_make ("avidemux", "demux"); if (avi_decoder->demuxer) { gst_bin_add (GST_BIN (avi_decoder), avi_decoder->demuxer); - gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), - gst_element_get_pad (avi_decoder->demuxer, "sink"), "sink"); + gst_element_add_ghost_pad (GST_ELEMENT (avi_decoder), + gst_element_get_pad (avi_decoder->demuxer, "sink"), "sink"); - g_signal_connect (G_OBJECT (avi_decoder->demuxer),"new_pad", G_CALLBACK (gst_avi_decoder_new_pad), - avi_decoder); - } - else { + g_signal_connect (G_OBJECT (avi_decoder->demuxer), "new_pad", + G_CALLBACK (gst_avi_decoder_new_pad), avi_decoder); + } else { g_warning ("wow!, no avi demuxer found. help me\n"); } @@ -296,26 +284,27 @@ gst_avi_decoder_init (GstAviDecoder *avi_decoder) avi_decoder->video_count = 0; } -static GstCaps* -avi_typefind (GstBuffer *buf, - gpointer private) +static GstCaps * +avi_typefind (GstBuffer * buf, gpointer private) { gchar *data = GST_BUFFER_DATA (buf); GstCaps *new; - GST_DEBUG (0,"avi_decoder: typefind"); - if (strncmp (&data[0], "RIFF", 4)) return NULL; - if (strncmp (&data[8], "AVI ", 4)) return NULL; + GST_DEBUG (0, "avi_decoder: typefind"); + if (strncmp (&data[0], "RIFF", 4)) + return NULL; + if (strncmp (&data[8], "AVI ", 4)) + return NULL; new = GST_CAPS_NEW ("avi_typefind", - "video/avi", - "RIFF", GST_PROPS_STRING ("AVI")); + "video/avi", "RIFF", GST_PROPS_STRING ("AVI")); return new; } static void -gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +gst_avi_decoder_get_property (GObject * object, guint prop_id, GValue * value, + GParamSpec * pspec) { GstAviDecoder *src; @@ -323,14 +312,16 @@ gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GPa src = GST_AVI_DECODER (object); - switch(prop_id) { + switch (prop_id) { case ARG_BITRATE: break; case ARG_MEDIA_TIME: - g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), "media_time")); + g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), + "media_time")); break; case ARG_CURRENT_TIME: - g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), "current_time")); + g_value_set_long (value, gst_util_get_long_arg (G_OBJECT (src->demuxer), + "current_time")); break; default: break; @@ -339,19 +330,22 @@ gst_avi_decoder_get_property (GObject *object, guint prop_id, GValue *value, GPa static gboolean -plugin_init (GModule *module, GstPlugin *plugin) +plugin_init (GModule * module, GstPlugin * plugin) { GstElementFactory *factory; GstTypeFactory *type; /* create an elementfactory for the avi_decoder element */ factory = gst_elementfactory_new ("avidecoder", GST_TYPE_AVI_DECODER, - &gst_avi_decoder_details); + &gst_avi_decoder_details); g_return_val_if_fail (factory != NULL, FALSE); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (src_audio_templ)); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (src_video_templ)); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (sink_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (src_audio_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (src_video_templ)); + gst_elementfactory_add_padtemplate (factory, + GST_PADTEMPLATE_GET (sink_templ)); type = gst_typefactory_new (&avidefinition); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type)); @@ -367,4 +361,3 @@ GstPluginDesc plugin_desc = { "avidecoder", plugin_init }; - diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 1b50b98e..03403488 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -32,72 +32,62 @@ GST_DEBUG_CATEGORY_STATIC (avidemux_debug); #define GST_CAT_DEFAULT avidemux_debug /* AviDemux signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_STREAMINFO, /* FILL ME */ }; -static GstStaticPadTemplate sink_templ = -GST_STATIC_PAD_TEMPLATE ( - "sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-msvideo") -); +static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); -static void gst_avi_demux_base_init (GstAviDemuxClass *klass); -static void gst_avi_demux_class_init (GstAviDemuxClass *klass); -static void gst_avi_demux_init (GstAviDemux *avi); +static void gst_avi_demux_base_init (GstAviDemuxClass * klass); +static void gst_avi_demux_class_init (GstAviDemuxClass * klass); +static void gst_avi_demux_init (GstAviDemux * avi); -static void gst_avi_demux_reset (GstAviDemux *avi); -static void gst_avi_demux_loop (GstElement *element); +static void gst_avi_demux_reset (GstAviDemux * avi); +static void gst_avi_demux_loop (GstElement * element); -static gboolean gst_avi_demux_send_event (GstElement *element, - GstEvent *event); +static gboolean gst_avi_demux_send_event (GstElement * element, + GstEvent * event); -static const GstEventMask * - gst_avi_demux_get_event_mask (GstPad *pad); -static gboolean gst_avi_demux_handle_src_event (GstPad *pad, - GstEvent *event); -static const GstFormat * - gst_avi_demux_get_src_formats (GstPad *pad); -static const GstQueryType * - gst_avi_demux_get_src_query_types (GstPad *pad); -static gboolean gst_avi_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value); -static gboolean gst_avi_demux_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); +static const GstEventMask *gst_avi_demux_get_event_mask (GstPad * pad); +static gboolean gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event); +static const GstFormat *gst_avi_demux_get_src_formats (GstPad * pad); +static const GstQueryType *gst_avi_demux_get_src_query_types (GstPad * pad); +static gboolean gst_avi_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value); +static gboolean gst_avi_demux_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value); -static GstElementStateReturn - gst_avi_demux_change_state (GstElement *element); +static GstElementStateReturn gst_avi_demux_change_state (GstElement * element); -static void gst_avi_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_avi_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); static GstRiffReadClass *parent_class = NULL; + /*static guint gst_avi_demux_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avi_demux_get_type(void) +gst_avi_demux_get_type (void) { static GType avi_demux_type = 0; if (!avi_demux_type) { static const GTypeInfo avi_demux_info = { - sizeof (GstAviDemuxClass), + sizeof (GstAviDemuxClass), (GBaseInitFunc) gst_avi_demux_base_init, NULL, (GClassInitFunc) gst_avi_demux_class_init, @@ -110,40 +100,34 @@ gst_avi_demux_get_type(void) avi_demux_type = g_type_register_static (GST_TYPE_RIFF_READ, - "GstAviDemux", - &avi_demux_info, 0); + "GstAviDemux", &avi_demux_info, 0); } return avi_demux_type; } static void -gst_avi_demux_base_init (GstAviDemuxClass *klass) +gst_avi_demux_base_init (GstAviDemuxClass * klass) { - static GstElementDetails gst_avi_demux_details = GST_ELEMENT_DETAILS ( - "Avi demuxer", - "Codec/Demuxer", - "Demultiplex an avi file into audio and video", - "Erik Walthinsen <omega@cse.ogi.edu>\n" - "Wim Taymans <wim.taymans@chello.be>\n" - "Ronald Bultje <rbultje@ronald.bitfreak.net>" - ); + static GstElementDetails gst_avi_demux_details = + GST_ELEMENT_DETAILS ("Avi demuxer", + "Codec/Demuxer", + "Demultiplex an avi file into audio and video", + "Erik Walthinsen <omega@cse.ogi.edu>\n" + "Wim Taymans <wim.taymans@chello.be>\n" + "Ronald Bultje <rbultje@ronald.bitfreak.net>"); GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstPadTemplate *videosrctempl, *audiosrctempl; GstCaps *audcaps, *vidcaps; audcaps = gst_riff_create_audio_template_caps (); audiosrctempl = gst_pad_template_new ("audio_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - audcaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, audcaps); vidcaps = gst_riff_create_video_template_caps (); gst_caps_append (vidcaps, gst_riff_create_iavs_template_caps ()); videosrctempl = gst_pad_template_new ("video_%02d", - GST_PAD_SRC, - GST_PAD_SOMETIMES, - vidcaps); + GST_PAD_SRC, GST_PAD_SOMETIMES, vidcaps); gst_element_class_add_pad_template (element_class, audiosrctempl); gst_element_class_add_pad_template (element_class, videosrctempl); @@ -153,36 +137,37 @@ gst_avi_demux_base_init (GstAviDemuxClass *klass) } static void -gst_avi_demux_class_init (GstAviDemuxClass *klass) +gst_avi_demux_class_init (GstAviDemuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; g_object_class_install_property (gobject_class, ARG_STREAMINFO, - g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", - GST_TYPE_CAPS, G_PARAM_READABLE)); + g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo", + GST_TYPE_CAPS, G_PARAM_READABLE)); GST_DEBUG_CATEGORY_INIT (avidemux_debug, "avidemux", - 0, "Demuxer for AVI streams"); + 0, "Demuxer for AVI streams"); parent_class = g_type_class_ref (GST_TYPE_RIFF_READ); - + gobject_class->get_property = gst_avi_demux_get_property; - + gstelement_class->change_state = gst_avi_demux_change_state; gstelement_class->send_event = gst_avi_demux_send_event; } -static void -gst_avi_demux_init (GstAviDemux *avi) +static void +gst_avi_demux_init (GstAviDemux * avi) { GST_FLAG_SET (avi, GST_ELEMENT_EVENT_AWARE); - avi->sinkpad = gst_pad_new_from_template ( - gst_static_pad_template_get (&sink_templ), "sink"); + avi->sinkpad = + gst_pad_new_from_template (gst_static_pad_template_get (&sink_templ), + "sink"); gst_element_add_pad (GST_ELEMENT (avi), avi->sinkpad); GST_RIFF_READ (avi)->sinkpad = avi->sinkpad; @@ -195,7 +180,7 @@ gst_avi_demux_init (GstAviDemux *avi) } static void -gst_avi_demux_reset (GstAviDemux *avi) +gst_avi_demux_reset (GstAviDemux * avi) { gint i; @@ -221,27 +206,25 @@ gst_avi_demux_reset (GstAviDemux *avi) avi->num_frames = 0; avi->us_per_frame = 0; - avi->seek_offset = (guint64) -1; + avi->seek_offset = (guint64) - 1; gst_caps_replace (&avi->streaminfo, NULL); } static void -gst_avi_demux_streaminfo (GstAviDemux *avi) +gst_avi_demux_streaminfo (GstAviDemux * avi) { /* compression formats are added later - a bit hacky */ gst_caps_replace (&avi->streaminfo, gst_caps_new_simple ("application/x-gst-streaminfo", NULL)); - /*g_object_notify(G_OBJECT(avi), "streaminfo");*/ + /*g_object_notify(G_OBJECT(avi), "streaminfo"); */ } static gst_avi_index_entry * -gst_avi_demux_index_next (GstAviDemux *avi, - gint stream_nr, - gint start, - guint32 flags) +gst_avi_demux_index_next (GstAviDemux * avi, + gint stream_nr, gint start, guint32 flags) { gint i; gst_avi_index_entry *entry = NULL; @@ -258,10 +241,8 @@ gst_avi_demux_index_next (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_time (GstAviDemux *avi, - gint stream_nr, - guint64 time, - guint32 flags) +gst_avi_demux_index_entry_for_time (GstAviDemux * avi, + gint stream_nr, guint64 time, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -283,10 +264,8 @@ gst_avi_demux_index_entry_for_time (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_byte (GstAviDemux *avi, - gint stream_nr, - guint64 byte, - guint32 flags) +gst_avi_demux_index_entry_for_byte (GstAviDemux * avi, + gint stream_nr, guint64 byte, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -308,10 +287,8 @@ gst_avi_demux_index_entry_for_byte (GstAviDemux *avi, } static gst_avi_index_entry * -gst_avi_demux_index_entry_for_frame (GstAviDemux *avi, - gint stream_nr, - guint32 frame, - guint32 flags) +gst_avi_demux_index_entry_for_frame (GstAviDemux * avi, + gint stream_nr, guint32 frame, guint32 flags) { gst_avi_index_entry *entry = NULL, *last_entry = NULL; gint i; @@ -333,7 +310,7 @@ gst_avi_demux_index_entry_for_frame (GstAviDemux *avi, } static const GstFormat * -gst_avi_demux_get_src_formats (GstPad *pad) +gst_avi_demux_get_src_formats (GstPad * pad) { avi_stream_context *stream = gst_pad_get_element_private (pad); @@ -350,36 +327,34 @@ gst_avi_demux_get_src_formats (GstPad *pad) }; return (stream->strh->type == GST_RIFF_FCC_auds ? - src_a_formats : src_v_formats); + src_a_formats : src_v_formats); } static gboolean -gst_avi_demux_src_convert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value) +gst_avi_demux_src_convert (GstPad * pad, + GstFormat src_format, + gint64 src_value, GstFormat * dest_format, gint64 * dest_value) { gboolean res = TRUE; - /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad));*/ + + /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); */ avi_stream_context *stream = gst_pad_get_element_private (pad); - if (stream->strh->type != GST_RIFF_FCC_auds && - (src_format == GST_FORMAT_BYTES || - *dest_format == GST_FORMAT_BYTES)) + if (stream->strh->type != GST_RIFF_FCC_auds && + (src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES)) return FALSE; switch (src_format) { case GST_FORMAT_TIME: switch (*dest_format) { case GST_FORMAT_BYTES: - *dest_value = src_value * stream->strh->rate / - (stream->strh->scale * GST_SECOND); - break; - case GST_FORMAT_DEFAULT: - *dest_value = src_value * stream->strh->rate / - (stream->strh->scale * GST_SECOND); - break; + *dest_value = src_value * stream->strh->rate / + (stream->strh->scale * GST_SECOND); + break; + case GST_FORMAT_DEFAULT: + *dest_value = src_value * stream->strh->rate / + (stream->strh->scale * GST_SECOND); + break; default: res = FALSE; break; @@ -388,7 +363,7 @@ gst_avi_demux_src_convert (GstPad *pad, case GST_FORMAT_BYTES: switch (*dest_format) { case GST_FORMAT_TIME: - *dest_value = ((gfloat) src_value) * GST_SECOND / stream->strh->rate; + *dest_value = ((gfloat) src_value) * GST_SECOND / stream->strh->rate; break; default: res = FALSE; @@ -398,8 +373,8 @@ gst_avi_demux_src_convert (GstPad *pad, case GST_FORMAT_DEFAULT: switch (*dest_format) { case GST_FORMAT_TIME: - *dest_value = ((((gfloat) src_value) * stream->strh->scale) / - stream->strh->rate) * GST_SECOND; + *dest_value = ((((gfloat) src_value) * stream->strh->scale) / + stream->strh->rate) * GST_SECOND; break; default: res = FALSE; @@ -414,7 +389,7 @@ gst_avi_demux_src_convert (GstPad *pad, } static const GstQueryType * -gst_avi_demux_get_src_query_types (GstPad *pad) +gst_avi_demux_get_src_query_types (GstPad * pad) { static const GstQueryType src_types[] = { GST_QUERY_TOTAL, @@ -426,67 +401,64 @@ gst_avi_demux_get_src_query_types (GstPad *pad) } static gboolean -gst_avi_demux_handle_src_query (GstPad *pad, - GstQueryType type, - GstFormat *format, - gint64 *value) +gst_avi_demux_handle_src_query (GstPad * pad, + GstQueryType type, GstFormat * format, gint64 * value) { gboolean res = TRUE; - /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad));*/ + + /*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); */ avi_stream_context *stream = gst_pad_get_element_private (pad); switch (type) { case GST_QUERY_TOTAL: switch (*format) { - case GST_FORMAT_TIME: - *value = (((gfloat) stream->strh->scale) * stream->strh->length / - stream->strh->rate) * GST_SECOND; + case GST_FORMAT_TIME: + *value = (((gfloat) stream->strh->scale) * stream->strh->length / + stream->strh->rate) * GST_SECOND; break; - case GST_FORMAT_BYTES: - if (stream->strh->type == GST_RIFF_FCC_auds) { - *value = stream->total_bytes; - } - else + case GST_FORMAT_BYTES: + if (stream->strh->type == GST_RIFF_FCC_auds) { + *value = stream->total_bytes; + } else res = FALSE; break; - case GST_FORMAT_DEFAULT: - if (stream->strh->type == GST_RIFF_FCC_auds) - *value = stream->strh->length * stream->strh->samplesize; + case GST_FORMAT_DEFAULT: + if (stream->strh->type == GST_RIFF_FCC_auds) + *value = stream->strh->length * stream->strh->samplesize; else if (stream->strh->type == GST_RIFF_FCC_vids) - *value = stream->strh->length; + *value = stream->strh->length; else res = FALSE; break; default: - res = FALSE; + res = FALSE; break; } break; case GST_QUERY_POSITION: switch (*format) { - case GST_FORMAT_TIME: - if (stream->strh->samplesize && + case GST_FORMAT_TIME: + if (stream->strh->samplesize && stream->strh->type == GST_RIFF_FCC_auds) { - *value = ((gfloat) stream->current_byte) * GST_SECOND / - stream->strh->rate; - } - else { - *value = (((gfloat) stream->current_frame) * stream->strh->scale / - stream->strh->rate) * GST_SECOND; + *value = ((gfloat) stream->current_byte) * GST_SECOND / + stream->strh->rate; + } else { + *value = (((gfloat) stream->current_frame) * stream->strh->scale / + stream->strh->rate) * GST_SECOND; } break; - case GST_FORMAT_BYTES: - *value = stream->current_byte; + case GST_FORMAT_BYTES: + *value = stream->current_byte; break; - case GST_FORMAT_DEFAULT: - if (stream->strh->samplesize && - stream->strh->type == GST_RIFF_FCC_auds) - *value = stream->current_byte * stream->strh->samplesize; - else - *value = stream->current_frame; + case GST_FORMAT_DEFAULT: + if (stream->strh->samplesize && + stream->strh->type == GST_RIFF_FCC_auds) + *value = stream->current_byte * stream->strh->samplesize; + else + *value = stream->current_frame; break; default: - res = FALSE; + res = FALSE; break; } break; @@ -499,7 +471,7 @@ gst_avi_demux_handle_src_query (GstPad *pad, } static GstCaps * -gst_avi_demux_src_getcaps (GstPad *pad) +gst_avi_demux_src_getcaps (GstPad * pad) { avi_stream_context *stream = gst_pad_get_element_private (pad); @@ -507,8 +479,7 @@ gst_avi_demux_src_getcaps (GstPad *pad) } static gint32 -gst_avi_demux_sync_streams (GstAviDemux *avi, - guint64 time) +gst_avi_demux_sync_streams (GstAviDemux * avi, guint64 time) { gint i; guint32 min_index = G_MAXUINT; @@ -521,25 +492,25 @@ gst_avi_demux_sync_streams (GstAviDemux *avi, GST_DEBUG ("finding %d for time %" G_GINT64_FORMAT, i, time); entry = gst_avi_demux_index_entry_for_time (avi, stream->num, time, - GST_RIFF_IF_KEYFRAME); + GST_RIFF_IF_KEYFRAME); if (entry) { min_index = MIN (entry->index_nr, min_index); } } GST_DEBUG ("first index at %d", min_index); - + /* now we know the entry we need to sync on. calculate number of frames to * skip fro there on and the stream stats */ for (i = 0; i < avi->num_streams; i++) { gst_avi_index_entry *next_entry; + stream = &avi->stream[i]; /* next entry */ - next_entry = gst_avi_demux_index_next (avi, stream->num, - min_index, 0); + next_entry = gst_avi_demux_index_next (avi, stream->num, min_index, 0); /* next entry with keyframe */ entry = gst_avi_demux_index_next (avi, stream->num, min_index, - GST_RIFF_IF_KEYFRAME); + GST_RIFF_IF_KEYFRAME); stream->current_byte = next_entry->bytes_before; stream->current_frame = next_entry->frames_before; @@ -554,14 +525,13 @@ gst_avi_demux_sync_streams (GstAviDemux *avi, } static gboolean -gst_avi_demux_send_event (GstElement *element, - GstEvent *event) +gst_avi_demux_send_event (GstElement * element, GstEvent * event) { const GList *pads; pads = gst_element_get_pad_list (element); - while (pads) { + while (pads) { GstPad *pad = GST_PAD (pads->data); if (GST_PAD_DIRECTION (pad) == GST_PAD_SRC) { @@ -574,93 +544,88 @@ gst_avi_demux_send_event (GstElement *element, return TRUE; } } - + pads = g_list_next (pads); } - + gst_event_unref (event); return FALSE; } static const GstEventMask * -gst_avi_demux_get_event_mask (GstPad *pad) +gst_avi_demux_get_event_mask (GstPad * pad) { static const GstEventMask masks[] = { - { GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT }, - { 0, } + {GST_EVENT_SEEK, GST_SEEK_METHOD_SET | GST_SEEK_FLAG_KEY_UNIT}, + {0,} }; return masks; } - + static gboolean -gst_avi_demux_handle_src_event (GstPad *pad, - GstEvent *event) +gst_avi_demux_handle_src_event (GstPad * pad, GstEvent * event) { gboolean res = TRUE; GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); avi_stream_context *stream; - + stream = gst_pad_get_element_private (pad); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: GST_DEBUG ("seek format %d, %08x", GST_EVENT_SEEK_FORMAT (event), - stream->strh->type); + stream->strh->type); switch (GST_EVENT_SEEK_FORMAT (event)) { case GST_FORMAT_BYTES: case GST_FORMAT_DEFAULT: - case GST_FORMAT_TIME: { + case GST_FORMAT_TIME:{ gst_avi_index_entry *seek_entry, *entry = NULL; gint64 desired_offset = GST_EVENT_SEEK_OFFSET (event); guint32 flags; - guint64 min_index; + guint64 min_index; /* no seek on audio yet */ if (stream->strh->type == GST_RIFF_FCC_auds) { res = FALSE; goto done; } - GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); + GST_DEBUG ("seeking to %" G_GINT64_FORMAT, desired_offset); - flags = GST_RIFF_IF_KEYFRAME; - switch (GST_EVENT_SEEK_FORMAT (event)) { + flags = GST_RIFF_IF_KEYFRAME; + switch (GST_EVENT_SEEK_FORMAT (event)) { case GST_FORMAT_BYTES: - entry = gst_avi_demux_index_entry_for_byte (avi, stream->num, - desired_offset, - flags); - break; + entry = gst_avi_demux_index_entry_for_byte (avi, stream->num, + desired_offset, flags); + break; case GST_FORMAT_DEFAULT: - entry = gst_avi_demux_index_entry_for_frame (avi, stream->num, - desired_offset, - flags); - break; + entry = gst_avi_demux_index_entry_for_frame (avi, stream->num, + desired_offset, flags); + break; case GST_FORMAT_TIME: - entry = gst_avi_demux_index_entry_for_time (avi, stream->num, - desired_offset, - flags); - break; - } + entry = gst_avi_demux_index_entry_for_time (avi, stream->num, + desired_offset, flags); + break; + } if (entry) { min_index = gst_avi_demux_sync_streams (avi, entry->ts); - seek_entry = &avi->index_entries[min_index]; + seek_entry = &avi->index_entries[min_index]; avi->seek_offset = seek_entry->offset + avi->index_offset; - avi->last_seek = entry->ts; + avi->last_seek = entry->ts; } else { - GST_DEBUG ("no index entry found for format=%d value=%" - G_GINT64_FORMAT, GST_EVENT_SEEK_FORMAT (event), - desired_offset); + GST_DEBUG ("no index entry found for format=%d value=%" + G_GINT64_FORMAT, GST_EVENT_SEEK_FORMAT (event), desired_offset); res = FALSE; } break; } default: res = FALSE; - break; + break; } break; default: @@ -679,7 +644,7 @@ done: */ gboolean -gst_avi_demux_stream_init (GstAviDemux *avi) +gst_avi_demux_stream_init (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 doctype; @@ -699,9 +664,8 @@ gst_avi_demux_stream_init (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_avih (GstAviDemux *avi, - guint32 *flags, - guint32 *streams) +gst_avi_demux_stream_avih (GstAviDemux * avi, + guint32 * flags, guint32 * streams) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; @@ -718,43 +682,43 @@ gst_avi_demux_stream_avih (GstAviDemux *avi, } if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_avih)) { g_warning ("Too small avih (%d available, %d needed)", - GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih)); + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_avih)); gst_buffer_unref (buf); return FALSE; } _avih = (gst_riff_avih *) GST_BUFFER_DATA (buf); - avih.us_frame = GUINT32_FROM_LE (_avih->us_frame); - avih.max_bps = GUINT32_FROM_LE (_avih->max_bps); - avih.pad_gran = GUINT32_FROM_LE (_avih->pad_gran); - avih.flags = GUINT32_FROM_LE (_avih->flags); - avih.tot_frames = GUINT32_FROM_LE (_avih->tot_frames); + avih.us_frame = GUINT32_FROM_LE (_avih->us_frame); + avih.max_bps = GUINT32_FROM_LE (_avih->max_bps); + avih.pad_gran = GUINT32_FROM_LE (_avih->pad_gran); + avih.flags = GUINT32_FROM_LE (_avih->flags); + avih.tot_frames = GUINT32_FROM_LE (_avih->tot_frames); avih.init_frames = GUINT32_FROM_LE (_avih->init_frames); - avih.streams = GUINT32_FROM_LE (_avih->streams); - avih.bufsize = GUINT32_FROM_LE (_avih->bufsize); - avih.width = GUINT32_FROM_LE (_avih->width); - avih.height = GUINT32_FROM_LE (_avih->height); - avih.scale = GUINT32_FROM_LE (_avih->scale); - avih.rate = GUINT32_FROM_LE (_avih->rate); - avih.start = GUINT32_FROM_LE (_avih->start); - avih.length = GUINT32_FROM_LE (_avih->length); + avih.streams = GUINT32_FROM_LE (_avih->streams); + avih.bufsize = GUINT32_FROM_LE (_avih->bufsize); + avih.width = GUINT32_FROM_LE (_avih->width); + avih.height = GUINT32_FROM_LE (_avih->height); + avih.scale = GUINT32_FROM_LE (_avih->scale); + avih.rate = GUINT32_FROM_LE (_avih->rate); + avih.start = GUINT32_FROM_LE (_avih->start); + avih.length = GUINT32_FROM_LE (_avih->length); /* debug stuff */ GST_INFO ("avih tag found:"); - GST_INFO (" us_frame %u", avih.us_frame); - GST_INFO (" max_bps %u", avih.max_bps); - GST_INFO (" pad_gran %u", avih.pad_gran); + GST_INFO (" us_frame %u", avih.us_frame); + GST_INFO (" max_bps %u", avih.max_bps); + GST_INFO (" pad_gran %u", avih.pad_gran); GST_INFO (" flags 0x%08x", avih.flags); - GST_INFO (" tot_frames %u", avih.tot_frames); - GST_INFO (" init_frames %u", avih.init_frames); - GST_INFO (" streams %u", avih.streams); - GST_INFO (" bufsize %u", avih.bufsize); - GST_INFO (" width %u", avih.width); - GST_INFO (" height %u", avih.height); - GST_INFO (" scale %u", avih.scale); - GST_INFO (" rate %u", avih.rate); - GST_INFO (" start %u", avih.start); - GST_INFO (" length %u", avih.length); + GST_INFO (" tot_frames %u", avih.tot_frames); + GST_INFO (" init_frames %u", avih.init_frames); + GST_INFO (" streams %u", avih.streams); + GST_INFO (" bufsize %u", avih.bufsize); + GST_INFO (" width %u", avih.width); + GST_INFO (" height %u", avih.height); + GST_INFO (" scale %u", avih.scale); + GST_INFO (" rate %u", avih.rate); + GST_INFO (" start %u", avih.start); + GST_INFO (" length %u", avih.length); avi->num_frames = avih.tot_frames; avi->us_per_frame = avih.us_frame; @@ -771,7 +735,7 @@ gst_avi_demux_stream_avih (GstAviDemux *avi, */ static gboolean -gst_avi_demux_add_stream (GstAviDemux *avi) +gst_avi_demux_add_stream (GstAviDemux * avi) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (avi); GstRiffRead *riff = GST_RIFF_READ (avi); @@ -782,7 +746,8 @@ gst_avi_demux_add_stream (GstAviDemux *avi) GstPadTemplate *templ = NULL; GstPad *pad; avi_stream_context *stream; - union { + union + { gst_riff_strf_vids *vids; gst_riff_strf_auds *auds; gst_riff_strf_iavs *iavs; @@ -803,25 +768,25 @@ gst_avi_demux_add_stream (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_strf) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no strf as second tag)")); + ("Invalid AVI header (no strf as second tag)")); goto skip_stream; } switch (strh->type) { case GST_RIFF_FCC_vids: if (!gst_riff_read_strf_vids (riff, &strf.vids)) - return FALSE; + return FALSE; break; case GST_RIFF_FCC_auds: if (!gst_riff_read_strf_auds (riff, &strf.auds)) - return FALSE; + return FALSE; break; case GST_RIFF_FCC_iavs: if (!gst_riff_read_strf_iavs (riff, &strf.iavs)) - return FALSE; + return FALSE; break; default: g_warning ("Unknown stream type " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (strh->type)); + GST_FOURCC_ARGS (strh->type)); goto skip_stream; } @@ -836,22 +801,22 @@ gst_avi_demux_add_stream (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_strn: - if (name) - g_free (name); - if (!gst_riff_read_ascii (riff, &tag, &name)) - return FALSE; - break; + if (name) + g_free (name); + if (!gst_riff_read_ascii (riff, &tag, &name)) + return FALSE; + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ - case GST_RIFF_TAG_strd: /* what is this? */ + case GST_RIFF_TAG_strd: /* what is this? */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -866,15 +831,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_video_caps (strf.vids->compression, strh, - strf.vids, &codec_name); + strf.vids, &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.vids); avi->num_v_streams++; break; @@ -883,15 +850,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("audio_%02d", avi->num_a_streams); templ = gst_element_class_get_pad_template (klass, "audio_%02d"); caps = gst_riff_create_audio_caps (strf.auds->format, strh, strf.auds, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.auds); avi->num_a_streams++; break; @@ -900,15 +869,17 @@ gst_avi_demux_add_stream (GstAviDemux *avi) { char *codec_name = NULL; GstTagList *list = gst_tag_list_new (); + padname = g_strdup_printf ("video_%02d", avi->num_v_streams); templ = gst_element_class_get_pad_template (klass, "video_%02d"); caps = gst_riff_create_iavs_caps (strh->fcc_handler, strh, strf.iavs, - &codec_name); + &codec_name); gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, - codec_name, NULL); + codec_name, NULL); gst_element_found_tags (GST_ELEMENT (avi), list); gst_tag_list_free (list); - if (codec_name) g_free (codec_name); + if (codec_name) + g_free (codec_name); g_free (strf.iavs); avi->num_v_streams++; break; @@ -918,7 +889,7 @@ gst_avi_demux_add_stream (GstAviDemux *avi) } /* set proper settings and add it */ - pad = gst_pad_new_from_template (templ, padname); + pad = gst_pad_new_from_template (templ, padname); g_free (padname); gst_pad_set_formats_function (pad, gst_avi_demux_get_src_formats); @@ -964,7 +935,7 @@ skip_stream: /* add a "NULL" stream */ avi->num_streams++; - return TRUE; /* recoverable */ + return TRUE; /* recoverable */ } /* @@ -972,7 +943,7 @@ skip_stream: */ static gboolean -gst_avi_demux_stream_odml (GstAviDemux *avi) +gst_avi_demux_stream_odml (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; @@ -987,38 +958,38 @@ gst_avi_demux_stream_odml (GstAviDemux *avi) } switch (tag) { - case GST_RIFF_TAG_dmlh: { - gst_riff_dmlh dmlh, *_dmlh; - GstBuffer *buf; - - if (!gst_riff_read_data (riff, &tag, &buf)) - return FALSE; - if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_dmlh)) { - g_warning ("DMLH entry is too small (%d bytes, %d needed)", - GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_dmlh)); - gst_buffer_unref (buf); - break; - } - _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (buf); - dmlh.totalframes = GUINT32_FROM_LE (_dmlh->totalframes); - - GST_INFO ("dmlh tag found:"); - GST_INFO (" totalframes: %u", dmlh.totalframes); - - avi->num_frames = dmlh.totalframes; - gst_buffer_unref (buf); - break; + case GST_RIFF_TAG_dmlh:{ + gst_riff_dmlh dmlh, *_dmlh; + GstBuffer *buf; + + if (!gst_riff_read_data (riff, &tag, &buf)) + return FALSE; + if (GST_BUFFER_SIZE (buf) < sizeof (gst_riff_dmlh)) { + g_warning ("DMLH entry is too small (%d bytes, %d needed)", + GST_BUFFER_SIZE (buf), (int) sizeof (gst_riff_dmlh)); + gst_buffer_unref (buf); + break; + } + _dmlh = (gst_riff_dmlh *) GST_BUFFER_DATA (buf); + dmlh.totalframes = GUINT32_FROM_LE (_dmlh->totalframes); + + GST_INFO ("dmlh tag found:"); + GST_INFO (" totalframes: %u", dmlh.totalframes); + + avi->num_frames = dmlh.totalframes; + gst_buffer_unref (buf); + break; } default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -1035,7 +1006,7 @@ gst_avi_demux_stream_odml (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_index (GstAviDemux *avi) +gst_avi_demux_stream_index (GstAviDemux * avi) { GstBuffer *buf = NULL; guint i; @@ -1065,7 +1036,7 @@ gst_avi_demux_stream_index (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_idx1) { g_warning ("No index after data, but " GST_FOURCC_FORMAT, - GST_FOURCC_ARGS (tag)); + GST_FOURCC_ARGS (tag)); goto end; } @@ -1075,7 +1046,8 @@ gst_avi_demux_stream_index (GstAviDemux *avi) /* parse all entries */ avi->index_size = GST_BUFFER_SIZE (buf) / sizeof (gst_riff_index_entry); - avi->index_entries = g_malloc (avi->index_size * sizeof (gst_avi_index_entry)); + avi->index_entries = + g_malloc (avi->index_size * sizeof (gst_avi_index_entry)); GST_INFO ("%u index entries", avi->index_size); for (i = 0; i < avi->index_size; i++) { @@ -1086,16 +1058,15 @@ gst_avi_demux_stream_index (GstAviDemux *avi) GstFormat format; _entry = &((gst_riff_index_entry *) GST_BUFFER_DATA (buf))[i]; - entry.id = GUINT32_FROM_LE (_entry->id); + entry.id = GUINT32_FROM_LE (_entry->id); entry.offset = GUINT32_FROM_LE (_entry->offset); - entry.flags = GUINT32_FROM_LE (_entry->flags); - entry.size = GUINT32_FROM_LE (_entry->size); + entry.flags = GUINT32_FROM_LE (_entry->flags); + entry.size = GUINT32_FROM_LE (_entry->size); target = &avi->index_entries[i]; stream_nr = CHUNKID_TO_STREAMNR (entry.id); if (stream_nr >= avi->num_streams || stream_nr < 0) { - g_warning ("Index entry %d has invalid stream nr %d", - i, stream_nr); + g_warning ("Index entry %d has invalid stream nr %d", i, stream_nr); target->stream_nr = -1; continue; } @@ -1103,9 +1074,9 @@ gst_avi_demux_stream_index (GstAviDemux *avi) stream = &avi->stream[stream_nr]; target->index_nr = i; - target->flags = entry.flags; - target->size = entry.size; - target->offset = entry.offset; + target->flags = entry.flags; + target->size = entry.size; + target->offset = entry.offset; /* figure out if the index is 0 based or relative to the MOVI start */ if (i == 0) { @@ -1123,15 +1094,15 @@ gst_avi_demux_stream_index (GstAviDemux *avi) /* all audio frames are keyframes */ target->flags |= GST_RIFF_IF_KEYFRAME; } - + if (stream->strh->samplesize && stream->strh->type == GST_RIFF_FCC_auds) { /* constant rate stream */ gst_pad_convert (stream->pad, GST_FORMAT_BYTES, - stream->total_bytes, &format, &target->ts); + stream->total_bytes, &format, &target->ts); } else { /* VBR stream */ gst_pad_convert (stream->pad, GST_FORMAT_DEFAULT, - stream->total_frames, &format, &target->ts); + stream->total_frames, &format, &target->ts); } stream->total_bytes += target->size; @@ -1143,8 +1114,8 @@ gst_avi_demux_stream_index (GstAviDemux *avi) avi_stream_context *stream; stream = &avi->stream[i]; - GST_DEBUG ("stream %u: %u frames, %" G_GINT64_FORMAT " bytes", - i, stream->total_frames, stream->total_bytes); + GST_DEBUG ("stream %u: %u frames, %" G_GINT64_FORMAT " bytes", + i, stream->total_frames, stream->total_bytes); } end: @@ -1164,7 +1135,7 @@ end: */ gboolean -gst_avi_demux_stream_scan (GstAviDemux *avi) +gst_avi_demux_stream_scan (GstAviDemux * avi) { //GstRiffRead *riff = GST_RIFF_READ (avi); @@ -1178,7 +1149,7 @@ gst_avi_demux_stream_scan (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_header (GstAviDemux *avi) +gst_avi_demux_stream_header (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag, flags, streams; @@ -1188,16 +1159,16 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_LIST) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no LIST at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no LIST at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } if (!gst_riff_read_list (riff, &tag)) return FALSE; if (tag != GST_RIFF_LIST_hdrl) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no hdrl at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no hdrl at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } @@ -1206,8 +1177,8 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_avih) { GST_ELEMENT_ERROR (avi, STREAM, DEMUX, (NULL), - ("Invalid AVI header (no avih at start): " - GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); + ("Invalid AVI header (no avih at start): " + GST_FOURCC_FORMAT, GST_FOURCC_ARGS (tag))); return FALSE; } if (!gst_avi_demux_stream_avih (avi, &flags, &streams)) @@ -1224,44 +1195,44 @@ gst_avi_demux_stream_header (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_LIST: - if (!(tag = gst_riff_peek_list (riff))) - return FALSE; - - switch (tag) { - case GST_RIFF_LIST_strl: - if (!gst_riff_read_list (riff, &tag) || - !gst_avi_demux_add_stream (avi)) - return FALSE; - break; - - case GST_RIFF_LIST_odml: - if (!gst_riff_read_list (riff, &tag) || - !gst_avi_demux_stream_odml (avi)) - return FALSE; - break; - - default: - GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ - - case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; - } - - break; + if (!(tag = gst_riff_peek_list (riff))) + return FALSE; + + switch (tag) { + case GST_RIFF_LIST_strl: + if (!gst_riff_read_list (riff, &tag) || + !gst_avi_demux_add_stream (avi)) + return FALSE; + break; + + case GST_RIFF_LIST_odml: + if (!gst_riff_read_list (riff, &tag) || + !gst_avi_demux_stream_odml (avi)) + return FALSE; + break; + + default: + GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + + case GST_RIFF_TAG_JUNK: + if (!gst_riff_read_skip (riff)) + return FALSE; + break; + } + + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " in AVI header", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } if (avi->level_up) { @@ -1272,11 +1243,11 @@ gst_avi_demux_stream_header (GstAviDemux *avi) if (avi->num_streams != streams) { g_warning ("Stream header mentioned %d streams, but %d available", - streams, avi->num_streams); + streams, avi->num_streams); } /* we've got streaminfo now */ - g_object_notify (G_OBJECT(avi), "streaminfo"); + g_object_notify (G_OBJECT (avi), "streaminfo"); /* Now, find the data (i.e. skip all junk between header and data) */ while (1) { @@ -1284,18 +1255,17 @@ gst_avi_demux_stream_header (GstAviDemux *avi) return FALSE; if (tag != GST_RIFF_TAG_LIST) { if (!gst_riff_read_skip (riff)) - return FALSE; + return FALSE; continue; } if (!(tag = gst_riff_peek_list (riff))) return FALSE; if (tag != GST_RIFF_LIST_movi) { if (tag == GST_RIFF_LIST_INFO) { - if (!gst_riff_read_list (riff, &tag) || - !gst_riff_read_info (riff)) - return FALSE; - } else if (!gst_riff_read_skip (riff)) { - return FALSE; + if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff)) + return FALSE; + } else if (!gst_riff_read_skip (riff)) { + return FALSE; } continue; } @@ -1319,7 +1289,7 @@ gst_avi_demux_stream_header (GstAviDemux *avi) */ static gboolean -gst_avi_demux_handle_seek (GstAviDemux *avi) +gst_avi_demux_handle_seek (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint i; @@ -1336,8 +1306,8 @@ gst_avi_demux_handle_seek (GstAviDemux *avi) avi_stream_context *stream = &avi->stream[i]; if (GST_PAD_IS_USABLE (stream->pad)) { - event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, - avi->last_seek + stream->delay , NULL); + event = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, + avi->last_seek + stream->delay, NULL); gst_pad_push (stream->pad, GST_DATA (event)); } } @@ -1350,17 +1320,17 @@ gst_avi_demux_handle_seek (GstAviDemux *avi) */ gboolean -gst_avi_demux_stream_data (GstAviDemux *avi) +gst_avi_demux_stream_data (GstAviDemux * avi) { GstRiffRead *riff = GST_RIFF_READ (avi); guint32 tag; guint stream_nr; gst_avi_index_entry *entry; - if (avi->seek_offset != (guint64) -1) { + if (avi->seek_offset != (guint64) - 1) { if (!gst_avi_demux_handle_seek (avi)) return FALSE; - avi->seek_offset = (guint64) -1; + avi->seek_offset = (guint64) - 1; } /* peek first (for the end of this 'list/movi' section) */ @@ -1377,40 +1347,40 @@ gst_avi_demux_stream_data (GstAviDemux *avi) switch (tag) { case GST_RIFF_TAG_LIST: - if (!(tag = gst_riff_peek_list (riff))) - return FALSE; - - switch (tag) { - case GST_RIFF_LIST_AVIX: - case GST_RIFF_LIST_movi: - if (!gst_riff_read_list (riff, &tag)) - return FALSE; - /* we're now going to read buffers! */ - break; - - default: - GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " before AVI data", - GST_FOURCC_ARGS (tag)); - /* fall-through */ - - case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; - } - - break; + if (!(tag = gst_riff_peek_list (riff))) + return FALSE; + + switch (tag) { + case GST_RIFF_LIST_AVIX: + case GST_RIFF_LIST_movi: + if (!gst_riff_read_list (riff, &tag)) + return FALSE; + /* we're now going to read buffers! */ + break; + + default: + GST_WARNING ("Unknown list " GST_FOURCC_FORMAT " before AVI data", + GST_FOURCC_ARGS (tag)); + /* fall-through */ + + case GST_RIFF_TAG_JUNK: + if (!gst_riff_read_skip (riff)) + return FALSE; + break; + } + + break; default: - GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " before AVI data", - GST_FOURCC_ARGS (tag)); - /* fall-through */ + GST_WARNING ("Unknown tag " GST_FOURCC_FORMAT " before AVI data", + GST_FOURCC_ARGS (tag)); + /* fall-through */ case GST_RIFF_TAG_idx1: case GST_RIFF_TAG_JUNK: - if (!gst_riff_read_skip (riff)) - return FALSE; - break; + if (!gst_riff_read_skip (riff)) + return FALSE; + break; } } @@ -1421,7 +1391,7 @@ gst_avi_demux_stream_data (GstAviDemux *avi) if (stream_nr < 0 || stream_nr >= avi->num_streams) { /* recoverable */ g_warning ("Invalid stream ID %d (" GST_FOURCC_FORMAT ")", - stream_nr, GST_FOURCC_ARGS (tag)); + stream_nr, GST_FOURCC_ARGS (tag)); if (!gst_riff_read_skip (riff)) return FALSE; } else { @@ -1437,20 +1407,19 @@ gst_avi_demux_stream_data (GstAviDemux *avi) /* get time of this buffer */ stream = &avi->stream[stream_nr]; entry = gst_avi_demux_index_next (avi, stream_nr, - stream->current_entry + 1, 0); + stream->current_entry + 1, 0); if (entry) { stream->current_entry = entry->index_nr; if (entry->flags & GST_RIFF_IF_KEYFRAME) { - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_KEY_UNIT); + GST_BUFFER_FLAG_SET (buf, GST_BUFFER_KEY_UNIT); } } format = GST_FORMAT_TIME; - gst_pad_query (stream->pad, GST_QUERY_POSITION, - &format, &next_ts); + gst_pad_query (stream->pad, GST_QUERY_POSITION, &format, &next_ts); /* set delay (if any) */ if (stream->strh->init_frames == stream->current_frame && - stream->delay == 0) + stream->delay == 0) stream->delay = next_ts; stream->current_frame++; @@ -1462,16 +1431,15 @@ gst_avi_demux_stream_data (GstAviDemux *avi) gst_buffer_unref (buf); } else { if (!stream->pad || !GST_PAD_IS_USABLE (stream->pad)) { - gst_buffer_unref (buf); + gst_buffer_unref (buf); } else { - GstClockTime dur_ts; + GstClockTime dur_ts; - GST_BUFFER_TIMESTAMP (buf) = next_ts; - gst_pad_query (stream->pad, GST_QUERY_POSITION, - &format, &dur_ts); - GST_BUFFER_DURATION (buf) = dur_ts - next_ts; + GST_BUFFER_TIMESTAMP (buf) = next_ts; + gst_pad_query (stream->pad, GST_QUERY_POSITION, &format, &dur_ts); + GST_BUFFER_DURATION (buf) = dur_ts - next_ts; - gst_pad_push (stream->pad, GST_DATA (buf)); + gst_pad_push (stream->pad, GST_DATA (buf)); } } } @@ -1480,26 +1448,26 @@ gst_avi_demux_stream_data (GstAviDemux *avi) } static void -gst_avi_demux_loop (GstElement *element) +gst_avi_demux_loop (GstElement * element) { GstAviDemux *avi = GST_AVI_DEMUX (element); switch (avi->state) { case GST_AVI_DEMUX_START: if (!gst_avi_demux_stream_init (avi)) - return; + return; avi->state = GST_AVI_DEMUX_HEADER; /* fall-through */ case GST_AVI_DEMUX_HEADER: if (!gst_avi_demux_stream_header (avi)) - return; + return; avi->state = GST_AVI_DEMUX_MOVI; /* fall-through */ case GST_AVI_DEMUX_MOVI: if (!gst_avi_demux_stream_data (avi)) - return; + return; break; default: @@ -1508,7 +1476,7 @@ gst_avi_demux_loop (GstElement *element) } static GstElementStateReturn -gst_avi_demux_change_state (GstElement *element) +gst_avi_demux_change_state (GstElement * element) { GstAviDemux *avi = GST_AVI_DEMUX (element); @@ -1530,10 +1498,8 @@ gst_avi_demux_change_state (GstElement *element) } static void -gst_avi_demux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_avi_demux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstAviDemux *avi = GST_AVI_DEMUX (object); diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h index d94433ae..9849bdaf 100644 --- a/gst/avi/gstavidemux.h +++ b/gst/avi/gstavidemux.h @@ -26,7 +26,6 @@ #include "gst/riff/riff-read.h" G_BEGIN_DECLS - #define GST_TYPE_AVI_DEMUX \ (gst_avi_demux_get_type ()) #define GST_AVI_DEMUX(obj) \ @@ -37,93 +36,94 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX)) #define GST_IS_AVI_DEMUX_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX)) - -#define GST_AVI_DEMUX_MAX_STREAMS 16 - +#define GST_AVI_DEMUX_MAX_STREAMS 16 #define CHUNKID_TO_STREAMNR(chunkid) \ ((((chunkid) & 0xff) - '0') * 10 + \ (((chunkid) >> 8) & 0xff) - '0') - -typedef struct { - gint index_nr; - gint stream_nr; - guint64 ts; - guint32 flags; - guint32 offset; - gint size; - guint64 bytes_before; - guint32 frames_before; + typedef struct +{ + gint index_nr; + gint stream_nr; + guint64 ts; + guint32 flags; + guint32 offset; + gint size; + guint64 bytes_before; + guint32 frames_before; } gst_avi_index_entry; -typedef struct { +typedef struct +{ /* index of this streamcontext */ - guint num; + guint num; /* pad, strh */ - GstPad *pad; - GstCaps *caps; - gst_riff_strh *strh; + GstPad *pad; + GstCaps *caps; + gst_riff_strh *strh; /* current position (byte, frame, time) */ - guint current_frame; - guint64 current_byte; - gint current_entry; + guint current_frame; + guint64 current_byte; + gint current_entry; /* delay in time (init_frames) */ - guint64 delay; + guint64 delay; /* stream length */ - guint64 total_bytes; - guint32 total_frames; + guint64 total_bytes; + guint32 total_frames; - guint32 skip; + guint32 skip; } avi_stream_context; -typedef enum { +typedef enum +{ GST_AVI_DEMUX_START, GST_AVI_DEMUX_HEADER, GST_AVI_DEMUX_MOVI, } GstAviDemuxState; -typedef struct _GstAviDemux { - GstRiffRead parent; +typedef struct _GstAviDemux +{ + GstRiffRead parent; /* pads */ - GstPad *sinkpad; + GstPad *sinkpad; /* AVI decoding state */ GstAviDemuxState state; - guint level_up; + guint level_up; /* index */ gst_avi_index_entry *index_entries; - guint index_size; - guint64 index_offset; + guint index_size; + guint64 index_offset; /* streams */ - guint num_streams; - guint num_v_streams; - guint num_a_streams; + guint num_streams; + guint num_v_streams; + guint num_a_streams; avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS]; /* some stream info for length */ - guint32 us_per_frame; - guint32 num_frames; + guint32 us_per_frame; + guint32 num_frames; /* seeking */ - guint64 seek_offset; - guint64 last_seek; + guint64 seek_offset; + guint64 last_seek; /* info */ - GstCaps *streaminfo; + GstCaps *streaminfo; } GstAviDemux; -typedef struct _GstAviDemuxClass { +typedef struct _GstAviDemuxClass +{ GstRiffReadClass parent_class; } GstAviDemuxClass; -GType gst_avi_demux_get_type (void); +GType gst_avi_demux_get_type (void); G_END_DECLS - #endif /* __GST_AVI_DEMUX_H__ */ diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c index a064378f..f5287db0 100644 --- a/gst/avi/gstavimux.c +++ b/gst/avi/gstavimux.c @@ -45,138 +45,126 @@ #endif /* AviMux signals and args */ -enum { +enum +{ /* FILL ME */ LAST_SIGNAL }; -enum { +enum +{ ARG_0, ARG_BIGFILE, }; -static GstStaticPadTemplate src_factory = -GST_STATIC_PAD_TEMPLATE ( - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-msvideo") -); - +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-msvideo") + ); + static GstStaticPadTemplate video_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "video_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "video/x-raw-yuv, " - "format = (fourcc) { YUY2, I420 }, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-jpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-divx, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "divxversion = (int) [ 3, 5 ]; " - "video/x-xvid, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-3ivx, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-msmpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "msmpegversion = (int) [ 41, 43 ]; " - "video/mpeg, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ], " - "mpegversion = (int) 1, " - "systemstream = (boolean) FALSE; " - "video/x-h263, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]; " - "video/x-dv, " - "width = (int) 720, " - "height = (int) { 576, 480 }, " - "systemstream = (boolean) FALSE; " - "video/x-huffyuv, " - "width = (int) [ 16, 4096 ], " - "height = (int) [ 16, 4096 ]" - ) -); - + GST_STATIC_PAD_TEMPLATE ("video_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("video/x-raw-yuv, " + "format = (fourcc) { YUY2, I420 }, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-jpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-divx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "divxversion = (int) [ 3, 5 ]; " + "video/x-xvid, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-3ivx, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-msmpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "msmpegversion = (int) [ 41, 43 ]; " + "video/mpeg, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ], " + "mpegversion = (int) 1, " + "systemstream = (boolean) FALSE; " + "video/x-h263, " + "width = (int) [ 16, 4096 ], " + "height = (int) [ 16, 4096 ]; " + "video/x-dv, " + "width = (int) 720, " + "height = (int) { 576, 480 }, " + "systemstream = (boolean) FALSE; " + "video/x-huffyuv, " + "width = (int) [ 16, 4096 ], " "height = (int) [ 16, 4096 ]") + ); + static GstStaticPadTemplate audio_sink_factory = -GST_STATIC_PAD_TEMPLATE ( - "audio_%d", - GST_PAD_SINK, - GST_PAD_REQUEST, - GST_STATIC_CAPS ( - "audio/x-raw-int, " - "endianness = (int) LITTLE_ENDIAN, " - "signed = (boolean) { TRUE, FALSE }, " - "width = (int) { 8, 16 }, " - "depth = (int) { 8, 16 }, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/mpeg, " - "mpegversion = (int) 1, " - "layer = (int) [ 1, 3 ], " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-vorbis, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]; " - "audio/x-ac3, " - "rate = (int) [ 1000, 96000 ], " - "channels = (int) [ 1, 2 ]" - ) -); - - -static void gst_avimux_base_init (gpointer g_class); -static void gst_avimux_class_init (GstAviMuxClass *klass); -static void gst_avimux_init (GstAviMux *avimux); - -static void gst_avimux_loop (GstElement *element); -static gboolean gst_avimux_handle_event (GstPad *pad, - GstEvent *event); -static GstPad* gst_avimux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *name); -static void gst_avimux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_avimux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static GstElementStateReturn gst_avimux_change_state (GstElement *element); + GST_STATIC_PAD_TEMPLATE ("audio_%d", + GST_PAD_SINK, + GST_PAD_REQUEST, + GST_STATIC_CAPS ("audio/x-raw-int, " + "endianness = (int) LITTLE_ENDIAN, " + "signed = (boolean) { TRUE, FALSE }, " + "width = (int) { 8, 16 }, " + "depth = (int) { 8, 16 }, " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/mpeg, " + "mpegversion = (int) 1, " + "layer = (int) [ 1, 3 ], " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-vorbis, " + "rate = (int) [ 1000, 96000 ], " + "channels = (int) [ 1, 2 ]; " + "audio/x-ac3, " + "rate = (int) [ 1000, 96000 ], " "channels = (int) [ 1, 2 ]") + ); + + +static void gst_avimux_base_init (gpointer g_class); +static void gst_avimux_class_init (GstAviMuxClass * klass); +static void gst_avimux_init (GstAviMux * avimux); + +static void gst_avimux_loop (GstElement * element); +static gboolean gst_avimux_handle_event (GstPad * pad, GstEvent * event); +static GstPad *gst_avimux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * name); +static void gst_avimux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_avimux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static GstElementStateReturn gst_avimux_change_state (GstElement * element); static GstElementClass *parent_class = NULL; + /*static guint gst_avimux_signals[LAST_SIGNAL] = { 0 }; */ GType -gst_avimux_get_type (void) +gst_avimux_get_type (void) { static GType avimux_type = 0; if (!avimux_type) { static const GTypeInfo avimux_info = { - sizeof(GstAviMuxClass), + sizeof (GstAviMuxClass), gst_avimux_base_init, NULL, - (GClassInitFunc)gst_avimux_class_init, + (GClassInitFunc) gst_avimux_class_init, NULL, NULL, - sizeof(GstAviMux), + sizeof (GstAviMux), 0, - (GInstanceInitFunc)gst_avimux_init, + (GInstanceInitFunc) gst_avimux_init, }; - avimux_type = g_type_register_static(GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); + avimux_type = + g_type_register_static (GST_TYPE_ELEMENT, "GstAviMux", &avimux_info, 0); } return avimux_type; } @@ -185,12 +173,11 @@ static void gst_avimux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - static GstElementDetails gst_avimux_details = GST_ELEMENT_DETAILS ( - "Avi multiplexer", - "Codec/Muxer", - "Muxes audio and video into an avi stream", - "Ronald Bultje <rbultje@ronald.bitfreak.net>" - ); + static GstElementDetails gst_avimux_details = + GST_ELEMENT_DETAILS ("Avi multiplexer", + "Codec/Muxer", + "Muxes audio and video into an avi stream", + "Ronald Bultje <rbultje@ronald.bitfreak.net>"); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); @@ -203,20 +190,19 @@ gst_avimux_base_init (gpointer g_class) } static void -gst_avimux_class_init (GstAviMuxClass *klass) +gst_avimux_class_init (GstAviMuxClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BIGFILE, - g_param_spec_boolean("bigfile","Bigfile Support", - "Support for openDML-2.0 (big) AVI files", - 0,G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BIGFILE, + g_param_spec_boolean ("bigfile", "Bigfile Support", + "Support for openDML-2.0 (big) AVI files", 0, G_PARAM_READWRITE)); gstelement_class->request_new_pad = gst_avimux_request_new_pad; @@ -227,26 +213,27 @@ gst_avimux_class_init (GstAviMuxClass *klass) } static const GstEventMask * -gst_avimux_get_event_masks (GstPad *pad) +gst_avimux_get_event_masks (GstPad * pad) { static const GstEventMask gst_avimux_sink_event_masks[] = { - { GST_EVENT_EOS, 0 }, - { 0, } + {GST_EVENT_EOS, 0}, + {0,} }; return gst_avimux_sink_event_masks; } -static void -gst_avimux_init (GstAviMux *avimux) +static void +gst_avimux_init (GstAviMux * avimux) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (avimux); - avimux->srcpad = gst_pad_new_from_template ( - gst_element_class_get_pad_template (klass, "src"), "src"); + avimux->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "src"); gst_element_add_pad (GST_ELEMENT (avimux), avimux->srcpad); - GST_FLAG_SET (GST_ELEMENT(avimux), GST_ELEMENT_EVENT_AWARE); + GST_FLAG_SET (GST_ELEMENT (avimux), GST_ELEMENT_EVENT_AWARE); avimux->audiosinkpad = NULL; avimux->audio_pad_connected = FALSE; @@ -259,15 +246,15 @@ gst_avimux_init (GstAviMux *avimux) avimux->num_frames = 0; /* audio/video/AVI header initialisation */ - memset(&(avimux->avi_hdr),0,sizeof(gst_riff_avih)); - memset(&(avimux->vids_hdr),0,sizeof(gst_riff_strh)); - memset(&(avimux->vids),0,sizeof(gst_riff_strf_vids)); - memset(&(avimux->auds_hdr),0,sizeof(gst_riff_strh)); - memset(&(avimux->auds),0,sizeof(gst_riff_strf_auds)); - avimux->vids_hdr.type = GST_MAKE_FOURCC('v','i','d','s'); + memset (&(avimux->avi_hdr), 0, sizeof (gst_riff_avih)); + memset (&(avimux->vids_hdr), 0, sizeof (gst_riff_strh)); + memset (&(avimux->vids), 0, sizeof (gst_riff_strf_vids)); + memset (&(avimux->auds_hdr), 0, sizeof (gst_riff_strh)); + memset (&(avimux->auds), 0, sizeof (gst_riff_strf_auds)); + avimux->vids_hdr.type = GST_MAKE_FOURCC ('v', 'i', 'd', 's'); avimux->vids_hdr.rate = 1000000; avimux->avi_hdr.max_bps = 10000000; - avimux->auds_hdr.type = GST_MAKE_FOURCC('a','u','d','s'); + avimux->auds_hdr.type = GST_MAKE_FOURCC ('a', 'u', 'd', 's'); avimux->vids_hdr.quality = 0xFFFFFFFF; avimux->auds_hdr.quality = 0xFFFFFFFF; @@ -277,33 +264,34 @@ gst_avimux_init (GstAviMux *avimux) avimux->enable_large_avi = TRUE; - gst_element_set_loop_function(GST_ELEMENT(avimux), gst_avimux_loop); + gst_element_set_loop_function (GST_ELEMENT (avimux), gst_avimux_loop); } static GstPadLinkReturn -gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) +gst_avimux_vidsinkconnect (GstPad * pad, const GstCaps * vscaps) { GstAviMux *avimux; GstStructure *structure; - const gchar* mimetype; + const gchar *mimetype; gdouble fps = 0.; gboolean ret; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); GST_DEBUG ("avimux: video sinkconnect triggered on %s", - gst_pad_get_name (pad)); + gst_pad_get_name (pad)); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); /* global */ - avimux->vids.size = sizeof(gst_riff_strf_vids); - avimux->vids.planes = 1; + avimux->vids.size = sizeof (gst_riff_strf_vids); + avimux->vids.planes = 1; ret = gst_structure_get_int (structure, "width", &avimux->vids.width); ret &= gst_structure_get_int (structure, "height", &avimux->vids.height); ret &= gst_structure_get_double (structure, "framerate", &fps); - if (!ret) return GST_PAD_LINK_REFUSED; + if (!ret) + return GST_PAD_LINK_REFUSED; if (fps != 0.) avimux->vids_hdr.scale = avimux->vids_hdr.rate / fps; @@ -313,13 +301,12 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) gst_structure_get_fourcc (structure, "format", &format); avimux->vids.compression = format; - switch (format) - { - case GST_MAKE_FOURCC('Y','U','Y','2'): - avimux->vids.bit_cnt = 16; + switch (format) { + case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'): + avimux->vids.bit_cnt = 16; break; - case GST_MAKE_FOURCC('I','4','2','0'): - avimux->vids.bit_cnt = 12; + case GST_MAKE_FOURCC ('I', '4', '2', '0'): + avimux->vids.bit_cnt = 12; break; } } else { @@ -328,47 +315,49 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) /* find format */ if (!strcmp (mimetype, "video/x-huffyuv")) { - avimux->vids.compression = GST_MAKE_FOURCC('H','F','Y','U'); + avimux->vids.compression = GST_MAKE_FOURCC ('H', 'F', 'Y', 'U'); } else if (!strcmp (mimetype, "video/x-jpeg")) { - avimux->vids.compression = GST_MAKE_FOURCC('M','J','P','G'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'J', 'P', 'G'); } else if (!strcmp (mimetype, "video/x-divx")) { gint divxversion; + gst_structure_get_int (structure, "divxversion", &divxversion); switch (divxversion) { case 3: - avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', '3'); break; case 4: - avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','X'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'I', 'V', 'X'); break; case 5: - avimux->vids.compression = GST_MAKE_FOURCC('D','X','5','0'); - break; + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'X', '5', '0'); + break; } } else if (!strcmp (mimetype, "video/x-xvid")) { - avimux->vids.compression = GST_MAKE_FOURCC('X','V','I','D'); + avimux->vids.compression = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); } else if (!strcmp (mimetype, "video/x-3ivx")) { - avimux->vids.compression = GST_MAKE_FOURCC('3','I','V','2'); + avimux->vids.compression = GST_MAKE_FOURCC ('3', 'I', 'V', '2'); } else if (!strcmp (mimetype, "video/x-msmpeg")) { gint msmpegversion; + gst_structure_get_int (structure, "msmpegversion", &msmpegversion); switch (msmpegversion) { case 41: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','G','4'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'G', '4'); break; case 42: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','2'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '2'); break; case 43: - avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', '4', '3'); break; } } else if (!strcmp (mimetype, "video/x-dv")) { - avimux->vids.compression = GST_MAKE_FOURCC('D','V','S','D'); + avimux->vids.compression = GST_MAKE_FOURCC ('D', 'V', 'S', 'D'); } else if (!strcmp (mimetype, "video/x-h263")) { - avimux->vids.compression = GST_MAKE_FOURCC('H','2','6','3'); + avimux->vids.compression = GST_MAKE_FOURCC ('H', '2', '6', '3'); } else if (!strcmp (mimetype, "video/mpeg")) { - avimux->vids.compression = GST_MAKE_FOURCC('M','P','E','G'); + avimux->vids.compression = GST_MAKE_FOURCC ('M', 'P', 'E', 'G'); } if (!avimux->vids.compression) { @@ -385,17 +374,17 @@ gst_avimux_vidsinkconnect (GstPad *pad, const GstCaps *vscaps) } static GstPadLinkReturn -gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) +gst_avimux_audsinkconnect (GstPad * pad, const GstCaps * vscaps) { GstAviMux *avimux; GstStructure *structure; - const gchar* mimetype; + const gchar *mimetype; int i; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); GST_DEBUG ("avimux: audio sinkconnect triggered on %s", - gst_pad_get_name (pad)); + gst_pad_get_name (pad)); structure = gst_caps_get_structure (vscaps, 0); mimetype = gst_structure_get_name (structure); @@ -407,7 +396,7 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) avimux->auds.rate = i; if (!strcmp (mimetype, "audio/x-raw-int")) { - avimux->auds.format = GST_RIFF_WAVE_FORMAT_PCM; + avimux->auds.format = GST_RIFF_WAVE_FORMAT_PCM; gst_structure_get_int (structure, "width", &i); avimux->auds.blockalign = i; @@ -419,18 +408,20 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) avimux->auds.blockalign *= avimux->auds.channels; avimux->auds.av_bps = avimux->auds.blockalign * avimux->auds.rate; } else if (!strcmp (mimetype, "audio/mpeg") || - !strcmp (mimetype, "audio/x-vorbis") || - !strcmp (mimetype, "audio/x-ac3")) { + !strcmp (mimetype, "audio/x-vorbis") || + !strcmp (mimetype, "audio/x-ac3")) { avimux->auds.format = 0; if (!strcmp (mimetype, "audio/mpeg")) { gint layer = 3; + gst_structure_get_int (structure, "layer", &layer); switch (layer) { case 3: avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL3; break; - case 1: case 2: + case 1: + case 2: avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL12; break; } @@ -449,31 +440,24 @@ gst_avimux_audsinkconnect (GstPad *pad, const GstCaps *vscaps) } } - avimux->auds_hdr.rate = avimux->auds.blockalign * avimux->auds.rate; + avimux->auds_hdr.rate = avimux->auds.blockalign * avimux->auds.rate; avimux->auds_hdr.samplesize = avimux->auds.blockalign; avimux->auds_hdr.scale = avimux->auds.blockalign; return GST_PAD_LINK_OK; } static void -gst_avimux_pad_link (GstPad *pad, - GstPad *peer, - gpointer data) +gst_avimux_pad_link (GstPad * pad, GstPad * peer, gpointer data) { - GstAviMux *avimux = GST_AVIMUX(data); + GstAviMux *avimux = GST_AVIMUX (data); const gchar *padname = gst_pad_get_name (pad); - if (pad == avimux->audiosinkpad) - { + if (pad == avimux->audiosinkpad) { avimux->audio_pad_connected = TRUE; - } - else if (pad == avimux->videosinkpad) - { + } else if (pad == avimux->videosinkpad) { avimux->video_pad_connected = TRUE; - } - else - { - g_warning("Unknown padname '%s'", padname); + } else { + g_warning ("Unknown padname '%s'", padname); return; } @@ -481,36 +465,28 @@ gst_avimux_pad_link (GstPad *pad, } static void -gst_avimux_pad_unlink (GstPad *pad, - GstPad *peer, - gpointer data) +gst_avimux_pad_unlink (GstPad * pad, GstPad * peer, gpointer data) { - GstAviMux *avimux = GST_AVIMUX(data); + GstAviMux *avimux = GST_AVIMUX (data); const gchar *padname = gst_pad_get_name (pad); - if (pad == avimux->audiosinkpad) - { + if (pad == avimux->audiosinkpad) { avimux->audio_pad_connected = FALSE; avimux->audiosinkpad = NULL; - } - else if (pad == avimux->videosinkpad) - { + } else if (pad == avimux->videosinkpad) { avimux->video_pad_connected = FALSE; avimux->videosinkpad = NULL; - } - else - { - g_warning("Unknown padname '%s'", padname); + } else { + g_warning ("Unknown padname '%s'", padname); return; } GST_DEBUG ("pad '%s' unlinked", padname); } -static GstPad* -gst_avimux_request_new_pad (GstElement *element, - GstPadTemplate *templ, - const gchar *req_name) +static GstPad * +gst_avimux_request_new_pad (GstElement * element, + GstPadTemplate * templ, const gchar * req_name) { GstAviMux *avimux; GstPad *newpad; @@ -528,29 +504,27 @@ gst_avimux_request_new_pad (GstElement *element, avimux = GST_AVIMUX (element); if (templ == gst_element_class_get_pad_template (klass, "audio_%d")) { - g_return_val_if_fail(avimux->audiosinkpad == NULL, NULL); + g_return_val_if_fail (avimux->audiosinkpad == NULL, NULL); newpad = gst_pad_new_from_template (templ, "audio_00"); gst_pad_set_link_function (newpad, gst_avimux_audsinkconnect); avimux->audiosinkpad = newpad; - } - else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { - g_return_val_if_fail(avimux->videosinkpad == NULL, NULL); + } else if (templ == gst_element_class_get_pad_template (klass, "video_%d")) { + g_return_val_if_fail (avimux->videosinkpad == NULL, NULL); newpad = gst_pad_new_from_template (templ, "video_00"); gst_pad_set_link_function (newpad, gst_avimux_vidsinkconnect); avimux->videosinkpad = newpad; - } - else { + } else { g_warning ("avimux: this is not our template!\n"); return NULL; } - g_signal_connect(newpad, "linked", - G_CALLBACK(gst_avimux_pad_link), (gpointer)avimux); - g_signal_connect(newpad, "unlinked", - G_CALLBACK(gst_avimux_pad_unlink), (gpointer)avimux); + g_signal_connect (newpad, "linked", + G_CALLBACK (gst_avimux_pad_link), (gpointer) avimux); + g_signal_connect (newpad, "unlinked", + G_CALLBACK (gst_avimux_pad_unlink), (gpointer) avimux); gst_element_add_pad (element, newpad); - gst_pad_set_event_mask_function(newpad, gst_avimux_get_event_masks); - + gst_pad_set_event_mask_function (newpad, gst_avimux_get_event_masks); + return newpad; } @@ -559,215 +533,301 @@ gst_avimux_request_new_pad (GstElement *element, /* DISCLAIMER: this function is ugly. So be it (i.e. it makes the rest easier) */ static GstBuffer * -gst_avimux_riff_get_avi_header (GstAviMux *avimux) +gst_avimux_riff_get_avi_header (GstAviMux * avimux) { GstBuffer *buffer; guint8 *buffdata; guint16 temp16; guint32 temp32; - buffer = gst_buffer_new(); + buffer = gst_buffer_new (); /* first, let's see what actually needs to be in the buffer */ - GST_BUFFER_SIZE(buffer) = 0; - GST_BUFFER_SIZE(buffer) += 32 + sizeof(gst_riff_avih); /* avi header */ - if (avimux->video_pad_connected) - { /* we have video */ - GST_BUFFER_SIZE(buffer) += 28 + sizeof(gst_riff_strh) + sizeof(gst_riff_strf_vids); /* vid hdr */ - GST_BUFFER_SIZE(buffer) += 24; /* odml header */ + GST_BUFFER_SIZE (buffer) = 0; + GST_BUFFER_SIZE (buffer) += 32 + sizeof (gst_riff_avih); /* avi header */ + if (avimux->video_pad_connected) { /* we have video */ + GST_BUFFER_SIZE (buffer) += 28 + sizeof (gst_riff_strh) + sizeof (gst_riff_strf_vids); /* vid hdr */ + GST_BUFFER_SIZE (buffer) += 24; /* odml header */ } - if (avimux->audio_pad_connected) - { /* we have audio */ - GST_BUFFER_SIZE(buffer) += 28 + sizeof(gst_riff_strh) + sizeof(gst_riff_strf_auds); /* aud hdr */ + if (avimux->audio_pad_connected) { /* we have audio */ + GST_BUFFER_SIZE (buffer) += 28 + sizeof (gst_riff_strh) + sizeof (gst_riff_strf_auds); /* aud hdr */ } /* this is the "riff size" */ - avimux->header_size = GST_BUFFER_SIZE(buffer); - GST_BUFFER_SIZE(buffer) += 12; /* avi data header */ + avimux->header_size = GST_BUFFER_SIZE (buffer); + GST_BUFFER_SIZE (buffer) += 12; /* avi data header */ /* allocate the buffer */ - buffdata = GST_BUFFER_DATA(buffer) = g_malloc(GST_BUFFER_SIZE(buffer)); + buffdata = GST_BUFFER_DATA (buffer) = g_malloc (GST_BUFFER_SIZE (buffer)); /* avi header metadata */ - memcpy(buffdata, "RIFF", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->header_size + avimux->idx_size + avimux->data_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "AVI ", 4); buffdata += 4; - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->header_size - 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "hdrl", 4); buffdata += 4; - memcpy(buffdata, "avih", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_avih)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "RIFF", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (avimux->header_size + avimux->idx_size + + avimux->data_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "AVI ", 4); + buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->header_size - 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "hdrl", 4); + buffdata += 4; + memcpy (buffdata, "avih", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_avih)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the AVI header itself */ - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.us_frame); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.max_bps); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.pad_gran); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.tot_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.streams); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.width); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.height); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->avi_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - - if (avimux->video_pad_connected) - { + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.us_frame); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.max_bps); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.pad_gran); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.tot_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.streams); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.width); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.height); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->avi_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + + if (avimux->video_pad_connected) { /* video header metadata */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh) + sizeof(gst_riff_strf_vids) + 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "strl", 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (sizeof (gst_riff_strh) + sizeof (gst_riff_strf_vids) + + 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "strl", 4); + buffdata += 4; /* generic header */ - memcpy(buffdata, "strh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strh)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.type); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.fcc_handler); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.priority); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.quality); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids_hdr.samplesize); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.type); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.fcc_handler); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.priority); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.quality); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids_hdr.samplesize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the video header */ - memcpy(buffdata, "strf", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strf_vids)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strf", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strf_vids)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->vids.size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.width); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.height); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp16 = LE_FROM_GUINT16(avimux->vids.planes); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->vids.bit_cnt); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp32 = LE_FROM_GUINT32(avimux->vids.compression); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.image_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.xpels_meter); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.ypels_meter); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.num_colors); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->vids.imp_colors); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.width); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.height); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp16 = LE_FROM_GUINT16 (avimux->vids.planes); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->vids.bit_cnt); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp32 = LE_FROM_GUINT32 (avimux->vids.compression); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.image_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.xpels_meter); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.ypels_meter); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.num_colors); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->vids.imp_colors); + memcpy (buffdata, &temp32, 4); + buffdata += 4; } - if (avimux->audio_pad_connected) - { + if (avimux->audio_pad_connected) { /* audio header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh) + sizeof(gst_riff_strf_auds) + 4*5); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "strl", 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = + LE_FROM_GUINT32 (sizeof (gst_riff_strh) + sizeof (gst_riff_strf_auds) + + 4 * 5); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "strl", 4); + buffdata += 4; /* generic header */ - memcpy(buffdata, "strh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strh)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strh)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.type); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.fcc_handler); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.flags); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.priority); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.init_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.scale); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.start); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.length); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.bufsize); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.quality); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds_hdr.samplesize); - memcpy(buffdata, &temp32, 4); buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.type); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.fcc_handler); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.flags); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.priority); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.init_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.scale); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.start); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.length); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.bufsize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.quality); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds_hdr.samplesize); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the audio header */ - memcpy(buffdata, "strf", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(gst_riff_strf_auds)); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "strf", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (gst_riff_strf_auds)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; /* the actual header */ - temp16 = LE_FROM_GUINT16(avimux->auds.format); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->auds.channels); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp32 = LE_FROM_GUINT32(avimux->auds.rate); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->auds.av_bps); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp16 = LE_FROM_GUINT16(avimux->auds.blockalign); - memcpy(buffdata, &temp16, 2); buffdata += 2; - temp16 = LE_FROM_GUINT16(avimux->auds.size); - memcpy(buffdata, &temp16, 2); buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.format); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.channels); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp32 = LE_FROM_GUINT32 (avimux->auds.rate); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->auds.av_bps); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp16 = LE_FROM_GUINT16 (avimux->auds.blockalign); + memcpy (buffdata, &temp16, 2); + buffdata += 2; + temp16 = LE_FROM_GUINT16 (avimux->auds.size); + memcpy (buffdata, &temp16, 2); + buffdata += 2; } - if (avimux->video_pad_connected) - { + if (avimux->video_pad_connected) { /* odml header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(guint32)+4*3); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "odml", 4); buffdata += 4; - memcpy(buffdata, "dmlh", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(sizeof(guint32)); - memcpy(buffdata, &temp32, 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->total_frames); - memcpy(buffdata, &temp32, 4); buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (guint32) + 4 * 3); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "odml", 4); + buffdata += 4; + memcpy (buffdata, "dmlh", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (sizeof (guint32)); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->total_frames); + memcpy (buffdata, &temp32, 4); + buffdata += 4; } /* avi data header */ - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(avimux->data_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "movi", 4); + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (avimux->data_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "movi", 4); return buffer; } @@ -779,18 +839,23 @@ gst_avimux_riff_get_avix_header (guint32 datax_size) guint8 *buffdata; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = 24; - buffdata = GST_BUFFER_DATA(buffer) = g_malloc(GST_BUFFER_SIZE(buffer)); - - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(datax_size+4*4); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "AVIX", 4); buffdata += 4; - memcpy(buffdata, "LIST", 4); buffdata += 4; - temp32 = LE_FROM_GUINT32(datax_size); - memcpy(buffdata, &temp32, 4); buffdata += 4; - memcpy(buffdata, "movi", 4); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = 24; + buffdata = GST_BUFFER_DATA (buffer) = g_malloc (GST_BUFFER_SIZE (buffer)); + + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (datax_size + 4 * 4); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "AVIX", 4); + buffdata += 4; + memcpy (buffdata, "LIST", 4); + buffdata += 4; + temp32 = LE_FROM_GUINT32 (datax_size); + memcpy (buffdata, &temp32, 4); + buffdata += 4; + memcpy (buffdata, "movi", 4); return buffer; } @@ -801,12 +866,12 @@ gst_avimux_riff_get_video_header (guint32 video_frame_size) GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_DATA(buffer) = g_malloc(8); - GST_BUFFER_SIZE(buffer) = 8; - memcpy(GST_BUFFER_DATA(buffer), "00db", 4); - temp32 = LE_FROM_GUINT32(video_frame_size); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); + buffer = gst_buffer_new (); + GST_BUFFER_DATA (buffer) = g_malloc (8); + GST_BUFFER_SIZE (buffer) = 8; + memcpy (GST_BUFFER_DATA (buffer), "00db", 4); + temp32 = LE_FROM_GUINT32 (video_frame_size); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); return buffer; } @@ -817,12 +882,12 @@ gst_avimux_riff_get_audio_header (guint32 audio_sample_size) GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_DATA(buffer) = g_malloc(8); - GST_BUFFER_SIZE(buffer) = 8; - memcpy(GST_BUFFER_DATA(buffer), "01wb", 4); - temp32 = LE_FROM_GUINT32(audio_sample_size); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); + buffer = gst_buffer_new (); + GST_BUFFER_DATA (buffer) = g_malloc (8); + GST_BUFFER_SIZE (buffer) = 8; + memcpy (GST_BUFFER_DATA (buffer), "01wb", 4); + temp32 = LE_FROM_GUINT32 (audio_sample_size); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); return buffer; } @@ -830,73 +895,70 @@ gst_avimux_riff_get_audio_header (guint32 audio_sample_size) /* some other usable functions (thankyou xawtv ;-) ) */ static void -gst_avimux_add_index (GstAviMux *avimux, guchar *code, guint32 flags, guint32 size) +gst_avimux_add_index (GstAviMux * avimux, guchar * code, guint32 flags, + guint32 size) { - if (avimux->idx_index == avimux->idx_count) - { + if (avimux->idx_index == avimux->idx_count) { avimux->idx_count += 256; - avimux->idx = realloc(avimux->idx, avimux->idx_count*sizeof(gst_riff_index_entry)); + avimux->idx = + realloc (avimux->idx, + avimux->idx_count * sizeof (gst_riff_index_entry)); } - memcpy(&(avimux->idx[avimux->idx_index].id), code, 4); - avimux->idx[avimux->idx_index].flags = LE_FROM_GUINT32(flags); - avimux->idx[avimux->idx_index].offset = LE_FROM_GUINT32(avimux->idx_offset); - avimux->idx[avimux->idx_index].size = LE_FROM_GUINT32(size); + memcpy (&(avimux->idx[avimux->idx_index].id), code, 4); + avimux->idx[avimux->idx_index].flags = LE_FROM_GUINT32 (flags); + avimux->idx[avimux->idx_index].offset = LE_FROM_GUINT32 (avimux->idx_offset); + avimux->idx[avimux->idx_index].size = LE_FROM_GUINT32 (size); avimux->idx_index++; } static void -gst_avimux_write_index (GstAviMux *avimux) +gst_avimux_write_index (GstAviMux * avimux) { GstBuffer *buffer; guint32 temp32; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = 8; - GST_BUFFER_DATA(buffer) = g_malloc(8); - memcpy(GST_BUFFER_DATA(buffer), "idx1", 4); - temp32 = LE_FROM_GUINT32(avimux->idx_index * sizeof(gst_riff_index_entry)); - memcpy(GST_BUFFER_DATA(buffer)+4, &temp32, 4); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = 8; + GST_BUFFER_DATA (buffer) = g_malloc (8); + memcpy (GST_BUFFER_DATA (buffer), "idx1", 4); + temp32 = LE_FROM_GUINT32 (avimux->idx_index * sizeof (gst_riff_index_entry)); + memcpy (GST_BUFFER_DATA (buffer) + 4, &temp32, 4); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = avimux->idx_index * sizeof(gst_riff_index_entry); - GST_BUFFER_DATA(buffer) = (unsigned char*) avimux->idx; - avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ - avimux->total_data += GST_BUFFER_SIZE(buffer); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = avimux->idx_index * sizeof (gst_riff_index_entry); + GST_BUFFER_DATA (buffer) = (unsigned char *) avimux->idx; + avimux->idx = NULL; /* will be free()'ed by gst_buffer_unref() */ + avimux->total_data += GST_BUFFER_SIZE (buffer); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); - avimux->idx_size += avimux->idx_index * sizeof(gst_riff_index_entry) + 8; + avimux->idx_size += avimux->idx_index * sizeof (gst_riff_index_entry) + 8; /* update header */ avimux->avi_hdr.flags |= GST_RIFF_AVIH_HASINDEX; } static void -gst_avimux_bigfile(GstAviMux *avimux, gboolean last) +gst_avimux_bigfile (GstAviMux * avimux, gboolean last) { GstBuffer *header; GstEvent *event; - - if (avimux->is_bigfile) - { + + if (avimux->is_bigfile) { /* sarch back */ - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - avimux->avix_start); + event = gst_event_new_seek (GST_FORMAT_BYTES | + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, avimux->avix_start); /* if the event succeeds */ - gst_pad_push(avimux->srcpad, GST_DATA(event)); + gst_pad_push (avimux->srcpad, GST_DATA (event)); /* rewrite AVIX header */ - header = gst_avimux_riff_get_avix_header(avimux->datax_size); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avix_header (avimux->datax_size); + gst_pad_push (avimux->srcpad, GST_DATA (header)); /* go back to current location */ - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET | - GST_SEEK_FLAG_FLUSH, - avimux->total_data); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + event = gst_event_new_seek (GST_FORMAT_BYTES | + GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, avimux->total_data); + gst_pad_push (avimux->srcpad, GST_DATA (event)); } avimux->avix_start = avimux->total_data; @@ -907,21 +969,21 @@ gst_avimux_bigfile(GstAviMux *avimux, gboolean last) avimux->numx_frames = 0; avimux->datax_size = 0; - header = gst_avimux_riff_get_avix_header(0); - avimux->total_data += GST_BUFFER_SIZE(header); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avix_header (0); + avimux->total_data += GST_BUFFER_SIZE (header); + gst_pad_push (avimux->srcpad, GST_DATA (header)); } /* enough header blabla now, let's go on to actually writing the headers */ static void -gst_avimux_start_file (GstAviMux *avimux) +gst_avimux_start_file (GstAviMux * avimux) { GstBuffer *header; avimux->total_data = 0; avimux->total_frames = 0; - avimux->data_size = 4; /* ? */ + avimux->data_size = 4; /* ? */ avimux->datax_size = 0; avimux->num_frames = 0; avimux->numx_frames = 0; @@ -930,41 +992,39 @@ gst_avimux_start_file (GstAviMux *avimux) avimux->avix_start = 0; avimux->idx_index = 0; - avimux->idx_offset = 0; /* see 10 lines below */ + avimux->idx_offset = 0; /* see 10 lines below */ avimux->idx_size = 0; avimux->idx_count = 0; avimux->idx = NULL; /* header */ - avimux->avi_hdr.streams = (avimux->video_pad_connected?1:0) + (avimux->audio_pad_connected?1:0); + avimux->avi_hdr.streams = + (avimux->video_pad_connected ? 1 : 0) + + (avimux->audio_pad_connected ? 1 : 0); avimux->is_bigfile = FALSE; - header = gst_avimux_riff_get_avi_header(avimux); - avimux->total_data += GST_BUFFER_SIZE(header); + header = gst_avimux_riff_get_avi_header (avimux); + avimux->total_data += GST_BUFFER_SIZE (header); avimux->idx_offset = avimux->total_data; - gst_pad_push(avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); avimux->write_header = FALSE; avimux->restart = FALSE; } static void -gst_avimux_stop_file (GstAviMux *avimux) +gst_avimux_stop_file (GstAviMux * avimux) { GstEvent *event; GstBuffer *header; /* if bigfile, rewrite header, else write indexes */ - if (avimux->video_pad_connected) - { - if (avimux->is_bigfile) - { - gst_avimux_bigfile(avimux, TRUE); + if (avimux->video_pad_connected) { + if (avimux->is_bigfile) { + gst_avimux_bigfile (avimux, TRUE); avimux->idx_size = 0; - } - else - { - gst_avimux_write_index(avimux); + } else { + gst_avimux_write_index (avimux); } } @@ -974,7 +1034,8 @@ gst_avimux_stop_file (GstAviMux *avimux) avimux->vids_hdr.length = avimux->num_frames; } if (avimux->audio_pad_connected) { - avimux->auds_hdr.length = (avimux->audio_time * avimux->auds.rate)/GST_SECOND; + avimux->auds_hdr.length = + (avimux->audio_time * avimux->auds.rate) / GST_SECOND; } /* set rate and everything having to do with that */ @@ -983,68 +1044,68 @@ gst_avimux_stop_file (GstAviMux *avimux) /* calculate bps if needed */ if (!avimux->auds.av_bps) { if (avimux->audio_time) { - avimux->auds_hdr.rate = (GST_SECOND * avimux->audio_size) / avimux->audio_time; + avimux->auds_hdr.rate = + (GST_SECOND * avimux->audio_size) / avimux->audio_time; } else { - GST_ELEMENT_ERROR (avimux, STREAM, MUX, - (_("No or invalid input audio, AVI stream will be corrupt.")), (NULL)); - avimux->auds_hdr.rate = 0; + GST_ELEMENT_ERROR (avimux, STREAM, MUX, + (_("No or invalid input audio, AVI stream will be corrupt.")), + (NULL)); + avimux->auds_hdr.rate = 0; } avimux->auds.av_bps = avimux->auds_hdr.rate * avimux->auds_hdr.scale; } avimux->avi_hdr.max_bps += avimux->auds.av_bps; } if (avimux->video_pad_connected) { - avimux->avi_hdr.max_bps += ((avimux->vids.bit_cnt+7)/8) * - (1000000. / avimux->avi_hdr.us_frame) * - avimux->vids.image_size; + avimux->avi_hdr.max_bps += ((avimux->vids.bit_cnt + 7) / 8) * + (1000000. / avimux->avi_hdr.us_frame) * avimux->vids.image_size; } /* seek and rewrite the header */ - header = gst_avimux_riff_get_avi_header(avimux); - event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, 0); - gst_pad_push(avimux->srcpad, GST_DATA(event)); - gst_pad_push(avimux->srcpad, GST_DATA (header)); + header = gst_avimux_riff_get_avi_header (avimux); + event = gst_event_new_seek (GST_FORMAT_BYTES | GST_SEEK_METHOD_SET, 0); + gst_pad_push (avimux->srcpad, GST_DATA (event)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); event = gst_event_new_seek (GST_FORMAT_BYTES | - GST_SEEK_METHOD_SET, avimux->total_data); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + GST_SEEK_METHOD_SET, avimux->total_data); + gst_pad_push (avimux->srcpad, GST_DATA (event)); avimux->write_header = TRUE; } static void -gst_avimux_restart_file (GstAviMux *avimux) +gst_avimux_restart_file (GstAviMux * avimux) { GstEvent *event; - gst_avimux_stop_file(avimux); + gst_avimux_stop_file (avimux); - event = gst_event_new(GST_EVENT_EOS); - gst_pad_push(avimux->srcpad, GST_DATA(event)); + event = gst_event_new (GST_EVENT_EOS); + gst_pad_push (avimux->srcpad, GST_DATA (event)); - gst_avimux_start_file(avimux); + gst_avimux_start_file (avimux); } /* handle events (search) */ static gboolean -gst_avimux_handle_event (GstPad *pad, GstEvent *event) +gst_avimux_handle_event (GstPad * pad, GstEvent * event) { GstAviMux *avimux; GstEventType type; avimux = GST_AVIMUX (gst_pad_get_parent (pad)); - + type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN; switch (type) { case GST_EVENT_EOS: /* is this allright? */ if (pad == avimux->videosinkpad) { - avimux->video_pad_eos = TRUE; + avimux->video_pad_eos = TRUE; } else if (pad == avimux->audiosinkpad) { - avimux->audio_pad_eos = TRUE; + avimux->audio_pad_eos = TRUE; } else { - g_warning("Unknown pad for EOS!"); + g_warning ("Unknown pad for EOS!"); } break; default: @@ -1057,19 +1118,17 @@ gst_avimux_handle_event (GstPad *pad, GstEvent *event) /* fill the internal queue for each available pad */ static void -gst_avimux_fill_queue (GstAviMux *avimux) +gst_avimux_fill_queue (GstAviMux * avimux) { GstBuffer *buffer; while (!avimux->audio_buffer_queue && - avimux->audiosinkpad && - avimux->audio_pad_connected && - GST_PAD_IS_USABLE(avimux->audiosinkpad) && - !avimux->audio_pad_eos) - { - buffer = GST_BUFFER (gst_pad_pull(avimux->audiosinkpad)); - if (GST_IS_EVENT(buffer)) { - gst_avimux_handle_event(avimux->audiosinkpad, GST_EVENT(buffer)); + avimux->audiosinkpad && + avimux->audio_pad_connected && + GST_PAD_IS_USABLE (avimux->audiosinkpad) && !avimux->audio_pad_eos) { + buffer = GST_BUFFER (gst_pad_pull (avimux->audiosinkpad)); + if (GST_IS_EVENT (buffer)) { + gst_avimux_handle_event (avimux->audiosinkpad, GST_EVENT (buffer)); } else { avimux->audio_buffer_queue = buffer; break; @@ -1077,14 +1136,12 @@ gst_avimux_fill_queue (GstAviMux *avimux) } while (!avimux->video_buffer_queue && - avimux->videosinkpad && - avimux->video_pad_connected && - GST_PAD_IS_USABLE(avimux->videosinkpad) && - !avimux->video_pad_eos) - { - buffer = GST_BUFFER (gst_pad_pull(avimux->videosinkpad)); - if (GST_IS_EVENT(buffer)) { - gst_avimux_handle_event(avimux->videosinkpad, GST_EVENT(buffer)); + avimux->videosinkpad && + avimux->video_pad_connected && + GST_PAD_IS_USABLE (avimux->videosinkpad) && !avimux->video_pad_eos) { + buffer = GST_BUFFER (gst_pad_pull (avimux->videosinkpad)); + if (GST_IS_EVENT (buffer)) { + gst_avimux_handle_event (avimux->videosinkpad, GST_EVENT (buffer)); } else { avimux->video_buffer_queue = buffer; break; @@ -1095,49 +1152,45 @@ gst_avimux_fill_queue (GstAviMux *avimux) /* send extra 'padding' data */ static void -gst_avimux_send_pad_data (GstAviMux *avimux, - gulong num_bytes) +gst_avimux_send_pad_data (GstAviMux * avimux, gulong num_bytes) { GstBuffer *buffer; - buffer = gst_buffer_new(); - GST_BUFFER_SIZE(buffer) = num_bytes; - GST_BUFFER_DATA(buffer) = g_malloc(num_bytes); - memset(GST_BUFFER_DATA(buffer), 0, num_bytes); + buffer = gst_buffer_new (); + GST_BUFFER_SIZE (buffer) = num_bytes; + GST_BUFFER_DATA (buffer) = g_malloc (num_bytes); + memset (GST_BUFFER_DATA (buffer), 0, num_bytes); - gst_pad_push(avimux->srcpad, GST_DATA (buffer)); + gst_pad_push (avimux->srcpad, GST_DATA (buffer)); } /* do audio buffer */ static void -gst_avimux_do_audio_buffer (GstAviMux *avimux) +gst_avimux_do_audio_buffer (GstAviMux * avimux) { GstBuffer *data = avimux->audio_buffer_queue, *header; gulong total_size, pad_bytes = 0; /* write a audio header + index entry */ - if (GST_BUFFER_SIZE(data) & 1) { - pad_bytes = 2 - (GST_BUFFER_SIZE(data) & 1); + if (GST_BUFFER_SIZE (data) & 1) { + pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); } - header = gst_avimux_riff_get_audio_header(GST_BUFFER_SIZE(data)); - total_size = GST_BUFFER_SIZE(header) + GST_BUFFER_SIZE(data) + pad_bytes; + header = gst_avimux_riff_get_audio_header (GST_BUFFER_SIZE (data)); + total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; - if (avimux->is_bigfile) - { + if (avimux->is_bigfile) { avimux->datax_size += total_size; - } - else - { + } else { avimux->data_size += total_size; - avimux->audio_size += GST_BUFFER_SIZE(data); - avimux->audio_time += GST_BUFFER_DURATION(data); - gst_avimux_add_index(avimux, "01wb", 0x0, GST_BUFFER_SIZE(data)); + avimux->audio_size += GST_BUFFER_SIZE (data); + avimux->audio_time += GST_BUFFER_DURATION (data); + gst_avimux_add_index (avimux, "01wb", 0x0, GST_BUFFER_SIZE (data)); } - gst_pad_push(avimux->srcpad, GST_DATA (header)); - gst_pad_push(avimux->srcpad, GST_DATA (data)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (data)); if (pad_bytes) { - gst_avimux_send_pad_data(avimux, pad_bytes); + gst_avimux_send_pad_data (avimux, pad_bytes); } avimux->total_data += total_size; avimux->idx_offset += total_size; @@ -1148,49 +1201,47 @@ gst_avimux_do_audio_buffer (GstAviMux *avimux) /* do video buffer */ static void -gst_avimux_do_video_buffer (GstAviMux *avimux) +gst_avimux_do_video_buffer (GstAviMux * avimux) { GstBuffer *data = avimux->video_buffer_queue, *header; gulong total_size, pad_bytes = 0; if (avimux->restart) - gst_avimux_restart_file(avimux); + gst_avimux_restart_file (avimux); /* write a video header + index entry */ - if ((avimux->is_bigfile?avimux->datax_size:avimux->data_size)+GST_BUFFER_SIZE(data)>1024*1024*2000) - { + if ((avimux->is_bigfile ? avimux->datax_size : avimux->data_size) + + GST_BUFFER_SIZE (data) > 1024 * 1024 * 2000) { if (avimux->enable_large_avi) - gst_avimux_bigfile(avimux, FALSE); + gst_avimux_bigfile (avimux, FALSE); else - gst_avimux_restart_file(avimux); + gst_avimux_restart_file (avimux); } - if (GST_BUFFER_SIZE(data) & 1) { - pad_bytes = 2 - (GST_BUFFER_SIZE(data) & 1); + if (GST_BUFFER_SIZE (data) & 1) { + pad_bytes = 2 - (GST_BUFFER_SIZE (data) & 1); } - header = gst_avimux_riff_get_video_header(GST_BUFFER_SIZE(data)); - total_size = GST_BUFFER_SIZE(header) + GST_BUFFER_SIZE(data) + pad_bytes; + header = gst_avimux_riff_get_video_header (GST_BUFFER_SIZE (data)); + total_size = GST_BUFFER_SIZE (header) + GST_BUFFER_SIZE (data) + pad_bytes; avimux->total_frames++; - if (avimux->is_bigfile) - { + if (avimux->is_bigfile) { avimux->datax_size += total_size; avimux->numx_frames++; - } - else - { + } else { guint flags = 0x2; + if (GST_BUFFER_FLAG_IS_SET (data, GST_BUFFER_KEY_UNIT)) flags |= 0x10; avimux->data_size += total_size; avimux->num_frames++; - gst_avimux_add_index(avimux, "00db", flags, GST_BUFFER_SIZE(data)); + gst_avimux_add_index (avimux, "00db", flags, GST_BUFFER_SIZE (data)); } - gst_pad_push(avimux->srcpad, GST_DATA (header)); - gst_pad_push(avimux->srcpad, GST_DATA (data)); + gst_pad_push (avimux->srcpad, GST_DATA (header)); + gst_pad_push (avimux->srcpad, GST_DATA (data)); if (pad_bytes) { - gst_avimux_send_pad_data(avimux, pad_bytes); + gst_avimux_send_pad_data (avimux, pad_bytes); } avimux->total_data += total_size; avimux->idx_offset += total_size; @@ -1201,31 +1252,24 @@ gst_avimux_do_video_buffer (GstAviMux *avimux) /* take the oldest buffer in our internal queue and push-it */ static gboolean -gst_avimux_do_one_buffer (GstAviMux *avimux) +gst_avimux_do_one_buffer (GstAviMux * avimux) { - if (avimux->video_buffer_queue && - avimux->audio_buffer_queue) - { - if (GST_BUFFER_TIMESTAMP(avimux->video_buffer_queue) <= - GST_BUFFER_TIMESTAMP(avimux->audio_buffer_queue)) - gst_avimux_do_video_buffer(avimux); + if (avimux->video_buffer_queue && avimux->audio_buffer_queue) { + if (GST_BUFFER_TIMESTAMP (avimux->video_buffer_queue) <= + GST_BUFFER_TIMESTAMP (avimux->audio_buffer_queue)) + gst_avimux_do_video_buffer (avimux); else - gst_avimux_do_audio_buffer(avimux); - } - else if (avimux->video_buffer_queue || - avimux->audio_buffer_queue) - { + gst_avimux_do_audio_buffer (avimux); + } else if (avimux->video_buffer_queue || avimux->audio_buffer_queue) { if (avimux->video_buffer_queue) - gst_avimux_do_video_buffer(avimux); + gst_avimux_do_video_buffer (avimux); else - gst_avimux_do_audio_buffer(avimux); - } - else { + gst_avimux_do_audio_buffer (avimux); + } else { /* simply finish off the file and send EOS */ - gst_avimux_stop_file(avimux); - gst_pad_push(avimux->srcpad, - GST_DATA(gst_event_new(GST_EVENT_EOS))); - gst_element_set_eos(GST_ELEMENT(avimux)); + gst_avimux_stop_file (avimux); + gst_pad_push (avimux->srcpad, GST_DATA (gst_event_new (GST_EVENT_EOS))); + gst_element_set_eos (GST_ELEMENT (avimux)); return FALSE; } @@ -1234,38 +1278,35 @@ gst_avimux_do_one_buffer (GstAviMux *avimux) static void -gst_avimux_loop (GstElement *element) +gst_avimux_loop (GstElement * element) { GstAviMux *avimux; - avimux = GST_AVIMUX(element); + avimux = GST_AVIMUX (element); /* first fill queue (some elements only set caps when * flowing data), then write header */ - gst_avimux_fill_queue(avimux); - + gst_avimux_fill_queue (avimux); + if (avimux->write_header) - gst_avimux_start_file(avimux); + gst_avimux_start_file (avimux); - gst_avimux_do_one_buffer(avimux); + gst_avimux_do_one_buffer (avimux); } static void -gst_avimux_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gst_avimux_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) { GstAviMux *avimux; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AVIMUX(object)); - avimux = GST_AVIMUX(object); + g_return_if_fail (GST_IS_AVIMUX (object)); + avimux = GST_AVIMUX (object); - switch (prop_id) - { + switch (prop_id) { case ARG_BIGFILE: - g_value_set_boolean(value, avimux->enable_large_avi); + g_value_set_boolean (value, avimux->enable_large_avi); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1274,21 +1315,18 @@ gst_avimux_get_property (GObject *object, } static void -gst_avimux_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gst_avimux_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) { GstAviMux *avimux; /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AVIMUX(object)); - avimux = GST_AVIMUX(object); + g_return_if_fail (GST_IS_AVIMUX (object)); + avimux = GST_AVIMUX (object); - switch (prop_id) - { + switch (prop_id) { case ARG_BIGFILE: - avimux->enable_large_avi = g_value_get_boolean(value); + avimux->enable_large_avi = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -1297,14 +1335,14 @@ gst_avimux_set_property (GObject *object, } static GstElementStateReturn -gst_avimux_change_state (GstElement *element) +gst_avimux_change_state (GstElement * element) { GstAviMux *avimux; gint transition = GST_STATE_TRANSITION (element); - g_return_val_if_fail(GST_IS_AVIMUX(element), GST_STATE_FAILURE); - - avimux = GST_AVIMUX(element); + g_return_val_if_fail (GST_IS_AVIMUX (element), GST_STATE_FAILURE); + + avimux = GST_AVIMUX (element); switch (transition) { case GST_STATE_PAUSED_TO_PLAYING: @@ -1317,4 +1355,3 @@ gst_avimux_change_state (GstElement *element) return GST_STATE_SUCCESS; } - diff --git a/gst/avi/gstavimux.h b/gst/avi/gstavimux.h index 452b7221..e51f3010 100644 --- a/gst/avi/gstavimux.h +++ b/gst/avi/gstavimux.h @@ -28,8 +28,9 @@ #ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ +extern "C" +{ +#endif /* __cplusplus */ #define GST_TYPE_AVIMUX \ @@ -44,65 +45,67 @@ extern "C" { (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVIMUX)) -typedef struct _GstAviMux GstAviMux; -typedef struct _GstAviMuxClass GstAviMuxClass; - -struct _GstAviMux { - GstElement element; - - /* pads */ - GstPad *srcpad; - GstPad *audiosinkpad; - gboolean audio_pad_connected, audio_pad_eos; - GstPad *videosinkpad; - gboolean video_pad_connected, video_pad_eos; - - /* the AVI header */ - gst_riff_avih avi_hdr; - guint32 total_frames; /* total number of frames */ - guint64 total_data; /* amount of total data */ - guint32 data_size, datax_size; /* amount of data (bytes) in the AVI/AVIX block */ - guint32 num_frames, numx_frames; /* num frames in the AVI/AVIX block */ - guint32 header_size; - gboolean write_header; - gboolean restart; - guint32 audio_size; - guint64 audio_time; - - /* video header */ - gst_riff_strh vids_hdr; - gst_riff_strf_vids vids; - - /* audio header */ - gst_riff_strh auds_hdr; - gst_riff_strf_auds auds; - - /* information about the AVI index ('idx') */ - gst_riff_index_entry *idx; - gint idx_index, idx_count; - guint32 idx_offset, idx_size; - - /* are we a big file already? */ - gboolean is_bigfile; - guint64 avix_start; - - /* whether to use "large AVI files" or just stick to small indexed files */ - gboolean enable_large_avi; - - /* in order to be usable as a loopbased element, we need an internal - * 'buffered' buffer for each pad, so one for audio, one for video */ - GstBuffer *audio_buffer_queue, *video_buffer_queue; -}; - -struct _GstAviMuxClass { - GstElementClass parent_class; -}; - -GType gst_avimux_get_type(void); + typedef struct _GstAviMux GstAviMux; + typedef struct _GstAviMuxClass GstAviMuxClass; + + struct _GstAviMux + { + GstElement element; + + /* pads */ + GstPad *srcpad; + GstPad *audiosinkpad; + gboolean audio_pad_connected, audio_pad_eos; + GstPad *videosinkpad; + gboolean video_pad_connected, video_pad_eos; + + /* the AVI header */ + gst_riff_avih avi_hdr; + guint32 total_frames; /* total number of frames */ + guint64 total_data; /* amount of total data */ + guint32 data_size, datax_size; /* amount of data (bytes) in the AVI/AVIX block */ + guint32 num_frames, numx_frames; /* num frames in the AVI/AVIX block */ + guint32 header_size; + gboolean write_header; + gboolean restart; + guint32 audio_size; + guint64 audio_time; + + /* video header */ + gst_riff_strh vids_hdr; + gst_riff_strf_vids vids; + + /* audio header */ + gst_riff_strh auds_hdr; + gst_riff_strf_auds auds; + + /* information about the AVI index ('idx') */ + gst_riff_index_entry *idx; + gint idx_index, idx_count; + guint32 idx_offset, idx_size; + + /* are we a big file already? */ + gboolean is_bigfile; + guint64 avix_start; + + /* whether to use "large AVI files" or just stick to small indexed files */ + gboolean enable_large_avi; + + /* in order to be usable as a loopbased element, we need an internal + * 'buffered' buffer for each pad, so one for audio, one for video */ + GstBuffer *audio_buffer_queue, *video_buffer_queue; + }; + + struct _GstAviMuxClass + { + GstElementClass parent_class; + }; + + GType gst_avimux_get_type (void); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ -#endif /* __GST_AVIMUX_H__ */ +#endif /* __GST_AVIMUX_H__ */ |