[meta-freescale] Gstreamer pipeline problem
Chris Tapp
opensource at keylevel.com
Mon Jul 15 09:41:17 PDT 2013
On 15 Jul 2013, at 09:24, Thomas Senyk wrote:
> On Friday, 12 July, 2013 17:35:01 Chris Tapp wrote:
>> Hi Thomas,
>>
>> Some more info below:
>>
>> On 11 Jul 2013, at 09:39, Thomas Senyk wrote:
>>> On Wednesday, 10 July, 2013 20:53:58 Chris Tapp wrote:
>>>> On 10 Jul 2013, at 20:19, Chris Tapp wrote:
>>>>> I've got an application which uses playbin2 to capture video. The
>>>>> pipeline
>>>>> is of the form:
>>>>>
>>>>> playbin2 uri=... video-sink="queue2 ! videoscale ! video/x-raw-rgb,
>>>>> pixel-aspect-ratio=1/1, width=<capture-width>, height=<capture-height> !
>>>>> fakesink"
>>>>>
>>>>> I then get the "frame" property from the pipeline and use this to grab
>>>>> the
>>>>> latest frame.
>>>>>
>>>>> This works on my development system (Ubuntu 11.10) and a Cedar Trail /
>>>>> Yocto system, but the pipeline fails on the Wandboard Quad. I think this
>>>>> is related to:
>>>>>
>>>>> 0:00:13.028151336 1349 0x4442d520 WARN basetransform
>>>>> /media/SSD-RAID/build-danny-wandboard/tmp/work/armv7a-vfp-neon-poky-linu
>>>>> x
>>>>> -gnueabi/gstreamer/0.10.36-r2/gstreamer-0.10.36/libs/gst/base/gstbasetra
>>>>> ns
>>>>> form.c:1304:gst_base_transform_setcaps:<videoscale0x2ab820> transform
>>>>> could not transform video/x-raw-yuv, width=(int)854, height=(int)480,
>>>>> framerate=(fraction)24/1, format=(fourcc)I420, interlaced=(boolean)false
>>>>> in anything we support
>>>>>
>>>>> I added an ffmpegcolorspace element betwween the queue2 and the
>>>>> videoscale
>>>>> to get round this and the pipeline now builds, but only a few frames are
>>>>> captured. There are different diagnostics showing:
>>>>>
>>>>> 0:00:02.881403000 1361 0x28da60 WARN vpudec
>>>>> vpudec.c:914:gst_vpudec_core_create_and_register_frames: Allocate
>>>>> Internal framebuffers!!!! Message Callback : Element playbin0x250b68
>>>>> changed state from READY to PAUSED. 0:00:03.237675000 1361 0x28da60
>>>>> WARN vpudec vpudec.c:1578:gst_vpudec_chain: Got no
>>>>> frame
>>>>> buffer message, return 0x89, 8 frames in displaying queue!!
>>>>> 0:00:03.242324334 1361 0x28da60 WARN vpudec
>>>>> vpudec.c:1578:gst_vpudec_chain: Got no frame buffer message, return
>>>>> 0x89,
>>>>> 8 frames in displaying queue!!
>>>>>
>>>>> <lots of repeats>
>>>>>
>>>>> 0:00:08.499914334 1382 0x28d860 WARN vpudec
>>>>> vpudec.c:1655:gst_vpudec_chain: Retry too many times, maybe BUG!!
>>>>> 0:00:08.500784667 1382 0x28d860 WARN vpudec
>>>>> vpudec.c:1578:gst_vpudec_chain: Got no frame buffer message, return
>>>>> 0x88,
>>>>> 8 frames in displaying queue!!
>>>>>
>>>>> <lots of repeats>
>>>>>
>>>>> Message Callback : Element playbin0x250aa0 changed state from PAUSED to
>>>>> PLAYING. 0:00:09.253202667 1382 0x28d860 WARN vpudec
>>>>> vpudec.c:1578:gst_vpudec_chain: Got no frame buffer message, return
>>>>> 0x88,
>>>>> 8 frames in displaying queue!!
>>>>>
>>>>> 0:00:13.364523335 1460 0x142ec0 WARN mfw_v4lsink
>>>>> mfw_gst_v4l_buffer.c:435:mfw_gst_v4l2_new_buffer: Try new buffer failed,
>>>>> ret 2 No such file or directory queued 0
>>>>>
>>>>>
>>>>> The "Message Callback" events are my own logging to try and see what's
>>>>> happening in my app.
>>>>>
>>>>> Is this something I'm doing wrong, or are these messages a real issue
>>>>> somewhere?
>>>>
>>>> This is when playing a .webm. The results for an .flv are as expected.
>>>
>>> is it the same when you use v4l2 sink instead of fakesink?
>>> Is playbin (without defining the pipeline) behaving the same?
>>
>> I've run some tests using pipelines of the form:
>>
>> gst-launch playbin2=file://trailer.webm video-sink="<a-sink-to-test>"
>>
>> GST_DEBUG was set to "*:2"
>>
>> 1) When the sink is set to "mfw_4vlsink" I get full screen video playback;
>> 2) When the sink is set to "fakesink" I get nothing on the screen (as
>> expected), and no debug of interest; 3) When the sink is set to "queue2 !
>> mfw_4vlsink" I get very choppy full screen video playback (which eventually
>> stalls) and debug output as originally reported; 4) When the sink is set to
>> "queue2 ! fakesink" I get nothing on the screen (as expected), and no debug
>> of interest; 5) When the sink is set to "queue2 ! fakesink sync=1" I get
>> nothing on the screen and debug output as originally reported.
>>
>> These were all run from the command line, no 'X' running.
>>
>> It looks like queue2 + sync=1 (default for v4lsink) combination causes the
>> problem... Setting sync=0 for v4lsink makes no difference and looks to be
>> ignored.
>
> Do you actually need queue2 or sync=1?
>
> Your end goal is to get everything into your opengl context and render it,
> right?
> Shouldn't you be good with setting up a minimal gstreamer pipeline and let
> gstreamer handle the rest?
I normally run a basic playbin2 pipeline to 'fakesink'. When it's time to render I grab the latest frame via playbin2, upload this into a texture and render.
I seem to need queue2 on the video-sink and audio-sink to keep them in sync. Video sinks generally set sync=1 by default, but fakesink doesn't. If this isn't set, then the video plays too fast and loses sync with the audio.
>
> Don't get me wrong. I'm not an gstreamer expert :)
> I'm just trying to give any (possibly) useful hint I have :)
Me neither. Any hints are more than welcome ;-)
>
>
>>
>> Things also 'get confused' at times and 1) doesn't work anymore without a
>> restart.
>
> I've seen this as well .. the framebuffer gets black and nothing seems to be
> able to render to it anymore ... I think for me it's something with vpu vs.
> gpu memory (which is the same 'allocation' on the unified-memory)
>
> See:
> https://community.freescale.com/docs/DOC-93591
>
> Do you see any allocation errors?
> I'm going to play with 'gpumem' today to see if I can get better/stable
> results.
>
>>
>> Does any of that help? ;-)
>
>
> Another thing I spotted:
> I just looked at your original mail and from the work I've done last week I
> can tell that I've never seen* or therefor used x-raw-rgb
> * 'seen' as in: source file having rgb format
>
> For me there was no need ... I'm having a sink (Qt/c++ code) which takes x-
> raw-yuv ... this code give the frame over to the opengl-scenegraph and then I
> map this memory with code like:
>
> void *bits = (void*)mFrame.bits();
> GLuint physical = ~0U;
> glTexDirectVIVMap_LOCALE(GL_TEXTURE_2D, w, h, GL_VIV_YV12, &bits, &physical);
>
>
> This is then directly used in the shaders without any YUV->RGB code. The
> texture units knows YUV and does the texture-coordinate/color-lookup
> accordingly.
> ... what I'm trying to say: you don't have to convert to GL_RGB(A).
>
>
>
>>
>> Chris Tapp
>>
>> opensource at keylevel.com
>> www.keylevel.com
Chris Tapp
opensource at keylevel.com
www.keylevel.com
More information about the meta-freescale
mailing list