Commit graph

7326 commits

Author SHA1 Message Date
Olivier Crête
7af9fdbca6 rtpsession: Process PSFB FIR requests which lack the media ssrc
According to RFC 5104 section 4.3.1.2, RTCP PSFB FIR message SHALL
have a media_ssrc field set to 0. The actual media ssrc is in the FCI.
So in that case, we ignore the retained feedback and just let it through
to the rtp_session_process_fir() function which will check for the actual
SSRC inside the FCI.

Fixes a regression introduced by commit 57c27ec3
2013-12-13 16:01:07 -05:00
George Kiagiadakis
6a2de911fa rtpsession: fix rb blocks disappearing after the first rtcp cycle with multiple senders
Previously, when the session had multiple internal sender SSRCs, it would
issue SR reports with RB blocks only on the first RTCP timeout and afterwards
SR reports would be sent empty. This was because the "generation" number
in RTPSource would increase more than once during the same cycle and afterwards
it would always be greater than the session's generation, which would cause
it to be skipped from being included in RBs.

This commit fixes this problem by:
1) Increasing the RTPSource generation only at the end of each cycle,
which essentially fixes the problem but only when the internal senders
are less than GST_RTCP_MAX_RB_COUNT.
2) Keeping for each RTPSource a set of SSRCs which stores which SSRC's
SR the given RTPSource has been reported in, which also fixes the problem
when the internal senders are more than GST_RTCP_MAX_RB_COUNT. This is
necessary because of the fact that any RTPSource is marked as reported
in itself's SR and makes it impossible to know if it has been reported
in other SRs too or not, and which.
2013-12-12 16:44:27 +01:00
George Kiagiadakis
c78a115154 rtpsession: keep extra stats for scheduling BYE
Keep an extra stats structure for scheduling the BYE packets. When we
decide to schedule BYE, make a copy of the current stats into the
bye_stats. Then while we schedule the BYE, update and use only the
bye_stats. When we finished scheduling the BYE packet, we use the
regular stats again.
2013-12-12 10:38:43 +01:00
George Kiagiadakis
282028e753 rtpsession: when we schedule BYE, only deal with BYE sources
When we are doing the RTCP timeout to schedule BYE packets, don't
generate RTCP for all sources but only for the sources marked as BYE.
2013-12-12 10:34:38 +01:00
George Kiagiadakis
6a421c3d81 rtpsession: reset state after scheduling BYE
After we do RTCP, we are not scheduling bye anymore.
2013-12-12 10:32:48 +01:00
George Kiagiadakis
0a0ff100ef rtpsession: also count NACKS when no signal was pending 2013-12-12 10:31:38 +01:00
George Kiagiadakis
bec9c04ea0 session: ignore RTCP packets for the BYE sources
When we are scheduling BYE packets, ignore all RTCP for the sources that
are scheduling a BYE packet. Other sources that are not scheduling BYE
should continue receiving RTCP packets as usual.
2013-12-12 10:09:25 +01:00
Julien Isorce
33b398e345 rtpsession: determine if the session is doing point-to-point
In this case T_dither_max is set to 0 according to RFC 4585
2013-12-10 16:57:56 +01:00
Wim Taymans
eee515cb2c rtpjitterbuffer: serialize events in the buffer
Serialize events into the jitterbuffer by inserting them with a -1
seqnum.
Update unit test to expect events from the streaming thread.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=652986
2013-12-10 11:57:37 +01:00
Wim Taymans
36e78bc5ca rtpjitterbuffer: detect -1 seqnum
Keep the seqnum as a full guint so that we can check for -1 entries and
deal with them correctly.
Immediately try to push -1 seqnum.
2013-12-10 11:04:06 +01:00
Wim Taymans
4a2e0f4ff4 rtpjitterbuffer: reorganize jitterbuffer items
Keep the oldest item at the head and the newest items on the tail. This
makes it easier to deal with -1 seqnums.
2013-12-10 11:01:03 +01:00
Wim Taymans
ea2a222cef jitterbuffer: correctly check for invalid values
Check for -1 on the guint from the buffer item instead of on the guint16
or guint32.
Also insert -1 seqnum at the head of the jitterbuffer.
2013-12-09 23:34:10 +01:00
Sebastian Dröge
f3c3dee148 mulawdec: Require caps to be set before accepting any data 2013-12-05 12:15:29 +01:00
Sebastian Dröge
d585bd7bbd rtptheorapay: Don't send headers twice if we got them from the caps already 2013-12-04 21:58:29 +01:00
Sebastian Dröge
d105de6e0f rtptheorapay: Don't leak config data when receiving a second CAPS event 2013-12-04 21:58:29 +01:00
Sebastian Dröge
0915d696c7 rtpvorbispay: Don't send headers twice if we got them from the caps already 2013-12-04 21:58:29 +01:00
Sebastian Dröge
967280df42 rtpvorbispay: Don't leak config data when receiving a second CAPS event 2013-12-04 21:58:29 +01:00
Sebastian Dröge
d87f6cf483 rtpstreamdepay: Add RFC4571 RTP stream depayloading element
https://bugzilla.gnome.org/show_bug.cgi?id=719829
2013-12-04 21:58:29 +01:00
Sebastian Dröge
c5284dc047 rtpstreampay: Add RFC4571 RTP stream payloading element
https://bugzilla.gnome.org/show_bug.cgi?id=719829
2013-12-04 21:58:29 +01:00
Thiago Santos
1fd094d96b qtdemux: improve fragment-start tracking
Some buffers can have multiple moov atoms inside and the strategy
of using the gst_adapter_prev_pts timestamp to get the base timestamp
for the media of the fragment would fail as it would reuse the same
base timestamp for all moofs in the buffer instead of accumulating
the durations for all of them.

