3 * Copyright (C) 2009 Zaheer Abbas Merali
5 * Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
6 * Author: Youness Alaoui <youness.alaoui@collabora.co.uk>, Collabora Ltd.
7 * Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
8 * Author: Edward Hervey <bilboed@bilboed.com>, Collabora Ltd.
11 * Zaheer Abbas Merali <zaheerabbas at merali dot org>
12 * Edward Hervey <edward.hervey@collabora.co.uk>
14 * This library is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU Library General Public
16 * License as published by the Free Software Foundation; either
17 * version 2 of the License, or (at your option) any later version.
19 * This library is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * Library General Public License for more details.
24 * You should have received a copy of the GNU Library General Public
25 * License along with this library; if not, write to the
26 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
27 * Boston, MA 02110-1301, USA.
38 #include <gst/tag/tag.h>
39 #include <gst/pbutils/pbutils.h>
40 #include <gst/base/base.h>
41 #include <gst/audio/audio.h>
43 #include "mpegtsbase.h"
45 #include "gstmpegdesc.h"
46 #include "gstmpegdefs.h"
47 #include "mpegtspacketizer.h"
49 #include <gst/codecparsers/gsth264parser.h>
50 #include <gst/codecparsers/gstmpegvideoparser.h>
51 #include <gst/video/video-color.h>
55 #define _gst_log2(x) (log(x)/log(2))
60 * See TODO for explanations on improvements needed
63 #define CONTINUITY_UNSET 255
64 #define MAX_CONTINUITY 15
66 /* Seeking/Scanning related variables */
68 /* seek to SEEK_TIMESTAMP_OFFSET before the desired offset and search then
69 * either accurately or for the next timestamp
71 #define SEEK_TIMESTAMP_OFFSET (2500 * GST_MSECOND)
73 #define GST_FLOW_REWINDING GST_FLOW_CUSTOM_ERROR
75 /* latency in nsecs */
76 #define TS_LATENCY (700 * GST_MSECOND)
78 /* Limit PES packet collection to a maximum of 32MB
79 * which is more than large enough to support an H264 frame at
80 * maximum profile/level/bitrate at 30fps or above.
81 * PES bigger than this limit will be output in buffers of
83 #define MAX_PES_PAYLOAD (32 * 1024 * 1024)
85 GST_DEBUG_CATEGORY_STATIC (ts_demux_debug);
86 #define GST_CAT_DEFAULT ts_demux_debug
88 #define ABSDIFF(a,b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a)))
90 static GQuark QUARK_TSDEMUX;
91 static GQuark QUARK_PID;
92 static GQuark QUARK_PCR;
93 static GQuark QUARK_OPCR;
94 static GQuark QUARK_PTS;
95 static GQuark QUARK_DTS;
96 static GQuark QUARK_OFFSET;
100 PENDING_PACKET_EMPTY = 0, /* No pending packet/buffer
101 * Push incoming buffers to the array */
102 PENDING_PACKET_HEADER, /* PES header needs to be parsed
103 * Push incoming buffers to the array */
104 PENDING_PACKET_BUFFER, /* Currently filling up output buffer
105 * Push incoming buffers to the bufferlist */
106 PENDING_PACKET_DISCONT /* Discontinuity in incoming packets
107 * Drop all incoming buffers */
108 } PendingPacketState;
113 /* The fully reconstructed buffer */
116 /* Raw PTS/DTS (in 90kHz units) */
120 typedef struct _TSDemuxStream TSDemuxStream;
122 typedef struct _TSDemuxH264ParsingInfos TSDemuxH264ParsingInfos;
123 typedef struct _TSDemuxJP2KParsingInfos TSDemuxJP2KParsingInfos;
125 /* Returns TRUE if a keyframe was found */
126 typedef gboolean (*GstTsDemuxKeyFrameScanFunction) (TSDemuxStream * stream,
127 guint8 * data, const gsize data_size, const gsize max_frame_offset);
135 struct _TSDemuxH264ParsingInfos
137 /* H264 parsing data */
138 GstH264NalParser *parser;
142 SimpleBuffer framedata;
145 struct _TSDemuxJP2KParsingInfos
147 /* J2K parsing data */
150 struct _TSDemuxStream
152 MpegTSBaseStream stream;
156 /* Whether the pad was added or not */
159 /* Whether this is a sparse stream (subtitles or metadata) */
162 /* TRUE if we are waiting for a valid timestamp */
166 PendingPacketState state;
168 /* Data being reconstructed (allocated) */
171 /* Size of data being reconstructed (if known, else 0) */
174 /* Amount of bytes in current ->data */
177 guint allocated_size;
179 /* Current PTS/DTS for this stream (in running time) */
183 /* Reference PTS used to detect gaps */
184 GstClockTime gap_ref_pts;
185 /* Number of outputted buffers */
186 guint32 nb_out_buffers;
187 /* Reference number of buffers for gaps */
188 guint32 gap_ref_buffers;
190 /* Current PTS/DTS for this stream (in 90kHz unit) */
191 guint64 raw_pts, raw_dts;
193 /* Whether this stream needs to send a newsegment */
194 gboolean need_newsegment;
196 /* Whether the next output buffer should be DISCONT */
199 /* The value to use when calculating the newsegment */
200 GstClockTime first_pts;
204 gint continuity_counter;
206 /* List of pending buffers */
209 /* if != 0, output only PES from that substream */
210 guint8 target_pes_substream;
211 gboolean needs_keyframe;
213 GstClockTime seeked_pts, seeked_dts;
215 GstTsDemuxKeyFrameScanFunction scan_function;
216 TSDemuxH264ParsingInfos h264infos;
217 TSDemuxJP2KParsingInfos jp2kInfos;
223 "mpegversion = (int) { 1, 2, 4 }, " \
224 "systemstream = (boolean) FALSE; " \
225 "video/x-h264,stream-format=(string)byte-stream," \
226 "alignment=(string)nal;" \
227 "video/x-h265,stream-format=(string)byte-stream," \
228 "alignment=(string)nal;" \
232 "wmvversion = (int) 3, " \
233 "format = (string) WVC1;" \
240 "mpegversion = (int) 1;" \
242 "mpegversion = (int) 2, " \
243 "stream-format = (string) adts; " \
245 "mpegversion = (int) 4, " \
246 "stream-format = (string) loas; " \
248 "width = (int) { 16, 20, 24 }, " \
249 "rate = (int) { 48000, 96000 }, " \
250 "channels = (int) [ 1, 8 ], " \
251 "dynamic_range = (int) [ 0, 255 ], " \
252 "emphasis = (boolean) { FALSE, TRUE }, " \
253 "mute = (boolean) { FALSE, TRUE }; " \
254 "audio/x-ac3; audio/x-eac3;" \
257 "audio/x-private-ts-lpcm" \
260 /* Can also use the subpicture pads for text subtitles? */
261 #define SUBPICTURE_CAPS \
262 GST_STATIC_CAPS ("subpicture/x-pgs; subpicture/x-dvd; subpicture/x-dvb")
264 static GstStaticPadTemplate video_template =
265 GST_STATIC_PAD_TEMPLATE ("video_%01x_%05x", GST_PAD_SRC,
269 static GstStaticPadTemplate audio_template =
270 GST_STATIC_PAD_TEMPLATE ("audio_%01x_%05x",
275 static GstStaticPadTemplate subpicture_template =
276 GST_STATIC_PAD_TEMPLATE ("subpicture_%01x_%05x",
281 static GstStaticPadTemplate private_template =
282 GST_STATIC_PAD_TEMPLATE ("private_%01x_%05x",
285 GST_STATIC_CAPS_ANY);
298 /* mpegtsbase methods */
300 gst_ts_demux_update_program (MpegTSBase * base, MpegTSBaseProgram * program);
302 gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program);
304 gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program);
306 gst_ts_demux_can_remove_program (MpegTSBase * base,
307 MpegTSBaseProgram * program);
308 static void gst_ts_demux_reset (MpegTSBase * base);
310 gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet,
311 GstMpegtsSection * section);
312 static void gst_ts_demux_flush (MpegTSBase * base, gboolean hard);
313 static GstFlowReturn gst_ts_demux_drain (MpegTSBase * base);
315 gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * stream,
316 MpegTSBaseProgram * program);
318 gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * stream);
319 static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event);
320 static void gst_ts_demux_set_property (GObject * object, guint prop_id,
321 const GValue * value, GParamSpec * pspec);
322 static void gst_ts_demux_get_property (GObject * object, guint prop_id,
323 GValue * value, GParamSpec * pspec);
324 static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux, gboolean hard);
326 gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
327 MpegTSBaseProgram * program);
328 static void gst_ts_demux_stream_flush (TSDemuxStream * stream,
329 GstTSDemux * demux, gboolean hard);
331 static gboolean push_event (MpegTSBase * base, GstEvent * event);
332 static gboolean sink_query (MpegTSBase * base, GstQuery * query);
333 static void gst_ts_demux_check_and_sync_streams (GstTSDemux * demux,
339 QUARK_TSDEMUX = g_quark_from_string ("tsdemux");
340 QUARK_PID = g_quark_from_string ("pid");
341 QUARK_PCR = g_quark_from_string ("pcr");
342 QUARK_OPCR = g_quark_from_string ("opcr");
343 QUARK_PTS = g_quark_from_string ("pts");
344 QUARK_DTS = g_quark_from_string ("dts");
345 QUARK_OFFSET = g_quark_from_string ("offset");
348 #define gst_ts_demux_parent_class parent_class
349 G_DEFINE_TYPE_WITH_CODE (GstTSDemux, gst_ts_demux, GST_TYPE_MPEGTS_BASE,
353 gst_ts_demux_dispose (GObject * object)
355 GstTSDemux *demux = GST_TS_DEMUX_CAST (object);
357 gst_flow_combiner_free (demux->flowcombiner);
359 GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
363 gst_ts_demux_class_init (GstTSDemuxClass * klass)
365 GObjectClass *gobject_class;
366 GstElementClass *element_class;
367 MpegTSBaseClass *ts_class;
369 gobject_class = G_OBJECT_CLASS (klass);
370 gobject_class->set_property = gst_ts_demux_set_property;
371 gobject_class->get_property = gst_ts_demux_get_property;
372 gobject_class->dispose = gst_ts_demux_dispose;
374 g_object_class_install_property (gobject_class, PROP_PROGRAM_NUMBER,
375 g_param_spec_int ("program-number", "Program number",
376 "Program Number to demux for (-1 to ignore)", -1, G_MAXINT,
377 -1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
379 g_object_class_install_property (gobject_class, PROP_EMIT_STATS,
380 g_param_spec_boolean ("emit-stats", "Emit statistics",
381 "Emit messages for every pcr/opcr/pts/dts", FALSE,
382 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
384 element_class = GST_ELEMENT_CLASS (klass);
385 gst_element_class_add_pad_template (element_class,
386 gst_static_pad_template_get (&video_template));
387 gst_element_class_add_pad_template (element_class,
388 gst_static_pad_template_get (&audio_template));
389 gst_element_class_add_pad_template (element_class,
390 gst_static_pad_template_get (&subpicture_template));
391 gst_element_class_add_pad_template (element_class,
392 gst_static_pad_template_get (&private_template));
394 gst_element_class_set_static_metadata (element_class,
395 "MPEG transport stream demuxer",
397 "Demuxes MPEG2 transport streams",
398 "Zaheer Abbas Merali <zaheerabbas at merali dot org>\n"
399 "Edward Hervey <edward.hervey@collabora.co.uk>");
401 ts_class = GST_MPEGTS_BASE_CLASS (klass);
402 ts_class->reset = GST_DEBUG_FUNCPTR (gst_ts_demux_reset);
403 ts_class->push = GST_DEBUG_FUNCPTR (gst_ts_demux_push);
404 ts_class->push_event = GST_DEBUG_FUNCPTR (push_event);
405 ts_class->sink_query = GST_DEBUG_FUNCPTR (sink_query);
406 ts_class->program_started = GST_DEBUG_FUNCPTR (gst_ts_demux_program_started);
407 ts_class->program_stopped = GST_DEBUG_FUNCPTR (gst_ts_demux_program_stopped);
408 ts_class->update_program = GST_DEBUG_FUNCPTR (gst_ts_demux_update_program);
409 ts_class->can_remove_program = gst_ts_demux_can_remove_program;
410 ts_class->stream_added = gst_ts_demux_stream_added;
411 ts_class->stream_removed = gst_ts_demux_stream_removed;
412 ts_class->seek = GST_DEBUG_FUNCPTR (gst_ts_demux_do_seek);
413 ts_class->flush = GST_DEBUG_FUNCPTR (gst_ts_demux_flush);
414 ts_class->drain = GST_DEBUG_FUNCPTR (gst_ts_demux_drain);
418 gst_ts_demux_reset (MpegTSBase * base)
420 GstTSDemux *demux = (GstTSDemux *) base;
423 gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
424 if (demux->segment_event) {
425 gst_event_unref (demux->segment_event);
426 demux->segment_event = NULL;
429 if (demux->global_tags) {
430 gst_tag_list_unref (demux->global_tags);
431 demux->global_tags = NULL;
434 if (demux->previous_program) {
435 mpegts_base_deactivate_and_free_program (base, demux->previous_program);
436 demux->previous_program = NULL;
439 demux->have_group_id = FALSE;
440 demux->group_id = G_MAXUINT;
442 demux->last_seek_offset = -1;
443 demux->program_generation = 0;
447 gst_ts_demux_init (GstTSDemux * demux)
449 MpegTSBase *base = (MpegTSBase *) demux;
451 base->stream_size = sizeof (TSDemuxStream);
452 base->parse_private_sections = TRUE;
453 /* We are not interested in sections (all handled by mpegtsbase) */
454 base->push_section = FALSE;
456 demux->flowcombiner = gst_flow_combiner_new ();
457 demux->requested_program_number = -1;
458 demux->program_number = -1;
459 gst_ts_demux_reset (base);
464 gst_ts_demux_set_property (GObject * object, guint prop_id,
465 const GValue * value, GParamSpec * pspec)
467 GstTSDemux *demux = GST_TS_DEMUX (object);
470 case PROP_PROGRAM_NUMBER:
471 /* FIXME: do something if program is switched as opposed to set at
473 demux->requested_program_number = g_value_get_int (value);
475 case PROP_EMIT_STATS:
476 demux->emit_statistics = g_value_get_boolean (value);
479 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
484 gst_ts_demux_get_property (GObject * object, guint prop_id,
485 GValue * value, GParamSpec * pspec)
487 GstTSDemux *demux = GST_TS_DEMUX (object);
490 case PROP_PROGRAM_NUMBER:
491 g_value_set_int (value, demux->requested_program_number);
493 case PROP_EMIT_STATS:
494 g_value_set_boolean (value, demux->emit_statistics);
497 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
502 gst_ts_demux_get_duration (GstTSDemux * demux, GstClockTime * dur)
504 MpegTSBase *base = (MpegTSBase *) demux;
505 gboolean res = FALSE;
508 if (!demux->program) {
509 GST_DEBUG_OBJECT (demux, "No active program yet, can't provide duration");
513 /* Get total size in bytes */
514 if (gst_pad_peer_query_duration (base->sinkpad, GST_FORMAT_BYTES, &val)) {
515 /* Convert it to duration */
517 mpegts_packetizer_offset_to_ts (base->packetizer, val,
518 demux->program->pcr_pid);
519 if (GST_CLOCK_TIME_IS_VALID (*dur))
526 gst_ts_demux_srcpad_query (GstPad * pad, GstObject * parent, GstQuery * query)
533 demux = GST_TS_DEMUX (parent);
534 base = GST_MPEGTS_BASE (demux);
536 switch (GST_QUERY_TYPE (query)) {
537 case GST_QUERY_DURATION:
539 GST_DEBUG ("query duration");
540 gst_query_parse_duration (query, &format, NULL);
541 if (format == GST_FORMAT_TIME) {
542 if (!gst_pad_peer_query (base->sinkpad, query)) {
544 if (gst_ts_demux_get_duration (demux, &dur))
545 gst_query_set_duration (query, GST_FORMAT_TIME, dur);
550 GST_DEBUG_OBJECT (demux, "only query duration on TIME is supported");
555 case GST_QUERY_LATENCY:
557 GST_DEBUG ("query latency");
558 res = gst_pad_peer_query (base->sinkpad, query);
560 GstClockTime min_lat, max_lat;
563 /* According to H.222.0
564 Annex D.0.3 (System Time Clock recovery in the decoder)
565 and D.0.2 (Audio and video presentation synchronization)
567 We can end up with an interval of up to 700ms between valid
568 PTS/DTS. We therefore allow a latency of 700ms for that.
570 gst_query_parse_latency (query, &live, &min_lat, &max_lat);
571 min_lat += TS_LATENCY;
572 if (GST_CLOCK_TIME_IS_VALID (max_lat))
573 max_lat += TS_LATENCY;
574 gst_query_set_latency (query, live, min_lat, max_lat);
578 case GST_QUERY_SEEKING:
580 GST_DEBUG ("query seeking");
581 gst_query_parse_seeking (query, &format, NULL, NULL, NULL);
582 GST_DEBUG ("asked for format %s", gst_format_get_name (format));
583 if (format == GST_FORMAT_TIME) {
584 gboolean seekable = FALSE;
586 if (gst_pad_peer_query (base->sinkpad, query))
587 gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
589 /* If upstream is not seekable in TIME format we use
590 * our own values here */
593 if (gst_ts_demux_get_duration (demux, &dur)) {
594 gst_query_set_seeking (query, GST_FORMAT_TIME, TRUE, 0, dur);
595 GST_DEBUG ("Gave duration: %" GST_TIME_FORMAT, GST_TIME_ARGS (dur));
599 GST_DEBUG_OBJECT (demux, "only TIME is supported for query seeking");
604 case GST_QUERY_SEGMENT:{
608 format = demux->segment.format;
611 gst_segment_to_stream_time (&demux->segment, format,
612 demux->segment.start);
613 if ((stop = demux->segment.stop) == -1)
614 stop = demux->segment.duration;
616 stop = gst_segment_to_stream_time (&demux->segment, format, stop);
618 gst_query_set_segment (query, demux->segment.rate, format, start, stop);
623 res = gst_pad_query_default (pad, parent, query);
631 clear_simple_buffer (SimpleBuffer * sbuf)
642 scan_keyframe_h264 (TSDemuxStream * stream, const guint8 * data,
643 const gsize data_size, const gsize max_frame_offset)
646 GstH264NalUnit unit, frame_unit = { 0, };
647 GstH264ParserResult res = GST_H264_PARSER_OK;
648 TSDemuxH264ParsingInfos *h264infos = &stream->h264infos;
650 GstH264NalParser *parser = h264infos->parser;
652 if (G_UNLIKELY (parser == NULL)) {
653 parser = h264infos->parser = gst_h264_nal_parser_new ();
654 h264infos->sps = gst_byte_writer_new ();
655 h264infos->pps = gst_byte_writer_new ();
656 h264infos->sei = gst_byte_writer_new ();
659 while (res == GST_H264_PARSER_OK) {
661 gst_h264_parser_identify_nalu (parser, data, offset, data_size, &unit);
663 if (res != GST_H264_PARSER_OK && res != GST_H264_PARSER_NO_NAL_END) {
664 GST_INFO_OBJECT (stream->pad, "Error identifying nalu: %i", res);
668 res = gst_h264_parser_parse_nal (parser, &unit);
669 if (res != GST_H264_PARSER_OK) {
674 case GST_H264_NAL_SEI:
678 if (gst_byte_writer_put_data (h264infos->sei,
679 unit.data + unit.sc_offset,
680 unit.size + unit.offset - unit.sc_offset)) {
681 GST_DEBUG ("adding SEI %u", unit.size + unit.offset - unit.sc_offset);
683 GST_WARNING ("Could not write SEI");
686 case GST_H264_NAL_PPS:
690 if (gst_byte_writer_put_data (h264infos->pps,
691 unit.data + unit.sc_offset,
692 unit.size + unit.offset - unit.sc_offset)) {
693 GST_DEBUG ("adding PPS %u", unit.size + unit.offset - unit.sc_offset);
695 GST_WARNING ("Could not write PPS");
698 case GST_H264_NAL_SPS:
702 if (gst_byte_writer_put_data (h264infos->sps,
703 unit.data + unit.sc_offset,
704 unit.size + unit.offset - unit.sc_offset)) {
705 GST_DEBUG ("adding SPS %u", unit.size + unit.offset - unit.sc_offset);
707 GST_WARNING ("Could not write SPS");
710 /* these units are considered keyframes in h264parse */
711 case GST_H264_NAL_SLICE:
712 case GST_H264_NAL_SLICE_DPA:
713 case GST_H264_NAL_SLICE_DPB:
714 case GST_H264_NAL_SLICE_DPC:
715 case GST_H264_NAL_SLICE_IDR:
717 GstH264SliceHdr slice;
719 if (h264infos->framedata.size)
722 res = gst_h264_parser_parse_slice_hdr (parser, &unit, &slice,
725 if (GST_H264_IS_I_SLICE (&slice) || GST_H264_IS_SI_SLICE (&slice)) {
726 if (*(unit.data + unit.offset + 1) & 0x80) {
727 /* means first_mb_in_slice == 0 */
728 /* real frame data */
729 GST_DEBUG_OBJECT (stream->pad, "Found keyframe at: %u",
741 if (offset == unit.sc_offset + unit.size)
744 offset = unit.sc_offset + unit.size;
747 /* We've got all the infos we need (SPS / PPS and a keyframe, plus
748 * and possibly SEI units. We can stop rewinding the stream
750 if (gst_byte_writer_get_size (h264infos->sps) &&
751 gst_byte_writer_get_size (h264infos->pps) &&
752 (h264infos->framedata.size || frame_unit.size)) {
755 gsize tmpsize = gst_byte_writer_get_size (h264infos->pps);
757 /* We know that the SPS is first so just put all our data in there */
758 data = gst_byte_writer_reset_and_get_data (h264infos->pps);
759 gst_byte_writer_put_data (h264infos->sps, data, tmpsize);
762 tmpsize = gst_byte_writer_get_size (h264infos->sei);
764 GST_DEBUG ("Adding SEI");
765 data = gst_byte_writer_reset_and_get_data (h264infos->sei);
766 gst_byte_writer_put_data (h264infos->sps, data, tmpsize);
770 if (frame_unit.size) { /* We found the everything in one go! */
771 GST_DEBUG ("Adding Keyframe");
772 gst_byte_writer_put_data (h264infos->sps,
773 frame_unit.data + frame_unit.sc_offset,
774 stream->current_size - frame_unit.sc_offset);
776 GST_DEBUG ("Adding Keyframe");
777 gst_byte_writer_put_data (h264infos->sps,
778 h264infos->framedata.data, h264infos->framedata.size);
779 clear_simple_buffer (&h264infos->framedata);
782 g_free (stream->data);
783 stream->current_size = gst_byte_writer_get_size (h264infos->sps);
784 stream->data = gst_byte_writer_reset_and_get_data (h264infos->sps);
785 gst_byte_writer_init (h264infos->sps);
786 gst_byte_writer_init (h264infos->pps);
787 gst_byte_writer_init (h264infos->sei);
792 if (frame_unit.size) {
793 GST_DEBUG_OBJECT (stream->pad, "Keep the keyframe as this is the one"
794 " we will push later");
796 h264infos->framedata.data =
797 g_memdup (frame_unit.data + frame_unit.sc_offset,
798 stream->current_size - frame_unit.sc_offset);
799 h264infos->framedata.size = stream->current_size - frame_unit.sc_offset;
805 /* We merge data from TS packets so that the scanning methods get a continuous chunk,
806 however the scanning method will return keyframe offset which needs to be translated
807 back to actual offset in file */
810 gint64 real_offset; /* offset of TS packet */
811 gint merged_offset; /* offset of merged data in buffer */
815 gst_ts_demux_adjust_seek_offset_for_keyframe (TSDemuxStream * stream,
816 guint8 * data, guint64 size)
820 if (!stream->scan_function)
823 scan_pid = ((MpegTSBaseStream *) stream)->pid;
825 if (scan_pid != -1) {
826 return stream->scan_function (stream, data, size, size);
833 gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event)
837 GstTSDemux *demux = (GstTSDemux *) base;
838 GstFlowReturn res = GST_FLOW_ERROR;
842 GstSeekType start_type, stop_type;
844 guint64 start_offset;
846 gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
849 GST_DEBUG ("seek event, rate: %f start: %" GST_TIME_FORMAT
850 " stop: %" GST_TIME_FORMAT, rate, GST_TIME_ARGS (start),
851 GST_TIME_ARGS (stop));
854 GST_WARNING ("Negative rate not supported");
858 if (flags & (GST_SEEK_FLAG_SEGMENT)) {
859 GST_WARNING ("seek flags 0x%x are not supported", (int) flags);
863 /* configure the segment with the seek variables */
864 GST_DEBUG_OBJECT (demux, "configuring seek");
866 if (start_type != GST_SEEK_TYPE_NONE) {
868 mpegts_packetizer_ts_to_offset (base->packetizer, MAX (0,
869 start - SEEK_TIMESTAMP_OFFSET), demux->program->pcr_pid);
871 if (G_UNLIKELY (start_offset == -1)) {
872 GST_WARNING ("Couldn't convert start position to an offset");
876 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
877 TSDemuxStream *stream = tmp->data;
879 stream->need_newsegment = TRUE;
881 gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
882 if (demux->segment_event) {
883 gst_event_unref (demux->segment_event);
884 demux->segment_event = NULL;
891 /* record offset and rate */
892 base->seek_offset = start_offset;
893 demux->last_seek_offset = base->seek_offset;
897 gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
898 start, stop_type, stop, NULL);
899 /* Reset segment if we're not doing an accurate seek */
900 demux->reset_segment = (!(flags & GST_SEEK_FLAG_ACCURATE));
902 if (demux->segment_event) {
903 gst_event_unref (demux->segment_event);
904 demux->segment_event = NULL;
907 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
908 TSDemuxStream *stream = tmp->data;
910 if (flags & GST_SEEK_FLAG_ACCURATE)
911 stream->needs_keyframe = TRUE;
913 stream->seeked_pts = GST_CLOCK_TIME_NONE;
914 stream->seeked_dts = GST_CLOCK_TIME_NONE;
915 stream->need_newsegment = TRUE;
916 stream->first_pts = GST_CLOCK_TIME_NONE;
924 gst_ts_demux_srcpad_event (GstPad * pad, GstObject * parent, GstEvent * event)
927 GstTSDemux *demux = GST_TS_DEMUX (parent);
929 GST_DEBUG_OBJECT (pad, "Got event %s",
930 gst_event_type_get_name (GST_EVENT_TYPE (event)));
932 switch (GST_EVENT_TYPE (event)) {
934 res = mpegts_base_handle_seek_event ((MpegTSBase *) demux, pad, event);
936 GST_WARNING ("seeking failed");
937 gst_event_unref (event);
940 res = gst_pad_event_default (pad, parent, event);
947 clean_global_taglist (GstTagList * taglist)
949 gst_tag_list_remove_tag (taglist, GST_TAG_CONTAINER_FORMAT);
950 gst_tag_list_remove_tag (taglist, GST_TAG_CODEC);
954 push_event (MpegTSBase * base, GstEvent * event)
956 GstTSDemux *demux = (GstTSDemux *) base;
958 gboolean early_ret = FALSE;
960 if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
961 GST_DEBUG_OBJECT (base, "Ignoring segment event (recreated later)");
962 gst_event_unref (event);
965 } else if (GST_EVENT_TYPE (event) == GST_EVENT_TAG) {
966 /* In case we receive tags before data, store them to send later
967 * If we already have the program, send it right away */
970 gst_event_parse_tag (event, &taglist);
972 if (demux->global_tags == NULL) {
973 demux->global_tags = gst_tag_list_copy (taglist);
975 /* Tags that are stream specific for the container should be considered
976 * global for the container streams */
977 if (gst_tag_list_get_scope (taglist) == GST_TAG_SCOPE_STREAM) {
978 gst_tag_list_set_scope (demux->global_tags, GST_TAG_SCOPE_GLOBAL);
981 demux->global_tags = gst_tag_list_make_writable (demux->global_tags);
982 gst_tag_list_insert (demux->global_tags, taglist, GST_TAG_MERGE_REPLACE);
984 clean_global_taglist (demux->global_tags);
986 /* tags are stored to be used after if there are no streams yet,
987 * so we should never reject */
991 if (G_UNLIKELY (demux->program == NULL)) {
992 gst_event_unref (event);
996 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
997 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
999 /* If we are pushing out EOS, flush out pending data first */
1000 if (GST_EVENT_TYPE (event) == GST_EVENT_EOS &&
1001 gst_pad_is_active (stream->pad))
1002 gst_ts_demux_push_pending_data (demux, stream, NULL);
1004 gst_event_ref (event);
1005 gst_pad_push_event (stream->pad, event);
1009 gst_event_unref (event);
1015 sink_query (MpegTSBase * base, GstQuery * query)
1017 GstTSDemux *demux = (GstTSDemux *) base;
1018 gboolean res = FALSE;
1020 switch (GST_QUERY_TYPE (query)) {
1021 case GST_QUERY_BITRATE:{
1023 GstClockTime duration;
1025 if (gst_pad_peer_query_duration (base->sinkpad, GST_FORMAT_BYTES,
1026 &size_bytes) && size_bytes > 0) {
1027 if (gst_ts_demux_get_duration (demux, &duration) && duration > 0
1028 && duration != GST_CLOCK_TIME_NONE) {
1030 gst_util_uint64_scale (8 * size_bytes, GST_SECOND, duration);
1032 GST_LOG_OBJECT (demux, "bitrate query byte length: %" G_GINT64_FORMAT
1033 " duration %" GST_TIME_FORMAT " resulting in a bitrate of %u",
1034 size_bytes, GST_TIME_ARGS (duration), bitrate);
1035 gst_query_set_bitrate (query, bitrate);
1042 res = GST_MPEGTS_BASE_CLASS (parent_class)->sink_query (base, query);
1050 add_iso639_language_to_tags (TSDemuxStream * stream, gchar * lang_code)
1054 GST_LOG ("Add language code for stream: '%s'", lang_code);
1056 if (!stream->taglist)
1057 stream->taglist = gst_tag_list_new_empty ();
1059 /* descriptor contains ISO 639-2 code, we want the ISO 639-1 code */
1060 lc = gst_tag_get_language_code (lang_code);
1062 /* Only set tag if we have a valid one */
1063 if (lc || (lang_code[0] && lang_code[1]))
1064 gst_tag_list_add (stream->taglist, GST_TAG_MERGE_REPLACE,
1065 GST_TAG_LANGUAGE_CODE, (lc) ? lc : lang_code, NULL);
1069 gst_ts_demux_create_tags (TSDemuxStream * stream)
1071 MpegTSBaseStream *bstream = (MpegTSBaseStream *) stream;
1072 const GstMpegtsDescriptor *desc = NULL;
1076 mpegts_get_descriptor_from_stream (bstream,
1077 GST_MTS_DESC_ISO_639_LANGUAGE);
1081 nb = gst_mpegts_descriptor_parse_iso_639_language_nb (desc);
1083 GST_DEBUG ("Found ISO 639 descriptor (%d entries)", nb);
1085 for (i = 0; i < nb; i++)
1086 if (gst_mpegts_descriptor_parse_iso_639_language_idx (desc, i, &lang_code,
1088 add_iso639_language_to_tags (stream, lang_code);
1096 mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_SUBTITLING);
1101 nb = gst_mpegts_descriptor_parse_dvb_subtitling_nb (desc);
1103 GST_DEBUG ("Found SUBTITLING descriptor (%d entries)", nb);
1105 for (i = 0; i < nb; i++)
1106 if (gst_mpegts_descriptor_parse_dvb_subtitling_idx (desc, i, &lang_code,
1107 NULL, NULL, NULL)) {
1108 add_iso639_language_to_tags (stream, lang_code);
1115 create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream,
1116 MpegTSBaseProgram * program)
1118 GstTSDemux *demux = GST_TS_DEMUX (base);
1119 TSDemuxStream *stream = (TSDemuxStream *) bstream;
1121 GstCaps *caps = NULL;
1122 GstPadTemplate *template = NULL;
1123 const GstMpegtsDescriptor *desc = NULL;
1125 gboolean sparse = FALSE;
1126 gboolean is_audio = FALSE, is_video = FALSE, is_subpicture = FALSE,
1129 gst_ts_demux_create_tags (stream);
1131 GST_LOG ("Attempting to create pad for stream 0x%04x with stream_type %d",
1132 bstream->pid, bstream->stream_type);
1134 /* First handle BluRay-specific stream types since there is some overlap
1135 * between BluRay and non-BluRay streay type identifiers */
1136 if (program->registration_id == DRF_ID_HDMV) {
1137 switch (bstream->stream_type) {
1138 case ST_BD_AUDIO_AC3:
1140 const GstMpegtsDescriptor *ac3_desc;
1142 /* ATSC ac3 audio descriptor */
1144 mpegts_get_descriptor_from_stream (bstream,
1145 GST_MTS_DESC_AC3_AUDIO_STREAM);
1146 if (ac3_desc && DESC_AC_AUDIO_STREAM_bsid (ac3_desc->data) != 16) {
1147 GST_LOG ("ac3 audio");
1149 caps = gst_caps_new_empty_simple ("audio/x-ac3");
1152 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1156 case ST_BD_AUDIO_EAC3:
1157 case ST_BD_AUDIO_AC3_PLUS:
1159 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1161 case ST_BD_AUDIO_AC3_TRUE_HD:
1163 caps = gst_caps_new_empty_simple ("audio/x-true-hd");
1164 stream->target_pes_substream = 0x72;
1166 case ST_BD_AUDIO_LPCM:
1168 caps = gst_caps_new_empty_simple ("audio/x-private-ts-lpcm");
1170 case ST_BD_PGS_SUBPICTURE:
1171 is_subpicture = TRUE;
1172 caps = gst_caps_new_empty_simple ("subpicture/x-pgs");
1175 case ST_BD_AUDIO_DTS_HD:
1176 case ST_BD_AUDIO_DTS_HD_MASTER_AUDIO:
1178 caps = gst_caps_new_empty_simple ("audio/x-dts");
1179 stream->target_pes_substream = 0x71;
1187 /* Handle non-BluRay stream types */
1188 switch (bstream->stream_type) {
1189 case GST_MPEGTS_STREAM_TYPE_VIDEO_MPEG1:
1190 case GST_MPEGTS_STREAM_TYPE_VIDEO_MPEG2:
1191 case ST_PS_VIDEO_MPEG2_DCII:
1192 /* FIXME : Use DCII registration code (ETV1 ?) to handle that special
1193 * Stream type (ST_PS_VIDEO_MPEG2_DCII) */
1194 /* FIXME : Use video decriptor (0x1) to refine caps with:
1196 * * profile_and_level
1198 GST_LOG ("mpeg video");
1200 caps = gst_caps_new_simple ("video/mpeg",
1201 "mpegversion", G_TYPE_INT,
1202 bstream->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_MPEG1 ? 1 : 2,
1203 "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
1206 case GST_MPEGTS_STREAM_TYPE_AUDIO_MPEG1:
1207 case GST_MPEGTS_STREAM_TYPE_AUDIO_MPEG2:
1208 GST_LOG ("mpeg audio");
1211 gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1,
1213 /* HDV is always mpeg 1 audio layer 2 */
1214 if (program->registration_id == DRF_ID_TSHV)
1215 gst_caps_set_simple (caps, "layer", G_TYPE_INT, 2, NULL);
1217 case GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS:
1218 GST_LOG ("private data");
1219 /* FIXME: Move all of this into a common method (there might be other
1220 * types also, depending on registratino descriptors also
1222 desc = mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_AC3);
1224 GST_LOG ("ac3 audio");
1226 caps = gst_caps_new_empty_simple ("audio/x-ac3");
1231 mpegts_get_descriptor_from_stream (bstream,
1232 GST_MTS_DESC_DVB_ENHANCED_AC3);
1234 GST_LOG ("ac3 audio");
1236 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1240 mpegts_get_descriptor_from_stream (bstream,
1241 GST_MTS_DESC_DVB_TELETEXT);
1243 GST_LOG ("teletext");
1245 caps = gst_caps_new_empty_simple ("application/x-teletext");
1250 mpegts_get_descriptor_from_stream (bstream,
1251 GST_MTS_DESC_DVB_SUBTITLING);
1253 GST_LOG ("subtitling");
1254 is_subpicture = TRUE;
1255 caps = gst_caps_new_empty_simple ("subpicture/x-dvb");
1260 switch (bstream->registration_id) {
1264 /* SMPTE registered DTS */
1266 caps = gst_caps_new_empty_simple ("audio/x-dts");
1270 caps = gst_caps_new_empty_simple ("audio/x-smpte-302m");
1273 desc = mpegts_get_descriptor_from_stream (bstream,
1274 GST_MTS_DESC_DVB_EXTENSION);
1275 if (desc != NULL && desc->tag_extension == 0x80 && desc->length >= 1) { /* User defined (provisional Opus) */
1276 guint8 channel_config_code;
1279 /* skip tag, length and tag_extension */
1280 gst_byte_reader_init (&br, desc->data + 3, desc->length - 1);
1281 channel_config_code = gst_byte_reader_get_uint8_unchecked (&br);
1283 if ((channel_config_code & 0x8f) <= 8) {
1284 static const guint8 coupled_stream_counts[9] = {
1285 1, 0, 1, 1, 2, 2, 2, 3, 3
1287 static const guint8 channel_map_a[8][8] = {
1294 {0, 4, 1, 2, 3, 5, 6},
1295 {0, 6, 1, 2, 3, 4, 5, 7},
1297 static const guint8 channel_map_b[8][8] = {
1304 {0, 1, 2, 3, 4, 5, 6},
1305 {0, 1, 2, 3, 4, 5, 6, 7},
1308 gint channels = -1, stream_count, coupled_count, mapping_family;
1309 guint8 *channel_mapping = NULL;
1311 channels = channel_config_code ? (channel_config_code & 0x0f) : 2;
1312 if (channel_config_code == 0 || channel_config_code == 0x80) {
1314 mapping_family = 255;
1315 if (channel_config_code == 0) {
1322 channel_mapping = g_new0 (guint8, channels);
1323 memcpy (channel_mapping, &channel_map_a[1], channels);
1324 } else if (channel_config_code <= 8) {
1325 mapping_family = (channels > 2) ? 1 : 0;
1327 channel_config_code -
1328 coupled_stream_counts[channel_config_code];
1329 coupled_count = coupled_stream_counts[channel_config_code];
1330 if (mapping_family != 0) {
1331 channel_mapping = g_new0 (guint8, channels);
1332 memcpy (channel_mapping, &channel_map_a[channels - 1],
1335 } else if (channel_config_code >= 0x82
1336 && channel_config_code <= 0x88) {
1338 stream_count = channels;
1340 channel_mapping = g_new0 (guint8, channels);
1341 memcpy (channel_mapping, &channel_map_b[channels - 1],
1343 } else if (channel_config_code == 0x81) {
1344 if (gst_byte_reader_get_remaining (&br) < 2) {
1345 GST_WARNING_OBJECT (demux,
1346 "Invalid Opus descriptor with extended channel configuration");
1351 channels = gst_byte_reader_get_uint8_unchecked (&br);
1352 mapping_family = gst_byte_reader_get_uint8_unchecked (&br);
1354 /* Overwrite values from above */
1355 if (channels == 0) {
1356 GST_WARNING_OBJECT (demux,
1357 "Invalid Opus descriptor with extended channel configuration");
1362 if (mapping_family == 0 && channels <= 2) {
1363 stream_count = channels - coupled_stream_counts[channels];
1364 coupled_count = coupled_stream_counts[channels];
1366 GstBitReader breader;
1367 guint8 stream_count_minus_one, coupled_stream_count;
1368 gint stream_count_minus_one_len, coupled_stream_count_len;
1369 gint channel_mapping_len, i;
1371 gst_bit_reader_init (&breader,
1372 gst_byte_reader_get_data_unchecked
1373 (&br, gst_byte_reader_get_remaining
1374 (&br)), gst_byte_reader_get_remaining (&br));
1376 stream_count_minus_one_len = ceil (_gst_log2 (channels));
1377 if (!gst_bit_reader_get_bits_uint8 (&breader,
1378 &stream_count_minus_one,
1379 stream_count_minus_one_len)) {
1380 GST_WARNING_OBJECT (demux,
1381 "Invalid Opus descriptor with extended channel configuration");
1386 stream_count = stream_count_minus_one + 1;
1387 coupled_stream_count_len =
1388 ceil (_gst_log2 (stream_count_minus_one + 2));
1390 if (!gst_bit_reader_get_bits_uint8 (&breader,
1391 &coupled_stream_count, coupled_stream_count_len)) {
1392 GST_WARNING_OBJECT (demux,
1393 "Invalid Opus descriptor with extended channel configuration");
1398 coupled_count = coupled_stream_count;
1400 channel_mapping_len =
1401 ceil (_gst_log2 (stream_count_minus_one + 1 +
1402 coupled_stream_count + 1));
1403 channel_mapping = g_new0 (guint8, channels);
1404 for (i = 0; i < channels; i++) {
1405 if (!gst_bit_reader_get_bits_uint8 (&breader,
1406 &channel_mapping[i], channel_mapping_len)) {
1407 GST_WARNING_OBJECT (demux,
1408 "Invalid Opus descriptor with extended channel configuration");
1414 if (i != channels) {
1416 g_free (channel_mapping);
1417 channel_mapping = NULL;
1422 g_assert_not_reached ();
1425 if (channels != -1) {
1428 gst_codec_utils_opus_create_caps (48000, channels,
1429 mapping_family, stream_count, coupled_count,
1432 g_free (channel_mapping);
1435 GST_WARNING_OBJECT (demux,
1436 "unexpected channel config code 0x%02x", channel_config_code);
1439 GST_WARNING_OBJECT (demux, "Opus, but no extension descriptor");
1444 caps = gst_caps_new_simple ("video/x-h265",
1445 "stream-format", G_TYPE_STRING, "byte-stream",
1446 "alignment", G_TYPE_STRING, "nal", NULL);
1451 caps = gst_caps_new_simple ("meta/x-klv",
1452 "parsed", G_TYPE_BOOLEAN, TRUE, NULL);
1458 /* hack for itv hd (sid 10510, video pid 3401 */
1459 if (program->program_number == 10510 && bstream->pid == 3401) {
1461 caps = gst_caps_new_simple ("video/x-h264",
1462 "stream-format", G_TYPE_STRING, "byte-stream",
1463 "alignment", G_TYPE_STRING, "nal", NULL);
1467 /* FIXME : Should only be used with specific PMT registration_descriptor */
1468 /* We don't expose those streams since they're only helper streams */
1469 /* template = gst_static_pad_template_get (&private_template); */
1470 /* name = g_strdup_printf ("private_%04x", bstream->pid); */
1471 /* caps = gst_caps_new_simple ("hdv/aux-v", NULL); */
1474 /* FIXME : Should only be used with specific PMT registration_descriptor */
1475 /* We don't expose those streams since they're only helper streams */
1476 /* template = gst_static_pad_template_get (&private_template); */
1477 /* name = g_strdup_printf ("private_%04x", bstream->pid); */
1478 /* caps = gst_caps_new_simple ("hdv/aux-a", NULL); */
1480 case GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS:
1482 caps = gst_caps_new_simple ("audio/mpeg",
1483 "mpegversion", G_TYPE_INT, 2,
1484 "stream-format", G_TYPE_STRING, "adts", NULL);
1486 case GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_LATM:
1488 caps = gst_caps_new_simple ("audio/mpeg",
1489 "mpegversion", G_TYPE_INT, 4,
1490 "stream-format", G_TYPE_STRING, "loas", NULL);
1492 case GST_MPEGTS_STREAM_TYPE_VIDEO_MPEG4:
1494 caps = gst_caps_new_simple ("video/mpeg",
1495 "mpegversion", G_TYPE_INT, 4,
1496 "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
1498 case GST_MPEGTS_STREAM_TYPE_VIDEO_H264:
1500 caps = gst_caps_new_simple ("video/x-h264",
1501 "stream-format", G_TYPE_STRING, "byte-stream",
1502 "alignment", G_TYPE_STRING, "nal", NULL);
1504 case GST_MPEGTS_STREAM_TYPE_VIDEO_HEVC:
1506 caps = gst_caps_new_simple ("video/x-h265",
1507 "stream-format", G_TYPE_STRING, "byte-stream",
1508 "alignment", G_TYPE_STRING, "nal", NULL);
1510 case GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K:
1513 mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_J2K_VIDEO);
1515 caps = gst_caps_new_empty_simple ("image/x-jpc");
1519 guint16 DEN_frame_rate = 0;
1520 guint16 NUM_frame_rate = 0;
1521 guint8 color_specification = 0;
1522 guint8 remaining_8b = 0;
1523 gboolean interlaced_video = 0;
1524 const gchar *interlace_mode = NULL;
1525 const gchar *colorspace = NULL;
1526 const gchar *colorimetry_mode = NULL;
1527 guint16 profile_and_level G_GNUC_UNUSED;
1528 guint32 horizontal_size G_GNUC_UNUSED;
1529 guint32 vertical_size G_GNUC_UNUSED;
1530 guint32 max_bit_rate G_GNUC_UNUSED;
1531 guint32 max_buffer_size G_GNUC_UNUSED;
1532 const guint desc_min_length = 24;
1534 if (desc->length < desc_min_length) {
1536 ("GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K: descriptor length %d too short",
1541 /* Skip the descriptor tag and length */
1542 gst_byte_reader_init (&br, desc->data + 2, desc->length);
1544 profile_and_level = gst_byte_reader_get_uint16_be_unchecked (&br);
1545 horizontal_size = gst_byte_reader_get_uint32_be_unchecked (&br);
1546 vertical_size = gst_byte_reader_get_uint32_be_unchecked (&br);
1547 max_bit_rate = gst_byte_reader_get_uint32_be_unchecked (&br);
1548 max_buffer_size = gst_byte_reader_get_uint32_be_unchecked (&br);
1549 DEN_frame_rate = gst_byte_reader_get_uint16_be_unchecked (&br);
1550 NUM_frame_rate = gst_byte_reader_get_uint16_be_unchecked (&br);
1551 color_specification = gst_byte_reader_get_uint8_unchecked (&br);
1552 remaining_8b = gst_byte_reader_get_uint8_unchecked (&br);
1553 interlaced_video = remaining_8b & 0x40;
1554 /* we don't support demuxing interlaced at the moment */
1555 if (interlaced_video) {
1557 ("GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K: interlaced video not supported");
1560 interlace_mode = "progressive";
1561 stream->jp2kInfos.interlace = FALSE;
1563 switch (color_specification) {
1564 case GST_MPEGTSDEMUX_JPEG2000_COLORSPEC_SRGB:
1565 colorspace = "sRGB";
1566 colorimetry_mode = GST_VIDEO_COLORIMETRY_SRGB;
1568 case GST_MPEGTSDEMUX_JPEG2000_COLORSPEC_REC601:
1569 colorspace = "sYUV";
1570 colorimetry_mode = GST_VIDEO_COLORIMETRY_BT601;
1572 case GST_MPEGTSDEMUX_JPEG2000_COLORSPEC_REC709:
1573 case GST_MPEGTSDEMUX_JPEG2000_COLORSPEC_CIELUV:
1574 colorspace = "sYUV";
1575 colorimetry_mode = GST_VIDEO_COLORIMETRY_BT709;
1580 caps = gst_caps_new_simple ("image/x-jpc",
1581 "framerate", GST_TYPE_FRACTION, NUM_frame_rate, DEN_frame_rate,
1582 "interlace-mode", G_TYPE_STRING, interlace_mode,
1583 "colorimetry", G_TYPE_STRING, colorimetry_mode,
1584 "colorspace", G_TYPE_STRING, colorspace, NULL);
1587 case ST_VIDEO_DIRAC:
1588 if (bstream->registration_id == 0x64726163) {
1592 caps = gst_caps_new_empty_simple ("video/x-dirac");
1595 case ST_PRIVATE_EA: /* Try to detect a VC1 stream */
1597 gboolean is_vc1 = FALSE;
1599 /* Note/FIXME: RP-227 specifies that the registration descriptor
1600 * for vc1 can also contain other information, such as profile,
1601 * level, alignment, buffer_size, .... */
1602 if (bstream->registration_id == DRF_ID_VC1)
1605 GST_WARNING ("0xea private stream type found but no descriptor "
1606 "for VC1. Assuming plain VC1.");
1610 caps = gst_caps_new_simple ("video/x-wmv",
1611 "wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
1615 case ST_PS_AUDIO_AC3:
1616 /* DVB_ENHANCED_AC3 */
1618 mpegts_get_descriptor_from_stream (bstream,
1619 GST_MTS_DESC_DVB_ENHANCED_AC3);
1622 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1626 /* If stream has ac3 descriptor
1627 * OR program is ATSC (GA94)
1628 * OR stream registration is AC-3
1629 * then it's regular AC3 */
1630 if (bstream->registration_id == DRF_ID_AC3 ||
1631 program->registration_id == DRF_ID_GA94 ||
1632 mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_AC3)) {
1634 caps = gst_caps_new_empty_simple ("audio/x-ac3");
1638 GST_WARNING ("AC3 stream type found but no guaranteed "
1639 "way found to differentiate between AC3 and EAC3. "
1640 "Assuming plain AC3.");
1642 caps = gst_caps_new_empty_simple ("audio/x-ac3");
1644 case ST_PS_AUDIO_EAC3:
1646 /* ATSC_ENHANCED_AC3 */
1647 if (bstream->registration_id == DRF_ID_EAC3 ||
1648 mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_ATSC_EAC3)) {
1650 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1654 GST_ELEMENT_WARNING (demux, STREAM, DEMUX,
1655 ("Assuming ATSC E-AC3 audio stream."),
1656 ("ATSC E-AC3 stream type found but no guarantee way found to "
1657 "differentiate among other standards (DVB, ISDB and etc..)"));
1660 caps = gst_caps_new_empty_simple ("audio/x-eac3");
1663 case ST_PS_AUDIO_LPCM2:
1665 caps = gst_caps_new_empty_simple ("audio/x-private2-lpcm");
1667 case ST_PS_AUDIO_DTS:
1669 caps = gst_caps_new_empty_simple ("audio/x-dts");
1671 case ST_PS_AUDIO_LPCM:
1673 caps = gst_caps_new_empty_simple ("audio/x-lpcm");
1675 case ST_PS_DVD_SUBPICTURE:
1676 is_subpicture = TRUE;
1677 caps = gst_caps_new_empty_simple ("subpicture/x-dvd");
1681 /* hack for Chinese AVS video stream which use 0x42 as stream_id
1682 * NOTE: this is unofficial and within the ISO reserved range. */
1684 caps = gst_caps_new_empty_simple ("video/x-cavs");
1687 GST_DEBUG ("Non-media stream (stream_type:0x%x). Not creating pad",
1688 bstream->stream_type);
1695 template = gst_static_pad_template_get (&audio_template);
1697 g_strdup_printf ("audio_%01x_%04x", demux->program_generation,
1699 gst_stream_set_stream_type (bstream->stream_object,
1700 GST_STREAM_TYPE_AUDIO);
1701 } else if (is_video) {
1702 template = gst_static_pad_template_get (&video_template);
1704 g_strdup_printf ("video_%01x_%04x", demux->program_generation,
1706 gst_stream_set_stream_type (bstream->stream_object,
1707 GST_STREAM_TYPE_VIDEO);
1708 } else if (is_private) {
1709 template = gst_static_pad_template_get (&private_template);
1711 g_strdup_printf ("private_%01x_%04x", demux->program_generation,
1713 } else if (is_subpicture) {
1714 template = gst_static_pad_template_get (&subpicture_template);
1716 g_strdup_printf ("subpicture_%01x_%04x", demux->program_generation,
1718 gst_stream_set_stream_type (bstream->stream_object, GST_STREAM_TYPE_TEXT);
1720 g_assert_not_reached ();
1724 if (template && name && caps) {
1726 const gchar *stream_id;
1728 GST_LOG ("stream:%p creating pad with name %s and caps %" GST_PTR_FORMAT,
1729 stream, name, caps);
1730 pad = gst_pad_new_from_template (template, name);
1731 gst_pad_set_active (pad, TRUE);
1732 gst_pad_use_fixed_caps (pad);
1733 stream_id = gst_stream_get_stream_id (bstream->stream_object);
1735 event = gst_pad_get_sticky_event (base->sinkpad, GST_EVENT_STREAM_START, 0);
1737 if (gst_event_parse_group_id (event, &demux->group_id))
1738 demux->have_group_id = TRUE;
1740 demux->have_group_id = FALSE;
1741 gst_event_unref (event);
1742 } else if (!demux->have_group_id) {
1743 demux->have_group_id = TRUE;
1744 demux->group_id = gst_util_group_id_next ();
1746 event = gst_event_new_stream_start (stream_id);
1747 gst_event_set_stream (event, bstream->stream_object);
1748 if (demux->have_group_id)
1749 gst_event_set_group_id (event, demux->group_id);
1751 gst_event_set_stream_flags (event, GST_STREAM_FLAG_SPARSE);
1752 gst_stream_set_stream_flags (bstream->stream_object,
1753 GST_STREAM_FLAG_SPARSE);
1755 stream->sparse = sparse;
1756 gst_stream_set_caps (bstream->stream_object, caps);
1757 if (!stream->taglist)
1758 stream->taglist = gst_tag_list_new_empty ();
1759 gst_pb_utils_add_codec_description_to_tag_list (stream->taglist, NULL,
1761 gst_stream_set_tags (bstream->stream_object, stream->taglist);
1763 gst_pad_push_event (pad, event);
1764 gst_pad_set_caps (pad, caps);
1765 gst_pad_set_query_function (pad, gst_ts_demux_srcpad_query);
1766 gst_pad_set_event_function (pad, gst_ts_demux_srcpad_event);
1771 gst_object_unref (template);
1773 gst_caps_unref (caps);
1779 gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream,
1780 MpegTSBaseProgram * program)
1782 GstTSDemux *demux = (GstTSDemux *) base;
1783 TSDemuxStream *stream = (TSDemuxStream *) bstream;
1786 /* Create the pad */
1787 if (bstream->stream_type != 0xff) {
1788 stream->pad = create_pad_for_stream (base, bstream, program);
1790 gst_flow_combiner_add_pad (demux->flowcombiner, stream->pad);
1793 if (base->mode != BASE_MODE_PUSHING
1794 && bstream->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_H264) {
1795 stream->scan_function =
1796 (GstTsDemuxKeyFrameScanFunction) scan_keyframe_h264;
1798 stream->scan_function = NULL;
1801 stream->active = FALSE;
1803 stream->need_newsegment = TRUE;
1804 /* Reset segment if we're not doing an accurate seek */
1805 demux->reset_segment = (!(demux->segment.flags & GST_SEEK_FLAG_ACCURATE));
1806 stream->needs_keyframe = FALSE;
1807 stream->discont = TRUE;
1808 stream->pts = GST_CLOCK_TIME_NONE;
1809 stream->dts = GST_CLOCK_TIME_NONE;
1810 stream->first_pts = GST_CLOCK_TIME_NONE;
1811 stream->raw_pts = -1;
1812 stream->raw_dts = -1;
1813 stream->pending_ts = TRUE;
1814 stream->nb_out_buffers = 0;
1815 stream->gap_ref_buffers = 0;
1816 stream->gap_ref_pts = GST_CLOCK_TIME_NONE;
1817 /* Only wait for a valid timestamp if we have a PCR_PID */
1818 stream->pending_ts = program->pcr_pid < 0x1fff;
1819 stream->continuity_counter = CONTINUITY_UNSET;
1822 return (stream->pad != NULL);
1826 tsdemux_h264_parsing_info_clear (TSDemuxH264ParsingInfos * h264infos)
1828 clear_simple_buffer (&h264infos->framedata);
1830 if (h264infos->parser) {
1831 gst_h264_nal_parser_free (h264infos->parser);
1832 gst_byte_writer_free (h264infos->sps);
1833 gst_byte_writer_free (h264infos->pps);
1834 gst_byte_writer_free (h264infos->sei);
1839 gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream)
1841 TSDemuxStream *stream = (TSDemuxStream *) bstream;
1844 gst_flow_combiner_remove_pad (GST_TS_DEMUX_CAST (base)->flowcombiner,
1846 if (stream->active) {
1848 if (gst_pad_is_active (stream->pad)) {
1849 /* Flush out all data */
1850 GST_DEBUG_OBJECT (stream->pad, "Flushing out pending data");
1851 gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream, NULL);
1853 GST_DEBUG_OBJECT (stream->pad, "Pushing out EOS");
1854 gst_pad_push_event (stream->pad, gst_event_new_eos ());
1855 gst_pad_set_active (stream->pad, FALSE);
1858 GST_DEBUG_OBJECT (stream->pad, "Removing pad");
1859 gst_element_remove_pad (GST_ELEMENT_CAST (base), stream->pad);
1860 stream->active = FALSE;
1862 gst_object_unref (stream->pad);
1867 gst_ts_demux_stream_flush (stream, GST_TS_DEMUX_CAST (base), TRUE);
1869 if (stream->taglist != NULL) {
1870 gst_tag_list_unref (stream->taglist);
1871 stream->taglist = NULL;
1874 tsdemux_h264_parsing_info_clear (&stream->h264infos);
1878 activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream)
1881 GST_DEBUG_OBJECT (tsdemux, "Activating pad %s:%s for stream %p",
1882 GST_DEBUG_PAD_NAME (stream->pad), stream);
1883 gst_element_add_pad ((GstElement *) tsdemux, stream->pad);
1884 stream->active = TRUE;
1885 GST_DEBUG_OBJECT (stream->pad, "done adding pad");
1886 } else if (((MpegTSBaseStream *) stream)->stream_type != 0xff) {
1887 GST_DEBUG_OBJECT (tsdemux,
1888 "stream %p (pid 0x%04x, type:0x%02x) has no pad", stream,
1889 ((MpegTSBaseStream *) stream)->pid,
1890 ((MpegTSBaseStream *) stream)->stream_type);
1895 gst_ts_demux_stream_flush (TSDemuxStream * stream, GstTSDemux * tsdemux,
1898 GST_DEBUG ("flushing stream %p", stream);
1900 g_free (stream->data);
1901 stream->data = NULL;
1902 stream->state = PENDING_PACKET_EMPTY;
1903 stream->expected_size = 0;
1904 stream->allocated_size = 0;
1905 stream->current_size = 0;
1906 stream->discont = TRUE;
1907 stream->pts = GST_CLOCK_TIME_NONE;
1908 stream->dts = GST_CLOCK_TIME_NONE;
1909 stream->raw_pts = -1;
1910 stream->raw_dts = -1;
1911 stream->pending_ts = TRUE;
1912 stream->nb_out_buffers = 0;
1913 stream->gap_ref_buffers = 0;
1914 stream->gap_ref_pts = GST_CLOCK_TIME_NONE;
1915 stream->continuity_counter = CONTINUITY_UNSET;
1917 if (G_UNLIKELY (stream->pending)) {
1920 GST_DEBUG ("clearing pending %p", stream);
1921 for (tmp = stream->pending; tmp; tmp = tmp->next) {
1922 PendingBuffer *pend = (PendingBuffer *) tmp->data;
1923 gst_buffer_unref (pend->buffer);
1924 g_slice_free (PendingBuffer, pend);
1926 g_list_free (stream->pending);
1927 stream->pending = NULL;
1931 stream->first_pts = GST_CLOCK_TIME_NONE;
1932 stream->need_newsegment = TRUE;
1937 gst_ts_demux_flush_streams (GstTSDemux * demux, gboolean hard)
1940 if (!demux->program)
1943 for (walk = demux->program->stream_list; walk; walk = g_list_next (walk))
1944 gst_ts_demux_stream_flush (walk->data, demux, hard);
1948 gst_ts_demux_can_remove_program (MpegTSBase * base, MpegTSBaseProgram * program)
1950 GstTSDemux *demux = GST_TS_DEMUX (base);
1952 /* If it's our current active program, we return FALSE, we'll deactivate it
1953 * ourselves when the next program gets activated */
1954 if (demux->program == program) {
1956 ("Attempting to remove current program, delaying until new program gets activated");
1957 demux->previous_program = program;
1958 demux->program_number = -1;
1965 gst_ts_demux_update_program (MpegTSBase * base, MpegTSBaseProgram * program)
1967 GstTSDemux *demux = GST_TS_DEMUX (base);
1970 GST_DEBUG ("Updating program %d", program->program_number);
1971 /* Emit collection message */
1972 gst_element_post_message ((GstElement *) base,
1973 gst_message_new_stream_collection ((GstObject *) base,
1974 program->collection));
1976 /* Add all streams, then fire no-more-pads */
1977 for (tmp = program->stream_list; tmp; tmp = tmp->next) {
1978 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
1980 activate_pad_for_stream (demux, stream);
1981 if (stream->sparse) {
1982 /* force sending of pending sticky events which have been stored on the
1983 * pad already and which otherwise would only be sent on the first buffer
1984 * or serialized event (which means very late in case of subtitle streams),
1985 * and playsink waits for stream-start or another serialized event */
1986 GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
1987 gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
1994 gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program)
1996 GstTSDemux *demux = GST_TS_DEMUX (base);
1998 GST_DEBUG ("Current program %d, new program %d requested program %d",
1999 (gint) demux->program_number, program->program_number,
2000 demux->requested_program_number);
2002 if (demux->requested_program_number == program->program_number ||
2003 (demux->requested_program_number == -1 && demux->program_number == -1)) {
2005 gboolean have_pads = FALSE;
2007 GST_LOG ("program %d started", program->program_number);
2008 demux->program_number = program->program_number;
2009 demux->program = program;
2011 /* Increment the program_generation counter */
2012 demux->program_generation = (demux->program_generation + 1) & 0xf;
2014 /* Emit collection message */
2015 gst_element_post_message ((GstElement *) base,
2016 gst_message_new_stream_collection ((GstObject *) base,
2017 program->collection));
2019 /* If this is not the initial program, we need to calculate
2021 if (demux->segment_event) {
2022 gst_event_unref (demux->segment_event);
2023 demux->segment_event = NULL;
2026 /* DRAIN ALL STREAMS FIRST ! */
2027 if (demux->previous_program) {
2029 GST_DEBUG_OBJECT (demux, "Draining previous program");
2030 for (tmp = demux->previous_program->stream_list; tmp; tmp = tmp->next) {
2031 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
2033 gst_ts_demux_push_pending_data (demux, stream,
2034 demux->previous_program);
2038 /* Add all streams, then fire no-more-pads */
2039 for (tmp = program->stream_list; tmp; tmp = tmp->next) {
2040 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
2041 activate_pad_for_stream (demux, stream);
2046 /* If there was a previous program, now is the time to deactivate it
2047 * and remove old pads (including pushing EOS) */
2048 if (demux->previous_program) {
2049 GST_DEBUG ("Deactivating previous program");
2050 mpegts_base_deactivate_and_free_program (base, demux->previous_program);
2051 demux->previous_program = NULL;
2055 /* If we had no pads, this stream is likely corrupted or unsupported and
2056 * there's not much we can do at this point */
2057 GST_ELEMENT_ERROR (demux, STREAM, WRONG_TYPE,
2058 ("This stream contains no valid or supported streams."),
2059 ("activating program but got no pads"));
2063 /* If any of the stream is sparse, push a GAP event before anything else
2064 * This is done here, and not in activate_pad_for_stream() because pushing
2065 * a GAP event *is* considering data, and we want to ensure the (potential)
2066 * old pads are all removed before we push any data on the new ones */
2067 for (tmp = program->stream_list; tmp; tmp = tmp->next) {
2068 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
2069 if (stream->sparse) {
2070 /* force sending of pending sticky events which have been stored on the
2071 * pad already and which otherwise would only be sent on the first buffer
2072 * or serialized event (which means very late in case of subtitle streams),
2073 * and playsink waits for stream-start or another serialized event */
2074 GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
2075 gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
2079 gst_element_no_more_pads ((GstElement *) demux);
2084 gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program)
2086 GstTSDemux *demux = GST_TS_DEMUX (base);
2088 if (demux->program == program) {
2089 demux->program = NULL;
2090 demux->program_number = -1;
2096 gst_ts_demux_record_pts (GstTSDemux * demux, TSDemuxStream * stream,
2097 guint64 pts, guint64 offset)
2099 MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
2101 stream->raw_pts = pts;
2103 stream->pts = GST_CLOCK_TIME_NONE;
2107 GST_LOG ("pid 0x%04x raw pts:%" G_GUINT64_FORMAT " at offset %"
2108 G_GUINT64_FORMAT, bs->pid, pts, offset);
2110 /* Compute PTS in GstClockTime */
2112 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2113 MPEGTIME_TO_GSTTIME (pts), demux->program->pcr_pid);
2115 GST_LOG ("pid 0x%04x Stored PTS %" G_GUINT64_FORMAT, bs->pid, stream->pts);
2117 if (G_UNLIKELY (demux->emit_statistics)) {
2119 st = gst_structure_new_id_empty (QUARK_TSDEMUX);
2120 gst_structure_id_set (st,
2121 QUARK_PID, G_TYPE_UINT, bs->pid,
2122 QUARK_OFFSET, G_TYPE_UINT64, offset, QUARK_PTS, G_TYPE_UINT64, pts,
2124 gst_element_post_message (GST_ELEMENT_CAST (demux),
2125 gst_message_new_element (GST_OBJECT (demux), st));
2130 gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream,
2131 guint64 dts, guint64 offset)
2133 MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
2135 stream->raw_dts = dts;
2137 stream->dts = GST_CLOCK_TIME_NONE;
2141 GST_LOG ("pid 0x%04x raw dts:%" G_GUINT64_FORMAT " at offset %"
2142 G_GUINT64_FORMAT, bs->pid, dts, offset);
2144 /* Compute DTS in GstClockTime */
2146 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2147 MPEGTIME_TO_GSTTIME (dts), demux->program->pcr_pid);
2149 GST_LOG ("pid 0x%04x Stored DTS %" G_GUINT64_FORMAT, bs->pid, stream->dts);
2151 if (G_UNLIKELY (demux->emit_statistics)) {
2153 st = gst_structure_new_id_empty (QUARK_TSDEMUX);
2154 gst_structure_id_set (st,
2155 QUARK_PID, G_TYPE_UINT, bs->pid,
2156 QUARK_OFFSET, G_TYPE_UINT64, offset, QUARK_DTS, G_TYPE_UINT64, dts,
2158 gst_element_post_message (GST_ELEMENT_CAST (demux),
2159 gst_message_new_element (GST_OBJECT (demux), st));
2163 /* This is called when we haven't got a valid initial PTS/DTS on all streams */
2165 check_pending_buffers (GstTSDemux * demux)
2167 gboolean have_observation = FALSE;
2168 /* The biggest offset */
2171 gboolean have_only_sparse = TRUE;
2173 /* 0. Do we only have sparse stream */
2174 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
2175 TSDemuxStream *tmpstream = (TSDemuxStream *) tmp->data;
2177 if (!tmpstream->sparse) {
2178 have_only_sparse = FALSE;
2183 /* 1. Go over all streams */
2184 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
2185 TSDemuxStream *tmpstream = (TSDemuxStream *) tmp->data;
2186 /* 1.1 check if at least one stream got a valid DTS */
2187 if (have_only_sparse || !tmpstream->sparse) {
2188 if ((tmpstream->raw_dts != -1 && tmpstream->dts != GST_CLOCK_TIME_NONE) ||
2189 (tmpstream->raw_pts != -1 && tmpstream->pts != GST_CLOCK_TIME_NONE)) {
2190 have_observation = TRUE;
2196 /* 2. If we don't have a valid value yet, break out */
2197 if (have_observation == FALSE)
2200 /* 3. Go over all streams that have current/pending data */
2201 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
2202 TSDemuxStream *tmpstream = (TSDemuxStream *) tmp->data;
2203 PendingBuffer *pend;
2204 guint64 firstval, lastval, ts;
2206 /* 3.1 Calculate the offset between current DTS and first DTS */
2207 if (tmpstream->pending == NULL || tmpstream->state == PENDING_PACKET_EMPTY)
2209 /* If we don't have any pending data, the offset is 0 for this stream */
2210 if (tmpstream->pending == NULL)
2212 if (tmpstream->raw_dts != -1)
2213 lastval = tmpstream->raw_dts;
2214 else if (tmpstream->raw_pts != -1)
2215 lastval = tmpstream->raw_pts;
2217 GST_WARNING ("Don't have a last DTS/PTS to use for offset recalculation");
2220 pend = tmpstream->pending->data;
2221 if (pend->dts != -1)
2222 firstval = pend->dts;
2223 else if (pend->pts != -1)
2224 firstval = pend->pts;
2227 ("Don't have a first DTS/PTS to use for offset recalculation");
2230 /* 3.2 Add to the offset the report TS for the current DTS */
2231 ts = mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2232 MPEGTIME_TO_GSTTIME (lastval), demux->program->pcr_pid);
2233 if (ts == GST_CLOCK_TIME_NONE) {
2234 GST_WARNING ("THIS SHOULD NOT HAPPEN !");
2237 ts += MPEGTIME_TO_GSTTIME (lastval - firstval);
2238 /* 3.3 If that offset is bigger than the current offset, store it */
2243 GST_DEBUG ("New initial pcr_offset %" GST_TIME_FORMAT,
2244 GST_TIME_ARGS (offset));
2246 /* 4. Set the offset on the packetizer */
2247 mpegts_packetizer_set_current_pcr_offset (MPEG_TS_BASE_PACKETIZER (demux),
2248 offset, demux->program->pcr_pid);
2250 /* 4. Go over all streams */
2251 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
2252 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
2254 stream->pending_ts = FALSE;
2255 /* 4.1 Set pending_ts for FALSE */
2257 /* 4.2 Recalculate PTS/DTS (in running time) for pending data */
2258 if (stream->pending) {
2260 for (tmp2 = stream->pending; tmp2; tmp2 = tmp2->next) {
2261 PendingBuffer *pend = (PendingBuffer *) tmp2->data;
2262 if (pend->pts != -1)
2263 GST_BUFFER_PTS (pend->buffer) =
2264 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2265 MPEGTIME_TO_GSTTIME (pend->pts), demux->program->pcr_pid);
2266 if (pend->dts != -1)
2267 GST_BUFFER_DTS (pend->buffer) =
2268 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2269 MPEGTIME_TO_GSTTIME (pend->dts), demux->program->pcr_pid);
2270 /* 4.2.2 Set first_pts to TS of lowest PTS (for segment) */
2271 if (stream->first_pts == GST_CLOCK_TIME_NONE) {
2272 if (GST_BUFFER_PTS (pend->buffer) != GST_CLOCK_TIME_NONE)
2273 stream->first_pts = GST_BUFFER_PTS (pend->buffer);
2274 else if (GST_BUFFER_DTS (pend->buffer) != GST_CLOCK_TIME_NONE)
2275 stream->first_pts = GST_BUFFER_DTS (pend->buffer);
2279 /* Recalculate PTS/DTS (in running time) for current data */
2280 if (stream->state != PENDING_PACKET_EMPTY) {
2281 if (stream->raw_pts != -1) {
2283 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2284 MPEGTIME_TO_GSTTIME (stream->raw_pts), demux->program->pcr_pid);
2285 if (stream->first_pts == GST_CLOCK_TIME_NONE)
2286 stream->first_pts = stream->pts;
2288 if (stream->raw_dts != -1) {
2290 mpegts_packetizer_pts_to_ts (MPEG_TS_BASE_PACKETIZER (demux),
2291 MPEGTIME_TO_GSTTIME (stream->raw_dts), demux->program->pcr_pid);
2292 if (stream->first_pts == GST_CLOCK_TIME_NONE)
2293 stream->first_pts = stream->dts;
2302 gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream,
2303 guint8 * data, guint32 length, guint64 bufferoffset)
2306 PESParsingResult parseres;
2308 GST_MEMDUMP ("Header buffer", data, MIN (length, 32));
2310 parseres = mpegts_parse_pes_header (data, length, &header);
2311 if (G_UNLIKELY (parseres == PES_PARSING_NEED_MORE))
2313 if (G_UNLIKELY (parseres == PES_PARSING_BAD)) {
2314 GST_WARNING ("Error parsing PES header. pid: 0x%x stream_type: 0x%x",
2315 stream->stream.pid, stream->stream.stream_type);
2319 if (stream->target_pes_substream != 0
2320 && header.stream_id_extension != stream->target_pes_substream) {
2321 GST_DEBUG ("Skipping unwanted substream");
2325 gst_ts_demux_record_dts (demux, stream, header.DTS, bufferoffset);
2326 gst_ts_demux_record_pts (demux, stream, header.PTS, bufferoffset);
2327 if (G_UNLIKELY (stream->pending_ts &&
2328 (stream->pts != GST_CLOCK_TIME_NONE
2329 || stream->dts != GST_CLOCK_TIME_NONE))) {
2330 GST_DEBUG ("Got pts/dts update, rechecking all streams");
2331 check_pending_buffers (demux);
2332 } else if (stream->first_pts == GST_CLOCK_TIME_NONE) {
2333 if (GST_CLOCK_TIME_IS_VALID (stream->pts))
2334 stream->first_pts = stream->pts;
2335 else if (GST_CLOCK_TIME_IS_VALID (stream->dts))
2336 stream->first_pts = stream->dts;
2339 GST_DEBUG_OBJECT (demux,
2340 "stream PTS %" GST_TIME_FORMAT " DTS %" GST_TIME_FORMAT,
2341 GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (stream->dts));
2343 /* Remove PES headers */
2344 GST_DEBUG ("Moving data forward by %d bytes (packet_size:%d, have:%d)",
2345 header.header_size, header.packet_length, length);
2346 stream->expected_size = header.packet_length;
2347 if (stream->expected_size) {
2348 if (G_LIKELY (stream->expected_size > header.header_size)) {
2349 stream->expected_size -= header.header_size;
2351 /* next packet will have to complete this one */
2352 GST_WARNING ("invalid header and packet size combination, empty packet");
2353 stream->expected_size = 0;
2356 data += header.header_size;
2357 length -= header.header_size;
2359 /* Create the output buffer */
2360 if (stream->expected_size)
2361 stream->allocated_size = MAX (stream->expected_size, length);
2363 stream->allocated_size = MAX (8192, length);
2365 g_assert (stream->data == NULL);
2366 stream->data = g_malloc (stream->allocated_size);
2367 memcpy (stream->data, data, length);
2368 stream->current_size = length;
2370 stream->state = PENDING_PACKET_BUFFER;
2375 stream->state = PENDING_PACKET_DISCONT;
2380 * * WITH packet->payload != NULL
2381 * * WITH pending/current flushed out if beginning of new PES packet
2384 gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream,
2385 MpegTSPacketizerPacket * packet)
2389 guint8 cc = FLAGS_CONTINUITY_COUNTER (packet->scram_afc_cc);
2391 GST_LOG ("pid: 0x%04x state:%d", stream->stream.pid, stream->state);
2393 size = packet->data_end - packet->payload;
2394 data = packet->payload;
2396 if (stream->continuity_counter == CONTINUITY_UNSET) {
2397 GST_DEBUG ("CONTINUITY: Initialize to %d", cc);
2398 } else if ((cc == stream->continuity_counter + 1 ||
2399 (stream->continuity_counter == MAX_CONTINUITY && cc == 0))) {
2400 GST_LOG ("CONTINUITY: Got expected %d", cc);
2402 GST_WARNING ("CONTINUITY: Mismatch packet %d, stream %d",
2403 cc, stream->continuity_counter);
2404 if (stream->state != PENDING_PACKET_EMPTY)
2405 stream->state = PENDING_PACKET_DISCONT;
2407 stream->continuity_counter = cc;
2409 if (stream->state == PENDING_PACKET_EMPTY) {
2410 if (G_UNLIKELY (!packet->payload_unit_start_indicator)) {
2411 stream->state = PENDING_PACKET_DISCONT;
2412 GST_DEBUG ("Didn't get the first packet of this PES");
2414 GST_LOG ("EMPTY=>HEADER");
2415 stream->state = PENDING_PACKET_HEADER;
2419 switch (stream->state) {
2420 case PENDING_PACKET_HEADER:
2422 GST_LOG ("HEADER: Parsing PES header");
2424 /* parse the header */
2425 gst_ts_demux_parse_pes_header (demux, stream, data, size, packet->offset);
2428 case PENDING_PACKET_BUFFER:
2430 GST_LOG ("BUFFER: appending data");
2431 if (G_UNLIKELY (stream->current_size + size > stream->allocated_size)) {
2432 GST_LOG ("resizing buffer");
2434 stream->allocated_size = MAX (8192, 2 * stream->allocated_size);
2435 } while (stream->current_size + size > stream->allocated_size);
2436 stream->data = g_realloc (stream->data, stream->allocated_size);
2438 memcpy (stream->data + stream->current_size, data, size);
2439 stream->current_size += size;
2442 case PENDING_PACKET_DISCONT:
2444 GST_LOG ("DISCONT: not storing/pushing");
2445 if (G_UNLIKELY (stream->data)) {
2446 g_free (stream->data);
2447 stream->data = NULL;
2449 stream->continuity_counter = CONTINUITY_UNSET;
2460 calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream,
2461 MpegTSBaseProgram * target_program)
2463 MpegTSBase *base = (MpegTSBase *) demux;
2464 GstClockTime lowest_pts = GST_CLOCK_TIME_NONE;
2465 GstClockTime firstts = 0;
2468 GST_DEBUG ("Creating new newsegment for stream %p", stream);
2470 if (target_program == NULL)
2471 target_program = demux->program;
2473 /* Speedup : if we don't need to calculate anything, go straight to pushing */
2474 if (demux->segment_event)
2475 goto push_new_segment;
2477 /* Calculate the 'new_start' value, used for newsegment */
2478 for (tmp = target_program->stream_list; tmp; tmp = tmp->next) {
2479 TSDemuxStream *pstream = (TSDemuxStream *) tmp->data;
2481 if (GST_CLOCK_TIME_IS_VALID (pstream->first_pts)) {
2482 if (!GST_CLOCK_TIME_IS_VALID (lowest_pts)
2483 || pstream->first_pts < lowest_pts)
2484 lowest_pts = pstream->first_pts;
2487 if (GST_CLOCK_TIME_IS_VALID (lowest_pts))
2488 firstts = lowest_pts;
2489 GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT,
2490 lowest_pts, GST_TIME_ARGS (firstts));
2492 if (demux->segment.format != GST_FORMAT_TIME || demux->reset_segment) {
2493 /* It will happen only if it's first program or after flushes. */
2494 GST_DEBUG ("Calculating actual segment");
2495 if (base->segment.format == GST_FORMAT_TIME) {
2496 /* Try to recover segment info from base if it's in TIME format */
2497 demux->segment = base->segment;
2499 /* Start from the first ts/pts */
2501 demux->segment.base + demux->segment.position - demux->segment.start;
2502 gst_segment_init (&demux->segment, GST_FORMAT_TIME);
2503 demux->segment.start = firstts;
2504 demux->segment.stop = GST_CLOCK_TIME_NONE;
2505 demux->segment.position = firstts;
2506 demux->segment.time = firstts;
2507 demux->segment.rate = demux->rate;
2508 demux->segment.base = base;
2510 } else if (demux->segment.start < firstts) {
2511 /* Take into account the offset to the first buffer timestamp */
2512 if (demux->segment.rate > 0) {
2513 demux->segment.start = firstts;
2515 if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop))
2516 demux->segment.stop += firstts - demux->segment.start;
2517 demux->segment.position = firstts;
2521 if (!demux->segment_event) {
2522 demux->segment_event = gst_event_new_segment (&demux->segment);
2524 if (base->last_seek_seqnum != GST_SEQNUM_INVALID)
2525 gst_event_set_seqnum (demux->segment_event, base->last_seek_seqnum);
2529 for (tmp = target_program->stream_list; tmp; tmp = tmp->next) {
2530 stream = (TSDemuxStream *) tmp->data;
2531 if (stream->pad == NULL)
2534 if (demux->segment_event) {
2535 GST_DEBUG_OBJECT (stream->pad, "Pushing newsegment event");
2536 gst_event_ref (demux->segment_event);
2537 gst_pad_push_event (stream->pad, demux->segment_event);
2540 if (demux->global_tags) {
2541 gst_pad_push_event (stream->pad,
2542 gst_event_new_tag (gst_tag_list_ref (demux->global_tags)));
2545 /* Push pending tags */
2546 if (stream->taglist) {
2547 GST_DEBUG_OBJECT (stream->pad, "Sending tags %" GST_PTR_FORMAT,
2549 gst_pad_push_event (stream->pad, gst_event_new_tag (stream->taglist));
2550 stream->taglist = NULL;
2553 stream->need_newsegment = FALSE;
2558 gst_ts_demux_check_and_sync_streams (GstTSDemux * demux, GstClockTime time)
2562 GST_DEBUG_OBJECT (demux,
2563 "Recheck streams and sync to at least: %" GST_TIME_FORMAT,
2564 GST_TIME_ARGS (time));
2566 if (G_UNLIKELY (demux->program == NULL))
2569 /* Go over each stream and update it to at least 'time' time.
2570 * For each stream, the pad stores the buffer counter the last time
2571 * a gap check occurred (gap_ref_buffers) and a gap_ref_pts timestamp
2572 * that is either the PTS from the stream or the PCR the pad was updated
2575 * We can check nb_out_buffers to see if any buffers were pushed since then.
2576 * This means we can detect buffers passing without PTSes fine and still generate
2579 * If there haven't been any buffers pushed on this stream since the last
2580 * gap check, push a gap event updating to the indicated input PCR time
2581 * and update the pad's tracking.
2583 * If there have been buffers pushed, update the reference buffer count
2584 * and but don't push a gap event
2586 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
2587 TSDemuxStream *ps = (TSDemuxStream *) tmp->data;
2588 GST_DEBUG_OBJECT (ps->pad,
2589 "0x%04x, PTS:%" GST_TIME_FORMAT " REFPTS:%" GST_TIME_FORMAT " Gap:%"
2590 GST_TIME_FORMAT " nb_buffers: %d (ref:%d)",
2591 ((MpegTSBaseStream *) ps)->pid, GST_TIME_ARGS (ps->pts),
2592 GST_TIME_ARGS (ps->gap_ref_pts),
2593 GST_TIME_ARGS (ps->pts - ps->gap_ref_pts), ps->nb_out_buffers,
2594 ps->gap_ref_buffers);
2595 if (ps->pad == NULL)
2598 if (ps->nb_out_buffers == ps->gap_ref_buffers && ps->gap_ref_pts != ps->pts) {
2599 /* Do initial setup of pad if needed - segment etc */
2600 GST_DEBUG_OBJECT (ps->pad,
2601 "Stream needs update. Pushing GAP event to TS %" GST_TIME_FORMAT,
2602 GST_TIME_ARGS (time));
2603 if (G_UNLIKELY (ps->need_newsegment))
2604 calculate_and_push_newsegment (demux, ps, NULL);
2606 /* Now send gap event */
2607 gst_pad_push_event (ps->pad, gst_event_new_gap (time, 0));
2610 /* Update GAP tracking vars so we don't re-check this stream for a while */
2611 ps->gap_ref_pts = time;
2612 if (ps->pts != GST_CLOCK_TIME_NONE && ps->pts > time)
2613 ps->gap_ref_pts = ps->pts;
2614 ps->gap_ref_buffers = ps->nb_out_buffers;
2618 static GstBufferList *
2619 parse_opus_access_unit (TSDemuxStream * stream)
2621 GstByteReader reader;
2622 GstBufferList *buffer_list = NULL;
2624 buffer_list = gst_buffer_list_new ();
2625 gst_byte_reader_init (&reader, stream->data, stream->current_size);
2632 gboolean start_trim_flag, end_trim_flag, control_extension_flag;
2633 guint16 start_trim = 0, end_trim = 0;
2634 guint8 *packet_data;
2637 if (!gst_byte_reader_get_uint16_be (&reader, &id))
2640 /* No control header */
2641 if ((id >> 5) != 0x3ff)
2645 if (!gst_byte_reader_get_uint8 (&reader, &b))
2648 } while (b == 0xff);
2650 start_trim_flag = (id >> 4) & 0x1;
2651 end_trim_flag = (id >> 3) & 0x1;
2652 control_extension_flag = (id >> 2) & 0x1;
2654 if (start_trim_flag) {
2655 if (!gst_byte_reader_get_uint16_be (&reader, &start_trim))
2659 if (end_trim_flag) {
2660 if (!gst_byte_reader_get_uint16_be (&reader, &end_trim))
2664 if (control_extension_flag) {
2665 if (!gst_byte_reader_get_uint8 (&reader, &b))
2668 if (!gst_byte_reader_skip (&reader, b))
2672 packet_size = au_size;
2674 /* FIXME: this should be
2675 * packet_size = au_size - gst_byte_reader_get_pos (&reader);
2676 * but ffmpeg and the only available sample stream from obe.tv
2677 * are not including the control header size in au_size
2679 if (gst_byte_reader_get_remaining (&reader) < packet_size)
2681 if (!gst_byte_reader_dup_data (&reader, packet_size, &packet_data))
2684 buffer = gst_buffer_new_wrapped (packet_data, packet_size);
2686 if (start_trim != 0 || end_trim != 0) {
2687 gst_buffer_add_audio_clipping_meta (buffer, GST_FORMAT_DEFAULT,
2688 start_trim, end_trim);
2691 gst_buffer_list_add (buffer_list, buffer);
2692 } while (gst_byte_reader_get_remaining (&reader) > 0);
2694 g_free (stream->data);
2695 stream->data = NULL;
2696 stream->current_size = 0;
2702 GST_ERROR ("Failed to parse Opus access unit");
2703 g_free (stream->data);
2704 stream->data = NULL;
2705 stream->current_size = 0;
2707 gst_buffer_list_unref (buffer_list);
2712 /* interlaced mode is disabled at the moment */
2713 /*#define TSDEMUX_JP2K_SUPPORT_INTERLACE */
2715 parse_jp2k_access_unit (TSDemuxStream * stream)
2717 GstByteReader reader;
2721 guint16 den G_GNUC_UNUSED;
2722 guint16 num G_GNUC_UNUSED;
2723 /* Maximum bitrate box */
2724 guint32 MaxBr G_GNUC_UNUSED;
2725 guint32 AUF[2] = { 0, 0 };
2726 #ifdef TSDEMUX_JP2K_SUPPORT_INTERLACE
2727 /* Field Coding Box */
2728 guint8 Fic G_GNUC_UNUSED = 1;
2729 guint8 Fio G_GNUC_UNUSED = 0;
2730 /* header size equals 38 for non-interlaced, and 48 for interlaced */
2731 guint header_size = stream->jp2kInfos.interlace ? 48 : 38;
2733 /* header size equals 38 for non-interlaced, and 48 for interlaced */
2734 guint header_size = 38;
2737 guint32 HHMMSSFF G_GNUC_UNUSED;
2738 /* Broadcast color box */
2739 guint8 CollC G_GNUC_UNUSED;
2740 guint8 b G_GNUC_UNUSED;
2742 guint data_location;
2743 GstBuffer *retbuf = NULL;
2745 if (stream->current_size < header_size) {
2746 GST_ERROR_OBJECT (stream->pad, "Not enough data for header");
2750 gst_byte_reader_init (&reader, stream->data, stream->current_size);
2752 /* Check for the location of the jp2k magic */
2754 gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, 0xff4fff51, 0,
2755 stream->current_size);
2756 GST_DEBUG_OBJECT (stream->pad, "data location %d", data_location);
2757 if (data_location == -1) {
2758 GST_ERROR_OBJECT (stream->pad, "Stream does not contain jp2k magic header");
2762 /* Elementary stream header box 'elsm' == 0x656c736d */
2763 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2764 if (header_tag != 0x656c736d) {
2765 GST_ERROR_OBJECT (stream->pad, "Expected ELSM box but found box %x instead",
2769 /* Frame rate box 'frat' == 0x66726174 */
2770 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2771 if (header_tag != 0x66726174) {
2772 GST_ERROR_OBJECT (stream->pad,
2773 "Expected frame rate box, but found box %x instead", header_tag);
2777 den = gst_byte_reader_get_uint16_be_unchecked (&reader);
2778 num = gst_byte_reader_get_uint16_be_unchecked (&reader);
2779 /* Maximum bit rate box 'brat' == 0x62726174 */
2780 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2781 if (header_tag != 0x62726174) {
2782 GST_ERROR_OBJECT (stream->pad, "Expected brat box but read box %x instead",
2787 MaxBr = gst_byte_reader_get_uint32_be_unchecked (&reader);
2788 AUF[0] = gst_byte_reader_get_uint32_be_unchecked (&reader);
2789 if (stream->jp2kInfos.interlace) {
2790 #ifdef TSDEMUX_JP2K_SUPPORT_INTERLACE
2791 AUF[1] = gst_byte_reader_get_uint32_be_unchecked (&reader);
2792 /* Field Coding Box 'fiel' == 0x6669656c */
2793 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2794 if (header_tag != 0x6669656c) {
2795 GST_ERROR_OBJECT (stream->pad,
2796 "Expected Field Coding box but found box %x instead", header_tag);
2799 Fic = gst_byte_reader_get_uint8_unchecked (&reader);
2800 Fio = gst_byte_reader_get_uint8_unchecked (&reader);
2802 GST_ERROR_OBJECT (stream->pad, "interlaced mode not supported");
2807 /* Time Code Box 'tcod' == 0x74636f64 */
2808 /* Some progressive streams might have a AUF[1] of value 0 present */
2809 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2810 if (header_tag == 0 && !stream->jp2kInfos.interlace) {
2811 AUF[1] = header_tag;
2812 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2813 /* Bump up header size and recheck */
2815 if (stream->current_size < header_size) {
2816 GST_ERROR_OBJECT (stream->pad, "Not enough data for header");
2820 if (header_tag != 0x74636f64) {
2821 GST_ERROR_OBJECT (stream->pad,
2822 "Expected Time code box but found %d box instead", header_tag);
2825 HHMMSSFF = gst_byte_reader_get_uint32_be_unchecked (&reader);
2826 /* Broadcast Color Box 'bcol' == 0x6263686c */
2827 header_tag = gst_byte_reader_get_uint32_be_unchecked (&reader);
2828 if (header_tag != 0x62636f6c) {
2829 GST_ERROR_OBJECT (stream->pad,
2830 "Expected Broadcast color box but found %x box instead", header_tag);
2833 CollC = gst_byte_reader_get_uint8_unchecked (&reader);
2834 b = gst_byte_reader_get_uint8_unchecked (&reader);
2836 /* Check if we have enough data to create a valid buffer */
2837 if ((stream->current_size - data_location) < (AUF[0] + AUF[1])) {
2838 GST_ERROR ("Required size (%d) greater than remaining size in buffer (%d)",
2839 AUF[0] + AUF[1], (stream->current_size - data_location));
2843 retbuf = gst_buffer_new_wrapped_full (0, stream->data, stream->current_size,
2844 data_location, stream->current_size - data_location,
2845 stream->data, g_free);
2846 stream->data = NULL;
2847 stream->current_size = 0;
2851 GST_ERROR ("Failed to parse JP2K access unit");
2852 g_free (stream->data);
2853 stream->data = NULL;
2854 stream->current_size = 0;
2858 static GstFlowReturn
2859 gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
2860 MpegTSBaseProgram * target_program)
2862 GstFlowReturn res = GST_FLOW_OK;
2863 MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
2864 GstBuffer *buffer = NULL;
2865 GstBufferList *buffer_list = NULL;
2868 GST_DEBUG_OBJECT (stream->pad,
2869 "stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid,
2870 bs->stream_type, stream->state);
2872 if (G_UNLIKELY (stream->data == NULL)) {
2873 GST_LOG ("stream->data == NULL");
2877 if (G_UNLIKELY (stream->state == PENDING_PACKET_EMPTY)) {
2878 GST_LOG ("EMPTY: returning");
2882 if (G_UNLIKELY (stream->state != PENDING_PACKET_BUFFER)) {
2883 GST_LOG ("state:%d, returning", stream->state);
2887 if (G_UNLIKELY (demux->program == NULL)) {
2888 GST_LOG_OBJECT (demux, "No program");
2889 g_free (stream->data);
2893 if (stream->needs_keyframe) {
2894 MpegTSBase *base = (MpegTSBase *) demux;
2896 if ((gst_ts_demux_adjust_seek_offset_for_keyframe (stream, stream->data,
2897 stream->current_size)) || demux->last_seek_offset == 0) {
2898 GST_DEBUG_OBJECT (stream->pad,
2899 "Got Keyframe, ready to go at %" GST_TIME_FORMAT,
2900 GST_TIME_ARGS (stream->pts));
2902 if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
2903 bs->registration_id == DRF_ID_OPUS) {
2904 buffer_list = parse_opus_access_unit (stream);
2906 res = GST_FLOW_ERROR;
2910 if (gst_buffer_list_length (buffer_list) == 1) {
2911 buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
2912 gst_buffer_list_unref (buffer_list);
2915 } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) {
2916 buffer = parse_jp2k_access_unit (stream);
2918 res = GST_FLOW_ERROR;
2922 buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
2925 stream->seeked_pts = stream->pts;
2926 stream->seeked_dts = stream->dts;
2927 stream->needs_keyframe = FALSE;
2929 base->seek_offset = demux->last_seek_offset - 200 * base->packetsize;
2930 if (demux->last_seek_offset < 200 * base->packetsize)
2931 base->seek_offset = 0;
2932 demux->last_seek_offset = base->seek_offset;
2933 mpegts_packetizer_flush (base->packetizer, FALSE);
2934 base->mode = BASE_MODE_SEEKING;
2936 stream->continuity_counter = CONTINUITY_UNSET;
2937 res = GST_FLOW_REWINDING;
2938 g_free (stream->data);
2942 if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
2943 bs->registration_id == DRF_ID_OPUS) {
2944 buffer_list = parse_opus_access_unit (stream);
2946 res = GST_FLOW_ERROR;
2950 if (gst_buffer_list_length (buffer_list) == 1) {
2951 buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
2952 gst_buffer_list_unref (buffer_list);
2955 } else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) {
2956 buffer = parse_jp2k_access_unit (stream);
2958 res = GST_FLOW_ERROR;
2962 buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
2965 if (G_UNLIKELY (stream->pending_ts && !check_pending_buffers (demux))) {
2967 PendingBuffer *pend;
2968 pend = g_slice_new0 (PendingBuffer);
2969 pend->buffer = buffer;
2970 pend->pts = stream->raw_pts;
2971 pend->dts = stream->raw_dts;
2972 stream->pending = g_list_append (stream->pending, pend);
2976 n = gst_buffer_list_length (buffer_list);
2977 for (i = 0; i < n; i++) {
2978 PendingBuffer *pend;
2979 pend = g_slice_new0 (PendingBuffer);
2980 pend->buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, i));
2981 pend->pts = i == 0 ? stream->raw_pts : -1;
2982 pend->dts = i == 0 ? stream->raw_dts : -1;
2983 stream->pending = g_list_append (stream->pending, pend);
2985 gst_buffer_list_unref (buffer_list);
2987 GST_DEBUG ("Not enough information to push buffers yet, storing buffer");
2992 if (G_UNLIKELY (stream->need_newsegment))
2993 calculate_and_push_newsegment (demux, stream, target_program);
2995 /* FIXME : Push pending buffers if any */
2996 if (G_UNLIKELY (stream->pending)) {
2998 for (tmp = stream->pending; tmp; tmp = tmp->next) {
2999 PendingBuffer *pend = (PendingBuffer *) tmp->data;
3001 GST_DEBUG_OBJECT (stream->pad,
3002 "Pushing pending buffer PTS:%" GST_TIME_FORMAT " DTS:%"
3003 GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (pend->buffer)),
3004 GST_TIME_ARGS (GST_BUFFER_DTS (pend->buffer)));
3006 if (stream->discont)
3007 GST_BUFFER_FLAG_SET (pend->buffer, GST_BUFFER_FLAG_DISCONT);
3008 stream->discont = FALSE;
3010 res = gst_pad_push (stream->pad, pend->buffer);
3011 stream->nb_out_buffers += 1;
3012 g_slice_free (PendingBuffer, pend);
3014 g_list_free (stream->pending);
3015 stream->pending = NULL;
3018 if ((GST_CLOCK_TIME_IS_VALID (stream->seeked_pts)
3019 && stream->pts < stream->seeked_pts) ||
3020 (GST_CLOCK_TIME_IS_VALID (stream->seeked_dts) &&
3021 stream->pts < stream->seeked_dts)) {
3022 GST_INFO_OBJECT (stream->pad,
3023 "Droping with PTS: %" GST_TIME_FORMAT " DTS: %" GST_TIME_FORMAT
3024 " after seeking as other stream needed to be seeked further"
3025 "(seeked PTS: %" GST_TIME_FORMAT " DTS: %" GST_TIME_FORMAT ")",
3026 GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (stream->dts),
3027 GST_TIME_ARGS (stream->seeked_pts), GST_TIME_ARGS (stream->seeked_dts));
3029 gst_buffer_unref (buffer);
3031 gst_buffer_list_unref (buffer_list);
3035 GST_DEBUG_OBJECT (stream->pad, "stream->pts %" GST_TIME_FORMAT,
3036 GST_TIME_ARGS (stream->pts));
3038 /* Decorate buffer or first buffer of the buffer list */
3040 buffer = gst_buffer_list_get (buffer_list, 0);
3042 if (GST_CLOCK_TIME_IS_VALID (stream->pts))
3043 GST_BUFFER_PTS (buffer) = stream->pts;
3044 if (GST_CLOCK_TIME_IS_VALID (stream->dts))
3045 GST_BUFFER_DTS (buffer) = stream->dts;
3047 if (stream->discont)
3048 GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
3049 stream->discont = FALSE;
3054 GST_DEBUG_OBJECT (stream->pad,
3055 "Pushing buffer%s with PTS: %" GST_TIME_FORMAT " , DTS: %"
3056 GST_TIME_FORMAT, (buffer_list ? "list" : ""), GST_TIME_ARGS (stream->pts),
3057 GST_TIME_ARGS (stream->dts));
3059 if (GST_CLOCK_TIME_IS_VALID (stream->dts))
3060 demux->segment.position = stream->dts;
3061 else if (GST_CLOCK_TIME_IS_VALID (stream->pts))
3062 demux->segment.position = stream->pts;
3065 res = gst_pad_push (stream->pad, buffer);
3066 /* Record that a buffer was pushed */
3067 stream->nb_out_buffers += 1;
3069 guint n = gst_buffer_list_length (buffer_list);
3070 res = gst_pad_push_list (stream->pad, buffer_list);
3071 /* Record that a buffer was pushed */
3072 stream->nb_out_buffers += n;
3074 GST_DEBUG_OBJECT (stream->pad, "Returned %s", gst_flow_get_name (res));
3075 res = gst_flow_combiner_update_flow (demux->flowcombiner, res);
3076 GST_DEBUG_OBJECT (stream->pad, "combined %s", gst_flow_get_name (res));
3078 /* GAP / sparse stream tracking */
3079 if (G_UNLIKELY (stream->gap_ref_pts == GST_CLOCK_TIME_NONE))
3080 stream->gap_ref_pts = stream->pts;
3082 /* Look if the stream PTS has advanced 2 seconds since the last
3083 * gap check, and sync streams if it has. The first stream to
3084 * hit this will trigger a gap check */
3085 if (G_UNLIKELY (stream->pts != GST_CLOCK_TIME_NONE &&
3086 stream->pts > stream->gap_ref_pts + 2 * GST_SECOND)) {
3087 if (demux->program->pcr_pid != 0x1fff) {
3088 GstClockTime curpcr =
3089 mpegts_packetizer_get_current_time (MPEG_TS_BASE_PACKETIZER (demux),
3090 demux->program->pcr_pid);
3091 if (curpcr == GST_CLOCK_TIME_NONE || curpcr < 800 * GST_MSECOND)
3093 curpcr -= 800 * GST_MSECOND;
3094 /* Use the current PCR (with a safety margin) to sync against */
3095 gst_ts_demux_check_and_sync_streams (demux, curpcr);
3097 /* If we don't have a PCR track, just use the current stream PTS */
3098 gst_ts_demux_check_and_sync_streams (demux, stream->pts);
3104 /* Reset the PES payload collection, but don't clear the state,
3105 * we might want to keep collecting this PES */
3106 GST_LOG ("Cleared PES data. returning %s", gst_flow_get_name (res));
3107 if (stream->expected_size) {
3108 if (stream->current_size > stream->expected_size)
3109 stream->expected_size = 0;
3111 stream->expected_size -= stream->current_size;
3113 stream->data = NULL;
3114 stream->allocated_size = 0;
3115 stream->current_size = 0;
3120 static GstFlowReturn
3121 gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream,
3122 MpegTSPacketizerPacket * packet, GstMpegtsSection * section)
3124 GstFlowReturn res = GST_FLOW_OK;
3126 GST_LOG ("pid 0x%04x pusi:%d, afc:%d, cont:%d, payload:%p", packet->pid,
3127 packet->payload_unit_start_indicator, packet->scram_afc_cc & 0x30,
3128 FLAGS_CONTINUITY_COUNTER (packet->scram_afc_cc), packet->payload);
3130 if (G_UNLIKELY (packet->payload_unit_start_indicator) &&
3131 FLAGS_HAS_PAYLOAD (packet->scram_afc_cc)) {
3132 /* Flush previous data */
3133 res = gst_ts_demux_push_pending_data (demux, stream, NULL);
3134 /* Tell the data collecting to expect this header */
3135 stream->state = PENDING_PACKET_HEADER;
3138 if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)
3140 gst_ts_demux_queue_data (demux, stream, packet);
3141 GST_LOG ("current_size:%d, expected_size:%d",
3142 stream->current_size, stream->expected_size);
3143 /* Finally check if the data we queued completes a packet, or got too
3144 * large and needs output now */
3145 if ((stream->expected_size && stream->current_size >= stream->expected_size)
3146 || (stream->current_size >= MAX_PES_PAYLOAD)) {
3147 GST_LOG ("pushing packet of size %u", stream->current_size);
3148 res = gst_ts_demux_push_pending_data (demux, stream, NULL);
3152 /* We are rewinding to find a keyframe,
3153 * and didn't want the data to be queued
3155 if (res == GST_FLOW_REWINDING)
3162 gst_ts_demux_flush (MpegTSBase * base, gboolean hard)
3164 GstTSDemux *demux = GST_TS_DEMUX_CAST (base);
3166 gst_ts_demux_flush_streams (demux, hard);
3168 if (demux->segment_event) {
3169 gst_event_unref (demux->segment_event);
3170 demux->segment_event = NULL;
3172 if (demux->global_tags) {
3173 gst_tag_list_unref (demux->global_tags);
3174 demux->global_tags = NULL;
3177 /* For pull mode seeks the current segment needs to be preserved */
3179 gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
3183 static GstFlowReturn
3184 gst_ts_demux_drain (MpegTSBase * base)
3186 GstTSDemux *demux = GST_TS_DEMUX_CAST (base);
3188 GstFlowReturn res = GST_FLOW_OK;
3190 if (!demux->program)
3193 for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) {
3194 TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
3196 res = gst_ts_demux_push_pending_data (demux, stream, NULL);
3197 if (G_UNLIKELY (res != GST_FLOW_OK))
3205 static GstFlowReturn
3206 gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet,
3207 GstMpegtsSection * section)
3209 GstTSDemux *demux = GST_TS_DEMUX_CAST (base);
3210 TSDemuxStream *stream = NULL;
3211 GstFlowReturn res = GST_FLOW_OK;
3213 if (G_LIKELY (demux->program)) {
3214 stream = (TSDemuxStream *) demux->program->streams[packet->pid];
3217 res = gst_ts_demux_handle_packet (demux, stream, packet, section);
3224 gst_ts_demux_plugin_init (GstPlugin * plugin)
3226 GST_DEBUG_CATEGORY_INIT (ts_demux_debug, "tsdemux", 0,
3227 "MPEG transport stream demuxer");
3230 return gst_element_register (plugin, "tsdemux",
3231 GST_RANK_PRIMARY, GST_TYPE_TS_DEMUX);