summaryrefslogtreecommitdiff
path: root/gpr/source/lib/vc5_encoder/parameters.h
blob: b2cac04c698efeb441c3086e9d4043cb24ce1cd0 (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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*! @file parameters.h
 *
 *  @brief Declare a data structure for holding a table of parameters that is passed
 *  to the encoder during initialization.
 *
 *  (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.
 */

#ifndef PARAMETERS_H
#define PARAMETERS_H

#include "vc5_encoder.h"

/*!
	@brief Function prototype for a decompositor

	A decompositor is the opposite of an image composition operator:
	It decomposes a frame into one or more frames.
	
	For example, an interlaced frame can be decomposed into fields or two frames
	arranged side-by-side within a single frame can be decomposed into individual
	frames.

	Each layer in an encoded sample may correspond to a separate input frame.
	For convenience, the reference codec stores the input to the encoder in a
	separate file with one frame per file if the encoded sample has a single layer.
	To allow the reference encoder to store all of the input frames that are
	encoded as separate layers in an encoded sample in a single file, multiple
	frames are stored in the file (often using over-under frame packing).  The
	decomposer unpacks multiple frames in a single frame into individual frames
	for encoding with one frame per layer.
*/

typedef CODEC_ERROR (* DECOMPOSITOR)(IMAGE *packed_image, IMAGE *image_array[], int frame_count);

/*!
	@brief Declaration of a data structure for passing parameters to the encoder

	The encoded dimensions are the width and height of the planes of pixels as
	represented internally in the encoded sample.  In the case where the planes
	have different dimensions (for example YUV with 4:2:2 sampling), the first
	encoded plane (corresponding to the luma plane, for example) is reported.
*/
typedef struct _encoder_parameters
{
	uint32_t version;				//!< Version number for this definition of the parameters
    
    // BAYER_ORDERING bayer_ordering;
    
	ENABLED_PARTS enabled_parts;	//!< Parts of the VC-5 standard that are enabled

	//! Data structure for the input frame dimensions and format
	struct _input_parameters
	{
		DIMENSION width;			//!< Width of the frames input to the encoder
		DIMENSION height;			//!< Height of the frames input to the encoder
		PIXEL_FORMAT format;		//!< Pixel format of the input frames
		PRECISION precision;		//!< Bits per component in the input image

	} input;		//!< Dimensions and format of the input frame

	//! Data structure for the encoded representation of the image
	struct _encoded_parameters
	{
#if VC5_ENABLED_PART(VC5_PART_IMAGE_FORMATS)
		DIMENSION width;			//!< Width of the encoded frame
		DIMENSION height;			//!< Height of the encoded frame
		IMAGE_FORMAT format;		//!< Internal format of the encoded image
		PRECISION precision;		//!< Encoded precision of the image after scaling
#endif
		//! Number of bits used to encode lowpass coefficients
		PRECISION lowpass_precision;

	} encoded;		//!< Encoded frame dimensions and the encoded format

	//! Array of quantization values indexed by the subband number
    QUANT quant_table[MAX_SUBBAND_COUNT];

#if VC5_ENABLED_PART(VC5_PART_METADATA)
	//! Metadata that controls decoding (currently not used)
	METADATA metadata;
#endif
#if VC5_ENABLED_PART(VC5_PART_LAYERS)
	int layer_count;
	int progressive;
	DECOMPOSITOR decompositor;
#endif

#if VC5_ENABLED_PART(VC5_PART_SECTIONS)
    ENABLED_SECTIONS enabled_sections;
#endif
    
#if VC5_ENABLED_PART(VC5_PART_IMAGE_FORMATS)
	// Definition of the pattern elements
	DIMENSION pattern_width;
	DIMENSION pattern_height;
	DIMENSION components_per_sample;
	//PRECISION max_bits_per_component;
#endif

	//! Table for the order in which channels are encoded into the bitstream
	CHANNEL channel_order_table[MAX_CHANNEL_COUNT];

	//! Number of entries in the channel order table (may be less than the channel count)
	int channel_order_count;
    
	//! Flag that controls verbose output
	bool verbose_flag;

    gpr_allocator       allocator;
    
    GPR_RGB_RESOLUTION  rgb_resolution;

    gpr_rgb_gain        rgb_gain;
    
} ENCODER_PARAMETERS;

#ifdef __cplusplus
extern "C" {
#endif
    
    CODEC_ERROR InitEncoderParameters(ENCODER_PARAMETERS *parameters);

#ifdef __cplusplus
}
#endif

#endif // PARAMETERS_H