Heres a better explanation of the issue:
qtdemux receives a buffer where PTS(buf) = X
buf -> moofA | moofB | moofC

The problem was that PTS(buf) was used as the base timestamp for
all 3 moofs, causing all buffers to be X based. In this case we want
only moofA to be X based as it is what the PTS on buf means, and the
other moofB and moofC just use the accumulated timestamp from the
previous moofs durations.

To solve this, this patch uses gst_adapter_prev_pts distance
result, this allows qtdemux to calculate if it should use the
resulting pts or just accumulate the samples as it can identify
if the moofs belong to the same upstream buffer or not.

https://bugzilla.gnome.org/show_bug.cgi?id=719783
2013-12-04 10:36:38 -03:00
Wim Taymans
0d55724a2b audioparsers: don't leak template caps 2013-12-04 09:12:07 +01:00
Wim Taymans
e0a5c07e8d audioparsers: use ACCEPT_INTERSECT flag
The parser can accept input that is not completely specified. Use the
ACCEPT_INTERSECT flag on the sinkpad to tweak the acceptcaps function to
check for intersection only. This allows us to proxy downstream
constraints while still allowing non-subset caps as input.
We can then also remove the appended template caps workaround.
Make a unit-test to check the new feature.

This reverts commit 26040ee38c

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=705024
2013-12-03 22:26:44 +01:00
Wim Taymans
e3f393f7e6 audioparsers: remove fields from filter
We need to remove the fields from the filter when we can convert
between them.
2013-12-03 21:39:57 +01:00
Wim Taymans
e8313a1e70 audioparsers: refactor code to remove caps fields 2013-12-03 21:29:13 +01:00
Tim-Philipp Müller
a424fb289b deinterlace: microoptimisation: avoid some unnecessary GValue copies 2013-12-02 00:10:43 +00:00
Tim-Philipp Müller
63b0e84add deinterlace: fix off-by-one crash when downstream caps contain a list of framerates
https://bugzilla.gnome.org/show_bug.cgi?id=719544
2013-12-01 23:33:04 +00:00
Thiago Santos
079dde49ed qtdemux: Use the timestamp of the moof as the base fragment start
In SmoothStreaming fragmented scenario, the timestamps are calculated
starting from the fragment buffer timestamp. When there is a not-linked
return from downstream, qtdemux will return upstream and will keep the
non-pushed data into its adapter.

On a new fragment buffer pushed to qtdemux, the new buffer timestamp
would overwrite the previous one that should be used on the still
to be pushed buffers. Because of this, this patch will also
update the fragment_start timestamp from the adapter last pts
to make sure the moof and timestamps are in sync and will result
in correct timestamps for all fragments.
2013-11-29 17:28:48 -03:00
Thiago Santos
45c16599ff qtdemux: avoid re-reading the same moov and entering into loop
In the scenario of "mdat | moov (with fragmented artifacts)" qtdemux
could read the moov again after the mdat because it was considering the
media as a fragmented one.

To avoid this loop this patch makes it store
the last processed moov_offset to avoid parsing it again.
And it also checks if there are any samples to play before
resturning to the mdat, so that it knows there is new data to be played.

https://bugzilla.gnome.org/show_bug.cgi?id=691570
2013-11-29 17:28:48 -03:00
Thiago Santos
fcc78aa3bd qtdemux: do not free streams if they were not created locally
When parsing a trak only free streams on failures if those streams
were created locally. They could have been created from a previous
fragment, in this case we they have valid info from the other fragment.
Including pads.

https://bugzilla.gnome.org/show_bug.cgi?id=691570
2013-11-29 17:28:48 -03:00
Sebastian Dröge
220a947dc7 videomixer: Simplify NV12/21 blending code macros 2013-11-29 19:57:46 +01:00
Sebastian Dröge
b0529e0fe8 videomixer: Fix segfault when filling the background of a UYVY frame
https://bugzilla.gnome.org/show_bug.cgi?id=712401
2013-11-29 19:52:34 +01:00
Tim-Philipp Müller
4278ab18ff qtdemux: fix compilation with gst debuging disabled
qtdemux.c:9452:1: error: label at end of compound statement
2013-11-29 09:21:52 +00:00
Jonas Holmberg
0ab0421759 rtph264pay: Map inbuffer once only
Do not call gst_buffer_extract() twice since each call will map and
unmap the biffer.

