Skip to content

Commit

Permalink
[Encode] Refactor AV1 Pipeline functions
Browse files Browse the repository at this point in the history
Refactor AV1 Pipeline: prepare() Execute() GetStatusReport() Destroy() ResetParams() UserFeatureReport() Uninitialize()
  • Loading branch information
Bossonor authored and intel-mediadev committed Jul 5, 2024
1 parent 33e1b82 commit 710fa9d
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 225 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,113 +69,6 @@ MOS_STATUS Av1VdencPipelineXe_M_Base::Init(void *settings)
return MOS_STATUS_SUCCESS;
}


MOS_STATUS Av1VdencPipelineXe_M_Base::Prepare(void *params)
{
ENCODE_FUNC_CALL();
ENCODE_CHK_NULL_RETURN(params);
EncoderParams *encodeParams = (EncoderParams *)params;

PCODEC_AV1_ENCODE_SEQUENCE_PARAMS av1SeqParams = static_cast<PCODEC_AV1_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams);
ENCODE_CHK_NULL_RETURN(av1SeqParams);

auto feature = dynamic_cast<Av1BasicFeature *>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);

feature->m_dualEncEnable = m_dualEncEnable;

ENCODE_CHK_STATUS_RETURN(Av1VdencPipeline::Prepare(params));

uint16_t numTileRows = 0;
uint16_t numTileColumns = 0;
RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns,
numTileRows, numTileColumns);

ENCODE_CHK_STATUS_RETURN(SwitchContext(feature->m_outputChromaFormat, numTileRows, numTileColumns));

EncoderStatusParameters inputParameters = {};

ENCODE_CHK_STATUS_RETURN(FillStatusReportParameters(&inputParameters, encodeParams));

ENCODE_CHK_STATUS_RETURN(m_statusReport->Init(&inputParameters));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::Execute()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(ActivateVdencVideoPackets());
ENCODE_CHK_STATUS_RETURN(ExecuteActivePackets());

ENCODE_CHK_STATUS_RETURN(ResetParams());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::GetStatusReport(void *status, uint16_t numStatus)
{
ENCODE_FUNC_CALL();
ENCODE_CHK_STATUS_RETURN(m_statusReport->GetReport(numStatus, status));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::Destroy()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(Uninitialize());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::ResetParams()
{
ENCODE_FUNC_CALL();

m_currRecycledBufIdx =
(m_currRecycledBufIdx + 1) % CODECHAL_ENCODE_RECYCLED_BUFFER_NUM;

if (m_currRecycledBufIdx == 0)
{
MOS_ZeroMemory(m_recycledBufStatusNum, sizeof(m_recycledBufStatusNum));
}

auto feature = dynamic_cast<EncodeBasicFeature*>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);

// Only update user features for first frame.
if (feature->m_frameNum == 0)
{
ENCODE_CHK_STATUS_RETURN(UserFeatureReport());
}

feature->m_frameNum++;

ENCODE_CHK_STATUS_RETURN(m_statusReport->Reset());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::UserFeatureReport()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(Av1VdencPipeline::UserFeatureReport());

#if (_DEBUG || _RELEASE_INTERNAL)
ReportUserSettingForDebug(
m_userSettingPtr,
"Enable Encode VE CtxBasedScheduling",
MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface),
MediaUserSetting::Group::Sequence);
#endif

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_M_Base::InitMmcState()
{
#ifdef _MMC_SUPPORTED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,8 @@ class Av1VdencPipelineXe_M_Base : public Av1VdencPipeline

virtual MOS_STATUS Init(void *settings) override;

virtual MOS_STATUS Prepare(void *params) override;

virtual MOS_STATUS Execute() override;

virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override;

virtual MOS_STATUS Destroy() override;

virtual MOS_STATUS InitMmcState() override;

protected:
virtual MOS_STATUS ResetParams();
virtual MOS_STATUS UserFeatureReport() override;
MEDIA_CLASS_DEFINE_END(encode__Av1VdencPipelineXe_M_Base)
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,37 +54,6 @@ MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::Init(void *settings)
return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::Prepare(void *params)
{
ENCODE_FUNC_CALL();
ENCODE_CHK_NULL_RETURN(params);
EncoderParams *encodeParams = (EncoderParams *)params;

PCODEC_AV1_ENCODE_SEQUENCE_PARAMS av1SeqParams = static_cast<PCODEC_AV1_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams);
ENCODE_CHK_NULL_RETURN(av1SeqParams);

auto feature = dynamic_cast<Av1BasicFeature *>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);

