mirror of
https://github.com/ultravideo/uvg266.git
synced 2024-11-27 11:24:05 +00:00
[DepQuant] WIP: dequant
This commit is contained in:
parent
3e66a897d4
commit
f8994a7fae
|
@ -1096,7 +1096,7 @@ static void xDecideAndUpdate(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t uvg_dep_quant(
|
int uvg_dep_quant(
|
||||||
const encoder_state_t* const state,
|
const encoder_state_t* const state,
|
||||||
const cu_info_t* const cur_tu,
|
const cu_info_t* const cur_tu,
|
||||||
const cu_loc_t* const cu_loc,
|
const cu_loc_t* const cu_loc,
|
||||||
|
@ -1104,8 +1104,7 @@ uint8_t uvg_dep_quant(
|
||||||
coeff_t* coeff_out,
|
coeff_t* coeff_out,
|
||||||
const color_t compID,
|
const color_t compID,
|
||||||
enum uvg_tree_type tree_type,
|
enum uvg_tree_type tree_type,
|
||||||
const double lambda,
|
int* absSum,
|
||||||
coeff_t* absSum,
|
|
||||||
const bool enableScalingLists)
|
const bool enableScalingLists)
|
||||||
{
|
{
|
||||||
const encoder_control_t* const encoder = state->encoder_control;
|
const encoder_control_t* const encoder = state->encoder_control;
|
||||||
|
@ -1285,6 +1284,83 @@ uint8_t uvg_dep_quant(
|
||||||
decision = dep_quant_context.m_trellis[scanIdx][decision.prevId];
|
decision = dep_quant_context.m_trellis[scanIdx][decision.prevId];
|
||||||
int32_t blkpos = scan[scanIdx];
|
int32_t blkpos = scan[scanIdx];
|
||||||
coeff_out[blkpos] = (srcCoeff[blkpos] < 0 ? -decision.absLevel : decision.absLevel);
|
coeff_out[blkpos] = (srcCoeff[blkpos] < 0 ? -decision.absLevel : decision.absLevel);
|
||||||
absSum += decision.absLevel;
|
*absSum += decision.absLevel;
|
||||||
|
}
|
||||||
|
return *absSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void uvg_dep_quant_dequant(
|
||||||
|
const encoder_state_t* const state,
|
||||||
|
const cu_info_t* const cur_tu,
|
||||||
|
const cu_loc_t* const cu_loc,
|
||||||
|
const color_t compID,
|
||||||
|
coeff_t* quant_coeff,
|
||||||
|
coeff_t * coeff,
|
||||||
|
bool enableScalingLists)
|
||||||
|
{
|
||||||
|
const encoder_control_t* const encoder = state->encoder_control;
|
||||||
|
const uint32_t width = compID == COLOR_Y ? cu_loc->width : cu_loc->chroma_width;
|
||||||
|
const uint32_t height = compID == COLOR_Y ? cu_loc->height : cu_loc->chroma_height;
|
||||||
|
|
||||||
|
const int numCoeff = width * height;
|
||||||
|
|
||||||
|
const uint32_t log2_tr_width = uvg_g_convert_to_log2[width];
|
||||||
|
const uint32_t log2_tr_height = uvg_g_convert_to_log2[height];
|
||||||
|
const uint32_t* const scan = uvg_get_scan_order_table(SCAN_GROUP_4X4, 0, log2_tr_width, log2_tr_height);
|
||||||
|
bool needs_block_size_trafo_scale =((log2_tr_height + log2_tr_width) % 2 == 1);
|
||||||
|
needs_block_size_trafo_scale |= 0; // Non log2 block size
|
||||||
|
|
||||||
|
//----- reset coefficients and get last scan index -----
|
||||||
|
memset(coeff, 0, numCoeff * sizeof(coeff_t));
|
||||||
|
int lastScanIdx = -1;
|
||||||
|
for (int scanIdx = numCoeff - 1; scanIdx >= 0; scanIdx--)
|
||||||
|
{
|
||||||
|
if (quant_coeff[scan[scanIdx]])
|
||||||
|
{
|
||||||
|
lastScanIdx = scanIdx;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (lastScanIdx < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----- set dequant parameters -----
|
||||||
|
const int qpDQ = uvg_get_scaled_qp(compID, state->qp, (encoder->bitdepth - 8) * 6, encoder->qp_map[0]); + 1;
|
||||||
|
const int qpPer = qpDQ / 6;
|
||||||
|
const int qpRem = qpDQ - 6 * qpPer;
|
||||||
|
const int channelBitDepth = encoder->bitdepth;
|
||||||
|
const int maxLog2TrDynamicRange = MAX_TR_DYNAMIC_RANGE;
|
||||||
|
const coeff_t minTCoeff = -(1 << maxLog2TrDynamicRange);
|
||||||
|
const coeff_t maxTCoeff = (1 << maxLog2TrDynamicRange) - 1;
|
||||||
|
const int transformShift = MAX_TR_DYNAMIC_RANGE - encoder->bitdepth - ((log2_tr_height + log2_tr_width) >> 1) - needs_block_size_trafo_scale;
|
||||||
|
int shift = IQUANT_SHIFT + 1 - qpPer - transformShift + (enableScalingLists ? 4 : 0);
|
||||||
|
int invQScale = uvg_g_inv_quant_scales[needs_block_size_trafo_scale ? 1 : 0][qpRem];
|
||||||
|
int add = (shift < 0) ? 0 : ((1 << shift) >> 1);
|
||||||
|
int32_t scalinglist_type = (cur_tu->type == CU_INTRA ? 0 : 3) + (int8_t)(compID);
|
||||||
|
|
||||||
|
const int32_t* dequant_coef = encoder->scaling_list.de_quant_coeff[log2_tr_width][log2_tr_height][scalinglist_type][qpDQ % 6];
|
||||||
|
//----- dequant coefficients -----
|
||||||
|
for (int state = 0, scanIdx = lastScanIdx; scanIdx >= 0; scanIdx--)
|
||||||
|
{
|
||||||
|
const unsigned rasterPos = scan[scanIdx];
|
||||||
|
const coeff_t level = quant_coeff[rasterPos];
|
||||||
|
if (level)
|
||||||
|
{
|
||||||
|
if (enableScalingLists)
|
||||||
|
{
|
||||||
|
invQScale = dequant_coef[rasterPos];//scalingfactor*levelScale
|
||||||
|
}
|
||||||
|
if (shift < 0 && (enableScalingLists || scanIdx == lastScanIdx))
|
||||||
|
{
|
||||||
|
invQScale <<= -shift;
|
||||||
|
}
|
||||||
|
int qIdx = (level << 1) + (level > 0 ? -(state >> 1) : (state >> 1));
|
||||||
|
int64_t nomTCoeff = ((int64_t)qIdx * (int64_t)invQScale + add) >> ((shift < 0) ? 0 : shift);
|
||||||
|
coeff[rasterPos] = (coeff_t)CLIP(minTCoeff, maxTCoeff, nomTCoeff);
|
||||||
|
}
|
||||||
|
state = (32040 >> ((state << 2) + ((level & 1) << 1))) & 3; // the 16-bit value "32040" represent the state transition table
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#ifndef DEP_QUANT_H_
|
#ifndef DEP_QUANT_H_
|
||||||
#define DEP_QUANT_H_
|
#define DEP_QUANT_H_
|
||||||
|
|
||||||
|
#include "cu.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
|
||||||
typedef struct encoder_control_t encoder_control_t;
|
typedef struct encoder_control_t encoder_control_t;
|
||||||
|
@ -53,4 +54,24 @@ typedef struct
|
||||||
int uvg_init_nb_info(encoder_control_t* encoder);
|
int uvg_init_nb_info(encoder_control_t* encoder);
|
||||||
void uvg_dealloc_nb_info(encoder_control_t* encoder);
|
void uvg_dealloc_nb_info(encoder_control_t* encoder);
|
||||||
|
|
||||||
|
|
||||||
|
void uvg_dep_quant_dequant(
|
||||||
|
const encoder_state_t* const state,
|
||||||
|
const cu_info_t* const cur_tu,
|
||||||
|
const cu_loc_t* const cu_loc,
|
||||||
|
const color_t compID,
|
||||||
|
coeff_t* quant_coeff,
|
||||||
|
coeff_t* coeff,
|
||||||
|
bool enableScalingLists);
|
||||||
|
|
||||||
|
int uvg_dep_quant(
|
||||||
|
const encoder_state_t* const state,
|
||||||
|
const cu_info_t* const cur_tu,
|
||||||
|
const cu_loc_t* const cu_loc,
|
||||||
|
const coeff_t* srcCoeff,
|
||||||
|
coeff_t* coeff_out,
|
||||||
|
const color_t compID,
|
||||||
|
enum uvg_tree_type tree_type,
|
||||||
|
int* absSum,
|
||||||
|
const bool enableScalingLists);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue