On Thu, Jan 4, 2018 at 10:51 AM, Steve Longerbeam <slongerbeam@xxxxxxxxx> wrote: > > > On 01/04/2018 09:57 AM, Tim Harvey wrote: >> >> On Tue, Jan 2, 2018 at 6:00 PM, Steve Longerbeam <slongerbeam@xxxxxxxxx> >> wrote: >>> >>> Hi Tim, >>> >>> Happy New Year! And pardon the delay. >>> >>> >>> On 12/28/2017 01:56 PM, Tim Harvey wrote: >>>> >>>> Steve/Hans, >>>> >>>> I'm trying to get interlaced capture working with the TDA1997x driver >>>> I've been working on which is connected to an IMX6 CSI. >>>> >>>> The particular board I'm currently testing on is an IMX6Q which has >>>> both a TDA19971 HDMI receiver as well as an ADV7180 analog video >>>> decoder. The media-ctl topology for this board can be found at >>>> http://dev.gateworks.com/docs/linux/media/imx6q-gw54xx-media.png. >>>> >>>> For adv7180 everything appears to be working as expected: >>>> - media-ctl --get-v4l2 '"adv7180 2-0020":0' shows: >>>> [fmt:UYVY8_2X8/720x480 field:interlaced colorspace:smpte170m] >>>> - he following captures/streams from the adv7180 using the vdic to >>>> de-interlace: >>>> media-ctl --link "adv7180 2-0020":0 -> "ipu2_csi1_mux":1[1] >>>> media-ctl --link "ipu2_csi1_mux":2 -> "ipu2_csi1":0[1] >>>> media-ctl --link "ipu2_csi1":1 -> "ipu2_vdic":0[1] >>>> media-ctl --link "ipu2_vdic":2 -> "ipu2_ic_prp":0[1] >>>> media-ctl --link "ipu2_ic_prp":2 -> "ipu2_ic_prpvf":0[1] >>>> media-ctl --link "ipu2_ic_prpvf":1 -> "ipu2_ic_prpvf capture":0[1] >>>> media-ctl --set-v4l2 'adv7180 2-0020':0 [fmt:UYVY2X8/720x480] >>>> media-ctl --set-v4l2 'ipu2_csi1_mux':2 [fmt:UYVY2X8/720x480 >>>> field:interlaced] >>>> media-ctl --set-v4l2 'ipu2_csi1':1 [fmt:UYVY2X8/720x480 >>>> field:interlaced] >>>> media-ctl --set-v4l2 'ipu2_vdic':2 [fmt:UYVY2X8/720x480 >>>> field:interlaced] >>>> media-ctl --set-v4l2 'ipu2_ic_prp':2 [fmt:UYVY2X8/720x480 field:none] >>>> media-ctl --set-v4l2 'ipu2_ic_prpvf':1 [fmt:UYVY2X8/720x480 field:none] >>>> v4l2-ctl -d /dev/video3 >>>> --set-fmt-video=width=720,height=480,pixelformat=UYVY >>>> # capture 1 frame >>>> v4l2-ctl -d /dev/video1 --stream-mmap --stream-skip=1 >>>> --stream-to=/tmp/x.raw --stream-count=1 >>>> # stream jpeg/rtp >>>> gst-launch-1.0 v4l2src device=/dev/video3 ! >>>> "video/x-raw,width=720,height=480,format=UYVY" ! >>>> jpegenc ! rtpjpegpay ! udpsink host=$SERVER port=5000" >>>> >>>> For the tda1997x I'm trying to do something similar: >>>> - media-ctl --get-v4l2 '"tda19971 2-0048":0' shows: >>>> [fmt:UYVY8_1X16/1920x1080 field:alternate colorspace:srgb] >>>> ^^^^ still not sure V4L2_FIELD_ALTERNATE/SRGB returned from tda1997x >>>> get_fmt is correct >>>> - I setup the pipeline with: >>>> media-ctl --link "tda19971 2-0048":0 -> "ipu1_csi0_mux":1[1] >>>> media-ctl --link "ipu1_csi0_mux":2 -> "ipu1_csi0":0[1] >>>> media-ctl --link "ipu1_csi0":1 -> "ipu1_vdic":0[1] >>>> media-ctl --link "ipu1_vdic":2 -> "ipu1_ic_prp":0[1] >>>> media-ctl --link "ipu1_ic_prp":2 -> "ipu1_ic_prpvf":0[1] >>>> media-ctl --link "ipu1_ic_prpvf":1 -> "ipu1_ic_prpvf capture":0[1] >>>> media-ctl --set-v4l2 'tda19971 2-0048':0[fmt:UYVY8_1X16/1920x1080] >>>> media-ctl --set-v4l2 'ipu1_csi0_mux':2[fmt:UYVY8_1X16/1920x1080 >>>> field:alternate] >>>> media-ctl --set-v4l2 'ipu1_csi0':1[fmt:UYVY8_1X16/1920x1080 >>>> field:alternate] >>>> media-ctl --set-v4l2 'ipu1_vdic':2[fmt:UYVY8_1X16/1920x1080 >>>> field:alternate] >>>> media-ctl --set-v4l2 'ipu1_ic_prp':2[fmt:UYVY8_1X16/1920x1080 >>>> field:none] >>>> media-ctl --set-v4l2 'ipu1_ic_prpvf':1[fmt:UYVY8_1X16/1920x1080 >>>> field:none] >>>> v4l2-ctl -d /dev/video1 >>>> --set-fmt-video=width=1920,height=1080,pixelformat=UYVY >>>> v4l2-ctl -d /dev/v4l-subdev1 --set-dv-bt-timings=query >>>> v4l2-ctl -d /dev/video1 --stream-mmap --stream-skip=1 >>>> --stream-to=/tmp/x.raw --stream-count=1 >>>> ipu1_csi0: bayer/16-bit parallel buses must go to IDMAC pad >>>> ipu1_ic_prpvf: pipeline start failed with -22 >>>> VIDIOC_STREAMON: failed: Invalid argument >> >> Steve, >> >> Thanks for the help. >> >>> Right, according to the i.MX6 reference manual, if the CSI muxes >>> are receiving from the parallel bus input with width >= 16 bits, >>> that data can't be passed to the IC. It never really made much sense >>> to me, and I can't remember if I ever tried it, maybe not, because >>> I don't have such hardware. >> >> hmmm... that's not good. I may have to dig into what's being done in >> my 3.14 kernel with the Freescale capture driver where I can capture >> 1080p60 fine with my tda1997x driver there. >> >>> Try this hack as an experiment: modify is_parallel_16bit_bus() in >>> imx-media-csi.c to simply return false, and see if the above pipeline >>> works. >> >> I'm currently on 4.15-rc1 which doesn't have a >> 'is_parallel_16bit_bus()' but if I comment out the check we are >> talking about in csi_link_validate as such: >> >> --- a/drivers/staging/media/imx/imx-media-csi.c >> +++ b/drivers/staging/media/imx/imx-media-csi.c >> @@ -999,6 +999,7 @@ static int csi_link_validate(struct v4l2_subdev *sd, >> is_csi2 = (sensor_ep->bus_type == V4L2_MBUS_CSI2); >> incc = priv->cc[CSI_SINK_PAD]; >> >> +/* >> if (priv->dest != IPU_CSI_DEST_IDMAC && >> (incc->bayer || (!is_csi2 && >> sensor_ep->bus.parallel.bus_width >= 16))) { >> @@ -1007,6 +1008,7 @@ static int csi_link_validate(struct v4l2_subdev *sd, >> ret = -EINVAL; >> goto out; >> } >> +*/ >> >> if (is_csi2) { >> int vc_num = 0; >> >> I get a pipeline start failure for ipu1_ic_prpvf: >> >> root@ventana:~# v4l2-ctl -d /dev/video1 --stream-mmap --stream-skip=1 >> --stream-to=/tmp/x.raw --stream-count=1 >> [ 909.993353] tda1997x 2-0048: tda1997x_get_pad_format >> [ 909.998342] tda1997x 2-0048: tda1997x_fill_format >> ^^^^ my tda1997x driver debug messages >> [ 910.004483] ipu1_ic_prpvf: pipeline start failed with -32 >> VIDIOC_STREAMON: failed: Broken pipe > > > The driver doesn't really support V4L2_FIELD_ALTERNATE, the CSI subdev > attempts to translate this to sequential-top-bottom or sequential-bottom-top > at the CSI output pads, since alternate holds no info about field order. I > doubt > alternate is correct for the TDA19971 anyway, so that should be fixed in the > tda19971 driver. Until then, set to "seq-bt" downstream from the CSI, as in: > > media-ctl --set-v4l2 'tda19971 2-0048':0[fmt:UYVY8_1X16/1920x1080] > media-ctl --set-v4l2 'ipu1_csi0_mux':2[fmt:UYVY8_1X16/1920x1080 > field:alternate] > media-ctl --set-v4l2 'ipu1_csi0':1[fmt:UYVY8_1X16/1920x1080 field:alternate] > media-ctl --set-v4l2 'ipu1_vdic':2[fmt:UYVY8_1X16/1920x1080 field:seq-bt] > media-ctl --set-v4l2 'ipu1_ic_prp':2[fmt:UYVY8_1X16/1920x1080 field:none] > media-ctl --set-v4l2 'ipu1_ic_prpvf':1[fmt:UYVY8_1X16/1920x1080 field:none] > Steve, This makes sense... I had a feeling that ALTERNATE was incorrect. HDMI should be top/bot (with the exception of 720x480i (NTSC) which sends bot then top). If I change my TDA1997x driver to set format->field = V4L2_FIELD_SEQ_TB: root@ventana:~# ./media-ctl --get-v4l2 '"tda19971 2-0048":0' [fmt:UYVY8_1X16/1920x1080 field:seq-tb colorspace:srgb] and media-ctl --link "tda19971 2-0048":0 -> "ipu1_csi0_mux":1[1] media-ctl --link "ipu1_csi0_mux":2 -> "ipu1_csi0":0[1] media-ctl --link "ipu1_csi0":2 -> "ipu1_csi0 capture":0[1] media-ctl --set-v4l2 'tda19971 2-0048':0[fmt:UYVY8_1X16/1920x1080] media-ctl --set-v4l2 'ipu1_csi0_mux':2[fmt:UYVY8_1X16/1920x1080 field:seq-tb] media-ctl --set-v4l2 'ipu1_csi0':2[fmt:UYVY8_1X16/1920x1080 field:none] v4l2-ctl -d /dev/video4 --set-fmt-video=width=1920,height=1080,pixelformat=UYVY v4l2-ctl -d /dev/v4l-subdev1 --set-dv-bt-timings=query v4l2-ctl -d /dev/video4 --stream-mmap --stream-skip=1 --stream-to=/tmp/x.raw --stream-count=1 ^^^ captures 4147200 byte frame yet not quite sure how to convert it (below) convert -size 1920x1080 -depth 16 uyuv:x.raw frame.png convert: delegate failed `"ufraw-batch" --silent --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i"' @ error/delegate.c/InvokeDelegate/1310. convert: unable to open image `/tmp/magick-118907Itnr-kDtzA7.ppm': No such file or directory @ error/blob.c/OpenBlob/2712. convert: no images defined `frame.png' @ error/convert.c/ConvertImageCommand/3210. ^^^ not sure why I can't convert it using imagemagick but I can use gstreamer instead: gst-launch-1.0 v4l2src device=/dev/video4 num-buffers=1 ! video/x-raw,width=1920,height=1080,format=UYVY ! jpegenc ! filesink location=/var/www/html/files/frame.jpg ^^^ captures 1 frame and jpeg's it It's now capturing both fields to one frame but they are not lined up correctly: see http://dev.gateworks.com/docs/linux/media/frame_1080p.jpg (1080p) vs http://dev.gateworks.com/docs/linux/media/frame_1080i.jpg I'm wondering if I've got some issue with my sync signal polarity/timing such that for interlaced sources one/both fields are mis-aligned (but correct for progressive). Tim