[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