gst/quicktime/gstqtmux.*: Use dts from GST_BUFFER_OFFSET_END() for video/x-qt-part.
[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   /* whether upstream provides valid PTS data */
52   gboolean have_dts;
53   /* if not 0, track with constant sized samples, e.g. raw audio */
54   guint sample_size;
55   /* make sync table entry */
56   gboolean sync;
57
58   GstBuffer *last_buf;
59   /* dts of last_buf */
60   GstClockTime last_dts;
61
62   /* all the atom and chunk book-keeping is delegated here
63    * unowned/uncounted reference, parent MOOV owns */
64   AtomTRAK *trak;
65 } GstQTPad;
66
67 typedef enum _GstQTMuxState
68 {
69   GST_QT_MUX_STATE_NONE,
70   GST_QT_MUX_STATE_STARTED,
71   GST_QT_MUX_STATE_DATA,
72   GST_QT_MUX_STATE_EOS
73 } GstQTMuxState;
74
75 struct _GstQTMux
76 {
77   GstElement element;
78
79   GstPad *srcpad;
80   GstCollectPads *collect;
81
82   /* state */
83   GstQTMuxState state;
84
85   /* size of header (prefix, atoms (ftyp, mdat)) */
86   guint64 header_size;
87   /* accumulated size of raw media data (a priori not including mdat header) */
88   guint64 mdat_size;
89   /* position of mdat extended size field (for later updating) */
90   guint64 mdat_pos;
91
92   /* atom helper objects */
93   AtomsContext *context;
94   AtomFTYP *ftyp;
95   AtomMOOV *moov;
96
97   /* fast start */
98   FILE *fast_start_file;
99
100   GstTagList *tags;
101
102   /* properties */
103   guint32 timescale;
104   AtomsTreeFlavor flavor;
105   gboolean fast_start;
106   gboolean large_file;
107   gboolean guess_pts;
108   gchar *fast_start_file_path;
109
110   /* for collect pads event handling function */
111   GstPadEventFunction collect_event;
112 };
113
114 struct _GstQTMuxClass
115 {
116   GstElementClass parent_class;
117
118   GstQTMuxFormat format;
119 };
120
121 /* type register helper struct */
122 typedef struct _GstQTMuxClassParams
123 {
124   GstQTMuxFormatProp *prop;
125   GstCaps *src_caps;
126   GstCaps *video_sink_caps;
127   GstCaps *audio_sink_caps;
128 } GstQTMuxClassParams;
129
130 #define GST_QT_MUX_PARAMS_QDATA g_quark_from_static_string("qt-mux-params")
131
132 GType gst_qt_mux_get_type (void);
133
134 G_END_DECLS
135
136 #endif /* __GST_QT_MUX_H__ */