diff mbox series

[FFmpeg-devel] lavc/qsvenc: Add workaround for VP9 keyframe

Message ID 20240126042822.111719-1-haihao.xiang@intel.com
State Accepted
Commit cd31eac9997dc49b1d2b8de97b38c51ed8e9f4c9
Headers show
Series [FFmpeg-devel] lavc/qsvenc: Add workaround for VP9 keyframe | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Xiang, Haihao Jan. 26, 2024, 4:28 a.m. UTC
From: Haihao Xiang <haihao.xiang@intel.com>

The runtime doesn't set the frame type to MFX_FRAMETYPE_IDR on the
returned mfx bitstream for a keyframe, it set the frame type to
MFX_FRAMETYPE_I only. This patch added workaround for VP9 keyframe to
make the coded stream seekable.

Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
---
 libavcodec/qsvenc.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Xiang, Haihao Feb. 5, 2024, 2:54 a.m. UTC | #1
On Vr, 2024-01-26 at 12:28 +0800, Xiang, Haihao wrote:
> From: Haihao Xiang <haihao.xiang@intel.com>
> 
> The runtime doesn't set the frame type to MFX_FRAMETYPE_IDR on the
> returned mfx bitstream for a keyframe, it set the frame type to
> MFX_FRAMETYPE_I only. This patch added workaround for VP9 keyframe to
> make the coded stream seekable.
> 
> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
> ---
>  libavcodec/qsvenc.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
> index a0144b0760..c63b72e384 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -2578,9 +2578,11 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext
> *q,
>          if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType &
> MFX_FRAMETYPE_xIDR) {
>              qpkt.pkt.flags |= AV_PKT_FLAG_KEY;
>              pict_type = AV_PICTURE_TYPE_I;
> -        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType
> & MFX_FRAMETYPE_xI)
> +        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType
> & MFX_FRAMETYPE_xI) {
> +            if (avctx->codec_id == AV_CODEC_ID_VP9)
> +                qpkt.pkt.flags |= AV_PKT_FLAG_KEY;
>              pict_type = AV_PICTURE_TYPE_I;
> -        else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType &
> MFX_FRAMETYPE_xP)
> +        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType
> & MFX_FRAMETYPE_xP)
>              pict_type = AV_PICTURE_TYPE_P;
>          else if (qpkt.bs->FrameType & MFX_FRAMETYPE_B || qpkt.bs->FrameType &
> MFX_FRAMETYPE_xB)
>              pict_type = AV_PICTURE_TYPE_B;

Will apply,

- Haihao
diff mbox series

Patch

diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index a0144b0760..c63b72e384 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -2578,9 +2578,11 @@  int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
         if (qpkt.bs->FrameType & MFX_FRAMETYPE_IDR || qpkt.bs->FrameType & MFX_FRAMETYPE_xIDR) {
             qpkt.pkt.flags |= AV_PKT_FLAG_KEY;
             pict_type = AV_PICTURE_TYPE_I;
-        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType & MFX_FRAMETYPE_xI)
+        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_I || qpkt.bs->FrameType & MFX_FRAMETYPE_xI) {
+            if (avctx->codec_id == AV_CODEC_ID_VP9)
+                qpkt.pkt.flags |= AV_PKT_FLAG_KEY;
             pict_type = AV_PICTURE_TYPE_I;
-        else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType & MFX_FRAMETYPE_xP)
+        } else if (qpkt.bs->FrameType & MFX_FRAMETYPE_P || qpkt.bs->FrameType & MFX_FRAMETYPE_xP)
             pict_type = AV_PICTURE_TYPE_P;
         else if (qpkt.bs->FrameType & MFX_FRAMETYPE_B || qpkt.bs->FrameType & MFX_FRAMETYPE_xB)
             pict_type = AV_PICTURE_TYPE_B;