1 /*
2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3  * Copyright (c) Imagination Technologies Limited, UK
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the
7  * "Software"), to deal in the Software without restriction, including
8  * without limitation the rights to use, copy, modify, merge, publish,
9  * distribute, sub license, and/or sell copies of the Software, and to
10  * permit persons to whom the Software is furnished to do so, subject to
11  * the following conditions:
12  *
13  * The above copyright notice and this permission notice (including the
14  * next paragraph) shall be included in all copies or substantial portions
15  * of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 #ifndef _COREFLAGS_H_
27 #define _COREFLAGS_H_
28 
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 
35 #define SERIALIZED_PIPES 1
36 
37 
38 #if defined(ENCFMT_H264MVC) || !defined(TOPAZ_MTX_HW)
39 #	define ENCFMT_H264
40 #	define _ENABLE_MVC_        /* Defined for enabling MVC specific code */
41 #	define _MVC_RC_  1         /* Defined for enabling MVC rate control code, later on it will be replaced by _ENABLE_MVC_ */
42 #endif
43 
44 #if defined(RCMODE_ALL) && !defined(ENCFMT_H264)
45 	#		error "H264 is not defined when RCMODE is ALL."
46 #endif
47 
48 #if defined(RCMODE_ALL) && (defined(ENCFMT_JPEG) || defined(ENCFMT_JPEG) || defined(ENCFMT_JPEG) || defined(ENCFMT_MPG4) || defined(ENCFMT_MPG2) || defined(ENCFMT_H263) || defined(ENCFMT_H264MVC))
49 	#		error "RCMODE_ALL is only allowed for H264."
50 #endif
51 
52 #if defined(RCMODE_ALL) || !defined(TOPAZ_MTX_HW)
53 #	define RCMODE_CBR
54 #	define RCMODE_VBR
55 #	define RCMODE_VCM
56 #	define __COREFLAGS_RC_ALLOWED__ 1
57 #endif
58 
59 #define TOPAZHP_MAX_NUM_STREAMS 2
60 
61 /*
62 	Hierarhical B picture support is disabled:
63 		* for H264 VCM mode, as VCM mode is not expected to use B pictures at all
64 */
65 #if  !defined(TOPAZ_MTX_HW) || \
66 		(defined(ENCFMT_H264) && !(defined(RCMODE_VCM))) \
67 		|| defined(RCMODE_ALL)
68 #	define INCLUDE_HIER_SUPPORT	1
69 #else
70 #	define INCLUDE_HIER_SUPPORT	0
71 #endif
72 
73 // Add this back in for SEI inclusion
74 #if !defined(RCMODE_NONE)
75 #	if  (!defined(TOPAZ_MTX_HW) || ((defined(RCMODE_VBR) || defined(RCMODE_CBR) || defined(RCMODE_VCM) || defined(RCMODE_LLRC)) && defined(ENCFMT_H264)))
76 #		define SEI_INSERTION 1
77 #	endif
78 #endif
79 
80 #if	(!defined(TOPAZ_MTX_HW) || defined(ENCFMT_H264))
81 #	define WEIGHTED_PREDICTION 1
82 #	define MULTI_REF_P
83 #	define LONG_TERM_REFS
84 #	define CUSTOM_QUANTIZATION
85 #endif
86 
87 // Firmware bias table control is not compatible with parallel encoding
88 //#define FIRMWARE_BIAS
89 
90 /* This define controls whether the hard VCM bitrate limit is applied to I frames */
91 //#define TOPAZHP_IMPOSE_VCM_BITRATE_LIMIT_ON_INTRA
92 
93 #if INCLUDE_HIER_SUPPORT
94 #if ( !defined(TOPAZ_MTX_HW) || !defined(ENCFMT_H264MVC) )
95 #	define MAX_REF_B_LEVELS_FW	(MAX_REF_B_LEVELS)
96 #else
97 #	define MAX_REF_B_LEVELS_FW	2
98 #endif
99 #else
100 #	define MAX_REF_B_LEVELS_FW	0
101 #endif
102 
103 #ifdef MULTI_REF_P
104 #	define MAX_REF_I_OR_P_LEVELS_FW	(MAX_REF_I_OR_P_LEVELS)
105 #else
106 #	define MAX_REF_I_OR_P_LEVELS_FW	2
107 #endif
108 
109 #define MAX_REF_LEVELS_FW	(MAX_REF_B_LEVELS_FW + MAX_REF_I_OR_P_LEVELS_FW)
110 #define MAX_PIC_NODES_FW	(MAX_REF_LEVELS_FW + 1)
111 
112 
113 #if defined(TOPAZ_MTX_HW)
114 #	if defined(ENABLE_FORCED_INLINE)
115 /*
116 	__attribute__((always_inline)) should be only used when all C code is compiled by
117 	GCC to a blob object with `-combine` swithch.
118 */
119 #		define MTX_INLINE  inline __attribute__((always_inline))
120 #else
121 #		define MTX_INLINE  inline
122 #endif
123 #else
124 #	define MTX_INLINE
125 #endif
126 
127 /*
128 	Check that only one `RCMODE_` symbol is defined.
129 
130 	If `RCMODE_NONE` is set, block any possebility for RC sources to be included.
131 */
132 
133 
134 #if defined(RCMODE_NONE)
135 #	define __COREFLAGS_RC_ALLOWED__	0
136 #else
137 #	define __COREFLAGS_RC_ALLOWED__ 1
138 #endif
139 
140 /*
141 	Determine possible rate control modes.
142 */
143 #if !defined(TOPAZ_MTX_HW)
144 #	define	CBR_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
145 #	define  VCM_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
146 #	define  VBR_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
147 #	define  ERC_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
148 #else
149 #	if defined(RCMODE_CBR)
150 #		define	CBR_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
151 #	else
152 #		define	CBR_RC_MODE_POSSIBLE	FALSE
153 #	endif
154 #	if defined(ENCFMT_H264) && (defined(RCMODE_VCM) || defined(RCMODE_LLRC))
155 		/* VCM is possible only for H264 */
156 #		define  VCM_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
157 #	else
158 #		define	VCM_RC_MODE_POSSIBLE	FALSE
159 #	endif
160 #	if defined(RCMODE_VBR)
161 #		define  VBR_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
162 #	else
163 #		define	VBR_RC_MODE_POSSIBLE	FALSE
164 #	endif
165 #	if defined(RCMODE_ERC)
166 #		define  ERC_RC_MODE_POSSIBLE	__COREFLAGS_RC_ALLOWED__
167 #	else
168 #		define	ERC_RC_MODE_POSSIBLE	FALSE
169 #	endif
170 #endif
171 
172 
173 #define RATE_CONTROL_AVAILABLE (\
174 		CBR_RC_MODE_POSSIBLE || VCM_RC_MODE_POSSIBLE || \
175 		VBR_RC_MODE_POSSIBLE || ERC_RC_MODE_POSSIBLE\
176 	)
177 #define RC_MODE_POSSIBLE(MODE) (MODE ## _RC_MODE_POSSIBLE)
178 
179 #define RC_MODES_POSSIBLE2(M1, M2) \
180 	(RC_MODE_POSSIBLE(M1) || RC_MODE_POSSIBLE(M2))
181 
182 #define RC_MODES_POSSIBLE3(M1, M2, M3) \
183 	(RC_MODES_POSSIBLE2(M1, M2) || RC_MODE_POSSIBLE(M3))
184 
185 /*
186 	Declare `CUR_ENCODE_RC_MODE` as proper function only in FAKE_MTX.
187 	Alternatively, declare it as constant.
188 */
189 #if defined(FAKE_MTX) || defined(RCMODE_ALL)
190 #	define	CUR_ENCODE_RC_MODE (GLOBALS(g_sEncContext).eRCMode)
191 #elif defined(RCMODE_NONE)
192 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_NONE)
193 #elif defined(RCMODE_CBR)
194 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_CBR)
195 #elif defined(RCMODE_VBR)
196 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_VBR)
197 #elif defined(RCMODE_ERC)
198 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_ERC)
199 #elif defined(RCMODE_LLRC)
200 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_LLRC)
201 #elif defined(RCMODE_VCM)
202 #	define CUR_ENCODE_RC_MODE (IMG_RCMODE_VCM)
203 #endif
204 
205 
206 #define USE_VCM_HW_SUPPORT 1
207 
208 #define INPUT_SCALER_SUPPORTED 0	/* controls the firmwares ability to support the optional hardware input scaler */
209 
210 #define SECURE_MODE_POSSIBLE 1		/* controls the firmwares ability to support secure mode firmware upload */
211 
212 #endif  // #ifndef _COREFLAGS_H_
213