[Cin] HDMI video streams to lossless compressed FFV1.MKV
Terje J. Hanssen
terjejhanssen at gmail.com
Wed May 7 19:22:36 CEST 2025
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.
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
============================
>
> 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
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20250507/82aad031/attachment-0001.htm>
More information about the Cin
mailing list