[Cin] HDMI video streams to lossless compressed FFV1.MKV

Terje J. Hanssen terjejhanssen at gmail.com
Wed May 7 20:55:12 CEST 2025



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.
> 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
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20250507/bcc71f47/attachment-0001.htm>


More information about the Cin mailing list