[Bug 769949] New: baseparse: Buffers are dropped after concat element switches pad
GStreamer (GNOME Bugzilla)
bugzilla at gnome.org
Mon Aug 15 19:39:15 UTC 2016
https://bugzilla.gnome.org/show_bug.cgi?id=769949
Bug ID: 769949
Summary: baseparse: Buffers are dropped after concat element
switches pad
Classification: Platform
Product: GStreamer
Version: git master
OS: Linux
Status: NEW
Severity: normal
Priority: Normal
Component: gst-plugins-bad
Assignee: gstreamer-bugs at lists.freedesktop.org
Reporter: dv at pseudoterminal.org
QA Contact: gstreamer-bugs at lists.freedesktop.org
GNOME version: ---
If a baseparse-based element is placed after a concat element, and the parser
element lets baseparse compute timestamps, then after concat switches to the
next sinkpad, baseparse will drop buffers.
Example:
gst-launch-1.0 -v \
filesrc location=test.mp3 name=a \
filesrc location=test.mp3 name=b \
concat name=c \
a. ! c. b. ! c. \
c. ! mpegaudioparse ! fakesink sync=false silent=false
The -v switch shows that after concat switched to element "b", no buffers are
received by the fakesink.
(I picked mpegaudioparse because it fulfilled the criteria above. It does not
have to be MP3 data.)
After some digging, I found that it may have something to do with the PTS
timestamps that come from the sources. I inserted identity elements into the
pipeline to check:
gst-launch-1.0 -v \
filesrc location=test.mp3 ! identity silent=false name=a \
filesrc location=test.mp3 ! identity silent=false name=b \
concat name=c \
a. ! c. b. ! c. \
c. ! mpegaudioparse ! fakesink sync=false silent=false
And the output shows for "a":
/GstPipeline:pipeline0/GstIdentity:a: last-message = chain ******* (a:sink)
(4096 bytes, dts: 0:00:00.000000000, pts: none, duration: none, offset: 0,
offset_end: 4096, flags: 00000040 discont ) 0x7f3f280060b0
/GstPipeline:pipeline0/GstIdentity:a: last-message = chain ******* (a:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 4096, offset_end:
8192, flags: 00000000 ) 0x7f3f280063e0
/GstPipeline:pipeline0/GstIdentity:a: last-message = chain ******* (a:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 8192, offset_end:
12288, flags: 00000000 ) 0x7f3f280061c0
/GstPipeline:pipeline0/GstIdentity:a: last-message = chain ******* (a:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 12288, offset_end:
16384, flags: 00000000 ) 0x7f3f280064f0
/GstPipeline:pipeline0/GstIdentity:a: last-message = chain ******* (a:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 16384, offset_end:
20480, flags: 00000000 ) 0x7f3f280060b0
....
while for "b", it shows:
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: 0:00:00.000000000, pts: 0:00:00.000000000, duration: none,
offset: 0, offset_end: 4096, flags: 00000040 discont ) 0x7f5884006820
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 4096, offset_end:
8192, flags: 00000000 ) 0x7f5884006b50
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 8192, offset_end:
12288, flags: 00000000 ) 0x7f5884006600
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 12288, offset_end:
16384, flags: 00000000 ) 0x7f5884006c60
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 16384, offset_end:
20480, flags: 00000000 ) 0x7f5884006930
/GstPipeline:pipeline0/GstIdentity:b: last-message = chain ******* (b:sink)
(4096 bytes, dts: none, pts: none, duration: none, offset: 20480, offset_end:
24576, flags: 00000000 ) 0x7f5884006600
....
Note that the first "a" buffer has PTS NONE, while the first "b" buffer has PTS
0.
It is my impression that baseparse sees this first PTS 0, and bases its
computed PTS on that. In other words, they start at 0, and they are *not*
adjusted to the segment's base time. The result is that baseparse drops the
buffer because the timestamp is too old:
0:00:00.115488463 19446 0x20f7720 TRACE baseparse
gstbaseparse.c:2389:gst_base_parse_push_frame:<mpegaudioparse0> pushing frame
0x7f3a5c0021e0
0:00:00.115496270 19446 0x20f7720 LOG baseparse
gstbaseparse.c:2399:gst_base_parse_push_frame:<mpegaudioparse0> processing
buffer of size 288 with dts 0:00:00.036000000, pts 0:00:00.036000000, duration
0:00:00.036000000
0:00:00.115512084 19446 0x20f7720 LOG baseparse
gstbaseparse.c:1858:gst_base_parse_update_bitrates:<mpegaudioparse0> frame
bitrate 64000, avg bitrate 64000
0:00:00.115520227 19446 0x20f7720 LOG baseparse
gstbaseparse.c:2525:gst_base_parse_push_frame:<mpegaudioparse0> Dropped frame,
before segment
0:00:00.115525584 19446 0x20f7720 LOG baseparse
gstbaseparse.c:2534:gst_base_parse_push_frame:<mpegaudioparse0> frame (288
bytes) dropped
0:00:00.115532254 19446 0x20f7720 LOG baseparse
gstbaseparse.c:2173:gst_base_parse_handle_buffer:<mpegaudioparse0> handle_frame
skipped 0, flushed 288
0:00:00.115539301 19446 0x20f7720 TRACE baseparse
gstbaseparse.c:711:gst_base_parse_frame_free: freeing frame 0x7f3a5c0021e0
....
However, I am not sure if this is a bug in basesrc or in baseparse. basesrc's
behavior with regards to the first buffer's PTS is odd. I do not know if it is
expected though.
--
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.
More information about the gstreamer-bugs
mailing list