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

Commit 9593789

Browse files
committed
Fixed HEVCe interlace in sample_encode
sample_encode h265 -i <yuv> -w 720 -h 480 -b 1500 -tff -extbrc:on Signed-off-by: Dmitry Ermilov <dmitry.ermilov@intel.com>
1 parent f547205 commit 9593789

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

samples/sample_encode/src/pipeline_encode.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,9 @@ mfxStatus CEncodingPipeline::InitMfxEncParams(sInputParams *pInParams)
553553
// frame info parameters
554554
m_mfxEncParams.mfx.FrameInfo.FourCC = pInParams->EncodeFourCC;
555555
m_mfxEncParams.mfx.FrameInfo.ChromaFormat = FourCCToChroma(pInParams->EncodeFourCC);
556-
m_mfxEncParams.mfx.FrameInfo.PicStruct = pInParams->nPicStruct;
556+
m_mfxEncParams.mfx.FrameInfo.PicStruct = pInParams->CodecId == MFX_CODEC_HEVC ?
557+
pInParams->nPicStruct | MFX_PICSTRUCT_FIELD_SINGLE :
558+
pInParams->nPicStruct;
557559
m_mfxEncParams.mfx.FrameInfo.Shift = pInParams->shouldUseShifted10BitEnc;
558560

559561
// width must be a multiple of 16
@@ -2297,6 +2299,7 @@ mfxStatus CEncodingPipeline::VPPOneFrame(const ExtendedSurface& In, ExtendedSurf
22972299
}
22982300
return sts;
22992301
}
2302+
23002303
mfxStatus CEncodingPipeline::EncodeOneFrame(const ExtendedSurface& In, sTask*& pTask)
23012304
{
23022305
mfxStatus sts = MFX_ERR_NONE;
@@ -2316,6 +2319,13 @@ mfxStatus CEncodingPipeline::EncodeOneFrame(const ExtendedSurface& In, sTask*& p
23162319
sts = InitEncFrameParams(pTask);
23172320
MSDK_CHECK_STATUS(sts, "ENCODE: InitEncFrameParams failed");
23182321

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

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

24882498
sts = VPPOneFrame(vppSurface, preencSurface, skipLoadingNextFrame);
2499+
2500+
skipLoadingNextFrame = false;
2501+
24892502
// process errors
24902503
if (MFX_ERR_MORE_DATA == sts)
24912504
{

0 commit comments

Comments
 (0)