[Cin] so, it looks like qsv integration a bit harder than just adding few lines ....

Terje J. Hanssen terjejhanssen at gmail.com
Fri Sep 27 22:27:27 CEST 2024



Den 27.09.2024 19:45, skrev Andrew Randrianasulu:
>
>
> пт, 27 сент. 2024 г., 18:55 Terje J. Hanssen <terjejhanssen at gmail.com>:
>
>
>
>     Den 27.09.2024 12:44, skrev Andrew Randrianasulu:
>>
>>
>>     пт, 27 сент. 2024 г., 12:40 Terje J. Hanssen
>>     <terjejhanssen at gmail.com>:
>>
>>
>>
>>         Den 26.09.2024 01:18, skrev Andrew Randrianasulu:
>>>
>>>
>>>         On Thu, Sep 26, 2024 at 2:06 AM Terje J. Hanssen
>>>         <terjejhanssen at gmail.com> wrote:
>>>
>>>
>>>
>>>             Den 25.09.2024 23:22, skrev Andrew Randrianasulu:
>>>>
>>>>
>>>>             чт, 26 сент. 2024 г., 00:16 Terje J. Hanssen
>>>>             <terjejhanssen at gmail.com>:
>>>>
>>>>
>>>>
>>>>                 Den 25.09.2024 21:33, skrev Andrew Randrianasulu:
>>>>>
>>>>>
>>>>>                 ср, 25 сент. 2024 г., 18:25 Terje J. Hanssen
>>>>>                 <terjejhanssen at gmail.com>:
>>>>>
>>>>>
>>>>>
>>>>>                     Den 25.09.2024 00:27, skrev Andrew Randrianasulu:
>>>>>>                     try this git patch, do not forgot to make
>>>>>>                     install again, or put profiles in
>>>>>>                     bin/ffmpeg/video folder manually.
>>>>>
>>>>>                     # cd /home/cinelerra/cinelerra-5.1
>>>>>                     # mv
>>>>>                     /home/terje/0001-Qsv-encoders-for-testing.patch .
>>>>>
>>>>>                     # git am 0001-Qsv-encoders-for-testing.patch
>>>>>                     Applying: Qsv encoders for testing
>>>>>
>>>>>
>>>>>                     make install > make_install.log 2&1
>>>>>
>>>>>
>>>>>
>>>>>                 make install > make_install.log 2>&1 ?
>>>>>
>>>>                 Sorry. I should cleanup all ">" with Find & Replace
>>>>                 in my note, and oversaw here should be two of them
>>>>                 in this  command ;(
>>>>
>>>>                 Now make install went through without faults as I
>>>>                 could see, but attach it by email again.
>>>>
>>>>                 But unhappily, no success with testing Cingg Qsv
>>>>                 Rendering.
>>>>                 All attempts so far breaks with the output below:
>>>>
>>>>                     FFMPEG::open_encoder err: Internal bug, should
>>>>                     not have happened
>>>>                     int FFMPEG::open_encoder(const char*, const char*):
>>>>
>>>>                 ----------
>>>>                 localhost:/home/cinelerra/cinelerra-5.1 # bin/cin
>>>>                 Cinelerra Infinity - built: Sep 23 2024 10:31:07
>>>>                 ----------
>>>>                 1)
>>>>                 Loaded hdv09_04.m2t
>>>>                 Render:
>>>>                 Output to file: /Videoklipp/QSV/hdv09_04_h264_qsv.mp4
>>>>                 File format: FFMPEG-mp4
>>>>                 Compression: h264_qsv.mp4
>>>>                 Pixels: qsv
>>>>
>>>>                 libva info: VA-API version 1.22.0
>>>>                 libva info: Trying to open
>>>>                 /usr/lib64/dri/iHD_drv_video.so
>>>>                 libva info: Found init function __vaDriverInit_1_21
>>>>                 libva info: va_openDriver() returns 0
>>>>                 libva info: VA-API version 1.22.0
>>>>                 libva info: Trying to open
>>>>                 /usr/lib64/dri/iHD_drv_video.so
>>>>                 libva info: Found init function __vaDriverInit_1_21
>>>>                 libva info: va_openDriver() returns 0
>>>>
>>>>                 FFMPEG::open_encoder err: Internal bug, should not
>>>>                 have happened
>>>>                 int FFMPEG::open_encoder(const char*, const char*):
>>>>                 open failed
>>>>                 h264_qsv:/Videoklipp/QSV/hdv09_04_h264_qsv.mp4
>>>>                 Render::render_single: Session finished.
>>>>                 --------------
>>>>                 2a)
>>>>                 Loaded hdv09_04.m2t
>>>>                 Render:
>>>>                 Output to file: /Videoklipp/QSV/hdv09_04_h265_qsv.mp4
>>>>                 File format: FFMPEG-mp4
>>>>
>>>>                 Compression: h265_qsv.mp4
>>>>                 Pixels: qsv
>>>>
>>>>                 [hevc_qsv encoder @ 0x7f44e0d0bd80] [Eval @
>>>>                 0x7f44e57eb6f0] Undefined constant or missing '('
>>>>                 in 'high'
>>>>                 [hevc_qsv encoder @ 0x7f44e0d0bd80] Unable to parse
>>>>                 option value "high"
>>>>                 [hevc_qsv encoder @ 0x7f44e0d0bd80] Error setting
>>>>                 option profile to value high.
>>>>                 FFMPEG::open_encoder err: Invalid argument
>>>>                 int FFMPEG::open_encoder(const char*, const char*):
>>>>                 open failed
>>>>                 hevc_qsv:/Videoklipp/QSV/hdv09_04_h265_qsv.mp4
>>>>                 Render::render_single: Session finished.
>>>>
>>>
>>>             # profile=high
>>>             Pixels: qsv (yuv420 isn't available)
>>>
>>>             Didn't render:
>>>             FFMPEG::open_encoder  err: Internal bug, should not have
>>>             happened
>>>             int FFMPEG::open_encoder(const char*, const char*):
>>>             open failed hevc_qsv:/Videoklipp/QSV/hdv09_04_h265_qsv.mp4
>>>             Render::render_single: Session finished.
>>>
>>>
>>>
>>>>                 ----------------
>>>>                 2b)
>>>>                 Compression: h265_qsv.mp4
>>>>                 Pixels: p010le
>>>>
>>>>                 [hevc_qsv encoder @ 0x7f93dcdb3c00] [Eval @
>>>>                 0x7f93cbff06f0] Undefined constant or missing '('
>>>>                 in 'high'
>>>>                 [hevc_qsv encoder @ 0x7f93dcdb3c00] Unable to parse
>>>>                 option value "high"
>>>>                 [hevc_qsv encoder @ 0x7f93dcdb3c00] Error setting
>>>>                 option profile to value high.
>>>>                 FFMPEG::open_encoder err: Invalid argument
>>>>                 int FFMPEG::open_encoder(const char*, const char*):
>>>>                 open failed
>>>>                 hevc_qsv:/Videoklipp/QSV/hdv09_04_h265_qsv.mp4
>>>>                 Render::render_single: Session finished.
>>>>
>>>
>>>             Some progress:
>>>
>>>             # profile=high
>>>             Pixels: yuvy422 (yuv420 isn't available)
>>>             Settings>Appearance: BT.709/MPEG2
>>>
>>>             Rendered:
>>>             Render::render_single: Session finished.
>>>             ** rendered 5972 frames in 33.999 secs, 175.652 fps
>>>             audio0 pad 64 0 (64)
>>>
>>>             VLC playback OK
>>>
>>>             ffprobe -hide_banner hdv09_04_h265_qsv.mp4
>>>             Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
>>>             'hdv09_04_h265_qsv.mp4':
>>>               Metadata:
>>>                 major_brand     : isom
>>>                 minor_version   : 512
>>>                 compatible_brands: isomiso2mp41
>>>                 encoder         : Lavf61.1.100
>>>               Duration: 00:03:58.88, start: 0.000000, bitrate: 3359 kb/s
>>>               Stream #0:0[0x1](und): Video: hevc (Rext) (hev1 /
>>>             0x31766568), yuv422p(tv, bt709/unknown/unknown, top
>>>             coded first (swapped)), 1440x1080 [SAR 4:3 DAR 16:9],
>>>             3223 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
>>>                   Metadata:
>>>                     handler_name    : VideoHandler
>>>                     vendor_id       : [0][0][0][0]
>>>               Stream #0:1[0x2](und): Audio: aac (LC) (mp4a /
>>>             0x6134706D), 48000 Hz, stereo, fltp, 129 kb/s (default)
>>>                   Metadata:
>>>                     handler_name    : SoundHandler
>>>                     vendor_id       : [0][0][0][0]
>>>
>>>
>>>
>>>         ah, so it need tv range .. try also with Pixels nv12 (worked
>>>         for me on mediacodec)
>>
>>         Not really.,
>>         Also the default at first startup, appearance
>>         BT.601-PAL/MJPEG, worked, and then ffprobe output
>>         Stream #0:0[0x1](und): Video: hevc (Rext) (hev1 /
>>         0x31766568), yuv422p(pc, bt470bg/unknown/unknown, top coded
>>         first (swapped)), 1440x1080 [SAR 4:3 DAR 16:9], 3248 kb/s, 25
>>         fps, 25 tbr, 12800 tbn (default)
>>
>>         I just changed it to BT.701/MPEG which is for HD video, and I
>>         also remembed you also suggested this in a previous thread.
>>
>>         Both yuv422 and nv12 work.
>>
>>         But why isn't also the usual yuv420p available for h264 and h265?
>>
>>
>>     not sure, may be qsv library does not support this?
>>
>>     at least I can't see it in source
>>
>>     https://git.ffmpeg.org/gitweb/ffmpeg.git/blob/HEAD:/libavcodec/qsvenc_hevc.c#l399
>>
>>
>>
>>         Possibly also rename h265 to hevc as ffmpeg use?
>>
>>
>>     ok, I'll rename it and add nv12 as default pix format.
>>
>>     can you also see if h264 works with nv12?
>
>     No, h264 doesn't work with nv12, neither with # profile=high
>
>     I've extracted three ffmpeg QSV code lines below with qsv and
>     yuv420p used from
>     https://trac.ffmpeg.org/wiki/Hardware/QuickSync#FullExamples
>
>     ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf
>     hwdownload,format=nv12 -pix_fmt yuv420p output.yuv
>     ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -vf
>     hwdownload,format=nv12 -pix_fmt yuv420p -f sdl -
>     ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -f rawvideo
>     -pix_fmt yuv420p -s:v 1920x1080 -i input.yuv -vf
>     hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M
>     output.mp4
>
>
>     On the other hand the following VAAPI section and code lines from
>     'The encoders only accept input as VAAPI surfaces. If the input is
>     in normal memory, it will need to be uploaded before giving the
>     frames to the encoder - in the ffmpeg utility, the |hwupload|
>     filter can be used for this. It will upload to a surface with the
>     same layout as the software frame, so it may be necessary to add a
>     |format| filter immediately before to get the input into the right
>     format (hardware generally wants the |nv12| layout, but most
>     software functions use the |yuv420p| layout). The |hwupload|
>     filter also requires a device to upload to, which needs to be
>     defined before the filter graph is created.'
>
>     ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf
>     'format=nv12,hwupload' -c:v h264_vaapi output.mp4
>
>
>     and from my own ffmpeg test
>
>     ffmpeg -hide_banner -hwaccel_output_format qsv -i hdv09_04.m2t
>     hdv09_04_h264_qsv.mp4
>
>
>
> note that this line uses *software* x264 encoder, not qsv.

Yeah, I was confused by the "-hwaccel_output_format qsv"
See below for another attempt

>
> Does av1_qsv/vp9_qsv works? Can you also try with progressive (not 
> interlaced) video?
>
Sorry, none of av1_qsv nor vp9_qsv pixel formats work (interlaced hdv input)
I was looking for a progressive video to download?

But I tested "h284_qsv/nv12/profile high" rendering wiht SD-DV file 
(interlaced) and it worked

FFStream::encode_frame: encode failed.
file: /Videoklipp/QSV/dv01_07_h264_qsv.mp4
   err: Resource temporarily unavailable
FFStream::flush failed
:file:/Videoklipp/QSV/dv01_07_h264_qsv.mp4
   err: Operation not permitted
Render::render_single: Session finished.
** rendered 2832 frames in 5.592 secs, 506.438 fps
audio0 pad 32 0 (32)

---------------------

What about this modified ffmpeg code line?

ffmpeg -hide_banner -hwaccel_output_format qsv -i hdv09_04.m2t -pix_fmt 
p010le -c:v hevc_qsv -profile:v main10 hdv09_04_hevc_qsv.mp4
[mpeg2video @ 0x559aa0f2b740] Invalid frame dimensions 0x0.
     Last message repeated 3 times
[mpegts @ 0x559aa0f26080] PES packet size mismatch
[mpegts @ 0x559aa0f26080] Packet corrupt (stream = 1, dts = 258142320).
[mpegts @ 0x559aa0f26080] Could not find codec parameters for stream 2 
(Unknown: none ([160][0][0][0] / 0x00A0)): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 
'probesize' (5000000) options
[mpegts @ 0x559aa0f26080] Could not find codec parameters for stream 3 
(Unknown: none ([161][0][0][0] / 0x00A1)): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 
'probesize' (5000000) options
Input #0, mpegts, from 'hdv09_04.m2t':
   Duration: 00:03:59.06, start: 2629.496000, bitrate: 26110 kb/s
   Program 100
   Stream #0:0[0x810]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), 
yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 25000 kb/s, 
25 fps, 25 tbr, 90k tbn
       Side data:
         cpb: bitrate max/min/avg: 25000000/0/0 buffer size: 7340032 
vbv_delay: N/A
   Stream #0:1[0x814]: Audio: mp2 (mp3float) ([3][0][0][0] / 0x0003), 
48000 Hz, stereo, fltp, 384 kb/s
   Stream #0:2[0x815]: Unknown: none ([160][0][0][0] / 0x00A0)
   Stream #0:3[0x811]: Unknown: none ([161][0][0][0] / 0x00A1)
Stream mapping:
   Stream #0:0 -> #0:0 (mpeg2video (native) -> hevc (hevc_qsv))
   Stream #0:1 -> #0:1 (mp2 (native) -> aac (native))
Press [q] to stop, [?] for help
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib64/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_21
libva info: va_openDriver() returns 0
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib64/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_21
libva info: va_openDriver() returns 0
[hevc_qsv @ 0x559aa0f2d840] Using the constant quantization parameter 
(CQP) by default. Please use the global_quality option and other options 
for a quality-based mode or the b option and other options for a 
bitrate-based mode if the default is not the desired choice.
Output #0, mp4, to 'hdv09_04_hevc_qsv.mp4':
   Metadata:
     encoder         : Lavf61.1.100
   Stream #0:0: Video: hevc (hev1 / 0x31766568), p010le(tv, bt709, top 
