[Cin] HDMI video streams to lossless compressed FFV1.MKV
Andrew Randrianasulu
randrianasulu at gmail.com
Wed May 7 18:02:46 CEST 2025
On Wed, May 7, 2025 at 9:55 PM Terje J. Hanssen <terjejhanssen at gmail.com> wrote:
>
>
>
> Den 07.05.2025 19:22, skrev Terje J. Hanssen:
>
>
>
> Den 07.05.2025 01:04, skrev Andrew Randrianasulu:
>
>
>
> ср, 7 мая 2025 г., 01:58 Terje J. Hanssen <terjejhanssen at gmail.com>:
>>
>>
>>
>> Den 06.05.2025 22:54, skrev Andrew Randrianasulu:
>>
>>
>>
>> вт, 6 мая 2025 г., 23:49 Terje J. Hanssen <terjejhanssen at gmail.com>:
>>>
>>>
>>>
>>> Den 05.05.2025 16:05, skrev Andrew Randrianasulu:
>>>
>>>
>>>
>>> пн, 5 мая 2025 г., 17:00 Andrew Randrianasulu <randrianasulu at gmail.com>:
>>>>
>>>>
>>>>
>>>> пн, 5 мая 2025 г., 16:26 Terje J. Hanssen via Cin <cin at lists.cinelerra-gg.org>:
>>>>>
>>>>> I consider to make a second preservation backup for archiving my Analog S-video and HDV footages on tapes to lossless compressed FFV1.MKV files stored on large USB3 expansion disks. Also ffv1 HW (vulkan) decoding (next and encoding (later?) are of interest in this context.
>>>>>
>>>>> Related previous threads
>>>>> https://www.mail-archive.com/cin@lists.cinelerra-gg.org/msg05547.html
>>>>> https://www.mail-archive.com/cin@lists.cinelerra-gg.org/msg03791.html
>>>>> https://www.mail-archive.com/cin@lists.cinelerra-gg.org/msg05547.html
>>>>>
>>>>> I adapt simply the last ffmpeg mpeg-2 code line to a first ffv1, version 3 test, 10 sec file
>>>>>
>>>>> ffmpeg -hide_banner -f v4l2 -input_format yuyv422 -video_size 720x576 -framerate 50 -i /dev/video0 -f alsa -ac 2 -i hw:CARD=UHD,DEV=0 -c:v ffv1 -level 3 -c:a pcm_s16le -t 10 720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv
>>>>>
>>>>> Input #0, video4linux2,v4l2, from '/dev/video0':
>>>>> Duration: N/A, start: 351.803278, bitrate: 331776 kb/s
>>>>> Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 720x576, 331776 kb/s, 50 fps, 50 tbr, 1000k tbn
>>>>> [aist#1:0/pcm_s16le @ 0x555a99736cc0] Guessed Channel Layout: stereo
>>>>> Input #1, alsa, from 'hw:CARD=UHD,DEV=0':
>>>>> Duration: N/A, start: 1746445045.742179, bitrate: 1536 kb/s
>>>>> Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
>>>>> Stream mapping:
>>>>> Stream #0:0 -> #0:0 (rawvideo (native) -> ffv1 (native))
>>>>> Stream #1:0 -> #0:1 (pcm_s16le (native) -> pcm_s16le (native))
>>>>> Press [q] to stop, [?] for help
>>>>> Output #0, matroska, to '720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv':
>>>>> Metadata:
>>>>> encoder : Lavf61.7.100
>>>>> Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p(tv, progressive), 720x576, q=2-31, 200 kb/s, 50 fps, 1k tbn
>>>>> Metadata:
>>>>> encoder : Lavc61.19.101 ffv1
>>>>> Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
>>>>> Metadata:
>>>>> encoder : Lavc61.19.101 pcm_s16le
>>>>> [out#0/matroska @ 0x555a99736f40] video:57467KiB audio:1875KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.069226%
>>>>> frame= 500 fps= 50 q=-0.0 Lsize= 59383KiB time=00:00:10.00 bitrate=48646.9kbits/s speed=0.998x
>>>>>
>>>>>
>>>>> ----------
>>>>>
>>>>> du -sh *
>>>>> 58M 720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv
>>>>>
>>>>> ----------
>>>>>
>>>>> ffprobe -hide_banner 720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv
>>>>>
>>>>> Input #0, matroska,webm, from '720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv':
>>>>> Metadata:
>>>>> ENCODER : Lavf61.7.100
>>>>> Duration: 00:00:10.00, start: 0.000000, bitrate: 48646 kb/s
>>>>> Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p(tv, progressive), 720x576, 50 fps, 50 tbr, 1k tbn
>>>>> Metadata:
>>>>> ENCODER : Lavc61.19.101 ffv1
>>>>> DURATION : 00:00:10.000000000
>>>>> Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
>>>>> Metadata:
>>>>> ENCODER : Lavc61.19.101 pcm_s16le
>>>>> DURATION : 00:00:10.000000000
>>>>>
>>>>>
>>>>> ------------
>>>>>
>>>>> mediainfo 720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv
>>>>>
>>>>> General
>>>>> Unique ID : 158479793538002634101121179263279280827 (0x773A19163BEA6038DF448CE1529BB2BB)
>>>>> Complete name : 720x576_50fps+alsa_ms2130_ffv1-3+pcm.mkv
>>>>> Format : Matroska
>>>>> Format version : Version 4
>>>>> File size : 58.0 MiB
>>>>> Duration : 10 s 0 ms
>>>>> Overall bit rate mode : Variable
>>>>> Overall bit rate : 48.6 Mb/s
>>>>> Frame rate : 50.000 FPS
>>>>> Writing application : Lavf61.7.100
>>>>> Writing library : Lavf61.7.100
>>>>> ErrorDetectionType : Per level 1
>>>>>
>>>>> Video
>>>>> ID : 1
>>>>> Format : FFV1
>>>>> Format version : Version 3.4
>>>>> Format settings, Slice count : 4 slices per frame
>>>>> Codec ID : V_MS/VFW/FOURCC / FFV1
>>>>> Duration : 10 s 0 ms
>>>>> Bit rate mode : Variable
>>>>> Bit rate : 46.1 Mb/s
>>>>> Width : 720 pixels
>>>>> Height : 576 pixels
>>>>> Display aspect ratio : 5:4
>>>>> Frame rate mode : Constant
>>>>> Frame rate : 50.000 FPS
>>>>> Color space : YUV
>>>>> Chroma subsampling : 4:2:2
>>>>> Bit depth : 8 bits
>>>>> Scan type : Progressive
>>>>> Compression mode : Lossless
>>>>> Bits/(Pixel*Frame) : 2.225
>>>>> Stream size : 55.0 MiB (95%)
>>>>> Writing library : Lavc61.19.101 ffv1
>>>>> Default : No
>>>>> Forced : No
>>>>> Color range : Limited
>>>>> coder_type : Golomb Rice
>>>>> ErrorDetectionType : Per slice
>>>>>
>>>>> Audio
>>>>> ID : 2
>>>>> Format : PCM
>>>>> Format settings : Little / Signed
>>>>> Codec ID : A_PCM/INT/LIT
>>>>> Duration : 10 s 0 ms
>>>>> Bit rate mode : Constant
>>>>> Bit rate : 1 536 kb/s
>>>>> Channel(s) : 2 channels
>>>>> Sampling rate : 48.0 kHz
>>>>> Bit depth : 16 bits
>>>>> Stream size : 1.83 MiB (3%)
>>>>> Writing library : Lavc61.19.101 pcm_s16le
>>>>> Default : No
>>>>> Forced : No
>>>>>
>>>>> ---------------------------------
>>>>>
>>>>> As seen above the "default" Chroma subsampling is yuv422p or 4:2:2 with Bit depth: 8 bits
>>>>>
>>>>> As ffv1 seemingly also does support yuv422p10le ffmpeg, I wonder if yuv422p is limited by the input from HDMI capture/AV converter?
>>>>> Can possibly yuv422p10le possibly be achieved by adding -pix_fmt 10 og similar syntax to the ffmpeg line?
>>>>
>>>>
>>>> you can try different -input_format, but I suspect 10bit video over v4l2 at best uncommon ... While hdmi itself supports 10bit digital signal, I suspect non-pro capture devices usually limited to 8bit?
>>>
>>>
>>> https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/HEAD:/libavdevice/v4l2-common.c
>>>
>>> I can't see 10bit yuy2 format listed here, so probably even if hw/driver support it ffmpeg will not ...
>>>
>>>
>>> Yes, It seems this also is the case.
>>> Even I got a few 10-bits "-input_format" y210 and p210 accepted by ffmpeg, in both cases the output format "defaulted" to the same 'yuv422p'.
>>> What also surprised me, the filesizes at the same time also was reduced to 77%
>>>
>>> du -sh *
>>> 45M 720x576_50fps_p210+alsa_ms2130_ffv1-3+pcm.mkv
>>> 45M 720x576_50fps_y210+alsa_ms2130_ffv1-3+pcm.mkv
>>> 58M 720x576_50fps_yuyv422+alsa_ms2130_ffv1-3+pcm.mkv
>>
>>
>> I guess they 10 bit but 4:2:0 subsampling?
>>
>>
>> Noop, according to mediainfo all have
>>
>> Color space : YUV
>> Chroma subsampling : 4:2:2
>> Bit depth : 8 bits
>
>
> But this is *after* they left ffmpeg ;)
>
> All those auto-inserting filters may cut input stream according to that user specified, and then expand it back, but with less info, so lossless file will be smaller ....
>
> just idea, not proven.
>
>
> =================
>
> I continue testing now with my Sony HDR-FX7E HDV 1080i50 camcorder, currently using only the camera Enhanced Image processor (EIP) via HDMI out.
> That is not HDV tape (MPEG-2) playback yet as mentioned above.
>
> v4l2-ctl -V
> Format Video Capture:
> Width/Height : 1920/1080
> Pixel Format : 'YUYV' (YUYV 4:2:2)
> Field : None
> Bytes per Line : 3840
> Size Image : 4147200
> Colorspace : sRGB
> Transfer Function : Rec. 709
> YCbCr/HSV Encoding: ITU-R 601
> Quantization : Default (maps to Limited Range)
> Flags :
>
> NB! v4l2 discovers the camcorder FX7 EIP's (Enhanced Imaging Processor) FHD capability
>
> ------------
>
> ffmpeg -hide_banner -f v4l2 -list_formats all -i /dev/video0
>
> [video4linux2,v4l2 @ 0x561a655c36c0] Raw : yuyv422 : YUYV 4:2:2 : 1920x1080 1600x1200 1360x768 1280x1024 1280x960 1280x720 1024x768 800x600 720x576 720x480 640x480
> [in#0 @ 0x561a655c3400] Error opening input: Immediate exit requested
> Error opening input file /dev/video0.
>
> 1) First encoding test:
> -----------------------------------
> ffmpeg -hide_banner -f v4l2 -input_format yuyv422 -video_size 1920x1080 -framerate 50 -i /dev/video0 -f alsa -ac 2 -i hw:CARD=UHD,DEV=0 -c:v ffv1 -level 3 -c:a pcm_s16le -t 10 1920x1080_50fps_yuvy422+alsa_pcm_ffv1-3.mkv
>
> resulted i output file with 8-bit yuv422p as previously
>
>
> 2) Second encoding test:
> ----------------------------------------
> I specified 'y210' as both input format and as output pixel format.
*I think* this just artificially expanding 8 to 10 bit, but you better
ask on ffmpeg-user and/or linux media list
Not sure why file size a bit bigger - probably ffmpeg tried to
intelligently expand narrow range of 8bit to wider range of 10 bit?
Or conversion is not lossless and adds some errors ...
Sorry, ffmpeg, even after all those years still often mystery for me.
> ffprobe below show this interestingly created a 10-bit "yuv422p10le" output file as I wanted, and with a bit larger file size than first test without output pixel_format filter!
>
> I wonder if this is better or a "fake" 10-bit color format?
> and wants comments to what really happends here:
>
> Is input via v4l2 a "raw camcorder video stream" that will be (re-)encoded to a ffv1.mkv video file format?
> And does specifying -vf format=pix_fmts='y210' cause some extra re-encoding than without specifying this output filter in this case?
>
>
> ffmpeg -hide_banner -f v4l2 -input_format y210 -video_size 1920x1080 -framerate 50 -i /dev/video0 -f alsa -ac 2 -i hw:CARD=UHD,DEV=0 -c:v ffv1 -level 3 -vf format=pix_fmts='y210' -c:a pcm_s16le -t 10 1920x1080_50fps_y210+alsa_pcm_ffv1-3.mkv
>
> Input #0, video4linux2,v4l2, from '/dev/video0':
> Duration: N/A, start: 337.518694, bitrate: 1658880 kb/s
> Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 1658880 kb/s, 50 fps, 50 tbr, 1000k tbn
> [aist#1:0/pcm_s16le @ 0x559f06e972c0] Guessed Channel Layout: stereo
> Input #1, alsa, from 'hw:CARD=UHD,DEV=0':
> Duration: N/A, start: 1746635575.463474, bitrate: 1536 kb/s
> Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
> Stream mapping:
> Stream #0:0 -> #0:0 (rawvideo (native) -> ffv1 (native))
> Stream #1:0 -> #0:1 (pcm_s16le (native) -> pcm_s16le (native))
> Press [q] to stop, [?] for help
> [ffv1 @ 0x559f06e7e280] bits_per_raw_sample > 8, forcing range coder
> Output #0, matroska, to '1920x1080_50fps_y210+alsa_pcm_ffv1-3.mkv':
> Metadata:
> encoder : Lavf61.7.100
> Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p10le(tv, progressive), 1920x1080, q=2-31, 200 kb/s, 50 fps, 1k tbn
> Metadata:
> encoder : Lavc61.19.101 ffv1
> Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
> Metadata:
> encoder : Lavc61.19.101 pcm_s16le
> [out#0/matroska @ 0x559f06e97500] video:383046KiB audio:1875KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.010893%
> frame= 500 fps= 50 q=-0.0 Lsize= 384963KiB time=00:00:10.00 bitrate=315361.7kbits/s speed=0.999x
>
>
> ---------------
>
> du -sh *.mkv
>
> 376M 1920x1080_50fps_y210+alsa_pcm_ffv1-3.mkv
> 374M 1920x1080_50fps_yuvy422+alsa_pcm_ffv1-3.mkv
> -----
> 45M 720x576_50fps_p210+alsa_ms2130_ffv1-3+pcm.mkv
> 45M 720x576_50fps_y210+alsa_ms2130_ffv1-3+pcm.mkv
> 58M 720x576_50fps_yuyv422+alsa_ms2130_ffv1-3+pcm.mkv
>
>
> --------------------
>
> ffprobe -hide_banner 1920x1080_50fps_y210+alsa_pcm_ffv1-3.mkv
>
> Input #0, matroska,webm, from '1920x1080_50fps_y210+alsa_pcm_ffv1-3.mkv':
> Metadata:
> ENCODER : Lavf61.7.100
> Duration: 00:00:10.00, start: 0.000000, bitrate: 315361 kb/s
> Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p10le(tv, progressive), 1920x1080, 50 fps, 50 tbr, 1k tbn
> Metadata:
> ENCODER : Lavc61.19.101 ffv1
> DURATION : 00:00:10.000000000
> Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
> Metadata:
> ENCODER : Lavc61.19.101 pcm_s16le
> DURATION : 00:00:10.000000000
>
>
>
> Just to add to the above
>
> mediainfo says 10-bit:
>
> Color space : YUV
> Chroma subsampling : 4:2:2
> Bit depth : 10 bits
>
>
> VLC codec info says
>
> Decoded format: Planar 4:2:2 YUV 10-bit LE
>
> Playback seemingly works ok with VLC, mpv, Gnome mediaplayer and ffplay
>
> ============================
>
>
>
>>
>> By the way, I acknowledge this limit at the hand.
>> 10-Bit Video is recommended for Analog Tape Transfer due to color shades and branding
>> https://www.archivalworks.com/blog/10-bit-video-transfer
>>
>> But I expect also 8-bit 422 transfer to FFV1 opt for some better quality than the current 8-bit 420 DV25 files (converted from PAL S-video) and the HDV.m2t backup files.
>> IMO direct playback of S-vdeo tapes has visual better brightness than the converted DV files.
>> It remains also to verify if playing 1080i50 HDV tapes via HDMI will be up-scaled to 422 and 720p, according to Steve Mullen' FX7 handbook.
>>
>> To continue I copy with from my old, initial post at
>> https://www.mail-archive.com/cin@lists.cinelerra-gg.org/msg05547.html
>>
>>
>> Does all FFV1 level 3 versions work with lossless compression for 422 video?
>>
>> I have not yet found a definitiv ffmpeg FFV1 v 3 syntax guide for SD and HDV capturing and hope for suggestions and comments regarding the examples below:
>>
>> 3.1 FFmpeg recipe (PAL)
>>
>> ffmpeg -i VIDEO_IN \
>>
>> -c:v ffv1 -level 3 -coder 1 -context 0 -slices 24 -slicecrc 1 \
>> -color_primaries bt470bg \
>> -color_trc bt709 \
>> -colorspace bt470bg \
>> -color_range mpeg \
>> -map 0 \
>> -top 1 \
>> -c:a copy \
>> -g 1 -pix_fmt + \
>> VIDEO_OUT.mkv
>>
>>
>> 3.2 Reference Example
>> https://trac.ffmpeg.org/wiki/Encode/FFV1#Examples
>>
>> Copy audio "as-is" and use FFV1.3 as video codec.
>>
>> Parameters are 8 threads, coder=1, context=1, GOP-size=1, 24 slices and slice-CRC on:
>>
>> ffmpeg -i <input_video> \
>> -acodec copy \
>> -vcodec ffv1 -level 3 \
>> -threads 8 \
>> -coder 1 \
>> -context 1 \
>> -g 1 \
>> -slices 24 \
>> -slicecrc 1 \
>> <output_video>
>>
>>
>> 3.3 Various Encoding examples for Video capture from USB camera /dev/video0:
>>
>> ffmpeg -f v4l2 -framerate 25 -video_size 720x576 -i /dev/video0 output_data.mkv ffmpeg -f v4l2 -framerate 25 -video_size 720x576 -i /dev/video0 -codec:v ffv1 -codec:a pcm_s16le \
>> -f matroska output_video.mkv
>>
>>
>> Check that video is captured properly using ffplay:
>>
>> ffmpeg -ar 44100 -thread_queue_size 1024 -f alsa -i $AUDIO \ -r 25 -thread_queue_size 1024 -i $VIDEO \ -codec copy -f matroska - | ffplay
>>
>>
>> - Check the overall flow using ffplay before capturing:
>>
>> ffmpeg -ar 44100 -thread_queue_size 1024 -f alsa -i $AUDIO \ -itsoffset -0.5 -r 25 -thread_queue_size 1024 -i $VIDEO \
>> -filter_complex 'channelmap=FL-0' -filter_complex 'crop=w=700:h=556:x=8:y=0' \
>> -map 1:v -map 0:a -codec:v ffv1 -codec:a pcm_s16le \ -f matroska - | ffplay -
>>
>>
>>
>>
>> why we can't have both ;) I mean, it all depend on hw, and now board wired ... If there was relatively popular capture board I am sure someone tried to push core linux kernel bits upstream ...
>>
>>
>> but hw design is harder than it looks.
>>
>>
>>>
>>>
>>>
>>>>
>>>> But of course you better to doublecheck what v4l2 tools says ...
>>>
>>>
>>> So far no other pixel formats found:
>>>
>>> v4l2-ctl -V
>>> Format Video Capture:
>>> Width/Height : 720/576
>>> Pixel Format : 'YUYV' (YUYV 4:2:2)
>>> Field : None
>>> Bytes per Line : 1440
>>> Size Image : 829440
>>> Colorspace : sRGB
>>> Transfer Function : Rec. 709
>>> YCbCr/HSV Encoding: ITU-R 601
>>> Quantization : Default (maps to Limited Range)
>>> Flags :
>>>
>>>
>>>
>>>>
>>>> Sorry for "too generic" answer, few years ago I/we looked into "direct RF capture" and there getting 10bit signal was possible, with custom hardware, slow offline processing and invasive hoockup to VCR's internals.
>>>
>>>
>>> Similar I bought and captured a few ProRes422 HQ few files in 2016 with Blackmagic Design's HyperDeck Shuttle+AD miniconverter+SSD recorder.
>>> But some years later, BMD's fw support became EOL, and the devices became non-working :(
>>>
>>>>
>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Cin mailing list
>>>>> Cin at lists.cinelerra-gg.org
>>>>> https://lists.cinelerra-gg.org/mailman/listinfo/cin
>>>
>>>
>>
>
>
More information about the Cin
mailing list