Update to 1.12.1
This commit is contained in:
parent
1aa14e53b3
commit
41da0862df
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
||||
/gst-plugins-bad-1.10.0.tar.xz
|
||||
/gst-plugins-bad-free-1.10.0.tar.xz
|
||||
/gst-plugins-bad-free-1.11.1.tar.xz
|
||||
/gst-plugins-bad-free-1.12.1.tar.xz
|
||||
|
@ -1,24 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
|
||||
Date: Fri, 20 Jan 2017 07:51:09 +0200
|
||||
Subject: [PATCH] mxfdemux: Set stream tags to NULL after unreffing
|
||||
|
||||
Otherwise we might try to unref them a second time a little bit later.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=777503
|
||||
---
|
||||
gst/mxf/mxfdemux.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
|
||||
index a380f6d..54ceec1 100644
|
||||
--- a/gst/mxf/mxfdemux.c
|
||||
+++ b/gst/mxf/mxfdemux.c
|
||||
@@ -835,6 +835,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
|
||||
etrack->mapping_data = NULL;
|
||||
if (etrack->tags)
|
||||
gst_tag_list_unref (etrack->tags);
|
||||
+ etrack->tags = NULL;
|
||||
goto next;
|
||||
} else if (!caps) {
|
||||
GST_WARNING_OBJECT (demux, "Couldn't create updated caps for stream");
|
@ -1,948 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Schmidt <jan@centricular.com>
|
||||
Date: Wed, 1 Feb 2017 14:25:32 +1100
|
||||
Subject: [PATCH] psdemux: Rewrite PSM parsing using GstByteReader
|
||||
|
||||
Avoid possible buffer overflows and ignore invalid PSM packets better
|
||||
by using GstByteReader.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=777957
|
||||
---
|
||||
gst/mpegdemux/Makefile.am | 2 +-
|
||||
gst/mpegdemux/gstmpegdemux.c | 322 ++++++++++++++++---------------------------
|
||||
2 files changed, 117 insertions(+), 207 deletions(-)
|
||||
|
||||
diff --git a/gst/mpegdemux/Makefile.am b/gst/mpegdemux/Makefile.am
|
||||
index df59955..dd43134 100644
|
||||
--- a/gst/mpegdemux/Makefile.am
|
||||
+++ b/gst/mpegdemux/Makefile.am
|
||||
@@ -11,7 +11,7 @@ libgstmpegpsdemux_la_CFLAGS = \
|
||||
libgstmpegpsdemux_la_LIBADD = \
|
||||
$(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) \
|
||||
-lgstpbutils-$(GST_API_VERSION) \
|
||||
- $(GST_BASE_LIBS) $(GST_LIBS)
|
||||
+ $(GST_BASE_LIBS) -lgstbase-$(GST_API_VERSION) $(GST_LIBS)
|
||||
libgstmpegpsdemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||
libgstmpegpsdemux_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
|
||||
|
||||
diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c
|
||||
index b608db8..755e8e6 100644
|
||||
--- a/gst/mpegdemux/gstmpegdemux.c
|
||||
+++ b/gst/mpegdemux/gstmpegdemux.c
|
||||
@@ -50,6 +50,7 @@
|
||||
|
||||
#include <gst/tag/tag.h>
|
||||
#include <gst/pbutils/pbutils.h>
|
||||
+#include <gst/base/gstbytereader.h>
|
||||
|
||||
#include "gstmpegdefs.h"
|
||||
#include "gstmpegdemux.h"
|
||||
@@ -2062,42 +2063,48 @@ need_more_data:
|
||||
static GstFlowReturn
|
||||
gst_ps_demux_parse_psm (GstPsDemux * demux)
|
||||
{
|
||||
- guint16 length = 0, info_length = 0, es_map_length = 0;
|
||||
+ guint16 psm_length, info_length = 0, es_map_length = 0;
|
||||
guint8 psm_version = 0;
|
||||
- const guint8 *data, *es_map_base;
|
||||
+ GstByteReader br;
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
gboolean applicable;
|
||||
#endif
|
||||
|
||||
+ /* Need at least 6 bytes for start code + length */
|
||||
if (gst_adapter_available (demux->adapter) < 6)
|
||||
goto need_more_data;
|
||||
|
||||
- /* start code + length */
|
||||
- data = gst_adapter_map (demux->adapter, 6);
|
||||
-
|
||||
- /* skip start code */
|
||||
- data += 4;
|
||||
+ {
|
||||
+ const guint8 *data;
|
||||
|
||||
- length = GST_READ_UINT16_BE (data);
|
||||
- GST_DEBUG_OBJECT (demux, "length %u", length);
|
||||
+ /* start code + length */
|
||||
+ data = gst_adapter_map (demux->adapter, 6);
|
||||
+ /* skip start code */
|
||||
+ data += 4;
|
||||
+ psm_length = GST_READ_UINT16_BE (data);
|
||||
+ GST_DEBUG_OBJECT (demux, "PSM length %u", psm_length);
|
||||
|
||||
- if (G_UNLIKELY (length > 0x3FA))
|
||||
- goto psm_len_error;
|
||||
+ if (G_UNLIKELY (psm_length > 0x3FA))
|
||||
+ goto psm_len_error;
|
||||
+ psm_length += 6; /* Add start code + size to length */
|
||||
|
||||
- length += 6;
|
||||
+ gst_adapter_unmap (demux->adapter);
|
||||
|
||||
- gst_adapter_unmap (demux->adapter);
|
||||
+ if (gst_adapter_available (demux->adapter) < psm_length)
|
||||
+ goto need_more_data;
|
||||
|
||||
- if (gst_adapter_available (demux->adapter) < length)
|
||||
- goto need_more_data;
|
||||
+ data = gst_adapter_map (demux->adapter, psm_length);
|
||||
|
||||
- data = gst_adapter_map (demux->adapter, length);
|
||||
+ gst_byte_reader_init (&br, data, psm_length);
|
||||
+ }
|
||||
|
||||
/* skip start code and length */
|
||||
- data += 6;
|
||||
+ if (!gst_byte_reader_skip (&br, 6))
|
||||
+ goto fail_invalid;
|
||||
|
||||
/* Read PSM applicable bit together with version */
|
||||
- psm_version = GST_READ_UINT8 (data);
|
||||
+ if (!gst_byte_reader_get_uint8 (&br, &psm_version))
|
||||
+ goto fail_invalid;
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
applicable = (psm_version & 0x80) >> 7;
|
||||
#endif
|
||||
@@ -2105,62 +2112,70 @@ gst_ps_demux_parse_psm (GstPsDemux * demux)
|
||||
GST_DEBUG_OBJECT (demux, "PSM version %u (applicable now %u)", psm_version,
|
||||
applicable);
|
||||
|
||||
- /* Jump over version and marker bit */
|
||||
- data += 2;
|
||||
+ /* Jump over the next byte (marker bit) */
|
||||
+ if (!gst_byte_reader_skip (&br, 1))
|
||||
+ goto fail_invalid;
|
||||
|
||||
/* Read PS info length */
|
||||
- info_length = GST_READ_UINT16_BE (data);
|
||||
- /* Cap it to PSM length - needed bytes for ES map length and CRC */
|
||||
- info_length = MIN (length - 16, info_length);
|
||||
+ if (!gst_byte_reader_get_uint16_be (&br, &info_length))
|
||||
+ goto fail_invalid;
|
||||
GST_DEBUG_OBJECT (demux, "PS info length %u bytes", info_length);
|
||||
-
|
||||
- /* Jump over that section */
|
||||
- data += (2 + info_length);
|
||||
+ /* Skip the PS info, we don't use it */
|
||||
+ if (!gst_byte_reader_skip (&br, info_length))
|
||||
+ goto fail_invalid;
|
||||
|
||||
/* Read ES map length */
|
||||
- es_map_length = GST_READ_UINT16_BE (data);
|
||||
- /* Cap it to PSM remaining length - CRC */
|
||||
- es_map_length = MIN (length - (16 + info_length), es_map_length);
|
||||
+ if (!gst_byte_reader_get_uint16_be (&br, &es_map_length))
|
||||
+ goto fail_invalid;
|
||||
GST_DEBUG_OBJECT (demux, "ES map length %u bytes", es_map_length);
|
||||
|
||||
- /* Jump over the size */
|
||||
- data += 2;
|
||||
-
|
||||
/* Now read the ES map */
|
||||
- es_map_base = data;
|
||||
- while (es_map_base + 4 <= data + es_map_length) {
|
||||
- guint8 stream_type = 0, stream_id = 0;
|
||||
- guint16 stream_info_length = 0;
|
||||
-
|
||||
- stream_type = GST_READ_UINT8 (es_map_base);
|
||||
- es_map_base++;
|
||||
- stream_id = GST_READ_UINT8 (es_map_base);
|
||||
- es_map_base++;
|
||||
- stream_info_length = GST_READ_UINT16_BE (es_map_base);
|
||||
- es_map_base += 2;
|
||||
- /* Cap stream_info_length */
|
||||
- stream_info_length = MIN (data + es_map_length - es_map_base,
|
||||
- stream_info_length);
|
||||
-
|
||||
- GST_DEBUG_OBJECT (demux, "Stream type %02X with id %02X and %u bytes info",
|
||||
- stream_type, stream_id, stream_info_length);
|
||||
- if (G_LIKELY (stream_id != 0xbd))
|
||||
- demux->psm[stream_id] = stream_type;
|
||||
- else {
|
||||
- /* Ignore stream type for private_stream_1 and discover it looking at
|
||||
- * the stream data.
|
||||
- * Fixes demuxing some clips with lpcm that was wrongly declared as
|
||||
- * mpeg audio */
|
||||
- GST_DEBUG_OBJECT (demux, "stream type for private_stream_1 ignored");
|
||||
+ {
|
||||
+ GstByteReader es_map_br;
|
||||
+ if (!gst_byte_reader_get_sub_reader (&br, &es_map_br, es_map_length))
|
||||
+ goto fail_invalid;
|
||||
+
|
||||
+ while (gst_byte_reader_get_remaining (&es_map_br) >= 4) {
|
||||
+ guint8 stream_type = 0, stream_id = 0;
|
||||
+ guint16 stream_info_length = 0;
|
||||
+
|
||||
+ if (!gst_byte_reader_get_uint8 (&es_map_br, &stream_type) ||
|
||||
+ !gst_byte_reader_get_uint8 (&es_map_br, &stream_id) ||
|
||||
+ !gst_byte_reader_get_uint16_be (&es_map_br, &stream_info_length))
|
||||
+ break;
|
||||
+
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "Stream type %02X with id %02X and %u bytes info", stream_type,
|
||||
+ stream_id, stream_info_length);
|
||||
+
|
||||
+ if (G_LIKELY (stream_id != 0xbd))
|
||||
+ demux->psm[stream_id] = stream_type;
|
||||
+ else {
|
||||
+ /* Ignore stream type for private_stream_1 and discover it looking at
|
||||
+ * the stream data.
|
||||
+ * Fixes demuxing some clips with lpcm that was wrongly declared as
|
||||
+ * mpeg audio */
|
||||
+ GST_DEBUG_OBJECT (demux, "stream type for private_stream_1 ignored");
|
||||
+ }
|
||||
+
|
||||
+ /* FIXME: We could use the descriptors instead of skipping them */
|
||||
+ if (!gst_byte_reader_skip (&es_map_br, stream_info_length))
|
||||
+ break;
|
||||
}
|
||||
- es_map_base += stream_info_length;
|
||||
}
|
||||
+ /* We ignore the 4-byte CRC at the end */
|
||||
|
||||
gst_adapter_unmap (demux->adapter);
|
||||
- gst_adapter_flush (demux->adapter, length);
|
||||
- ADAPTER_OFFSET_FLUSH (length);
|
||||
+ gst_adapter_flush (demux->adapter, psm_length);
|
||||
+ ADAPTER_OFFSET_FLUSH (psm_length);
|
||||
return GST_FLOW_OK;
|
||||
|
||||
+fail_invalid:
|
||||
+ GST_DEBUG_OBJECT (demux, "Failed to parse PSM. Skipping");
|
||||
+ gst_adapter_unmap (demux->adapter);
|
||||
+ gst_adapter_flush (demux->adapter, psm_length);
|
||||
+ ADAPTER_OFFSET_FLUSH (psm_length);
|
||||
+ return GST_FLOW_LOST_SYNC;
|
||||
psm_len_error:
|
||||
{
|
||||
GST_DEBUG_OBJECT (demux, "error in PSM length");
|
||||
@@ -2191,13 +2206,10 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
GstMapInfo map;
|
||||
gsize datalen;
|
||||
guint offset = 0;
|
||||
-
|
||||
gst_buffer_map (buffer, &map, GST_MAP_READ);
|
||||
datalen = map.size;
|
||||
-
|
||||
start_code = filter->start_code;
|
||||
id = filter->id;
|
||||
-
|
||||
if (first) {
|
||||
/* find the stream type */
|
||||
stream_type = demux->psm[id];
|
||||
@@ -2208,7 +2220,6 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
* (see ftp://ftp.mplayerhq.hu/MPlayer/samples/MPEG-VOB/vdr-AC3) */
|
||||
if (datalen >= 4) {
|
||||
guint hdr = GST_READ_UINT32_BE (map.data);
|
||||
-
|
||||
if (G_UNLIKELY ((hdr & 0xffff0000) == AC3_SYNC_WORD)) {
|
||||
id = 0x80;
|
||||
stream_type = demux->psm[id] = ST_GST_AUDIO_RAWA52;
|
||||
@@ -2220,10 +2231,8 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
/* new id is in the first byte */
|
||||
id = map.data[offset++];
|
||||
datalen--;
|
||||
-
|
||||
/* and remap */
|
||||
stream_type = demux->psm[id];
|
||||
-
|
||||
/* Now, if it's a subpicture stream - no more, otherwise
|
||||
* take the first byte too, since it's the frame count in audio
|
||||
* streams and our backwards compat convention is to strip it off */
|
||||
@@ -2231,7 +2240,6 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
/* Number of audio frames in this packet */
|
||||
#ifndef GST_DISABLE_GST_DEBUG
|
||||
guint8 nframes;
|
||||
-
|
||||
nframes = map.data[offset];
|
||||
GST_LOG_OBJECT (demux, "private type 0x%02x, %d frames", id,
|
||||
nframes);
|
||||
@@ -2239,8 +2247,8 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
offset++;
|
||||
datalen--;
|
||||
} else {
|
||||
- GST_LOG_OBJECT (demux, "private type 0x%02x, stream type %d", id,
|
||||
- stream_type);
|
||||
+ GST_LOG_OBJECT (demux, "private type 0x%02x, stream type %d",
|
||||
+ id, stream_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2253,7 +2261,6 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
" (%" G_GUINT64_FORMAT ")", id, filter->pts, demux->next_pts);
|
||||
} else
|
||||
demux->next_pts = G_MAXUINT64;
|
||||
-
|
||||
if (filter->dts != -1) {
|
||||
demux->next_dts = filter->dts + demux->scr_adjust;
|
||||
GST_LOG_OBJECT (demux, "stream 0x%02x DTS = orig %" G_GUINT64_FORMAT
|
||||
@@ -2290,7 +2297,6 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
if (demux->current_stream->notlinked == FALSE) {
|
||||
out_buf =
|
||||
gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL, offset, datalen);
|
||||
-
|
||||
ret = gst_ps_demux_send_data (demux, demux->current_stream, out_buf);
|
||||
if (ret == GST_FLOW_NOT_LINKED) {
|
||||
demux->current_stream->notlinked = TRUE;
|
||||
@@ -2300,9 +2306,7 @@ gst_ps_demux_data_cb (GstPESFilter * filter, gboolean first,
|
||||
done:
|
||||
gst_buffer_unmap (buffer, &map);
|
||||
gst_buffer_unref (buffer);
|
||||
-
|
||||
return ret;
|
||||
-
|
||||
/* ERRORS */
|
||||
unknown_stream_type:
|
||||
{
|
||||
@@ -2320,17 +2324,13 @@ gst_ps_demux_resync (GstPsDemux * demux, gboolean save)
|
||||
guint32 code;
|
||||
gint offset;
|
||||
gboolean found;
|
||||
-
|
||||
avail = gst_adapter_available (demux->adapter);
|
||||
if (G_UNLIKELY (avail < 4))
|
||||
goto need_data;
|
||||
-
|
||||
/* Common case, read 4 bytes an check it */
|
||||
data = gst_adapter_map (demux->adapter, 4);
|
||||
-
|
||||
/* read currect code */
|
||||
code = GST_READ_UINT32_BE (data);
|
||||
-
|
||||
/* The common case is that the sync code is at 0 bytes offset */
|
||||
if (G_LIKELY ((code & 0xffffff00) == 0x100L)) {
|
||||
GST_LOG_OBJECT (demux, "Found resync code %08x after 0 bytes", code);
|
||||
@@ -2344,16 +2344,12 @@ gst_ps_demux_resync (GstPsDemux * demux, gboolean save)
|
||||
offset = 4;
|
||||
if (offset >= avail)
|
||||
goto need_data; /* Not enough data to find sync */
|
||||
-
|
||||
data = gst_adapter_map (demux->adapter, avail);
|
||||
-
|
||||
do {
|
||||
code = (code << 8) | data[offset++];
|
||||
found = (code & 0xffffff00) == 0x100L;
|
||||
} while (offset < avail && !found);
|
||||
-
|
||||
gst_adapter_unmap (demux->adapter);
|
||||
-
|
||||
if (!save || demux->sink_segment.rate >= 0.0) {
|
||||
GST_LOG_OBJECT (demux, "flushing %d bytes", offset - 4);
|
||||
/* forward playback, we can discard and flush the skipped bytes */
|
||||
@@ -2384,7 +2380,6 @@ gst_ps_demux_resync (GstPsDemux * demux, gboolean save)
|
||||
}
|
||||
|
||||
return found;
|
||||
-
|
||||
need_data:
|
||||
{
|
||||
GST_LOG_OBJECT (demux, "we need more data for resync %d", avail);
|
||||
@@ -2409,42 +2404,32 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
guint64 pts, dts;
|
||||
guint32 code;
|
||||
guint16 len;
|
||||
-
|
||||
/* read the 4 bytes for the sync code */
|
||||
code = GST_READ_UINT32_BE (data);
|
||||
if (G_LIKELY (code != ID_PS_PACK_START_CODE))
|
||||
goto beach;
|
||||
-
|
||||
/* skip start code */
|
||||
data += 4;
|
||||
-
|
||||
scr1 = GST_READ_UINT32_BE (data);
|
||||
scr2 = GST_READ_UINT32_BE (data + 4);
|
||||
-
|
||||
/* start parsing the stream */
|
||||
if ((*data & 0xc0) == 0x40) {
|
||||
/* MPEG-2 PACK header */
|
||||
guint32 scr_ext;
|
||||
guint32 next32;
|
||||
guint8 stuffing_bytes;
|
||||
-
|
||||
/* :2=01 ! scr:3 ! marker:1==1 ! scr:15 ! marker:1==1 ! scr:15 */
|
||||
-
|
||||
/* check markers */
|
||||
if ((scr1 & 0xc4000400) != 0x44000400)
|
||||
goto beach;
|
||||
-
|
||||
scr = ((guint64) scr1 & 0x38000000) << 3;
|
||||
scr |= ((guint64) scr1 & 0x03fff800) << 4;
|
||||
scr |= ((guint64) scr1 & 0x000003ff) << 5;
|
||||
scr |= ((guint64) scr2 & 0xf8000000) >> 27;
|
||||
-
|
||||
/* marker:1==1 ! scr_ext:9 ! marker:1==1 */
|
||||
if ((scr2 & 0x04010000) != 0x04010000)
|
||||
goto beach;
|
||||
-
|
||||
scr_ext = (scr2 & 0x03fe0000) >> 17;
|
||||
-
|
||||
if (scr_ext) {
|
||||
scr = (scr * 300 + scr_ext % 300) / 300;
|
||||
}
|
||||
@@ -2455,7 +2440,6 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
next32 = GST_READ_UINT32_BE (data);
|
||||
if ((next32 & 0x00000300) != 0x00000300)
|
||||
goto beach;
|
||||
-
|
||||
stuffing_bytes = (next32 & 0x07);
|
||||
data += 4;
|
||||
while (stuffing_bytes--) {
|
||||
@@ -2467,10 +2451,8 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
/* check markers */
|
||||
if ((scr1 & 0xf1000100) != 0x21000100)
|
||||
goto beach;
|
||||
-
|
||||
if ((scr2 & 0x01800001) != 0x01800001)
|
||||
goto beach;
|
||||
-
|
||||
/* :4=0010 ! scr:3 ! marker:1==1 ! scr:15 ! marker:1==1 ! scr:15 ! marker:1==1 */
|
||||
scr = ((guint64) scr1 & 0x0e000000) << 5;
|
||||
scr |= ((guint64) scr1 & 0x00fffe00) << 6;
|
||||
@@ -2488,7 +2470,6 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
/* Possible optional System header here */
|
||||
code = GST_READ_UINT32_BE (data);
|
||||
len = GST_READ_UINT16_BE (data + 4);
|
||||
-
|
||||
if (code == ID_PS_SYSTEM_HEADER_START_CODE) {
|
||||
/* Found a system header, skip it */
|
||||
/* Check for sufficient data - system header, plus enough
|
||||
@@ -2496,7 +2477,6 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
if (data + 6 + len + 6 > end)
|
||||
return FALSE;
|
||||
data += len + 6;
|
||||
-
|
||||
/* read the 4 bytes for the PES sync code */
|
||||
code = GST_READ_UINT32_BE (data);
|
||||
len = GST_READ_UINT16_BE (data + 4);
|
||||
@@ -2505,10 +2485,8 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
/* Check we have enough data left for reading the PES packet */
|
||||
if (data + 6 + len > end)
|
||||
return FALSE;
|
||||
-
|
||||
if (!gst_ps_demux_is_pes_sync (code))
|
||||
goto beach;
|
||||
-
|
||||
switch (code) {
|
||||
case ID_PS_PROGRAM_STREAM_MAP:
|
||||
case ID_PRIVATE_STREAM_2:
|
||||
@@ -2525,9 +2503,7 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
|
||||
/* skip sync code and size */
|
||||
data += 6;
|
||||
-
|
||||
pts = dts = -1;
|
||||
-
|
||||
/* stuffing bits, first two bits are '10' for mpeg2 pes so this code is
|
||||
* not triggered. */
|
||||
while (TRUE) {
|
||||
@@ -2539,7 +2515,6 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
/* STD buffer size, never for mpeg2 */
|
||||
if ((*data & 0xc0) == 0x40)
|
||||
data += 2;
|
||||
-
|
||||
/* PTS but no DTS, never for mpeg2 */
|
||||
if ((*data & 0xf0) == 0x20) {
|
||||
READ_TS (data, pts, beach);
|
||||
@@ -2551,7 +2526,6 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
} else if ((*data & 0xc0) == 0x80) {
|
||||
/* mpeg2 case */
|
||||
guchar flags;
|
||||
-
|
||||
/* 2: '10'
|
||||
* 2: PES_scrambling_control
|
||||
* 1: PES_priority
|
||||
@@ -2560,10 +2534,8 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
* 1: original_or_copy
|
||||
*/
|
||||
flags = *data++;
|
||||
-
|
||||
if ((flags & 0xc0) != 0x80)
|
||||
goto beach;
|
||||
-
|
||||
/* 2: PTS_DTS_flags
|
||||
* 1: ESCR_flag
|
||||
* 1: ES_rate_flag
|
||||
@@ -2573,14 +2545,11 @@ gst_ps_demux_scan_ts (GstPsDemux * demux, const guint8 * data,
|
||||
* 1: PES_extension_flag
|
||||
*/
|
||||
flags = *data++;
|
||||
-
|
||||
/* 8: PES_header_data_length */
|
||||
data++;
|
||||
-
|
||||
/* only DTS: this is invalid */
|
||||
if ((flags & 0xc0) == 0x40)
|
||||
goto beach;
|
||||
-
|
||||
/* check for PTS */
|
||||
if ((flags & 0x80)) {
|
||||
READ_TS (data, pts, beach);
|
||||
@@ -2617,26 +2586,21 @@ gst_ps_demux_scan_forward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
guint cursor, to_read = BLOCK_SZ;
|
||||
guint end_scan;
|
||||
GstMapInfo map;
|
||||
-
|
||||
do {
|
||||
/* Check we can get at least scan_sz bytes */
|
||||
if (offset + scan_sz > demux->sink_segment.stop)
|
||||
return FALSE;
|
||||
-
|
||||
/* Don't go further than 'limit' bytes */
|
||||
if (limit && offset > *pos + limit)
|
||||
return FALSE;
|
||||
-
|
||||
if (offset + to_read > demux->sink_segment.stop)
|
||||
to_read = demux->sink_segment.stop - offset;
|
||||
-
|
||||
/* read some data */
|
||||
buffer = NULL;
|
||||
ret = gst_pad_pull_range (demux->sinkpad, offset, to_read, &buffer);
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||
return FALSE;
|
||||
gst_buffer_map (buffer, &map, GST_MAP_READ);
|
||||
-
|
||||
/* may get a short buffer at the end of the file */
|
||||
if (G_UNLIKELY (map.size <= scan_sz)) {
|
||||
gst_buffer_unmap (buffer, &map);
|
||||
@@ -2645,7 +2609,6 @@ gst_ps_demux_scan_forward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
}
|
||||
|
||||
end_scan = map.size - scan_sz;
|
||||
-
|
||||
/* scan the block */
|
||||
for (cursor = 0; !found && cursor <= end_scan; cursor++) {
|
||||
found = gst_ps_demux_scan_ts (demux, map.data + cursor, mode, &ts,
|
||||
@@ -2655,7 +2618,6 @@ gst_ps_demux_scan_forward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
/* done with the buffer, unref it */
|
||||
gst_buffer_unmap (buffer, &map);
|
||||
gst_buffer_unref (buffer);
|
||||
-
|
||||
if (found) {
|
||||
*rts = ts;
|
||||
*pos = offset + cursor - 1;
|
||||
@@ -2663,7 +2625,6 @@ gst_ps_demux_scan_forward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
offset += cursor;
|
||||
}
|
||||
} while (!found && offset < demux->sink_segment.stop);
|
||||
-
|
||||
return found;
|
||||
}
|
||||
|
||||
@@ -2681,16 +2642,13 @@ gst_ps_demux_scan_backward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
guint start_scan;
|
||||
guint8 *data;
|
||||
GstMapInfo map;
|
||||
-
|
||||
do {
|
||||
/* Check we have at least scan_sz bytes available */
|
||||
if (offset < scan_sz - 1)
|
||||
return FALSE;
|
||||
-
|
||||
/* Don't go backward past the start or 'limit' bytes */
|
||||
if (limit && offset + limit < *pos)
|
||||
return FALSE;
|
||||
-
|
||||
if (offset > BLOCK_SZ)
|
||||
offset -= BLOCK_SZ;
|
||||
else {
|
||||
@@ -2702,9 +2660,7 @@ gst_ps_demux_scan_backward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
ret = gst_pad_pull_range (demux->sinkpad, offset, to_read, &buffer);
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||
return FALSE;
|
||||
-
|
||||
gst_buffer_map (buffer, &map, GST_MAP_READ);
|
||||
-
|
||||
/* may get a short buffer at the end of the file */
|
||||
if (G_UNLIKELY (map.size <= scan_sz)) {
|
||||
gst_buffer_unmap (buffer, &map);
|
||||
@@ -2714,7 +2670,6 @@ gst_ps_demux_scan_backward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
|
||||
start_scan = map.size - scan_sz;
|
||||
data = map.data + start_scan;
|
||||
-
|
||||
/* scan the block */
|
||||
for (cursor = (start_scan + 1); !found && cursor > 0; cursor--) {
|
||||
found = gst_ps_demux_scan_ts (demux, data--, mode, &ts,
|
||||
@@ -2724,14 +2679,12 @@ gst_ps_demux_scan_backward_ts (GstPsDemux * demux, guint64 * pos,
|
||||
/* done with the buffer, unref it */
|
||||
gst_buffer_unmap (buffer, &map);
|
||||
gst_buffer_unref (buffer);
|
||||
-
|
||||
if (found) {
|
||||
*rts = ts;
|
||||
*pos = offset + cursor;
|
||||
}
|
||||
|
||||
} while (!found && offset > 0);
|
||||
-
|
||||
return found;
|
||||
}
|
||||
|
||||
@@ -2745,54 +2698,47 @@ gst_ps_sink_get_duration (GstPsDemux * demux)
|
||||
guint64 offset;
|
||||
guint i;
|
||||
guint64 scr = 0;
|
||||
-
|
||||
/* init the sink segment */
|
||||
gst_segment_init (&demux->sink_segment, format);
|
||||
-
|
||||
/* get peer to figure out length */
|
||||
if ((peer = gst_pad_get_peer (demux->sinkpad)) == NULL)
|
||||
goto beach;
|
||||
-
|
||||
res = gst_pad_query_duration (peer, format, &length);
|
||||
gst_object_unref (peer);
|
||||
-
|
||||
if (!res || length <= 0)
|
||||
goto beach;
|
||||
-
|
||||
GST_DEBUG_OBJECT (demux, "file length %" G_GINT64_FORMAT, length);
|
||||
-
|
||||
/* update the sink segment */
|
||||
demux->sink_segment.stop = length;
|
||||
gst_segment_set_duration (&demux->sink_segment, format, length);
|
||||
gst_segment_set_position (&demux->sink_segment, format, 0);
|
||||
-
|
||||
/* Scan for notorious SCR and PTS to calculate the duration */
|
||||
/* scan for first SCR in the stream */
|
||||
offset = demux->sink_segment.start;
|
||||
- gst_ps_demux_scan_forward_ts (demux, &offset, SCAN_SCR, &demux->first_scr,
|
||||
- DURATION_SCAN_LIMIT);
|
||||
- GST_DEBUG_OBJECT (demux, "First SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
- " in packet starting at %" G_GUINT64_FORMAT,
|
||||
- demux->first_scr, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->first_scr)),
|
||||
- offset);
|
||||
+ gst_ps_demux_scan_forward_ts (demux, &offset, SCAN_SCR,
|
||||
+ &demux->first_scr, DURATION_SCAN_LIMIT);
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "First SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
+ " in packet starting at %" G_GUINT64_FORMAT, demux->first_scr,
|
||||
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->first_scr)), offset);
|
||||
demux->first_scr_offset = offset;
|
||||
/* scan for last SCR in the stream */
|
||||
offset = demux->sink_segment.stop;
|
||||
- gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR, &demux->last_scr,
|
||||
- DURATION_SCAN_LIMIT);
|
||||
- GST_DEBUG_OBJECT (demux, "Last SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
- " in packet starting at %" G_GUINT64_FORMAT,
|
||||
- demux->last_scr, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->last_scr)),
|
||||
- offset);
|
||||
+ gst_ps_demux_scan_backward_ts (demux, &offset, SCAN_SCR,
|
||||
+ &demux->last_scr, DURATION_SCAN_LIMIT);
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "Last SCR: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
+ " in packet starting at %" G_GUINT64_FORMAT, demux->last_scr,
|
||||
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->last_scr)), offset);
|
||||
demux->last_scr_offset = offset;
|
||||
/* scan for first PTS in the stream */
|
||||
offset = demux->sink_segment.start;
|
||||
- gst_ps_demux_scan_forward_ts (demux, &offset, SCAN_PTS, &demux->first_pts,
|
||||
- DURATION_SCAN_LIMIT);
|
||||
- GST_DEBUG_OBJECT (demux, "First PTS: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
- " in packet starting at %" G_GUINT64_FORMAT,
|
||||
- demux->first_pts, GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->first_pts)),
|
||||
- offset);
|
||||
+ gst_ps_demux_scan_forward_ts (demux, &offset, SCAN_PTS,
|
||||
+ &demux->first_pts, DURATION_SCAN_LIMIT);
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "First PTS: %" G_GINT64_FORMAT " %" GST_TIME_FORMAT
|
||||
+ " in packet starting at %" G_GUINT64_FORMAT, demux->first_pts,
|
||||
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->first_pts)), offset);
|
||||
if (demux->first_pts != G_MAXUINT64) {
|
||||
/* scan for last PTS in the stream */
|
||||
offset = demux->sink_segment.stop;
|
||||
@@ -2817,8 +2763,8 @@ gst_ps_sink_get_duration (GstPsDemux * demux)
|
||||
/* Start demuxing from the right place */
|
||||
demux->sink_segment.position = offset;
|
||||
GST_DEBUG_OBJECT (demux, "Replaced First SCR: %" G_GINT64_FORMAT
|
||||
- " %" GST_TIME_FORMAT " in packet starting at %" G_GUINT64_FORMAT,
|
||||
- demux->first_scr,
|
||||
+ " %" GST_TIME_FORMAT " in packet starting at %"
|
||||
+ G_GUINT64_FORMAT, demux->first_scr,
|
||||
GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->first_scr)), offset);
|
||||
break;
|
||||
}
|
||||
@@ -2828,7 +2774,6 @@ gst_ps_sink_get_duration (GstPsDemux * demux)
|
||||
demux->base_time = MPEGTIME_TO_GSTTIME (demux->first_scr);
|
||||
demux->scr_rate_n = demux->last_scr_offset - demux->first_scr_offset;
|
||||
demux->scr_rate_d = demux->last_scr - demux->first_scr;
|
||||
-
|
||||
if (G_LIKELY (demux->first_pts != G_MAXUINT64 &&
|
||||
demux->last_pts != G_MAXUINT64)) {
|
||||
/* update the src segment */
|
||||
@@ -2845,9 +2790,7 @@ gst_ps_sink_get_duration (GstPsDemux * demux)
|
||||
&demux->sink_segment);
|
||||
GST_INFO_OBJECT (demux, "src segment configured %" GST_SEGMENT_FORMAT,
|
||||
&demux->src_segment);
|
||||
-
|
||||
res = TRUE;
|
||||
-
|
||||
beach:
|
||||
return res;
|
||||
}
|
||||
@@ -2858,7 +2801,6 @@ gst_ps_demux_pull_block (GstPad * pad, GstPsDemux * demux,
|
||||
{
|
||||
GstFlowReturn ret;
|
||||
GstBuffer *buffer = NULL;
|
||||
-
|
||||
ret = gst_pad_pull_range (pad, offset, size, &buffer);
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
|
||||
GST_DEBUG_OBJECT (demux, "pull range at %" G_GUINT64_FORMAT
|
||||
@@ -2867,13 +2809,11 @@ gst_ps_demux_pull_block (GstPad * pad, GstPsDemux * demux,
|
||||
} else
|
||||
GST_LOG_OBJECT (demux, "pull range at %" G_GUINT64_FORMAT
|
||||
" size %u done", offset, size);
|
||||
-
|
||||
if (demux->sink_segment.rate < 0) {
|
||||
GST_LOG_OBJECT (demux, "setting discont flag on backward rate");
|
||||
GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
|
||||
}
|
||||
ret = gst_ps_demux_chain (pad, GST_OBJECT (demux), buffer);
|
||||
-
|
||||
beach:
|
||||
return ret;
|
||||
}
|
||||
@@ -2884,9 +2824,7 @@ gst_ps_demux_loop (GstPad * pad)
|
||||
GstPsDemux *demux;
|
||||
GstFlowReturn ret = GST_FLOW_OK;
|
||||
guint64 offset = 0;
|
||||
-
|
||||
demux = GST_PS_DEMUX (gst_pad_get_parent (pad));
|
||||
-
|
||||
if (G_UNLIKELY (demux->flushing)) {
|
||||
ret = GST_FLOW_FLUSHING;
|
||||
goto pause;
|
||||
@@ -2894,7 +2832,6 @@ gst_ps_demux_loop (GstPad * pad)
|
||||
|
||||
if (G_UNLIKELY (demux->sink_segment.format == GST_FORMAT_UNDEFINED))
|
||||
gst_ps_sink_get_duration (demux);
|
||||
-
|
||||
offset = demux->sink_segment.position;
|
||||
if (demux->sink_segment.rate >= 0) {
|
||||
guint size = BLOCK_SZ;
|
||||
@@ -2903,24 +2840,22 @@ gst_ps_demux_loop (GstPad * pad)
|
||||
}
|
||||
/* pull in data */
|
||||
ret = gst_ps_demux_pull_block (pad, demux, offset, size);
|
||||
-
|
||||
/* pause if something went wrong */
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||
goto pause;
|
||||
-
|
||||
/* update our position */
|
||||
offset += size;
|
||||
gst_segment_set_position (&demux->sink_segment, GST_FORMAT_BYTES, offset);
|
||||
-
|
||||
/* check EOS condition */
|
||||
if ((demux->src_segment.flags & GST_SEEK_FLAG_SEGMENT) &&
|
||||
((demux->sink_segment.position >= demux->sink_segment.stop) ||
|
||||
(demux->src_segment.stop != (guint64) - 1 &&
|
||||
demux->src_segment.position >= demux->src_segment.stop))) {
|
||||
- GST_DEBUG_OBJECT (demux, "forward mode using segment reached end of "
|
||||
- "segment pos %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT
|
||||
- " pos in bytes %" G_GUINT64_FORMAT " stop in bytes %"
|
||||
- G_GUINT64_FORMAT, GST_TIME_ARGS (demux->src_segment.position),
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "forward mode using segment reached end of " "segment pos %"
|
||||
+ GST_TIME_FORMAT " stop %" GST_TIME_FORMAT " pos in bytes %"
|
||||
+ G_GUINT64_FORMAT " stop in bytes %" G_GUINT64_FORMAT,
|
||||
+ GST_TIME_ARGS (demux->src_segment.position),
|
||||
GST_TIME_ARGS (demux->src_segment.stop),
|
||||
demux->sink_segment.position, demux->sink_segment.stop);
|
||||
ret = GST_FLOW_EOS;
|
||||
@@ -2928,25 +2863,22 @@ gst_ps_demux_loop (GstPad * pad)
|
||||
}
|
||||
} else { /* Reverse playback */
|
||||
guint64 size = MIN (offset, BLOCK_SZ);
|
||||
-
|
||||
/* pull in data */
|
||||
ret = gst_ps_demux_pull_block (pad, demux, offset - size, size);
|
||||
-
|
||||
/* pause if something went wrong */
|
||||
if (G_UNLIKELY (ret != GST_FLOW_OK))
|
||||
goto pause;
|
||||
-
|
||||
/* update our position */
|
||||
offset -= size;
|
||||
gst_segment_set_position (&demux->sink_segment, GST_FORMAT_BYTES, offset);
|
||||
-
|
||||
/* check EOS condition */
|
||||
if (demux->sink_segment.position <= demux->sink_segment.start ||
|
||||
demux->src_segment.position <= demux->src_segment.start) {
|
||||
- GST_DEBUG_OBJECT (demux, "reverse mode using segment reached end of "
|
||||
- "segment pos %" GST_TIME_FORMAT " stop %" GST_TIME_FORMAT
|
||||
- " pos in bytes %" G_GUINT64_FORMAT " stop in bytes %"
|
||||
- G_GUINT64_FORMAT, GST_TIME_ARGS (demux->src_segment.position),
|
||||
+ GST_DEBUG_OBJECT (demux,
|
||||
+ "reverse mode using segment reached end of " "segment pos %"
|
||||
+ GST_TIME_FORMAT " stop %" GST_TIME_FORMAT " pos in bytes %"
|
||||
+ G_GUINT64_FORMAT " stop in bytes %" G_GUINT64_FORMAT,
|
||||
+ GST_TIME_ARGS (demux->src_segment.position),
|
||||
GST_TIME_ARGS (demux->src_segment.start),
|
||||
demux->sink_segment.position, demux->sink_segment.start);
|
||||
ret = GST_FLOW_EOS;
|
||||
@@ -2955,27 +2887,21 @@ gst_ps_demux_loop (GstPad * pad)
|
||||
}
|
||||
|
||||
gst_object_unref (demux);
|
||||
-
|
||||
return;
|
||||
-
|
||||
pause:
|
||||
{
|
||||
const gchar *reason = gst_flow_get_name (ret);
|
||||
-
|
||||
GST_LOG_OBJECT (demux, "pausing task, reason %s", reason);
|
||||
gst_pad_pause_task (pad);
|
||||
-
|
||||
if (ret == GST_FLOW_EOS) {
|
||||
/* perform EOS logic */
|
||||
gst_element_no_more_pads (GST_ELEMENT_CAST (demux));
|
||||
if (demux->src_segment.flags & GST_SEEK_FLAG_SEGMENT) {
|
||||
gint64 stop;
|
||||
-
|
||||
/* for segment playback we need to post when (in stream time)
|
||||
* we stopped, this is either stop (when set) or the duration. */
|
||||
if ((stop = demux->src_segment.stop) == -1)
|
||||
stop = demux->src_segment.duration;
|
||||
-
|
||||
if (demux->sink_segment.rate >= 0) {
|
||||
GST_LOG_OBJECT (demux, "Sending segment done, at end of segment");
|
||||
gst_element_post_message (GST_ELEMENT_CAST (demux),
|
||||
@@ -2984,8 +2910,8 @@ pause:
|
||||
gst_ps_demux_send_event (demux,
|
||||
gst_event_new_segment_done (GST_FORMAT_TIME, stop));
|
||||
} else { /* Reverse playback */
|
||||
- GST_LOG_OBJECT (demux, "Sending segment done, at beginning of "
|
||||
- "segment");
|
||||
+ GST_LOG_OBJECT (demux,
|
||||
+ "Sending segment done, at beginning of " "segment");
|
||||
gst_element_post_message (GST_ELEMENT_CAST (demux),
|
||||
gst_message_new_segment_done (GST_OBJECT_CAST (demux),
|
||||
GST_FORMAT_TIME, demux->src_segment.start));
|
||||
@@ -3020,7 +2946,6 @@ gst_ps_demux_sink_activate (GstPad * sinkpad, GstObject * parent)
|
||||
{
|
||||
gboolean res = FALSE;
|
||||
GstQuery *query = gst_query_new_scheduling ();
|
||||
-
|
||||
if (gst_pad_peer_query (sinkpad, query)) {
|
||||
if (gst_query_has_scheduling_mode_with_flags (query,
|
||||
GST_PAD_MODE_PULL, GST_SCHEDULING_FLAG_SEEKABLE)) {
|
||||
@@ -3033,7 +2958,6 @@ gst_ps_demux_sink_activate (GstPad * sinkpad, GstObject * parent)
|
||||
}
|
||||
|
||||
gst_query_unref (query);
|
||||
-
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -3043,9 +2967,7 @@ gst_ps_demux_sink_activate_push (GstPad * sinkpad, GstObject * parent,
|
||||
gboolean active)
|
||||
{
|
||||
GstPsDemux *demux = GST_PS_DEMUX (parent);
|
||||
-
|
||||
demux->random_access = FALSE;
|
||||
-
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -3057,12 +2979,11 @@ gst_ps_demux_sink_activate_pull (GstPad * sinkpad, GstObject * parent,
|
||||
gboolean active)
|
||||
{
|
||||
GstPsDemux *demux = GST_PS_DEMUX (parent);
|
||||
-
|
||||
if (active) {
|
||||
GST_DEBUG ("pull mode activated");
|
||||
demux->random_access = TRUE;
|
||||
- return gst_pad_start_task (sinkpad, (GstTaskFunction) gst_ps_demux_loop,
|
||||
- sinkpad, NULL);
|
||||
+ return gst_pad_start_task (sinkpad,
|
||||
+ (GstTaskFunction) gst_ps_demux_loop, sinkpad, NULL);
|
||||
} else {
|
||||
demux->random_access = FALSE;
|
||||
return gst_pad_stop_task (sinkpad);
|
||||
@@ -3090,12 +3011,9 @@ static GstFlowReturn
|
||||
gst_ps_demux_combine_flows (GstPsDemux * demux, GstFlowReturn ret)
|
||||
{
|
||||
GST_LOG_OBJECT (demux, "flow return: %s", gst_flow_get_name (ret));
|
||||
-
|
||||
ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret);
|
||||
-
|
||||
if (G_UNLIKELY (demux->need_no_more_pads && ret == GST_FLOW_NOT_LINKED))
|
||||
ret = GST_FLOW_OK;
|
||||
-
|
||||
GST_LOG_OBJECT (demux, "combined flow return: %s", gst_flow_get_name (ret));
|
||||
return ret;
|
||||
}
|
||||
@@ -3107,32 +3025,28 @@ gst_ps_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||
GstFlowReturn ret = GST_FLOW_OK;
|
||||
guint32 avail;
|
||||
gboolean save, discont;
|
||||
-
|
||||
discont = GST_BUFFER_IS_DISCONT (buffer);
|
||||
-
|
||||
if (discont) {
|
||||
- GST_LOG_OBJECT (demux, "Received buffer with discont flag and"
|
||||
- " offset %" G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buffer));
|
||||
-
|
||||
+ GST_LOG_OBJECT (demux,
|
||||
+ "Received buffer with discont flag and" " offset %"
|
||||
+ G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buffer));
|
||||
gst_pes_filter_drain (&demux->filter);
|
||||
gst_ps_demux_mark_discont (demux, TRUE, FALSE);
|
||||
-
|
||||
/* mark discont on all streams */
|
||||
if (demux->sink_segment.rate >= 0.0) {
|
||||
demux->current_scr = G_MAXUINT64;
|
||||
demux->bytes_since_scr = 0;
|
||||
}
|
||||
} else {
|
||||
- GST_LOG_OBJECT (demux, "Received buffer with offset %" G_GUINT64_FORMAT,
|
||||
+ GST_LOG_OBJECT (demux,
|
||||
+ "Received buffer with offset %" G_GUINT64_FORMAT,
|
||||
GST_BUFFER_OFFSET (buffer));
|
||||
}
|
||||
|
||||
/* We keep the offset to interpolate SCR */
|
||||
demux->adapter_offset = GST_BUFFER_OFFSET (buffer);
|
||||
-
|
||||
gst_adapter_push (demux->adapter, buffer);
|
||||
demux->bytes_since_scr += gst_buffer_get_size (buffer);
|
||||
-
|
||||
avail = gst_adapter_available (demux->rev_adapter);
|
||||
if (avail > 0) {
|
||||
GST_LOG_OBJECT (demux, "appending %u saved bytes", avail);
|
||||
@@ -3145,7 +3059,6 @@ gst_ps_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||
|
||||
avail = gst_adapter_available (demux->adapter);
|
||||
GST_LOG_OBJECT (demux, "avail now: %d, state %d", avail, demux->filter.state);
|
||||
-
|
||||
switch (demux->filter.state) {
|
||||
case STATE_DATA_SKIP:
|
||||
case STATE_DATA_PUSH:
|
||||
@@ -3215,7 +3128,6 @@ gst_ps_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
|
||||
* saved up to the next ps sync. */
|
||||
if (ps_sync)
|
||||
save = FALSE;
|
||||
-
|
||||
switch (ret) {
|
||||
case GST_FLOW_NEED_MORE_DATA:
|
||||
GST_DEBUG_OBJECT (demux, "need more data");
|
||||
@@ -3249,7 +3161,6 @@ gst_ps_demux_change_state (GstElement * element, GstStateChange transition)
|
||||
{
|
||||
GstPsDemux *demux = GST_PS_DEMUX (element);
|
||||
GstStateChangeReturn result;
|
||||
-
|
||||
switch (transition) {
|
||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||
gst_pes_filter_init (&demux->filter, demux->adapter,
|
||||
@@ -3266,7 +3177,6 @@ gst_ps_demux_change_state (GstElement * element, GstStateChange transition)
|
||||
}
|
||||
|
||||
result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||
-
|
||||
switch (transition) {
|
||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||
gst_ps_demux_reset (demux);
|
@ -25,6 +25,7 @@ asfmux
|
||||
audiobuffersplit
|
||||
audiofxbad
|
||||
audiomixer
|
||||
audiomixmatrix
|
||||
audioparsers
|
||||
audiovisualizers
|
||||
autoconvert
|
||||
|
@ -3,7 +3,7 @@
|
||||
%global api_version 1.0
|
||||
|
||||
Name: mingw-gstreamer1-plugins-bad-free
|
||||
Version: 1.11.1
|
||||
Version: 1.12.1
|
||||
Release: 1%{?dist}
|
||||
Summary: Cross compiled GStreamer1 plug-ins "bad"
|
||||
|
||||
@ -17,9 +17,6 @@ URL: http://gstreamer.freedesktop.org/
|
||||
Source0: gst-plugins-bad-free-%{version}.tar.xz
|
||||
Source1: gst-p-bad-cleanup.sh
|
||||
|
||||
Patch0001: 0001-mxfdemux-Set-stream-tags-to-NULL-after-unreffing.patch
|
||||
Patch0002: 0002-psdemux-Rewrite-PSM-parsing-using-GstByteReader.patch
|
||||
|
||||
BuildArch: noarch
|
||||
|
||||
BuildRequires: autoconf automake
|
||||
@ -111,8 +108,6 @@ well enough, or the code is not of good enough quality.
|
||||
|
||||
%prep
|
||||
%setup -q -n gst-plugins-bad-%{version}
|
||||
%patch0001 -p1
|
||||
%patch0002 -p1
|
||||
|
||||
|
||||
%build
|
||||
@ -172,10 +167,11 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
|
||||
# libraries
|
||||
%{mingw32_bindir}/libgstadaptivedemux-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbadallocators-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbadaudio-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbasecamerabinsrc-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbadbase-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbadvideo-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstbasecamerabinsrc-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstcodecparsers-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstgl-1.0-0.dll
|
||||
%{mingw32_bindir}/libgstinsertbin-1.0-0.dll
|
||||
@ -195,11 +191,12 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstaudiobuffersplit.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstaudiofxbad.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstaudiomixer.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstaudiomixmatrix.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstaudiovisualizers.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstautoconvert.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstbayer.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstbz2.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstcamerabin2.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstcamerabin.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstcoloreffects.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstcompositor.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstd3dvideosink.dll
|
||||
@ -207,6 +204,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstdebugutilsbad.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstdirectsoundsrc.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstdtls.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstfaceoverlay.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstfestival.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstfieldanalysis.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstfreeverb.dll
|
||||
@ -215,7 +213,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstgdp.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstgeometrictransform.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstgsm.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstgtksink.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstgtk.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgsthls.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstid3tag.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstinter.dll
|
||||
@ -224,6 +222,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstivtc.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstjp2kdecimator.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstjpegformat.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstlegacyrawparse.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstmidi.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstmpegpsdemux.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstmpegpsmux.dll
|
||||
@ -236,7 +235,6 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstopusparse.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstpcapparse.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstpnm.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstrawparse.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstremovesilence.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstrfbsrc.dll
|
||||
%{mingw32_libdir}/gstreamer-%{api_version}/libgstrtponvif.dll
|
||||
@ -263,6 +261,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
|
||||
# %files devel
|
||||
# plugin helper library headers
|
||||
%{mingw32_includedir}/gstreamer-%{api_version}/gst/allocators/
|
||||
%{mingw32_includedir}/gstreamer-%{api_version}/gst/audio/
|
||||
%{mingw32_includedir}/gstreamer-%{api_version}/gst/base/
|
||||
%{mingw32_includedir}/gstreamer-%{api_version}/gst/basecamerabinsrc/
|
||||
@ -276,6 +275,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_includedir}/gstreamer-%{api_version}/gst/video/
|
||||
|
||||
%{mingw32_libdir}/libgstadaptivedemux-1.0.dll.a
|
||||
%{mingw32_libdir}/libgstbadallocators-1.0.dll.a
|
||||
%{mingw32_libdir}/libgstbadaudio-1.0.dll.a
|
||||
%{mingw32_libdir}/libgstbadbase-1.0.dll.a
|
||||
%{mingw32_libdir}/libgstbadvideo-1.0.dll.a
|
||||
@ -288,6 +288,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw32_libdir}/libgstplayer-1.0.dll.a
|
||||
%{mingw32_libdir}/libgsturidownloader-1.0.dll.a
|
||||
|
||||
%{mingw32_libdir}/pkgconfig/gstreamer-bad-allocators-1.0.pc
|
||||
%{mingw32_libdir}/pkgconfig/gstreamer-bad-audio-1.0.pc
|
||||
%{mingw32_libdir}/pkgconfig/gstreamer-bad-base-1.0.pc
|
||||
%{mingw32_libdir}/pkgconfig/gstreamer-bad-video-1.0.pc
|
||||
@ -308,10 +309,11 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
|
||||
# libraries
|
||||
%{mingw64_bindir}/libgstadaptivedemux-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbadallocators-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbadaudio-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbasecamerabinsrc-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbadbase-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbadvideo-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstbasecamerabinsrc-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstcodecparsers-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstgl-1.0-0.dll
|
||||
%{mingw64_bindir}/libgstinsertbin-1.0-0.dll
|
||||
@ -331,11 +333,12 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstaudiobuffersplit.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstaudiofxbad.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstaudiomixer.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstaudiomixmatrix.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstaudiovisualizers.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstautoconvert.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstbayer.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstbz2.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstcamerabin2.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstcamerabin.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstcoloreffects.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstcompositor.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstd3dvideosink.dll
|
||||
@ -343,6 +346,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstdebugutilsbad.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstdirectsoundsrc.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstdtls.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstfaceoverlay.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstfestival.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstfieldanalysis.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstfreeverb.dll
|
||||
@ -351,7 +355,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstgdp.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstgeometrictransform.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstgsm.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstgtksink.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstgtk.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgsthls.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstid3tag.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstinter.dll
|
||||
@ -360,6 +364,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstivtc.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstjp2kdecimator.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstjpegformat.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstlegacyrawparse.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstmidi.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstmpegpsdemux.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstmpegpsmux.dll
|
||||
@ -372,7 +377,6 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstopusparse.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstpcapparse.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstpnm.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstrawparse.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstremovesilence.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstrfbsrc.dll
|
||||
%{mingw64_libdir}/gstreamer-%{api_version}/libgstrtponvif.dll
|
||||
@ -399,6 +403,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
|
||||
# %files devel
|
||||
# plugin helper library headers
|
||||
%{mingw64_includedir}/gstreamer-%{api_version}/gst/allocators/
|
||||
%{mingw64_includedir}/gstreamer-%{api_version}/gst/audio/
|
||||
%{mingw64_includedir}/gstreamer-%{api_version}/gst/base/
|
||||
%{mingw64_includedir}/gstreamer-%{api_version}/gst/basecamerabinsrc/
|
||||
@ -412,6 +417,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_includedir}/gstreamer-%{api_version}/gst/video/
|
||||
|
||||
%{mingw64_libdir}/libgstadaptivedemux-1.0.dll.a
|
||||
%{mingw64_libdir}/libgstbadallocators-1.0.dll.a
|
||||
%{mingw64_libdir}/libgstbadaudio-1.0.dll.a
|
||||
%{mingw64_libdir}/libgstbadbase-1.0.dll.a
|
||||
%{mingw64_libdir}/libgstbadvideo-1.0.dll.a
|
||||
@ -424,6 +430,7 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
%{mingw64_libdir}/libgstplayer-1.0.dll.a
|
||||
%{mingw64_libdir}/libgsturidownloader-1.0.dll.a
|
||||
|
||||
%{mingw64_libdir}/pkgconfig/gstreamer-bad-allocators-1.0.pc
|
||||
%{mingw64_libdir}/pkgconfig/gstreamer-bad-audio-1.0.pc
|
||||
%{mingw64_libdir}/pkgconfig/gstreamer-bad-base-1.0.pc
|
||||
%{mingw64_libdir}/pkgconfig/gstreamer-bad-video-1.0.pc
|
||||
@ -438,6 +445,9 @@ find $RPM_BUILD_ROOT -name '*.la' -delete
|
||||
|
||||
|
||||
%changelog
|
||||
* Tue Jun 20 2017 Kalev Lember <klember@redhat.com> - 1.12.1-1
|
||||
- Update to 1.12.1
|
||||
|
||||
* Wed Feb 8 2017 Victor Toso <victortoso@redhat.com> - 1.11.1-1
|
||||
- Update to 1.11.1
|
||||
- Add audiobuffersplit
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (gst-plugins-bad-free-1.11.1.tar.xz) = 31d3b09bbc22aeae80eb2d776b8458e02c4de251d21b1f110465e2af30be7e7b0babc82a48df3d30b1257ca07dcb68ed299cb41bc875d53fb8b26cc704d86f3f
|
||||
SHA512 (gst-plugins-bad-free-1.12.1.tar.xz) = a24c985a29c711f1f8449b02978fe9174ef32046a21ef4068710b7cfa01da6c0b283f80d444959f7bd2d5d34e88a9b5a58c5cabe0ffe5654ea40ec3f89ccbeb7
|
||||
|
Loading…
Reference in New Issue
Block a user