How connect playbin + deinterlace + DMA . Processor overloading

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How connect playbin + deinterlace + DMA . Processor overloading

809 Views
ignat
Contributor I

Hi all!

I have big trouble with interaliasing in gstreamer pipeline

That pipeline 

 gst-launch-1.0 playbin flags=0x00000207 uri=dvd:// video-sink="imxeglvivsink"

create overload of proccessor IMX because that code constantly copy data with help CPU  from interaliasing buffers in gstreamer-imx-master/src/eglvivsink/gles2_renderer.c

GST_LOG("copying pixels into VIV direct texture buffer");

If i launch that pipeline my cpu load very low (5-10 %) load because i use DMA but frames is not deinterlaced:

gst-launch-1.0 playbin flags=0x00000007 uri=dvd:// video-sink="imxeglvivsink"

Quesiton : how enable DMA with deinterlace in gstreamer?

Thanks .

I am repeating gles2_renderer.c  piece code: 

if (is_phys_buf)
{
GLvoid *virt_addr;
GLuint phys_addr;

phys_addr = (GLuint)(phys_mem_meta->phys_addr);

/* Safeguard to catch data loss if in any future i.MX version the types do not match */
g_assert(((gst_imx_phys_addr_t)(phys_addr)) == phys_mem_meta->phys_addr);

GST_LOG("mapping physical address %" GST_IMX_PHYS_ADDR_FORMAT " of video frame in buffer %p into VIV texture", phys_mem_meta->phys_addr, (gpointer)buffer);

gst_buffer_map(buffer, &map_info, GST_MAP_READ);
virt_addr = map_info.data;

/* Just set to make sure the == NULL check above is false */
renderer->viv_planes[0] = virt_addr;

glTexDirectVIVMap(
GL_TEXTURE_2D,
total_w, total_h,
gl_format,
(GLvoid **)(&virt_addr), &phys_addr
);

gst_buffer_unmap(buffer, &map_info);
GST_LOG("done showing frame in buffer %p with virtual address %p physical address %" GST_IMX_PHYS_ADDR_FORMAT, (gpointer)buffer, virt_addr, phys_mem_meta->phys_addr);

if (!gst_imx_egl_viv_sink_gles2_renderer_check_gl_error("render", "glTexDirectVIVMap"))
return FALSE;
}
else
{
glTexDirectVIV(
GL_TEXTURE_2D,
total_w, total_h,
gl_format,
(GLvoid **) &(renderer->viv_planes)
);
if (!gst_imx_egl_viv_sink_gles2_renderer_check_gl_error("render", "glTexDirectVIV"))
return FALSE;

GST_LOG("copying pixels into VIV direct texture buffer");

gst_buffer_map(buffer, &map_info, GST_MAP_READ);
switch (fmt)
{
case GST_VIDEO_FORMAT_I420:
case GST_VIDEO_FORMAT_YV12:
memcpy(renderer->viv_planes[0], map_info.data + offset[0], stride[0] * total_h);
memcpy(renderer->viv_planes[1], map_info.data + offset[1], stride[1] * total_h / 2);
memcpy(renderer->viv_planes[2], map_info.data + offset[2], stride[2] * total_h / 2);
break;
case GST_VIDEO_FORMAT_NV12:
case GST_VIDEO_FORMAT_NV21:
memcpy(renderer->viv_planes[0], map_info.data + offset[0], stride[0] * total_h);
memcpy(renderer->viv_planes[1], map_info.data + offset[1], stride[1] * total_h / 2);
break;
default:
memcpy(renderer->viv_planes[0], map_info.data, stride[0] * total_h);
}
gst_buffer_unmap(buffer, &map_info);

}

Labels (2)
Tags (2)
0 Kudos
2 Replies

631 Views
igorpadykov
NXP Employee
NXP Employee

Hi Ignat

one can open issue on gstreamer-imx github page
Issues · Freescale/gstreamer-imx · GitHub 

or alternatively try nxp gstreamer plugins (imx-gst1.0-plugin package)

described in Linux Guide included in documentation on

i.MX Software | NXP 

Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

631 Views
ignat
Contributor I

Thanks.

 You mean i must use playenegine from libplayengine-1.0.so ( imx-gst1.0-plugin ) or i must  replace that files ( libgstimxvideoconvert.so , libgstvpu.so ) form imx-gst1.0-plugin? I must change above Gstreamer pipilene in that case?

Or after i replaced that file my above pipeline will work?

0 Kudos