Commit graph

411 commits

Author SHA1 Message Date
Tim-Philipp Müller
54fc1ed5f4 tsdemux: fix latency handling again
The tsdemux latency should always be added to the minimum
latency (which is always a valid clock time value). The
"cleanup" in commit a1f709c2 made it so that it would not
be added if upstream reported 0 as minimum latency (as
e.g. udpsrc would). This broke playback of live mpeg-ts
streaming in some cases, leading to playback stutter due
to a too-small configured latency for the pipeline.

https://bugzilla.gnome.org/show_bug.cgi?id=751508
2015-08-24 10:46:31 +01:00
Edward Hervey
7ea4a66b9f mpegtsdemux: Fix illogical comparision
A variable can't be two values at once. We want to stop if it's not the
actual ts *AND* not the other ts

CID #1316475
2015-08-16 12:56:56 +02:00
Luis de Bethencourt
7ddaf8741b mpegtsbase: remove redundant check
No need to check if done is True since break will already terminate the for
loop.
2015-07-29 16:52:08 +01:00
Edward Hervey
631b2d8826 mpegtsbase: Fix previous commit
We only want to do a hard reset of the observations if we're working
with TIME segments in push mode. For BYTE segment we want to keep
the observations (in order to do seeks in push-mode).
2015-07-09 18:33:00 +02:00
Edward Hervey
0247dc7489 mpegtsbase: Flush more on DISCONT buffers in push mode
When in push mode, we want to discard all previous observations from the
mpegtspacketizer when we get a DISCONT buffer.

This avoids trying to calculate bogus timestamps (estimating them using old
PCR observations).

We only do a hard reset in push-mode. In pull-mode we still need the observations
(in order to seek properly)
2015-07-09 18:15:54 +02:00
Tim-Philipp Müller
f0358aac16 tsdemux: remove unnecessary check
This is not public API, use g_assert() instead of
g_return_if_fail(), so that it's compiled out in
releases. It's only called from our code, with &foo.
2015-07-08 14:50:00 +01:00
Tim-Philipp Müller
eeaf4d11b7 tsdemux: add support for KLV metadata streams
There's no timestamps for these streams though, we
might want to make some up based on the last/next
video PTS or so.
2015-07-08 14:50:00 +01:00
Nicolas Dufresne
338f7e8c8d tsdemux: Segment start should match first PTS
The segment should start at first PTS, and the vairable name lower_pts
state so correctly. Though we where using the first DTS instead. This
could lead to small desynchronization of video stream.

https://bugzilla.gnome.org/show_bug.cgi?id=740575
2015-06-12 17:10:29 -04:00
Luis de Bethencourt
afcb49dcce tsdemux: correct fix for dead code
Rename template to caps to keep the original intention of the code after
commit b4c9aa1c

CID #1304674
2015-06-08 14:19:27 +01:00
Luis de Bethencourt
e9cb38017b Revert "tsdemux: remove dead code"
This reverts commit 0635acfec0.
2015-06-08 14:14:41 +01:00
Luis de Bethencourt
0635acfec0 tsdemux: remove dead code
After commit b4c9aa1c30 template will always be
NULL. The if conditional will always be FALSE, so removing it.

CID #1304674
2015-06-08 13:37:35 +01:00
Luis de Bethencourt
7aed8e184f tsdemux: remove ignored assignment
Function goes to done before the value set in start_offset is ever used.
2015-06-05 14:34:59 +01:00
Thiago Santos
b4c9aa1c30 tsdemux: refactor pad creation
Avoid repeating the same pad creation code everywhere
2015-06-04 13:51:01 -03:00
Thiago Santos
d91f5e85e7 mpegtsbase: do not access variable after unref
Data might not exist anymore
2015-06-02 16:55:08 -03:00
Aurélien Zanelli
633b4db556 tsdemux: enable Chinese AVS video stream
Chinese broadcaster encapsulate AVS video codec into MPEG2-TS. They
use the stream_id 0x42 to identify AVS video streams. It should be noted
that this id is currently within the ISO reserved range, hence it's
utilisation is unofficial.