https://bugzilla.gnome.org/show_bug.cgi?id=719434
2013-11-28 16:08:40 -05:00
Tim-Philipp Müller
b8f689a9d9 videoflip: don't crash on tag events without orientation tag
Would crash in g_free() trying to free an uninitialised pointer.

https://bugzilla.gnome.org/show_bug.cgi?id=719497
2013-11-28 16:09:04 +00:00
Wim Taymans
e8edecc56e rtpsession: don't unref buffer twice
Cleaning the packet info will already unref the buffer.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=715078
2013-11-28 16:51:13 +01:00
Jan Schmidt
b3b89dfec1 qtdemux: Add HydrogenAudio ReplayGain tags
Identical to the itunes (tm) version, but labelled with
org.hydrogenaudio.replaygain as the producer.
2013-11-28 22:36:44 +11:00
Mathieu Duponchelle
532598e360 videomixer: explicitly fail when alpha information would have been lost. 2013-11-27 16:35:46 +01:00
Sebastian Dröge
fb14f66696 matroska-demux: Allow a bit more variation when detecting common framerates
Instead of +/- 1ns we allow 2ns now. Due to rounding errors there are
some Matroska files out there with 33.333331ms per frame for 30fps.
2013-11-26 11:17:42 +01:00
Sebastian Dröge
20ad174679 matroska-demux: Use gst_util_double_to_fraction() instead of GValue magic 2013-11-26 10:21:04 +01:00
Nicolas Dufresne
c42bc9efa0 videoflip: Set default method at contruction
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=712333
2013-11-25 14:03:21 -05:00
Wim Taymans
710d1f3a2a rtpjitterbuffer: improve clear-pt-map handling
Don't reset the expected output seqnum when clearing the pt map because this
could stall the jitterbuffer forever.
Add a unit test for this.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=709800
2013-11-25 15:52:22 +01:00
Jan Schmidt
fdfc6a2a86 qtdemux: Discard 2 byte subpicture packets
As for text subtitles and as suggested in #712643, throw
away the 2 byte terminator packets that some encoders insert.

This will make things better when remuxing and causes generation
of gap events.
2013-11-25 12:24:22 +11:00
Tim-Philipp Müller
901ec63462 rtpjitterbuffer: fix wake-up when new buffers come in after running empty
Spotted by 'gratias' on IRC. Probably introduced in recent refactoring.

https://bugzilla.gnome.org/show_bug.cgi?id=715039
2013-11-25 00:37:50 +00:00
Mark Nauwelaerts
643e6fdc36 matroskamux: correctly handle negative relative timestamps
... rather than scaling these as unsigned.

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

Based on patch by Krzysztof Kotlenga <pocek@users.sf.net>
2013-11-23 12:25:05 +01:00
MathieuDuponchelle
83f8ee1d41 videomixer2: Merge tag events to send them in collected.
Otherwise there were race conditions where we would send tags
on a flushing srcpad.

We have a test for that in GES, but this should be tested
systematically with harness in the future as I believe it
is useful for exactly that kind of cases.

https://bugzilla.gnome.org/show_bug.cgi?id=708165
2013-11-22 18:54:35 -03:00
Thibault Saunier
a45d470236 qtdemux: Use GstVideoInfo helper to create caps for raw video
This way we do not miss mandatory fields in caps.
At the same time use the gst_pb_utils_get_codec_description
helper to get codec description.

https://bugzilla.gnome.org/show_bug.cgi?id=712335
2013-11-22 18:52:54 -03:00
Thibault Saunier
6ff7522ba2 matroskademux: Use GstVideoInfo helper to create caps for raw video
This way we do not miss mandatory fields in caps.
At the same time use the gst_pb_utils_get_codec_description helper to
get codec description.

https://bugzilla.gnome.org/show_bug.cgi?id=712328
2013-11-22 18:52:54 -03:00
Thibault Saunier
1fc591238b multifilesrc: Implement seeking in case of multiple images
https://bugzilla.gnome.org/show_bug.cgi?id=712254
2013-11-22 18:52:54 -03:00
Wim Taymans
4c9474905b rtpjitterbuffer: pass downstream flowreturn to upstream
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=712722
2013-11-22 12:27:31 +01:00
Tim-Philipp Müller
d9c2914c90 g_memmove() is deprecated
Just use plain memmove(), g_memmove() is deprecated in
recent GLib versions.

https://bugzilla.gnome.org/show_bug.cgi?id=712811
2013-11-21 15:30:34 +00:00