avi: fix debug
[platform/upstream/gstreamer.git] / gst / avi / gstavidemux.h
1 /* GStreamer
2  * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
3  * Copyright (C) <2006> Nokia Corporation (contact <stefan.kost@nokia.com>)
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 #ifndef __GST_AVI_DEMUX_H__
22 #define __GST_AVI_DEMUX_H__
23
24 #include <gst/gst.h>
25
26 #include "avi-ids.h"
27 #include "gst/riff/riff-ids.h"
28 #include "gst/riff/riff-read.h"
29 #include <gst/base/gstadapter.h>
30
31 G_BEGIN_DECLS
32
33 #define GST_TYPE_AVI_DEMUX \
34   (gst_avi_demux_get_type ())
35 #define GST_AVI_DEMUX(obj) \
36   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AVI_DEMUX, GstAviDemux))
37 #define GST_AVI_DEMUX_CLASS(klass) \
38   (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemuxClass))
39 #define GST_IS_AVI_DEMUX(obj) \
40   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AVI_DEMUX))
41 #define GST_IS_AVI_DEMUX_CLASS(klass) \
42   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX))
43
44 #define GST_AVI_DEMUX_MAX_STREAMS       16
45
46 #define CHUNKID_TO_STREAMNR(chunkid) \
47   ((((chunkid) & 0xff) - '0') * 10 + \
48    (((chunkid) >> 8) & 0xff) - '0')
49
50
51 /* new index entries 24 bytes */
52 typedef struct {
53   guint32        flags;
54   guint32        size;    /* bytes of the data */
55   guint64        offset;  /* data offset in file */
56   guint64        total;   /* total bytes before */
57 } GstAviIndexEntry;
58
59 typedef struct {
60   /* index of this streamcontext */
61   guint          num;
62
63   /* pad*/
64   GstPad        *pad;
65   gboolean       exposed;
66
67   /* stream info and headers */
68   gst_riff_strh *strh;
69   union {
70     gst_riff_strf_vids *vids;
71     gst_riff_strf_auds *auds;
72     gst_riff_strf_iavs *iavs;
73     gpointer     data;
74   } strf;
75   GstBuffer     *extradata, *initdata;
76   GstBuffer     *rgb8_palette;
77   gchar         *name;
78
79   /* the start/step/stop entries */
80   guint          start_entry;
81   guint          step_entry;
82   guint          stop_entry;
83
84   /* current index entry */
85   guint          current_entry;
86   /* position (byte, frame, time) for current_entry */
87   guint          current_total;
88   GstClockTime   current_timestamp;
89   GstClockTime   current_ts_end;
90   guint64        current_offset;
91   guint64        current_offset_end;
92
93   GstFlowReturn  last_flow;
94   gboolean       discont;
95
96   /* stream length */
97   guint64        total_bytes;
98   guint32        total_blocks;
99   guint          n_keyframes;
100   /* stream length according to index */
101   GstClockTime   idx_duration;
102   /* stream length according to header */
103   GstClockTime   hdr_duration;
104   /* stream length based on header/index */
105   GstClockTime   duration;
106
107   /* VBR indicator */
108   gboolean       is_vbr;
109
110   /* openDML support (for files >4GB) */
111   gboolean       superindex;
112   guint64       *indexes;
113
114   /* new indexes */
115   GstAviIndexEntry *index;     /* array with index entries */
116   guint             idx_n;     /* number of entries */
117   guint             idx_max;   /* max allocated size of entries */
118
119   GstTagList    *taglist;
120
121   gint           index_id;
122 } GstAviStream;
123
124 typedef enum {
125   GST_AVI_DEMUX_START,
126   GST_AVI_DEMUX_HEADER,
127   GST_AVI_DEMUX_MOVI,
128   GST_AVI_DEMUX_SEEK,
129 } GstAviDemuxState;
130
131 typedef enum {
132   GST_AVI_DEMUX_HEADER_TAG_LIST,
133   GST_AVI_DEMUX_HEADER_AVIH,
134   GST_AVI_DEMUX_HEADER_ELEMENTS,
135   GST_AVI_DEMUX_HEADER_INFO,
136   GST_AVI_DEMUX_HEADER_JUNK,
137   GST_AVI_DEMUX_HEADER_DATA
138 } GstAviDemuxHeaderState;
139
140 typedef struct _GstAviDemux {
141   GstElement     parent;
142
143   /* pads */
144   GstPad        *sinkpad;
145
146   /* AVI decoding state */
147   GstAviDemuxState state;
148   GstAviDemuxHeaderState header_state;
149   guint64        offset;
150   gboolean       abort_buffering;
151
152   /* when we loaded the indexes */
153   gboolean       have_index;
154   /* index offset in the file */
155   guint64        index_offset;
156
157   /* streams */
158   GstAviStream   stream[GST_AVI_DEMUX_MAX_STREAMS];
159   guint          num_streams;
160   guint          num_v_streams;
161   guint          num_a_streams;
162   guint          num_t_streams;  /* subtitle text streams */
163
164   guint          main_stream; /* used for seeking */
165
166   /* for streaming mode */
167   gboolean       streaming;
168   gboolean       have_eos;
169   GstAdapter    *adapter;
170   guint          todrop;
171
172   /* some stream info for length */
173   gst_riff_avih *avih;
174   GstClockTime   duration;
175
176   /* segment in TIME */
177   GstSegment     segment;
178
179   /* pending tags/events */
180   GstEvent      *seg_event;
181   GstTagList    *globaltags;
182   gboolean       got_tags;
183
184 #if 0
185   /* gst index support */
186   GstIndex      *element_index;
187   gint           index_id;
188 #endif
189
190   gboolean       seekable;
191
192   guint64        first_movi_offset;
193   guint64        idx1_offset; /* offset in file of list/chunk after movi */
194   GstEvent      *seek_event;
195
196   gboolean       building_index;
197   guint          odml_stream;
198   guint          odml_subidx;
199   guint64       *odml_subidxs;
200
201   guint64        seek_kf_offset; /* offset of the keyframe to which we want to seek */
202 } GstAviDemux;
203
204 typedef struct _GstAviDemuxClass {
205   GstElementClass parent_class;
206 } GstAviDemuxClass;
207
208 GType           gst_avi_demux_get_type          (void);
209
210 G_END_DECLS
211
212 #endif /* __GST_AVI_DEMUX_H__ */