https://bugzilla.gnome.org/show_bug.cgi?id=727731
2015-06-02 12:41:26 +01:00
Vincent Penquerc'h
1dd94be326 tsdemux: fix buffer timestamp not being in stream time
Timestamps should start at the segment start, rather than 0, so
we need to not subtract the first timestamp. This makes the sink
correctly account for running time when switching PMTs where a
stream starts not quite at zero, causing timing offsets that can
become noticeable and causing dropped frames after a few times.
2015-05-15 14:50:35 +01:00
Vincent Penquerc'h
4a219df304 tsdemux: accumulate previous segment base time 2015-05-15 14:49:04 +01:00
Vincent Penquerc'h
29fd6332a4 tsdemux: fix refcounting when applying a new PMT
A new program object is created to replace an existing one
in the programs hash table, so its refcount needs to match.

With the default of 0 refcount on creation, the next PAT
change will cause that refcount to be both incremented and
decremented (assuming the new PAT references that stream too),
which will cause the program to be destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=748412
2015-05-15 14:45:49 +01:00
Guillaume Desmottes
94446498de tsdemux: fix taglist leak
If the stream which is about to be removed still has a ref on a tag list we
should drop it.

Fix a leak which was occasionally happening with the
validate.file.playback.change_state_intensive.tron_en_ge_aac_h264_ts scenario.

https://bugzilla.gnome.org/show_bug.cgi?id=748576
2015-04-28 14:58:03 +01:00
Jimmy Ohn
365375a1de mpegtspacketizer: fix find_subtable() return value
find_subtable() returns a pointer, so return NULL and
not FALSE when nothing is found.

https://bugzilla.gnome.org/show_bug.cgi?id=748527
2015-04-28 14:48:22 +01:00
Luis de Bethencourt
925b65b02e Rename property enums from ARG_ to PROP_
Property enum items should be named PROP_ for consistency and readability.
2015-04-27 10:55:18 +01:00
Tim-Philipp Müller
699452ef31 Remove obsolete Android build cruft
This is not needed any longer.
2015-04-26 18:59:32 +01:00
Luis de Bethencourt
fa4822a41b tsdemux: clean assignment typo
No need to set the value twice.

https://bugzilla.gnome.org/show_bug.cgi?id=745102

CID #295122
2015-04-20 11:30:28 +01:00
Luis de Bethencourt
f52cf2a7c4 tsdemux: remove dead code
position of GstSegment is an unsigned int64, it can never be below zero.

CID #1295123
2015-04-20 10:58:33 +01:00
Olivier Crête
b4219a3e63 mpegtsbase: Remove unused latency query code
The behavior changes based on the type of segment,
not on the liveness of the source.
2015-04-17 13:59:08 -06:00
Olivier Crête
a1f709c293 tsdemux: Cleanup latency query handling
The minimum latency is always 0 or more. And we should
requery upstream as it may have changed.
2015-04-17 13:59:08 -06:00
Edward Hervey
ed27244c03 mpegtspacketizer: Unify debug statements
Use 0x%04x for PIDs
2015-04-17 16:21:28 +02:00
Edward Hervey
b80ae9cdcd tsdemux: Unify duration querying code
And properly use it in the SEEKING query.

Fixes seeking with gst-play
2015-04-17 16:21:28 +02:00
Vincent Penquerc'h
cb0eaeadfd tsdemux: fix segment position tracking for the general case
Different streams can have different PTS/DTS bases, and some
streams may not even have DTS.

https://bugzilla.gnome.org/show_bug.cgi?id=745102
2015-04-16 13:35:40 +01:00
Vincent Penquerc'h
338bfe5e35 tsdemux: handle seeks with no target (ie, keep current position)
Such seeks are used to change playback rate and we do not want
to alter the position in that case, so we bypass the flush/seek
logic, and set things up so a new segment is scheduled to be
regenerated.

