mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 00:10:20 +01:00
frontends/va: add intra-refresh in VAAPI interface
Row and column modes are enabled, not the mixed mode, application should have a logic of sending a period of intra-refresh sequence to complete the intra-refresh cycle. Reviewed-by: Sil Vilerino <sivileri@microsoft.com> Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com> Signed-off-by: Ruijing Dong <ruijing.dong@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26133>
This commit is contained in:
parent
7fae1c46ad
commit
8e03c18914
5 changed files with 80 additions and 0 deletions
|
|
@ -516,6 +516,17 @@ vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint en
|
|||
value = max_tile_cols;
|
||||
} break;
|
||||
#endif
|
||||
case VAConfigAttribEncIntraRefresh:
|
||||
{
|
||||
int ir_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
|
||||
PIPE_VIDEO_ENTRYPOINT_ENCODE,
|
||||
PIPE_VIDEO_CAP_ENC_INTRA_REFRESH);
|
||||
if (ir_support <= 0)
|
||||
value = VA_ATTRIB_NOT_SUPPORTED;
|
||||
else
|
||||
value = ir_support;
|
||||
} break;
|
||||
|
||||
default:
|
||||
value = VA_ATTRIB_NOT_SUPPORTED;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -643,6 +643,59 @@ handleVAEncMiscParameterTypeHRD(vlVaContext *context, VAEncMiscParameterBuffer *
|
|||
return status;
|
||||
}
|
||||
|
||||
static VAStatus
|
||||
handleVAEncMiscParameterTypeRIR(vlVaContext *context, VAEncMiscParameterBuffer *misc)
|
||||
{
|
||||
VAStatus status = VA_STATUS_SUCCESS;
|
||||
struct pipe_enc_intra_refresh *p_intra_refresh = NULL;
|
||||
|
||||
switch (u_reduce_video_profile(context->templat.profile)) {
|
||||
case PIPE_VIDEO_FORMAT_MPEG4_AVC:
|
||||
p_intra_refresh = &context->desc.h264enc.intra_refresh;
|
||||
break;
|
||||
case PIPE_VIDEO_FORMAT_HEVC:
|
||||
p_intra_refresh = &context->desc.h265enc.intra_refresh;
|
||||
break;
|
||||
#if VA_CHECK_VERSION(1, 16, 0)
|
||||
case PIPE_VIDEO_FORMAT_AV1:
|
||||
p_intra_refresh = &context->desc.av1enc.intra_refresh;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
p_intra_refresh = NULL;
|
||||
break;
|
||||
};
|
||||
|
||||
if (p_intra_refresh) {
|
||||
VAEncMiscParameterRIR *ir = (VAEncMiscParameterRIR *)misc->data;
|
||||
|
||||
if (ir->rir_flags.value == VA_ENC_INTRA_REFRESH_ROLLING_ROW)
|
||||
p_intra_refresh->mode = INTRA_REFRESH_MODE_UNIT_ROWS;
|
||||
else if (ir->rir_flags.value == VA_ENC_INTRA_REFRESH_ROLLING_COLUMN)
|
||||
p_intra_refresh->mode = INTRA_REFRESH_MODE_UNIT_COLUMNS;
|
||||
else if (ir->rir_flags.value) /* if any other values to use the default one*/
|
||||
p_intra_refresh->mode = INTRA_REFRESH_MODE_UNIT_COLUMNS;
|
||||
else /* if no mode specified then no intra-refresh */
|
||||
p_intra_refresh->mode = INTRA_REFRESH_MODE_NONE;
|
||||
|
||||
/* intra refresh should be started with sequence level headers */
|
||||
p_intra_refresh->need_sequence_header = 0;
|
||||
if (p_intra_refresh->mode) {
|
||||
p_intra_refresh->region_size = ir->intra_insert_size;
|
||||
p_intra_refresh->offset = ir->intra_insertion_location;
|
||||
if (p_intra_refresh->offset == 0)
|
||||
p_intra_refresh->need_sequence_header = 1;
|
||||
}
|
||||
} else {
|
||||
p_intra_refresh->mode = INTRA_REFRESH_MODE_NONE;
|
||||
p_intra_refresh->region_size = 0;
|
||||
p_intra_refresh->offset = 0;
|
||||
p_intra_refresh->need_sequence_header = 0;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static VAStatus
|
||||
handleVAEncMiscParameterBufferType(vlVaContext *context, vlVaBuffer *buf)
|
||||
{
|
||||
|
|
@ -675,6 +728,10 @@ handleVAEncMiscParameterBufferType(vlVaContext *context, vlVaBuffer *buf)
|
|||
vaStatus = handleVAEncMiscParameterTypeHRD(context, misc);
|
||||
break;
|
||||
|
||||
case VAEncMiscParameterTypeRIR:
|
||||
vaStatus = handleVAEncMiscParameterTypeRIR(context, misc);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -111,6 +111,10 @@ VAStatus vlVaHandleVAEncSequenceParameterBufferTypeAV1(vlVaDriver *drv, vlVaCont
|
|||
return VA_STATUS_ERROR_ALLOCATION_FAILED;
|
||||
|
||||
getEncParamPresetAV1(context);
|
||||
context->desc.av1enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
|
||||
context->desc.av1enc.intra_refresh.offset = 0;
|
||||
context->desc.av1enc.intra_refresh.region_size = 0;
|
||||
context->desc.av1enc.intra_refresh.need_sequence_header = 0;
|
||||
}
|
||||
|
||||
context->desc.av1enc.seq.tier = av1->seq_tier;
|
||||
|
|
|
|||
|
|
@ -201,6 +201,10 @@ vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver *drv, vlVaContext *con
|
|||
context->desc.h264enc.rate_ctrl[0].max_qp = 51;
|
||||
context->desc.h264enc.rate_ctrl[0].min_qp = 0;
|
||||
context->desc.h264enc.enable_vui = false;
|
||||
context->desc.h264enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
|
||||
context->desc.h264enc.intra_refresh.offset = 0;
|
||||
context->desc.h264enc.intra_refresh.region_size = 0;
|
||||
context->desc.h264enc.intra_refresh.need_sequence_header = 0;
|
||||
}
|
||||
|
||||
context->desc.h264enc.intra_idr_period =
|
||||
|
|
|
|||
|
|
@ -173,6 +173,10 @@ vlVaHandleVAEncSequenceParameterBufferTypeHEVC(vlVaDriver *drv, vlVaContext *con
|
|||
context->desc.h265enc.rc.enforce_hrd = 1;
|
||||
context->desc.h265enc.rc.max_qp = 51;
|
||||
context->desc.h265enc.rc.min_qp = 0;
|
||||
context->desc.h265enc.intra_refresh.mode = INTRA_REFRESH_MODE_NONE;
|
||||
context->desc.h265enc.intra_refresh.offset = 0;
|
||||
context->desc.h265enc.intra_refresh.region_size = 0;
|
||||
context->desc.h265enc.intra_refresh.need_sequence_header = 0;
|
||||
}
|
||||
|
||||
context->desc.h265enc.seq.general_profile_idc = h265->general_profile_idc;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue