[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