a4701cc1aa3ebb8699f11e68ee531c897f73987d
[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  * Unless otherwise indicated, Source Code is licensed under MIT license.
21  * See further explanation attached in License Statement (distributed in the file
22  * LICENSE).
23  *
24  * Permission is hereby granted, free of charge, to any person obtaining a copy of
25  * this software and associated documentation files (the "Software"), to deal in
26  * the Software without restriction, including without limitation the rights to
27  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
28  * of the Software, and to permit persons to whom the Software is furnished to do
29  * so, subject to the following conditions:
30  *
31  * The above copyright notice and this permission notice shall be included in all
32  * copies or substantial portions of the Software.
33  *
34  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
37  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
39  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
40  * SOFTWARE.
41  */
42
43 #ifndef __GST_QT_MUX_H__
44 #define __GST_QT_MUX_H__
45
46 #include <gst/gst.h>
47 #include <gst/base/gstcollectpads.h>
48
49 #include "fourcc.h"
50 #include "atoms.h"
51 #include "gstqtmuxmap.h"
52
53 G_BEGIN_DECLS
54
55 #define GST_TYPE_QT_MUX (gst_qt_mux_get_type())
56 #define GST_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_QT_MUX, GstQTMux))
57 #define GST_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_QT_MUX, GstQTMux))
58 #define GST_IS_QT_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_QT_MUX))
59 #define GST_IS_QT_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QT_MUX))
60 #define GST_QT_MUX_CAST(obj) ((GstQTMux*)(obj))
61
62
63 typedef struct _GstQTMux GstQTMux;
64 typedef struct _GstQTMuxClass GstQTMuxClass;
65
66 typedef struct _GstQTPad
67 {
68   GstCollectData collect;       /* we extend the CollectData */
69
70   /* fourcc id of stream */
71   guint32 fourcc;
72   /* whether using format that have out of order buffers */
73   gboolean is_out_of_order;
74   /* whether upstream provides valid PTS data */
75   gboolean have_dts;
76   /* if not 0, track with constant sized samples, e.g. raw audio */
77   guint sample_size;
78   /* make sync table entry */
79   gboolean sync;
80
81   GstBuffer *last_buf;
82   /* dts of last_buf */
83   GstClockTime last_dts;
84
85   /* all the atom and chunk book-keeping is delegated here
86    * unowned/uncounted reference, parent MOOV owns */
87   AtomTRAK *trak;
88 } GstQTPad;
89
90 typedef enum _GstQTMuxState
91 {
92   GST_QT_MUX_STATE_NONE,
93   GST_QT_MUX_STATE_STARTED,
94   GST_QT_MUX_STATE_DATA,
95   GST_QT_MUX_STATE_EOS
96 } GstQTMuxState;
97
98 struct _GstQTMux
99 {
100   GstElement element;
101
102   GstPad *srcpad;
103   GstCollectPads *collect;
104
105   /* state */
106   GstQTMuxState state;
107
108   /* size of header (prefix, atoms (ftyp, mdat)) */
109   guint64 header_size;
110   /* accumulated size of raw media data (a priori not including mdat header) */
111   guint64 mdat_size;
112   /* position of mdat extended size field (for later updating) */
113   guint64 mdat_pos;
114
115   /* atom helper objects */
116   AtomsContext *context;
117   AtomFTYP *ftyp;
118   AtomMOOV *moov;
119
120   /* fast start */
121   FILE *fast_start_file;
122
123   /* properties */
124   guint32 timescale;
125   AtomsTreeFlavor flavor;
126   gboolean fast_start;
127   gboolean large_file;
128   gboolean guess_pts;
129   gchar *fast_start_file_path;
130
131   /* for collect pads event handling function */
132   GstPadEventFunction collect_event;
133 };
134
135 struct _GstQTMuxClass
136 {
137   GstElementClass parent_class;
138
139   GstQTMuxFormat format;
140 };
141
142 /* type register helper struct */
143 typedef struct _GstQTMuxClassParams
144 {
145   GstQTMuxFormatProp *prop;
146   GstCaps *src_caps;
147   GstCaps *video_sink_caps;
148   GstCaps *audio_sink_caps;
149 } GstQTMuxClassParams;
150
151 #define GST_QT_MUX_PARAMS_QDATA g_quark_from_static_string("qt-mux-params")
152
153 GType gst_qt_mux_get_type (void);
154
155 G_END_DECLS
156
157 #endif /* __GST_QT_MUX_H__ */