1/*
2Copyright (c) 2012, Broadcom Europe Ltd
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of the copyright holder nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
20DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*/
27
28#include "mmalomx.h"
29#include "mmalomx_util_params_common.h"
30#include "mmalomx_logging.h"
31
32static void rect_to_omx(OMX_DISPLAYRECTTYPE *dst, const MMAL_RECT_T *src)
33{
34 dst->x_offset = src->x;
35 dst->y_offset = src->y;
36 dst->width = src->width;
37 dst->height = src->height;
38}
39
40static void rect_to_mmal(MMAL_RECT_T *dst, const OMX_DISPLAYRECTTYPE *src)
41{
42 dst->x = src->x_offset;
43 dst->y = src->y_offset;
44 dst->width = src->width;
45 dst->height = src->height;
46}
47
48static MMAL_STATUS_T mmalomx_param_mapping_displayregion(MMALOMX_PARAM_MAPPING_DIRECTION dir,
49 MMAL_PARAMETER_HEADER_T *mmal_param, OMX_PTR omx_param)
50{
51 OMX_CONFIG_DISPLAYREGIONTYPE *omx = (OMX_CONFIG_DISPLAYREGIONTYPE *)omx_param;
52 MMAL_DISPLAYREGION_T *mmal = (MMAL_DISPLAYREGION_T *)mmal_param;
53
54 if (dir == MMALOMX_PARAM_MAPPING_TO_MMAL)
55 {
56 mmal->set = omx->set;
57 mmal->display_num = omx->num;
58 mmal->fullscreen = omx->fullscreen;
59 mmal->transform = (MMAL_DISPLAYTRANSFORM_T)omx->transform;
60 rect_to_mmal(&mmal->dest_rect, &omx->dest_rect);
61 rect_to_mmal(&mmal->src_rect, &omx->src_rect);
62 mmal->noaspect = omx->noaspect;
63 mmal->mode = (MMAL_DISPLAYMODE_T)omx->mode;
64 mmal->pixel_x = omx->pixel_x;
65 mmal->pixel_y = omx->pixel_y;
66 mmal->layer = omx->layer;
67 mmal->copyprotect_required = omx->copyprotect_required;
68 mmal->alpha = omx->alpha;
69 }
70 else
71 {
72 omx->set = mmal->set;
73 omx->num = mmal->display_num;
74 omx->fullscreen = mmal->fullscreen;
75 omx->transform = (OMX_DISPLAYTRANSFORMTYPE)mmal->transform;
76 rect_to_omx(&omx->dest_rect, &mmal->dest_rect);
77 rect_to_omx(&omx->src_rect, &mmal->src_rect);
78 omx->noaspect = mmal->noaspect;
79 omx->mode = (OMX_DISPLAYMODETYPE)mmal->mode;
80 omx->pixel_x = mmal->pixel_x;
81 omx->pixel_y = mmal->pixel_y;
82 omx->layer = mmal->layer;
83 omx->copyprotect_required = mmal->copyprotect_required;
84 omx->alpha = mmal->alpha;
85 }
86
87 return MMAL_SUCCESS;
88}
89
90static MMAL_STATUS_T mmalomx_param_list_supported_profiles(MMALOMX_PARAM_MAPPING_DIRECTION dir,
91 const MMALOMX_PARAM_TRANSLATION_T *xlat, unsigned int index,
92 MMAL_PARAMETER_HEADER_T *mmal_param, OMX_PTR omx_param, MMAL_PORT_T *mmal_port)
93{
94 OMX_VIDEO_PARAM_PROFILELEVELTYPE *omx = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)omx_param;
95 MMAL_PARAMETER_VIDEO_PROFILE_T *mmal = (MMAL_PARAMETER_VIDEO_PROFILE_T *)mmal_param;
96 MMAL_PARAM_UNUSED(xlat);
97
98 if (dir == MMALOMX_PARAM_MAPPING_TO_MMAL)
99 {
100 OMX_VIDEO_CODINGTYPE coding = mmalil_encoding_to_omx_video_coding(mmal_port->format->encoding);
101 mmal->profile[index].profile = mmalil_omx_video_profile_to_mmal(omx->eProfile, coding);
102 mmal->profile[index].level = mmalil_omx_video_level_to_mmal(omx->eLevel, coding);
103 }
104 else
105 {
106 omx->eProfile = mmalil_video_profile_to_omx(mmal->profile[index].profile);
107 omx->eLevel = mmalil_video_level_to_omx(mmal->profile[index].level);
108 }
109
110 return MMAL_SUCCESS;
111}
112
113static MMAL_STATUS_T mmalomx_param_custom_profile(MMALOMX_PARAM_MAPPING_DIRECTION dir,
114 const MMALOMX_PARAM_TRANSLATION_T *xlat,
115 MMAL_PARAMETER_HEADER_T *mmal_param, OMX_PTR omx_param, MMAL_PORT_T *mmal_port)
116{
117 OMX_VIDEO_PARAM_PROFILELEVELTYPE *omx = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)omx_param;
118 MMAL_PARAMETER_VIDEO_PROFILE_T *mmal = (MMAL_PARAMETER_VIDEO_PROFILE_T *)mmal_param;
119 MMAL_PARAM_UNUSED(xlat);
120
121 if (dir == MMALOMX_PARAM_MAPPING_TO_MMAL)
122 {
123 OMX_VIDEO_CODINGTYPE coding = mmalil_encoding_to_omx_video_coding(mmal_port->format->encoding);
124 mmal->profile[0].profile = mmalil_omx_video_profile_to_mmal(omx->eProfile, coding);
125 mmal->profile[0].level = mmalil_omx_video_level_to_mmal(omx->eLevel, coding);
126 }
127 else
128 {
129 omx->eProfile = mmalil_video_profile_to_omx(mmal->profile[0].profile);
130 omx->eLevel = mmalil_video_level_to_omx(mmal->profile[0].level);
131 }
132
133 return MMAL_SUCCESS;
134}
135
136static MMAL_STATUS_T mmalomx_param_custom_ratecontrol(MMALOMX_PARAM_MAPPING_DIRECTION dir,
137 const MMALOMX_PARAM_TRANSLATION_T *xlat,
138 MMAL_PARAMETER_HEADER_T *mmal_param, OMX_PTR omx_param, MMAL_PORT_T *mmal_port)
139{
140 OMX_VIDEO_PARAM_BITRATETYPE *omx = (OMX_VIDEO_PARAM_BITRATETYPE *)omx_param;
141 MMAL_PARAMETER_VIDEO_RATECONTROL_T *mmal = (MMAL_PARAMETER_VIDEO_RATECONTROL_T *)mmal_param;
142 MMAL_PARAM_UNUSED(xlat);
143
144 if (dir == MMALOMX_PARAM_MAPPING_TO_MMAL)
145 {
146 mmal->control = mmalil_omx_video_ratecontrol_to_mmal(omx->eControlRate);
147 /* This does not apply nTargetBitrate but should not be necessary */
148 }
149 else
150 {
151 omx->eControlRate = mmalil_video_ratecontrol_to_omx(mmal->control);
152 omx->nTargetBitrate = mmal_port->format->bitrate; /* Should not really be necessary */
153 }
154
155 return MMAL_SUCCESS;
156}
157
158static const MMALOMX_PARAM_ENUM_TRANSLATE_T mmalomx_param_enum_nalunitformat[] = {
159 {MMAL_VIDEO_NALUNITFORMAT_STARTCODES, OMX_NaluFormatStartCodes},
160 {MMAL_VIDEO_NALUNITFORMAT_NALUNITPERBUFFER, OMX_NaluFormatOneNaluPerBuffer},
161 {MMAL_VIDEO_NALUNITFORMAT_ONEBYTEINTERLEAVELENGTH, OMX_NaluFormatOneByteInterleaveLength},
162 {MMAL_VIDEO_NALUNITFORMAT_TWOBYTEINTERLEAVELENGTH, OMX_NaluFormatTwoByteInterleaveLength},
163 {MMAL_VIDEO_NALUNITFORMAT_FOURBYTEINTERLEAVELENGTH, OMX_NaluFormatFourByteInterleaveLength},
164};
165
166static MMAL_STATUS_T mmalomx_param_mapping_frame_rate(MMALOMX_PARAM_MAPPING_DIRECTION dir,
167 MMAL_PARAMETER_HEADER_T *mmal_param, OMX_PTR omx_param)
168{
169 OMX_CONFIG_FRAMERATETYPE *omx = (OMX_CONFIG_FRAMERATETYPE *)omx_param;
170 MMAL_PARAMETER_FRAME_RATE_T *mmal = (MMAL_PARAMETER_FRAME_RATE_T *)mmal_param;
171
172 if (dir == MMALOMX_PARAM_MAPPING_TO_MMAL)
173 {
174 mmal->frame_rate.num = omx->xEncodeFramerate;
175 mmal->frame_rate.den = (1<<16);
176 }
177 else
178 {
179 omx->xEncodeFramerate = 0;
180 if (mmal->frame_rate.den)
181 omx->xEncodeFramerate = (((int64_t)mmal->frame_rate.num)<<16)/mmal->frame_rate.den;
182 }
183
184 return MMAL_SUCCESS;
185}
186
187const MMALOMX_PARAM_TRANSLATION_T mmalomx_param_xlator_video[] = {
188 MMALOMX_PARAM_STRAIGHT_MAPPING(MMAL_PARAMETER_DISPLAYREGION, MMAL_DISPLAYREGION_T,
189 OMX_IndexConfigDisplayRegion, OMX_CONFIG_DISPLAYREGIONTYPE,
190 mmalomx_param_mapping_displayregion),
191 MMALOMX_PARAM_LIST(MMAL_PARAMETER_SUPPORTED_PROFILES, MMAL_PARAMETER_VIDEO_PROFILE_T,
192 OMX_IndexParamVideoProfileLevelQuerySupported, OMX_VIDEO_PARAM_PROFILELEVELTYPE,
193 nProfileIndex, mmalomx_param_list_supported_profiles),
194 MMALOMX_PARAM_CUSTOM(MMAL_PARAMETER_PROFILE, MMAL_PARAMETER_VIDEO_PROFILE_T,
195 OMX_IndexParamVideoProfileLevelCurrent, OMX_VIDEO_PARAM_PROFILELEVELTYPE,
196 mmalomx_param_custom_profile),
197 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_INTRAPERIOD, MMAL_PARAMETER_UINT32_T,
198 OMX_IndexConfigBrcmVideoIntraPeriod, OMX_PARAM_U32TYPE),
199 MMALOMX_PARAM_CUSTOM(MMAL_PARAMETER_RATECONTROL, MMAL_PARAMETER_VIDEO_RATECONTROL_T,
200 OMX_IndexParamVideoBitrate, OMX_VIDEO_PARAM_BITRATETYPE,
201 mmalomx_param_custom_ratecontrol),
202 MMALOMX_PARAM_ENUM(MMAL_PARAMETER_NALUNITFORMAT, MMAL_PARAMETER_VIDEO_NALUNITFORMAT_T,
203 OMX_IndexParamNalStreamFormatSelect, OMX_NALSTREAMFORMATTYPE, mmalomx_param_enum_nalunitformat),
204 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_MINIMISE_FRAGMENTATION,
205 OMX_IndexConfigMinimiseFragmentation),
206 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_MB_ROWS_PER_SLICE, MMAL_PARAMETER_UINT32_T,
207 OMX_IndexConfigBrcmVideoEncoderMBRowsPerSlice, OMX_PARAM_U32TYPE),
208 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION, MMAL_PARAMETER_VIDEO_LEVEL_EXTENSION_T,
209 OMX_IndexConfigEncLevelExtension, OMX_VIDEO_CONFIG_LEVEL_EXTEND),
210 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_INTRA_REFRESH, MMAL_PARAMETER_VIDEO_INTRA_REFRESH_T,
211 OMX_IndexConfigBrcmVideoIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE),
212 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_INTRA_REFRESH, MMAL_PARAMETER_VIDEO_INTRA_REFRESH_T,
213 OMX_IndexParamVideoIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE),
214 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_EEDE_ENABLE, MMAL_PARAMETER_VIDEO_EEDE_ENABLE_T,
215 OMX_IndexParamBrcmEEDEEnable, OMX_VIDEO_EEDE_ENABLE),
216 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE, MMAL_PARAMETER_VIDEO_EEDE_LOSSRATE_T,
217 OMX_IndexParamBrcmEEDELossRate, OMX_VIDEO_EEDE_LOSSRATE),
218 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_REQUEST_I_FRAME,
219 OMX_IndexConfigBrcmVideoRequestIFrame),
220 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_IMMUTABLE_INPUT,
221 OMX_IndexParamBrcmImmutableInput),
222 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_BIT_RATE, MMAL_PARAMETER_UINT32_T,
223 OMX_IndexConfigVideoBitrate, OMX_VIDEO_CONFIG_BITRATETYPE),
224 MMALOMX_PARAM_STRAIGHT_MAPPING(MMAL_PARAMETER_VIDEO_FRAME_RATE, MMAL_PARAMETER_FRAME_RATE_T,
225 OMX_IndexConfigVideoFramerate, OMX_CONFIG_FRAMERATETYPE, mmalomx_param_mapping_frame_rate),
226 MMALOMX_PARAM_STRAIGHT_MAPPING(MMAL_PARAMETER_FRAME_RATE, MMAL_PARAMETER_FRAME_RATE_T,
227 OMX_IndexConfigVideoFramerate, OMX_CONFIG_FRAMERATETYPE, mmalomx_param_mapping_frame_rate),
228 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT, MMAL_PARAMETER_UINT32_T,
229 OMX_IndexParamBrcmVideoEncodeMinQuant, OMX_PARAM_U32TYPE),
230 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT, MMAL_PARAMETER_UINT32_T,
231 OMX_IndexParamBrcmVideoEncodeMaxQuant, OMX_PARAM_U32TYPE),
232 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL, MMAL_PARAMETER_VIDEO_ENCODE_RC_MODEL_T,
233 OMX_IndexParamRateControlModel, OMX_PARAM_U32TYPE),
234 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_EXTRA_BUFFERS, MMAL_PARAMETER_UINT32_T,
235 OMX_IndexParamBrcmExtraBuffers, OMX_PARAM_U32TYPE),
236 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ALIGN_HORIZ, MMAL_PARAMETER_UINT32_T,
237 OMX_IndexParamBrcmAlignHoriz, OMX_PARAM_U32TYPE),
238 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ALIGN_VERT, MMAL_PARAMETER_UINT32_T,
239 OMX_IndexParamBrcmAlignVert, OMX_PARAM_U32TYPE),
240 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_DROPPABLE_PFRAMES,
241 OMX_IndexParamBrcmDroppablePFrames),
242 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_INITIAL_QUANT, MMAL_PARAMETER_UINT32_T,
243 OMX_IndexParamBrcmVideoInitialQuant, OMX_PARAM_U32TYPE),
244 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_QP_P, MMAL_PARAMETER_UINT32_T,
245 OMX_IndexParamBrcmVideoInitialQuant, OMX_PARAM_U32TYPE),
246 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_RC_SLICE_DQUANT, MMAL_PARAMETER_UINT32_T,
247 OMX_IndexParamBrcmVideoRCSliceDQuant, OMX_PARAM_U32TYPE),
248 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_FRAME_LIMIT_BITS, MMAL_PARAMETER_UINT32_T,
249 OMX_IndexParamBrcmVideoFrameLimitBits, OMX_PARAM_U32TYPE),
250 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_PEAK_RATE, MMAL_PARAMETER_UINT32_T,
251 OMX_IndexParamBrcmVideoPeakRate, OMX_PARAM_U32TYPE),
252 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_ENCODE_H264_DISABLE_CABAC,
253 OMX_IndexConfigBrcmVideoH264DisableCABAC),
254 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_ENCODE_H264_LOW_LATENCY,
255 OMX_IndexConfigBrcmVideoH264LowLatency),
256 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_ENCODE_H264_AU_DELIMITERS,
257 OMX_IndexConfigBrcmVideoH264AUDelimiters),
258 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_H264_DEBLOCK_IDC, MMAL_PARAMETER_UINT32_T,
259 OMX_IndexConfigBrcmVideoH264DeblockIDC, OMX_PARAM_U32TYPE),
260 MMALOMX_PARAM_PASSTHROUGH(MMAL_PARAMETER_VIDEO_ENCODE_H264_MB_INTRA_MODE, MMAL_PARAMETER_VIDEO_ENCODER_H264_MB_INTRA_MODES_T,
261 OMX_IndexConfigBrcmVideoH264IntraMBMode, OMX_PARAM_U32TYPE),
262 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_ENCODE_HEADER_ON_OPEN,
263 OMX_IndexParamBrcmHeaderOnOpen),
264 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_ENCODE_PRECODE_FOR_QP,
265 OMX_IndexParamBrcmVideoPrecodeForQP),
266 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_TIMESTAMP_FIFO,
267 OMX_IndexParamBrcmVideoTimestampFifo),
268 MMALOMX_PARAM_BOOLEAN_PORTLESS(MMAL_PARAMETER_VIDEO_DECODE_ERROR_CONCEALMENT,
269 OMX_IndexParamBrcmVideoDecodeErrorConcealment),
270 MMALOMX_PARAM_PASSTHROUGH_PORTLESS_DOUBLE_TRANSLATION(MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER, MMAL_PARAMETER_VIDEO_DRM_PROTECT_BUFFER_T,
271 OMX_IndexParamBrcmVideoDrmProtectBuffer, OMX_PARAM_BRCMVIDEODRMPROTECTBUFFERTYPE),
272 MMALOMX_PARAM_PASSTHROUGH_PORTLESS(MMAL_PARAMETER_VIDEO_DECODE_CONFIG_VD3, MMAL_PARAMETER_BYTES_T,
273 OMX_IndexParamBrcmVideoDecodeConfigVD3, OMX_PARAM_BRCMVIDEODECODECONFIGVD3TYPE),
274 MMALOMX_PARAM_BOOLEAN(MMAL_PARAMETER_VIDEO_ENCODE_INLINE_HEADER,
275 OMX_IndexParamBrcmVideoAVCInlineHeaderEnable),
276 MMALOMX_PARAM_TERMINATE()
277};
278