4459947a4cdb710e0c971b588941e6e514fadaab
[platform/upstream/gst-plugins-good.git] / gst / quicktime / gstqtmux.h
1 /* Quicktime muxer plugin for GStreamer
2  * Copyright (C) 2008 Thiago Sousa Santos <thiagoss@embedded.ufcg.edu.br>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 #ifndef __GST_QT_MUX_H__
21 #define __GST_QT_MUX_H__
22
23 #include <gst/gst.h>
24 #include <gst/base/gstcollectpads.h>
25
26 #include "fourcc.h"
27 #include "atoms.h"
28 #include "gstqtmuxmap.h"
29
30 G_BEGIN_DECLS
31
32 #define GST_TYPE_QT_MUX (gst_qt_mux_get_type())
33 #define GST_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MUX, GstQTMux))
34 #define GST_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MUX, GstQTMux))
35 #define GST_IS_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MUX))
36 #define GST_IS_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MUX))
37 #define GST_QT_MUX_CAST(obj) ((GstQTMux*)(obj))
38
39
40 typedef struct _GstQTMux GstQTMux;
41 typedef struct _GstQTMuxClass GstQTMuxClass;
42
43 typedef struct _GstQTPad
44 {
45   GstCollectData collect;       /* we extend the CollectData */
46
47   /* fourcc id of stream */
48   guint32 fourcc;
49   /* whether using format that have out of order buffers */
50   gboolean is_out_of_order;
51   /* if not 0, track with constant sized samples, e.g. raw audio */
52   guint sample_size;
53   /* make sync table entry */
54   gboolean sync;
55
56   GstBuffer *last_buf;
57   /* dts of last_buf */
58   GstClockTime last_dts;
59
60   /* all the atom and chunk book-keeping is delegated here
61    * unowned/uncounted reference, parent MOOV owns */
62   AtomTRAK *trak;
63 } GstQTPad;
64
65 typedef enum _GstQTMuxState
66 {
67   GST_QT_MUX_STATE_NONE,
68   GST_QT_MUX_STATE_STARTED,
69   GST_QT_MUX_STATE_DATA,
70   GST_QT_MUX_STATE_EOS
71 } GstQTMuxState;
72
73 struct _GstQTMux
74 {
75   GstElement element;
76
77   GstPad *srcpad;
78   GstCollectPads *collect;
79
80   /* state */
81   GstQTMuxState state;
82
83   /* size of header (prefix, atoms (ftyp, mdat)) */
84   guint64 header_size;
85   /* accumulated size of raw media data (a priori not including mdat header) */
86   guint64 mdat_size;
87   /* position of mdat extended size field (for later updating) */
88   guint64 mdat_pos;
89
90   /* atom helper objects */
91   AtomsContext *context;
92   AtomFTYP *ftyp;
93   AtomMOOV *moov;
94
95   /* fast start */
96   FILE *fast_start_file;
97
98   GstTagList *tags;
99
100   /* properties */
101   guint32 timescale;
102   AtomsTreeFlavor flavor;
103   gboolean fast_start;
104   gboolean large_file;
105   gboolean do_ctts;
106   gchar *fast_start_file_path;
107
108   /* for collect pads event handling function */
109   GstPadEventFunction collect_event;
110 };
111
112 struct _GstQTMuxClass
113 {
114   GstElementClass parent_class;
115
116   GstQTMuxFormat format;
117 };
118
119 /* type register helper struct */
120 typedef struct _GstQTMuxClassParams
121 {
122   GstQTMuxFormatProp *prop;
123   GstCaps *src_caps;
124   GstCaps *video_sink_caps;
125   GstCaps *audio_sink_caps;
126 } GstQTMuxClassParams;
127
128 #define GST_QT_MUX_PARAMS_QDATA g_quark_from_static_string("qt-mux-params")
129
130 GType gst_qt_mux_get_type (void);
131
132 G_END_DECLS
133
134 #endif /* __GST_QT_MUX_H__ */