avidemux: use GstIndex for (limited) seeking in push mode
[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 #define GST_AVI_KEYFRAME 1
60 #define ENTRY_IS_KEYFRAME(e) ((e)->flags == GST_AVI_KEYFRAME)
61 #define ENTRY_SET_KEYFRAME(e) ((e)->flags = GST_AVI_KEYFRAME)
62 #define ENTRY_UNSET_KEYFRAME(e) ((e)->flags = 0)
63
64 typedef struct {
65   /* index of this streamcontext */
66   guint          num;
67
68   /* pad*/
69   GstPad        *pad;
70
71   /* stream info and headers */
72   gst_riff_strh *strh;
73   union {
74     gst_riff_strf_vids *vids;
75     gst_riff_strf_auds *auds;
76     gst_riff_strf_iavs *iavs;
77     gpointer     data;
78   } strf;
79   GstBuffer     *extradata, *initdata;
80   gchar         *name;
81
82   /* the start/step/stop entries */
83   guint          start_entry;
84   guint          step_entry;
85   guint          stop_entry;
86
87   /* current index entry */
88   guint          current_entry;
89   /* position (byte, frame, time) for current_entry */
90   guint          current_total;
91   GstClockTime   current_timestamp;
92   GstClockTime   current_ts_end;
93   guint64        current_offset;
94   guint64        current_offset_end;
95
96   GstFlowReturn  last_flow;
97   gboolean       discont;
98
99   /* stream length */
100   guint64        total_bytes;
101   guint32        total_blocks;
102   guint          n_keyframes;
103   /* stream length according to index */
104   GstClockTime   idx_duration;
105   /* stream length according to header */
106   GstClockTime   hdr_duration;
107   /* stream length based on header/index */
108   GstClockTime   duration;
109
110   /* VBR indicator */
111   gboolean       is_vbr;
112
113   /* openDML support (for files >4GB) */
114   gboolean       superindex;
115   guint64       *indexes;
116
117   /* new indexes */
118   GstAviIndexEntry *index;     /* array with index entries */
119   guint             idx_n;     /* number of entries */
120   guint             idx_max;   /* max allocated size of entries */
121
122   GstTagList    *taglist;
123
124   gint           index_id;
125 } GstAviStream;
126
127 typedef enum {
128   GST_AVI_DEMUX_START,
129   GST_AVI_DEMUX_HEADER,
130   GST_AVI_DEMUX_MOVI,
131 } GstAviDemuxState;
132
133 typedef enum {
134   GST_AVI_DEMUX_HEADER_TAG_LIST,
135   GST_AVI_DEMUX_HEADER_AVIH,
136   GST_AVI_DEMUX_HEADER_ELEMENTS,
137   GST_AVI_DEMUX_HEADER_INFO,
138   GST_AVI_DEMUX_HEADER_JUNK,
139   GST_AVI_DEMUX_HEADER_DATA
140 } GstAviDemuxHeaderState;
141
142 typedef struct _GstAviDemux {
143   GstElement     parent;
144
145   /* pads */
146   GstPad        *sinkpad;
147
148   /* AVI decoding state */
149   GstAviDemuxState state;
150   GstAviDemuxHeaderState header_state;
151   guint64        offset;
152   gboolean       abort_buffering;
153
154   /* when we loaded the indexes */
155   gboolean       have_index;
156   /* index offset in the file */
157   guint64        index_offset;
158
159   /* streams */
160   GstAviStream   stream[GST_AVI_DEMUX_MAX_STREAMS];
161   guint          num_streams;
162   guint          num_v_streams;
163   guint          num_a_streams;
164   guint          num_t_streams;  /* subtitle text streams */
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
175   /* segment in TIME */
176   GstSegment     segment;
177   gboolean       segment_running;
178
179   /* pending tags/events */
180   GstEvent      *seek_event;
181   GstTagList    *globaltags;
182   gboolean       got_tags;
183
184   /* gst index support */
185   GstIndex      *element_index;
186   gint           index_id;
187   gboolean       seekable;
188 } GstAviDemux;
189
190 typedef struct _GstAviDemuxClass {
191   GstElementClass parent_class;
192 } GstAviDemuxClass;
193
194 GType           gst_avi_demux_get_type          (void);
195
196 G_END_DECLS
197
198 #endif /* __GST_AVI_DEMUX_H__ */