[gstreamer-bugs] [Bug 311848] New: Renegotiation broken

bugzilla-daemon at bugzilla.gnome.org bugzilla-daemon at bugzilla.gnome.org
Thu Jul 28 04:05:36 PDT 2005


Please DO NOT reply to this by email. All additional comments should be made in
the comments box of this bug report.

 http://bugzilla.gnome.org/show_bug.cgi?id=311848
 GStreamer | gstreamer (core) | Ver: HEAD CVS

           Summary: Renegotiation broken
           Product: GStreamer
           Version: HEAD CVS
          Platform: Other
        OS/Version: Linux
            Status: UNCONFIRMED
          Severity: major
          Priority: High
         Component: gstreamer (core)
        AssignedTo: gstreamer-bugs at lists.sourceforge.net
        ReportedBy: rbultje at ronald.bitfreak.net
         QAContact: gstreamer-bugs at lists.sourceforge.net
                CC: wim at fluendo.com,all-bugs at bugzilla.gnome.org


gst-launch-0.9 videotestsrc !
video/x-raw-yuv,width=200,height=150,format=\(fourcc\)YUY2 ! ffmpegcolorspace !
videoscale ! ximagesink

Resize the ximagesink window (to emulate what Totem does), and observe
interesting behaviour, such as crashes if you decrease size and garbled output
if you increase window size.

The negotiation of the new size will fail in ffmpegcolorspace's
gst_base_transform_setcaps() in the no_transform_possible case, because it
somehow tries to set the new window's size from videoscale on ffmpegcolorspace
(all this during gst_pad_alloc_buffer()), this fails because the sizes don't
match, and after that, stuff collapses.

Here's a backtrace of the no_transform_possible in ffmpegcolorspace:

#6  0x406d9f21 in gst_base_transform_setcaps (pad=0x869d008, caps=0x86b5de0)
    at gstbasetransform.c:447
#7  0x4004b5f2 in gst_pad_set_caps (pad=0x869d008, caps=0x86b5de0)
    at gstpad.c:1933
#8  0x4004c0d4 in gst_pad_alloc_buffer (pad=0x869d008,
    offset=18446744073709551615, size=120000, caps=0x86b5de0, buf=0x4122c258)
    at gstpad.c:2021
#9  0x406da1b7 in gst_base_transform_handle_buffer (trans=0x869aa90,
    inbuf=0x86b2ca0, outbuf=0x4122c258) at gstbasetransform.c:587
#10 0x406da533 in gst_base_transform_chain (pad=0x869cf38, buffer=0x86b2ca0)
    at gstbasetransform.c:658
#11 0x4004d11c in gst_pad_chain (pad=0x869cf38, buffer=0x86b2ca0)
    at gstpad.c:2844
#12 0x4004d62d in gst_pad_push (pad=0x86ab070, buffer=0x86b2ca0)
    at gstpad.c:2930
#13 0x4081e3aa in gst_capsfilter_chain (pad=0x0, buf=0x86b2ca0)
    at gstcapsfilter.c:194
---Type <return> to continue, or q <return> to quit---
#14 0x4004d11c in gst_pad_chain (pad=0x86ab240, buffer=0x86b2ca0)
    at gstpad.c:2844
#15 0x4004d62d in gst_pad_push (pad=0x8687cb8, buffer=0x86b2ca0)
    at gstpad.c:2930
#16 0x406d78c6 in gst_base_src_loop (pad=0x8687cb8) at gstbasesrc.c:677
#17 0x4005e4c6 in gst_task_func (task=0x86ac100, tclass=0x86b5958)
    at gsttask.c:126
#18 0x40301b5a in g_thread_pool_free () from /usr/lib/libglib-2.0.so.0
#19 0x402ffe9a in g_static_private_free () from /usr/lib/libglib-2.0.so.0
#20 0x40237341 in start_thread () from /lib/tls/libpthread.so.0
#21 0x40417fee in clone () from /lib/tls/libc.so.6
(gdb) print gst_caps_to_string (caps) <- in frame 6
$1 = (
    gchar *) 0x86c7dd8 "video/x-raw-rgb, bpp=(int)32, depth=(int)24,
endianness=(int)4321, red_mask=(int)65280, green_mask=(int)16711680,
blue_mask=(int)-16777216, width=(int)201, height=(int)152, framerate=(double)30,
pixel"...

Let's now look at gst-launch-0.9 videotestsrc !
video/x-raw-yuv,width=200,height=150,format=\(fourcc\)YUY2 ! queue !
ffmpegcolorspace ! videoscale ! ximagesink, and resize the window again, which
more closely resembles Totem's behaviour; it will directly quit at:

ERROR (0x8f19310 - 0:00:02.947686000)  queue_dataflow(30547)
gstqueue.c(783):gst_queue_loop:<queue0> streaming stopped, reason pad not negotiated
ERROR (0x8f19310 - 0:00:02.947818000)  queue_dataflow(30547)
gstqueue.c(783):gst_queue_loop:<queue0> streaming stopped, reason pad not negotiated
ERROR: from element /pipeline0/queue0: streaming stopped, reason pad not negotiated

I have the feeling that this is because of ASYNC caps. Problem is that
gst_pad_buffer_alloc() calls gst_pad_set_caps(), whereas the normal dataflow
also calls this, and those could conflict in some cases. I'd rather see
gst_pad_buffer_alloc() only check whether pads can accept the caps, and have
actual normal dataflow take care of forward renegotiation afterwards (i.e. move
responsibility of renegotiation further down the stack).

------- You are receiving this mail because: -------
You are the assignee for the bug.
You are the QA contact for the bug.




More information about the Gstreamer-bugs mailing list