summaryrefslogtreecommitdiff
path: root/gpr/source/lib/vc5_decoder/dequantize.c
blob: 48cfb647185baacdadf48bedc5567b2c092ad04d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*! @file dequantize.c
 *
 *  @brief Implementation of inverse quantization functions
 *
 *  @version 1.0.0
 *
 *  (C) Copyright 2018 GoPro Inc (http://gopro.com/).
 *
 *  Licensed under either:
 *  - Apache License, Version 2.0, http://www.apache.org/licenses/LICENSE-2.0
 *  - MIT license, http://opensource.org/licenses/MIT
 *  at your option.
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#include "headers.h"

// Not using midpoint correction in dequantization
static const int midpoint = 0;

/*!
	@brief Dequantize a band with the specified dimensions

	The companding curve is inverted and the value is multiplied by the
	quantization value that was used by the encoder to compress the band.
*/
CODEC_ERROR DequantizeBandRow16s(PIXEL *input, int width, int quantization, PIXEL *output)
{
	int column;

	// Undo quantization in the entire row
	for (column = 0; column < width; column++)
	{
		int32_t value = input[column];

		// Invert the companding curve (if any)
		value = UncompandedValue(value);

		// Dequantize the absolute value
		if (value > 0)
		{
			value = (quantization * value) + midpoint;
		}
		else if (value < 0)
		{
			value = neg(value);
			value = (quantization * value) + midpoint;
			value = neg(value);
		}

		// Store the dequantized coefficient
		output[column] = ClampPixel(value);
	}

	return CODEC_ERROR_OKAY;
}

/*!
	@brief This function dequantizes the pixel value

	The inverse companding curve is applied to convert the pixel value
	to its quantized value and then the pixel value is multiplied by
	the quantization parameter.
*/
PIXEL DequantizedValue(int32_t value, int quantization)
{
	// Invert the companding curve (if any)
	value = UncompandedValue(value);

	// Dequantize the absolute value
	if (value > 0)
	{
		value = (quantization * value) + midpoint;
	}
	else if (value < 0)
	{
		value = neg(value);
		value = (quantization * value) + midpoint;
		value = neg(value);
	}

	return ClampPixel(value);
}