1 /*--------------------------------------------------------------------------
2 Copyright (c) 2010-2017, The Linux Foundation. All rights reserved.
3 
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6     * Redistributions of source code must retain the above copyright
7       notice, this list of conditions and the following disclaimer.
8     * Redistributions in binary form must reproduce the above copyright
9       notice, this list of conditions and the following disclaimer in the
10       documentation and/or other materials provided with the distribution.
11     * Neither the name of The Linux Foundation nor
12       the names of its contributors may be used to endorse or promote
13       products derived from this software without specific prior written
14       permission.
15 
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 --------------------------------------------------------------------------*/
28 #include "omx_video_encoder.h"
29 #include <string.h>
30 #include <stdio.h>
31 #include <fcntl.h>
32 #include <dlfcn.h>
33 #ifdef _ANDROID_ICS_
34 #include <media/hardware/HardwareAPI.h>
35 #endif
36 #ifdef _ANDROID_
37 #include <cutils/properties.h>
38 #endif
39 #ifndef _ANDROID_
40 #include <glib.h>
41 #define strlcpy g_strlcpy
42 #endif
43 /*----------------------------------------------------------------------------
44  * Preprocessor Definitions and Constants
45  * -------------------------------------------------------------------------*/
46 
47 #define OMX_SPEC_VERSION 0x00000101
48 #define OMX_INIT_STRUCT(_s_, _name_)            \
49     memset((_s_), 0x0, sizeof(_name_));          \
50 (_s_)->nSize = sizeof(_name_);               \
51 (_s_)->nVersion.nVersion = OMX_SPEC_VERSION
52 
53 extern int m_pipe;
54 static int bframes;
55 static int entropy;
56 static int perfmode;
57 // factory function executed by the core to create instances
get_omx_component_factory_fn(void)58 void *get_omx_component_factory_fn(void)
59 {
60     return(new omx_venc);
61 }
62 
perf_control()63 omx_venc::perf_control::perf_control()
64 {
65     m_perf_lib = NULL;
66     m_perf_lock_acquire = NULL;
67     m_perf_lock_release = NULL;
68     m_perf_handle = 0;
69 }
70 
~perf_control()71 omx_venc::perf_control::~perf_control()
72 {
73     if (m_perf_handle != 0 && m_perf_lock_release) {
74         m_perf_lock_release(m_perf_handle);
75     }
76     if (m_perf_lib) {
77         dlclose(m_perf_lib);
78     }
79 }
80 
send_hint_to_mpctl(bool state)81 void omx_venc::perf_control::send_hint_to_mpctl(bool state)
82 {
83     if (load_lib() == false) {
84         return;
85     }
86     /* 0x4601 maps to video encode callback in
87      * perflock, 46 is the enum number, 01 is
88      * the state being sent when perflock
89      * acquire succeeds
90      */
91     int arg = 0x4601;
92 
93     if (m_perf_lock_acquire && state == true) {
94         m_perf_handle = m_perf_lock_acquire(0, 0, &arg, sizeof(arg) / sizeof(int));
95         DEBUG_PRINT_INFO("Video encode perflock acquired,handle=%d",m_perf_handle);
96     } else if (m_perf_lock_release && state == false) {
97         m_perf_lock_release(m_perf_handle);
98         DEBUG_PRINT_INFO("Video encode perflock released");
99     }
100 }
101 
load_lib()102 bool omx_venc::perf_control::load_lib()
103 {
104     char perf_lib_path[PROPERTY_VALUE_MAX] = {0};
105     if (m_perf_lib)
106         return true;
107 
108     if ((property_get("ro.vendor.extension_library", perf_lib_path, NULL) <= 0)) {
109         DEBUG_PRINT_ERROR("vendor library not set in ro.vendor.extension_library");
110         goto handle_err;
111     }
112     if ((m_perf_lib = dlopen(perf_lib_path, RTLD_NOW)) == NULL) {
113         DEBUG_PRINT_ERROR("Failed to open %s : %s",perf_lib_path, dlerror());
114         goto handle_err;
115     } else {
116         m_perf_lock_acquire = (perf_lock_acquire_t)dlsym(m_perf_lib, "perf_lock_acq");
117         if (m_perf_lock_acquire == NULL) {
118             DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_acq");
119             goto handle_err;
120         }
121         m_perf_lock_release = (perf_lock_release_t)dlsym(m_perf_lib, "perf_lock_rel");
122         if (m_perf_lock_release == NULL) {
123             DEBUG_PRINT_ERROR("Failed to load symbol: perf_lock_rel");
124             goto handle_err;
125         }
126     }
127     return true;
128 
129 handle_err:
130     if(m_perf_lib != NULL) {
131         dlclose(m_perf_lib);
132     }
133     return false;
134 }
135 
136 //constructor
137 
omx_venc()138 omx_venc::omx_venc()
139 {
140 #ifdef _ANDROID_ICS_
141     meta_mode_enable = false;
142     memset(meta_buffer_hdr,0,sizeof(meta_buffer_hdr));
143     memset(meta_buffers,0,sizeof(meta_buffers));
144     memset(opaque_buffer_hdr,0,sizeof(opaque_buffer_hdr));
145     mUseProxyColorFormat = false;
146     get_syntaxhdr_enable = false;
147 #endif
148     bframes = entropy = 0;
149     char property_value[PROPERTY_VALUE_MAX] = {0};
150     property_get("vidc.debug.level", property_value, "1");
151     debug_level = atoi(property_value);
152     property_value[0] = '\0';
153     property_get("vidc.debug.bframes", property_value, "0");
154     bframes = atoi(property_value);
155     property_value[0] = '\0';
156     property_get("vidc.debug.entropy", property_value, "1");
157     entropy = !!atoi(property_value);
158     property_value[0] = '\0';
159     property_get("vidc.debug.perf.mode", property_value, "0");
160     perfmode = atoi(property_value);
161     property_value[0] = '\0';
162     handle = NULL;
163     m_perf_control.send_hint_to_mpctl(true);
164 }
165 
~omx_venc()166 omx_venc::~omx_venc()
167 {
168     get_syntaxhdr_enable = false;
169     m_perf_control.send_hint_to_mpctl(false);
170     //nothing to do
171 }
172 
173 /* ======================================================================
174    FUNCTION
175    omx_venc::ComponentInit
176 
177    DESCRIPTION
178    Initialize the component.
179 
180    PARAMETERS
181    ctxt -- Context information related to the self.
182    id   -- Event identifier. This could be any of the following:
183    1. Command completion event
184    2. Buffer done callback event
185    3. Frame done callback event
186 
187    RETURN VALUE
188    None.
189 
190    ========================================================================== */
component_init(OMX_STRING role)191 OMX_ERRORTYPE omx_venc::component_init(OMX_STRING role)
192 {
193 
194     OMX_ERRORTYPE eRet = OMX_ErrorNone;
195 
196     int fds[2];
197     int r;
198 
199     OMX_VIDEO_CODINGTYPE codec_type;
200 
201     DEBUG_PRINT_HIGH("omx_venc(): Inside component_init()");
202     // Copy the role information which provides the decoder m_nkind
203     strlcpy((char *)m_nkind,role,OMX_MAX_STRINGNAME_SIZE);
204     secure_session = false;
205 
206     if (!strncmp((char *)m_nkind,"OMX.qcom.video.encoder.mpeg4",\
207                 OMX_MAX_STRINGNAME_SIZE)) {
208         strlcpy((char *)m_cRole, "video_encoder.mpeg4",\
209                 OMX_MAX_STRINGNAME_SIZE);
210         codec_type = OMX_VIDEO_CodingMPEG4;
211     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
212                 OMX_MAX_STRINGNAME_SIZE)) {
213         strlcpy((char *)m_cRole, "video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
214         codec_type = OMX_VIDEO_CodingH263;
215     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
216                 OMX_MAX_STRINGNAME_SIZE)) {
217         strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
218         codec_type = OMX_VIDEO_CodingAVC;
219     } else if(!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
220                 OMX_MAX_STRINGNAME_SIZE)) {
221         strlcpy((char *)m_cRole, "video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
222         codec_type = OMX_VIDEO_CodingAVC;
223         secure_session = true;
224     }
225 #ifdef _MSM8974_
226     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",    \
227                 OMX_MAX_STRINGNAME_SIZE)) {
228         strlcpy((char *)m_cRole, "video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
229         codec_type = OMX_VIDEO_CodingVP8;
230     }
231 #endif
232     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",    \
233                 OMX_MAX_STRINGNAME_SIZE)) {
234         strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
235         codec_type = OMX_VIDEO_CodingHEVC;
236     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc.secure",    \
237                 OMX_MAX_STRINGNAME_SIZE)) {
238         strlcpy((char *)m_cRole, "video_encoder.hevc", OMX_MAX_STRINGNAME_SIZE);
239         codec_type = OMX_VIDEO_CodingHEVC;
240         secure_session = true;
241     } else {
242         DEBUG_PRINT_ERROR("ERROR: Unknown Component");
243         eRet = OMX_ErrorInvalidComponentName;
244     }
245 
246     if (eRet != OMX_ErrorNone) {
247         return eRet;
248     }
249 #ifdef ENABLE_GET_SYNTAX_HDR
250     get_syntaxhdr_enable = true;
251     DEBUG_PRINT_HIGH("Get syntax header enabled");
252 #endif
253 
254     handle = new venc_dev(this);
255 
256     if (handle == NULL) {
257         DEBUG_PRINT_ERROR("ERROR: handle is NULL");
258         return OMX_ErrorInsufficientResources;
259     }
260 
261     if (handle->venc_open(codec_type) != true) {
262         DEBUG_PRINT_ERROR("ERROR: venc_open failed");
263         eRet = OMX_ErrorInsufficientResources;
264         goto init_error;
265     }
266 
267     //Intialise the OMX layer variables
268     memset(&m_pCallbacks,0,sizeof(OMX_CALLBACKTYPE));
269 
270     OMX_INIT_STRUCT(&m_sPortParam, OMX_PORT_PARAM_TYPE);
271     m_sPortParam.nPorts = 0x2;
272     m_sPortParam.nStartPortNumber = (OMX_U32) PORT_INDEX_IN;
273 
274     OMX_INIT_STRUCT(&m_sPortParam_audio, OMX_PORT_PARAM_TYPE);
275     m_sPortParam_audio.nPorts = 0;
276     m_sPortParam_audio.nStartPortNumber = 0;
277 
278     OMX_INIT_STRUCT(&m_sPortParam_img, OMX_PORT_PARAM_TYPE);
279     m_sPortParam_img.nPorts = 0;
280     m_sPortParam_img.nStartPortNumber = 0;
281 
282     OMX_INIT_STRUCT(&m_sParamBitrate, OMX_VIDEO_PARAM_BITRATETYPE);
283     m_sParamBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
284     m_sParamBitrate.eControlRate = OMX_Video_ControlRateVariableSkipFrames;
285     m_sParamBitrate.nTargetBitrate = 64000;
286 
287     OMX_INIT_STRUCT(&m_sConfigBitrate, OMX_VIDEO_CONFIG_BITRATETYPE);
288     m_sConfigBitrate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
289     m_sConfigBitrate.nEncodeBitrate = 64000;
290 
291     OMX_INIT_STRUCT(&m_sConfigFramerate, OMX_CONFIG_FRAMERATETYPE);
292     m_sConfigFramerate.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
293     m_sConfigFramerate.xEncodeFramerate = 30 << 16;
294 
295     OMX_INIT_STRUCT(&m_sConfigIntraRefreshVOP, OMX_CONFIG_INTRAREFRESHVOPTYPE);
296     m_sConfigIntraRefreshVOP.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
297     m_sConfigIntraRefreshVOP.IntraRefreshVOP = OMX_FALSE;
298 
299     OMX_INIT_STRUCT(&m_sConfigFrameRotation, OMX_CONFIG_ROTATIONTYPE);
300     m_sConfigFrameRotation.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
301     m_sConfigFrameRotation.nRotation = 0;
302 
303     OMX_INIT_STRUCT(&m_sSessionQuantization, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
304     m_sSessionQuantization.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
305     m_sSessionQuantization.nQpI = 9;
306     m_sSessionQuantization.nQpP = 6;
307     m_sSessionQuantization.nQpB = 2;
308 
309     OMX_INIT_STRUCT(&m_sSessionQPRange, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
310     m_sSessionQPRange.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
311     m_sSessionQPRange.minQP = 2;
312     if (codec_type == OMX_VIDEO_CodingAVC)
313         m_sSessionQPRange.maxQP = 51;
314     else
315         m_sSessionQPRange.maxQP = 31;
316 
317     OMX_INIT_STRUCT(&m_sAVCSliceFMO, OMX_VIDEO_PARAM_AVCSLICEFMO);
318     m_sAVCSliceFMO.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
319     m_sAVCSliceFMO.eSliceMode = OMX_VIDEO_SLICEMODE_AVCDefault;
320     m_sAVCSliceFMO.nNumSliceGroups = 0;
321     m_sAVCSliceFMO.nSliceGroupMapType = 0;
322     OMX_INIT_STRUCT(&m_sParamProfileLevel, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
323     m_sParamProfileLevel.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
324 
325     OMX_INIT_STRUCT(&m_sIntraperiod, QOMX_VIDEO_INTRAPERIODTYPE);
326     m_sIntraperiod.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
327     m_sIntraperiod.nPFrames = (m_sConfigFramerate.xEncodeFramerate * 2) - 1;
328 
329     OMX_INIT_STRUCT(&m_sErrorCorrection, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
330     m_sErrorCorrection.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
331     m_sErrorCorrection.bEnableDataPartitioning = OMX_FALSE;
332     m_sErrorCorrection.bEnableHEC = OMX_FALSE;
333     m_sErrorCorrection.bEnableResync = OMX_FALSE;
334     m_sErrorCorrection.bEnableRVLC = OMX_FALSE;
335     m_sErrorCorrection.nResynchMarkerSpacing = 0;
336 
337     OMX_INIT_STRUCT(&m_sIntraRefresh, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
338     m_sIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
339     m_sIntraRefresh.eRefreshMode = OMX_VIDEO_IntraRefreshMax;
340 
341     OMX_INIT_STRUCT(&m_sConfigIntraRefresh, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE);
342     m_sConfigIntraRefresh.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
343     m_sConfigIntraRefresh.nRefreshPeriod = 0;
344 
345     OMX_INIT_STRUCT(&m_sConfigColorAspects, DescribeColorAspectsParams);
346     m_sConfigColorAspects.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
347     m_sConfigColorAspects.sAspects.mRange =  ColorAspects::RangeUnspecified;
348     m_sConfigColorAspects.sAspects.mPrimaries = ColorAspects::PrimariesUnspecified;
349     m_sConfigColorAspects.sAspects.mMatrixCoeffs = ColorAspects::MatrixUnspecified;
350     m_sConfigColorAspects.sAspects.mTransfer = ColorAspects::TransferUnspecified;
351 
352     if (codec_type == OMX_VIDEO_CodingMPEG4) {
353         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_MPEG4ProfileSimple;
354         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_MPEG4Level0;
355     } else if (codec_type == OMX_VIDEO_CodingH263) {
356         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_H263ProfileBaseline;
357         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_H263Level10;
358     } else if (codec_type == OMX_VIDEO_CodingAVC) {
359         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_AVCProfileBaseline;
360         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_AVCLevel1;
361     } else if (codec_type == OMX_VIDEO_CodingVP8) {
362         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_VP8ProfileMain;
363         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_VP8Level_Version0;
364     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
365         m_sParamProfileLevel.eProfile = (OMX_U32) OMX_VIDEO_HEVCProfileMain;
366         m_sParamProfileLevel.eLevel = (OMX_U32) OMX_VIDEO_HEVCMainTierLevel1;
367     }
368 
369     // Initialize the video parameters for input port
370     OMX_INIT_STRUCT(&m_sInPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
371     m_sInPortDef.nPortIndex= (OMX_U32) PORT_INDEX_IN;
372     m_sInPortDef.bEnabled = OMX_TRUE;
373     m_sInPortDef.bPopulated = OMX_FALSE;
374     m_sInPortDef.eDomain = OMX_PortDomainVideo;
375     m_sInPortDef.eDir = OMX_DirInput;
376     m_sInPortDef.format.video.cMIMEType = (char *)"YUV420";
377     m_sInPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
378     m_sInPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
379     m_sInPortDef.format.video.nStride = OMX_CORE_QCIF_WIDTH;
380     m_sInPortDef.format.video.nSliceHeight = OMX_CORE_QCIF_HEIGHT;
381     m_sInPortDef.format.video.nBitrate = 64000;
382     m_sInPortDef.format.video.xFramerate = 15 << 16;
383     m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
384         QOMX_DEFAULT_COLOR_FMT;
385     m_sInPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingUnused;
386 
387     if (dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
388                 &m_sInPortDef.nBufferCountActual,
389                 &m_sInPortDef.nBufferSize,
390                 m_sInPortDef.nPortIndex) != true) {
391         eRet = OMX_ErrorUndefined;
392         goto init_error;
393     }
394 
395     // Initialize the video parameters for output port
396     OMX_INIT_STRUCT(&m_sOutPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
397     m_sOutPortDef.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
398     m_sOutPortDef.bEnabled = OMX_TRUE;
399     m_sOutPortDef.bPopulated = OMX_FALSE;
400     m_sOutPortDef.eDomain = OMX_PortDomainVideo;
401     m_sOutPortDef.eDir = OMX_DirOutput;
402     m_sOutPortDef.format.video.nFrameWidth = OMX_CORE_QCIF_WIDTH;
403     m_sOutPortDef.format.video.nFrameHeight = OMX_CORE_QCIF_HEIGHT;
404     m_sOutPortDef.format.video.nBitrate = 64000;
405     m_sOutPortDef.format.video.xFramerate = 15 << 16;
406     m_sOutPortDef.format.video.eColorFormat =  OMX_COLOR_FormatUnused;
407     if (codec_type == OMX_VIDEO_CodingMPEG4) {
408         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
409     } else if (codec_type == OMX_VIDEO_CodingH263) {
410         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingH263;
411     } else if (codec_type == OMX_VIDEO_CodingAVC) {
412         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingAVC;
413     } else if (codec_type == OMX_VIDEO_CodingVP8) {
414         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingVP8;
415     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
416         m_sOutPortDef.format.video.eCompressionFormat =  OMX_VIDEO_CodingHEVC;
417     }
418 
419     if (dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
420                 &m_sOutPortDef.nBufferCountActual,
421                 &m_sOutPortDef.nBufferSize,
422                 m_sOutPortDef.nPortIndex) != true) {
423         eRet = OMX_ErrorUndefined;
424     }
425 
426     // Initialize the video color format for input port
427     OMX_INIT_STRUCT(&m_sInPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
428     m_sInPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_IN;
429     m_sInPortFormat.nIndex = 0;
430     m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
431         QOMX_DEFAULT_COLOR_FMT;
432     m_sInPortFormat.eCompressionFormat = OMX_VIDEO_CodingUnused;
433 
434 
435     // Initialize the compression format for output port
436     OMX_INIT_STRUCT(&m_sOutPortFormat, OMX_VIDEO_PARAM_PORTFORMATTYPE);
437     m_sOutPortFormat.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
438     m_sOutPortFormat.nIndex = 0;
439     m_sOutPortFormat.eColorFormat = OMX_COLOR_FormatUnused;
440     if (codec_type == OMX_VIDEO_CodingMPEG4) {
441         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingMPEG4;
442     } else if (codec_type == OMX_VIDEO_CodingH263) {
443         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingH263;
444     } else if (codec_type == OMX_VIDEO_CodingAVC) {
445         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingAVC;
446     } else if (codec_type == OMX_VIDEO_CodingVP8) {
447         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingVP8;
448     } else if (codec_type == OMX_VIDEO_CodingHEVC) {
449         m_sOutPortFormat.eCompressionFormat =  OMX_VIDEO_CodingHEVC;
450     }
451 
452     // mandatory Indices for kronos test suite
453     OMX_INIT_STRUCT(&m_sPriorityMgmt, OMX_PRIORITYMGMTTYPE);
454 
455     OMX_INIT_STRUCT(&m_sInBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
456     m_sInBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_IN;
457 
458     OMX_INIT_STRUCT(&m_sOutBufSupplier, OMX_PARAM_BUFFERSUPPLIERTYPE);
459     m_sOutBufSupplier.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
460 
461     OMX_INIT_STRUCT(&m_sParamInitqp, QOMX_EXTNINDEX_VIDEO_INITIALQP);
462     m_sParamInitqp.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
463 
464     // mp4 specific init
465     OMX_INIT_STRUCT(&m_sParamMPEG4, OMX_VIDEO_PARAM_MPEG4TYPE);
466     m_sParamMPEG4.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
467     m_sParamMPEG4.eProfile = OMX_VIDEO_MPEG4ProfileSimple;
468     m_sParamMPEG4.eLevel = OMX_VIDEO_MPEG4Level0;
469     m_sParamMPEG4.nSliceHeaderSpacing = 0;
470     m_sParamMPEG4.bSVH = OMX_FALSE;
471     m_sParamMPEG4.bGov = OMX_FALSE;
472     m_sParamMPEG4.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1);  // 2 second intra period for default outport fps
473     m_sParamMPEG4.bACPred = OMX_TRUE;
474     m_sParamMPEG4.nTimeIncRes = 30; // delta = 2 @ 15 fps
475     m_sParamMPEG4.nAllowedPictureTypes = 2; // pframe and iframe
476     m_sParamMPEG4.nHeaderExtension = 1; // number of video packet headers per vop
477     m_sParamMPEG4.bReversibleVLC = OMX_FALSE;
478 
479     // h263 specific init
480     OMX_INIT_STRUCT(&m_sParamH263, OMX_VIDEO_PARAM_H263TYPE);
481     m_sParamH263.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
482     m_sParamH263.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
483     m_sParamH263.nBFrames = 0;
484     m_sParamH263.eProfile = OMX_VIDEO_H263ProfileBaseline;
485     m_sParamH263.eLevel = OMX_VIDEO_H263Level10;
486     m_sParamH263.bPLUSPTYPEAllowed = OMX_FALSE;
487     m_sParamH263.nAllowedPictureTypes = 2;
488     m_sParamH263.bForceRoundingTypeToZero = OMX_TRUE;
489     m_sParamH263.nPictureHeaderRepetition = 0;
490     m_sParamH263.nGOBHeaderInterval = 1;
491 
492     // h264 specific init
493     OMX_INIT_STRUCT(&m_sParamAVC, OMX_VIDEO_PARAM_AVCTYPE);
494     m_sParamAVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
495     m_sParamAVC.nSliceHeaderSpacing = 0;
496     m_sParamAVC.nPFrames = (m_sOutPortFormat.xFramerate * 2 - 1); // 2 second intra period for default outport fps
497     m_sParamAVC.nBFrames = 0;
498     m_sParamAVC.bUseHadamard = OMX_FALSE;
499     m_sParamAVC.nRefIdx10ActiveMinus1 = 1;
500     m_sParamAVC.nRefIdx11ActiveMinus1 = 0;
501     m_sParamAVC.bEnableUEP = OMX_FALSE;
502     m_sParamAVC.bEnableFMO = OMX_FALSE;
503     m_sParamAVC.bEnableASO = OMX_FALSE;
504     m_sParamAVC.bEnableRS = OMX_FALSE;
505     m_sParamAVC.eProfile = OMX_VIDEO_AVCProfileBaseline;
506     m_sParamAVC.eLevel = OMX_VIDEO_AVCLevel1;
507     m_sParamAVC.nAllowedPictureTypes = 2;
508     m_sParamAVC.bFrameMBsOnly = OMX_FALSE;
509     m_sParamAVC.bMBAFF = OMX_FALSE;
510     m_sParamAVC.bEntropyCodingCABAC = OMX_FALSE;
511     m_sParamAVC.bWeightedPPrediction = OMX_FALSE;
512     m_sParamAVC.nWeightedBipredicitonMode = 0;
513     m_sParamAVC.bconstIpred = OMX_FALSE;
514     m_sParamAVC.bDirect8x8Inference = OMX_FALSE;
515     m_sParamAVC.bDirectSpatialTemporal = OMX_FALSE;
516     m_sParamAVC.nCabacInitIdc = 0;
517     m_sParamAVC.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable;
518 
519     // VP8 specific init
520     OMX_INIT_STRUCT(&m_sParamVP8, OMX_VIDEO_PARAM_VP8TYPE);
521     m_sParamVP8.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
522     m_sParamVP8.eProfile = OMX_VIDEO_VP8ProfileMain;
523     m_sParamVP8.eLevel = OMX_VIDEO_VP8Level_Version0;
524     m_sParamVP8.nDCTPartitions = 0;
525     m_sParamVP8.bErrorResilientMode = OMX_FALSE;
526 
527     // HEVC specific init
528     OMX_INIT_STRUCT(&m_sParamHEVC, OMX_VIDEO_PARAM_HEVCTYPE);
529     m_sParamHEVC.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
530     m_sParamHEVC.eProfile =  OMX_VIDEO_HEVCProfileMain;
531     m_sParamHEVC.eLevel =  OMX_VIDEO_HEVCMainTierLevel1;
532 
533     OMX_INIT_STRUCT(&m_sParamLTRMode, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
534     m_sParamLTRMode.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
535     m_sParamLTRMode.eLTRMode = QOMX_VIDEO_LTRMode_Disable;
536 
537     OMX_INIT_STRUCT(&m_sParamLTRCount, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
538     m_sParamLTRCount.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
539     m_sParamLTRCount.nCount = 0;
540 
541     OMX_INIT_STRUCT(&m_sConfigDeinterlace, OMX_VIDEO_CONFIG_DEINTERLACE);
542     m_sConfigDeinterlace.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
543     m_sConfigDeinterlace.nEnable = OMX_FALSE;
544 
545     OMX_INIT_STRUCT(&m_sHierLayers, QOMX_VIDEO_HIERARCHICALLAYERS);
546     m_sHierLayers.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
547     m_sHierLayers.nNumLayers = 0;
548     m_sHierLayers.eHierarchicalCodingType = QOMX_HIERARCHICALCODING_P;
549 
550     OMX_INIT_STRUCT(&m_sMBIStatistics, OMX_QOMX_VIDEO_MBI_STATISTICS);
551     m_sMBIStatistics.nPortIndex = (OMX_U32) PORT_INDEX_OUT;
552     m_sMBIStatistics.eMBIStatisticsType = QOMX_MBI_STATISTICS_MODE_DEFAULT;
553 
554     OMX_INIT_STRUCT(&m_sParamTemporalLayers, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE);
555     m_sParamTemporalLayers.eSupportedPatterns = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid;
556 
557     OMX_INIT_STRUCT(&m_sConfigTemporalLayers, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE);
558 
559     OMX_INIT_STRUCT(&m_sParamAVTimerTimestampMode, QOMX_ENABLETYPE);
560     m_sParamAVTimerTimestampMode.bEnable = OMX_FALSE;
561 
562     m_state                   = OMX_StateLoaded;
563     m_sExtraData = 0;
564 
565     if (eRet == OMX_ErrorNone) {
566         if (pipe(fds)) {
567             DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
568             eRet = OMX_ErrorInsufficientResources;
569         } else {
570             if (fds[0] == 0 || fds[1] == 0) {
571                 if (pipe(fds)) {
572                     DEBUG_PRINT_ERROR("ERROR: pipe creation failed");
573                     eRet = OMX_ErrorInsufficientResources;
574                 }
575             }
576             if (eRet == OMX_ErrorNone) {
577                 m_pipe_in = fds[0];
578                 m_pipe_out = fds[1];
579             }
580         }
581         msg_thread_created = true;
582         r = pthread_create(&msg_thread_id,0, message_thread, this);
583         if (r < 0) {
584             eRet = OMX_ErrorInsufficientResources;
585             msg_thread_created = false;
586         } else {
587             async_thread_created = true;
588             r = pthread_create(&async_thread_id,0, venc_dev::async_venc_message_thread, this);
589             if (r < 0) {
590                 eRet = OMX_ErrorInsufficientResources;
591                 async_thread_created = false;
592             } else
593                 dev_set_message_thread_id(async_thread_id);
594         }
595     }
596 
597     if (perfmode) {
598         QOMX_EXTNINDEX_VIDEO_PERFMODE pParam;
599         pParam.nPerfMode = perfmode;
600         DEBUG_PRINT_LOW("Perfmode = 0x%x", pParam.nPerfMode);
601         if (!handle->venc_set_config(&pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode))
602             DEBUG_PRINT_ERROR("Failed setting PerfMode to %d", pParam.nPerfMode);
603     }
604 
605     DEBUG_PRINT_INFO("Component_init : %s : return = 0x%x", m_nkind, eRet);
606 
607     {
608         VendorExtensionStore *extStore = const_cast<VendorExtensionStore *>(&mVendorExtensionStore);
609         init_vendor_extensions(*extStore);
610         mVendorExtensionStore.dumpExtensions((const char *)m_nkind);
611     }
612 
613     return eRet;
614 init_error:
615     handle->venc_close();
616     delete handle;
617     handle = NULL;
618     return eRet;
619 }
620 
621 
622 /* ======================================================================
623    FUNCTION
624    omx_venc::Setparameter
625 
626    DESCRIPTION
627    OMX Set Parameter method implementation.
628 
629    PARAMETERS
630    <TBD>.
631 
632    RETURN VALUE
633    OMX Error None if successful.
634 
635    ========================================================================== */
set_parameter(OMX_IN OMX_HANDLETYPE hComp,OMX_IN OMX_INDEXTYPE paramIndex,OMX_IN OMX_PTR paramData)636 OMX_ERRORTYPE  omx_venc::set_parameter(OMX_IN OMX_HANDLETYPE     hComp,
637         OMX_IN OMX_INDEXTYPE paramIndex,
638         OMX_IN OMX_PTR        paramData)
639 {
640     (void)hComp;
641     OMX_ERRORTYPE eRet = OMX_ErrorNone;
642 
643 
644     if (m_state == OMX_StateInvalid) {
645         DEBUG_PRINT_ERROR("ERROR: Set Param in Invalid State");
646         return OMX_ErrorInvalidState;
647     }
648     if (paramData == NULL) {
649         DEBUG_PRINT_ERROR("ERROR: Get Param in Invalid paramData");
650         return OMX_ErrorBadParameter;
651     }
652 
653     /*set_parameter can be called in loaded state
654       or disabled port */
655     if (m_state == OMX_StateLoaded
656             || m_sInPortDef.bEnabled == OMX_FALSE
657             || m_sOutPortDef.bEnabled == OMX_FALSE) {
658         DEBUG_PRINT_LOW("Set Parameter called in valid state");
659     } else {
660         DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
661         return OMX_ErrorIncorrectStateOperation;
662     }
663 
664     switch ((int)paramIndex) {
665         case OMX_IndexParamPortDefinition:
666             {
667                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_PORTDEFINITIONTYPE);
668                 OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
669                 portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
670                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPortDefinition H= %d, W = %d",
671                         (int)portDefn->format.video.nFrameHeight,
672                         (int)portDefn->format.video.nFrameWidth);
673 
674                 if (PORT_INDEX_IN == portDefn->nPortIndex) {
675                     if (!dev_is_video_session_supported(portDefn->format.video.nFrameWidth,
676                                 portDefn->format.video.nFrameHeight)) {
677                         DEBUG_PRINT_ERROR("video session not supported");
678                         omx_report_unsupported_setting();
679                         return OMX_ErrorUnsupportedSetting;
680                     }
681                     DEBUG_PRINT_LOW("i/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
682                     DEBUG_PRINT_LOW("i/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
683                     DEBUG_PRINT_LOW("i/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
684                     if (portDefn->nBufferCountActual > MAX_NUM_INPUT_BUFFERS) {
685                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) actual count (%u) exceeds max(%u)",
686                                 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_INPUT_BUFFERS);
687                         return OMX_ErrorUnsupportedSetting;
688                     }
689                     if (m_inp_mem_ptr &&
690                             (portDefn->nBufferCountActual != m_sInPortDef.nBufferCountActual ||
691                             portDefn->nBufferSize != m_sInPortDef.nBufferSize)) {
692                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) buffer count/size can change only if port is unallocated !");
693                         return OMX_ErrorInvalidState;
694                     }
695                     if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
696                         DEBUG_PRINT_ERROR("ERROR: (In_PORT) Min buffers (%u) > actual count (%u)",
697                                 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
698                         return OMX_ErrorUnsupportedSetting;
699                     }
700                     if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
701                         DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed");
702                         return handle->hw_overload ? OMX_ErrorInsufficientResources :
703                                 OMX_ErrorUnsupportedSetting;
704                     }
705 
706                     DEBUG_PRINT_LOW("i/p previous actual cnt = %u", (unsigned int)m_sInPortDef.nBufferCountActual);
707                     DEBUG_PRINT_LOW("i/p previous min cnt = %u", (unsigned int)m_sInPortDef.nBufferCountMin);
708                     memcpy(&m_sInPortDef, portDefn,sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
709 
710 #ifdef _ANDROID_ICS_
711                     if (portDefn->format.video.eColorFormat ==
712                             (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
713                         m_sInPortDef.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)
714                             QOMX_DEFAULT_COLOR_FMT;
715                         if (!mUseProxyColorFormat) {
716                             if (!c2d_conv.init()) {
717                                 DEBUG_PRINT_ERROR("C2D init failed");
718                                 return OMX_ErrorUnsupportedSetting;
719                             }
720                             DEBUG_PRINT_HIGH("C2D init is successful");
721                         }
722                         mUseProxyColorFormat = true;
723                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
724                     } else
725                         mUseProxyColorFormat = false;
726 #endif
727                     /*Query Input Buffer Requirements*/
728                     dev_get_buf_req   (&m_sInPortDef.nBufferCountMin,
729                             &m_sInPortDef.nBufferCountActual,
730                             &m_sInPortDef.nBufferSize,
731                             m_sInPortDef.nPortIndex);
732 
733                     /*Query ouput Buffer Requirements*/
734                     dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
735                             &m_sOutPortDef.nBufferCountActual,
736                             &m_sOutPortDef.nBufferSize,
737                             m_sOutPortDef.nPortIndex);
738                     m_sInPortDef.nBufferCountActual = portDefn->nBufferCountActual;
739                 } else if (PORT_INDEX_OUT == portDefn->nPortIndex) {
740                     DEBUG_PRINT_LOW("o/p actual cnt requested = %u", (unsigned int)portDefn->nBufferCountActual);
741                     DEBUG_PRINT_LOW("o/p min cnt requested = %u", (unsigned int)portDefn->nBufferCountMin);
742                     DEBUG_PRINT_LOW("o/p buffersize requested = %u", (unsigned int)portDefn->nBufferSize);
743 
744                     if (portDefn->nBufferCountActual > MAX_NUM_OUTPUT_BUFFERS) {
745                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) actual count (%u) exceeds max(%u)",
746                                 (unsigned int)portDefn->nBufferCountActual, (unsigned int)MAX_NUM_OUTPUT_BUFFERS);
747                         return OMX_ErrorUnsupportedSetting;
748                     }
749                     if (m_out_mem_ptr &&
750                             (portDefn->nBufferCountActual != m_sOutPortDef.nBufferCountActual ||
751                             portDefn->nBufferSize != m_sOutPortDef.nBufferSize)) {
752                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) buffer count/size can change only if port is unallocated !");
753                         return OMX_ErrorInvalidState;
754                     }
755 
756                     if (portDefn->nBufferCountMin > portDefn->nBufferCountActual) {
757                         DEBUG_PRINT_ERROR("ERROR: (Out_PORT) Min buffers (%u) > actual count (%u)",
758                                 (unsigned int)portDefn->nBufferCountMin, (unsigned int)portDefn->nBufferCountActual);
759                         return OMX_ErrorUnsupportedSetting;
760                     }
761                     if (handle->venc_set_param(paramData,OMX_IndexParamPortDefinition) != true) {
762                         DEBUG_PRINT_ERROR("ERROR: venc_set_param output failed");
763                         return OMX_ErrorUnsupportedSetting;
764                     }
765                     memcpy(&m_sOutPortDef,portDefn,sizeof(struct OMX_PARAM_PORTDEFINITIONTYPE));
766 #ifdef _MSM8974_
767                     /*Query ouput Buffer Requirements*/
768                     dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
769                             &m_sOutPortDef.nBufferCountActual,
770                             &m_sOutPortDef.nBufferSize,
771                             m_sOutPortDef.nPortIndex);
772 #endif
773                     update_profile_level(); //framerate , bitrate
774 
775                     DEBUG_PRINT_LOW("o/p previous actual cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountActual);
776                     DEBUG_PRINT_LOW("o/p previous min cnt = %u", (unsigned int)m_sOutPortDef.nBufferCountMin);
777                     m_sOutPortDef.nBufferCountActual = portDefn->nBufferCountActual;
778                 } else {
779                     DEBUG_PRINT_ERROR("ERROR: Set_parameter: Bad Port idx %d",
780                             (int)portDefn->nPortIndex);
781                     eRet = OMX_ErrorBadPortIndex;
782                 }
783                 m_sConfigFramerate.xEncodeFramerate = portDefn->format.video.xFramerate;
784                 m_sConfigBitrate.nEncodeBitrate = portDefn->format.video.nBitrate;
785                 m_sParamBitrate.nTargetBitrate = portDefn->format.video.nBitrate;
786             }
787             break;
788 
789         case OMX_IndexParamVideoPortFormat:
790             {
791                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PORTFORMATTYPE);
792                 OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt =
793                     (OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
794                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
795                         portFmt->eColorFormat);
796                 //set the driver with the corresponding values
797                 if (PORT_INDEX_IN == portFmt->nPortIndex) {
798                     if (handle->venc_set_param(paramData,OMX_IndexParamVideoPortFormat) != true) {
799                         return OMX_ErrorUnsupportedSetting;
800                     }
801 
802                     DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoPortFormat %d",
803                             portFmt->eColorFormat);
804                     update_profile_level(); //framerate
805 
806 #ifdef _ANDROID_ICS_
807                     if (portFmt->eColorFormat ==
808                             (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FormatAndroidOpaque) {
809                         m_sInPortFormat.eColorFormat = (OMX_COLOR_FORMATTYPE)
810                             QOMX_DEFAULT_COLOR_FMT;
811                         if (!mUseProxyColorFormat) {
812                             if (!c2d_conv.init()) {
813                                 DEBUG_PRINT_ERROR("C2D init failed");
814                                 return OMX_ErrorUnsupportedSetting;
815                             }
816                             DEBUG_PRINT_HIGH("C2D init is successful");
817                         }
818                         mUseProxyColorFormat = true;
819                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB_OPQ;
820                     } else
821 #endif
822                     {
823                         m_sInPortFormat.eColorFormat = portFmt->eColorFormat;
824                         m_sInPortDef.format.video.eColorFormat = portFmt->eColorFormat;
825                         m_input_msg_id = OMX_COMPONENT_GENERATE_ETB;
826                         mUseProxyColorFormat = false;
827                     }
828                     m_sInPortFormat.xFramerate = portFmt->xFramerate;
829                 }
830                 //TODO if no use case for O/P port,delet m_sOutPortFormat
831             }
832             break;
833         case OMX_IndexParamVideoInit:
834             { //TODO, do we need this index set param
835                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PORT_PARAM_TYPE);
836                 OMX_PORT_PARAM_TYPE* pParam = (OMX_PORT_PARAM_TYPE*)(paramData);
837                 DEBUG_PRINT_LOW("Set OMX_IndexParamVideoInit called");
838                 break;
839             }
840 
841         case OMX_IndexParamVideoBitrate:
842             {
843                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_BITRATETYPE);
844                 OMX_VIDEO_PARAM_BITRATETYPE* pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
845                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoBitrate");
846                 if (handle->venc_set_param(paramData,OMX_IndexParamVideoBitrate) != true) {
847                     return OMX_ErrorUnsupportedSetting;
848                 }
849                 m_sParamBitrate.nTargetBitrate = pParam->nTargetBitrate;
850                 m_sParamBitrate.eControlRate = pParam->eControlRate;
851                 update_profile_level(); //bitrate
852                 m_sConfigBitrate.nEncodeBitrate = pParam->nTargetBitrate;
853                 m_sInPortDef.format.video.nBitrate = pParam->nTargetBitrate;
854                 m_sOutPortDef.format.video.nBitrate = pParam->nTargetBitrate;
855                 DEBUG_PRINT_LOW("bitrate = %u", (unsigned int)m_sOutPortDef.format.video.nBitrate);
856                 break;
857             }
858         case OMX_IndexParamVideoMpeg4:
859             {
860                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_MPEG4TYPE);
861                 OMX_VIDEO_PARAM_MPEG4TYPE* pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
862                 OMX_VIDEO_PARAM_MPEG4TYPE mp4_param;
863                 memcpy(&mp4_param, pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
864                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoMpeg4");
865                 if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
866 #ifdef _MSM8974_
867                     if (pParam->nBFrames || bframes)
868                         mp4_param.nBFrames = 1;
869                     else
870                         mp4_param.nBFrames = 0;
871                     DEBUG_PRINT_HIGH("MPEG4: %u BFrames are being set", (unsigned int)mp4_param.nBFrames);
872 #endif
873                 } else {
874                     if (pParam->nBFrames) {
875                         DEBUG_PRINT_ERROR("Warning: B frames not supported");
876                         mp4_param.nBFrames = 0;
877                     }
878                 }
879                 if (handle->venc_set_param(&mp4_param,OMX_IndexParamVideoMpeg4) != true) {
880                     return OMX_ErrorUnsupportedSetting;
881                 }
882                 memcpy(&m_sParamMPEG4,pParam, sizeof(struct OMX_VIDEO_PARAM_MPEG4TYPE));
883                 m_sIntraperiod.nPFrames = m_sParamMPEG4.nPFrames;
884                 if (pParam->nBFrames || bframes)
885                     m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames = mp4_param.nBFrames;
886                 else
887                     m_sIntraperiod.nBFrames = m_sParamMPEG4.nBFrames;
888                 break;
889             }
890         case OMX_IndexParamVideoH263:
891             {
892                 OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
893                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoH263");
894                 if (handle->venc_set_param(paramData,OMX_IndexParamVideoH263) != true) {
895                     return OMX_ErrorUnsupportedSetting;
896                 }
897                 memcpy(&m_sParamH263,pParam, sizeof(struct OMX_VIDEO_PARAM_H263TYPE));
898                 m_sIntraperiod.nPFrames = m_sParamH263.nPFrames;
899                 m_sIntraperiod.nBFrames = m_sParamH263.nBFrames;
900                 break;
901             }
902         case OMX_IndexParamVideoAvc:
903             {
904                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_AVCTYPE);
905                 OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
906                 OMX_VIDEO_PARAM_AVCTYPE avc_param;
907                 memcpy(&avc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_AVCTYPE));
908                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoAvc");
909 
910                 avc_param.nBFrames = 0;
911                 if ((pParam->eProfile == OMX_VIDEO_AVCProfileHigh)||
912                         (pParam->eProfile == OMX_VIDEO_AVCProfileMain)) {
913 
914                     if (pParam->nBFrames) {
915                         avc_param.nBFrames = pParam->nBFrames;
916                         DEBUG_PRINT_LOW("B frames set using Client setparam to %d",
917                             avc_param.nBFrames);
918                     }
919 
920                     if (bframes ) {
921                         avc_param.nBFrames = bframes;
922                         DEBUG_PRINT_LOW("B frames set using setprop to %d",
923                             avc_param.nBFrames);
924                     }
925 
926                     DEBUG_PRINT_HIGH("AVC: BFrames: %u", (unsigned int)avc_param.nBFrames);
927                     avc_param.bEntropyCodingCABAC = (OMX_BOOL)(avc_param.bEntropyCodingCABAC && entropy);
928                     avc_param.nCabacInitIdc = entropy ? avc_param.nCabacInitIdc : 0;
929                 } else {
930                     if (pParam->nBFrames) {
931                         DEBUG_PRINT_ERROR("Warning: B frames not supported");
932                     }
933                 }
934 
935                 if (handle->venc_set_param(&avc_param,OMX_IndexParamVideoAvc) != true) {
936                     return OMX_ErrorUnsupportedSetting;
937                 }
938                 memcpy(&m_sParamAVC,pParam, sizeof(struct OMX_VIDEO_PARAM_AVCTYPE));
939                 m_sIntraperiod.nPFrames = m_sParamAVC.nPFrames;
940                 if (pParam->nBFrames || bframes)
941                     m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames = avc_param.nBFrames;
942                 else
943                     m_sIntraperiod.nBFrames = m_sParamAVC.nBFrames;
944                 break;
945             }
946         case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
947             {
948                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_VP8TYPE);
949                 OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
950                 OMX_VIDEO_PARAM_VP8TYPE vp8_param;
951                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoVp8");
952                 if (pParam->nDCTPartitions != m_sParamVP8.nDCTPartitions ||
953                     pParam->bErrorResilientMode != m_sParamVP8.bErrorResilientMode) {
954                     DEBUG_PRINT_ERROR("VP8 doesn't support nDCTPartitions or bErrorResilientMode");
955                 }
956                 memcpy(&vp8_param, pParam, sizeof( struct OMX_VIDEO_PARAM_VP8TYPE));
957                 if (handle->venc_set_param(&vp8_param, (OMX_INDEXTYPE)OMX_IndexParamVideoVp8) != true) {
958                     return OMX_ErrorUnsupportedSetting;
959                 }
960                 memcpy(&m_sParamVP8,pParam, sizeof(struct OMX_VIDEO_PARAM_VP8TYPE));
961                 break;
962             }
963         case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc:
964             {
965                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_HEVCTYPE);
966                 OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData;
967                 OMX_VIDEO_PARAM_HEVCTYPE hevc_param;
968                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoHevc");
969                 memcpy(&hevc_param, pParam, sizeof( struct OMX_VIDEO_PARAM_HEVCTYPE));
970                 if (handle->venc_set_param(&hevc_param, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc) != true) {
971                     DEBUG_PRINT_ERROR("Failed : set_parameter: OMX_IndexParamVideoHevc");
972                     return OMX_ErrorUnsupportedSetting;
973                 }
974                 memcpy(&m_sParamHEVC, pParam, sizeof(struct OMX_VIDEO_PARAM_HEVCTYPE));
975                 break;
976             }
977         case OMX_IndexParamVideoProfileLevelCurrent:
978             {
979                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_PROFILELEVELTYPE);
980                 OMX_VIDEO_PARAM_PROFILELEVELTYPE* pParam = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)paramData;
981                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoProfileLevelCurrent");
982                 if (handle->venc_set_param(pParam,OMX_IndexParamVideoProfileLevelCurrent) != true) {
983                     DEBUG_PRINT_ERROR("set_parameter: OMX_IndexParamVideoProfileLevelCurrent failed for Profile: %u "
984                             "Level :%u", (unsigned int)pParam->eProfile, (unsigned int)pParam->eLevel);
985                     return OMX_ErrorUnsupportedSetting;
986                 }
987                 m_sParamProfileLevel.eProfile = pParam->eProfile;
988                 m_sParamProfileLevel.eLevel = pParam->eLevel;
989 
990                 if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
991                             OMX_MAX_STRINGNAME_SIZE)) {
992                     m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)m_sParamProfileLevel.eProfile;
993                     m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)m_sParamProfileLevel.eLevel;
994                     DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
995                             m_sParamMPEG4.eLevel);
996                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
997                             OMX_MAX_STRINGNAME_SIZE)) {
998                     m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)m_sParamProfileLevel.eProfile;
999                     m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)m_sParamProfileLevel.eLevel;
1000                     DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile,
1001                             m_sParamH263.eLevel);
1002                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
1003                             OMX_MAX_STRINGNAME_SIZE)) {
1004                     m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
1005                     m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
1006                     DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile,
1007                             m_sParamAVC.eLevel);
1008                 } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
1009                             OMX_MAX_STRINGNAME_SIZE)) {
1010                     m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)m_sParamProfileLevel.eProfile;
1011                     m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)m_sParamProfileLevel.eLevel;
1012                     DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
1013                             m_sParamAVC.eLevel);
1014                 }
1015                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",\
1016                             OMX_MAX_STRINGNAME_SIZE)) {
1017                     m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)m_sParamProfileLevel.eProfile;
1018                     m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)m_sParamProfileLevel.eLevel;
1019                     DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
1020                             m_sParamVP8.eLevel);
1021                 }
1022                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",\
1023                             OMX_MAX_STRINGNAME_SIZE)) {
1024                     m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)m_sParamProfileLevel.eProfile;
1025                     m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)m_sParamProfileLevel.eLevel;
1026                     DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
1027                             m_sParamHEVC.eLevel);
1028                 }
1029 
1030                 break;
1031             }
1032         case OMX_IndexParamStandardComponentRole:
1033             {
1034                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_COMPONENTROLETYPE);
1035                 OMX_PARAM_COMPONENTROLETYPE *comp_role;
1036                 comp_role = (OMX_PARAM_COMPONENTROLETYPE *) paramData;
1037                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamStandardComponentRole %s",
1038                         comp_role->cRole);
1039 
1040                 if ((m_state == OMX_StateLoaded)&&
1041                         !BITMASK_PRESENT(&m_flags,OMX_COMPONENT_IDLE_PENDING)) {
1042                     DEBUG_PRINT_LOW("Set Parameter called in valid state");
1043                 } else {
1044                     DEBUG_PRINT_ERROR("Set Parameter called in Invalid State");
1045                     return OMX_ErrorIncorrectStateOperation;
1046                 }
1047 
1048                 if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
1049                     if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
1050                         strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
1051                     } else {
1052                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
1053                         eRet =OMX_ErrorUnsupportedSetting;
1054                     }
1055                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.avc.secure",OMX_MAX_STRINGNAME_SIZE)) {
1056                     if (!strncmp((char*)comp_role->cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE)) {
1057                         strlcpy((char*)m_cRole,"video_encoder.avc",OMX_MAX_STRINGNAME_SIZE);
1058                     } else {
1059                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s\n", comp_role->cRole);
1060                         eRet =OMX_ErrorUnsupportedSetting;
1061                     }
1062                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
1063                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE)) {
1064                         strlcpy((char*)m_cRole,"video_encoder.mpeg4",OMX_MAX_STRINGNAME_SIZE);
1065                     } else {
1066                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
1067                         eRet = OMX_ErrorUnsupportedSetting;
1068                     }
1069                 } else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
1070                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE)) {
1071                         strlcpy((char*)m_cRole,"video_encoder.h263",OMX_MAX_STRINGNAME_SIZE);
1072                     } else {
1073                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
1074                         eRet =OMX_ErrorUnsupportedSetting;
1075                     }
1076                 }
1077 #ifdef _MSM8974_
1078                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
1079                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE)) {
1080                         strlcpy((char*)m_cRole,"video_encoder.vp8",OMX_MAX_STRINGNAME_SIZE);
1081                     } else {
1082                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
1083                         eRet =OMX_ErrorUnsupportedSetting;
1084                     }
1085                 }
1086 #endif
1087                 else if (!strncmp((char*)m_nkind, "OMX.qcom.video.encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
1088                     if (!strncmp((const char*)comp_role->cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE)) {
1089                         strlcpy((char*)m_cRole,"video_encoder.hevc",OMX_MAX_STRINGNAME_SIZE);
1090                     } else {
1091                         DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown Index %s", comp_role->cRole);
1092                         eRet = OMX_ErrorUnsupportedSetting;
1093                     }
1094                 }
1095 
1096                 else {
1097                     DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %s", m_nkind);
1098                     eRet = OMX_ErrorInvalidComponentName;
1099                 }
1100                 break;
1101             }
1102 
1103         case OMX_IndexParamPriorityMgmt:
1104             {
1105                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PRIORITYMGMTTYPE);
1106                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt");
1107                 if (m_state != OMX_StateLoaded) {
1108                     DEBUG_PRINT_ERROR("ERROR: Set Parameter called in Invalid State");
1109                     return OMX_ErrorIncorrectStateOperation;
1110                 }
1111                 OMX_PRIORITYMGMTTYPE *priorityMgmtype = (OMX_PRIORITYMGMTTYPE*) paramData;
1112                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamPriorityMgmt %u",
1113                         (unsigned int)priorityMgmtype->nGroupID);
1114 
1115                 DEBUG_PRINT_LOW("set_parameter: priorityMgmtype %u",
1116                         (unsigned int)priorityMgmtype->nGroupPriority);
1117 
1118                 m_sPriorityMgmt.nGroupID = priorityMgmtype->nGroupID;
1119                 m_sPriorityMgmt.nGroupPriority = priorityMgmtype->nGroupPriority;
1120 
1121                 break;
1122             }
1123 
1124         case OMX_IndexParamCompBufferSupplier:
1125             {
1126                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_BUFFERSUPPLIERTYPE);
1127                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier");
1128                 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplierType = (OMX_PARAM_BUFFERSUPPLIERTYPE*) paramData;
1129                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamCompBufferSupplier %d",
1130                         bufferSupplierType->eBufferSupplier);
1131                 if (bufferSupplierType->nPortIndex == 0 || bufferSupplierType->nPortIndex ==1)
1132                     m_sInBufSupplier.eBufferSupplier = bufferSupplierType->eBufferSupplier;
1133 
1134                 else
1135 
1136                     eRet = OMX_ErrorBadPortIndex;
1137 
1138                 break;
1139 
1140             }
1141         case OMX_IndexParamVideoQuantization:
1142             {
1143                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_QUANTIZATIONTYPE);
1144                 DEBUG_PRINT_LOW("set_parameter: OMX_IndexParamVideoQuantization");
1145                 OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE*) paramData;
1146                 if (session_qp->nPortIndex == PORT_INDEX_OUT) {
1147                     if (handle->venc_set_param(paramData, OMX_IndexParamVideoQuantization) != true) {
1148                         return OMX_ErrorUnsupportedSetting;
1149                     }
1150                     m_sSessionQuantization.nQpI = session_qp->nQpI;
1151                     m_sSessionQuantization.nQpP = session_qp->nQpP;
1152                     m_sSessionQuantization.nQpB = session_qp->nQpB;
1153                 } else {
1154                     DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for Session QP setting");
1155                     eRet = OMX_ErrorBadPortIndex;
1156                 }
1157                 break;
1158             }
1159 
1160         case OMX_QcomIndexParamVideoQPRange:
1161             {
1162                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_QPRANGETYPE);
1163                 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexParamVideoQPRange");
1164                 OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *qp_range = (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE*) paramData;
1165                 if (qp_range->nPortIndex == PORT_INDEX_OUT) {
1166                     if (handle->venc_set_param(paramData,
1167                                 (OMX_INDEXTYPE)OMX_QcomIndexParamVideoQPRange) != true) {
1168                         return OMX_ErrorUnsupportedSetting;
1169                     }
1170                     m_sSessionQPRange.minQP= qp_range->minQP;
1171                     m_sSessionQPRange.maxQP= qp_range->maxQP;
1172                 } else {
1173                     DEBUG_PRINT_ERROR("ERROR: Unsupported port Index for QP range setting");
1174                     eRet = OMX_ErrorBadPortIndex;
1175                 }
1176                 break;
1177             }
1178 
1179         case OMX_QcomIndexPortDefn:
1180             {
1181                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_PARAM_PORTDEFINITIONTYPE);
1182                 OMX_QCOM_PARAM_PORTDEFINITIONTYPE* pParam =
1183                     (OMX_QCOM_PARAM_PORTDEFINITIONTYPE*)paramData;
1184                 DEBUG_PRINT_LOW("set_parameter: OMX_QcomIndexPortDefn");
1185                 if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
1186                     if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
1187                             pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
1188                         m_use_input_pmem = OMX_TRUE;
1189                     } else {
1190                         m_use_input_pmem = OMX_FALSE;
1191                     }
1192                 } else if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
1193                     if (pParam->nMemRegion > OMX_QCOM_MemRegionInvalid &&
1194                             pParam->nMemRegion < OMX_QCOM_MemRegionMax) {
1195                         m_use_output_pmem = OMX_TRUE;
1196                     } else {
1197                         m_use_output_pmem = OMX_FALSE;
1198                     }
1199                 } else {
1200                     DEBUG_PRINT_ERROR("ERROR: SetParameter called on unsupported Port Index for QcomPortDefn");
1201                     return OMX_ErrorBadPortIndex;
1202                 }
1203                 break;
1204             }
1205 
1206         case OMX_IndexParamVideoErrorCorrection:
1207             {
1208                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE);
1209                 DEBUG_PRINT_LOW("OMX_IndexParamVideoErrorCorrection");
1210                 OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* pParam =
1211                     (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE*)paramData;
1212                 if (!handle->venc_set_param(paramData, OMX_IndexParamVideoErrorCorrection)) {
1213                     DEBUG_PRINT_ERROR("ERROR: Request for setting Error Resilience failed");
1214                     return OMX_ErrorUnsupportedSetting;
1215                 }
1216                 memcpy(&m_sErrorCorrection,pParam, sizeof(m_sErrorCorrection));
1217                 break;
1218             }
1219         case OMX_IndexParamVideoIntraRefresh:
1220             {
1221                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_INTRAREFRESHTYPE);
1222                 DEBUG_PRINT_LOW("set_param:OMX_IndexParamVideoIntraRefresh");
1223                 OMX_VIDEO_PARAM_INTRAREFRESHTYPE* pParam =
1224                     (OMX_VIDEO_PARAM_INTRAREFRESHTYPE*)paramData;
1225                 if (!handle->venc_set_param(paramData,OMX_IndexParamVideoIntraRefresh)) {
1226                     DEBUG_PRINT_ERROR("ERROR: Request for setting intra refresh failed");
1227                     return OMX_ErrorUnsupportedSetting;
1228                 }
1229                 memcpy(&m_sIntraRefresh, pParam, sizeof(m_sIntraRefresh));
1230                 break;
1231             }
1232 #ifdef _ANDROID_ICS_
1233         case OMX_QcomIndexParamVideoMetaBufferMode:
1234             {
1235                 VALIDATE_OMX_PARAM_DATA(paramData, StoreMetaDataInBuffersParams);
1236                 StoreMetaDataInBuffersParams *pParam =
1237                     (StoreMetaDataInBuffersParams*)paramData;
1238                 DEBUG_PRINT_HIGH("set_parameter:OMX_QcomIndexParamVideoMetaBufferMode: "
1239                         "port_index = %u, meta_mode = %d", (unsigned int)pParam->nPortIndex, pParam->bStoreMetaData);
1240                 if (pParam->nPortIndex == PORT_INDEX_IN) {
1241                     if (pParam->bStoreMetaData != meta_mode_enable) {
1242                         if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) {
1243                             DEBUG_PRINT_ERROR("ERROR: set Metabuffer mode %d fail",
1244                                     pParam->bStoreMetaData);
1245                             return OMX_ErrorUnsupportedSetting;
1246                         }
1247                         meta_mode_enable = pParam->bStoreMetaData;
1248                         if (meta_mode_enable) {
1249                             m_sInPortDef.nBufferCountActual = m_sInPortDef.nBufferCountMin;
1250                             if (handle->venc_set_param(&m_sInPortDef,OMX_IndexParamPortDefinition) != true) {
1251                                 DEBUG_PRINT_ERROR("ERROR: venc_set_param input failed");
1252                                 return OMX_ErrorUnsupportedSetting;
1253                             }
1254                         } else {
1255                             /*TODO: reset encoder driver Meta mode*/
1256                             dev_get_buf_req   (&m_sOutPortDef.nBufferCountMin,
1257                                     &m_sOutPortDef.nBufferCountActual,
1258                                     &m_sOutPortDef.nBufferSize,
1259                                     m_sOutPortDef.nPortIndex);
1260                         }
1261                     }
1262                 } else if (pParam->nPortIndex == PORT_INDEX_OUT && secure_session) {
1263                     if (pParam->bStoreMetaData != meta_mode_enable) {
1264                         if (!handle->venc_set_meta_mode(pParam->bStoreMetaData)) {
1265                             DEBUG_PRINT_ERROR("\nERROR: set Metabuffer mode %d fail",
1266                                     pParam->bStoreMetaData);
1267                             return OMX_ErrorUnsupportedSetting;
1268                         }
1269                         meta_mode_enable = pParam->bStoreMetaData;
1270                     }
1271                 } else {
1272                     DEBUG_PRINT_ERROR("set_parameter: metamode is "
1273                             "valid for input port only");
1274                     eRet = OMX_ErrorUnsupportedIndex;
1275                 }
1276             }
1277             break;
1278 #endif
1279 #if !defined(MAX_RES_720P) || defined(_MSM8974_)
1280         case OMX_QcomIndexParamIndexExtraDataType:
1281             {
1282                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_INDEXEXTRADATATYPE);
1283                 DEBUG_PRINT_HIGH("set_parameter: OMX_QcomIndexParamIndexExtraDataType");
1284                 QOMX_INDEXEXTRADATATYPE *pParam = (QOMX_INDEXEXTRADATATYPE *)paramData;
1285                 bool enable = false;
1286                 OMX_U32 mask = 0;
1287 
1288                 if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderSliceInfo) {
1289                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
1290                         mask = VENC_EXTRADATA_SLICEINFO;
1291 
1292                         DEBUG_PRINT_HIGH("SliceInfo extradata %s",
1293                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
1294                     } else {
1295                         DEBUG_PRINT_ERROR("set_parameter: Slice information is "
1296                                 "valid for output port only");
1297                         eRet = OMX_ErrorUnsupportedIndex;
1298                         break;
1299                     }
1300                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoEncoderMBInfo) {
1301                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
1302                         mask = VENC_EXTRADATA_MBINFO;
1303 
1304                         DEBUG_PRINT_HIGH("MBInfo extradata %s",
1305                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
1306                     } else {
1307                         DEBUG_PRINT_ERROR("set_parameter: MB information is "
1308                                 "valid for output port only");
1309                         eRet = OMX_ErrorUnsupportedIndex;
1310                         break;
1311                     }
1312                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataFrameDimension) {
1313                     if (pParam->nPortIndex == PORT_INDEX_IN) {
1314                             mask = VENC_EXTRADATA_FRAMEDIMENSION;
1315                         DEBUG_PRINT_HIGH("Frame dimension extradata %s",
1316                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
1317                     } else {
1318                         DEBUG_PRINT_ERROR("set_parameter: Frame Dimension is "
1319                                 "valid for input port only");
1320                         eRet = OMX_ErrorUnsupportedIndex;
1321                         break;
1322                     }
1323                 } else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_QTIIndexParamVQZipSEIExtraData) {
1324                     if (pParam->nPortIndex == PORT_INDEX_IN) {
1325                         mask = VENC_EXTRADATA_VQZIP;
1326                         DEBUG_PRINT_HIGH("VQZIP extradata %s",
1327                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
1328                     } else {
1329                         DEBUG_PRINT_ERROR("set_parameter: VQZIP is "
1330                                 "valid for input port only");
1331                         eRet = OMX_ErrorUnsupportedIndex;
1332                         break;
1333                     }
1334                 }
1335 
1336 #ifndef _MSM8974_
1337                 else if (pParam->nIndex == (OMX_INDEXTYPE)OMX_ExtraDataVideoLTRInfo) {
1338                     if (pParam->nPortIndex == PORT_INDEX_OUT) {
1339                         if (pParam->bEnabled == OMX_TRUE)
1340                             mask = VEN_EXTRADATA_LTRINFO;
1341 
1342                         DEBUG_PRINT_HIGH("LTRInfo extradata %s",
1343                                 ((pParam->bEnabled == OMX_TRUE) ? "enabled" : "disabled"));
1344                     } else {
1345                         DEBUG_PRINT_ERROR("set_parameter: LTR information is "
1346                                 "valid for output port only");
1347                         eRet = OMX_ErrorUnsupportedIndex;
1348                         break;
1349                     }
1350                 }
1351 #endif
1352                 else {
1353                     DEBUG_PRINT_ERROR("set_parameter: unsupported extrdata index (%x)",
1354                             pParam->nIndex);
1355                     eRet = OMX_ErrorUnsupportedIndex;
1356                     break;
1357                 }
1358 
1359 
1360                 if (pParam->bEnabled == OMX_TRUE)
1361                     m_sExtraData |= mask;
1362                 else
1363                     m_sExtraData &= ~mask;
1364 
1365                 enable = !!(m_sExtraData & mask);
1366                 if (handle->venc_set_param(&enable,
1367                             (OMX_INDEXTYPE)pParam->nIndex) != true) {
1368                     DEBUG_PRINT_ERROR("ERROR: Setting Extradata (%x) failed", pParam->nIndex);
1369                     return OMX_ErrorUnsupportedSetting;
1370                 }
1371 
1372                 if (pParam->nPortIndex == PORT_INDEX_IN) {
1373                     m_sInPortDef.nPortIndex = PORT_INDEX_IN;
1374                     dev_get_buf_req(&m_sInPortDef.nBufferCountMin,
1375                             &m_sInPortDef.nBufferCountActual,
1376                             &m_sInPortDef.nBufferSize,
1377                             m_sInPortDef.nPortIndex);
1378                     DEBUG_PRINT_HIGH("updated in_buf_req: buffer cnt=%u, "
1379                             "count min=%u, buffer size=%u",
1380                             (unsigned int)m_sOutPortDef.nBufferCountActual,
1381                             (unsigned int)m_sOutPortDef.nBufferCountMin,
1382                             (unsigned int)m_sOutPortDef.nBufferSize);
1383 
1384                 } else {
1385                     m_sOutPortDef.nPortIndex = PORT_INDEX_OUT;
1386                     dev_get_buf_req(&m_sOutPortDef.nBufferCountMin,
1387                             &m_sOutPortDef.nBufferCountActual,
1388                             &m_sOutPortDef.nBufferSize,
1389                             m_sOutPortDef.nPortIndex);
1390                     DEBUG_PRINT_HIGH("updated out_buf_req: buffer cnt=%u, "
1391                             "count min=%u, buffer size=%u",
1392                             (unsigned int)m_sOutPortDef.nBufferCountActual,
1393                             (unsigned int)m_sOutPortDef.nBufferCountMin,
1394                             (unsigned int)m_sOutPortDef.nBufferSize);
1395                 }
1396                 break;
1397             }
1398         case QOMX_IndexParamVideoLTRMode:
1399             {
1400                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRMODE_TYPE);
1401                 QOMX_VIDEO_PARAM_LTRMODE_TYPE* pParam =
1402                     (QOMX_VIDEO_PARAM_LTRMODE_TYPE*)paramData;
1403                 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRMode)) {
1404                     DEBUG_PRINT_ERROR("ERROR: Setting LTR mode failed");
1405                     return OMX_ErrorUnsupportedSetting;
1406                 }
1407                 memcpy(&m_sParamLTRMode, pParam, sizeof(m_sParamLTRMode));
1408                 break;
1409             }
1410         case QOMX_IndexParamVideoLTRCount:
1411             {
1412                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_PARAM_LTRCOUNT_TYPE);
1413                 QOMX_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
1414                     (QOMX_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
1415                 if (!handle->venc_set_param(paramData, (OMX_INDEXTYPE)QOMX_IndexParamVideoLTRCount)) {
1416                     DEBUG_PRINT_ERROR("ERROR: Setting LTR count failed");
1417                     return OMX_ErrorUnsupportedSetting;
1418                 }
1419                 memcpy(&m_sParamLTRCount, pParam, sizeof(m_sParamLTRCount));
1420                 break;
1421             }
1422 #endif
1423         case OMX_QcomIndexParamVideoMaxAllowedBitrateCheck:
1424             {
1425                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
1426                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
1427                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
1428                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1429                     handle->m_max_allowed_bitrate_check =
1430                         ((pParam->bEnable == OMX_TRUE) ? true : false);
1431                     DEBUG_PRINT_HIGH("set_parameter: max allowed bitrate check %s",
1432                             ((pParam->bEnable == OMX_TRUE) ? "enabled" : "disabled"));
1433                 } else {
1434                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexParamVideoMaxAllowedBitrateCheck "
1435                             " called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
1436                     return OMX_ErrorBadPortIndex;
1437                 }
1438                 break;
1439             }
1440 #ifdef MAX_RES_1080P
1441         case OMX_QcomIndexEnableSliceDeliveryMode:
1442             {
1443                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
1444                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
1445                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
1446                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1447                     if (!handle->venc_set_param(paramData,
1448                                 (OMX_INDEXTYPE)OMX_QcomIndexEnableSliceDeliveryMode)) {
1449                         DEBUG_PRINT_ERROR("ERROR: Request for setting slice delivery mode failed");
1450                         return OMX_ErrorUnsupportedSetting;
1451                     }
1452                 } else {
1453                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableSliceDeliveryMode "
1454                             "called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
1455                     return OMX_ErrorBadPortIndex;
1456                 }
1457                 break;
1458             }
1459 #endif
1460         case OMX_QcomIndexEnableH263PlusPType:
1461             {
1462                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_PARAMTYPE);
1463                 QOMX_EXTNINDEX_PARAMTYPE* pParam =
1464                     (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
1465                 DEBUG_PRINT_LOW("OMX_QcomIndexEnableH263PlusPType");
1466                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1467                     if (!handle->venc_set_param(paramData,
1468                                 (OMX_INDEXTYPE)OMX_QcomIndexEnableH263PlusPType)) {
1469                         DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
1470                         return OMX_ErrorUnsupportedSetting;
1471                     }
1472                 } else {
1473                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexEnableH263PlusPType "
1474                             "called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
1475                     return OMX_ErrorBadPortIndex;
1476                 }
1477                 break;
1478             }
1479         case OMX_QcomIndexParamSequenceHeaderWithIDR:
1480             {
1481                 VALIDATE_OMX_PARAM_DATA(paramData, PrependSPSPPSToIDRFramesParams);
1482                 if(!handle->venc_set_param(paramData,
1483                             (OMX_INDEXTYPE)OMX_QcomIndexParamSequenceHeaderWithIDR)) {
1484                     DEBUG_PRINT_ERROR("%s: %s",
1485                             "OMX_QComIndexParamSequenceHeaderWithIDR:",
1486                             "request for inband sps/pps failed.");
1487                     return OMX_ErrorUnsupportedSetting;
1488                 }
1489                 memcpy((void *) &m_sPrependSPSPPS, &paramData, sizeof(m_sPrependSPSPPS));
1490                 break;
1491             }
1492         case OMX_QcomIndexParamH264AUDelimiter:
1493             {
1494                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_CONFIG_H264_AUD);
1495                 if(!handle->venc_set_param(paramData,
1496                             (OMX_INDEXTYPE)OMX_QcomIndexParamH264AUDelimiter)) {
1497                     DEBUG_PRINT_ERROR("%s: %s",
1498                             "OMX_QComIndexParamh264AUDelimiter:",
1499                             "request for AU Delimiters failed.");
1500                     return OMX_ErrorUnsupportedSetting;
1501                 }
1502                 break;
1503             }
1504         case OMX_QcomIndexParamMBIStatisticsMode:
1505             {
1506                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QOMX_VIDEO_MBI_STATISTICS);
1507                 if(!handle->venc_set_param(paramData,
1508                             (OMX_INDEXTYPE)OMX_QcomIndexParamMBIStatisticsMode)) {
1509                     DEBUG_PRINT_ERROR("%s: %s",
1510                             "OMX_QcomIndexParamMBIStatisticsMode:",
1511                             "MBI Statistics mode setting failed.");
1512                     return OMX_ErrorUnsupportedSetting;
1513                 }
1514                 break;
1515             }
1516        case OMX_QcomIndexHierarchicalStructure:
1517            {
1518                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_HIERARCHICALLAYERS);
1519                 QOMX_VIDEO_HIERARCHICALLAYERS* pParam =
1520                     (QOMX_VIDEO_HIERARCHICALLAYERS*)paramData;
1521                 DEBUG_PRINT_LOW("OMX_QcomIndexHierarchicalStructure");
1522                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1523                     if (!handle->venc_set_param(paramData,
1524                                 (OMX_INDEXTYPE)OMX_QcomIndexHierarchicalStructure)) {
1525                         DEBUG_PRINT_ERROR("ERROR: Request for setting PlusPType failed");
1526                         return OMX_ErrorUnsupportedSetting;
1527                     }
1528                 if((pParam->eHierarchicalCodingType == QOMX_HIERARCHICALCODING_B) && pParam->nNumLayers)
1529                     hier_b_enabled = true;
1530                     m_sHierLayers.nNumLayers = pParam->nNumLayers;
1531                     m_sHierLayers.eHierarchicalCodingType = pParam->eHierarchicalCodingType;
1532                 } else {
1533                     DEBUG_PRINT_ERROR("ERROR: OMX_QcomIndexHierarchicalStructure called on wrong port(%u)",
1534                           (unsigned int)pParam->nPortIndex);
1535                     return OMX_ErrorBadPortIndex;
1536                 }
1537                 break;
1538 
1539            }
1540         case OMX_QcomIndexParamPerfLevel:
1541             {
1542                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PERF_LEVEL);
1543                 if (!handle->venc_set_param(paramData,
1544                             (OMX_INDEXTYPE) OMX_QcomIndexParamPerfLevel)) {
1545                     DEBUG_PRINT_ERROR("ERROR: Setting performance level");
1546                     return OMX_ErrorUnsupportedSetting;
1547                 }
1548                 break;
1549             }
1550         case OMX_QcomIndexParamH264VUITimingInfo:
1551             {
1552                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO);
1553                 if (!handle->venc_set_param(paramData,
1554                             (OMX_INDEXTYPE) OMX_QcomIndexParamH264VUITimingInfo)) {
1555                     DEBUG_PRINT_ERROR("ERROR: Setting VUI timing info");
1556                     return OMX_ErrorUnsupportedSetting;
1557                 }
1558                 break;
1559             }
1560         case OMX_QcomIndexParamPeakBitrate:
1561             {
1562                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE);
1563                 if (!handle->venc_set_param(paramData,
1564                             (OMX_INDEXTYPE) OMX_QcomIndexParamPeakBitrate)) {
1565                     DEBUG_PRINT_ERROR("ERROR: Setting peak bitrate");
1566                     return OMX_ErrorUnsupportedSetting;
1567                 }
1568                 break;
1569              }
1570        case QOMX_IndexParamVideoInitialQp:
1571             {
1572                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_INITIALQP);
1573                 if(!handle->venc_set_param(paramData,
1574                             (OMX_INDEXTYPE)QOMX_IndexParamVideoInitialQp)) {
1575                     DEBUG_PRINT_ERROR("Request to Enable initial QP failed");
1576                     return OMX_ErrorUnsupportedSetting;
1577                 }
1578                 memcpy(&m_sParamInitqp, paramData, sizeof(m_sParamInitqp));
1579                 break;
1580             }
1581         case OMX_QcomIndexParamSetMVSearchrange:
1582             {
1583                 if (!handle->venc_set_param(paramData,
1584                             (OMX_INDEXTYPE) OMX_QcomIndexParamSetMVSearchrange)) {
1585                     DEBUG_PRINT_ERROR("ERROR: Setting Searchrange");
1586                     return OMX_ErrorUnsupportedSetting;
1587                 }
1588                 break;
1589             }
1590         case OMX_QcomIndexParamVideoHybridHierpMode:
1591             {
1592                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE);
1593                if(!handle->venc_set_param(paramData,
1594                          (OMX_INDEXTYPE)OMX_QcomIndexParamVideoHybridHierpMode)) {
1595                    DEBUG_PRINT_ERROR("Request to Enable Hybrid Hier-P failed");
1596                    return OMX_ErrorUnsupportedSetting;
1597                 }
1598                 break;
1599             }
1600         case OMX_QcomIndexParamBatchSize:
1601             {
1602                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_PARAM_U32TYPE);
1603                 if(!handle->venc_set_param(paramData,
1604                          (OMX_INDEXTYPE)OMX_QcomIndexParamBatchSize)) {
1605                    DEBUG_PRINT_ERROR("Attempting to set batch size failed");
1606                    return OMX_ErrorUnsupportedSetting;
1607                 }
1608                 break;
1609             }
1610         case OMX_QcomIndexConfigH264EntropyCodingCabac:
1611             {
1612                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_VIDEO_H264ENTROPYCODINGTYPE);
1613                 if(!handle->venc_set_param(paramData,
1614                          (OMX_INDEXTYPE)OMX_QcomIndexConfigH264EntropyCodingCabac)) {
1615                    DEBUG_PRINT_ERROR("Attempting to set Entropy failed");
1616                    return OMX_ErrorUnsupportedSetting;
1617                 }
1618                break;
1619             }
1620         case OMX_QTIIndexParamVQZIPSEIType:
1621             {
1622                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE);
1623                 if (!handle->venc_set_param(paramData,
1624                             (OMX_INDEXTYPE) OMX_QTIIndexParamVQZIPSEIType)) {
1625                     DEBUG_PRINT_ERROR("ERROR: Setting VQZIP SEI type");
1626                     return OMX_ErrorUnsupportedSetting;
1627                 }
1628                 m_sExtraData |= VENC_EXTRADATA_VQZIP;
1629                 break;
1630             }
1631         case OMX_QcomIndexParamVencAspectRatio:
1632             {
1633                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_EXTNINDEX_VIDEO_VENC_SAR);
1634                 if (!handle->venc_set_param(paramData,
1635                         (OMX_INDEXTYPE)OMX_QcomIndexParamVencAspectRatio)) {
1636                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexParamVencAspectRatio failed");
1637                     return OMX_ErrorUnsupportedSetting;
1638                 }
1639                 memcpy(&m_sSar, paramData, sizeof(m_sSar));
1640                 break;
1641             }
1642         case OMX_QTIIndexParamVideoEnableRoiInfo:
1643             {
1644                 if (!handle->venc_set_param(paramData,
1645                             (OMX_INDEXTYPE)OMX_QTIIndexParamVideoEnableRoiInfo)) {
1646                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamVideoEnableRoiInfo failed");
1647                     return OMX_ErrorUnsupportedSetting;
1648                 }
1649                 break;
1650             }
1651         case OMX_IndexParamAndroidVideoTemporalLayering:
1652             {
1653                 VALIDATE_OMX_PARAM_DATA(paramData, OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE);
1654                 if (!handle->venc_set_param(paramData,
1655                         (OMX_INDEXTYPE)OMX_IndexParamAndroidVideoTemporalLayering)) {
1656                     DEBUG_PRINT_ERROR("Failed to configure temporal layers");
1657                     return OMX_ErrorUnsupportedSetting;
1658                 }
1659                 // save the actual configuration applied
1660                 memcpy(&m_sParamTemporalLayers, paramData, sizeof(m_sParamTemporalLayers));
1661                 // keep the config data in sync
1662                 m_sConfigTemporalLayers.ePattern = m_sParamTemporalLayers.ePattern;
1663                 m_sConfigTemporalLayers.nBLayerCountActual = m_sParamTemporalLayers.nBLayerCountActual;
1664                 m_sConfigTemporalLayers.nPLayerCountActual = m_sParamTemporalLayers.nPLayerCountActual;
1665                 m_sConfigTemporalLayers.bBitrateRatiosSpecified = m_sParamTemporalLayers.bBitrateRatiosSpecified;
1666                 memcpy(&m_sConfigTemporalLayers.nBitrateRatios[0],
1667                         &m_sParamTemporalLayers.nBitrateRatios[0],
1668                         OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS * sizeof(OMX_U32));
1669                 break;
1670             }
1671         case OMX_QTIIndexParamEnableAVTimerTimestamps:
1672             {
1673                 VALIDATE_OMX_PARAM_DATA(paramData, QOMX_ENABLETYPE);
1674                 if (!handle->venc_set_param(paramData,
1675                             (OMX_INDEXTYPE)OMX_QTIIndexParamEnableAVTimerTimestamps)) {
1676                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamEnableAVTimerTimestamps failed");
1677                     return OMX_ErrorUnsupportedSetting;
1678                 }
1679                 memcpy(&m_sParamAVTimerTimestampMode, paramData, sizeof(QOMX_ENABLETYPE));
1680                 break;
1681             }
1682         case OMX_IndexParamVideoSliceFMO:
1683         default:
1684             {
1685                 DEBUG_PRINT_ERROR("ERROR: Setparameter: unknown param %d", paramIndex);
1686                 eRet = OMX_ErrorUnsupportedIndex;
1687                 break;
1688             }
1689     }
1690     return eRet;
1691 }
1692 
update_profile_level()1693 bool omx_venc::update_profile_level()
1694 {
1695     OMX_U32 eProfile, eLevel;
1696 
1697     if (!handle->venc_get_profile_level(&eProfile,&eLevel)) {
1698         DEBUG_PRINT_ERROR("Failed to update the profile_level");
1699         return false;
1700     }
1701 
1702     m_sParamProfileLevel.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
1703     m_sParamProfileLevel.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
1704 
1705     if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.mpeg4",\
1706                 OMX_MAX_STRINGNAME_SIZE)) {
1707         m_sParamMPEG4.eProfile = (OMX_VIDEO_MPEG4PROFILETYPE)eProfile;
1708         m_sParamMPEG4.eLevel = (OMX_VIDEO_MPEG4LEVELTYPE)eLevel;
1709         DEBUG_PRINT_LOW("MPEG4 profile = %d, level = %d", m_sParamMPEG4.eProfile,
1710                 m_sParamMPEG4.eLevel);
1711     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.h263",\
1712                 OMX_MAX_STRINGNAME_SIZE)) {
1713         m_sParamH263.eProfile = (OMX_VIDEO_H263PROFILETYPE)eProfile;
1714         m_sParamH263.eLevel = (OMX_VIDEO_H263LEVELTYPE)eLevel;
1715         DEBUG_PRINT_LOW("H263 profile = %d, level = %d", m_sParamH263.eProfile,
1716                 m_sParamH263.eLevel);
1717     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc",\
1718                 OMX_MAX_STRINGNAME_SIZE)) {
1719         m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
1720         m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
1721         DEBUG_PRINT_LOW("AVC profile = %d, level = %d", m_sParamAVC.eProfile,
1722                 m_sParamAVC.eLevel);
1723     } else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.avc.secure",\
1724                 OMX_MAX_STRINGNAME_SIZE)) {
1725         m_sParamAVC.eProfile = (OMX_VIDEO_AVCPROFILETYPE)eProfile;
1726         m_sParamAVC.eLevel = (OMX_VIDEO_AVCLEVELTYPE)eLevel;
1727         DEBUG_PRINT_LOW("\n AVC profile = %d, level = %d", m_sParamAVC.eProfile,
1728                 m_sParamAVC.eLevel);
1729     }
1730     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.vp8",\
1731                 OMX_MAX_STRINGNAME_SIZE)) {
1732         m_sParamVP8.eProfile = (OMX_VIDEO_VP8PROFILETYPE)eProfile;
1733         m_sParamVP8.eLevel = (OMX_VIDEO_VP8LEVELTYPE)eLevel;
1734         DEBUG_PRINT_LOW("VP8 profile = %d, level = %d", m_sParamVP8.eProfile,
1735                 m_sParamVP8.eLevel);
1736     }
1737     else if (!strncmp((char *)m_nkind, "OMX.qcom.video.encoder.hevc",\
1738                 OMX_MAX_STRINGNAME_SIZE)) {
1739         m_sParamHEVC.eProfile = (OMX_VIDEO_HEVCPROFILETYPE)eProfile;
1740         m_sParamHEVC.eLevel = (OMX_VIDEO_HEVCLEVELTYPE)eLevel;
1741         DEBUG_PRINT_LOW("HEVC profile = %d, level = %d", m_sParamHEVC.eProfile,
1742                 m_sParamHEVC.eLevel);
1743     }
1744 
1745     return true;
1746 }
1747 /* ======================================================================
1748    FUNCTION
1749    omx_video::SetConfig
1750 
1751    DESCRIPTION
1752    OMX Set Config method implementation
1753 
1754    PARAMETERS
1755    <TBD>.
1756 
1757    RETURN VALUE
1758    OMX Error None if successful.
1759    ========================================================================== */
set_config(OMX_IN OMX_HANDLETYPE hComp,OMX_IN OMX_INDEXTYPE configIndex,OMX_IN OMX_PTR configData)1760 OMX_ERRORTYPE  omx_venc::set_config(OMX_IN OMX_HANDLETYPE      hComp,
1761         OMX_IN OMX_INDEXTYPE configIndex,
1762         OMX_IN OMX_PTR        configData)
1763 {
1764     (void)hComp;
1765     if (configData == NULL) {
1766         DEBUG_PRINT_ERROR("ERROR: param is null");
1767         return OMX_ErrorBadParameter;
1768     }
1769 
1770     if (m_state == OMX_StateInvalid) {
1771         DEBUG_PRINT_ERROR("ERROR: config called in Invalid state");
1772         return OMX_ErrorIncorrectStateOperation;
1773     }
1774 
1775     // params will be validated prior to venc_init
1776     switch ((int)configIndex) {
1777         case OMX_IndexConfigVideoBitrate:
1778             {
1779                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_BITRATETYPE);
1780                 OMX_VIDEO_CONFIG_BITRATETYPE* pParam =
1781                     reinterpret_cast<OMX_VIDEO_CONFIG_BITRATETYPE*>(configData);
1782                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoBitrate (%u)", (unsigned int)pParam->nEncodeBitrate);
1783 
1784                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1785                     if (handle->venc_set_config(configData, OMX_IndexConfigVideoBitrate) != true) {
1786                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoBitrate failed");
1787                         return OMX_ErrorUnsupportedSetting;
1788                     }
1789 
1790                     m_sConfigBitrate.nEncodeBitrate = pParam->nEncodeBitrate;
1791                     m_sParamBitrate.nTargetBitrate = pParam->nEncodeBitrate;
1792                     m_sOutPortDef.format.video.nBitrate = pParam->nEncodeBitrate;
1793                 } else {
1794                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
1795                     return OMX_ErrorBadPortIndex;
1796                 }
1797                 break;
1798             }
1799         case OMX_IndexConfigVideoFramerate:
1800             {
1801                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_FRAMERATETYPE);
1802                 OMX_CONFIG_FRAMERATETYPE* pParam =
1803                     reinterpret_cast<OMX_CONFIG_FRAMERATETYPE*>(configData);
1804                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoFramerate (0x%x)", (unsigned int)pParam->xEncodeFramerate);
1805 
1806                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1807                     if (handle->venc_set_config(configData, OMX_IndexConfigVideoFramerate) != true) {
1808                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoFramerate failed");
1809                         return OMX_ErrorUnsupportedSetting;
1810                     }
1811 
1812                     m_sConfigFramerate.xEncodeFramerate = pParam->xEncodeFramerate;
1813                     m_sOutPortDef.format.video.xFramerate = pParam->xEncodeFramerate;
1814                     m_sOutPortFormat.xFramerate = pParam->xEncodeFramerate;
1815                 } else {
1816                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
1817                     return OMX_ErrorBadPortIndex;
1818                 }
1819 
1820                 break;
1821             }
1822         case QOMX_IndexConfigVideoIntraperiod:
1823             {
1824                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_INTRAPERIODTYPE);
1825                 QOMX_VIDEO_INTRAPERIODTYPE* pParam =
1826                     reinterpret_cast<QOMX_VIDEO_INTRAPERIODTYPE*>(configData);
1827 
1828                 DEBUG_PRINT_HIGH("set_config(): QOMX_IndexConfigVideoIntraperiod");
1829                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1830 #ifdef MAX_RES_720P
1831                     if (pParam->nBFrames > 0) {
1832                         DEBUG_PRINT_ERROR("B frames not supported");
1833                         return OMX_ErrorUnsupportedSetting;
1834                     }
1835 #endif
1836                     DEBUG_PRINT_HIGH("Old: P/B frames = %u/%u, New: P/B frames = %u/%u",
1837                             (unsigned int)m_sIntraperiod.nPFrames, (unsigned int)m_sIntraperiod.nBFrames,
1838                             (unsigned int)pParam->nPFrames, (unsigned int)pParam->nBFrames);
1839                     if (m_sIntraperiod.nBFrames != pParam->nBFrames) {
1840                         if(hier_b_enabled && m_state == OMX_StateLoaded) {
1841                             DEBUG_PRINT_INFO("B-frames setting is supported if HierB is enabled");
1842                         }
1843                         else {
1844                             DEBUG_PRINT_HIGH("Dynamically changing B-frames not supported");
1845                             return OMX_ErrorUnsupportedSetting;
1846                         }
1847                     }
1848                     if (handle->venc_set_config(configData, (OMX_INDEXTYPE) QOMX_IndexConfigVideoIntraperiod) != true) {
1849                         DEBUG_PRINT_ERROR("ERROR: Setting QOMX_IndexConfigVideoIntraperiod failed");
1850                         return OMX_ErrorUnsupportedSetting;
1851                     }
1852                     m_sIntraperiod.nPFrames = pParam->nPFrames;
1853                     m_sIntraperiod.nBFrames = pParam->nBFrames;
1854                     m_sIntraperiod.nIDRPeriod = pParam->nIDRPeriod;
1855 
1856                     if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingMPEG4) {
1857                         m_sParamMPEG4.nPFrames = pParam->nPFrames;
1858                         if (m_sParamMPEG4.eProfile != OMX_VIDEO_MPEG4ProfileSimple)
1859                             m_sParamMPEG4.nBFrames = pParam->nBFrames;
1860                         else
1861                             m_sParamMPEG4.nBFrames = 0;
1862                     } else if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingH263) {
1863                         m_sParamH263.nPFrames = pParam->nPFrames;
1864                     } else {
1865                         m_sParamAVC.nPFrames = pParam->nPFrames;
1866                         if ((m_sParamAVC.eProfile != OMX_VIDEO_AVCProfileBaseline) &&
1867                             (m_sParamAVC.eProfile != (OMX_VIDEO_AVCPROFILETYPE) OMX_VIDEO_AVCProfileConstrainedBaseline) &&
1868                             (m_sParamAVC.eProfile != (OMX_VIDEO_AVCPROFILETYPE) QOMX_VIDEO_AVCProfileConstrainedBaseline))
1869                             m_sParamAVC.nBFrames = pParam->nBFrames;
1870                         else
1871                             m_sParamAVC.nBFrames = 0;
1872                     }
1873                 } else {
1874                     DEBUG_PRINT_ERROR("ERROR: (QOMX_IndexConfigVideoIntraperiod) Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
1875                     return OMX_ErrorBadPortIndex;
1876                 }
1877 
1878                 break;
1879             }
1880 
1881         case OMX_IndexConfigVideoIntraVOPRefresh:
1882             {
1883                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_INTRAREFRESHVOPTYPE);
1884                 OMX_CONFIG_INTRAREFRESHVOPTYPE* pParam =
1885                     reinterpret_cast<OMX_CONFIG_INTRAREFRESHVOPTYPE*>(configData);
1886 
1887                 DEBUG_PRINT_HIGH("set_config(): OMX_IndexConfigVideoIntraVOPRefresh");
1888                 if (pParam->nPortIndex == PORT_INDEX_OUT) {
1889                     if (handle->venc_set_config(configData,
1890                                 OMX_IndexConfigVideoIntraVOPRefresh) != true) {
1891                         DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoIntraVOPRefresh failed");
1892                         return OMX_ErrorUnsupportedSetting;
1893                     }
1894 
1895                     m_sConfigIntraRefreshVOP.IntraRefreshVOP = pParam->IntraRefreshVOP;
1896                 } else {
1897                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
1898                     return OMX_ErrorBadPortIndex;
1899                 }
1900 
1901                 break;
1902             }
1903         case OMX_IndexConfigCommonRotate:
1904             {
1905                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ROTATIONTYPE);
1906                 OMX_CONFIG_ROTATIONTYPE *pParam =
1907                     reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
1908                 OMX_S32 nRotation;
1909 
1910                 if (pParam->nPortIndex != PORT_INDEX_OUT) {
1911                     DEBUG_PRINT_ERROR("ERROR: Unsupported port index: %u", (unsigned int)pParam->nPortIndex);
1912                     return OMX_ErrorBadPortIndex;
1913                 }
1914                 if ( pParam->nRotation == 0   ||
1915                         pParam->nRotation == 90  ||
1916                         pParam->nRotation == 180 ||
1917                         pParam->nRotation == 270 ) {
1918                     DEBUG_PRINT_HIGH("set_config: Rotation Angle %u", (unsigned int)pParam->nRotation);
1919                 } else {
1920                     DEBUG_PRINT_ERROR("ERROR: un supported Rotation %u", (unsigned int)pParam->nRotation);
1921                     return OMX_ErrorUnsupportedSetting;
1922                 }
1923                 nRotation = pParam->nRotation - m_sConfigFrameRotation.nRotation;
1924                 if (nRotation < 0)
1925                     nRotation = -nRotation;
1926                 if (nRotation == 90 || nRotation == 270) {
1927                     DEBUG_PRINT_HIGH("set_config: updating device Dims");
1928                     if (handle->venc_set_config(configData,
1929                                 OMX_IndexConfigCommonRotate) != true) {
1930                         DEBUG_PRINT_ERROR("ERROR: Set OMX_IndexConfigCommonRotate failed");
1931                         return OMX_ErrorUnsupportedSetting;
1932                     } else {
1933                         OMX_U32 nFrameWidth;
1934                         OMX_U32 nFrameHeight;
1935 
1936                         DEBUG_PRINT_HIGH("set_config: updating port Dims");
1937 
1938                         nFrameWidth = m_sOutPortDef.format.video.nFrameWidth;
1939                         nFrameHeight = m_sOutPortDef.format.video.nFrameHeight;
1940                         m_sOutPortDef.format.video.nFrameWidth  = nFrameHeight;
1941                         m_sOutPortDef.format.video.nFrameHeight = nFrameWidth;
1942                         m_sConfigFrameRotation.nRotation = pParam->nRotation;
1943                     }
1944                 } else {
1945                     m_sConfigFrameRotation.nRotation = pParam->nRotation;
1946                 }
1947 
1948                 // Update output-port resolution (since it might have been flipped by rotation)
1949                 if (handle->venc_get_dimensions(PORT_INDEX_OUT,
1950                         &m_sOutPortDef.format.video.nFrameWidth,
1951                         &m_sOutPortDef.format.video.nFrameHeight)) {
1952                     DEBUG_PRINT_HIGH("set Rotation: updated dimensions = %u x %u",
1953                             m_sOutPortDef.format.video.nFrameWidth,
1954                             m_sOutPortDef.format.video.nFrameHeight);
1955                 }
1956                 break;
1957             }
1958         case OMX_QcomIndexConfigVideoFramePackingArrangement:
1959             {
1960                 DEBUG_PRINT_HIGH("set_config(): OMX_QcomIndexConfigVideoFramePackingArrangement");
1961                 if (m_sOutPortFormat.eCompressionFormat == OMX_VIDEO_CodingAVC) {
1962                     VALIDATE_OMX_PARAM_DATA(configData, OMX_QCOM_FRAME_PACK_ARRANGEMENT);
1963                     OMX_QCOM_FRAME_PACK_ARRANGEMENT *configFmt =
1964                         (OMX_QCOM_FRAME_PACK_ARRANGEMENT *) configData;
1965                     extra_data_handle.set_frame_pack_data(configFmt);
1966                 } else {
1967                     DEBUG_PRINT_ERROR("ERROR: FramePackingData not supported for non AVC compression");
1968                 }
1969                 break;
1970             }
1971         case QOMX_IndexConfigVideoLTRPeriod:
1972             {
1973                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE);
1974                 QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE*)configData;
1975                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRPeriod)) {
1976                     DEBUG_PRINT_ERROR("ERROR: Setting LTR period failed");
1977                     return OMX_ErrorUnsupportedSetting;
1978                 }
1979                 memcpy(&m_sConfigLTRPeriod, pParam, sizeof(m_sConfigLTRPeriod));
1980                 break;
1981             }
1982 
1983        case OMX_IndexConfigVideoVp8ReferenceFrame:
1984            {
1985                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_VP8REFERENCEFRAMETYPE);
1986                OMX_VIDEO_VP8REFERENCEFRAMETYPE* pParam = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData;
1987                if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE) OMX_IndexConfigVideoVp8ReferenceFrame)) {
1988                    DEBUG_PRINT_ERROR("ERROR: Setting VP8 reference frame");
1989                    return OMX_ErrorUnsupportedSetting;
1990                }
1991                memcpy(&m_sConfigVp8ReferenceFrame, pParam, sizeof(m_sConfigVp8ReferenceFrame));
1992                break;
1993            }
1994 
1995        case QOMX_IndexConfigVideoLTRUse:
1996             {
1997                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRUSE_TYPE);
1998                 QOMX_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
1999                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRUse)) {
2000                     DEBUG_PRINT_ERROR("ERROR: Setting LTR use failed");
2001                     return OMX_ErrorUnsupportedSetting;
2002                 }
2003                 memcpy(&m_sConfigLTRUse, pParam, sizeof(m_sConfigLTRUse));
2004                 break;
2005             }
2006         case QOMX_IndexConfigVideoLTRMark:
2007             {
2008                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_VIDEO_CONFIG_LTRMARK_TYPE);
2009                 QOMX_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (QOMX_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
2010                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)QOMX_IndexConfigVideoLTRMark)) {
2011                     DEBUG_PRINT_ERROR("ERROR: Setting LTR mark failed");
2012                     return OMX_ErrorUnsupportedSetting;
2013                 }
2014                 break;
2015             }
2016         case OMX_IndexConfigVideoAVCIntraPeriod:
2017             {
2018                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_AVCINTRAPERIOD);
2019                 OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pParam = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
2020                 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigVideoAVCIntraPeriod");
2021                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigVideoAVCIntraPeriod)) {
2022                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigVideoAVCIntraPeriod failed");
2023                     return OMX_ErrorUnsupportedSetting;
2024                 }
2025                 memcpy(&m_sConfigAVCIDRPeriod, pParam, sizeof(m_sConfigAVCIDRPeriod));
2026                 break;
2027             }
2028         case OMX_IndexConfigCommonDeinterlace:
2029             {
2030                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_DEINTERLACE);
2031                 OMX_VIDEO_CONFIG_DEINTERLACE *pParam = (OMX_VIDEO_CONFIG_DEINTERLACE*) configData;
2032                 DEBUG_PRINT_LOW("set_config: OMX_IndexConfigCommonDeinterlace");
2033                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_IndexConfigCommonDeinterlace)) {
2034                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigCommonDeinterlace failed");
2035                     return OMX_ErrorUnsupportedSetting;
2036                 }
2037                 memcpy(&m_sConfigDeinterlace, pParam, sizeof(m_sConfigDeinterlace));
2038                 break;
2039             }
2040         case OMX_QcomIndexConfigVideoVencPerfMode:
2041             {
2042                 VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_PERFMODE);
2043                 QOMX_EXTNINDEX_VIDEO_PERFMODE* pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE*)configData;
2044                 if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigVideoVencPerfMode)) {
2045                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigVideoVencPerfMode failed");
2046                     return OMX_ErrorUnsupportedSetting;
2047                 }
2048                 break;
2049             }
2050         case OMX_QcomIndexConfigNumHierPLayers:
2051         {
2052             VALIDATE_OMX_PARAM_DATA(configData, QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS);
2053             QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS* pParam =
2054                 (QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS*)configData;
2055             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigNumHierPLayers)) {
2056                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigNumHierPLayers failed");
2057                 return OMX_ErrorUnsupportedSetting;
2058             }
2059             memcpy(&m_sHPlayers, pParam, sizeof(m_sHPlayers));
2060             break;
2061         }
2062         case OMX_QcomIndexConfigBaseLayerId:
2063         {
2064             VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID);
2065             OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam =
2066                 (OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*) configData;
2067             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigBaseLayerId)) {
2068                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigBaseLayerId failed");
2069                 return OMX_ErrorUnsupportedSetting;
2070             }
2071             memcpy(&m_sBaseLayerID, pParam, sizeof(m_sBaseLayerID));
2072             break;
2073         }
2074         case OMX_QcomIndexConfigQp:
2075         {
2076             VALIDATE_OMX_PARAM_DATA(configData, OMX_SKYPE_VIDEO_CONFIG_QP);
2077             OMX_SKYPE_VIDEO_CONFIG_QP* pParam =
2078                 (OMX_SKYPE_VIDEO_CONFIG_QP*) configData;
2079             if (!handle->venc_set_config(pParam, (OMX_INDEXTYPE)OMX_QcomIndexConfigQp)) {
2080                 DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexConfigQp failed");
2081                 return OMX_ErrorUnsupportedSetting;
2082             }
2083             memcpy(&m_sConfigQP, pParam, sizeof(m_sConfigQP));
2084             break;
2085         }
2086         case OMX_IndexConfigPriority:
2087             {
2088                 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
2089                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigPriority)) {
2090                     DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigPriority");
2091                     return OMX_ErrorUnsupportedSetting;
2092                 }
2093                 break;
2094             }
2095         case OMX_IndexConfigOperatingRate:
2096             {
2097                 VALIDATE_OMX_PARAM_DATA(configData, OMX_PARAM_U32TYPE);
2098                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate)) {
2099                     DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigOperatingRate");
2100                     return handle->hw_overload ? OMX_ErrorInsufficientResources :
2101                             OMX_ErrorUnsupportedSetting;
2102                 }
2103                 break;
2104             }
2105         case OMX_QTIIndexConfigVideoRoiInfo:
2106             {
2107                 VALIDATE_OMX_PARAM_DATA(configData, OMX_QTI_VIDEO_CONFIG_ROIINFO);
2108                 if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigVideoRoiInfo)) {
2109                     DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigVideoRoiInfo");
2110                     return OMX_ErrorUnsupportedSetting;
2111                 }
2112                 break;
2113             }
2114        case OMX_IndexConfigAndroidIntraRefresh:
2115            {
2116                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE);
2117                 OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE* pParam =
2118                 (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE*) configData;
2119                 if (m_state == OMX_StateLoaded
2120                         || m_sInPortDef.bEnabled == OMX_FALSE
2121                         || m_sOutPortDef.bEnabled == OMX_FALSE) {
2122                     if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_IndexConfigAndroidIntraRefresh)) {
2123                         DEBUG_PRINT_ERROR("Failed to set OMX_IndexConfigVideoIntraRefreshType");
2124                         return OMX_ErrorUnsupportedSetting;
2125                     }
2126                     m_sConfigIntraRefresh.nRefreshPeriod = pParam->nRefreshPeriod;
2127                } else {
2128                     DEBUG_PRINT_ERROR("ERROR: Setting OMX_IndexConfigAndroidIntraRefresh supported only at start of session");
2129                     return OMX_ErrorUnsupportedSetting;
2130                 }
2131                break;
2132            }
2133         case OMX_IndexConfigAndroidVideoTemporalLayering:
2134             {
2135                 VALIDATE_OMX_PARAM_DATA(configData, OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE);
2136                 DEBUG_PRINT_ERROR("Setting/modifying Temporal layers at run-time is not supported !");
2137                 return OMX_ErrorUnsupportedSetting;
2138             }
2139         case OMX_QTIIndexConfigDescribeColorAspects:
2140            {
2141                VALIDATE_OMX_PARAM_DATA(configData, DescribeColorAspectsParams);
2142                DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
2143                print_debug_color_aspects(&(params->sAspects), "set_config");
2144 
2145                // WA: Android client does not set the correct color-aspects (from dataspace).
2146                // Such a dataspace change is detected and set while in executing. This leads to
2147                // a race condition where client is trying to set (wrong) color and component trying
2148                // to set (right) color from ETB.
2149                // Hence ignore this config in Executing state till the framework starts setting right color.
2150                if (m_state == OMX_StateExecuting) {
2151                     DEBUG_PRINT_HIGH("Ignoring ColorSpace setting in Executing state");
2152                     return OMX_ErrorUnsupportedSetting;
2153                }
2154 
2155                if (!handle->venc_set_config(configData, (OMX_INDEXTYPE)OMX_QTIIndexConfigDescribeColorAspects)) {
2156                    DEBUG_PRINT_ERROR("Failed to set OMX_QTIIndexConfigDescribeColorAspects");
2157                    return OMX_ErrorUnsupportedSetting;
2158                }
2159                memcpy(&m_sConfigColorAspects, configData, sizeof(m_sConfigColorAspects));
2160                break;
2161            }
2162         case OMX_IndexConfigAndroidVendorExtension:
2163             {
2164                 VALIDATE_OMX_PARAM_DATA(configData, OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE);
2165 
2166                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext =
2167                     reinterpret_cast<OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *>(configData);
2168                 VALIDATE_OMX_VENDOR_EXTENSION_PARAM_DATA(ext);
2169 
2170                 return set_vendor_extension_config(ext);
2171             }
2172 
2173         default:
2174             DEBUG_PRINT_ERROR("ERROR: unsupported index %d", (int) configIndex);
2175             break;
2176     }
2177 
2178     return OMX_ErrorNone;
2179 }
2180 
2181 /* ======================================================================
2182    FUNCTION
2183    omx_venc::ComponentDeInit
2184 
2185    DESCRIPTION
2186    Destroys the component and release memory allocated to the heap.
2187 
2188    PARAMETERS
2189    <TBD>.
2190 
2191    RETURN VALUE
2192    OMX Error None if everything successful.
2193 
2194    ========================================================================== */
component_deinit(OMX_IN OMX_HANDLETYPE hComp)2195 OMX_ERRORTYPE  omx_venc::component_deinit(OMX_IN OMX_HANDLETYPE hComp)
2196 {
2197     (void) hComp;
2198     OMX_U32 i = 0;
2199     DEBUG_PRINT_HIGH("omx_venc(): Inside component_deinit()");
2200     if (OMX_StateLoaded != m_state) {
2201         DEBUG_PRINT_ERROR("WARNING:Rxd DeInit,OMX not in LOADED state %d",\
2202                 m_state);
2203     }
2204 
2205     auto_lock l(m_buf_lock);
2206     if (m_out_mem_ptr) {
2207         DEBUG_PRINT_LOW("Freeing the Output Memory");
2208         for (i=0; i< m_sOutPortDef.nBufferCountActual; i++ ) {
2209             if (BITMASK_PRESENT(&m_out_bm_count, i)) {
2210                 BITMASK_CLEAR(&m_out_bm_count, i);
2211                 if (BITMASK_PRESENT(&m_client_out_bm_count, i))
2212                     BITMASK_CLEAR(&m_client_out_bm_count, i);
2213                 free_output_buffer (&m_out_mem_ptr[i]);
2214             }
2215 
2216             if (release_output_done()) {
2217                 break;
2218             }
2219         }
2220         free(m_out_mem_ptr);
2221         m_out_mem_ptr = NULL;
2222     }
2223 
2224     /*Check if the input buffers have to be cleaned up*/
2225     if (m_inp_mem_ptr
2226 #ifdef _ANDROID_ICS_
2227             && !meta_mode_enable
2228 #endif
2229        ) {
2230         DEBUG_PRINT_LOW("Freeing the Input Memory");
2231         for (i=0; i<m_sInPortDef.nBufferCountActual; i++ ) {
2232             if (BITMASK_PRESENT(&m_inp_bm_count, i)) {
2233                 BITMASK_CLEAR(&m_inp_bm_count, i);
2234                 if (BITMASK_PRESENT(&m_client_in_bm_count, i))
2235                     BITMASK_CLEAR(&m_client_in_bm_count, i);
2236                 free_input_buffer (&m_inp_mem_ptr[i]);
2237             }
2238 
2239             if (release_input_done()) {
2240                 break;
2241             }
2242         }
2243 
2244 
2245         free(m_inp_mem_ptr);
2246         m_inp_mem_ptr = NULL;
2247     }
2248 
2249     // Reset counters in mesg queues
2250     m_ftb_q.m_size=0;
2251     m_cmd_q.m_size=0;
2252     m_etb_q.m_size=0;
2253     m_ftb_q.m_read = m_ftb_q.m_write =0;
2254     m_cmd_q.m_read = m_cmd_q.m_write =0;
2255     m_etb_q.m_read = m_etb_q.m_write =0;
2256 
2257 #ifdef _ANDROID_
2258     // Clear the strong reference
2259     DEBUG_PRINT_HIGH("Calling m_heap_ptr.clear()");
2260     m_heap_ptr.clear();
2261 #endif // _ANDROID_
2262     DEBUG_PRINT_HIGH("Calling venc_close()");
2263     if (handle) {
2264         handle->venc_close();
2265         DEBUG_PRINT_HIGH("Deleting HANDLE[%p]", handle);
2266         delete (handle);
2267         handle = NULL;
2268     }
2269     DEBUG_PRINT_INFO("Component Deinit");
2270     return OMX_ErrorNone;
2271 }
2272 
2273 
dev_stop(void)2274 OMX_U32 omx_venc::dev_stop( void)
2275 {
2276     return handle->venc_stop();
2277 }
2278 
2279 
dev_pause(void)2280 OMX_U32 omx_venc::dev_pause(void)
2281 {
2282     return handle->venc_pause();
2283 }
2284 
dev_start(void)2285 OMX_U32 omx_venc::dev_start(void)
2286 {
2287     return handle->venc_start();
2288 }
2289 
dev_flush(unsigned port)2290 OMX_U32 omx_venc::dev_flush(unsigned port)
2291 {
2292     return handle->venc_flush(port);
2293 }
dev_resume(void)2294 OMX_U32 omx_venc::dev_resume(void)
2295 {
2296     return handle->venc_resume();
2297 }
2298 
dev_start_done(void)2299 OMX_U32 omx_venc::dev_start_done(void)
2300 {
2301     return handle->venc_start_done();
2302 }
2303 
dev_set_message_thread_id(pthread_t tid)2304 OMX_U32 omx_venc::dev_set_message_thread_id(pthread_t tid)
2305 {
2306     return handle->venc_set_message_thread_id(tid);
2307 }
2308 
dev_use_buf(void * buf_addr,unsigned port,unsigned index)2309 bool omx_venc::dev_use_buf(void *buf_addr,unsigned port,unsigned index)
2310 {
2311     return handle->venc_use_buf(buf_addr,port,index);
2312 }
2313 
dev_free_buf(void * buf_addr,unsigned port)2314 bool omx_venc::dev_free_buf(void *buf_addr,unsigned port)
2315 {
2316     return handle->venc_free_buf(buf_addr,port);
2317 }
2318 
dev_empty_buf(void * buffer,void * pmem_data_buf,unsigned index,unsigned fd)2319 bool omx_venc::dev_empty_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
2320 {
2321     bool bret = false;
2322     bret = handle->venc_empty_buf(buffer, pmem_data_buf,index,fd);
2323     hw_overload = handle->hw_overload;
2324     return bret;
2325 }
2326 
dev_fill_buf(void * buffer,void * pmem_data_buf,unsigned index,unsigned fd)2327 bool omx_venc::dev_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
2328 {
2329     return handle->venc_fill_buf(buffer, pmem_data_buf,index,fd);
2330 }
2331 
dev_get_seq_hdr(void * buffer,unsigned size,unsigned * hdrlen)2332 bool omx_venc::dev_get_seq_hdr(void *buffer, unsigned size, unsigned *hdrlen)
2333 {
2334     return handle->venc_get_seq_hdr(buffer, size, hdrlen);
2335 }
2336 
dev_get_capability_ltrcount(OMX_U32 * min,OMX_U32 * max,OMX_U32 * step_size)2337 bool omx_venc::dev_get_capability_ltrcount(OMX_U32 *min, OMX_U32 *max, OMX_U32 *step_size)
2338 {
2339 #ifdef _MSM8974_
2340     (void) min;
2341     (void) max;
2342     (void) step_size;
2343     DEBUG_PRINT_ERROR("Get Capability LTR Count is not supported");
2344     return false;
2345 #else
2346     return handle->venc_get_capability_ltrcount(min, max, step_size);
2347 #endif
2348 }
2349 
dev_get_performance_level(OMX_U32 * perflevel)2350 bool omx_venc::dev_get_performance_level(OMX_U32 *perflevel)
2351 {
2352 #ifdef _MSM8974_
2353     return handle->venc_get_performance_level(perflevel);
2354 #else
2355     DEBUG_PRINT_ERROR("Get performance level is not supported");
2356     return false;
2357 #endif
2358 }
2359 
dev_get_vui_timing_info(OMX_U32 * enabled)2360 bool omx_venc::dev_get_vui_timing_info(OMX_U32 *enabled)
2361 {
2362 #ifdef _MSM8974_
2363     return handle->venc_get_vui_timing_info(enabled);
2364 #else
2365     DEBUG_PRINT_ERROR("Get vui timing information is not supported");
2366     return false;
2367 #endif
2368 }
2369 
dev_get_vqzip_sei_info(OMX_U32 * enabled)2370 bool omx_venc::dev_get_vqzip_sei_info(OMX_U32 *enabled)
2371 {
2372     return handle->venc_get_vqzip_sei_info(enabled);
2373 }
2374 
dev_get_peak_bitrate(OMX_U32 * peakbitrate)2375 bool omx_venc::dev_get_peak_bitrate(OMX_U32 *peakbitrate)
2376 {
2377 #ifdef _MSM8974_
2378     return handle->venc_get_peak_bitrate(peakbitrate);
2379 #else
2380     DEBUG_PRINT_ERROR("Get peak bitrate is not supported");
2381     return false;
2382 #endif
2383 }
2384 
dev_get_batch_size(OMX_U32 * size)2385 bool omx_venc::dev_get_batch_size(OMX_U32 *size)
2386 {
2387 #ifdef _MSM8974_
2388     return handle->venc_get_batch_size(size);
2389 #else
2390     DEBUG_PRINT_ERROR("Get batch size is not supported");
2391     return false;
2392 #endif
2393 }
2394 
dev_get_temporal_layer_caps(OMX_U32 * nMaxLayers,OMX_U32 * nMaxBLayers)2395 bool omx_venc::dev_get_temporal_layer_caps(OMX_U32 *nMaxLayers,
2396         OMX_U32 *nMaxBLayers) {
2397     return handle->venc_get_temporal_layer_caps(nMaxLayers, nMaxBLayers);
2398 }
2399 
dev_loaded_start()2400 bool omx_venc::dev_loaded_start()
2401 {
2402     return handle->venc_loaded_start();
2403 }
2404 
dev_loaded_stop()2405 bool omx_venc::dev_loaded_stop()
2406 {
2407     return handle->venc_loaded_stop();
2408 }
2409 
dev_loaded_start_done()2410 bool omx_venc::dev_loaded_start_done()
2411 {
2412     return handle->venc_loaded_start_done();
2413 }
2414 
dev_loaded_stop_done()2415 bool omx_venc::dev_loaded_stop_done()
2416 {
2417     return handle->venc_loaded_stop_done();
2418 }
2419 
dev_get_buf_req(OMX_U32 * min_buff_count,OMX_U32 * actual_buff_count,OMX_U32 * buff_size,OMX_U32 port)2420 bool omx_venc::dev_get_buf_req(OMX_U32 *min_buff_count,
2421         OMX_U32 *actual_buff_count,
2422         OMX_U32 *buff_size,
2423         OMX_U32 port)
2424 {
2425     return handle->venc_get_buf_req(min_buff_count,
2426             actual_buff_count,
2427             buff_size,
2428             port);
2429 
2430 }
2431 
dev_set_buf_req(OMX_U32 * min_buff_count,OMX_U32 * actual_buff_count,OMX_U32 * buff_size,OMX_U32 port)2432 bool omx_venc::dev_set_buf_req(OMX_U32 *min_buff_count,
2433         OMX_U32 *actual_buff_count,
2434         OMX_U32 *buff_size,
2435         OMX_U32 port)
2436 {
2437     return handle->venc_set_buf_req(min_buff_count,
2438             actual_buff_count,
2439             buff_size,
2440             port);
2441 
2442 }
2443 
dev_is_video_session_supported(OMX_U32 width,OMX_U32 height)2444 bool omx_venc::dev_is_video_session_supported(OMX_U32 width, OMX_U32 height)
2445 {
2446 #ifdef _MSM8974_
2447     return handle->venc_is_video_session_supported(width,height);
2448 #else
2449     DEBUG_PRINT_LOW("Check against video capability not supported");
2450     return true;
2451 #endif
2452 }
2453 
dev_handle_output_extradata(void * buffer)2454 int omx_venc::dev_handle_output_extradata(void *buffer)
2455 {
2456     return handle->handle_output_extradata(buffer);
2457 }
2458 
dev_handle_input_extradata(void * buffer,int fd)2459 int omx_venc::dev_handle_input_extradata(void *buffer, int fd)
2460 {
2461     return handle->handle_input_extradata(buffer, fd);
2462 }
2463 
dev_set_extradata_cookie(void * cookie)2464 void omx_venc::dev_set_extradata_cookie(void *cookie)
2465 {
2466     handle->mInputExtradata.setCookieForConfig(cookie);
2467 }
2468 
dev_set_format(int color)2469 int omx_venc::dev_set_format(int color)
2470 {
2471     return handle->venc_set_format(color);
2472 }
2473 
async_message_process(void * context,void * message)2474 int omx_venc::async_message_process (void *context, void* message)
2475 {
2476     omx_video* omx = NULL;
2477     struct venc_msg *m_sVenc_msg = NULL;
2478     OMX_BUFFERHEADERTYPE* omxhdr = NULL;
2479     struct venc_buffer *temp_buff = NULL;
2480 
2481     if (context == NULL || message == NULL) {
2482         DEBUG_PRINT_ERROR("ERROR: omx_venc::async_message_process invalid i/p params");
2483         return -1;
2484     }
2485     m_sVenc_msg = (struct venc_msg *)message;
2486 
2487     omx = reinterpret_cast<omx_video*>(context);
2488 
2489     if (m_sVenc_msg->statuscode != VEN_S_SUCCESS) {
2490         DEBUG_PRINT_ERROR("ERROR: async_msg_process() - Error statuscode = %lu",
2491                 m_sVenc_msg->statuscode);
2492         if(m_sVenc_msg->msgcode == VEN_MSG_HW_OVERLOAD) {
2493             omx->post_event (0, m_sVenc_msg->statuscode,\
2494                     OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD);
2495         } else {
2496             omx->post_event (0, m_sVenc_msg->statuscode,\
2497                     OMX_COMPONENT_GENERATE_HARDWARE_ERROR);
2498         }
2499     }
2500 
2501     DEBUG_PRINT_LOW("omx_venc::async_message_process- msgcode = %lu",
2502             m_sVenc_msg->msgcode);
2503     switch (m_sVenc_msg->msgcode) {
2504         case VEN_MSG_START:
2505             omx->post_event (0,m_sVenc_msg->statuscode,\
2506                     OMX_COMPONENT_GENERATE_START_DONE);
2507             break;
2508         case VEN_MSG_STOP:
2509             omx->post_event (0,m_sVenc_msg->statuscode,\
2510                     OMX_COMPONENT_GENERATE_STOP_DONE);
2511             break;
2512         case VEN_MSG_RESUME:
2513             omx->post_event (0,m_sVenc_msg->statuscode,\
2514                     OMX_COMPONENT_GENERATE_RESUME_DONE);
2515             break;
2516         case VEN_MSG_PAUSE:
2517             omx->post_event (0,m_sVenc_msg->statuscode,\
2518                     OMX_COMPONENT_GENERATE_PAUSE_DONE);
2519             break;
2520         case VEN_MSG_FLUSH_INPUT_DONE:
2521 
2522             omx->post_event (0,m_sVenc_msg->statuscode,\
2523                     OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH);
2524             break;
2525         case VEN_MSG_FLUSH_OUPUT_DONE:
2526             omx->post_event (0,m_sVenc_msg->statuscode,\
2527                     OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH);
2528             break;
2529         case VEN_MSG_INPUT_BUFFER_DONE:
2530             omxhdr = (OMX_BUFFERHEADERTYPE* )\
2531                      m_sVenc_msg->buf.clientdata;
2532 
2533             if (omxhdr == NULL ||
2534                     (((OMX_U32)(omxhdr - omx->m_inp_mem_ptr) > omx->m_sInPortDef.nBufferCountActual) &&
2535                      ((OMX_U32)(omxhdr - omx->meta_buffer_hdr) > omx->m_sInPortDef.nBufferCountActual))) {
2536                 omxhdr = NULL;
2537                 m_sVenc_msg->statuscode = VEN_S_EFAIL;
2538             }
2539 
2540 #ifdef _ANDROID_ICS_
2541             omx->omx_release_meta_buffer(omxhdr);
2542 #endif
2543             omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode,
2544                     OMX_COMPONENT_GENERATE_EBD);
2545             break;
2546         case VEN_MSG_OUTPUT_BUFFER_DONE:
2547         {
2548             omxhdr = (OMX_BUFFERHEADERTYPE*)m_sVenc_msg->buf.clientdata;
2549             OMX_U32 bufIndex = (OMX_U32)(omxhdr - omx->m_out_mem_ptr);
2550 
2551             if ( (omxhdr != NULL) &&
2552                     (bufIndex  < omx->m_sOutPortDef.nBufferCountActual)) {
2553                 auto_lock l(omx->m_buf_lock);
2554                 if (BITMASK_ABSENT(&(omx->m_out_bm_count), bufIndex)) {
2555                     DEBUG_PRINT_ERROR("Recieved FBD for buffer that is already freed !");
2556                     break;
2557                 }
2558                 if (!omx->is_secure_session() && (m_sVenc_msg->buf.len <=  omxhdr->nAllocLen)) {
2559                     omxhdr->nFilledLen = m_sVenc_msg->buf.len;
2560                     omxhdr->nOffset = m_sVenc_msg->buf.offset;
2561                     omxhdr->nTimeStamp = m_sVenc_msg->buf.timestamp;
2562                     DEBUG_PRINT_LOW("o/p TS = %u", (unsigned int)m_sVenc_msg->buf.timestamp);
2563                     omxhdr->nFlags = m_sVenc_msg->buf.flags;
2564 
2565                     /*Use buffer case*/
2566                     if (BITMASK_PRESENT(&(omx->m_client_out_bm_count), bufIndex) &&
2567                         omx->output_use_buffer && !omx->m_use_output_pmem && !omx->is_secure_session()) {
2568                         DEBUG_PRINT_LOW("memcpy() for o/p Heap UseBuffer");
2569                         memcpy(omxhdr->pBuffer,
2570                                 (m_sVenc_msg->buf.ptrbuffer),
2571                                 m_sVenc_msg->buf.len);
2572                     }
2573                 } else {
2574                     omxhdr->nFilledLen = 0;
2575                 }
2576 
2577             } else {
2578                 omxhdr = NULL;
2579                 m_sVenc_msg->statuscode = VEN_S_EFAIL;
2580             }
2581             omx->post_event ((unsigned long)omxhdr,m_sVenc_msg->statuscode,
2582                     OMX_COMPONENT_GENERATE_FBD);
2583             break;
2584         }
2585         case VEN_MSG_NEED_OUTPUT_BUFFER:
2586             //TBD what action needs to be done here??
2587             break;
2588 #ifndef _MSM8974_
2589         case VEN_MSG_LTRUSE_FAILED:
2590             DEBUG_PRINT_ERROR("LTRUSE Failed!");
2591             omx->post_event (NULL,m_sVenc_msg->statuscode,
2592                     OMX_COMPONENT_GENERATE_LTRUSE_FAILED);
2593             break;
2594 #endif
2595         default:
2596             DEBUG_PRINT_HIGH("Unknown msg received : %lu", m_sVenc_msg->msgcode);
2597             break;
2598     }
2599     return 0;
2600 }
2601 
dev_color_align(OMX_BUFFERHEADERTYPE * buffer,OMX_U32 width,OMX_U32 height)2602 bool omx_venc::dev_color_align(OMX_BUFFERHEADERTYPE *buffer,
2603                 OMX_U32 width, OMX_U32 height)
2604 {
2605     if(secure_session) {
2606         DEBUG_PRINT_ERROR("Cannot align colors in secure session.");
2607         return OMX_FALSE;
2608     }
2609     return handle->venc_color_align(buffer, width,height);
2610 }
2611 
is_secure_session()2612 bool omx_venc::is_secure_session()
2613 {
2614     return secure_session;
2615 }
2616 
dev_get_output_log_flag()2617 bool omx_venc::dev_get_output_log_flag()
2618 {
2619     return handle->venc_get_output_log_flag();
2620 }
2621 
dev_output_log_buffers(const char * buffer,int bufferlen)2622 int omx_venc::dev_output_log_buffers(const char *buffer, int bufferlen)
2623 {
2624     return handle->venc_output_log_buffers(buffer, bufferlen);
2625 }
2626 
dev_extradata_log_buffers(char * buffer)2627 int omx_venc::dev_extradata_log_buffers(char *buffer)
2628 {
2629     return handle->venc_extradata_log_buffers(buffer);
2630 }
2631