[FFmpeg-trac] #7839(avcodec:new): QVBR breaks mpeg2_qsv
FFmpeg
trac at avcodec.org
Wed Apr 24 14:16:51 EEST 2019
#7839: QVBR breaks mpeg2_qsv
-------------------------------------+-------------------------------------
Reporter: atorp | Owner:
Type: defect | Status: new
Priority: important | Component: avcodec
Version: git-master | Resolution:
Keywords: qsv | Blocked By:
regression |
Blocking: | Reproduced by developer: 0
Analyzed by developer: 0 |
-------------------------------------+-------------------------------------
Comment (by lizhong1008):
Replying to [comment:13 atorp]:
>However, to disable QVBR I need to disable CO3 too... or the code doesn't
compile. I'm sure CO3 isn't related to this bug.
Why it can't compile? I applied such a patch on my side (without any other
changes such as disable CO3):
{{{
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index f2f4d38503..46db07728d 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -53,13 +53,13 @@
#define QSV_HAVE_AVBR QSV_VERSION_ATLEAST(1, 3)
#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8)
-#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11)
+#define QSV_HAVE_QVBR 0
#define QSV_HAVE_MF 0
#else
#define QSV_HAVE_AVBR 0
#define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 28)
#define QSV_HAVE_VCM 0
-#define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 28)
+#define QSV_HAVE_QVBR 0
#define QSV_HAVE_MF QSV_VERSION_ATLEAST(1, 25)
#endif
}}}
Compile passed on my side (still on Linux).
> Here it is: Initialize MFX session: API version is 1.27, implementation
version is 1.11
Your MSDK API version is 1.27 but MSDK library version is 1.11 which is
quite old.
>Just decompress the ZIP in *ANY* Windows 10 with Intel drivers, and run
it.
Tried it on one Windows platform, it works but provided a warning:
{{{
C:\Users\zhongli1>ffmpeg -hwaccel qsv -c:v h264_qsv -i
X:\bbb_sunflower_1080p_30fps_normal_2000frames.h264 -c:v mpeg2_qsv
X:\test.mp4 -v verbose
ffmpeg version N-93022-g260f1960e7 Copyright (c) 2000-2019 the FFmpeg
developers
built with gcc 8.2.1 (GCC) 20181201
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-
fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-
libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-
amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus
--enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora
--enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp
--enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg
--enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-
libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex
--enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-
ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec
--enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 44.100 / 58. 44.100
libavformat 58. 26.100 / 58. 26.100
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
[h264 @ 000002171f9ac8c0] Reinit context to 1920x1088, pix_fmt: yuv420p
[h264 @ 000002171f99a800] max_analyze_duration 5000000 reached at 5000000
microseconds st:0
Input #0, h264, from
'X:\bbb_sunflower_1080p_30fps_normal_2000frames.h264':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), 1 reference frame,
yuv420p(progressive, left), 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 30
fps, 30 tbr, 1200k tbn, 60 tbc
File 'X:\test.mp4' already exists. Overwrite ? [y/N] y
[AVBSFContext @ 000002171fdb0f00] The input looks like it is Annex B
already
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> mpeg2video (mpeg2_qsv))
Press [q] to stop, [?] for help
[AVHWDeviceContext @ 000002172035cb40] Using D3D9Ex device.
[AVHWDeviceContext @ 000002172035b8c0] Initialize MFX session: API version
is 1.27, implementation version is 1.27
[AVHWDeviceContext @ 000002172035b8c0] MFX compile/runtime API: 1.27/1.27
[graph 0 input from stream 0:0 @ 000002171f9a2d40] w:1920 h:1080
pixfmt:qsv tb:1/1200000 fr:30/1 sar:1/1 sws_param:flags=2
[mpeg2_qsv @ 000002171fdb00c0] Using the average variable bitrate (AVBR)
ratecontrol method
[mpeg2_qsv @ 000002171fdb00c0] Warning in encoder initialization:
incompatible video parameters (5)
[mpeg2_qsv @ 000002171fdb00c0] profile: main; level: 4
[mpeg2_qsv @ 000002171fdb00c0] GopPicSize: 250; GopRefDist: 4; GopOptFlag:
closed ; IdrInterval: 0
[mpeg2_qsv @ 000002171fdb00c0] TargetUsage: 4; RateControlMethod: CBR
[mpeg2_qsv @ 000002171fdb00c0] BufferSizeInKB: 91; InitialDelayInKB: 45;
TargetKbps: 1000; MaxKbps: 1000; BRCParamMultiplier: 1
[mpeg2_qsv @ 000002171fdb00c0] NumSlice: 68; NumRefFrame: 0
[mpeg2_qsv @ 000002171fdb00c0] RateDistortionOpt: unknown
[mpeg2_qsv @ 000002171fdb00c0] RecoveryPointSEI: unknown IntRefType: 0;
IntRefCycleSize: 0; IntRefQPDelta: 0
[mpeg2_qsv @ 000002171fdb00c0] MaxFrameSize: 0; MaxSliceSize: 0;
[mpeg2_qsv @ 000002171fdb00c0] BitrateLimit: unknown; MBBRC: unknown;
ExtBRC: unknown
[mpeg2_qsv @ 000002171fdb00c0] Trellis: auto
[mpeg2_qsv @ 000002171fdb00c0] VDENC: OFF
[mpeg2_qsv @ 000002171fdb00c0] RepeatPPS: unknown; NumMbPerSlice: 0;
LookAheadDS: unknown
[mpeg2_qsv @ 000002171fdb00c0] AdaptiveI: unknown; AdaptiveB: unknown;
BRefType: auto
[mpeg2_qsv @ 000002171fdb00c0] MinQPI: 0; MaxQPI: 0; MinQPP: 0; MaxQPP: 0;
MinQPB: 0; MaxQPB: 0
[mpeg2_qsv @ 000002171fdb00c0] FrameRateExtD: 1; FrameRateExtN: 30
Output #0, mp4, to 'X:\test.mp4':
...
C:\Users\zhongli1>ffmpeg -hwaccel qsv -c:v h264_qsv -i
X:\bbb_sunflower_1080p_30fps_normal_2000frames.h264 -c:v mpeg2_qsv
X:\test.mp4 -v verbose
ffmpeg version N-93022-g260f1960e7 Copyright (c) 2000-2019 the FFmpeg
developers
built with gcc 8.2.1 (GCC) 20181201
configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-
fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-
libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-
amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus
--enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora
--enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp
--enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg
--enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-
libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex
--enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-
ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec
--enable-dxva2 --enable-avisynth --enable-libopenmpt
libavutil 56. 26.100 / 56. 26.100
libavcodec 58. 44.100 / 58. 44.100
libavformat 58. 26.100 / 58. 26.100
libavdevice 58. 6.101 / 58. 6.101
libavfilter 7. 48.100 / 7. 48.100
libswscale 5. 4.100 / 5. 4.100
libswresample 3. 4.100 / 3. 4.100
libpostproc 55. 4.100 / 55. 4.100
[h264 @ 000002171f9ac8c0] Reinit context to 1920x1088, pix_fmt: yuv420p
[h264 @ 000002171f99a800] max_analyze_duration 5000000 reached at 5000000
microseconds st:0
Input #0, h264, from
'X:\bbb_sunflower_1080p_30fps_normal_2000frames.h264':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), 1 reference frame,
yuv420p(progressive, left), 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 30
fps, 30 tbr, 1200k tbn, 60 tbc
File 'X:\test.mp4' already exists. Overwrite ? [y/N] y
[AVBSFContext @ 000002171fdb0f00] The input looks like it is Annex B
already
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> mpeg2video (mpeg2_qsv))
Press [q] to stop, [?] for help
[AVHWDeviceContext @ 000002172035cb40] Using D3D9Ex device.
[AVHWDeviceContext @ 000002172035b8c0] Initialize MFX session: API version
is 1.27, implementation version is 1.27
[AVHWDeviceContext @ 000002172035b8c0] MFX compile/runtime API: 1.27/1.27
[graph 0 input from stream 0:0 @ 000002171f9a2d40] w:1920 h:1080
pixfmt:qsv tb:1/1200000 fr:30/1 sar:1/1 sws_param:flags=2
[mpeg2_qsv @ 000002171fdb00c0] Using the average variable bitrate (AVBR)
ratecontrol method
[mpeg2_qsv @ 000002171fdb00c0] Warning in encoder initialization:
incompatible video parameters (5)
[mpeg2_qsv @ 000002171fdb00c0] profile: main; level: 4
[mpeg2_qsv @ 000002171fdb00c0] GopPicSize: 250; GopRefDist: 4; GopOptFlag:
closed ; IdrInterval: 0
[mpeg2_qsv @ 000002171fdb00c0] TargetUsage: 4; RateControlMethod: CBR
[mpeg2_qsv @ 000002171fdb00c0] BufferSizeInKB: 91; InitialDelayInKB: 45;
TargetKbps: 1000; MaxKbps: 1000; BRCParamMultiplier: 1
[mpeg2_qsv @ 000002171fdb00c0] NumSlice: 68; NumRefFrame: 0
[mpeg2_qsv @ 000002171fdb00c0] RateDistortionOpt: unknown
[mpeg2_qsv @ 000002171fdb00c0] RecoveryPointSEI: unknown IntRefType: 0;
IntRefCycleSize: 0; IntRefQPDelta: 0
[mpeg2_qsv @ 000002171fdb00c0] MaxFrameSize: 0; MaxSliceSize: 0;
[mpeg2_qsv @ 000002171fdb00c0] BitrateLimit: unknown; MBBRC: unknown;
ExtBRC: unknown
[mpeg2_qsv @ 000002171fdb00c0] Trellis: auto
[mpeg2_qsv @ 000002171fdb00c0] VDENC: OFF
[mpeg2_qsv @ 000002171fdb00c0] RepeatPPS: unknown; NumMbPerSlice: 0;
LookAheadDS: unknown
[mpeg2_qsv @ 000002171fdb00c0] AdaptiveI: unknown; AdaptiveB: unknown;
BRefType: auto
[mpeg2_qsv @ 000002171fdb00c0] MinQPI: 0; MaxQPI: 0; MinQPP: 0; MaxQPP: 0;
MinQPB: 0; MaxQPB: 0
[mpeg2_qsv @ 000002171fdb00c0] FrameRateExtD: 1; FrameRateExtN: 30
Output #0, mp4, to 'X:\test.mp4':
}}}
You can see the Waring (at your side it is an error): Warning in encoder
initialization: incompatible video parameters (5)
I guess it is due to AVBR mode is not support for mpeg2, so I changed the
command line to be
{{{
ffmpeg -hwaccel qsv -c:v h264_qsv -i
X:\bbb_sunflower_1080p_30fps_normal_2000frames.h264 -c:v mpeg2_qsv
-maxrate 2M X:\test.mp4 -v verbose
...
[AVHWDeviceContext @ 0000017a3f349f80] Using D3D9Ex device.
[AVHWDeviceContext @ 0000017a3f349980] Initialize MFX session: API version
is 1.27, implementation version is 1.27
[AVHWDeviceContext @ 0000017a3f349980] MFX compile/runtime API: 1.27/1.27
[graph 0 input from stream 0:0 @ 0000017a3ef9e540] w:1920 h:1080
pixfmt:qsv tb:1/1200000 fr:30/1 sar:1/1 sws_param:flags=2
[mpeg2_qsv @ 0000017a3f1b00c0] Using the variable bitrate (VBR)
ratecontrol method
[mpeg2_qsv @ 0000017a3f1b00c0] profile: main; level: 4
[mpeg2_qsv @ 0000017a3f1b00c0] GopPicSize: 250; GopRefDist: 4; GopOptFlag:
closed ; IdrInterval: 0
[mpeg2_qsv @ 0000017a3f1b00c0] TargetUsage: 4; RateControlMethod: VBR
[mpeg2_qsv @ 0000017a3f1b00c0] BufferSizeInKB: 250; InitialDelayInKB: 250;
TargetKbps: 1000; MaxKbps: 2000; BRCParamMultiplier: 1
[mpeg2_qsv @ 0000017a3f1b00c0] NumSlice: 68; NumRefFrame: 0
[mpeg2_qsv @ 0000017a3f1b00c0] RateDistortionOpt: unknown
[mpeg2_qsv @ 0000017a3f1b00c0] RecoveryPointSEI: unknown IntRefType: 0;
IntRefCycleSize: 0; IntRefQPDelta: 0
[mpeg2_qsv @ 0000017a3f1b00c0] MaxFrameSize: 0; MaxSliceSize: 0;
[mpeg2_qsv @ 0000017a3f1b00c0] BitrateLimit: unknown; MBBRC: unknown;
ExtBRC: unknown
[mpeg2_qsv @ 0000017a3f1b00c0] Trellis: auto
[mpeg2_qsv @ 0000017a3f1b00c0] VDENC: OFF
[mpeg2_qsv @ 0000017a3f1b00c0] RepeatPPS: unknown; NumMbPerSlice: 0;
LookAheadDS: unknown
[mpeg2_qsv @ 0000017a3f1b00c0] AdaptiveI: unknown; AdaptiveB: unknown;
BRefType: auto
[mpeg2_qsv @ 0000017a3f1b00c0] MinQPI: 0; MaxQPI: 0; MinQPP: 0; MaxQPP: 0;
MinQPB: 0; MaxQPB: 0
[mpeg2_qsv @ 0000017a3f1b00c0] FrameRateExtD: 1; FrameRateExtN: 30
...
}}}
Now it is using VBR mode and no warning now.
Could you please check this warning (Warning in encoder initialization:
incompatible video parameters) existed or now with
https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-20190124-3224d66-win64-static.zip?
If existed, I believe windows version MSDK can't support AVBR mode for
mpeg2.
--
Ticket URL: <https://trac.ffmpeg.org/ticket/7839#comment:14>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
More information about the FFmpeg-trac
mailing list