feature->m_dualEncEnable = m_dualEncEnable;

ENCODE_CHK_STATUS_RETURN(Av1VdencPipeline::Prepare(params));

uint16_t numTileRows = 0;
uint16_t numTileColumns = 0;
RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);

ENCODE_CHK_STATUS_RETURN(SwitchContext(feature->m_outputChromaFormat, numTileRows, numTileColumns));

EncoderStatusParameters inputParameters = {};

ENCODE_CHK_STATUS_RETURN(FillStatusReportParameters(&inputParameters, encodeParams));

ENCODE_CHK_STATUS_RETURN(m_statusReport->Init(&inputParameters));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::Execute()
{
ENCODE_FUNC_CALL();
Expand All @@ -108,27 +77,7 @@ MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::Execute()
}
}

ENCODE_CHK_STATUS_RETURN(ActivateVdencVideoPackets());
ENCODE_CHK_STATUS_RETURN(ExecuteActivePackets());

ENCODE_CHK_STATUS_RETURN(ResetParams());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::GetStatusReport(void *status, uint16_t numStatus)
{
ENCODE_FUNC_CALL();
m_statusReport->GetReport(numStatus, status);

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::Destroy()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(Uninitialize());
ENCODE_CHK_STATUS_RETURN(Av1VdencPipeline::Execute());

return MOS_STATUS_SUCCESS;
}
Expand All @@ -141,51 +90,6 @@ MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::CreateFeatureManager()
return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::ResetParams()
{
ENCODE_FUNC_CALL();

m_currRecycledBufIdx =
(m_currRecycledBufIdx + 1) % CODECHAL_ENCODE_RECYCLED_BUFFER_NUM;

if (m_currRecycledBufIdx == 0)
{
MOS_ZeroMemory(m_recycledBufStatusNum, sizeof(m_recycledBufStatusNum));
}

auto feature = dynamic_cast<EncodeBasicFeature *>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);

// Only update user features for first frame.
if (feature->m_frameNum == 0)
{
ENCODE_CHK_STATUS_RETURN(UserFeatureReport());
}

feature->m_frameNum++;

ENCODE_CHK_STATUS_RETURN(m_statusReport->Reset());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::UserFeatureReport()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(Av1VdencPipeline::UserFeatureReport());

#if (_DEBUG || _RELEASE_INTERNAL)
ReportUserSettingForDebug(
m_userSettingPtr,
"Enable Encode VE CtxBasedScheduling",
MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface),
MediaUserSetting::Group::Sequence);
#endif

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipelineXe_Lpm_Plus_Base::InitMmcState()
{
#ifdef _MMC_SUPPORTED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,22 +47,14 @@ class Av1VdencPipelineXe_Lpm_Plus_Base : public Av1VdencPipeline

virtual MOS_STATUS Init(void *settings) override;

virtual MOS_STATUS Prepare(void *params) override;

virtual MOS_STATUS Execute() override;

virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override;

virtual MOS_STATUS Destroy() override;

virtual MOS_STATUS InitMmcState() override;

protected:
std::shared_ptr<MediaSfcInterface> m_sfcItf = nullptr;

virtual MOS_STATUS CreateFeatureManager() override;
virtual MOS_STATUS ResetParams();
virtual MOS_STATUS UserFeatureReport() override;

MEDIA_CLASS_DEFINE_END(encode__Av1VdencPipelineXe_Lpm_Plus_Base)
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ MOS_STATUS Av1VdencPipeline::Initialize(void *settings)
return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipeline::Uninitialize()
MOS_STATUS Av1VdencPipeline::Destroy()
{
ENCODE_FUNC_CALL();

Expand All @@ -84,6 +84,12 @@ MOS_STATUS Av1VdencPipeline::UserFeatureReport()
"VDENC In Use",
1,
MediaUserSetting::Group::Sequence);

ReportUserSettingForDebug(
m_userSettingPtr,
"Enable Encode VE CtxBasedScheduling",
MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface),
MediaUserSetting::Group::Sequence);
#endif

