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 | 189 | case MFX_FOURCC_NV12: return AV_PIX_FMT_NV12; |
| 190 | 190 | case MFX_FOURCC_P010: return AV_PIX_FMT_P010; |
| 191 | 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 | 198 | #if CONFIG_VAAPI |
| 193 | 199 | case MFX_FOURCC_YUY2: return AV_PIX_FMT_YUYV422; |
| 194 | 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 | 217 | case AV_PIX_FMT_P010: |
| 212 | 218 | *fourcc = MFX_FOURCC_P010; |
| 213 | 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 | 230 | #if CONFIG_VAAPI |
| 215 | 231 | case AV_PIX_FMT_YUV422P: |
| 216 | 232 | case AV_PIX_FMT_YUYV422: |
| @@ -1616,6 +1616,14 @@ static int submit_frame(QSVEncContext *q, const AVFrame *frame, · 1615 unmodified lines | ||
| 1616 | 1616 | qf->surface.Data.V = qf->surface.Data.UV + 2; |
| 1617 | 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 | 1627 | default: |
| 1620 | 1628 | /* should not reach here */ |
| 1621 | 1629 | av_assert0(0); |
| @@ -304,6 +304,12 @@ const AVCodec ff_hevc_qsv_encoder = { · 303 unmodified lines | ||
| 304 | 304 | .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, |
| 305 | 305 | AV_PIX_FMT_P010, |
| 306 | 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 | 313 | AV_PIX_FMT_NONE }, |
| 308 | 314 | .priv_class = &class, |
| 309 | 315 | .defaults = qsv_enc_defaults, |