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 GMutex msg_lock; 48 gboolean running; 49 50 gchar *location; /* OBJECT_LOCK */ 51 52 GstSplitMuxPartReader **parts; 53 guint num_parts; 54 guint num_prepared_parts; 55 guint num_created_parts; 56 guint cur_part; 57 58 gboolean async_pending; 59 gboolean pads_complete; 60 61 GRWLock pads_rwlock; 62 GList *pads; /* pads_lock */ 63 guint n_pads; 64 guint n_notlinked; 65 66 GstClockTime total_duration; 67 GstClockTime end_offset; 68 GstSegment play_segment; 69 guint32 segment_seqnum; 70 }; 71 72 struct _GstSplitMuxSrcClass 73 { 74 GstBinClass parent_class; 75 }; 76 77 GType splitmux_src_pad_get_type (void); 78 #define SPLITMUX_TYPE_SRC_PAD splitmux_src_pad_get_type() 79 #define SPLITMUX_SRC_PAD_CAST(p) ((SplitMuxSrcPad *)(p)) 80 #define SPLITMUX_SRC_PAD(obj) \ 81 (G_TYPE_CHECK_INSTANCE_CAST((obj),SPLITMUX_TYPE_SRC_PAD,SplitMuxSrcPad)) 82 83 struct _SplitMuxSrcPad 84 { 85 GstPad parent; 86 87 guint cur_part; 88 GstSplitMuxPartReader *reader; 89 GstPad *part_pad; 90 91 GstSegment segment; 92 93 gboolean set_next_discont; 94 gboolean clear_next_discont; 95 96 gboolean sent_stream_start; 97 gboolean sent_caps; 98 gboolean sent_segment; 99 }; 100 101 struct _SplitMuxSrcPadClass 102 { 103 GstPadClass parent; 104 }; 105 106 GType gst_splitmux_src_get_type (void); 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_MSG_LOCK(s) g_mutex_lock(&(s)->msg_lock) 112 #define SPLITMUX_SRC_MSG_UNLOCK(s) g_mutex_unlock(&(s)->msg_lock) 113 114 #define SPLITMUX_SRC_PADS_WLOCK(s) g_rw_lock_writer_lock(&(s)->pads_rwlock) 115 #define SPLITMUX_SRC_PADS_WUNLOCK(s) g_rw_lock_writer_unlock(&(s)->pads_rwlock) 116 #define SPLITMUX_SRC_PADS_RLOCK(s) g_rw_lock_reader_lock(&(s)->pads_rwlock) 117 #define SPLITMUX_SRC_PADS_RUNLOCK(s) g_rw_lock_reader_unlock(&(s)->pads_rwlock) 118 119 GST_ELEMENT_REGISTER_DECLARE (splitmuxsrc); 120 121 G_END_DECLS 122 123 #endif /* __GST_SPLITMUX_SRC_H__ */ 124