Skip to content

Commit 57c79bb

Browse files
huige0901gfxVPLsdm
authored andcommitted
[Encode] Support negative QP for AVC
1 parent c65990e commit 57c79bb

File tree

3 files changed

+27
-18
lines changed

3 files changed

+27
-18
lines changed

_studio/mfx_lib/encode_hw/h264/include/mfx_h264_encode_hw_utils.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ namespace MfxHwH264Encode
260260
}
261261

262262
typedef Pair<mfxU8> PairU8;
263+
typedef Pair<mfxI8> PairI8;
263264
typedef Pair<mfxU16> PairU16;
264265
typedef Pair<mfxU32> PairU32;
265266
typedef Pair<mfxI32> PairI32;
@@ -1250,7 +1251,7 @@ namespace MfxHwH264Encode
12501251
mfxU32 m_idxReconOffset; // offset for multi-view coding
12511252
mfxU16 m_idrPicId;
12521253
PairU8 m_subMbPartitionAllowed;
1253-
PairU8 m_cqpValue;
1254+
PairI8 m_cqpValue;
12541255
PairU8 m_insertAud;
12551256
PairU8 m_insertSps;
12561257
PairU8 m_insertPps;

_studio/mfx_lib/encode_hw/h264/src/mfx_h264_enc_common_hw.cpp

+21-15
Original file line numberDiff line numberDiff line change
@@ -2321,9 +2321,11 @@ mfxStatus MfxHwH264Encode::CheckVideoParamQueryLike(
23212321
if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP
23222322
&& par.calcParam.cqpHrdMode == 0)
23232323
{
2324-
if (!CheckRange(par.mfx.QPI, 10, 51)) changed = true;
2325-
if (!CheckRange(par.mfx.QPP, 10, 51)) changed = true;
2326-
if (!CheckRange(par.mfx.QPB, 10, 51)) changed = true;
2324+
mfxU8 minQP = 10;
2325+
mfxU8 maxQP = 51;
2326+
if (!CheckRange(par.mfx.QPI, minQP, maxQP)) changed = true;
2327+
if (!CheckRange(par.mfx.QPP, minQP, maxQP)) changed = true;
2328+
if (!CheckRange(par.mfx.QPB, minQP, maxQP)) changed = true;
23272329
}
23282330
}
23292331

@@ -3902,9 +3904,11 @@ mfxStatus MfxHwH264Encode::CheckVideoParamQueryLike(
39023904
if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP
39033905
&& par.calcParam.cqpHrdMode == 0)
39043906
{
3905-
if (!CheckRange(par.mfx.QPI, 0, 51)) changed = true;
3906-
if (!CheckRange(par.mfx.QPP, 0, 51)) changed = true;
3907-
if (!CheckRange(par.mfx.QPB, 0, 51)) changed = true;
3907+
mfxU8 maxQP = 51;
3908+
mfxU8 minQP = 0;
3909+
if (!CheckRange(par.mfx.QPI, minQP, maxQP)) changed = true;
3910+
if (!CheckRange(par.mfx.QPP, minQP, maxQP)) changed = true;
3911+
if (!CheckRange(par.mfx.QPB, minQP, maxQP)) changed = true;
39083912
}
39093913

