/* AVI muxer plugin for GStreamer * Copyright (C) 2002 Ronald Bultje <rbultje@ronald.bitfreak.net> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_AVI_MUX_H__ #define __GST_AVI_MUX_H__ #include <gst/gst.h> #include <gst/base/gstcollectpads.h> #include <gst/riff/riff-ids.h> #include "avi-ids.h" G_BEGIN_DECLS #define GST_TYPE_AVI_MUX \ (gst_avi_mux_get_type()) #define GST_AVI_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_MUX,GstAviMux)) #define GST_AVI_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AVI_MUX,GstAviMuxClass)) #define GST_IS_AVI_MUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_MUX)) #define GST_IS_AVI_MUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AVI_MUX)) #define GST_AVI_INDEX_OF_INDEXES 0 #define GST_AVI_INDEX_OF_CHUNKS 1 /* this allows indexing up to 64GB avi file */ #define GST_AVI_SUPERINDEX_COUNT 32 /* max size */ #define GST_AVI_MAX_SIZE 0x40000000 typedef struct _gst_avi_superindex_entry { guint64 offset; guint32 size; guint32 duration; } gst_avi_superindex_entry; typedef struct _gst_riff_strh_full { gst_riff_strh parent; /* rcFrame, RECT structure (struct of 4 shorts) */ gint16 left; gint16 top; gint16 right; gint16 bottom; } gst_riff_strh_full; typedef struct _GstAviPad GstAviPad; typedef struct _GstAviMux GstAviMux; typedef struct _GstAviMuxClass GstAviMuxClass; typedef GstFlowReturn (*GstAviPadHook) (GstAviMux * avi, GstAviPad * avipad, GstBuffer * buffer); struct _GstAviPad { /* do not extend, link to it */ /* is NULL if original sink request pad has been removed */ GstCollectData *collect; /* type */ gboolean is_video; gboolean connected; /* chunk tag */ gchar *tag; /* stream header */ gst_riff_strh hdr; /* odml super indexes */ gst_avi_superindex_entry idx[GST_AVI_SUPERINDEX_COUNT]; gint idx_index; gchar *idx_tag; /* stream specific hook */ GstAviPadHook hook; }; typedef struct _GstAviVideoPad { GstAviPad parent; /* stream format */ gst_riff_strf_vids vids; /* extra data */ GstBuffer *vids_codec_data; /* ODML video properties */ gst_riff_vprp vprp; } GstAviVideoPad; typedef struct _GstAviAudioPad { GstAviPad parent; /* stream format */ gst_riff_strf_auds auds; /* audio info for bps calculation */ guint32 audio_size; guint64 audio_time; /* extra data */ GstBuffer *auds_codec_data; } GstAviAudioPad; typedef struct _GstAviCollectData { /* extend the CollectData */ GstCollectData collect; GstAviPad *avipad; } GstAviCollectData; struct _GstAviMux { GstElement element; /* pads */ GstPad *srcpad; /* sinkpads, video first */ GSList *sinkpads; /* video restricted to 1 pad */ guint video_pads, audio_pads; GstCollectPads *collect; GstPadEventFunction collect_event; /* the AVI header */ /* still some single stream video data in mux struct */ gst_riff_avih avi_hdr; /* total number of (video) frames */ guint32 total_frames; /* amount of total data (bytes) */ guint64 total_data; /* amount of data (bytes) in the AVI/AVIX block; * actually the movi list, so counted from and including the movi tag */ guint32 data_size, datax_size; /* num (video) frames in the AVI/AVIX block */ guint32 num_frames, numx_frames; /* size of hdrl list, including tag as usual */ /* total size of extra codec data */ guint32 codec_data_size; /* state info */ gboolean write_header; gboolean restart; /* tags */ GstTagList *tags_snap; /* information about the AVI index ('idx') */ gst_riff_index_entry *idx; gint idx_index, idx_count; /* offset of *chunk* (relative to a base offset); entered in the index */ guint32 idx_offset; /* size of idx1 chunk (including! chunk header and size bytes) */ guint32 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; }; struct _GstAviMuxClass { GstElementClass parent_class; }; GType gst_avi_mux_get_type(void); G_END_DECLS #endif /* __GST_AVI_MUX_H__ */