Opened 7 years ago

Last modified 4 years ago

#6478 new defect

Intel QSV: H.264 level is ignored

Reported by: alexpigment Owned by:
Priority: normal Component: avcodec
Version: git-master Keywords: qsv
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no


Summary of the bug:

For the h264_qsv encoder, specifying an H.264 level is quietly accepted (no errors or warnings) but not honored. Instead, the level is always automatically assigned.

Using Staxrip as a comparison, the Intel H.264 encoder does appear to support user-specified levels.

How to reproduce:

% ffmpeg -f lavfi -i smptebars -c:v h264_qsv -s 1920x1080 -aspect 16:9 -profile:v high -r 29.97 -t 5 -look_ahead 0 -level 4.1 output.mp4

See that the resulting video is reported as Level 4 in MediaInfo rather than Level 4.1.

ffmpeg version N-86330-gbd1179e
built on 2017-06-01

Change History (6)

comment:1 by Hendrik, 7 years ago

The level is mostly a function of the bitrate and some other stream properties anyway, why do you specifically want to override it anyway?

comment:2 by alexpigment, 7 years ago

It's less about overriding it and more about enforcing it for hardware player compatibility. Ideally it would also cause bitrate limits to be enforced, but short of that, it's good to be able to set it since it's a supported feature of the encoder.

I do realize this is a very minor issue, but I'd like to see QSV be as feature-rich as libx264, and little things like this are all part of getting it to that level (in my opinion, anyway).

comment:3 by DeHackEd, 7 years ago

You have it backwards. The -level parameter is to constrain the parameters to meet a maximum, not to raise the parameters to meet a minimum. This is the "enforcement" of which you speak.

in reply to:  description comment:4 by jkqxz, 7 years ago

From the code at <;a=blob;f=libavcodec/qsvenc.c;h=5eb506fb76224d48e19bc66d3dc67fe9a5c86184;hb=HEAD#l361> it looks like this works, though I've no idea whether libmfx will actually respect the level you pass in for encode.


-level 4.1

This wants the level_idc value rather than the human-readable string name: try 41.

comment:5 by alexpigment, 7 years ago

jkqxz: I didn't realize it was looking for that sort of string. Thank you very much for point this out. Perhaps it should recognize 4.1 as well so that that people could use the same syntax from encoder to encoder.

DeHackEd: No, that was my understanding as well. I realize that it was picking 4.0 in my case because it's not hitting a bitrate that would cause it to move into 4.1. I was just saying that ideally there would be bitrate limits tied to whatever level you choose, which unfortunately I hadn't been able to test until jkqxz clued me into the level_idc value thing. I can now confirm, however, that the bitrate limits don't seem to be in effect. The same is true for libx264 of course.

comment:6 by Carl Eugen Hoyos, 4 years ago

Component: undeterminedavcodec
Keywords: intel level h264_qsv h.264 removed
Version: unspecifiedgit-master

I consider the fact that this option works differently for qsv than for x264 extremely disturbing.

Note: See TracTickets for help on using tickets.