2003-11-21 21:34:27 +00:00
|
|
|
/* GStreamer Matroska muxer/demuxer
|
|
|
|
* (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
|
|
|
*
|
|
|
|
* matroska-demux.h: matroska file/stream demuxer definition
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __GST_MATROSKA_DEMUX_H__
|
|
|
|
#define __GST_MATROSKA_DEMUX_H__
|
|
|
|
|
|
|
|
#include <gst/gst.h>
|
|
|
|
|
|
|
|
#include "ebml-read.h"
|
|
|
|
#include "matroska-ids.h"
|
|
|
|
|
|
|
|
G_BEGIN_DECLS
|
2004-03-15 16:32:54 +00:00
|
|
|
|
2003-11-21 21:34:27 +00:00
|
|
|
#define GST_TYPE_MATROSKA_DEMUX \
|
|
|
|
(gst_matroska_demux_get_type ())
|
|
|
|
#define GST_MATROSKA_DEMUX(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemux))
|
|
|
|
#define GST_MATROSKA_DEMUX_CLASS(klass) \
|
2006-04-20 13:23:40 +00:00
|
|
|
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MATROSKA_DEMUX, GstMatroskaDemuxClass))
|
2003-11-21 21:34:27 +00:00
|
|
|
#define GST_IS_MATROSKA_DEMUX(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MATROSKA_DEMUX))
|
2006-04-20 13:23:40 +00:00
|
|
|
#define GST_IS_MATROSKA_DEMUX_CLASS(klass) \
|
2003-11-21 21:34:27 +00:00
|
|
|
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MATROSKA_DEMUX))
|
2004-03-15 16:32:54 +00:00
|
|
|
|
gst/matroska/ebml-write.c: Use GDOUBLE_TO_BE() instead of (probably slower) custom code.
Original commit message from CVS:
* gst/matroska/ebml-write.c: (gst_ebml_write_float):
Use GDOUBLE_TO_BE() instead of (probably slower) custom code.
* gst/matroska/matroska-demux.c: (gst_matroska_demux_base_init),
(gst_matroska_demux_class_init), (gst_matroska_demux_init),
(gst_matroska_track_free), (gst_matroska_demux_encoding_cmp),
(gst_matroska_demux_read_track_encodings),
(gst_matroska_demux_add_stream),
(gst_matroska_demux_handle_src_query),
(gst_matroska_demux_init_stream),
(gst_matroska_demux_parse_index_cuetrack),
(gst_matroska_demux_parse_index_pointentry),
(gst_matroska_demux_parse_info),
(gst_matroska_demux_parse_metadata_id_simple_tag),
(gst_matroska_demux_parse_metadata),
(gst_matroska_demux_add_wvpk_header), (gst_matroska_decode_buffer),
(gst_matroska_demux_parse_blockgroup_or_simpleblock),
(gst_matroska_demux_parse_cluster),
(gst_matroska_demux_parse_contents_seekentry),
(gst_matroska_demux_loop_stream_parse_id),
(gst_matroska_demux_loop), (gst_matroska_demux_video_caps),
(gst_matroska_demux_audio_caps),
(gst_matroska_demux_subtitle_caps):
* gst/matroska/matroska-demux.h:
* gst/matroska/matroska-ids.c:
(gst_matroska_track_init_subtitle_context):
* gst/matroska/matroska-ids.h:
* gst/matroska/matroska-mux.c: (gst_matroska_mux_base_init),
(gst_matroska_mux_class_init), (gst_matroska_mux_init),
(gst_matroska_mux_create_uid), (gst_matroska_mux_reset),
(gst_matroska_mux_video_pad_setcaps),
(gst_matroska_mux_audio_pad_setcaps),
(gst_matroska_mux_subtitle_pad_setcaps),
(gst_matroska_mux_request_new_pad),
(gst_matroska_mux_track_header), (gst_matroska_mux_start),
(gst_matroska_mux_write_simple_tag), (gst_matroska_mux_finish),
(gst_matroska_mux_write_data), (gst_matroska_mux_collected),
(gst_matroska_mux_set_property):
Add many FIXMEs/TODOs all over the matroska muxer and demuxer
elements, do some checks for valid values in the demuxer, handle
tracktimecodescale in the demuxer, set correct default values for all
settings in the demuxer, review and add all missing matroska
IDs and some more raw YUV formats, and some trivial cleanup.
2008-06-10 10:44:53 +00:00
|
|
|
/* The spec says that more than 127 stream is discouraged so
|
|
|
|
* take this as a limit for now */
|
|
|
|
#define GST_MATROSKA_DEMUX_MAX_STREAMS 127
|
2004-03-15 16:32:54 +00:00
|
|
|
|
|
|
|
typedef enum {
|
2003-11-21 21:34:27 +00:00
|
|
|
GST_MATROSKA_DEMUX_STATE_START,
|
|
|
|
GST_MATROSKA_DEMUX_STATE_HEADER,
|
|
|
|
GST_MATROSKA_DEMUX_STATE_DATA
|
|
|
|
} GstMatroskaDemuxState;
|
|
|
|
|
2004-03-15 16:32:54 +00:00
|
|
|
typedef struct _GstMatroskaDemuxIndex {
|
|
|
|
guint64 pos; /* of the corresponding *cluster*! */
|
|
|
|
guint16 track; /* reference to 'num' */
|
|
|
|
guint64 time; /* in nanoseconds */
|
2003-11-21 21:34:27 +00:00
|
|
|
} GstMatroskaDemuxIndex;
|
|
|
|
|
2004-03-15 16:32:54 +00:00
|
|
|
typedef struct _GstMatroskaDemux {
|
2005-10-18 18:12:31 +00:00
|
|
|
GstEbmlRead parent;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
|
|
|
/* pads */
|
2005-10-18 18:12:31 +00:00
|
|
|
GstPad *sinkpad;
|
2003-11-21 21:34:27 +00:00
|
|
|
GstMatroskaTrackContext *src[GST_MATROSKA_DEMUX_MAX_STREAMS];
|
2005-10-18 18:12:31 +00:00
|
|
|
GstClock *clock;
|
|
|
|
guint num_streams;
|
|
|
|
guint num_v_streams;
|
|
|
|
guint num_a_streams;
|
|
|
|
guint num_t_streams;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
|
|
|
/* metadata */
|
2005-10-18 18:12:31 +00:00
|
|
|
gchar *muxing_app;
|
|
|
|
gchar *writing_app;
|
|
|
|
gint64 created;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
|
|
|
/* state */
|
2005-10-18 18:12:31 +00:00
|
|
|
GstMatroskaDemuxState state;
|
|
|
|
guint level_up;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
2008-06-13 19:07:03 +00:00
|
|
|
/* did we parse cues/tracks/segmentinfo already? */
|
2005-10-18 18:12:31 +00:00
|
|
|
gboolean index_parsed;
|
2008-06-13 19:07:03 +00:00
|
|
|
gboolean tracks_parsed;
|
|
|
|
gboolean segmentinfo_parsed;
|
2008-06-16 10:59:39 +00:00
|
|
|
gboolean attachments_parsed;
|
2008-06-15 14:08:41 +00:00
|
|
|
GList *tags_parsed;
|
2003-12-07 23:05:58 +00:00
|
|
|
|
|
|
|
/* start-of-segment */
|
2005-10-18 18:12:31 +00:00
|
|
|
guint64 ebml_segment_start;
|
2003-12-07 23:05:58 +00:00
|
|
|
|
2003-11-21 21:34:27 +00:00
|
|
|
/* a cue (index) table */
|
gst/matroska/: Use a GArray for storing the Cue (i.e. seek) information, store the CueTrackPositions for every track,...
Original commit message from CVS:
* gst/matroska/matroska-demux.c: (gst_matroska_demux_reset),
(gst_matroskademux_do_index_seek),
(gst_matroska_demux_parse_index_cuetrack),
(gst_matroska_demux_parse_index_pointentry),
(gst_matroska_index_compare), (gst_matroska_demux_parse_index),
(gst_matroska_demux_parse_metadata):
* gst/matroska/matroska-demux.h:
* gst/matroska/matroska-ids.h:
Use a GArray for storing the Cue (i.e. seek) information, store
the CueTrackPositions for every track, store the block number
and optimize searching in the array by sorting it after the last
element was added.
Fix a small memory leak when trying to parse a tags element that was
already parsed.
2008-06-15 19:09:54 +00:00
|
|
|
GArray *index;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
|
|
|
/* timescale in the file */
|
2005-10-18 18:12:31 +00:00
|
|
|
guint64 time_scale;
|
2003-11-21 21:34:27 +00:00
|
|
|
|
gst/matroska/: Handle return values from pull_range in a more granular way to properly shut down on seeks.
Original commit message from CVS:
* gst/matroska/ebml-read.c: (gst_ebml_read_peek_bytes),
(gst_ebml_read_pull_bytes), (gst_ebml_read_element_id),
(gst_ebml_read_element_length), (gst_ebml_peek_id),
(gst_ebml_read_skip), (gst_ebml_read_buffer),
(gst_ebml_read_bytes), (gst_ebml_read_uint), (gst_ebml_read_sint),
(gst_ebml_read_float), (gst_ebml_read_ascii), (gst_ebml_read_utf8),
(gst_ebml_read_date), (gst_ebml_read_master),
(gst_ebml_read_binary), (gst_ebml_read_header):
* gst/matroska/ebml-read.h:
* gst/matroska/matroska-demux.c:
(gst_matroska_demux_combine_flows), (gst_matroska_demux_reset),
(gst_matroska_demux_read_track_encodings),
(gst_matroska_demux_add_stream),
(gst_matroska_demux_handle_src_query),
(gst_matroska_demux_handle_seek_event),
(gst_matroska_demux_init_stream),
(gst_matroska_demux_parse_tracks),
(gst_matroska_demux_parse_index_cuetrack),
(gst_matroska_demux_parse_index_pointentry),
(gst_matroska_demux_parse_index), (gst_matroska_demux_parse_info),
(gst_matroska_demux_parse_metadata_id_simple_tag),
(gst_matroska_demux_parse_metadata_id_tag),
(gst_matroska_demux_parse_metadata),
(gst_matroska_demux_sync_streams),
(gst_matroska_demux_push_hdr_buf),
(gst_matroska_demux_push_flac_codec_priv_data),
(gst_matroska_demux_push_xiph_codec_priv_data),
(gst_matroska_demux_add_wvpk_header),
(gst_matroska_demux_check_subtitle_buffer),
(gst_matroska_demux_parse_blockgroup_or_simpleblock),
(gst_matroska_demux_parse_cluster),
(gst_matroska_demux_parse_contents_seekentry),
(gst_matroska_demux_parse_contents),
(gst_matroska_demux_loop_stream_parse_id),
(gst_matroska_demux_loop_stream), (gst_matroska_demux_loop):
* gst/matroska/matroska-demux.h:
* gst/matroska/matroska-ids.h:
Handle return values from pull_range in a more granular way to properly
shut down on seeks.
Combine return values from push.
Implement proper error handling.
Prepare for handling seeking correctly.
2008-03-06 19:47:48 +00:00
|
|
|
/* keeping track of playback position */
|
|
|
|
GstSegment segment;
|
|
|
|
gboolean segment_running;
|
2008-07-02 08:57:04 +00:00
|
|
|
gint64 duration;
|
2003-11-21 21:34:27 +00:00
|
|
|
} GstMatroskaDemux;
|
|
|
|
|
2004-03-15 16:32:54 +00:00
|
|
|
typedef struct _GstMatroskaDemuxClass {
|
2003-11-21 21:34:27 +00:00
|
|
|
GstEbmlReadClass parent;
|
|
|
|
} GstMatroskaDemuxClass;
|
|
|
|
|
2004-03-15 16:32:54 +00:00
|
|
|
gboolean gst_matroska_demux_plugin_init (GstPlugin *plugin);
|
2003-11-21 21:34:27 +00:00
|
|
|
|
|
|
|
G_END_DECLS
|
2004-03-15 16:32:54 +00:00
|
|
|
|
2003-11-21 21:34:27 +00:00
|
|
|
#endif /* __GST_MATROSKA_DEMUX_H__ */
|