coded first (swapped)), 1440x1080 [SAR 4:3 DAR 16:9], q=2-31, 25 fps, 
12800 tbn
       Metadata:
         encoder         : Lavc61.3.100 hevc_qsv
       Side data:
         cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
   Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, 
fltp, 128 kb/s
       Metadata:
         encoder         : Lavc61.3.100 aac
[mpegts @ 0x559aa0f26080] PES packet size mismatch0:03:49.92 
bitrate=26241.8kbits/s dup=12 drop=0 speed=  23x
[mpegts @ 0x559aa0f26080] Packet corrupt (stream = 1, dts = 258142320).
[mpeg2video @ 0x559aa0f56fc0] ac-tex damaged at 10 61
[mpeg2video @ 0x559aa0f56fc0] Warning MVs not available
[mpeg2video @ 0x559aa0f56fc0] concealing 630 DC, 630 AC, 630 MV errors 
in P frame
[vist#0:0/mpeg2video @ 0x559aa0f2e100] [dec:mpeg2video @ 0x559aa103c340] 
corrupt decoded frame
[out#0/mp4 @ 0x559aa0f5d600] video:756129KiB audio:3774KiB subtitle:0KiB 
other streams:0KiB global headers:0KiB muxing overhead: 0.024395%
frame= 5977 fps=575 q=-0.0 Lsize=  760088KiB time=00:03:58.77 
bitrate=26077.3kbits/s dup=14 drop=0 speed=  23x
[aac @ 0x559aa0f5c000] Qavg: 488.617


ffprobe -hide_banner hdv09_04_hevc_qsv.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'hdv09_04_hevc_qsv.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2mp41
     encoder         : Lavf61.1.100
   Duration: 00:03:59.08, start: 0.000000, bitrate: 26044 kb/s
   Stream #0:0[0x1](und): Video: hevc (Main 10) (hev1 / 0x31766568), 
yuv420p10le(tv, bt709, top coded first (swapped)), 1440x1080 [SAR 4:3 
DAR 16:9], 25908 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
       Metadata:
         handler_name    : VideoHandler
         vendor_id       : [0][0][0][0]
         encoder         : Lavc61.3.100 hevc_qsv
   Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 
stereo, fltp, 129 kb/s (default)
       Metadata:
         handler_name    : SoundHandler
         vendor_id       : [0][0][0][0]

----------------------------------------------------------------------

Else I've used ffmpeg to query the supported Qsv formats as follows:

ffmpeg -hide_banner -h encoder=hevc_qsv | egrep 'Supported|profile|main'
     Supported hardware devices: qsv qsv qsv
     Supported pixel formats: nv12 p010le p012le yuyv422 y210le qsv bgra 
x2rgb10le vuyx xv30le
   -profile           <int>        E..V....... (from 0 to INT_MAX) 
(default unknown)
      main            1            E..V.......
      main10          2            E..V.......
      mainsp          3            E..V.......
      main            0            E..V.......

ffmpeg -hide_banner -h encoder=h264_qsv | egrep 'Supported|profile|main'
     Supported hardware devices: qsv qsv qsv
     Supported pixel formats: nv12 qsv
   -profile           <int>        E..V....... (from 0 to INT_MAX) 
(default unknown)
      main            77           E..V.......


ffmpeg -hide_banner -h encoder=av1_qsv | egrep 'Supported|profile|main'
     Supported hardware devices: qsv qsv qsv
     Supported pixel formats: nv12 p010le qsv
   -profile           <int>        E..V....... (from 0 to INT_MAX) 
(default unknown)
      main            1            E..V.......

ffmpeg -hide_banner -h encoder=vp9_qsv | egrep 'Supported|profile|main'
     Supported hardware devices: qsv qsv qsv
     Supported pixel formats: nv12 p010le vuyx qsv xv30le
   -profile           <int>        E..V....... (from 0 to INT_MAX) 
(default unknown)
      profile0        1            E..V.......
      profile1        2            E..V.......
      profile2        3            E..V.......
      profile3        4            E..V.......

ffmpeg -hide_banner -h encoder=vp9_qsv | egrep 'Supported|main'
     Supported hardware devices: qsv qsv qsv
     Supported pixel formats: nv12 p010le vuyx qsv xv30le

--------------

And also to compare actual pixel formats

ffmpeg -hide_banner -pix_fmts | egrep 'yuv420p|p010le|yuv422p'
-------
Pixel formats:
I.... = Supported Input  format for conversion
.O... = Supported Output format for conversion
..H.. = Hardware accelerated format
...P. = Paletted format
....B = Bitstream format
FLAGS NAME            NB_COMPONENTS BITS_PER_PIXEL BIT_DEPTHS
-----
IO... yuv420p                3             12      8-8-8
IO... yuv422p                3             16      8-8-8
IO... yuv420p16le            3             24      16-16-16
IO... yuv420p16be            3             24      16-16-16
IO... yuv422p16le            3             32      16-16-16
IO... yuv422p16be            3             32      16-16-16
IO... yuv420p9be             3             13      9-9-9
IO... yuv420p9le             3             13      9-9-9
IO... yuv420p10be            3             15      10-10-10
IO... yuv420p10le            3             15      10-10-10
IO... yuv422p10be            3             20      10-10-10
IO... yuv422p10le            3             20      10-10-10
IO... yuv422p9be             3             18      9-9-9
IO... yuv422p9le             3             18      9-9-9
IO... yuv420p12be            3             18      12-12-12
IO... yuv420p12le            3             18      12-12-12
IO... yuv420p14be            3             21      14-14-14
IO... yuv420p14le            3             21      14-14-14
IO... yuv422p12be            3             24      12-12-12
IO... yuv422p12le            3             24      12-12-12
IO... yuv422p14be            3             28      14-14-14
IO... yuv422p14le            3             28      14-14-14
IO... p010le                 3             15      10-10-10

-----------------------------

And as extracted from
cuda - Understanding pixel format and profile when encoding 10-bit video 
in ffmpeg with nvenc - Super User
https://superuser.com/questions/1614571/understanding-pixel-format-and-profile-when-encoding-10-bit-video-in-ffmpeg-with

Hardware HEVC encoder uses pixel formats p010le and p016le for 10-bit 
output
where first one produces yuv 4:2:0 and the second one yuv 4:4:4.*Params 
explanation:*

  * |-pix_fmt p010le| converts 8bit input into 10bit; note that
    conversion is done by CPU so it makes the encoding slower but
    produces better quality video and in CRF also lower bitrate (smaller
    file). For CUDA decoder must be used with |-vf
    "hwdownload,format=nv12"| (or |-vf "hwdownload,format=p010le"| for
    10 bit input video) to copy decoded frames from CUDA into CPU for
    conversion (NVDEC decoder sends frames into CPU automatically.)
    Specifying |-profile main10| is required to allow 10bit encoding but
    does not accually affect how the encoder encodes the video - encoder
    itself does not change the bit depth of the input!

According to this reddit post 
<https://www.reddit.com/r/ffmpeg/comments/c1im2i/encode_4k_hdr_pixel_format/> 
by @Anton1699:

    *p010le is equivalent to yuv420p10le* (it's 10-bit video with 4:2:0
    subsampling = 15-bit per pixel).

I have yet to find a more authoritative source in documentation.

|p010le| is supported by nvenc. The output log also indicates that this 
works. As a result, I put this up as a tentative answer. Sample command:

|ffmpeg -i input.mkv -pix_fmt p010le -c:v hevc_nvenc -profile:v main10 
-cq 21 out.mkv|

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cinelerra-gg.org/pipermail/cin/attachments/20240927/d4a2d08c/attachment-0001.htm>


More information about the Cin mailing list