+ if (vpp->transpose >= 0) {
+#ifdef QSV_HAVE_ROTATION
+ switch (vpp->transpose) {
+ case TRANSPOSE_CCLOCK_FLIP:
+ vpp->rotate = MFX_ANGLE_270;
+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
+ break;
+ case TRANSPOSE_CLOCK:
+ vpp->rotate = MFX_ANGLE_90;
+ vpp->hflip = MFX_MIRRORING_DISABLED;
+ break;
+ case TRANSPOSE_CCLOCK:
+ vpp->rotate = MFX_ANGLE_270;
+ vpp->hflip = MFX_MIRRORING_DISABLED;
+ break;
+ case TRANSPOSE_CLOCK_FLIP:
+ vpp->rotate = MFX_ANGLE_90;
+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
+ break;
+ case TRANSPOSE_REVERSAL:
+ vpp->rotate = MFX_ANGLE_180;
+ vpp->hflip = MFX_MIRRORING_DISABLED;
+ break;
+ case TRANSPOSE_HFLIP:
+ vpp->rotate = MFX_ANGLE_0;
+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
+ break;
+ case TRANSPOSE_VFLIP:
+ vpp->rotate = MFX_ANGLE_180;
+ vpp->hflip = MFX_MIRRORING_HORIZONTAL;
+ break;
+ default:
+ av_log(ctx, AV_LOG_ERROR, "Failed to set transpose mode to %d.\n", vpp->transpose);
+ return AVERROR(EINVAL);
+ }
+#else
+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP transpose option is "
+ "not supported with this MSDK version.\n");
+ vpp->transpose = 0;
+#endif
+ }
+
+ if (vpp->rotate) {
+#ifdef QSV_HAVE_ROTATION
+ memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation));
+ vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION;
+ vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation);
+ vpp->rotation_conf.Angle = vpp->rotate;
+
+ if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) {
+ FFSWAP(int, vpp->out_width, vpp->out_height);
+ FFSWAP(int, outlink->w, outlink->h);
+ av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n");
+ }
+
+ param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf;
+#else
+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is "
+ "not supported with this MSDK version.\n");
+ vpp->rotate = 0;
+#endif
+ }
+
+ if (vpp->hflip) {
+#ifdef QSV_HAVE_MIRRORING
+ memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring));
+ vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING;
+ vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring);
+ vpp->mirroring_conf.Type = vpp->hflip;
+
+ param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf;
+#else
+ av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is "
+ "not supported with this MSDK version.\n");
+ vpp->hflip = 0;
+#endif
+ }
+