summaryrefslogtreecommitdiffstats
path: root/gst/avi/gstavidemux.h
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-12-07 20:00:41 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-12-07 20:00:41 +0000
commit12e856c26d690c02cc05a2e945b49e2df538307a (patch)
treecbb1cf43fa0dcbb477775b3ade47e4b16e057b5e /gst/avi/gstavidemux.h
parent396a5c812901cfb1e16a8b4f55f122e229293b98 (diff)
Riff, EBML, fourcc etc. work. Not fully finished, but better than what we used to have and definately worth a first b...
Original commit message from CVS: Riff, EBML, fourcc etc. work. Not fully finished, but better than what we used to have and definately worth a first broad testing. I've revived rifflib. Rifflib used to be a bytestream-for-riff, which just dup'ed bytestream. I've rewritten rifflib to be a modern riff- chunk parser that uses bytestream fully, plus adds some extra functions so that riff file parsing becomes extremely easy. It also contains some small usability functions for strh/strf and metadata parsing. Note that it doesn't use the new tagging yet, that's a TODO. Avidemux has been rewritten to use this. I think we all agreed that avidemux was pretty much a big mess, which is because it used all sort of bytestream magic all around the place. It was just ugly. This is a lot nicer, very complete and safe. I think this is far more robust than what the old avidemux could ever have been. Of course, it might contain bugs, please let me know. EBML writing has also been implemented. This is useful for matroska. I'm intending to modify avidemux (with a riffwriter) similarly. Maybe I'll change wavparse/-enc too to use rifflib. Lastly, several plugins have been modified to use rifflib's fourcc parsing instead of their own. this puts fourcc parsing in one central place, which should make it a lot simpler to add new fourccs. We might want to move this to its own lib instead of rifflib. Enjoy!
Diffstat (limited to 'gst/avi/gstavidemux.h')
-rw-r--r--gst/avi/gstavidemux.h122
1 files changed, 59 insertions, 63 deletions
diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h
index a9334283..15eec1f3 100644
--- a/gst/avi/gstavidemux.h
+++ b/gst/avi/gstavidemux.h
@@ -17,30 +17,26 @@
* Boston, MA 02111-1307, USA.
*/
-
#ifndef __GST_AVI_DEMUX_H__
#define __GST_AVI_DEMUX_H__
-
#include <gst/gst.h>
-#include <gst/bytestream/bytestream.h>
-#include <gst/riff/riff.h>
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+#include "gst/riff/riff-ids.h"
+#include "gst/riff/riff-read.h"
+
+G_BEGIN_DECLS
#define GST_TYPE_AVI_DEMUX \
- (gst_avi_demux_get_type())
+ (gst_avi_demux_get_type ())
#define GST_AVI_DEMUX(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AVI_DEMUX,GstAviDemux))
+ (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,GstAviDemux))
+ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AVI_DEMUX, GstAviDemux))
#define GST_IS_AVI_DEMUX(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AVI_DEMUX))
+ (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))
-
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AVI_DEMUX))
#define GST_AVI_DEMUX_MAX_STREAMS 16
@@ -48,85 +44,85 @@ extern "C" {
((((chunkid) & 0xff) - '0') * 10 + \
(((chunkid) >> 8) & 0xff) - '0')
-typedef struct _GstAviDemux GstAviDemux;
-typedef struct _GstAviDemuxClass GstAviDemuxClass;
-
-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
-{
- GstPad *pad;
- gint num;
- gst_riff_strh strh;
- guint32 current_frame;
- guint32 current_byte;
- guint64 delay;
- gboolean need_flush;
- guint64 end_pos;
+typedef struct {
+ /* index of this streamcontext */
+ guint num;
+
+ /* pad, strh */
+ GstPad *pad;
+ gst_riff_strh *strh;
- guint64 total_bytes;
- guint32 total_frames;
+ /* current position (byte, frame, time) */
+ guint current_frame;
+ guint64 current_byte;
+ gint current_entry;
- guint32 skip;
+ /* delay in time (init_frames) */
+ guint64 delay;
+ /* stream length */
+ guint64 total_bytes;
+ guint32 total_frames;
+
+ guint32 skip;
} avi_stream_context;
-typedef enum
-{
+typedef enum {
GST_AVI_DEMUX_START,
GST_AVI_DEMUX_HEADER,
GST_AVI_DEMUX_MOVI,
} GstAviDemuxState;
-struct _GstAviDemux {
- GstElement element;
+typedef struct _GstAviDemux {
+ GstRiffRead parent;
/* pads */
- GstPad *sinkpad, *srcpad;
+ GstPad *sinkpad;
/* AVI decoding state */
- guint32 fcc_type;
GstAviDemuxState state;
+ guint level_up;
- GstByteStream *bs;
-
+ /* index */
gst_avi_index_entry *index_entries;
- gulong index_size;
- gulong index_offset;
-
- gst_riff_avih avih;
+ guint index_size;
+ guint64 index_offset;
+ /* streams */
guint num_streams;
guint num_v_streams;
guint num_a_streams;
avi_stream_context stream[GST_AVI_DEMUX_MAX_STREAMS];
- gboolean seek_pending;
- gint64 seek_offset;
- guint64 last_seek;
+ /* some stream info for length */
+ guint32 us_per_frame;
+ guint32 num_frames;
- GstCaps *metadata, *streaminfo;
-};
+ /* seeking */
+ guint64 seek_offset;
+ guint64 last_seek;
-struct _GstAviDemuxClass {
- GstElementClass parent_class;
-};
+ /* info */
+ GstCaps *streaminfo;
+} GstAviDemux;
-GType gst_avi_demux_get_type (void);
+typedef struct _GstAviDemuxClass {
+ GstRiffReadClass parent_class;
+} GstAviDemuxClass;
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+GType gst_avi_demux_get_type (void);
+G_END_DECLS
#endif /* __GST_AVI_DEMUX_H__ */