Skip to content
This repository has been archived by the owner on May 17, 2023. It is now read-only.

Fixed HEVCe interlace in sample_encode #2669

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion samples/sample_encode/src/pipeline_encode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,9 @@ mfxStatus CEncodingPipeline::InitMfxEncParams(sInputParams *pInParams)
// frame info parameters
m_mfxEncParams.mfx.FrameInfo.FourCC = pInParams->EncodeFourCC;
m_mfxEncParams.mfx.FrameInfo.ChromaFormat = FourCCToChroma(pInParams->EncodeFourCC);
m_mfxEncParams.mfx.FrameInfo.PicStruct = pInParams->nPicStruct;
m_mfxEncParams.mfx.FrameInfo.PicStruct = pInParams->CodecId == MFX_CODEC_HEVC ?
pInParams->nPicStruct | MFX_PICSTRUCT_FIELD_SINGLE :
pInParams->nPicStruct;
m_mfxEncParams.mfx.FrameInfo.Shift = pInParams->shouldUseShifted10BitEnc;

// width must be a multiple of 16
Expand Down Expand Up @@ -2297,6 +2299,7 @@ mfxStatus CEncodingPipeline::VPPOneFrame(const ExtendedSurface& In, ExtendedSurf
}
return sts;
}

mfxStatus CEncodingPipeline::EncodeOneFrame(const ExtendedSurface& In, sTask*& pTask)
{
mfxStatus sts = MFX_ERR_NONE;
Expand All @@ -2316,6 +2319,13 @@ mfxStatus CEncodingPipeline::EncodeOneFrame(const ExtendedSurface& In, sTask*& p
sts = InitEncFrameParams(pTask);
MSDK_CHECK_STATUS(sts, "ENCODE: InitEncFrameParams failed");

if (In.pSurface && (In.pSurface->Info.PicStruct & MFX_PICSTRUCT_FIELD_SINGLE) && m_mfxEncParams.mfx.CodecId == MFX_CODEC_HEVC)
{
// If mfxFrameSurface1::mfxFrameInfo::PicStruct is zero for a particular surface
// then encode will internally use MFX_PICSTRUCT_FIELD_TOP or MFX_PICSTRUCT_FIELD_BOTTOM
// for that surface depending on initialization picture structure and expected field polarity
In.pSurface->Info.PicStruct = 0;
}
// at this point surface for encoder contains either a frame from file or a frame processed by vpp/preenc
sts = m_pmfxENC->EncodeFrameAsync(In.pCtrl, In.pSurface, &pTask->mfxBS, &pTask->EncSyncP);

Expand Down Expand Up @@ -2486,6 +2496,9 @@ mfxStatus CEncodingPipeline::Run()
bVppMultipleOutput = false; // reset the flag before a call to VPP

sts = VPPOneFrame(vppSurface, preencSurface, skipLoadingNextFrame);

skipLoadingNextFrame = false;

// process errors
if (MFX_ERR_MORE_DATA == sts)
{
Expand Down