1 /* GStreamer 2 * Copyright (C) <2007> Julien Moutte <julien@moutte.net> 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 20 #ifndef __FLV_DEMUX_H__ 21 #define __FLV_DEMUX_H__ 22 23 #include <gst/gst.h> 24 #include <gst/base/gstadapter.h> 25 #include <gst/base/gstflowcombiner.h> 26 #include "gstindex.h" 27 28 G_BEGIN_DECLS 29 #define GST_TYPE_FLV_DEMUX \ 30 (gst_flv_demux_get_type()) 31 #define GST_FLV_DEMUX(obj) \ 32 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FLV_DEMUX,GstFlvDemux)) 33 #define GST_FLV_DEMUX_CLASS(klass) \ 34 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FLV_DEMUX,GstFlvDemuxClass)) 35 #define GST_IS_FLV_DEMUX(obj) \ 36 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FLV_DEMUX)) 37 #define GST_IS_FLV_DEMUX_CLASS(klass) \ 38 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FLV_DEMUX)) 39 typedef struct _GstFlvDemux GstFlvDemux; 40 typedef struct _GstFlvDemuxClass GstFlvDemuxClass; 41 42 typedef enum 43 { 44 FLV_STATE_HEADER, 45 FLV_STATE_TAG_TYPE, 46 FLV_STATE_TAG_VIDEO, 47 FLV_STATE_TAG_AUDIO, 48 FLV_STATE_TAG_SCRIPT, 49 FLV_STATE_SEEK, 50 FLV_STATE_DONE, 51 FLV_STATE_SKIP, 52 FLV_STATE_NONE 53 } GstFlvDemuxState; 54 55 struct _GstFlvDemux 56 { 57 GstElement element; 58 59 GstPad *sinkpad; 60 61 GstPad *audio_pad; 62 GstPad *video_pad; 63 64 gboolean have_group_id; 65 guint group_id; 66 67 /* <private> */ 68 69 GstIndex *index; 70 gint index_id; 71 gboolean own_index; 72 73 GArray * times; 74 GArray * filepositions; 75 76 GstAdapter *adapter; 77 78 GstFlowCombiner *flowcombiner; 79 80 GstSegment segment; 81 82 GstEvent *new_seg_event; 83 84 GstTagList *taglist; 85 GstTagList *audio_tags; 86 GstTagList *video_tags; 87 88 GstFlvDemuxState state; 89 90 guint64 offset; 91 guint64 cur_tag_offset; 92 GstClockTime duration; 93 guint64 tag_size; 94 guint64 tag_data_size; 95 96 /* Audio infos */ 97 guint16 rate; 98 guint16 channels; 99 guint16 width; 100 guint16 audio_codec_tag; 101 guint64 audio_offset; 102 gboolean audio_need_discont; 103 gboolean audio_need_segment; 104 GstBuffer * audio_codec_data; 105 GstClockTime audio_start; 106 guint32 last_audio_pts; 107 GstClockTime audio_time_offset; 108 guint32 audio_bitrate; 109 110 /* Video infos */ 111 guint32 w; 112 guint32 h; 113 guint32 par_x; 114 guint32 par_y; 115 guint16 video_codec_tag; 116 guint64 video_offset; 117 gboolean video_need_discont; 118 gboolean video_need_segment; 119 gboolean got_par; 120 GstBuffer * video_codec_data; 121 GstClockTime video_start; 122 guint32 last_video_dts; 123 GstClockTime video_time_offset; 124 gdouble framerate; 125 guint32 video_bitrate; 126 127 gboolean random_access; 128 gboolean need_header; 129 gboolean has_audio; 130 gboolean has_video; 131 gboolean strict; 132 gboolean flushing; 133 134 gboolean no_more_pads; 135 136 #ifndef GST_DISABLE_DEBUG 137 gboolean no_audio_warned; 138 gboolean no_video_warned; 139 #endif 140 141 gboolean seeking; 142 gboolean building_index; 143 gboolean indexed; /* TRUE if index is completely built */ 144 gboolean upstream_seekable; /* TRUE if upstream is seekable */ 145 gint64 file_size; 146 GstEvent *seek_event; 147 gint64 seek_time; 148 guint32 segment_seqnum; 149 150 GstClockTime index_max_time; 151 gint64 index_max_pos; 152 153 /* reverse playback */ 154 GstClockTime video_first_ts; 155 GstClockTime audio_first_ts; 156 gboolean video_done; 157 gboolean audio_done; 158 gint64 from_offset; 159 gint64 to_offset; 160 }; 161 162 struct _GstFlvDemuxClass 163 { 164 GstElementClass parent_class; 165 }; 166 167 GType gst_flv_demux_get_type (void); 168 169 G_END_DECLS 170 #endif /* __FLV_DEMUX_H__ */ 171