diff --git a/ffmpeg b/ffmpeg index f89949afed..e4c1272711 160000 --- a/ffmpeg +++ b/ffmpeg @@ -1 +1 @@ -Subproject commit f89949afed7a538db603f32d463fe9547bc439a7 +Subproject commit e4c127271198ebb799f19cb96cc1a6b62506e0d1 diff --git a/patches/0018-lavcu-qsv-Add-decoding-support-for-444-8-10-bit.patch b/patches/0018-lavcu-qsv-Add-decoding-support-for-444-8-10-bit.patch index b29e8b22d7..64abc6aaaa 100644 --- a/patches/0018-lavcu-qsv-Add-decoding-support-for-444-8-10-bit.patch +++ b/patches/0018-lavcu-qsv-Add-decoding-support-for-444-8-10-bit.patch @@ -1,63 +1,44 @@ -From 42452f13d1bceb375b128c6c643ced783a2176e3 Mon Sep 17 00:00:00 2001 +From 50f74dbe1b1ee4f78ab429e6e1e070168bf5d2f6 Mon Sep 17 00:00:00 2001 From: Linjie Fu Date: Mon, 18 May 2020 16:54:57 +0800 -Subject: [PATCH 02/50] lavcu/qsv: Add decoding support for 444 8/10 bit +Subject: [PATCH 02/51] lavcu/qsv: Add decoding support for 444 8/10 bit Add support for 0yuv/y410 in system memory Signed-off-by: Linjie Fu Signed-off-by: Haihao Xiang --- - libavcodec/qsv.c | 22 ++++++++++++++++++++++ - libavcodec/qsvdec.c | 4 ++++ - libavutil/hwcontext_qsv.c | 13 +++++++++++++ - 3 files changed, 39 insertions(+) + libavcodec/qsv.c | 8 ++++++++ + libavcodec/qsvdec.c | 2 ++ + libavutil/hwcontext_qsv.c | 5 +++++ + 3 files changed, 15 insertions(+) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c -index 3449789a2c..44334f574f 100644 +index 51aac16695..c00dcd9b11 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c -@@ -210,7 +210,9 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) - case MFX_FOURCC_RGB4: return AV_PIX_FMT_BGRA; - #if CONFIG_VAAPI +@@ -212,6 +212,7 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422; -+ case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; case MFX_FOURCC_Y210: return AV_PIX_FMT_Y210; + case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; + case MFX_FOURCC_Y410: return AV_PIX_FMT_XV30; #endif } return AV_PIX_FMT_NONE; -@@ -239,10 +241,18 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) - case AV_PIX_FMT_YUYV422: - *fourcc = MFX_FOURCC_YUY2; - return AV_PIX_FMT_YUYV422; -+ case AV_PIX_FMT_VUYX: -+ case AV_PIX_FMT_YUV444P: -+ *fourcc = MFX_FOURCC_AYUV; -+ return AV_PIX_FMT_VUYX; - case AV_PIX_FMT_YUV422P10: - case AV_PIX_FMT_Y210: - *fourcc = MFX_FOURCC_Y210; - return AV_PIX_FMT_Y210; +@@ -247,6 +248,9 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) + case AV_PIX_FMT_VUYX: + *fourcc = MFX_FOURCC_AYUV; + return AV_PIX_FMT_VUYX; + case AV_PIX_FMT_XV30: -+ case AV_PIX_FMT_YUV444P10: + *fourcc = MFX_FOURCC_Y410; + return AV_PIX_FMT_XV30; #endif default: return AVERROR(ENOSYS); -@@ -277,6 +287,18 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) - surface->Data.U16 = (mfxU16 *)frame->data[0] + 1; - surface->Data.V16 = (mfxU16 *)frame->data[0] + 3; +@@ -291,6 +295,10 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) + surface->Data.A = frame->data[0] + 3; break; -+ -+ case AV_PIX_FMT_VUYX: -+ surface->Data.V = frame->data[0]; -+ surface->Data.U = frame->data[0] + 1; -+ surface->Data.Y = frame->data[0] + 2; -+ surface->Data.A = frame->data[0] + 3; -+ break; -+ + + case AV_PIX_FMT_XV30: + surface->Data.U = frame->data[0]; + break; @@ -66,54 +47,42 @@ index 3449789a2c..44334f574f 100644 return AVERROR(ENOSYS); } diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c -index 0f0d719e23..6137f1e000 100644 +index 0254a394bd..912d58965a 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c -@@ -141,6 +141,8 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, - frame->linesize[0] = 2 * FFALIGN(avctx->width, 128); +@@ -142,6 +142,7 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, break; case AV_PIX_FMT_Y210: + case AV_PIX_FMT_VUYX: + case AV_PIX_FMT_XV30: -+ case AV_PIX_FMT_VUYX: frame->linesize[0] = 4 * FFALIGN(avctx->width, 128); break; default: -@@ -1041,6 +1043,8 @@ const FFCodec ff_##x##_qsv_decoder = { \ - AV_PIX_FMT_P010, \ +@@ -1043,6 +1044,7 @@ const FFCodec ff_##x##_qsv_decoder = { \ AV_PIX_FMT_YUYV422, \ AV_PIX_FMT_Y210, \ -+ AV_PIX_FMT_VUYX, \ + AV_PIX_FMT_VUYX, \ + AV_PIX_FMT_XV30, \ AV_PIX_FMT_QSV, \ AV_PIX_FMT_NONE }, \ .hw_configs = qsv_hw_configs, \ diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c -index e08a203082..66ff2212e4 100644 +index 3234264e1c..853e549236 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c -@@ -117,8 +117,12 @@ static const struct { - #if CONFIG_VAAPI - { AV_PIX_FMT_YUYV422, - MFX_FOURCC_YUY2 }, -+ { AV_PIX_FMT_VUYX, -+ MFX_FOURCC_AYUV }, - { AV_PIX_FMT_Y210, - MFX_FOURCC_Y210 }, +@@ -123,6 +123,8 @@ static const struct { + // the SDK only delares support for AYUV + { AV_PIX_FMT_VUYX, + MFX_FOURCC_AYUV }, + { AV_PIX_FMT_XV30, + MFX_FOURCC_Y410 }, #endif }; -@@ -1502,6 +1506,15 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) - surface->Data.U16 = (mfxU16 *)frame->data[0] + 1; - surface->Data.V16 = (mfxU16 *)frame->data[0] + 3; +@@ -1514,6 +1516,9 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) + // use the value from the frame. + surface->Data.A = frame->data[0] + 3; break; -+ case AV_PIX_FMT_VUYX: -+ surface->Data.V = frame->data[0]; -+ surface->Data.U = frame->data[0] + 1; -+ surface->Data.Y = frame->data[0] + 2; -+ surface->Data.A = frame->data[0] + 3; -+ break; + case AV_PIX_FMT_XV30: + surface->Data.U = frame->data[0]; + break; diff --git a/patches/0031-lavc-qsv-support-hevc-vp9-12bit.patch b/patches/0031-lavc-qsv-support-hevc-vp9-12bit.patch index dd6b0ee69c..6843d39c09 100644 --- a/patches/0031-lavc-qsv-support-hevc-vp9-12bit.patch +++ b/patches/0031-lavc-qsv-support-hevc-vp9-12bit.patch @@ -1,7 +1,7 @@ -From 7f7c9c9d9dc9b762714d8d9f8fd4ff15eefe230f Mon Sep 17 00:00:00 2001 +From d56c060b4e1d7b519720ab9d11923564402ccf2f Mon Sep 17 00:00:00 2001 From: Fei Wang Date: Thu, 28 May 2020 14:14:32 -0400 -Subject: [PATCH 06/50] lavc/qsv: support hevc/vp9 12bit +Subject: [PATCH 07/51] lavc/qsv: support hevc/vp9 12bit ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -v verbose -c:v hevc_qsv -i GENERAL_12b_420_RExt_Sony_1.bit -vf hwdownload,format=p012 -vsync passthrough -frames 25 -f md5 -y qsv_out.md5 @@ -20,12 +20,12 @@ ffmpeg -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -v verbose 2 files changed, 35 insertions(+) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c -index 44334f574f..bd0d689c27 100644 +index c00dcd9b11..f1e47514c0 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -213,6 +213,11 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) - case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; case MFX_FOURCC_Y210: return AV_PIX_FMT_Y210; + case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; case MFX_FOURCC_Y410: return AV_PIX_FMT_XV30; +#if QSV_VERSION_ATLEAST(1, 31) + case MFX_FOURCC_P016: return AV_PIX_FMT_P012; @@ -35,8 +35,8 @@ index 44334f574f..bd0d689c27 100644 #endif } return AV_PIX_FMT_NONE; -@@ -253,6 +258,20 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) - case AV_PIX_FMT_YUV444P10: +@@ -251,6 +256,20 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) + case AV_PIX_FMT_XV30: *fourcc = MFX_FOURCC_Y410; return AV_PIX_FMT_XV30; +#if QSV_VERSION_ATLEAST(1, 31) @@ -57,11 +57,11 @@ index 44334f574f..bd0d689c27 100644 default: return AVERROR(ENOSYS); diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c -index 66ff2212e4..480e89415c 100644 +index 853e549236..f49d1c8006 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c -@@ -123,6 +123,14 @@ static const struct { - MFX_FOURCC_Y210 }, +@@ -125,6 +125,14 @@ static const struct { + MFX_FOURCC_AYUV }, { AV_PIX_FMT_XV30, MFX_FOURCC_Y410 }, +#if QSV_VERSION_ATLEAST(1, 31) @@ -75,7 +75,7 @@ index 66ff2212e4..480e89415c 100644 #endif }; -@@ -1478,6 +1486,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -1480,6 +1488,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) switch (frame->format) { case AV_PIX_FMT_NV12: case AV_PIX_FMT_P010: @@ -83,7 +83,7 @@ index 66ff2212e4..480e89415c 100644 surface->Data.Y = frame->data[0]; surface->Data.UV = frame->data[1]; break; -@@ -1502,6 +1511,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -1504,6 +1513,7 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) break; case AV_PIX_FMT_Y210: @@ -91,7 +91,7 @@ index 66ff2212e4..480e89415c 100644 surface->Data.Y16 = (mfxU16 *)frame->data[0]; surface->Data.U16 = (mfxU16 *)frame->data[0] + 1; surface->Data.V16 = (mfxU16 *)frame->data[0] + 3; -@@ -1515,6 +1525,12 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -1519,6 +1529,12 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) case AV_PIX_FMT_XV30: surface->Data.U = frame->data[0]; break; diff --git a/patches/0057-qsv-remove-CONFIG_VAAPI.patch b/patches/0057-qsv-remove-CONFIG_VAAPI.patch index 8330312773..2f791d20eb 100644 --- a/patches/0057-qsv-remove-CONFIG_VAAPI.patch +++ b/patches/0057-qsv-remove-CONFIG_VAAPI.patch @@ -1,7 +1,7 @@ -From 1a590755d9780a53234e0fc023e9d239f0b47d67 Mon Sep 17 00:00:00 2001 +From 95f4fd513416a00873694b6a203afea805e7745c Mon Sep 17 00:00:00 2001 From: Tong Wu Date: Mon, 29 Nov 2021 15:12:12 +0800 -Subject: [PATCH 30/50] qsv: remove CONFIG_VAAPI +Subject: [PATCH 31/51] qsv: remove CONFIG_VAAPI Make 8-bit, 10-bit, 12-bit YUV 4:2:2 video sources as well as YUV 4:4:4 video sources supported by d3d11va and dxva2 just like what VAAPI does. @@ -13,7 +13,7 @@ Sign-off-by: Tong Wu 2 files changed, 8 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c -index bd0d689c27..6edc029122 100644 +index f1e47514c0..ec7b5c2ddd 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -208,7 +208,6 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) @@ -22,8 +22,8 @@ index bd0d689c27..6edc029122 100644 case MFX_FOURCC_RGB4: return AV_PIX_FMT_BGRA; -#if CONFIG_VAAPI case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422; - case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; case MFX_FOURCC_Y210: return AV_PIX_FMT_Y210; + case MFX_FOURCC_AYUV: return AV_PIX_FMT_VUYX; @@ -217,7 +216,6 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) case MFX_FOURCC_P016: return AV_PIX_FMT_P012; case MFX_FOURCC_Y216: return AV_PIX_FMT_Y212; @@ -40,7 +40,7 @@ index bd0d689c27..6edc029122 100644 case AV_PIX_FMT_YUV422P: case AV_PIX_FMT_YUYV422: *fourcc = MFX_FOURCC_YUY2; -@@ -271,7 +268,6 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) +@@ -269,7 +266,6 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) case AV_PIX_FMT_XV36: *fourcc = MFX_FOURCC_Y416; return AV_PIX_FMT_XV36; @@ -49,7 +49,7 @@ index bd0d689c27..6edc029122 100644 default: return AVERROR(ENOSYS); diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c -index f17a31ceba..ec45db7e1f 100644 +index 740b690ae6..17b9702241 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -114,7 +114,6 @@ static const struct { @@ -59,8 +59,8 @@ index f17a31ceba..ec45db7e1f 100644 -#if CONFIG_VAAPI { AV_PIX_FMT_YUYV422, MFX_FOURCC_YUY2 }, - { AV_PIX_FMT_VUYX, -@@ -131,7 +130,6 @@ static const struct { + { AV_PIX_FMT_Y210, +@@ -133,7 +132,6 @@ static const struct { { AV_PIX_FMT_XV36, MFX_FOURCC_Y416 }, #endif @@ -68,7 +68,7 @@ index f17a31ceba..ec45db7e1f 100644 }; extern int ff_qsv_get_surface_base_handle(mfxFrameSurface1 *surf, -@@ -1503,7 +1501,6 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -1505,7 +1503,6 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) surface->Data.R = frame->data[0] + 2; surface->Data.A = frame->data[0] + 3; break; @@ -76,7 +76,7 @@ index f17a31ceba..ec45db7e1f 100644 case AV_PIX_FMT_YUYV422: surface->Data.Y = frame->data[0]; surface->Data.U = frame->data[0] + 1; -@@ -1531,7 +1528,6 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -1535,7 +1532,6 @@ static int map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) surface->Data.V = frame->data[0] + 2; surface->Data.A = frame->data[0] + 3; break; diff --git a/patches/0068-avcodec-qsvenc-make-QSV-encoder-encode-VAAPI-and-D3D.patch b/patches/0068-avcodec-qsvenc-make-QSV-encoder-encode-VAAPI-and-D3D.patch index 9573fc5b63..680a0f7eaa 100644 --- a/patches/0068-avcodec-qsvenc-make-QSV-encoder-encode-VAAPI-and-D3D.patch +++ b/patches/0068-avcodec-qsvenc-make-QSV-encoder-encode-VAAPI-and-D3D.patch @@ -1,7 +1,7 @@ -From 91f71f8372fa8e36ce8d685643c86ba588a7ce0b Mon Sep 17 00:00:00 2001 +From 59fc30b983237a1e031e52b8504617654fc7c852 Mon Sep 17 00:00:00 2001 From: Tong Wu Date: Thu, 2 Jun 2022 14:00:57 +0800 -Subject: [PATCH 68/77] avcodec/qsvenc: make QSV encoder encode VAAPI and D3D11 +Subject: [PATCH 41/51] avcodec/qsvenc: make QSV encoder encode VAAPI and D3D11 frames directly QSV encoder is able to encode frames with VAAPI or D3D11 pixel format @@ -20,10 +20,10 @@ Signed-off-by: Tong Wu 6 files changed, 62 insertions(+), 7 deletions(-) diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c -index 57102157e6..0bcaad2d64 100644 +index ec47d684ed..1318d4a873 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c -@@ -643,7 +643,9 @@ static int check_enc_param(AVCodecContext *avctx, QSVEncContext *q) +@@ -644,7 +644,9 @@ static int check_enc_param(AVCodecContext *avctx, QSVEncContext *q) static int init_video_param_jpeg(AVCodecContext *avctx, QSVEncContext *q) { @@ -34,7 +34,7 @@ index 57102157e6..0bcaad2d64 100644 avctx->sw_pix_fmt : avctx->pix_fmt; const AVPixFmtDescriptor *desc; int ret; -@@ -710,7 +712,9 @@ static int init_video_param_jpeg(AVCodecContext *avctx, QSVEncContext *q) +@@ -711,7 +713,9 @@ static int init_video_param_jpeg(AVCodecContext *avctx, QSVEncContext *q) static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) { @@ -45,7 +45,7 @@ index 57102157e6..0bcaad2d64 100644 avctx->sw_pix_fmt : avctx->pix_fmt; const AVPixFmtDescriptor *desc; float quant; -@@ -1494,7 +1498,31 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) +@@ -1506,7 +1510,31 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q) if (avctx->hw_frames_ctx) { AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data; @@ -78,7 +78,7 @@ index 57102157e6..0bcaad2d64 100644 if (!iopattern) { #if QSV_HAVE_OPAQUE -@@ -1719,10 +1747,25 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame, +@@ -1731,10 +1759,25 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame, if (ret < 0) return ret; @@ -108,7 +108,7 @@ index 57102157e6..0bcaad2d64 100644 qf->surface = *(mfxFrameSurface1*)qf->frame->data[3]; -@@ -2178,6 +2221,8 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) +@@ -2183,6 +2226,8 @@ int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q) const AVCodecHWConfigInternal *const ff_qsv_enc_hw_configs[] = { HW_CONFIG_ENCODER_FRAMES(QSV, QSV), @@ -118,10 +118,10 @@ index 57102157e6..0bcaad2d64 100644 HW_CONFIG_ENCODER_DEVICE(P010, QSV), NULL, diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c -index 53d754a473..ac3097c498 100644 +index 3fae8f0200..dfcb074da7 100644 --- a/libavcodec/qsvenc_h264.c +++ b/libavcodec/qsvenc_h264.c -@@ -196,6 +196,8 @@ const FFCodec ff_h264_qsv_encoder = { +@@ -198,6 +198,8 @@ const FFCodec ff_h264_qsv_encoder = { .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_P010, AV_PIX_FMT_QSV, @@ -131,10 +131,10 @@ index 53d754a473..ac3097c498 100644 .p.priv_class = &class, .defaults = qsv_enc_defaults, diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c -index 3f08719c86..ae13ec3f43 100644 +index 931639ea03..36fa4a397f 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c -@@ -314,6 +314,8 @@ const FFCodec ff_hevc_qsv_encoder = { +@@ -316,6 +316,8 @@ const FFCodec ff_hevc_qsv_encoder = { AV_PIX_FMT_YUYV422, AV_PIX_FMT_Y210, AV_PIX_FMT_QSV, @@ -142,9 +142,9 @@ index 3f08719c86..ae13ec3f43 100644 + AV_PIX_FMT_D3D11, AV_PIX_FMT_BGRA, AV_PIX_FMT_X2RGB10, - AV_PIX_FMT_NONE }, + AV_PIX_FMT_VUYX, diff --git a/libavcodec/qsvenc_jpeg.c b/libavcodec/qsvenc_jpeg.c -index ca56989d23..f096fafe95 100644 +index 2469ef7c9f..a7bed685d1 100644 --- a/libavcodec/qsvenc_jpeg.c +++ b/libavcodec/qsvenc_jpeg.c @@ -90,6 +90,8 @@ const FFCodec ff_mjpeg_qsv_encoder = { @@ -157,7 +157,7 @@ index ca56989d23..f096fafe95 100644 .p.priv_class = &class, .defaults = qsv_enc_defaults, diff --git a/libavcodec/qsvenc_mpeg2.c b/libavcodec/qsvenc_mpeg2.c -index 6b7677148c..5d6779ac7a 100644 +index 22f1ff7c0d..c1e887fc2f 100644 --- a/libavcodec/qsvenc_mpeg2.c +++ b/libavcodec/qsvenc_mpeg2.c @@ -104,6 +104,8 @@ const FFCodec ff_mpeg2_qsv_encoder = { @@ -170,12 +170,12 @@ index 6b7677148c..5d6779ac7a 100644 .p.priv_class = &class, .defaults = qsv_enc_defaults, diff --git a/libavcodec/qsvenc_vp9.c b/libavcodec/qsvenc_vp9.c -index 81f5e69e24..d91d2cffab 100644 +index 044a882d1a..c3d09f880b 100644 --- a/libavcodec/qsvenc_vp9.c +++ b/libavcodec/qsvenc_vp9.c -@@ -114,6 +114,8 @@ const FFCodec ff_vp9_qsv_encoder = { - .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, +@@ -115,6 +115,8 @@ const FFCodec ff_vp9_qsv_encoder = { AV_PIX_FMT_P010, + AV_PIX_FMT_VUYX, AV_PIX_FMT_QSV, + AV_PIX_FMT_VAAPI, + AV_PIX_FMT_D3D11, @@ -183,5 +183,5 @@ index 81f5e69e24..d91d2cffab 100644 .p.priv_class = &class, .defaults = qsv_enc_defaults, -- -2.17.1 +2.25.1 diff --git a/patches/0076-lavc-qsvenc_-hevc-vp9-0yuv-y410-in-system-memory.patch b/patches/0076-lavc-qsvenc_-hevc-vp9-0yuv-y410-in-system-memory.patch index 120adbeb37..25b28afc4a 100644 --- a/patches/0076-lavc-qsvenc_-hevc-vp9-0yuv-y410-in-system-memory.patch +++ b/patches/0076-lavc-qsvenc_-hevc-vp9-0yuv-y410-in-system-memory.patch @@ -1,7 +1,7 @@ -From c40e0f27ee2c688baef5bbf6174ed0f5690aa062 Mon Sep 17 00:00:00 2001 +From cce75c6fc5500482cd7376b3a521386defb0d6c6 Mon Sep 17 00:00:00 2001 From: Haihao Xiang Date: Thu, 30 Jun 2022 15:05:31 +0800 -Subject: [PATCH 48/50] lavc/qsvenc_{hevc, vp9}: 0yuv, y410 in system memory +Subject: [PATCH 49/51] lavc/qsvenc_{hevc, vp9}: 0yuv, y410 in system memory $ ffmpeg -y -f rawvideo -pix_fmt 0yuv -s:v 352x288 -i in.yuv -c:v hevc_qsv out.h265 $ mediainfo out.h265 @@ -10,32 +10,30 @@ Chroma subsampling : 4:4:4 Bit depth : 8 bits Color range : Limited --- - libavcodec/qsvenc_hevc.c | 2 ++ - libavcodec/qsvenc_vp9.c | 2 ++ - 2 files changed, 4 insertions(+) + libavcodec/qsvenc_hevc.c | 1 + + libavcodec/qsvenc_vp9.c | 1 + + 2 files changed, 2 insertions(+) diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c -index 03f6142580..2baec23b4b 100644 +index 36fa4a397f..002edd31c3 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c -@@ -319,6 +319,8 @@ const FFCodec ff_hevc_qsv_encoder = { - AV_PIX_FMT_D3D11, +@@ -321,6 +321,7 @@ const FFCodec ff_hevc_qsv_encoder = { AV_PIX_FMT_BGRA, AV_PIX_FMT_X2RGB10, -+ AV_PIX_FMT_VUYX, + AV_PIX_FMT_VUYX, + AV_PIX_FMT_XV30, AV_PIX_FMT_NONE }, .p.priv_class = &class, .defaults = qsv_enc_defaults, diff --git a/libavcodec/qsvenc_vp9.c b/libavcodec/qsvenc_vp9.c -index be44c7e6df..2247a41e4b 100644 +index c3d09f880b..3295ffb2ef 100644 --- a/libavcodec/qsvenc_vp9.c +++ b/libavcodec/qsvenc_vp9.c -@@ -116,6 +116,8 @@ const FFCodec ff_vp9_qsv_encoder = { +@@ -117,6 +117,7 @@ const FFCodec ff_vp9_qsv_encoder = { AV_PIX_FMT_QSV, AV_PIX_FMT_VAAPI, AV_PIX_FMT_D3D11, -+ AV_PIX_FMT_VUYX, + AV_PIX_FMT_XV30, AV_PIX_FMT_NONE }, .p.priv_class = &class, diff --git a/patches/0077-libavcodec-qsv-Add-12bit-support-to-qsv.patch b/patches/0077-libavcodec-qsv-Add-12bit-support-to-qsv.patch index d4fc2d5f0d..94338edb54 100644 --- a/patches/0077-libavcodec-qsv-Add-12bit-support-to-qsv.patch +++ b/patches/0077-libavcodec-qsv-Add-12bit-support-to-qsv.patch @@ -1,7 +1,7 @@ -From d067dc15cc22c111290f2b7da8901e1b525496a0 Mon Sep 17 00:00:00 2001 +From 5dee008b7c1bfeb8b159d0c231e918372b53eb98 Mon Sep 17 00:00:00 2001 From: Wenbin Chen Date: Mon, 11 Jul 2022 15:53:30 +0800 -Subject: [PATCH 49/50] libavcodec/qsv: Add 12bit support to qsv +Subject: [PATCH 50/51] libavcodec/qsv: Add 12bit support to qsv Add p012, y212 and y412 system memory support to qsvdec. Add p012 system memory support to hevc_qsv enc. @@ -9,15 +9,15 @@ Add p012 system memory support to hevc_qsv enc. Signed-off-by: Wenbin Chen --- libavcodec/qsv.c | 9 +++++++++ - libavcodec/qsvdec.c | 11 ++++++++++- + libavcodec/qsvdec.c | 12 +++++++++++- libavcodec/qsvenc_hevc.c | 1 + - 3 files changed, 20 insertions(+), 1 deletion(-) + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c -index 6edc029122..1e4e8a22a5 100644 +index ec7b5c2ddd..7b9231c577 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c -@@ -279,6 +279,7 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -277,6 +277,7 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) switch (frame->format) { case AV_PIX_FMT_NV12: case AV_PIX_FMT_P010: @@ -25,7 +25,7 @@ index 6edc029122..1e4e8a22a5 100644 surface->Data.Y = frame->data[0]; surface->Data.UV = frame->data[1]; /* The SDK checks Data.V when using system memory for VP9 encoding */ -@@ -298,6 +299,7 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) +@@ -296,6 +297,7 @@ int ff_qsv_map_frame_to_surface(const AVFrame *frame, mfxFrameSurface1 *surface) break; case AV_PIX_FMT_Y210: @@ -48,10 +48,10 @@ index 6edc029122..1e4e8a22a5 100644 return AVERROR(ENOSYS); } diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c -index 9bf6ae2a95..bb132f1214 100644 +index 26a0836cd1..33f9d99292 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c -@@ -145,14 +145,19 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, +@@ -145,14 +145,20 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, frame->linesize[0] = FFALIGN(avctx->width, 128); break; case AV_PIX_FMT_P010: @@ -60,9 +60,10 @@ index 9bf6ae2a95..bb132f1214 100644 frame->linesize[0] = 2 * FFALIGN(avctx->width, 128); break; case AV_PIX_FMT_Y210: + case AV_PIX_FMT_VUYX: case AV_PIX_FMT_XV30: + case AV_PIX_FMT_Y212: - case AV_PIX_FMT_VUYX: ++ frame->linesize[0] = 4 * FFALIGN(avctx->width, 128); break; + case AV_PIX_FMT_XV36: @@ -71,7 +72,7 @@ index 9bf6ae2a95..bb132f1214 100644 default: av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n"); return AVERROR(EINVAL); -@@ -164,7 +169,8 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, +@@ -164,7 +170,8 @@ static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame, frame->data[0] = frame->buf[0]->data; if (avctx->pix_fmt == AV_PIX_FMT_NV12 || @@ -81,7 +82,7 @@ index 9bf6ae2a95..bb132f1214 100644 frame->linesize[1] = frame->linesize[0]; frame->data[1] = frame->data[0] + frame->linesize[0] * FFALIGN(avctx->height, 64); -@@ -1196,10 +1202,13 @@ const FFCodec ff_##x##_qsv_decoder = { \ +@@ -1196,10 +1203,13 @@ const FFCodec ff_##x##_qsv_decoder = { \ .p.priv_class = &x##_qsv_class, \ .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ AV_PIX_FMT_P010, \ @@ -96,10 +97,10 @@ index 9bf6ae2a95..bb132f1214 100644 AV_PIX_FMT_NONE }, \ .hw_configs = qsv_hw_configs, \ diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c -index 2baec23b4b..edc61ed4fa 100644 +index 002edd31c3..9766a64c85 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c -@@ -312,6 +312,7 @@ const FFCodec ff_hevc_qsv_encoder = { +@@ -313,6 +313,7 @@ const FFCodec ff_hevc_qsv_encoder = { .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HYBRID, .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_P010,