https://bugzilla.gnome.org/show_bug.cgi?id=735100
2015-04-09 15:44:20 +01:00
Vincent Penquerc'h
68f57d20b9 tsparse: fix timestamps not updating after a PMT change
The PCRs stay locked onto the same PID as before the change,
but the relevant PID has no reason to be the same after it.

https://bugzilla.gnome.org/show_bug.cgi?id=745102
2015-04-09 15:44:20 +01:00
Vincent Penquerc'h
ade79a9ad2 tsdemux: send new segment when a stream is added
This will happen when the PMT changes, replacing streams with
new ones. In that case, we need to accumulate the running time
from the previous chain in the segment base.

https://bugzilla.gnome.org/show_bug.cgi?id=745102
2015-04-09 15:44:20 +01:00
Vincent Penquerc'h
fc2460b331 tsdemux: keep track of current position
This allows seeking to correctly set the base on the segment.

https://bugzilla.gnome.org/show_bug.cgi?id=745102
2015-04-09 15:44:20 +01:00
Thiago Santos
b347ea9870 tsdemux: Fix segment and segment event handling during seeking
Always update the segment and not only for accurate seeking and always
send a new segment event after seeks.

For non-accurate force a reset of our segment info to start from
where our seek led us as we don't need to be accurate

https://bugzilla.gnome.org/show_bug.cgi?id=743363
2015-02-13 15:29:24 -03:00
Thiago Santos
b18a09dbec tsdemux: remove update segment logic
This is not needed in 1.x series anymore
2015-02-03 13:50:42 -03:00
Aurélien Zanelli
d0a50be26d tsdemux: don't mark streams as needing a new segment on flush
The flush is called on discont and we shouldn't output a new segment
each time a discont happens. So this commit remove the mark for a new
segment when flushing streams by propagating the 'hard' flag passed
on the flusing from the base class.

https://bugzilla.gnome.org/show_bug.cgi?id=743363
2015-02-03 13:50:42 -03:00
Sudip Jain
9f2cb50f54 mpegtsbase: scan more bytes to find initial PCRs
Fixes playback of Samsung-Colorful-Variety-1080i.ts.

https://bugzilla.gnome.org/show_bug.cgi?id=729768
2014-12-13 01:59:07 +00:00
Edward Hervey
56ae254dd3 mpegtbase: Improve last PCR detection
When dealing with random-access content (such as files), we initially
search for the last PCR in order to figure out duration and to handle
other position estimation such as those used in seeking.

Previously, the code looking for that last PCR would search in the last
640kB of the file going forward, and stop at the first PCR encountered.
The problem with that was two-fold:
* It wouldn't really be the last PCR (it would be the first one within
  those last 640kB. In case of VBR files, this would put off duration
  and seek code slightly.
* It would fail on files with bitrates higher than 52Mbit/s (not common)

Instead this patch modifies that code by:
* Scanning over the last 2048kB (allows to cope with streams up to 160Mbit/s)
* Starts by the end of the file, going over chunks of 300 MPEG-TS packets
* Doesn't stop at the first PCR detected in a chunk, but instead records all
  of them, and only stop searching if there was "at least" one PCR within
  that chunk

This should improve duration reporting and seeking operations on VBR files

https://bugzilla.gnome.org/show_bug.cgi?id=708532
2014-12-01 15:04:25 +01:00
Edward Hervey
16fc431ada tsdemux: Only activate warning for real streams
streams with stream_type 0xff are PCR-only streams, it's normal not
to have a pad for them.
2014-12-01 13:31:21 +01:00
Ramprakash Jelari
f9e50eee58 mpegtspacketizer: Fix format string compiler warning 2014-11-24 13:34:21 +01:00
Matthieu Bouron
0b040b7131 mpegtsbase: do not remove programs on EOS
As a consequence, tsdemux won't remove its pads anymore on EOS.

