diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c index 59b17adac99..0d0c33940bb 100644 --- a/src/gallium/drivers/radeonsi/si_get.c +++ b/src/gallium/drivers/radeonsi/si_get.c @@ -982,6 +982,11 @@ static int si_get_video_param(struct pipe_screen *screen, enum pipe_video_profil } case PIPE_VIDEO_CAP_SUPPORTS_CONTIGUOUS_PLANES_MAP: return true; + case PIPE_VIDEO_CAP_ROI_CROP_DEC: + if (codec == PIPE_VIDEO_FORMAT_JPEG && + sscreen->info.vcn_ip_version == VCN_4_0_3) + return true; + return false; default: return 0; } diff --git a/src/gallium/frontends/va/config.c b/src/gallium/frontends/va/config.c index 26328be4e3c..9abf9af832b 100644 --- a/src/gallium/frontends/va/config.c +++ b/src/gallium/frontends/va/config.c @@ -221,6 +221,23 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en PIPE_VIDEO_CAP_MAX_HEIGHT); value = value ? value : VA_ATTRIB_NOT_SUPPORTED; } break; +#if VA_CHECK_VERSION(1, 21, 0) + case VAConfigAttribDecJPEG: + { + VAConfigAttribValDecJPEG attr_jpeg = { .value = 0 }; + /* Check if ROI Decode is supported */ + int supportsCropDec = + pscreen->get_video_param(pscreen, ProfileToPipe(profile), + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_CAP_ROI_CROP_DEC); + if (supportsCropDec <= 0) + value = VA_ATTRIB_NOT_SUPPORTED; + else { + attr_jpeg.bits.crop = 1; + value = attr_jpeg.value; + } + } break; +#endif default: value = VA_ATTRIB_NOT_SUPPORTED; break; diff --git a/src/gallium/frontends/va/picture_mjpeg.c b/src/gallium/frontends/va/picture_mjpeg.c index 09c6fb9bb0e..e8aeca98de0 100644 --- a/src/gallium/frontends/va/picture_mjpeg.c +++ b/src/gallium/frontends/va/picture_mjpeg.c @@ -57,10 +57,17 @@ void vlVaHandlePictureParameterBufferMJPEG(vlVaDriver *drv, vlVaContext *context context->desc.mjpeg.picture_parameter.num_components = mjpeg->num_components; +#if VA_CHECK_VERSION(1, 21, 0) + context->desc.mjpeg.picture_parameter.crop_x = mjpeg->crop_rectangle.x; + context->desc.mjpeg.picture_parameter.crop_y = mjpeg->crop_rectangle.y; + context->desc.mjpeg.picture_parameter.crop_width = mjpeg->crop_rectangle.width; + context->desc.mjpeg.picture_parameter.crop_height = mjpeg->crop_rectangle.height; +#else context->desc.mjpeg.picture_parameter.crop_x = mjpeg->va_reserved[0] & 0xffff; context->desc.mjpeg.picture_parameter.crop_y = (mjpeg->va_reserved[0] >> 16) & 0xffff; context->desc.mjpeg.picture_parameter.crop_width = mjpeg->va_reserved[1] & 0xffff; context->desc.mjpeg.picture_parameter.crop_height = (mjpeg->va_reserved[1] >> 16) & 0xffff; +#endif } diff --git a/src/gallium/include/pipe/p_video_enums.h b/src/gallium/include/pipe/p_video_enums.h index 0132a742fc2..cfc1f74e6f6 100644 --- a/src/gallium/include/pipe/p_video_enums.h +++ b/src/gallium/include/pipe/p_video_enums.h @@ -153,6 +153,10 @@ enum pipe_video_cap */ PIPE_VIDEO_CAP_ENC_INTRA_REFRESH_MAX_DURATION = 46, PIPE_VIDEO_CAP_ENC_H264_SUPPORTS_CABAC_ENCODE = 47, + /* + crop and partial decode support + */ + PIPE_VIDEO_CAP_ROI_CROP_DEC = 48, }; enum pipe_video_h264_enc_dbk_filter_mode_flags