[FFmpeg-devel] [PATCH v3 0/6] Implement SEI parsing for QSV decoders

ffmpegagent ffmpegagent at gmail.com
Wed Jun 1 21:01:40 EEST 2022


Missing SEI information has always been a major drawback when using the QSV
decoders. I used to think that there's no chance to get at the data without
explicit implementation from the MSDK side (or doing something weird like
parsing in parallel). It turned out that there's a hardly known api method
that provides access to all SEI (h264/hevc) or user data (mpeg2video).

This allows to get things like closed captions, frame packing, display
orientation, HDR data (mastering display, content light level, etc.) without
having to rely on those data being provided by the MSDK as extended buffers.

The commit "Implement SEI parsing for QSV decoders" includes some hard-coded
workarounds for MSDK bugs which I reported:
https://github.com/Intel-Media-SDK/MediaSDK/issues/2597#issuecomment-1072795311

But that doesn't help. Those bugs exist and I'm sharing my workarounds,
which are empirically determined by testing a range of files. If someone is
interested, I can provide private access to a repository where we have been
testing this. Alternatively, I could also leave those workarounds out, and
just skip those SEI types.

In a previous version of this patchset, there was a concern that payload
data might need to be re-ordered. Meanwhile I have researched this carefully
and the conclusion is that this is not required.

My detailed analysis can be found here:
https://gist.github.com/softworkz/36c49586a8610813a32270ee3947a932

v2

 * qsvdec: make error handling consistent and clear
 * qsvdec: remove AV_CODEC_ID_MPEG1VIDEO constants
 * hevcdec: rename function to ff_hevc_set_side_data(), add doc text

v3

 * qsvdec: fix c/p error

softworkz (6):
  avutil/frame: Add av_frame_copy_side_data() and
    av_frame_remove_all_side_data()
  avcodec/vpp_qsv: Copy side data from input to output frame
  avcodec/mpeg12dec: make mpeg_decode_user_data() accessible
  avcodec/hevcdec: make set_side_data() accessible
  avcodec/h264dec: make h264_export_frame_props() accessible
  avcodec/qsvdec: Implement SEI parsing for QSV decoders

 doc/APIchanges               |   4 +
 libavcodec/h264_slice.c      |  98 ++++++++-------
 libavcodec/h264dec.h         |   2 +
 libavcodec/hevcdec.c         | 117 +++++++++---------
 libavcodec/hevcdec.h         |   9 ++
 libavcodec/mpeg12.h          |  28 +++++
 libavcodec/mpeg12dec.c       |  40 +-----
 libavcodec/qsvdec.c          | 234 +++++++++++++++++++++++++++++++++++
 libavfilter/qsvvpp.c         |   6 +
 libavfilter/vf_overlay_qsv.c |  19 ++-
 libavutil/frame.c            |  67 ++++++----
 libavutil/frame.h            |  32 +++++
 libavutil/version.h          |   2 +-
 13 files changed, 485 insertions(+), 173 deletions(-)


base-commit: 77b529fbd228fe30a870e3157f051885b436ad92
Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-31%2Fsoftworkz%2Fsubmit_qsv_sei-v3
Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-31/softworkz/submit_qsv_sei-v3
Pull-Request: https://github.com/ffstaging/FFmpeg/pull/31

Range-diff vs v2:

 1:  4ee6cb47db = 1:  c442597a35 avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data()
 2:  3152156c97 = 2:  6f50d0bd57 avcodec/vpp_qsv: Copy side data from input to output frame
 3:  8082c3ab84 = 3:  f682b1d695 avcodec/mpeg12dec: make mpeg_decode_user_data() accessible
 4:  306bdaa39c = 4:  995d835233 avcodec/hevcdec: make set_side_data() accessible
 5:  16f5dfbfd1 = 5:  ac8dc06395 avcodec/h264dec: make h264_export_frame_props() accessible
 6:  23de6d2774 ! 6:  27c3dded4d avcodec/qsvdec: Implement SEI parsing for QSV decoders
     @@ libavcodec/qsvdec.c: static int qsv_export_film_grain(AVCodecContext *avctx, mfx
      +        if (init_get_bits(&gb, &payload.Data[start], payload.NumBit - start * 8) < 0)
      +            av_log(avctx, AV_LOG_ERROR, "Error initializing bitstream reader SEI type: %d  Numbits %d error: %d\n", payload.Type, payload.NumBit, ret);
      +        else {
     -+            ret = ff_h264_sei_decode(&sei, &gb, NULL, avctx);
     ++            ret = ff_hevc_decode_nal_sei(&gb, avctx, &sei, &ps, HEVC_NAL_SEI_PREFIX);
      +
      +            if (ret < 0)
      +                av_log(avctx, AV_LOG_WARNING, "Failed to parse SEI type: %d  Numbits %d error: %d\n", payload.Type, payload.NumBit, ret);

-- 
ffmpeg-codebot


More information about the ffmpeg-devel mailing list