diff -r 4b0c6ed43234 -r 8e837d1bf446 gst_plugins_good/gst/avi/gstavidemux.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gst_plugins_good/gst/avi/gstavidemux.h Wed Mar 24 18:04:17 2010 -0500 @@ -0,0 +1,179 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen + * Copyright (C) <2006> Nokia Corporation (contact ) + * + * 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_DEMUX_H__ +#define __GST_AVI_DEMUX_H__ + +#include + +#include "avi-ids.h" +#include "gst/riff/riff-ids.h" +#include "gst/riff/riff-read.h" +#include + +G_BEGIN_DECLS + +#define GST_TYPE_AVI_DEMUX \ + (gst_avi_demux_get_type ()) +#define GST_AVI_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux)) +#define GST_AVI_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass)) +#define GST_IS_AVI_DEMUX(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX)) +#define GST_IS_AVI_DEMUX_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX)) + +#define GST_AVI_DEMUX_MAX_STREAMS 16 + +#define CHUNKID_TO_STREAMNR(chunkid) \ + ((((chunkid) & 0xff) - '0') * 10 + \ + (((chunkid) >> 8) & 0xff) - '0') + +#define GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME 1 + +/* 48 bytes */ +typedef struct { + guint index_nr; /* = (entry-index_entries)/sizeof(gst_avi_index_entry); */ + guchar stream_nr; + guchar flags; + guint64 ts; + guint64 dur; /* =entry[1].ts-entry->ts */ + guint64 offset; + guint64 bytes_before; /* calculated */ + guint32 frames_before; /* calculated */ + guint32 size; /* could be read from the chunk (if we don't split) */ +} gst_avi_index_entry; + +typedef struct { + /* index of this streamcontext */ + guint num; + + /* pad*/ + GstPad *pad; + + /* stream info and headers */ + gst_riff_strh *strh; + union { + gst_riff_strf_vids *vids; + gst_riff_strf_auds *auds; + gst_riff_strf_iavs *iavs; + gpointer data; + } strf; + GstBuffer *extradata, *initdata; + gchar *name; + + /* current position (byte, frame, time) and other status vars */ + guint current_frame; + guint64 current_byte; + GstFlowReturn last_flow; + gboolean discont; + + /* stream length */ + guint64 total_bytes; + guint32 total_frames; + guint32 total_blocks; + /* stream length according to index */ + GstClockTime idx_duration; + /* stream length according to header */ + GstClockTime hdr_duration; + /* stream length based on header/index */ + GstClockTime duration; + + /* VBR indicator */ + gboolean is_vbr; + + /* openDML support (for files >4GB) */ + gboolean superindex; + guint64 *indexes; + + GstTagList *taglist; +} avi_stream_context; + +typedef enum { + GST_AVI_DEMUX_START, + GST_AVI_DEMUX_HEADER, + GST_AVI_DEMUX_MOVI, +} GstAviDemuxState; + +typedef enum { + GST_AVI_DEMUX_HEADER_TAG_LIST, + GST_AVI_DEMUX_HEADER_AVIH, + GST_AVI_DEMUX_HEADER_ELEMENTS, + GST_AVI_DEMUX_HEADER_INFO, + GST_AVI_DEMUX_HEADER_JUNK, + GST_AVI_DEMUX_HEADER_DATA +} GstAviDemuxHeaderState; + +typedef struct _GstAviDemux { + GstElement parent; + + /* pads */ + GstPad *sinkpad; + + /* AVI decoding state */ + GstAviDemuxState state; + GstAviDemuxHeaderState header_state; + guint64 offset; + + /* index */ + gst_avi_index_entry *index_entries; + guint index_size; + guint64 index_offset; + guint current_entry; + guint reverse_start_index; + guint reverse_stop_index; + + /* streams */ + guint num_streams; + guint num_v_streams; + guint num_a_streams; + guint num_t_streams; /* subtitle text streams */ + + avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS]; + + /* for streaming mode */ + gboolean streaming; + gboolean have_eos; + GstAdapter *adapter; + + /* some stream info for length */ + gst_riff_avih *avih; + + /* segment in TIME */ + GstSegment segment; + gboolean segment_running; + + /* pending tags/events */ + GstEvent *seek_event; + GstTagList *globaltags; + gboolean got_tags; + +} GstAviDemux; + +typedef struct _GstAviDemuxClass { + GstElementClass parent_class; +} GstAviDemuxClass; + +GType gst_avi_demux_get_type (void); + +G_END_DECLS + +#endif /* __GST_AVI_DEMUX_H__ */