1/**************************************************************************
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a
4 * copy of this software and associated documentation files (the
5 * "Software"), to deal in the Software without restriction, including
6 * without limitation the rights to use, copy, modify, merge, publish,
7 * distribute, sub license, and/or sell copies of the Software, and to
8 * permit persons to whom the Software is furnished to do so, subject to
9 * the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the
12 * next paragraph) shall be included in all copies or substantial portions
13 * of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
18 * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
19 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 *
23 **************************************************************************/
24
25#include <tizport_decls.h>
26
27#include "h264eprc.h"
28#include "h264e.h"
29#include "names.h"
30#include "vid_enc_common.h"
31
32static OMX_VERSIONTYPE h264e_encoder_version = {{0, 0, 0, 1}};
33
34OMX_PTR instantiate_h264e_input_port(OMX_HANDLETYPE ap_hdl)
35{
36   OMX_VIDEO_PORTDEFINITIONTYPE portdef;
37   OMX_VIDEO_CODINGTYPE encodings[] = {
38      OMX_VIDEO_CodingUnused,
39      OMX_VIDEO_CodingMax
40   };
41   OMX_COLOR_FORMATTYPE formats[] = {
42      OMX_COLOR_FormatYUV420SemiPlanar,
43      OMX_COLOR_FormatMax
44   };
45   tiz_port_options_t rawvideo_port_opts = {
46      OMX_PortDomainVideo,
47      OMX_DirInput,
48      OMX_VID_ENC_AVC_INPUT_PORT_MIN_BUF_COUNT,
49      OMX_VID_ENC_AVC_PORT_MIN_INPUT_BUF_SIZE,
50      OMX_VID_ENC_AVC_PORT_NONCONTIGUOUS,
51      OMX_VID_ENC_AVC_PORT_ALIGNMENT,
52      OMX_VID_ENC_AVC_PORT_SUPPLIERPREF,
53      {OMX_VID_ENC_AVC_INPUT_PORT_INDEX, NULL, NULL, NULL},
54      1                     /* Slave port */
55   };
56
57   portdef.pNativeRender = NULL;
58   portdef.nFrameWidth = OMX_VID_ENC_AVC_DEFAULT_FRAME_WIDTH;
59   portdef.nFrameHeight = OMX_VID_ENC_AVC_DEFAULT_FRAME_HEIGHT;
60   portdef.nStride = 0;
61   portdef.nSliceHeight = 0;
62   portdef.nBitrate = 64000;
63   portdef.xFramerate = 15;
64   portdef.bFlagErrorConcealment = OMX_FALSE;
65   portdef.eCompressionFormat = OMX_VIDEO_CodingUnused;
66   portdef.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
67   portdef.pNativeWindow = NULL;
68
69   return factory_new(tiz_get_type(ap_hdl, "h264einport"),
70                      &rawvideo_port_opts, &portdef,
71                      &encodings, &formats);
72}
73
74OMX_PTR instantiate_h264e_output_port(OMX_HANDLETYPE ap_hdl)
75{
76   OMX_VIDEO_PORTDEFINITIONTYPE portdef;
77   OMX_VIDEO_PARAM_AVCTYPE avctype;
78   OMX_VIDEO_PARAM_BITRATETYPE bitrate;
79   OMX_VIDEO_PARAM_QUANTIZATIONTYPE quant;
80
81   OMX_VIDEO_CODINGTYPE encodings[] = {
82      OMX_VIDEO_CodingAVC,
83      OMX_VIDEO_CodingMax
84   };
85   OMX_COLOR_FORMATTYPE formats[] = {
86      OMX_COLOR_FormatUnused,
87      OMX_COLOR_FormatMax
88   };
89   tiz_port_options_t avc_port_opts = {
90      OMX_PortDomainVideo,
91      OMX_DirOutput,
92      OMX_VID_ENC_AVC_OUTPUT_PORT_MIN_BUF_COUNT,
93      OMX_VID_ENC_AVC_PORT_MIN_OUTPUT_BUF_SIZE,
94      OMX_VID_ENC_AVC_PORT_NONCONTIGUOUS,
95      OMX_VID_ENC_AVC_PORT_ALIGNMENT,
96      OMX_VID_ENC_AVC_PORT_SUPPLIERPREF,
97      {OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX, NULL, NULL, NULL},
98      0                     /* Master port */
99   };
100   OMX_VIDEO_AVCLEVELTYPE levels[] = {
101      OMX_VIDEO_AVCLevel51,
102      OMX_VIDEO_AVCLevel1,
103      OMX_VIDEO_AVCLevel1b,
104      OMX_VIDEO_AVCLevel11,
105      OMX_VIDEO_AVCLevel12,
106      OMX_VIDEO_AVCLevel13,
107      OMX_VIDEO_AVCLevel2,
108      OMX_VIDEO_AVCLevel21,
109      OMX_VIDEO_AVCLevel22,
110      OMX_VIDEO_AVCLevel3,
111      OMX_VIDEO_AVCLevel31,
112      OMX_VIDEO_AVCLevel32,
113      OMX_VIDEO_AVCLevel4,
114      OMX_VIDEO_AVCLevel41,
115      OMX_VIDEO_AVCLevel42,
116      OMX_VIDEO_AVCLevel5,
117      OMX_VIDEO_AVCLevelMax
118   };
119
120   /* Values set from as given in specification */
121   portdef.pNativeRender = NULL;
122   portdef.nFrameWidth = OMX_VID_ENC_AVC_DEFAULT_FRAME_WIDTH;
123   portdef.nFrameHeight = OMX_VID_ENC_AVC_DEFAULT_FRAME_HEIGHT;
124   portdef.nStride = 0;
125   portdef.nSliceHeight = 0;
126   portdef.nBitrate = 64000;
127   portdef.xFramerate = 15;
128   portdef.bFlagErrorConcealment = OMX_FALSE;
129   portdef.eCompressionFormat = OMX_VIDEO_CodingAVC;
130   portdef.eColorFormat = OMX_COLOR_FormatUnused;
131   portdef.pNativeWindow = NULL;
132
133   bitrate.eControlRate = OMX_Video_ControlRateDisable;
134   bitrate.nTargetBitrate = 0;
135
136   quant.nQpI = OMX_VID_ENC_QUANT_I_FRAMES_DEFAULT;
137   quant.nQpP = OMX_VID_ENC_QUANT_P_FRAMES_DEFAULT;
138   quant.nQpB = OMX_VID_ENC_QUANT_B_FRAMES_DEFAULT;
139
140   avctype.nSize = sizeof (OMX_VIDEO_PARAM_AVCTYPE);
141   avctype.nVersion.nVersion = OMX_VERSION;
142   avctype.nPortIndex = OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX;
143   avctype.eProfile = OMX_VIDEO_AVCProfileBaseline;
144   avctype.nSliceHeaderSpacing = 0;
145   avctype.nPFrames = 0;
146   avctype.nBFrames = 0;
147   avctype.bUseHadamard = OMX_TRUE;
148   avctype.nRefFrames = 1;
149   avctype.nRefIdx10ActiveMinus1 = 1;
150   avctype.nRefIdx11ActiveMinus1 = 0;
151   avctype.bEnableUEP = OMX_FALSE;
152   avctype.bEnableFMO = OMX_FALSE;
153   avctype.bEnableASO = OMX_FALSE;
154   avctype.bEnableRS = OMX_FALSE;
155   avctype.eLevel = OMX_VIDEO_AVCLevel51;
156   avctype.nAllowedPictureTypes = 2;
157   avctype.bFrameMBsOnly = OMX_FALSE;
158   avctype.bMBAFF = OMX_FALSE;
159   avctype.bEntropyCodingCABAC = OMX_FALSE;
160   avctype.bWeightedPPrediction = OMX_FALSE;
161   avctype.nWeightedBipredicitonMode = 0;
162   avctype.bconstIpred = OMX_FALSE;
163   avctype.bDirect8x8Inference = OMX_FALSE;
164   avctype.bDirectSpatialTemporal = OMX_FALSE;
165   avctype.nCabacInitIdc = 0;
166   avctype.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
167
168   return factory_new(tiz_get_type(ap_hdl, "h264eoutport"),
169                      &avc_port_opts, &portdef,
170                      &encodings, &formats, &avctype, &levels,
171                      &bitrate, &quant);
172}
173
174OMX_PTR instantiate_h264e_config_port(OMX_HANDLETYPE ap_hdl)
175{
176   return factory_new(tiz_get_type(ap_hdl, "tizconfigport"),
177                      NULL, /* this port does not take options */
178                      OMX_VID_COMP_NAME, h264e_encoder_version);
179}
180
181OMX_PTR instantiate_h264e_processor(OMX_HANDLETYPE ap_hdl)
182{
183   return factory_new(tiz_get_type(ap_hdl, "h264eprc"));
184}
185