Fixes the case when mpegtsbase is not able to process new packets
after EOS as the corresponding pids aren't known anymore because
the programs were removed and the pes/psi were kept, preventing the
PAT to be parsed again.

https://bugzilla.gnome.org/show_bug.cgi?id=738695
2014-10-30 16:28:40 +01:00
Jan Schmidt
068cba5df6 tsparse: Handle backward and discont timestamps better.
Assume that small backward PCR jumps are just from upstream packet
mis-ordering and don't reset timestamp tracking state - assuming that
things will be OK again shortly.

Make the threshold for detecting discont between sequential buffers
configurable and match the smoothing-latency setting on tsparse
to better cope with data bursts.
2014-10-29 23:02:50 +11:00
Jan Schmidt
a49ce685d1 tsparse: Implement timestamp/retimestamping of output buffers
When the set-timestamps property is set, use PCRs on the provided
(or autodetected) pcr-pid to apply (or replace) timestamps on the
output buffers, using piece-wise linear interpolation.

This allows tsparse to be used to stream an arbitrary mpeg-ts file,
or to smooth jittery reception timestamps from a network stream.

The reported latency is increased to match the smoothing latency if
necessary.
2014-10-29 23:02:50 +11:00
Tim-Philipp Müller
2cd4f5d0c1 tsdemux: send initial GAP event on sparse streams for faster startup with playbin
Signal sparse streams properly in stream-start event and force sending
of pending sticky events which have been stored on the pad already and
which otherwise would only be sent on the first buffer or serialized
event (which means very late in case of subtitle streams). Playsink in
playbin waits for stream-start or another serialized event, and if we
don't do this it will wait for the multiqueue to run full before
starting playback, which might take a couple of seconds.

https://bugzilla.gnome.org/show_bug.cgi?id=734040
2014-10-20 12:32:19 +02:00
Edward Hervey
b59a9262c0 tsdemux: GAP detection
All pads of a stream are now added at the beginning. In order to cope with
streams that don't get any data (forever or for a long time) we detect gaps
and push out GAP events when needed.

Cleanups and commenting by Jan Schmidt <jan@centricular.com>

https://bugzilla.gnome.org/show_bug.cgi?id=734040
2014-10-20 12:32:10 +02:00
Jesper Larsen
1b8e76d235 tsdemux: do not discard on discont if PES start
If a discontinuity in the stream is detected, data is discarded until
a new PES starts. If the first packet after the discontinuity is also
the start of a PES, there is no reason to discard the packets.

https://bugzilla.gnome.org/show_bug.cgi?id=737569
2014-09-29 11:41:01 +02:00
Aurélien Zanelli
77b850c08d tsdemux: fix trivial coding style issue
https://bugzilla.gnome.org/show_bug.cgi?id=736531
2014-09-12 11:31:59 +02:00
Aurélien Zanelli
6d767a09d8 tsdemux: fix overflow of packet_length field of PESHeader
packet_length is defined as a guint16 in the PESHeader structure. This
definition match the specification. But since we add 6 bytes to the
packet_length value (length of start_code + stream_id + packet_length),
we can overflow the guint16 when the value in the PES header is greater
than 65529.
So use a guint32 instead of a guint16 to avoid overflow.

https://bugzilla.gnome.org/show_bug.cgi?id=736490
2014-09-12 11:27:52 +02:00
Jesper Larsen
ff444dbf6d tsdemux: clear mutex resources in dispose
https://bugzilla.gnome.org/show_bug.cgi?id=736390
2014-09-10 18:53:47 +01:00
Thiago Santos
52257fe538 tsdemux: remove pads when resetting the element
Otherwise the pads will be there if it is restarted and the stream
can be a completely different one.

https://bugzilla.gnome.org/show_bug.cgi?id=734394
2014-08-19 00:02:33 -03:00