return MOS_STATUS_SUCCESS;
Expand All @@ -100,8 +106,71 @@ MOS_STATUS Av1VdencPipeline::Prepare(void *params)
return MOS_STATUS_INVALID_PARAMETER;
}

auto feature = dynamic_cast<Av1BasicFeature *>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);
feature->m_dualEncEnable = m_dualEncEnable;

ENCODE_CHK_STATUS_RETURN(Av1Pipeline::Prepare(params));

uint16_t numTileRows = 0;
uint16_t numTileColumns = 0;
RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);

ENCODE_CHK_STATUS_RETURN(SwitchContext(feature->m_outputChromaFormat, numTileRows, numTileColumns));

EncoderStatusParameters inputParameters = {};

ENCODE_CHK_STATUS_RETURN(FillStatusReportParameters(&inputParameters, encodeParams));

ENCODE_CHK_STATUS_RETURN(m_statusReport->Init(&inputParameters));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipeline::ResetParams()
{
ENCODE_FUNC_CALL();

m_currRecycledBufIdx = (m_currRecycledBufIdx + 1) % CODECHAL_ENCODE_RECYCLED_BUFFER_NUM;

if (m_currRecycledBufIdx == 0)
{
MOS_ZeroMemory(m_recycledBufStatusNum, sizeof(m_recycledBufStatusNum));
}

auto feature = dynamic_cast<EncodeBasicFeature*>(m_featureManager->GetFeature(Av1FeatureIDs::basicFeature));
ENCODE_CHK_NULL_RETURN(feature);

// Only update user features for first frame.
if (feature->m_frameNum == 0)
{
ENCODE_CHK_STATUS_RETURN(UserFeatureReport());
}

feature->m_frameNum++;

ENCODE_CHK_STATUS_RETURN(m_statusReport->Reset());

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipeline::GetStatusReport(void *status, uint16_t numStatus)
{
ENCODE_FUNC_CALL();
ENCODE_CHK_STATUS_RETURN(m_statusReport->GetReport(numStatus, status));

return MOS_STATUS_SUCCESS;
}

MOS_STATUS Av1VdencPipeline::Execute()
{
ENCODE_FUNC_CALL();

ENCODE_CHK_STATUS_RETURN(ActivateVdencVideoPackets());
ENCODE_CHK_STATUS_RETURN(ExecuteActivePackets());

ENCODE_CHK_STATUS_RETURN(ResetParams());

return MOS_STATUS_SUCCESS;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,20 @@ class Av1VdencPipeline : public encode::Av1Pipeline
virtual ~Av1VdencPipeline() {}

virtual MOS_STATUS Prepare(void *params) override;
virtual MOS_STATUS Execute() override;
virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override;
virtual MOS_STATUS Destroy() override;

protected:
virtual MOS_STATUS Initialize(void *settings) override;
virtual MOS_STATUS Uninitialize() override;
virtual MOS_STATUS UserFeatureReport() override;
virtual MOS_STATUS ActivateVdencVideoPackets();
virtual MOS_STATUS CreateFeatureManager() override;
virtual MOS_STATUS SwitchContext(uint8_t outputChromaFormat, uint16_t numTileRows, uint16_t numTileColumns);
virtual MOS_STATUS InitMmcState() = 0;
virtual MOS_STATUS FillStatusReportParameters(EncoderStatusParameters* pPar, EncoderParams* pEncPar);
virtual MOS_STATUS HuCCheckAndInit();
virtual MOS_STATUS ResetParams();

bool m_preEncEnabled = false;

Expand Down

0 comments on commit 710fa9d

Please sign in to comment.