39103914
if (par.mfx.RateControlMethod == MFX_RATECONTROL_CBR &&
@@ -4038,8 +4042,6 @@ mfxStatus MfxHwH264Encode::CheckVideoParamQueryLike(
40384042
//Check of weightedPredFlag is actually not needed, as it was read from 1 bit in extBits->PPSBuffer
40394043
extPps->weightedPredFlag > 1 ||
40404044
extPps->weightedBipredIdc > 2 ||
4041-
extPps->picInitQpMinus26 < -26 ||
4042-
extPps->picInitQpMinus26 > 25 ||
40434045
extPps->picInitQsMinus26 != 0 ||
40444046
extPps->chromaQpIndexOffset < -12 ||
40454047
extPps->chromaQpIndexOffset > 12 ||
@@ -4724,12 +4726,15 @@ mfxStatus MfxHwH264Encode::CheckVideoParamQueryLike(
47244726
|| extOpt2->MinQPP || extOpt2->MaxQPP
47254727
|| extOpt2->MinQPB || extOpt2->MaxQPB)
47264728
{
4727-
if (!CheckRangeDflt(extOpt2->MaxQPI, 0, 51, 0)) changed = true;
4728-
if (!CheckRangeDflt(extOpt2->MaxQPP, 0, 51, 0)) changed = true;
4729-
if (!CheckRangeDflt(extOpt2->MaxQPB, 0, 51, 0)) changed = true;
4730-
if (!CheckRangeDflt(extOpt2->MinQPI, 0, (extOpt2->MaxQPI ? extOpt2->MaxQPI : 51), 0)) changed = true;
4731-
if (!CheckRangeDflt(extOpt2->MinQPP, 0, (extOpt2->MaxQPP ? extOpt2->MaxQPP : 51), 0)) changed = true;
4732-
if (!CheckRangeDflt(extOpt2->MinQPB, 0, (extOpt2->MaxQPB ? extOpt2->MaxQPB : 51), 0)) changed = true;
4729+
mfxU8 maxQP = 51;
4730+
mfxU8 minQP = 0;
4731+
mfxU8 deflt = 0;
4732+
if (!CheckRangeDflt(extOpt2->MaxQPI, minQP, maxQP, deflt)) changed = true;
4733+
if (!CheckRangeDflt(extOpt2->MaxQPP, minQP, maxQP, deflt)) changed = true;
4734+
if (!CheckRangeDflt(extOpt2->MaxQPB, minQP, maxQP, deflt)) changed = true;
4735+
if (!CheckRangeDflt(extOpt2->MinQPI, minQP, (extOpt2->MaxQPI ? extOpt2->MaxQPI : maxQP), deflt)) changed = true;
4736+
if (!CheckRangeDflt(extOpt2->MinQPP, minQP, (extOpt2->MaxQPP ? extOpt2->MaxQPP : maxQP), deflt)) changed = true;
4737+
if (!CheckRangeDflt(extOpt2->MinQPB, minQP, (extOpt2->MaxQPB ? extOpt2->MaxQPB : maxQP), deflt)) changed = true;
47334738
}
47344739

47354740
if (!CheckTriStateOption(extOpt3->BRCPanicMode)) changed = true;
@@ -9786,7 +9791,8 @@ mfxU32 HeaderPacker::WriteSlice(
97869791
}
97879792
if (pps.entropyCodingModeFlag && sliceType != SLICE_TYPE_I)
97889793
obs.PutUe(m_cabacInitIdc);
9789-
obs.PutSe(task.m_cqpValue[fieldId] - (pps.picInitQpMinus26 + 26));
9794+
mfxI8 sliceDeltaQp = task.m_cqpValue[fieldId] - (pps.picInitQpMinus26 + 26);
9795+
obs.PutSe(sliceDeltaQp);
97909796
if (pps.deblockingFilterControlPresentFlag)
97919797
{
97929798
mfxU32 disableDeblockingFilterIdc = task.m_disableDeblockingIdc[fieldId][sliceId];

_studio/mfx_lib/encode_hw/h264/src/mfx_h264_encode_hw_utils.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,10 @@ namespace MfxHwH264Encode
329329
{
330330
const mfxExtCodingOption2& CO2 = GetExtBufferRef(par);
331331
const mfxExtCodingOption3& CO3 = GetExtBufferRef(par);
332-
const mfxU8 minQP = 1;
333-
const mfxU8 maxQP = 51;
332+
mfxI8 tempMin = 1;
333+
mfxI8 tempMax = 51;
334+
const mfxI8 minQP = tempMin;
335+
const mfxI8 maxQP = tempMax;
334336
mfxU8 QP = 0;
335337

336338
if (par.mfx.RateControlMethod == MFX_RATECONTROL_CQP /*||

0 commit comments

Comments
 (0)