1 /* GStreamer Split Muxed File Source 2 * Copyright (C) 2014 Jan Schmidt <jan@centricular.com> 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., 51 Franklin St, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 #ifndef __GST_SPLITMUX_SRC_H__ 20 #define __GST_SPLITMUX_SRC_H__ 21 22 #include <gst/gst.h> 23 24 #include "gstsplitmuxpartreader.h" 25 26 G_BEGIN_DECLS 27 28 #define GST_TYPE_SPLITMUX_SRC \ 29 (gst_splitmux_src_get_type()) 30 #define GST_SPLITMUX_SRC(obj) \ 31 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SPLITMUX_SRC,GstSplitMuxSrc)) 32 #define GST_SPLITMUX_SRC_CLASS(klass) \ 33 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SPLITMUX_SRC,GstSplitMuxSrcClass)) 34 #define GST_IS_SPLITMUX_SRC(obj) \ 35 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPLITMUX_SRC)) 36 #define GST_IS_SPLITMUX_SRC_CLASS(klass) \ 37 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPLITMUX_SRC)) 38 39 typedef struct _GstSplitMuxSrc GstSplitMuxSrc; 40 typedef struct _GstSplitMuxSrcClass GstSplitMuxSrcClass; 41 42 struct _GstSplitMuxSrc 43 { 44 GstBin parent; 45 46 GMutex lock; 47 gboolean running; 48 49 gchar *location; /* OBJECT_LOCK */ 50 51 GstSplitMuxPartReader **parts; 52 guint num_parts; 53 guint num_prepared_parts; 54 guint num_created_parts; 55 guint cur_part; 56 57 gboolean async_pending; 58 gboolean pads_complete; 59 60 GMutex pads_lock; 61 GList *pads; /* pads_lock */ 62 guint n_pads; 63 guint n_notlinked; 64 65 GstClockTime total_duration; 66 GstClockTime end_offset; 67 GstSegment play_segment; 68 guint32 segment_seqnum; 69 }; 70 71 struct _GstSplitMuxSrcClass 72 { 73 GstBinClass parent_class; 74 }; 75 76 GType splitmux_src_pad_get_type (void); 77 #define SPLITMUX_TYPE_SRC_PAD splitmux_src_pad_get_type() 78 #define SPLITMUX_SRC_PAD_CAST(p) ((SplitMuxSrcPad *)(p)) 79 #define SPLITMUX_SRC_PAD(obj) \ 80 (G_TYPE_CHECK_INSTANCE_CAST((obj),SPLITMUX_TYPE_SRC_PAD,SplitMuxSrcPad)) 81 82 struct _SplitMuxSrcPad 83 { 84 GstPad parent; 85 86 guint cur_part; 87 GstSplitMuxPartReader *reader; 88 GstPad *part_pad; 89 90 GstSegment segment; 91 92 gboolean set_next_discont; 93 gboolean clear_next_discont; 94 95 gboolean sent_stream_start; 96 gboolean sent_caps; 97 gboolean sent_segment; 98 }; 99 100 struct _SplitMuxSrcPadClass 101 { 102 GstPadClass parent; 103 }; 104 105 GType gst_splitmux_src_get_type (void); 106 gboolean register_splitmuxsrc (GstPlugin * plugin); 107 108 #define SPLITMUX_SRC_LOCK(s) g_mutex_lock(&(s)->lock) 109 #define SPLITMUX_SRC_UNLOCK(s) g_mutex_unlock(&(s)->lock) 110 111 #define SPLITMUX_SRC_PADS_LOCK(s) g_mutex_lock(&(s)->pads_lock) 112 #define SPLITMUX_SRC_PADS_UNLOCK(s) g_mutex_unlock(&(s)->pads_lock) 113 114 G_END_DECLS 115 116 #endif /* __GST_SPLITMUX_SRC_H__ */ 117