summaryrefslogtreecommitdiffstats
path: root/gst/avi/gstavimux.h
blob: 3b392856303511b201ff6fff8bb3175beb9510c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
/* 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

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 {
  /* 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;
} GstAviPad;

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;

typedef struct _GstAviMux GstAviMux;
typedef struct _GstAviMuxClass GstAviMuxClass;

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__ */