NXP MCU 技术论坛
直播中

而无返还

9年用户 1320经验值
擅长:光电显示
私信 关注
[问答]

使用IMX8MP去隔行扫描NTCS/PAL视频时出现问题怎么解决?

去隔行在基于内核 5.10.35 的 Yocto Linux 上不起作用。

我们使用 MIPI-CSI 接口将 adv748x 连接到 i.MX8MP。
adv748x 接收 NTSC 信号并通过 CSI 接口将其传输到 i.MX8MP。

这是 media-ctl -p 命令的输出
媒体控制器 API 版本 5.10.35

媒体设备信息
----------------------
驱动程序 mxc-md
型号 FSL 捕获媒体设备
连续剧         
公交信息        
硬件修订版 0x0
驱动程序版本 5.10.35

设备拓扑
- 实体 1:mxc_isi.0(16 个焊盘,2 个链接)
            类型 V4L2 子开发子类型未知标志 0
pad0:水槽
<-“mxc-mipi-csi2.0”:4 [启用]
pad1:水槽
pad2:水槽
pad3:水槽
pad4:水槽
pad5:水槽
pad6:水槽
pad7:水槽
pad8:水槽
pad9:水槽
pad10:水槽
pad11:水槽
pad12:来源
-> “mxc_isi.0.capture”:0 [启用]
pad13:来源
pad14:来源
pad15:水槽

- 实体 18:mxc_isi.0.capture(1 个焊盘,1 个链接)
             类型节点子类型 V4L 标志 0
             设备节点名称 /dev/video3
pad0:水槽
<-“mxc_isi.0”:12 [启用]

- 实体 22:mxc-mipi-csi2.0(8 个焊盘,2 个链接)
             类型节点子类型 V4L 标志 0
             设备节点名称 /dev/v4l-subdev0
pad0:水槽
<-“adv748x 2-0070 txa”:1 [启用,不可变]
pad1:水槽
pad2:水槽
pad3:水槽
pad4:来源
-> “mxc_isi.0”:0 [启用]
pad5:来源
pad6:来源
pad7:来源

- 实体 31:adv748x 2-0070 txa(2 个垫,3 个链接)
             类型 V4L2 子开发子类型未知标志 0
             设备节点名称 /dev/v4l-subdev3
pad0:水槽
[fmt:UYVY8_2X8/720x240 字段:备用色彩空间:smpte170m]
<-“adv748x 2-0070 安全”:8 [启用]
<-“adv748x 2-0070 hdmi”:1 []
pad1:来源
[fmt:UYVY8_2X8/720x240 字段:备用色彩空间:smpte170m]
-> "mxc-mipi-csi2.0":0 [启用,不可变]

- 实体 34:adv748x 2-0070 afe(9 个焊盘,1 个链接)
             type V4L2 subdev subtype 解码器标志 0
             设备节点名称 /dev/v4l-subdev1
pad0:水槽
pad1:水槽
pad2:水槽
pad3:水槽
pad4:水槽
pad5:水槽
pad6:水槽
pad7:水槽
pad8:来源
[fmt:UYVY8_2X8/720x240 字段:备用色彩空间:smpte170m]
-> “adv748x 2-0070 txa”:0 [启用]

我可以使用命令
gst-launch-1.0 v4l2src device=/dev/video3 进行捕获!视频/x-raw,宽度=720,高度=240!队列 !kmssink
但是这个命令只捕获一半的图像 - 帧只有奇数或只有偶数行
(720x240 而不是 720x480)。
当我尝试启用去隔行时它失败了:

# gst-launch-1.0 --gst-debug=v4l2src:5 v4l2src device=/dev/video3 ! 视频/x-raw,宽度=720,高度=240,交错模式=交错!队列 !kmssink

将管道设置为 PAUSED ...
管道是实时的,不需要 PREROLL ...
管道是 PREROLLED ...
将管道设置为 PLAYING ...
0:00:00.745451625   776 0xaaab147314c0 DEBUG                v4l2src gstv4l2src.c:515:gst_v4l2src_negotiate: caps of src: video/x-raw(format:Interlaced), format=(string)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)YUY2, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)BGRA, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)BGRA, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)BGRA, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)BGRx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)BGRx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)BGRx, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)BGR, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)BGR, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)BGR, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)RGB, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)RGB, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)RGB, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)NV12, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw(format:Interlaced), format=(string)RGB16, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate; video/x-raw, format=(string)RGB16, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string){ progressive, interleaved }; video/x-raw(format:Interlaced), format=(string)RGB16, framerate=(fraction)[ 0/1, 2147483647/1 ], width=(int)[ 1, 4096 ], height=(int)[ 1, 8192 ], interlace-mode=(string)alternate
新时钟:GstSystemClock
0:00:00.745651375 776 0xaaab147314c0 DEBUG v4l2src gstv4l2src.c:523:gst_v4l2src_negotiate: peer 的上限:video/x-raw, width=(int)720, height=(int)240, interlace-mode=(string )interlaced, format=(string){ BGRx, BGRA, RGBx, RGBA, NV12_10LE}, framerate=(fraction)[0/1, 2147483647/1]
0:00:01.078356375 776 0xaaab147314c0 调试 v4l2src gstv4l2src.c:529:gst_v4l2src_negotiate: 相交: 空
错误:来自元素 /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:内部数据流错误。
附加调试信息:
../git/libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
流式传输已停止,原因未协商 (-4)
执行在 0:00:00.333395500 后结束
将管道设置为 NULL ...
释放管道...

我调查了 imx8-isi-hw.c 并没有找到去隔行扫描的实现。
有两个函数 mxc_isi_channel_deinterlace_init 和 mxc_isi_channel_set_deinterlace 但第一个是空的,第二个从未使用过。

也许我使用了错误的管道?
还有其他方法可以从捕获媒体设备获取隔行扫描图像吗?
是否实施了 ISI 去隔行扫描?

更多回帖

发帖
×
20
完善资料,
赚取积分