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

Commit

Permalink
Fixed HEVCe interlace in sample_encode
Browse files Browse the repository at this point in the history
sample_encode h265 -i <yuv> -w 720 -h 480 -b 1500 -tff -extbrc:on

Signed-off-by: Dmitry Ermilov <[email protected]>
  • Loading branch information
dmitryermilov committed Apr 21, 2021
1 parent f547205 commit ac8ab30
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 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 @@ -2091,6 +2093,7 @@ mfxStatus CEncodingPipeline::ResetMFXComponents(sInputParams* pParams)
m_mfxEncParams.mfx.FrameInfo.CropH /= 2;
}

m_mfxEncParams.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_FIELD_TOP;
sts = m_pmfxENC->Init(&m_mfxEncParams);
if (MFX_WRN_PARTIAL_ACCELERATION == sts)
{
Expand Down Expand Up @@ -2297,6 +2300,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 +2320,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 +2497,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

0 comments on commit ac8ab30

Please sign in to comment.