Add support for hevc_qsv to input RGB format frame. It will transform frame to yuv inside MediaSDK instead of using auto scale. Now hevc_qsv supports directly encoding BGRA and X2RGB10 format. The X2RGB10 correspond to the A2RGB20 format and BGRA correspond to RGB4 format in MediaSDK.
Unified · Split
| @@ -189,6 +189,12 @@ enum AVPixelFormat ff_qsv_map_fourcc(uint32_t fourcc) · 188 unmodified lines | |||
| 189 | case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12; | 189 | case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12; |
| 190 | case MFX_FOURCC_P010: return AV_PIX_FMT_P010; | 190 | case MFX_FOURCC_P010: return AV_PIX_FMT_P010; |
| 191 | case MFX_FOURCC_P8: return AV_PIX_FMT_PAL8; | 191 | case MFX_FOURCC_P8: return AV_PIX_FMT_PAL8; |
| 192 | #if QSV_VERSION_ATLEAST(1, 9) | ||
| 193 | case MFX_FOURCC_A2RGB10: return AV_PIX_FMT_X2RGB10; | ||
| 194 | #endif | ||
| 195 | #if QSV_VERSION_ATLEAST(1, 17) | ||
| 196 | case MFX_FOURCC_RGB4: return AV_PIX_FMT_BGRA; | ||
| 197 | #endif | ||
| 192 | #if CONFIG_VAAPI | 198 | #if CONFIG_VAAPI |
| 193 | case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422; | 199 | case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422; |
| 194 | #if QSV_VERSION_ATLEAST(1, 27) | 200 | #if QSV_VERSION_ATLEAST(1, 27) |
| @@ -211,6 +217,16 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc) · 16 unmodified lines | |||
| 211 | case AV_PIX_FMT_P010: | 217 | case AV_PIX_FMT_P010: |
| 212 | *fourcc = MFX_FOURCC_P010; | 218 | *fourcc = MFX_FOURCC_P010; |
| 213 | return AV_PIX_FMT_P010; | 219 | return AV_PIX_FMT_P010; |
| 220 | #if QSV_VERSION_ATLEAST(1, 9) | ||
| 221 | case AV_PIX_FMT_X2RGB10: | ||
| 222 | *fourcc = MFX_FOURCC_A2RGB10; | ||
| 223 | return AV_PIX_FMT_X2RGB10; | ||
| 224 | #endif | ||
| 225 | #if QSV_VERSION_ATLEAST(1, 17) | ||
| 226 | case AV_PIX_FMT_BGRA: | ||
| 227 | *fourcc = MFX_FOURCC_RGB4; | ||
| 228 | return AV_PIX_FMT_BGRA; | ||
| 229 | #endif | ||
| 214 | #if CONFIG_VAAPI | 230 | #if CONFIG_VAAPI |
| 215 | case AV_PIX_FMT_YUV422P: | 231 | case AV_PIX_FMT_YUV422P: |
| 216 | case AV_PIX_FMT_YUYV422: | 232 | case AV_PIX_FMT_YUYV422: |
| @@ -1616,6 +1616,14 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame, · 1615 unmodified lines | |||
| 1616 | qf->surface.Data.V = qf->surface.Data.UV + 2; | 1616 | qf->surface.Data.V = qf->surface.Data.UV + 2; |
| 1617 | break; | 1617 | break; |
| 1618 | 1618 | ||
| 1619 | case AV_PIX_FMT_X2RGB10: | ||
| 1620 | case AV_PIX_FMT_BGRA: | ||
| 1621 | qf->surface.Data.B = qf->frame->data[0]; | ||
| 1622 | qf->surface.Data.G = qf->frame->data[0] + 1; | ||
| 1623 | qf->surface.Data.R = qf->frame->data[0] + 2; | ||
| 1624 | qf->surface.Data.A = qf->frame->data[0] + 3; | ||
| 1625 | break; | ||
| 1626 | |||
| 1619 | default: | 1627 | default: |
| 1620 | /* should not reach here */ | 1628 | /* should not reach here */ |
| 1621 | av_assert0(0); | 1629 | av_assert0(0); |
| @@ -304,6 +304,12 @@ const AVCodec ff_hevc_qsv_encoder = { · 303 unmodified lines | |||
| 304 | .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, | 304 | .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, |
| 305 | AV_PIX_FMT_P010, | 305 | AV_PIX_FMT_P010, |
| 306 | AV_PIX_FMT_QSV, | 306 | AV_PIX_FMT_QSV, |
| 307 | #if QSV_VERSION_ATLEAST(1, 17) | ||
| 308 | AV_PIX_FMT_BGRA, | ||
| 309 | #endif | ||
| 310 | #if QSV_VERSION_ATLEAST(1, 9) | ||
| 311 | AV_PIX_FMT_X2RGB10, | ||
| 312 | #endif | ||
| 307 | AV_PIX_FMT_NONE }, | 313 | AV_PIX_FMT_NONE }, |
| 308 | .priv_class = &class, | 314 | .priv_class = &class, |
| 309 | .defaults = qsv_enc_defaults, | 315 | .defaults = qsv_enc_defaults, |