1 /* OGG muxer plugin for GStreamer 2 * Copyright (C) 2004 Wim Taymans <wim@fluendo.com> 3 * Copyright (C) 2006 Thomas Vander Stichele <thomas at apestaart dot org> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public 16 * License along with this library; if not, write to the 17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #ifndef __GST_OGG_MUX_H__ 22 #define __GST_OGG_MUX_H__ 23 24 #include <ogg/ogg.h> 25 26 #include <gst/gst.h> 27 #include <gst/base/gstcollectpads.h> 28 #include "gstoggstream.h" 29 30 G_BEGIN_DECLS 31 32 #define GST_TYPE_OGG_MUX (gst_ogg_mux_get_type()) 33 #define GST_OGG_MUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_OGG_MUX, GstOggMux)) 34 #define GST_OGG_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_OGG_MUX, GstOggMux)) 35 #define GST_IS_OGG_MUX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_OGG_MUX)) 36 #define GST_IS_OGG_MUX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OGG_MUX)) 37 38 typedef struct _GstOggMux GstOggMux; 39 typedef struct _GstOggMuxClass GstOggMuxClass; 40 41 typedef enum 42 { 43 GST_OGG_PAD_STATE_CONTROL = 0, 44 GST_OGG_PAD_STATE_DATA = 1 45 } 46 GstOggPadState; 47 48 /* all information needed for one ogg stream */ 49 typedef struct 50 { 51 GstCollectData collect; /* we extend the CollectData */ 52 53 GstOggStream map; 54 gboolean have_type; 55 56 GstSegment segment; 57 58 GstBuffer *buffer; /* the first waiting buffer for the pad */ 59 60 gint64 packetno; /* number of next packet */ 61 gint64 pageno; /* number of next page */ 62 guint64 duration; /* duration of current page */ 63 gboolean eos; 64 gint64 offset; 65 GstClockTime timestamp; /* timestamp of the first packet on the next 66 * page to be dequeued */ 67 GstClockTime timestamp_end; /* end timestamp of last complete packet on 68 the next page to be dequeued */ 69 GstClockTime gp_time; /* time corresponding to the gp value of the 70 last complete packet on the next page to be 71 dequeued */ 72 73 GstOggPadState state; /* state of the pad */ 74 75 GQueue *pagebuffers; /* List of pages in buffers ready for pushing */ 76 77 gboolean new_page; /* starting a new page */ 78 gboolean first_delta; /* was the first packet in the page a delta */ 79 gboolean prev_delta; /* was the previous buffer a delta frame */ 80 gboolean data_pushed; /* whether we pushed data already */ 81 82 gint64 next_granule; /* expected granule of next buffer ts */ 83 gint64 keyframe_granule; /* granule of last preceding keyframe */ 84 85 GstTagList *tags; 86 } 87 GstOggPadData; 88 89 /** 90 * GstOggMux: 91 * 92 * The ogg muxer object structure. 93 */ 94 struct _GstOggMux 95 { 96 GstElement element; 97 98 /* source pad */ 99 GstPad *srcpad; 100 101 /* sinkpads */ 102 GstCollectPads *collect; 103 104 /* number of pads which have not received EOS */ 105 gint active_pads; 106 107 /* the pad we are currently using to fill a page */ 108 GstOggPadData *pulling; 109 110 /* next timestamp for the page */ 111 GstClockTime next_ts; 112 113 /* Last timestamp actually output on src pad */ 114 GstClockTime last_ts; 115 116 /* offset in stream */ 117 guint64 offset; 118 119 /* need_headers */ 120 gboolean need_headers; 121 gboolean need_start_events; 122 123 guint64 max_delay; 124 guint64 max_page_delay; 125 guint64 max_tolerance; 126 127 GstOggPadData *delta_pad; /* when a delta frame is detected on a stream, we mark 128 pages as delta frames up to the page that has the 129 keyframe */ 130 131 132 /* whether to create a skeleton track */ 133 gboolean use_skeleton; 134 }; 135 136 struct _GstOggMuxClass 137 { 138 GstElementClass parent_class; 139 }; 140 141 GType gst_ogg_mux_get_type (void); 142 143 gboolean gst_ogg_mux_plugin_init (GstPlugin * plugin); 144 145 G_END_DECLS 146 147 #endif /* __GST_OGG_MUX_H__ */ 148