111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
22e1e93b75bc282dafdff24eb3b473af177e3e35bThierry StrudelCopyright (c) 2010-2017, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are met:
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer.
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above copyright
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer in the
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      documentation and/or other materials provided with the distribution.
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      the names of its contributors may be used to endorse or promote
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      products derived from this software without specific prior written
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      permission.
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <string.h>
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/ioctl.h>
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/prctl.h>
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <sys/eventfd.h>
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <unistd.h>
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <fcntl.h>
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "video_encoder_device_v4l2.h"
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "omx_video_encoder.h"
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_vidc.h>
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <linux/msm_ion.h>
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <math.h>
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/msm_media_info.h>
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <cutils/properties.h>
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#include <qdMetaData.h>
52fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
53b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#define ATRACE_TAG ATRACE_TAG_VIDEO
54b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel#include <utils/Trace.h>
55b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
56d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel#define YUV_STATS_LIBRARY_NAME "libgpustats.so" // UBWC case: use GPU library
57d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ALIGN(x, to_align) ((((unsigned long) x) + (to_align - 1)) & ~(to_align - 1))
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define EXTRADATA_IDX(__num_planes) ((__num_planes) ? (__num_planes) - 1 : 0)
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAXDPB 16
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MIN(x,y) (((x) < (y)) ? (x) : (y))
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX(x,y) (((x) > (y)) ? (x) : (y))
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define ROUND(__sz, __align) (((__sz) + ((__align>>1))) & (~(__align-1)))
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_PROFILE_PARAMS 6
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_SP_START 0
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MPEG4_ASP_START (MPEG4_SP_START + 10)
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define H263_BP_START 0
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define HEVC_MAIN_START 0
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define HEVC_MAIN10_START (HEVC_MAIN_START + 13)
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define POLL_TIMEOUT 1000
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define MAX_SUPPORTED_SLICES_PER_FRAME 28 /* Max supported slices with 32 output buffers */
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_4K 0x1000
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define SZ_1M 0x100000
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* MPEG4 profile and level table*/
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int mpeg4_profile_level_table[][MAX_PROFILE_PARAMS]= {
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*max mb per frame, max mb per sec, max bitrate, level, profile, dpbmbs*/
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,64000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileSimple,0},
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,64000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileSimple,0},
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,5940,128000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileSimple,0},
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,11880,384000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileSimple,0},
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {1200,36000,4000000,OMX_VIDEO_MPEG4Level4a,OMX_VIDEO_MPEG4ProfileSimple,0},
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {1620,40500,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0},
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {3600,108000,12000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0},
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0},
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileSimple,0},
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Please update MPEG4_ASP_START accordingly, while adding new element */
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {0,0,0,0,0,0},
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,128000,OMX_VIDEO_MPEG4Level0,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,128000,OMX_VIDEO_MPEG4Level1,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,5940,384000,OMX_VIDEO_MPEG4Level2,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,11880,768000,OMX_VIDEO_MPEG4Level3,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {792,23760,3000000,OMX_VIDEO_MPEG4Level4,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {1620,48600,8000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {32400,972000,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {34560,1036800,20000000,OMX_VIDEO_MPEG4Level5,OMX_VIDEO_MPEG4ProfileAdvancedSimple,0},
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {0,0,0,0,0,0},
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* H264 profile and level table*/
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int h264_profile_level_table[][MAX_PROFILE_PARAMS]= {
104fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    /*max mb per frame, max mb per sec, max bitrate, profile, ignore for h264, dpbmbs*/
105fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {99,1485,64000,OMX_VIDEO_AVCLevel1,0,396},
106fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {99,1485,128000,OMX_VIDEO_AVCLevel1b,0,396},
107fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {396,3000,192000,OMX_VIDEO_AVCLevel11,0,900},
108fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {396,6000,384000,OMX_VIDEO_AVCLevel12,0,2376},
109fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {396,11880,768000,OMX_VIDEO_AVCLevel13,0,2376},
110fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {396,11880,2000000,OMX_VIDEO_AVCLevel2,0,2376},
111fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {792,19800,4000000,OMX_VIDEO_AVCLevel21,0,4752},
112fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {1620,20250,4000000,OMX_VIDEO_AVCLevel22,0,8100},
113fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {1620,40500,10000000,OMX_VIDEO_AVCLevel3,0,8100},
114fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {3600,108000,14000000,OMX_VIDEO_AVCLevel31,0,18000},
115fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {5120,216000,20000000,OMX_VIDEO_AVCLevel32,0,20480},
116fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {8192,245760,20000000,OMX_VIDEO_AVCLevel4,0,32768},
117fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {8192,245760,50000000,OMX_VIDEO_AVCLevel41,0,32768},
118fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {8704,522240,50000000,OMX_VIDEO_AVCLevel42,0,34816},
119fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {22080,589824,135000000,OMX_VIDEO_AVCLevel5,0,110400},
120fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {36864,983040,240000000,OMX_VIDEO_AVCLevel51,0,184320},
121fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {36864,2073600,240000000,OMX_VIDEO_AVCLevel52,0,184320},
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Please update H264_HP_START accordingly, while adding new element */
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {0,0,0,0,0,0},
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* H263 profile and level table*/
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int h263_profile_level_table[][MAX_PROFILE_PARAMS]= {
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*max mb per frame, max mb per sec, max bitrate, level, profile, dpbmbs*/
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,64000,OMX_VIDEO_H263Level10,OMX_VIDEO_H263ProfileBaseline,0},
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,5940,128000,OMX_VIDEO_H263Level20,OMX_VIDEO_H263ProfileBaseline,0},
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,11880,384000,OMX_VIDEO_H263Level30,OMX_VIDEO_H263ProfileBaseline,0},
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,11880,2048000,OMX_VIDEO_H263Level40,OMX_VIDEO_H263ProfileBaseline,0},
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {99,1485,128000,OMX_VIDEO_H263Level45,OMX_VIDEO_H263ProfileBaseline,0},
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {396,19800,4096000,OMX_VIDEO_H263Level50,OMX_VIDEO_H263ProfileBaseline,0},
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {810,40500,8192000,OMX_VIDEO_H263Level60,OMX_VIDEO_H263ProfileBaseline,0},
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {1620,81000,16384000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0},
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {32400,972000,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0},
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {34560,1036800,20000000,OMX_VIDEO_H263Level70,OMX_VIDEO_H263ProfileBaseline,0},
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {0,0,0,0,0,0}
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* HEVC profile and level table*/
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const unsigned int hevc_profile_level_table[][MAX_PROFILE_PARAMS]= {
144fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    /*max mb per frame, max mb per sec, max bitrate, level, ignore profile and dpbmbs for HEVC */
145fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {99,1485,128000,OMX_VIDEO_HEVCMainTierLevel1,0,0},
146fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {396,11880,1500000,OMX_VIDEO_HEVCMainTierLevel2,0,0},
147fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {900,27000,3000000,OMX_VIDEO_HEVCMainTierLevel21,0,0},
148fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {2025,60750,6000000,OMX_VIDEO_HEVCMainTierLevel3,0,0},
149fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {8640,259200,10000000,OMX_VIDEO_HEVCMainTierLevel31,0,0},
150fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {34560,1166400,12000000,OMX_VIDEO_HEVCMainTierLevel4,0,0},
151fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,20000000,OMX_VIDEO_HEVCMainTierLevel41,0,0},
152fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,8294400,25000000,OMX_VIDEO_HEVCMainTierLevel5,0,0},
153fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,40000000,OMX_VIDEO_HEVCMainTierLevel51,0,0},
154fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,50000000,OMX_VIDEO_HEVCHighTierLevel41,0,0},
155fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,100000000,OMX_VIDEO_HEVCHighTierLevel5,0,0},
156fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,160000000,OMX_VIDEO_HEVCHighTierLevel51,0,0},
157fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    {138240,4147200,240000000,OMX_VIDEO_HEVCHighTierLevel52,0,0},
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Please update HEVC_MAIN_START accordingly, while adding new element */
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {0,0,0,0,0},
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Log2(number, power)  { OMX_U32 temp = number; power = 0; while( (0 == (temp & 0x1)) &&  power < 16) { temp >>=0x1; power++; } }
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define Q16ToFraction(q,num,den) { OMX_U32 power; Log2(q,power);  num = q >> power; den = 0x1 << (16 - power); }
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define BUFFER_LOG_LOC "/data/misc/media"
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//constructor
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev(class omx_venc *venc_class)
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //nothing to do
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i = 0;
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_handle = venc_class;
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    etb = ebd = ftb = fbd = 0;
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = -1;
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < MAX_PORT; i++)
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        streaming[i] = false;
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    stopped = 1;
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    paused = false;
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_created = false;
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_force_stop = false;
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    color_format = 0;
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hw_overload = false;
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mBatchSize = 0;
1892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    deinterlace_enabled = false;
1902e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    m_roi_enabled = false;
1912e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_init(&m_roilock, NULL);
19211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&pause_resume_mlock, NULL);
19311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_cond_init(&pause_resume_cond, NULL);
19411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&input_extradata_info, 0, sizeof(input_extradata_info));
19511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&output_extradata_info, 0, sizeof(output_extradata_info));
19611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&idrperiod, 0, sizeof(idrperiod));
19711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&multislice, 0, sizeof(multislice));
19811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&slice_mode, 0 , sizeof(slice_mode));
19911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_sVenc_cfg, 0, sizeof(m_sVenc_cfg));
20011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&rate_ctrl, 0, sizeof(rate_ctrl));
20111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&bitrate, 0, sizeof(bitrate));
20211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&intra_period, 0, sizeof(intra_period));
20311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&codec_profile, 0, sizeof(codec_profile));
20411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&set_param, 0, sizeof(set_param));
20511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&time_inc, 0, sizeof(time_inc));
20611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_sInput_buff_property, 0, sizeof(m_sInput_buff_property));
20711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_sOutput_buff_property, 0, sizeof(m_sOutput_buff_property));
20811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&session_qp, 0, sizeof(session_qp));
2092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    memset(&session_ipb_qp_values, 0, sizeof(session_ipb_qp_values));
21011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&entropy, 0, sizeof(entropy));
21111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&dbkfilter, 0, sizeof(dbkfilter));
21211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&intra_refresh, 0, sizeof(intra_refresh));
21311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&hec, 0, sizeof(hec));
21411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&voptimecfg, 0, sizeof(voptimecfg));
21511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&capability, 0, sizeof(capability));
21611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&m_debug,0,sizeof(m_debug));
21711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&hier_layers,0,sizeof(hier_layers));
21811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_searchrange_set = false;
21911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enable_mv_narrow_searchrange = false;
22011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    supported_rc_modes = RC_ALL;
22111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&vqzip_sei_info, 0, sizeof(vqzip_sei_info));
22211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&ltrinfo, 0, sizeof(ltrinfo));
22311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fd_list, 0, sizeof(fd_list));
22411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&hybrid_hp, 0, sizeof(hybrid_hp));
22511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sess_priority.priority = 1;
22611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    operating_rate = 0;
22711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    low_latency_mode = OMX_FALSE;
228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&color_space, 0x0, sizeof(color_space));
229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&temporal_layers_config, 0x0, sizeof(temporal_layers_config));
23011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
23211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.log.in", property_value, "0");
23311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.in_buffer_log = atoi(property_value);
23411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.log.out", property_value, "0");
23611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.out_buffer_log = atoi(property_value);
23711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
23811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.log.extradata", property_value, "0");
23911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_debug.extradata_log = atoi(property_value);
24011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
24111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _UBWC_
24211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("debug.gralloc.gfx_ubwc_disable", property_value, "0");
24311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) ||
24411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) {
24511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        is_gralloc_source_ubwc = 0;
24611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
24711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        is_gralloc_source_ubwc = 1;
24811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
24911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#else
25011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_gralloc_source_ubwc = 0;
25111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
25211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    property_get("persist.vidc.enc.csc.enable", property_value, "0");
254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) ||
255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) {
256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        is_csc_enabled = 1;
257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        is_csc_enabled = 0;
259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    property_get("vidc.enc.disable.pq", property_value, "0");
263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if(!(strncmp(property_value, "1", PROPERTY_VALUE_MAX)) ||
264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        !(strncmp(property_value, "true", PROPERTY_VALUE_MAX))) {
265fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_pq.is_pq_force_disable = 1;
266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
267fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        m_pq.is_pq_force_disable = 0;
268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
27111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    snprintf(m_debug.log_loc, PROPERTY_VALUE_MAX,
27211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             "%s", BUFFER_LOG_LOC);
27311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
27411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
27511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::~venc_dev()
27611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
2772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (m_roi_enabled) {
2782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        std::list<roidata>::iterator iter;
2792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        pthread_mutex_lock(&m_roilock);
2802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        for (iter = m_roilist.begin(); iter != m_roilist.end(); iter++) {
2812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            DEBUG_PRINT_HIGH("roidata with timestamp (%lld) should have been removed already",
2822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                iter->timestamp);
2832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            free(iter->info.pRoiMBInfo);
2842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        }
2852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        m_roilist.clear();
2862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        pthread_mutex_unlock(&m_roilock);
2872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
2882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_destroy(&m_roilock);
28911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
29011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid* venc_dev::async_venc_message_thread (void *input)
29211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
29311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_msg venc_msg;
29411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_video* omx_venc_base = NULL;
29511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_venc *omx = reinterpret_cast<omx_venc*>(input);
29611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    omx_venc_base = reinterpret_cast<omx_video*>(input);
29711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE* omxhdr = NULL;
29811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
29911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    prctl(PR_SET_NAME, (unsigned long)"VideoEncCallBackThread", 0, 0, 0);
30011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
30111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pollfd pfds[2];
30211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer v4l2_buf;
30311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event dqevent;
30411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct statistics stats;
30511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].events = POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM | POLLRDBAND | POLLPRI;
30611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].events = POLLIN | POLLERR;
30711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[0].fd = omx->handle->m_nDriver_fd;
30811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pfds[1].fd = omx->handle->m_poll_efd;
30911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int error_code = 0,rc=0;
31011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&stats, 0, sizeof(statistics));
31211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&v4l2_buf, 0, sizeof(v4l2_buf));
31311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (!omx->handle->async_thread_force_stop) {
31511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&omx->handle->pause_resume_mlock);
31611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
31711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (omx->handle->paused) {
31811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_msg.msgcode = VEN_MSG_PAUSE;
31911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_msg.statuscode = VEN_S_SUCCESS;
32011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->async_message_process(input, &venc_msg) < 0) {
32211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to process pause msg");
32311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
32411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
32511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
32611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
32711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* Block here until the IL client resumes us again */
32811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_cond_wait(&omx->handle->pause_resume_cond,
32911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    &omx->handle->pause_resume_mlock);
33011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_msg.msgcode = VEN_MSG_RESUME;
33211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_msg.statuscode = VEN_S_SUCCESS;
33311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
33411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (omx->async_message_process(input, &venc_msg) < 0) {
33511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Failed to process resume msg");
33611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
33711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
33811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
33911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&stats, 0, sizeof(statistics));
34011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
34111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&omx->handle->pause_resume_mlock);
34311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = poll(pfds, 2, POLL_TIMEOUT);
34511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
34611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc) {
34711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Poll timedout, pipeline stalled due to client/firmware ETB: %d, EBD: %d, FTB: %d, FBD: %d",
34811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omx->handle->etb, omx->handle->ebd, omx->handle->ftb, omx->handle->fbd);
34911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            continue;
35011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (rc < 0 && errno != EINTR && errno != EAGAIN) {
35111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Error while polling: %d, errno = %d", rc, errno);
35211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
35311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
35411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[1].revents & POLLIN) || (pfds[1].revents & POLLERR)) {
35611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("async_venc_message_thread interrupted to be exited");
35711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
35811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
35911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLIN) || (pfds[0].revents & POLLRDNORM)) {
36111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
36211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
36311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = omx->handle->num_output_planes;
36411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
36511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
36611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
36711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode=VEN_MSG_OUTPUT_BUFFER_DONE;
36811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode=VEN_S_SUCCESS;
36911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omxhdr=omx_venc_base->m_out_mem_ptr+v4l2_buf.index;
37011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.len= v4l2_buf.m.planes->bytesused;
37111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.offset = v4l2_buf.m.planes->data_offset;
37211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.flags = 0;
37311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.ptrbuffer = (OMX_U8 *)omx_venc_base->m_pOutput_pmem[v4l2_buf.index].buffer;
37411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.clientdata=(void*)omxhdr;
37511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.timestamp = (uint64_t) v4l2_buf.timestamp.tv_sec * (uint64_t) 1000000 + (uint64_t) v4l2_buf.timestamp.tv_usec;
37611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
37711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* TODO: ideally report other types of frames as well
37811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * for now it doesn't look like IL client cares about
37911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 * other types
38011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 */
38111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_IDRFRAME)
38211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= QOMX_VIDEO_PictureTypeIDR;
38311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
38411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (v4l2_buf.flags & V4L2_BUF_FLAG_KEYFRAME)
38511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= OMX_BUFFERFLAG_SYNCFRAME;
38611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
387a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                if (v4l2_buf.flags & V4L2_BUF_FLAG_PFRAME) {
388a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    venc_msg.buf.flags |= OMX_VIDEO_PictureTypeP;
389a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                } else if (v4l2_buf.flags & V4L2_BUF_FLAG_BFRAME) {
390a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    venc_msg.buf.flags |= OMX_VIDEO_PictureTypeB;
391a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                }
392a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
39311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG)
39411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= OMX_BUFFERFLAG_CODECCONFIG;
39511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (v4l2_buf.flags & V4L2_QCOM_BUF_FLAG_EOS)
39711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EOS;
39811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
39911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->handle->num_output_planes > 1 && v4l2_buf.m.planes->bytesused)
40011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= OMX_BUFFERFLAG_EXTRADATA;
40111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omxhdr->nFilledLen)
40311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    venc_msg.buf.flags |= OMX_BUFFERFLAG_ENDOFFRAME;
40411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->handle->fbd++;
40611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                stats.bytes_generated += venc_msg.buf.len;
40711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
40811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
40911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
41011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
41111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
41211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
41311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
41411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
41511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((pfds[0].revents & POLLOUT) || (pfds[0].revents & POLLWRNORM)) {
41611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
41711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.memory = V4L2_MEMORY_USERPTR;
41811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.m.planes = plane;
41911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2_buf.length = omx->handle->num_input_planes;
42011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            while (!ioctl(pfds[0].fd, VIDIOC_DQBUF, &v4l2_buf)) {
42211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode=VEN_MSG_INPUT_BUFFER_DONE;
42311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode=VEN_S_SUCCESS;
42411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                omx->handle->ebd++;
42511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
42611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->handle->mBatchSize) {
42711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    int bufIndex = omx->handle->mBatchInfo.retrieveBufferAt(v4l2_buf.index);
42811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (bufIndex < 0) {
42911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Retrieved invalid buffer %d", v4l2_buf.index);
43011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
43111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
43211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (omx->handle->mBatchInfo.isPending(bufIndex)) {
43311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW(" EBD for %d [v4l2-id=%d].. batch still pending",
43411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                bufIndex, v4l2_buf.index);
43511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        //do not return to client yet
43611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        continue;
43711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
43811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    v4l2_buf.index = bufIndex;
43911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
44011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx_venc_base->mUseProxyColorFormat && !omx_venc_base->mUsesColorConversion)
44111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omxhdr = &omx_venc_base->meta_buffer_hdr[v4l2_buf.index];
44211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                else
44311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    omxhdr = &omx_venc_base->m_inp_mem_ptr[v4l2_buf.index];
44411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.buf.clientdata=(void*)omxhdr;
44611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("sending EBD %p [id=%d]", omxhdr, v4l2_buf.index);
44811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
44911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
45011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
45111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
45211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
45311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
45411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (pfds[0].revents & POLLPRI) {
45611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(pfds[0].fd, VIDIOC_DQEVENT, &dqevent);
45711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
45811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (dqevent.type == V4L2_EVENT_MSM_VIDC_FLUSH_DONE) {
45911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode = VEN_MSG_FLUSH_INPUT_DONE;
46011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode = VEN_S_SUCCESS;
46111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
46311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
46411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
46511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
46611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
46711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode = VEN_MSG_FLUSH_OUPUT_DONE;
46811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode = VEN_S_SUCCESS;
46911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
47111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
47211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
47311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
47411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_HW_OVERLOAD) {
47511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("HW Overload received");
47611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode = VEN_S_EFAIL;
47711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode = VEN_MSG_HW_OVERLOAD;
47811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
47911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
48011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
48111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
48211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
48311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (dqevent.type == V4L2_EVENT_MSM_VIDC_SYS_ERROR){
48411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Encoder is in bad state");
48511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.msgcode = VEN_MSG_INDICATION;
48611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                venc_msg.statuscode=VEN_S_EFAIL;
48711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
48811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (omx->async_message_process(input,&venc_msg) < 0) {
48911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Wrong ioctl message");
49011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
49111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
49211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
49311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
49411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* calc avg. fps, bitrate */
49611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct timeval tv;
49711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        gettimeofday(&tv,NULL);
49811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U64 time_diff = (OMX_U32)((tv.tv_sec * 1000000 + tv.tv_usec) -
49911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (stats.prev_tv.tv_sec * 1000000 + stats.prev_tv.tv_usec));
50011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (time_diff >= 5000000) {
50111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (stats.prev_tv.tv_sec) {
50211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 num_fbd = omx->handle->fbd - stats.prev_fbd;
50311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                float framerate = num_fbd * 1000000/(float)time_diff;
50411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 bitrate = (stats.bytes_generated * 8/num_fbd) * framerate;
50511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("stats: avg. fps %0.2f, bitrate %d",
50611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    framerate, bitrate);
50711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
50811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stats.prev_tv = tv;
50911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stats.bytes_generated = 0;
51011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stats.prev_fbd = omx->handle->fbd;
51111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
51211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
51411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("omx_venc: Async Thread exit");
51611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return NULL;
51711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
51811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
51911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic const int event_type[] = {
52011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_FLUSH_DONE,
52111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    V4L2_EVENT_MSM_VIDC_SYS_ERROR
52211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel};
52311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
52411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE subscribe_to_events(int fd)
52511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
52611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
52711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
52811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
52911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
53011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&sub, 0, sizeof(sub));
53111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
53311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Invalid input: %d", fd);
53411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
53511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
53611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
53711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
53811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
53911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
54011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub);
54111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
54311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Failed to subscribe event: 0x%x", sub.type);
54411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
54511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
54611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
54711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
54811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (i < array_sz) {
54911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (--i; i >=0 ; i--) {
55011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&sub, 0, sizeof(sub));
55111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            sub.type = event_type[i];
55211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
55311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
55511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
55611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
55711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
55811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        eRet = OMX_ErrorNotImplemented;
55911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
56011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
56111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
56211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
56311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelvoid venc_dev::get_roi_for_timestamp(struct roidata &roi, OMX_TICKS timestamp)
5652e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel{
5662e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    std::list<roidata>::iterator iter;
5672e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    bool found = false;
5682e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
5692e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memset(&roi, 0, sizeof(struct roidata));
5702e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.dirty = false;
5712e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
5722e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    /*
5732e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * look for the roi data which has timestamp nearest and
5742e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * lower than the etb timestamp, we should not take the
5752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * roi data which has the timestamp greater than etb timestamp.
5762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     */
5772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_lock(&m_roilock);
5782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    iter = m_roilist.begin();
5792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    while (iter != m_roilist.end()) {
5802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        if (iter->timestamp <= timestamp) {
5812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            if (found) {
5822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                /* we found roidata in previous iteration already and got another
5832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                 * roidata in this iteration, so we will use this iteration's
5842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                 * roidata and free the previous roidata which is no longer used.
5852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                 */
5862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                DEBUG_PRINT_LOW("freeing unused roidata with timestamp %lld us", roi.timestamp);
5872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                free(roi.info.pRoiMBInfo);
5882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            }
5892e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            found = true;
5902e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roi = *iter;
5912e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            /* we got roidata so erase the elment in the roi list.
5922e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel             * after list erase iterator will point to next element
5932e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel             * so we don't need to increment iter after erase.
5942e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel             */
5952e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            iter = m_roilist.erase(iter);
5962e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        } else {
5972e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            iter++;
5982e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        }
5992e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
6002e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (found) {
6012e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        DEBUG_PRINT_LOW("found roidata with timestamp %lld us", roi.timestamp);
6022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
6032e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_unlock(&m_roilock);
6042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel}
6052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
60611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::append_mbi_extradata(void *dst, struct msm_vidc_extradata_header* src)
60711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
60811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_QCOM_EXTRADATA_MBINFO *mbi = (OMX_QCOM_EXTRADATA_MBINFO *)dst;
60911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!dst || !src)
61111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 0;
61211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* TODO: Once Venus 3XX target names are known, nFormat should 2 for those
61411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * targets, since the payload format will be different */
61511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mbi->nFormat = 2;
61611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mbi->nDataSize = src->data_size;
61711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memcpy(&mbi->data, &src->data, src->data_size);
61811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
61911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return mbi->nDataSize + sizeof(*mbi);
62011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
62111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
622a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelinline int get_yuv_size(unsigned long fmt, int width, int height) {
623a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned int y_stride, uv_stride, y_sclines,
624a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                uv_sclines, y_plane, uv_plane;
625a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned int y_ubwc_plane = 0, uv_ubwc_plane = 0;
626a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned size = 0;
627a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
628a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    y_stride = VENUS_Y_STRIDE(fmt, width);
629a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    uv_stride = VENUS_UV_STRIDE(fmt, width);
630a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    y_sclines = VENUS_Y_SCANLINES(fmt, height);
631a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    uv_sclines = VENUS_UV_SCANLINES(fmt, height);
632a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
633a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    switch (fmt) {
634a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case COLOR_FMT_NV12:
635a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            y_plane = y_stride * y_sclines;
636a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            uv_plane = uv_stride * uv_sclines;
637a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            size = MSM_MEDIA_ALIGN(y_plane + uv_plane, 4096);
638a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
639a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel         default:
640a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
641a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
642a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    return size;
643a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel}
644a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
645fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::handle_input_extradata(struct v4l2_buffer buf)
64611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
64711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
648a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned int consumed_len = 0, filled_len = 0;
649a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned int yuv_size = 0, index = 0;
650a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    int enable = 0, i = 0, size = 0;
651a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    unsigned char *pVirt = NULL;
652a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    int height = m_sVenc_cfg.input_height;
653a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    int width = m_sVenc_cfg.input_width;
654fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_TICKS nTimeStamp = buf.timestamp.tv_sec * 1000000 + buf.timestamp.tv_usec;
655fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    int fd = buf.m.planes[0].reserved[0];
656a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    bool vqzip_sei_found = false;
65711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!EXTRADATA_IDX(num_input_planes)) {
65911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Input extradata not enabled");
66011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
66111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
66211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
66311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!input_extradata_info.uaddr) {
66411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata buffers not allocated\n");
665a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return true;
66611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
66711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("Processing Extradata for Buffer = %lld", nTimeStamp); // Useful for debugging
669fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
670a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12 || m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV21) {
671a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        size = VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height);
672a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        yuv_size = get_yuv_size(COLOR_FMT_NV12, width, height);
673a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        pVirt = (unsigned char *)mmap(NULL, size, PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
674a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (pVirt == MAP_FAILED) {
675a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_ERROR("%s Failed to mmap",__func__);
676a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            return false;
677a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
678a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *) ((unsigned long)(pVirt + yuv_size + 3)&(~3));
679a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
68011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd);
68211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char *p_extradata = input_extradata_info.uaddr + index * input_extradata_info.buffer_size;
68311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *data = (struct OMX_OTHER_EXTRADATATYPE *)p_extradata;
684fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset((void *)(data), 0, (input_extradata_info.buffer_size)); // clear stale data in current buffer
68511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
686a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    while (p_extra && (consumed_len + sizeof(OMX_OTHER_EXTRADATATYPE)) <= (size - yuv_size)
687a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        && (consumed_len + p_extra->nSize) <= (size - yuv_size)
688a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        && (filled_len + sizeof(OMX_OTHER_EXTRADATATYPE) <= input_extradata_info.buffer_size)
689a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        && (filled_len + p_extra->nSize <= input_extradata_info.buffer_size)
690a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        && (p_extra->eType != (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_NONE)) {
69111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
692a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_LOW("Extradata Type = 0x%x", (OMX_QCOM_EXTRADATATYPE)p_extra->eType);
693a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        switch ((OMX_QCOM_EXTRADATATYPE)p_extra->eType) {
694a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case OMX_ExtraDataFrameDimension:
695a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        {
696a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            struct msm_vidc_extradata_index *payload;
697a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            OMX_QCOM_EXTRADATA_FRAMEDIMENSION *framedimension_format;
698a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct msm_vidc_extradata_index) + 3)&(~3);
69911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data->nVersion.nVersion = OMX_SPEC_VERSION;
70011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            data->nPortIndex = 0;
701a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_INDEX;
702a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->nDataSize = sizeof(struct msm_vidc_input_crop_payload);
703a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            framedimension_format = (OMX_QCOM_EXTRADATA_FRAMEDIMENSION *)p_extra->data;
704a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload = (struct msm_vidc_extradata_index *)(data->data);
705a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->type = (msm_vidc_extradata_type)MSM_VIDC_EXTRADATA_INPUT_CROP;
706a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->input_crop.left = framedimension_format->nDecWidth;
707a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->input_crop.top = framedimension_format->nDecHeight;
708a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->input_crop.width = framedimension_format->nActualWidth;
709a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->input_crop.height = framedimension_format->nActualHeight;
710a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_LOW("Height = %d Width = %d Actual Height = %d Actual Width = %d",
711a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                framedimension_format->nDecWidth, framedimension_format->nDecHeight,
712a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                framedimension_format->nActualWidth, framedimension_format->nActualHeight);
713a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            filled_len += data->nSize;
714a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
715a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
716fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
717a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case OMX_ExtraDataQP:
718a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        {
719a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            OMX_QCOM_EXTRADATA_QP * qp_payload = NULL;
720a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            struct msm_vidc_frame_qp_payload *payload;
721a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) + sizeof(struct msm_vidc_frame_qp_payload) + 3)&(~3);
722fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            data->nVersion.nVersion = OMX_SPEC_VERSION;
723fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            data->nPortIndex = 0;
724a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_FRAME_QP;
725a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data->nDataSize = sizeof(struct  msm_vidc_frame_qp_payload);
726a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            qp_payload = (OMX_QCOM_EXTRADATA_QP *)p_extra->data;
727a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload = (struct  msm_vidc_frame_qp_payload *)(data->data);
728a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            payload->frame_qp = qp_payload->nQP;
729a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_LOW("Frame QP = %d", payload->frame_qp);
730a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            filled_len += data->nSize;
731a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
732a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
733a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
734a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case OMX_ExtraDataVQZipSEI:
735a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_LOW("VQZIP SEI Found ");
736a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            input_extradata_info.vqzip_sei_found = true;
737a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
738a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case OMX_ExtraDataFrameInfo:
739a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        {
740a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info = NULL;
741a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            frame_info = (OMX_QCOM_EXTRADATA_FRAMEINFO *)(p_extra->data);
742a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if (frame_info->ePicType == OMX_VIDEO_PictureTypeI) {
743a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                if (venc_set_intra_vop_refresh((OMX_BOOL)true) == false)
744a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    DEBUG_PRINT_ERROR("%s Error in requesting I Frame ", __func__);
745a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
746a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
747a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
748a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        default:
749a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_HIGH("Unknown Extradata 0x%x", (OMX_QCOM_EXTRADATATYPE)p_extra->eType);
750a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
751a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
752a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
753a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        consumed_len += p_extra->nSize;
754a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)((char *)p_extra + p_extra->nSize);
755a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
756a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
757a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    /*
758a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       * Below code is based on these points.
759a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       * 1) _PQ_ not defined :
760a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     a) Send data to Venus as ROI.
761a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     b) ROI enabled : Processed under unlocked context.
762a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     c) ROI disabled : Nothing to fill.
763a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     d) pq enabled : Not possible.
764a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       * 2) _PQ_ defined, but pq is not enabled :
765a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     a) Send data to Venus as ROI.
766a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     b) ROI enabled and dirty : Copy the data to Extradata buffer here
767a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     b) ROI enabled and no dirty : Nothing to fill
768a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     d) ROI disabled : Nothing to fill
769a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       * 3) _PQ_ defined and pq is enabled :
770a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     a) Send data to Venus as PQ.
771a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     b) ROI enabled and dirty : Copy the ROI contents to pq_roi buffer
772a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     c) ROI enabled and no dirty : pq_roi is already memset. Hence nothing to do here
773a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     d) ROI disabled : Just PQ data will be filled by GPU.
774a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       * 4) Normal ROI handling is in #else part as PQ can introduce delays.
775a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       *     By this time if client sets next ROI, then we shouldn't process new ROI here.
776a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel       */
777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    struct roidata roi;
7792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memset(&roi, 0, sizeof(struct roidata));
7802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.dirty = false;
7812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (m_roi_enabled) {
7822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        get_roi_for_timestamp(roi, nTimeStamp);
7832e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
7842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
785a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#ifdef _PQ_
786a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    pthread_mutex_lock(&m_pq.lock);
787a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (m_pq.is_pq_enabled) {
788a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (roi.dirty) {
789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            struct msm_vidc_roi_qp_payload *roiData =
790a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                (struct msm_vidc_roi_qp_payload *)(m_pq.roi_extradata_info.uaddr);
791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            roiData->upper_qp_offset = roi.info.nUpperQpOffset;
792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            roiData->lower_qp_offset = roi.info.nLowerQpOffset;
793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            roiData->b_roi_info = roi.info.bUseRoiInfo;
794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            roiData->mbi_info_size = roi.info.nRoiMBInfoSize;
795a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_HIGH("Using PQ + ROI QP map: Enable = %d", roiData->b_roi_info);
796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize);
79711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
798a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        filled_len += sizeof(msm_vidc_extradata_header) - sizeof(unsigned int);
799a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nDataSize = m_pq.fill_pq_stats(buf, filled_len);
800a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nSize = ALIGN(sizeof(msm_vidc_extradata_header) +  data->nDataSize, 4);
801a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_PQ_INFO;
8022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
803a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    } else {
8042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        if (roi.dirty) {
8052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) +
8062e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    sizeof(struct msm_vidc_roi_qp_payload) +
8072e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    roi.info.nRoiMBInfoSize - 2 * sizeof(unsigned int), 4);
8082e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data->nVersion.nVersion = OMX_SPEC_VERSION;
8092e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data->nPortIndex = 0;
8102e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_ROI_QP;
8112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data->nDataSize = sizeof(struct msm_vidc_roi_qp_payload);
8122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            struct msm_vidc_roi_qp_payload *roiData =
8132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    (struct msm_vidc_roi_qp_payload *)(data->data);
8142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roiData->upper_qp_offset = roi.info.nUpperQpOffset;
8152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roiData->lower_qp_offset = roi.info.nLowerQpOffset;
8162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roiData->b_roi_info = roi.info.bUseRoiInfo;
8172e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roiData->mbi_info_size = roi.info.nRoiMBInfoSize;
8182e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            DEBUG_PRINT_HIGH("Using ROI QP map: Enable = %d", roiData->b_roi_info);
8192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize);
8202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
8212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        }
822a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
823a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    pthread_mutex_unlock(&m_pq.lock);
824a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel#else // _PQ_
825a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (roi.dirty) {
826a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) +
827a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            sizeof(struct msm_vidc_roi_qp_payload) +
828a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            roi.info.nRoiMBInfoSize - 2 * sizeof(unsigned int), 4);
829a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nVersion.nVersion = OMX_SPEC_VERSION;
830a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nPortIndex = 0;
831a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_ROI_QP;
832a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data->nDataSize = sizeof(struct msm_vidc_roi_qp_payload);
833a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        struct msm_vidc_roi_qp_payload *roiData =
834a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                (struct msm_vidc_roi_qp_payload *)(data->data);
835a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        roiData->upper_qp_offset = roi.info.nUpperQpOffset;
836a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        roiData->lower_qp_offset = roi.info.nLowerQpOffset;
837a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        roiData->b_roi_info = roi.info.bUseRoiInfo;
838a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        roiData->mbi_info_size = roi.info.nRoiMBInfoSize;
839a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_HIGH("Using ROI QP map: Enable = %d", roiData->b_roi_info);
840a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        memcpy(roiData->data, roi.info.pRoiMBInfo, roi.info.nRoiMBInfoSize);
841a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
842a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
843fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
844fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8452e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (m_roi_enabled) {
8462e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        if (roi.dirty) {
8472e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            DEBUG_PRINT_LOW("free roidata with timestamp %lld us", roi.timestamp);
8482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            free(roi.info.pRoiMBInfo);
8492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            roi.dirty = false;
8502e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        }
8512e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
8522e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
853fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _VQZIP_
854fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (vqzip_sei_info.enabled && !input_extradata_info.vqzip_sei_found) {
855fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("VQZIP is enabled, But no VQZIP SEI found. Rejecting the session");
856a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (pVirt)
857a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            munmap(pVirt, size);
858a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return false; //This should be treated as fatal error
859fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
860a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (vqzip_sei_info.enabled && pVirt) {
861fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data->nSize = (sizeof(OMX_OTHER_EXTRADATATYPE) +  sizeof(struct VQZipStats) + 3)&(~3);
862fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data->nVersion.nVersion = OMX_SPEC_VERSION;
863fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data->nPortIndex = 0;
864fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data->eType = (OMX_EXTRADATATYPE)MSM_VIDC_EXTRADATA_YUVSTATS_INFO;
865fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data->nDataSize = sizeof(struct VQZipStats);
866fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        vqzip.fill_stats_data((void*)pVirt, (void*) data->data);
867fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        data = (OMX_OTHER_EXTRADATATYPE *)((char *)data + data->nSize);
868fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
86911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
87011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data->nSize = sizeof(OMX_OTHER_EXTRADATATYPE);
87111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data->nVersion.nVersion = OMX_SPEC_VERSION;
87211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data->eType = OMX_ExtraDataNone;
87311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data->nDataSize = 0;
87411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        data->data[0] = 0;
87511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
876a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (pVirt)
877a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        munmap(pVirt, size);
878a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
87911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
88011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
88111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
88211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::handle_output_extradata(void *buffer, int index)
88311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
88411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_BUFFERHEADERTYPE *p_bufhdr = (OMX_BUFFERHEADERTYPE *) buffer;
88511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
88611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
88711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!output_extradata_info.uaddr) {
88811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata buffers not allocated\n");
88911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
89011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
89111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    p_extra = (OMX_OTHER_EXTRADATATYPE *)ALIGN(p_bufhdr->pBuffer +
89311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4);
89411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
89511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (output_extradata_info.buffer_size >
89611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_bufhdr->nAllocLen - ALIGN(p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4)) {
89711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Insufficient buffer size for extradata");
89811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = NULL;
89911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
90011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (sizeof(msm_vidc_extradata_header) != sizeof(OMX_OTHER_EXTRADATATYPE)) {
90111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* A lot of the code below assumes this condition, so error out if it's not met */
90211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata ABI mismatch");
90311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
90411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
90511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
90611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct msm_vidc_extradata_header *p_extradata = NULL;
90711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    do {
90811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extradata = (struct msm_vidc_extradata_header *) (p_extradata ?
90911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ((char *)p_extradata) + p_extradata->size :
91011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            output_extradata_info.uaddr + index * output_extradata_info.buffer_size);
91111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
91211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (p_extradata->type) {
91311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case MSM_VIDC_EXTRADATA_METADATA_MBI:
91411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
91511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 payloadSize = append_mbi_extradata(&p_extra->data, p_extradata);
91611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + payloadSize, 4);
91711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nVersion.nVersion = OMX_SPEC_VERSION;
91811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nPortIndex = OMX_DirOutput;
91911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->eType = (OMX_EXTRADATATYPE)OMX_ExtraDataVideoEncoderMBInfo;
92011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nDataSize = payloadSize;
92111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
92211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
92311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case MSM_VIDC_EXTRADATA_METADATA_LTR:
92411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
92511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE) + p_extradata->data_size, 4);
92611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nVersion.nVersion = OMX_SPEC_VERSION;
92711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nPortIndex = OMX_DirOutput;
92811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->eType = (OMX_EXTRADATATYPE) OMX_ExtraDataVideoLTRInfo;
92911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nDataSize = p_extradata->data_size;
9302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                memcpy(p_extra->data, p_extradata->data, p_extradata->data_size);
9312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                DEBUG_PRINT_LOW("LTRInfo Extradata = 0x%x", *((OMX_U32 *)p_extra->data));
93211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
93311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
93411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case MSM_VIDC_EXTRADATA_NONE:
93511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nSize = ALIGN(sizeof(OMX_OTHER_EXTRADATATYPE), 4);
93611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nVersion.nVersion = OMX_SPEC_VERSION;
93711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nPortIndex = OMX_DirOutput;
93811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->eType = OMX_ExtraDataNone;
93911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nDataSize = 0;
94011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
94111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
94211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                /* No idea what this stuff is, just skip over it */
94311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_HIGH("Found an unrecognised extradata (%x) ignoring it",
94411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        p_extradata->type);
94511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                continue;
94611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
94711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
94811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *)(((char *)p_extra) + p_extra->nSize);
94911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } while (p_extradata->type != MSM_VIDC_EXTRADATA_NONE);
95011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
95111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Just for debugging: Traverse the list of extra datas  and spit it out onto log */
95211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    p_extra = (OMX_OTHER_EXTRADATATYPE *)ALIGN(p_bufhdr->pBuffer +
95311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_bufhdr->nOffset + p_bufhdr->nFilledLen, 4);
95411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while(p_extra->eType != OMX_ExtraDataNone)
95511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
95611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("[%p/%u] found extradata type %x of size %u (%u) at %p",
95711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_bufhdr->pBuffer, (unsigned int)p_bufhdr->nFilledLen, p_extra->eType,
95811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)p_extra->nSize, (unsigned int)p_extra->nDataSize, p_extra);
95911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        p_extra = (OMX_OTHER_EXTRADATATYPE *) (((OMX_U8 *) p_extra) +
96111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                p_extra->nSize);
96211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
96311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
96511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
96611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
96711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_set_format(int format)
96811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
96911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = true;
97011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
97111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (format) {
97211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_format = format;
97311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
97411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (color_format) {
97511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case NV12_128m:
97611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return venc_set_color_format((OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m);
97711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
97811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
97911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
98011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
98211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        color_format = 0;
98311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = false;
98411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
98511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
98611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
98711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
98811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
989b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry StrudelOMX_ERRORTYPE venc_dev::allocate_extradata(struct extradata_buffer_info *extradata_info, int flags)
99011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
99111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extradata_info->allocated) {
99211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("2nd allocation return for port = %d",extradata_info->port_index);
99311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorNone;
99411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
99511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
99711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
99811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extradata_info->buffer_size) {
99911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extradata_info->ion.ion_alloc_data.handle) {
100011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap((void *)extradata_info->uaddr, extradata_info->size);
100111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(extradata_info->ion.fd_ion_data.fd);
100211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_handle->free_ion_memory(&extradata_info->ion);
100311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
100411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extradata_info->size = (extradata_info->size + 4095) & (~4095);
100611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
100711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extradata_info->ion.ion_device_fd = venc_handle->alloc_map_ion_memory(
100811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata_info->size,
100911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                &extradata_info->ion.ion_alloc_data,
1010b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                &extradata_info->ion.fd_ion_data, flags);
101111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
101311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extradata_info->ion.ion_device_fd < 0) {
101411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to alloc extradata memory\n");
101511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
101611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
101711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
101811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extradata_info->uaddr = (char *)mmap(NULL,
101911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata_info->size,
102011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                PROT_READ|PROT_WRITE, MAP_SHARED,
102111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata_info->ion.fd_ion_data.fd , 0);
102211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
102311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extradata_info->uaddr == MAP_FAILED) {
102411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to map extradata memory\n");
102511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            close(extradata_info->ion.fd_ion_data.fd);
102611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_handle->free_ion_memory(&extradata_info->ion);
102711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorInsufficientResources;
102811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
10292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        extradata_info->m_ion_dev = open("/dev/ion", O_RDONLY);
103011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
103111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
103311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extradata_info->allocated = OMX_TRUE;
103411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
103511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
103611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
103742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudelvoid venc_dev::free_extradata(struct extradata_buffer_info *extradata_info)
103811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
103911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
104011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    if (extradata_info == NULL) {
104242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        return;
104311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
104411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
104542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    if (extradata_info->uaddr) {
104642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        munmap((void *)extradata_info->uaddr, extradata_info->size);
104742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        extradata_info->uaddr = NULL;
104842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        close(extradata_info->ion.fd_ion_data.fd);
104942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        venc_handle->free_ion_memory(&extradata_info->ion);
105011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
105111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
105242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    if (extradata_info->m_ion_dev)
105342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        close(extradata_info->m_ion_dev);
10542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
105542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    memset(extradata_info, 0, sizeof(*extradata_info));
105642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    extradata_info->ion.fd_ion_data.fd = -1;
105742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    extradata_info->allocated = OMX_FALSE;
105811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
105942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#endif // USE_ION
106042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel}
1061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
106242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudelvoid venc_dev::free_extradata_all()
106342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel{
106442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    free_extradata(&output_extradata_info);
106542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    free_extradata(&input_extradata_info);
106642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel#ifdef _PQ_
106742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    free_extradata(&m_pq.roi_extradata_info);
1068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
106911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
107011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
107111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_output_log_flag()
107211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
107311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (m_debug.out_buffer_log == 1);
107411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
107511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
107611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_output_log_buffers(const char *buffer_addr, int buffer_len)
107711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
10782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (venc_handle->is_secure_session()) {
10792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        DEBUG_PRINT_ERROR("logging secure output buffers is not allowed!");
10802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        return -1;
10812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
10822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
108311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug.outfile) {
108411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int size = 0;
108511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
108611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.m4v",
108711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
108811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
108911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.264",
109011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
109111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
109211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%ld_%ld_%p.265",
109311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
109411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
109511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.263",
109611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
109711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
109811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           size = snprintf(m_debug.outfile_name, PROPERTY_VALUE_MAX, "%s/output_enc_%lu_%lu_%p.ivf",
109911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
110011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
110111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((size > PROPERTY_VALUE_MAX) && (size < 0)) {
110211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("Failed to open output file: %s for logging size:%d",
110311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                m_debug.outfile_name, size);
110411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
110511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = fopen(m_debug.outfile_name, "ab");
110611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.outfile) {
110711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to open output file: %s for logging errno:%d",
110811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               m_debug.outfile_name, errno);
110911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.outfile_name[0] = '\0';
111011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
111111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
111211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
111311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile && buffer_len) {
111411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("%s buffer_len:%d", __func__, buffer_len);
111511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fwrite(buffer_addr, buffer_len, 1, m_debug.outfile);
111611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
111711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
111811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
111911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
112011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_extradata_log_buffers(char *buffer_addr)
112111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
112211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug.extradatafile && m_debug.extradata_log) {
112311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int size = 0;
112411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
1125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel           size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin",
112611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
112711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
1128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel           size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin",
112911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
113011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
1131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel           size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin",
113211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
113311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
1134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel           size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin",
113511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
113611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
1137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel           size = snprintf(m_debug.extradatafile_name, PROPERTY_VALUE_MAX, "%s/extradata_enc_%lu_%lu_%p.bin",
113811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                           m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
113911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
114011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((size > PROPERTY_VALUE_MAX) && (size < 0)) {
114111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("Failed to open extradata file: %s for logging size:%d",
114211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                m_debug.extradatafile_name, size);
114311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
114411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
114511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.extradatafile = fopen(m_debug.extradatafile_name, "ab");
114611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.extradatafile) {
114711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to open extradata file: %s for logging errno:%d",
114811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                               m_debug.extradatafile_name, errno);
114911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.extradatafile_name[0] = '\0';
115011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
115111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
115211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
115311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_debug.extradatafile && buffer_addr) {
115511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_OTHER_EXTRADATATYPE *p_extra = NULL;
115611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        do {
115711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            p_extra = (OMX_OTHER_EXTRADATATYPE *)(!p_extra ? buffer_addr :
115811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    ((char *)p_extra) + p_extra->nSize);
115911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite(p_extra, p_extra->nSize, 1, m_debug.extradatafile);
116011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } while (p_extra->eType != OMX_ExtraDataNone);
116111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
116211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
116311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
116411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
116511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_input_log_buffers(OMX_BUFFERHEADERTYPE *pbuffer, int fd, int plane_offset,
116611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long inputformat) {
11672601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (venc_handle->is_secure_session()) {
11682601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        DEBUG_PRINT_ERROR("logging secure input buffers is not allowed!");
11692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        return -1;
11702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
11712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
117211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_debug.infile) {
117311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int size = snprintf(m_debug.infile_name, PROPERTY_VALUE_MAX, "%s/input_enc_%lu_%lu_%p.yuv",
117411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_debug.log_loc, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height, this);
117511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((size > PROPERTY_VALUE_MAX) && (size < 0)) {
117611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             DEBUG_PRINT_ERROR("Failed to open output file: %s for logging size:%d",
117711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                m_debug.infile_name, size);
117811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
117911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = fopen (m_debug.infile_name, "ab");
118011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!m_debug.infile) {
118111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Failed to open input file: %s for logging", m_debug.infile_name);
118211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_debug.infile_name[0] = '\0';
118311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return -1;
118411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
118511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
118611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
118711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile && pbuffer && pbuffer->nFilledLen) {
118811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int stride, scanlines;
118911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int color_format;
119011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long i, msize;
119111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char *pvirt = NULL, *ptemp = NULL;
119211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned char *temp = (unsigned char *)pbuffer->pBuffer;
119311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
119411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (inputformat) {
119511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12:
119611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12;
119711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
119811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_NV12_UBWC:
119911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12_UBWC;
120011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
120111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_RGB32:
120211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_RGBA8888;
120311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
120411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_PIX_FMT_RGBA8888_UBWC:
120511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_RGBA8888_UBWC;
120611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
120711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
120811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                color_format = COLOR_FMT_NV12;
120911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Default format NV12 is set for logging [%lu]", inputformat);
121011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
121111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
121211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        msize = VENUS_BUFFER_SIZE(color_format, m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
121411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        const unsigned int extra_size = VENUS_EXTRADATA_SIZE(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
121511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
121611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode == 1) {
121711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pvirt= (unsigned char *)mmap(NULL, msize, PROT_READ|PROT_WRITE,MAP_SHARED, fd, plane_offset);
121811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (pvirt == MAP_FAILED) {
121911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("%s mmap failed", __func__);
122011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return -1;
122111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
122211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ptemp = pvirt;
122311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
122411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ptemp = temp;
122511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
122611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
122711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (color_format == COLOR_FMT_NV12) {
122811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = VENUS_Y_STRIDE(color_format, m_sVenc_cfg.input_width);
122911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = VENUS_Y_SCANLINES(color_format, m_sVenc_cfg.input_height);
123011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
123111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < m_sVenc_cfg.input_height; i++) {
123211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fwrite(ptemp, m_sVenc_cfg.input_width, 1, m_debug.infile);
123311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ptemp += stride;
123411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
123511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (metadatamode == 1) {
123611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ptemp = pvirt + (stride * scanlines);
123711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
123811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ptemp = (unsigned char *)pbuffer->pBuffer + (stride * scanlines);
123911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
124011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < m_sVenc_cfg.input_height/2; i++) {
124111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fwrite(ptemp, m_sVenc_cfg.input_width, 1, m_debug.infile);
124211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ptemp += stride;
124311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
124411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (color_format == COLOR_FMT_RGBA8888) {
124511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stride = VENUS_RGB_STRIDE(color_format, m_sVenc_cfg.input_width);
124611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            scanlines = VENUS_RGB_SCANLINES(color_format, m_sVenc_cfg.input_height);
124711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
124811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            for (i = 0; i < m_sVenc_cfg.input_height; i++) {
124911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fwrite(ptemp, m_sVenc_cfg.input_width * 4, 1, m_debug.infile);
125011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                ptemp += stride;
125111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
125211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (color_format == COLOR_FMT_NV12_UBWC || color_format == COLOR_FMT_RGBA8888_UBWC) {
125311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (color_format == COLOR_FMT_NV12_UBWC) {
125411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                msize -= 2 * extra_size;
125511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
125611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            fwrite(ptemp, msize, 1, m_debug.infile);
125711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
125811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
125911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode == 1 && pvirt) {
126011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            munmap(pvirt, msize);
126111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
126211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
126311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
126411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
126511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
126611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
126711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_open(OMX_U32 codec)
126811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
126911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int r;
127011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int alignment = 0,buffer_size = 0, temp =0;
127111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
127211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_STRING device_name = (OMX_STRING)"/dev/video33";
127311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
127411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char platform_name[PROPERTY_VALUE_MAX] = {0};
127511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    FILE *soc_file = NULL;
127611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char buffer[10];
127711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
127811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("ro.board.platform", platform_name, "0");
127911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.enc.narrow.searchrange", property_value, "0");
128011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enable_mv_narrow_searchrange = atoi(property_value);
128111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
128211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!strncmp(platform_name, "msm8610", 7)) {
128311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        device_name = (OMX_STRING)"/dev/video/q6_enc";
128411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        supported_rc_modes = (RC_ALL & ~RC_CBR_CFR);
128511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
128611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_nDriver_fd = open (device_name, O_RDWR);
128711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((int)m_nDriver_fd < 0) {
128811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Omx_venc::Comp Init Returning failure");
128911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
129011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
129111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_poll_efd = eventfd(0, 0);
129211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_poll_efd < 0) {
129311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to open event fd(%s)", strerror(errno));
129411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
129511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
129611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("m_nDriver_fd = %u", (unsigned int)m_nDriver_fd);
129711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
129811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // set the basic configuration of the video encoder driver
129911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.input_width = OMX_CORE_QCIF_WIDTH;
130011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.input_height= OMX_CORE_QCIF_HEIGHT;
130111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.dvs_width = OMX_CORE_QCIF_WIDTH;
130211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.dvs_height = OMX_CORE_QCIF_HEIGHT;
130311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.fps_num = 30;
130411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.fps_den = 1;
130511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.targetbitrate = 64000;
130611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.inputformat= V4L2_DEFAULT_OUTPUT_COLOR_FMT;
130711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
130811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_codec = codec;
130911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
131011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (codec == OMX_VIDEO_CodingMPEG4) {
131111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype = V4L2_PIX_FMT_MPEG4;
131211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
131311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
131411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.minqp = 1;
131511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.maxqp = 31;
131611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec == OMX_VIDEO_CodingH263) {
131711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H263;
131811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = VEN_PROFILE_H263_BASELINE;
131911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = VEN_LEVEL_H263_20;
132011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.minqp = 1;
132111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.maxqp = 31;
132211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec == OMX_VIDEO_CodingAVC) {
132311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype = V4L2_PIX_FMT_H264;
132411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
132511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
132611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.minqp = 1;
132711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.maxqp = 51;
132811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec == OMX_VIDEO_CodingVP8) {
132911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype = V4L2_PIX_FMT_VP8;
133011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED;
133111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0;
133211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.minqp = 1;
133311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.maxqp = 128;
133411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (codec == OMX_VIDEO_CodingHEVC) {
133511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype = V4L2_PIX_FMT_HEVC;
133611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.minqp = 1;
133711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_range.maxqp = 51;
133811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN;
133911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1;
134011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
134111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    session_qp_values.minqp = session_qp_range.minqp;
134211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    session_qp_values.maxqp = session_qp_range.maxqp;
13432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.min_i_qp = session_qp_range.minqp;
13442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.max_i_qp = session_qp_range.maxqp;
13452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.min_p_qp = session_qp_range.minqp;
13462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.max_p_qp = session_qp_range.maxqp;
13472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.min_b_qp = session_qp_range.minqp;
13482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    session_ipb_qp_values.max_b_qp = session_qp_range.maxqp;
134911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
135011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret;
135111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = subscribe_to_events(m_nDriver_fd);
135211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
135311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
135411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Subscribe Event Failed");
135511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
135611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
135711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
135811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_fmtdesc fdesc;
135911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
136011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
136111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_capability cap;
136211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
136311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd, VIDIOC_QUERYCAP, &cap);
136411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
136511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
136611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to query capabilities");
136711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
136811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Capabilities: driver_name = %s, card = %s, bus_info = %s,"
136911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                " version = %d, capabilities = %x", cap.driver, cap.card,
137011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                cap.bus_info, cap.version, cap.capabilities);
137111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
137211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret=0;
137411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fdesc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
137511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fdesc.index=0;
137611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
137711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
137811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
137911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fdesc.pixelformat, fdesc.flags);
138011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index++;
138111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
138211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
138311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fdesc.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
138411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fdesc.index=0;
138511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
138611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    while (ioctl(m_nDriver_fd, VIDIOC_ENUM_FMT, &fdesc) == 0) {
138711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("fmt: description: %s, fmt: %x, flags = %x", fdesc.description,
138811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fdesc.pixelformat, fdesc.flags);
138911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fdesc.index++;
139011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
139111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
139211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    is_thulium_v1 = false;
139311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    soc_file= fopen("/sys/devices/soc0/soc_id", "r");
139411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (soc_file) {
139511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fread(buffer, 1, 4, soc_file);
139611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(soc_file);
139711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (atoi(buffer) == 246) {
139811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            soc_file = fopen("/sys/devices/soc0/revision", "r");
139911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (soc_file) {
140011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fread(buffer, 1, 4, soc_file);
140111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                fclose(soc_file);
140211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (atoi(buffer) == 1) {
140311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    is_thulium_v1 = true;
140411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("is_thulium_v1 = TRUE");
140511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
140611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
140711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
140811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
140911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (venc_handle->is_secure_session()) {
141111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.alignment = SZ_1M;
141211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sInput_buff_property.alignment  = SZ_1M;
141311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
141411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.alignment = SZ_4K;
141511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sInput_buff_property.alignment  = SZ_4K;
141611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
141711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
141811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0, sizeof(fmt));
141911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
142011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height;
142111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width;
142211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
142311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*TODO: Return values not handled properly in this function anywhere.
142511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Need to handle those.*/
142611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
142711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
142811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
142911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set format on capture port");
143011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
143111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
143211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
143411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
143511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0, sizeof(fmt));
143611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
143711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
143811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
143911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = V4L2_DEFAULT_OUTPUT_COLOR_FMT;
1440fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
144111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
144311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
144411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
144611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = 2;
144711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
144811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
144911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
145011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
145111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
145311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = 2;
145411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
145511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
145611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
145711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(venc_handle->is_secure_session()) {
145811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_SECURE;
145911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
146011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("ioctl: open secure device");
146111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret=ioctl(m_nDriver_fd, VIDIOC_S_CTRL,&control);
146211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
146311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ioctl: open secure dev fail, rc %d", ret);
146411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
146511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
146611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
146711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
146811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    resume_in_stopped = 0;
146911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    metadatamode = 0;
147011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
147111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
147211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
147311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
147411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL to disable seq_hdr in sync_frame id=%d, val=%d", control.id, control.value);
147511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
147611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
147711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
147811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
147911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_frmsizeenum frmsize;
148011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
148111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //Get the hardware capabilities
148211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset((void *)&frmsize,0,sizeof(frmsize));
148311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frmsize.index = 0;
148411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    frmsize.pixel_format = m_sVenc_cfg.codectype;
148511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd, VIDIOC_ENUM_FRAMESIZES, &frmsize);
148611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
148711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret || frmsize.type != V4L2_FRMSIZE_TYPE_STEPWISE) {
148811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to get framesizes");
148911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
149011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
149111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
149211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
149311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        capability.min_width = frmsize.stepwise.min_width;
149411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        capability.max_width = frmsize.stepwise.max_width;
149511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        capability.min_height = frmsize.stepwise.min_height;
149611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        capability.max_height = frmsize.stepwise.max_height;
149711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
149811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
149911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //Initialize non-default parameters
150011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
150111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
150211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 0x7fffffff;
150311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control))
150411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAME\n");
150511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
150611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
150711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    property_get("vidc.debug.turbo", property_value, "0");
150811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (atoi(property_value)) {
150911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Turbo mode debug property enabled");
151011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
151111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
151211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
151311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set turbo mode");
151411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
151511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
151611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1517fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
1518fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    if (codec == OMX_VIDEO_CodingAVC && !m_pq.is_pq_force_disable) {
1519fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_pq.init(V4L2_DEFAULT_OUTPUT_COLOR_FMT);
1520fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_pq.get_caps();
1521fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
1522fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
1523fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
152411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    input_extradata_info.port_index = OUTPUT_PORT;
152511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    output_extradata_info.port_index = CAPTURE_PORT;
15262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
152711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
152811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
152911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
153011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelstatic OMX_ERRORTYPE unsubscribe_to_events(int fd)
153111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
153211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE eRet = OMX_ErrorNone;
153311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_event_subscription sub;
153411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int array_sz = sizeof(event_type)/sizeof(int);
153511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int i,rc;
153611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
153711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (fd < 0) {
153811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Invalid input: %d", fd);
153911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorBadParameter;
154011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
154111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
154211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (i = 0; i < array_sz; ++i) {
154311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&sub, 0, sizeof(sub));
154411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub.type = event_type[i];
154511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub);
154611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
154711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
154811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           DEBUG_PRINT_ERROR("Failed to unsubscribe event: 0x%x", sub.type);
154911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
155011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
155111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
155211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
155311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return eRet;
155411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
155511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
155611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_close()
155711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
155811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_close: fd = %u", (unsigned int)m_nDriver_fd);
155911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((int)m_nDriver_fd >= 0) {
156111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("venc_close E");
156211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if(eventfd_write(m_poll_efd, 1)) {
156411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("eventfd_write failed for fd: %d, errno = %d, force stop async_thread", m_poll_efd, errno);
156511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            async_thread_force_stop = true;
156611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
156711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
156811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (async_thread_created)
156911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            pthread_join(m_tid,NULL);
157011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
157111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("venc_close X");
157211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsubscribe_to_events(m_nDriver_fd);
157311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(m_poll_efd);
157411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        close(m_nDriver_fd);
157511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_nDriver_fd = -1;
157611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
157711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1578fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
1579fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_pq.deinit();
1580fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
1581fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
1582fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _VQZIP_
1583fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    vqzip.deinit();
1584fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif
1585fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
158611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.infile) {
158711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.infile);
158811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.infile = NULL;
158911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
159011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
159111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.outfile) {
159211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.outfile);
159311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.outfile = NULL;
159411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
159511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
159611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_debug.extradatafile) {
159711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fclose(m_debug.extradatafile);
159811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_debug.extradatafile = NULL;
159911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
160011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
160111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
160211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_buf_req(OMX_U32 *min_buff_count,
160311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *actual_buff_count,
160411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *buff_size,
160511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 port)
160611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
160711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void)min_buff_count, (void)buff_size;
160811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long temp_count = 0;
160911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
161011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == 0) {
161111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*actual_buff_count > m_sInput_buff_property.mincount) {
161211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp_count = m_sInput_buff_property.actualcount;
161311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sInput_buff_property.actualcount = *actual_buff_count;
161411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("I/P Count set to %u", (unsigned int)*actual_buff_count);
161511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
161611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
161711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*actual_buff_count > m_sOutput_buff_property.mincount) {
161811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            temp_count = m_sOutput_buff_property.actualcount;
161911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sOutput_buff_property.actualcount = *actual_buff_count;
162011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("O/P Count set to %u", (unsigned int)*actual_buff_count);
162111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
162211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
162311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
162411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
162511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
162611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
162711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
162811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_start()
162911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
163011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
163111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
163211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_stop()
163411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
163511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
163611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
163711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
163811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_start_done()
163911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
164011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
164111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
164211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
164311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_loaded_stop_done()
164411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
164511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
164611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
164711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
164811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_seq_hdr(void *buffer,
164911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned buffer_size, unsigned *header_len)
165011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
165111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    (void) buffer, (void) buffer_size, (void) header_len;
165211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
165311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
165411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
165511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_buf_req(OMX_U32 *min_buff_count,
165611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *actual_buff_count,
165711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 *buff_size,
165811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 port)
165911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
166011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
166111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
166211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int buf_size = 0, extra_data_size = 0, client_extra_data_size = 0;
166311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret;
166411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extra_idx = 0;
166511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
166611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == 0) {
166711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
166811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
166911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
167011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
1671fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
167211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
167311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
167411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
167511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
167611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*actual_buff_count)
167711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = *actual_buff_count;
167811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
167911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 2;
168011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
168111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Increase buffer-header count for metadata-mode on input port
168211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // to improve buffering and reduce bottlenecks in clients
168311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode && (bufreq.count < 9)) {
168411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("FW returned buffer count = %d , overwriting with 9",
168511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                bufreq.count);
168611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 9;
168711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1688a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
168911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.input_height * m_sVenc_cfg.input_width >= 3840*2160) {
169011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Increasing buffer count = %d to 11", bufreq.count);
169111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 11;
169211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
169311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
169411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int actualCount = bufreq.count;
169511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Request MAX_V4L2_BUFS from V4L2 in batch mode.
169611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Keep the original count for the client
169711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode && mBatchSize) {
169811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = MAX_V4L2_BUFS;
169911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
170011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
170211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
170311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
170411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
170511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed");
170611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
170711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
170811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
170911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
171011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
171111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
171211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
171311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
171411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
171511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode && mBatchSize) {
171611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = actualCount;
171711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
171811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
171911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
172011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
172111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *min_buff_count = m_sInput_buff_property.mincount;
172211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *actual_buff_count = m_sInput_buff_property.actualcount;
172311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
172411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // For ION memory allocations of the allocated buffer size
172511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // must be 4k aligned, hence aligning the input buffer
172611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // size to 4k.
172711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sInput_buff_property.datasize = ALIGN(m_sInput_buff_property.datasize, SZ_4K);
172811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
172911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *buff_size = m_sInput_buff_property.datasize;
173011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        num_input_planes = fmt.fmt.pix_mp.num_planes;
173111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(num_input_planes);
173211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
173311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
173411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
173511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (extra_idx >= VIDEO_MAX_PLANES) {
173611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
173711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
173811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
1739fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        input_extradata_info.buffer_size =  ALIGN(extra_data_size, SZ_4K);
1740fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        input_extradata_info.count = MAX_V4L2_BUFS;
174111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        input_extradata_info.size = input_extradata_info.buffer_size * input_extradata_info.count;
174211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
174311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
174411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned int extra_idx = 0;
174511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        memset(&fmt, 0, sizeof(fmt));
174611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
174711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height;
174811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width;
174911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
175011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt);
175211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
175311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
175411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height;
175511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width;
175611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
175711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
175811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_G_FMT, &fmt);
175911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
176011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.memory = V4L2_MEMORY_USERPTR;
176111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
176211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mBatchSize) {
176311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // If we're in batch mode, we'd like to end up in a situation where
176411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // driver is able to own mBatchSize buffers and we'd also own atleast
176511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // mBatchSize buffers
176611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = MAX(*actual_buff_count, mBatchSize) + mBatchSize;
176711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (*actual_buff_count) {
176811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = *actual_buff_count;
176911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
177011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 2;
177111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
177211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufreq.type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
177411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq);
177511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
177611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
177711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS CAPTURE_MPLANE Failed");
177811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
177911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
178011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
178111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
178211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *min_buff_count = m_sOutput_buff_property.mincount;
178311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *actual_buff_count = m_sOutput_buff_property.actualcount;
178411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *buff_size = m_sOutput_buff_property.datasize;
178511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        num_output_planes = fmt.fmt.pix_mp.num_planes;
178611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(num_output_planes);
178711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
178811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
178911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            extra_data_size =  fmt.fmt.pix_mp.plane_fmt[extra_idx].sizeimage;
179011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (extra_idx >= VIDEO_MAX_PLANES) {
179111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
179211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
179311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
179411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
179511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_extradata_info.buffer_size = extra_data_size;
179611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_extradata_info.count = m_sOutput_buff_property.actualcount;
179711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        output_extradata_info.size = output_extradata_info.buffer_size * output_extradata_info.count;
179811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
179911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
180111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
180211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
180311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_param(void *paramData, OMX_INDEXTYPE index)
180411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
180511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_param:: venc-720p");
180611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
180711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
180811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret;
1809a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    bool isCBR;
181011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)index) {
181211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamPortDefinition:
181311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
181411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PARAM_PORTDEFINITIONTYPE *portDefn;
181511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                portDefn = (OMX_PARAM_PORTDEFINITIONTYPE *) paramData;
181611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamPortDefinition");
181711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
181811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portDefn->nPortIndex == PORT_INDEX_IN) {
181911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_encode_framerate(portDefn->format.video.xFramerate, 0)) {
182011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
182111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
182211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
182311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_color_format(portDefn->format.video.eColorFormat)) {
182411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
182511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1826fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
1827fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    venc_try_enable_pq();
1828fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel #endif // _PQ_
1829fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
183011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (enable_mv_narrow_searchrange &&
183111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height) >=
183211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_CORE_1080P_WIDTH * OMX_CORE_1080P_HEIGHT)) {
183311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (venc_set_searchrange() == false) {
183411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("ERROR: Failed to set search range");
183511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
183611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
183711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_sVenc_cfg.input_height != portDefn->format.video.nFrameHeight ||
183811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_sVenc_cfg.input_width != portDefn->format.video.nFrameWidth) {
183911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Basic parameter has changed");
184011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sVenc_cfg.input_height = portDefn->format.video.nFrameHeight;
184111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sVenc_cfg.input_width = portDefn->format.video.nFrameWidth;
184211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
184311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memset(&fmt, 0, sizeof(fmt));
184411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
184511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
184611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
184711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
1848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
184911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
185111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("VIDIOC_S_FMT OUTPUT_MPLANE Failed");
185211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            hw_overload = errno == EBUSY;
185311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
185411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
185511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
185611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sInput_buff_property.datasize=fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
185711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.memory = V4L2_MEMORY_USERPTR;
185811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.count = portDefn->nBufferCountActual;
185911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
186011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
186211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed");
186311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
186411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
186511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (bufreq.count == portDefn->nBufferCountActual)
186711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_sInput_buff_property.mincount = m_sInput_buff_property.actualcount = bufreq.count;
186811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
186911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (portDefn->nBufferCountActual >= m_sInput_buff_property.mincount)
187011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_sInput_buff_property.actualcount = portDefn->nBufferCountActual;
187111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (num_input_planes > 1)
187211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            input_extradata_info.count = m_sInput_buff_property.actualcount + 1;
187311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
187411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
187511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
187611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("input: actual: %u, min: %u, count_req: %u",
187711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sInput_buff_property.mincount, bufreq.count);
187811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (portDefn->nPortIndex == PORT_INDEX_OUT) {
187911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sVenc_cfg.dvs_height = portDefn->format.video.nFrameHeight;
188011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sVenc_cfg.dvs_width = portDefn->format.video.nFrameWidth;
188111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
188211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    memset(&fmt, 0, sizeof(fmt));
188311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
188411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height;
188511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width;
188611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
188711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
188811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
188911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("VIDIOC_S_FMT CAPTURE_MPLANE Failed");
189011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        hw_overload = errno == EBUSY;
189111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
189211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
189311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
189411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
189511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
189611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_target_bitrate(portDefn->format.video.nBitrate, 0)) {
189711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
189811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
189911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
190111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.memory = V4L2_MEMORY_USERPTR;
190211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.count = portDefn->nBufferCountActual;
190311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
190411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
190511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
190611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer count failed: requested: %u, current: %u",
190711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sOutput_buff_property.actualcount);
190811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
190911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
191011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (bufreq.count == portDefn->nBufferCountActual)
191211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_sOutput_buff_property.mincount = m_sOutput_buff_property.actualcount = bufreq.count;
191311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (portDefn->nBufferCountActual >= m_sOutput_buff_property.mincount)
191511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            m_sOutput_buff_property.actualcount = portDefn->nBufferCountActual;
191611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
191711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (num_output_planes > 1)
191811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            output_extradata_info.count = m_sOutput_buff_property.actualcount;
191911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
192011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Output: actual: %u, min: %u, count_req: %u",
192111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)portDefn->nBufferCountActual, (unsigned int)m_sOutput_buff_property.mincount, bufreq.count);
192211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
192311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamPortDefinition");
192411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
192511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
192611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
192711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
192811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoPortFormat:
192911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
193011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_PORTFORMATTYPE *portFmt;
193111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                portFmt =(OMX_VIDEO_PARAM_PORTFORMATTYPE *)paramData;
193211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoPortFormat");
193311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
193411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_IN) {
193511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_color_format(portFmt->eColorFormat)) {
193611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
193711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
193811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (portFmt->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
193911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_encode_framerate(portFmt->xFramerate, 0)) {
194011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
194111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
194211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
194311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoPortFormat");
194411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
1945fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
1946fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                venc_try_enable_pq();
1947fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
194811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1949fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    break;
195011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
195111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoBitrate:
195211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
195311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_BITRATETYPE* pParam;
195411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pParam = (OMX_VIDEO_PARAM_BITRATETYPE*)paramData;
195511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoBitrate");
195611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
195711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
195811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_target_bitrate(pParam->nTargetBitrate, 0)) {
195911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Target Bit Rate setting failed");
196011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
196111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
196211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
196311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_ratectrl_cfg(pParam->eControlRate)) {
196411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Rate Control setting failed");
196511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
196611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
1967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
1968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    venc_try_enable_pq();
1969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
197011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
197111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoBitrate");
197211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
197311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
197411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
197511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
197611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoMpeg4:
197711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
197811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_MPEG4TYPE* pParam;
197911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 bFrames = 0;
198011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
198111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pParam = (OMX_VIDEO_PARAM_MPEG4TYPE*)paramData;
198211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoMpeg4");
198311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
198411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
198511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_voptiming_cfg(pParam->nTimeIncRes)) {
198611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting vop_timing failed");
198711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
198811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
198911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
199011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_profile_set = false;
199111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_level_set = false;
199211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc_off_level = (int)pParam->eLevel;
199311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
199411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
199511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
199611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
199711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (pParam->eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
199811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (pParam->nBFrames) {
199911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                bFrames = pParam->nBFrames;
200011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
200111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else {
200211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (pParam->nBFrames) {
200311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
200411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                bFrames = 0;
200511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
200611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
200711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
200811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
200911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_intra_period (pParam->nPFrames,bFrames)) {
201011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
201111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
201211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
201311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
201411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoMpeg4,pParam->nSliceHeaderSpacing)) {
201511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating slice_config");
201611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
201711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
201811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
201911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoMpeg4");
202011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
202111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
202211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
202311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
202411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoH263:
202511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
202611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_H263TYPE* pParam = (OMX_VIDEO_PARAM_H263TYPE*)paramData;
202711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexParamVideoH263");
202811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 bFrames = 0;
202911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
203011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
203111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_profile_set = false;
203211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_level_set = false;
203311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc_off_level = (int)pParam->eLevel;
203411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
203511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level");
203611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
203711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
203811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
203911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (pParam->nBFrames)
204011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("WARNING: B frame not supported for H.263");
204111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
204211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_intra_period (pParam->nPFrames, bFrames) == false) {
204311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
204411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
204511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
204611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
204711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoH263");
204811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
204911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
205111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
205211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoAvc:
205311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
205411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoAvc");
205511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_AVCTYPE* pParam = (OMX_VIDEO_PARAM_AVCTYPE*)paramData;
205611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 bFrames = 0;
205711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
205811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
205911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("pParam->eProfile :%d ,pParam->eLevel %d",
206011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            pParam->eProfile,pParam->eLevel);
206111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
206211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_profile_set = false;
206311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_level_set = false;
206411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc_off_level = (int)pParam->eLevel;
206511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_profile_level (pParam->eProfile,pParam->eLevel)) {
206611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d",
206711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                pParam->eProfile, pParam->eLevel);
206811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
206911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
207011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if ((pParam->eProfile != OMX_VIDEO_AVCProfileBaseline) &&
207111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (pParam->eProfile != (OMX_VIDEO_AVCPROFILETYPE) QOMX_VIDEO_AVCProfileConstrainedBaseline)) {
207211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (pParam->nBFrames) {
207311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                bFrames = pParam->nBFrames;
207411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
207511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else {
207611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            if (pParam->nBFrames) {
207711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                DEBUG_PRINT_ERROR("Warning: B frames not supported");
207811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                bFrames = 0;
207911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
208011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
208111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
208211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_intra_period (pParam->nPFrames, bFrames)) {
208411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
208511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
208611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
208711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
208811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_entropy_config (pParam->bEntropyCodingCABAC, pParam->nCabacInitIdc)) {
208911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting Entropy failed");
209011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
209111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
209211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_inloop_filter (pParam->eLoopFilterMode)) {
209411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting Inloop filter failed");
209511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
209611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
209711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
209811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_multislice_cfg(OMX_IndexParamVideoAvc, pParam->nSliceHeaderSpacing)) {
209911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating slice_config");
210011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
210111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
210211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
210311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoAvc");
210411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
210511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
210611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //TBD, lot of other variables to be updated, yet to decide
210711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
210811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
210911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case (OMX_INDEXTYPE)OMX_IndexParamVideoVp8:
211011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
211111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoVp8");
211211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_VP8TYPE* pParam = (OMX_VIDEO_PARAM_VP8TYPE*)paramData;
211311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc_off_level = (int)pParam->eLevel;
211411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
211511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d",
211611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pParam->eProfile, pParam->eLevel);
211711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
211811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
211911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_vpx_error_resilience(pParam->bErrorResilientMode) == false) {
212011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set vpx error resilience");
212111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
212211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 }
21232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                if(!venc_set_ltrmode(1, ltrinfo.count)) {
212411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("ERROR: Failed to enable ltrmode");
212511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   return false;
212611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
212711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
212811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 // For VP8, hier-p and ltr are mutually exclusive features in firmware
212911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 // Disable hier-p if ltr is enabled.
213011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 if (m_codec == OMX_VIDEO_CodingVP8) {
213111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_LOW("Disable Hier-P as LTR is being set");
213211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     if (!venc_set_hier_layers(QOMX_HIERARCHICALCODING_P, 0)) {
213311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Disabling Hier P count failed");
213411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     }
213511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 }
213611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
213711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
213811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
213911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case (OMX_INDEXTYPE)OMX_IndexParamVideoHevc:
214011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
214111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoHevc");
214211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_HEVCTYPE* pParam = (OMX_VIDEO_PARAM_HEVCTYPE*)paramData;
214311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rc_off_level = (int)pParam->eLevel;
214411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_profile_level (pParam->eProfile, pParam->eLevel)) {
214511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Unsuccessful in updating Profile and level %d, %d",
214611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        pParam->eProfile, pParam->eLevel);
214711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
214811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
214911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_inloop_filter(OMX_VIDEO_AVCLoopFilterEnable))
215011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_HIGH("WARN: Request for setting Inloop filter failed for HEVC encoder");
215111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 fps = m_sVenc_cfg.fps_num ? m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den : 30;
2153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 nPFrames = pParam->nKeyFrameInterval > 0 ? pParam->nKeyFrameInterval - 1 : fps - 1;
2154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (!venc_set_intra_period (nPFrames, 0 /* nBFrames */)) {
215511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
215611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
215711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
215811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
215911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
216011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoIntraRefresh:
216111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
216211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoIntraRefresh");
216311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_INTRAREFRESHTYPE *intra_refresh =
216411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_VIDEO_PARAM_INTRAREFRESHTYPE *)paramData;
216511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
216611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
216711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_intra_refresh(intra_refresh->eRefreshMode, intra_refresh->nCirMBs) == false) {
216811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
216911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
217011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
217111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
217211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoIntraRefresh");
217311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
217411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
217511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
217611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
217711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoErrorCorrection:
217811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
217911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoErrorCorrection");
218011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *error_resilience =
218111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)paramData;
218211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
218311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (error_resilience->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
218411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_error_resilience(error_resilience) == false) {
218511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
218611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
218711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
218811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
218911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoErrorCorrection");
219011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
219111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
219211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
219311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
219411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoProfileLevelCurrent:
219511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
219611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoProfileLevelCurrent");
219711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_PROFILELEVELTYPE *profile_level =
219811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)paramData;
219911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
220011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (profile_level->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
220111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_profile_set = false;
220211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_level_set = false;
220311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    rc_off_level = (int)profile_level->eLevel;
220411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_profile_level (profile_level->eProfile,
220511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                profile_level->eLevel)) {
220611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("WARNING: Unsuccessful in updating Profile and level");
220711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
220811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
220911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
221011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoProfileLevelCurrent");
221111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
221211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
221311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
221411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
221511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoQuantization:
221611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
221711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_IndexParamVideoQuantization");
221811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_PARAM_QUANTIZATIONTYPE *session_qp =
221911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)paramData;
222011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (session_qp->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
222111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_session_qp (session_qp->nQpI,
222211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                session_qp->nQpP,
222311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                session_qp->nQpB) == false) {
222411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Session QP failed");
222511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
222611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
222711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
222811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexParamVideoQuantization");
222911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
223011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
223111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
223211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
223311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_IndexParamVideoInitialQp:
223411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
223511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_EXTNINDEX_VIDEO_INITIALQP * initqp =
223611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_EXTNINDEX_VIDEO_INITIALQP *)paramData;
223711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 if (initqp->bEnableInitQp) {
223811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Enable initial QP: %d", (int)initqp->bEnableInitQp);
223911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(venc_enable_initial_qp(initqp) == false) {
224011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       DEBUG_PRINT_ERROR("ERROR: Failed to enable initial QP");
224111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                       return OMX_ErrorUnsupportedSetting;
224211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     }
224311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 } else
224411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: setting QOMX_IndexParamVideoEnableInitialQp");
224511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
224611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
224711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoQPRange:
224811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
224911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoQPRange");
225011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *session_qp_range =
225111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_QCOM_VIDEO_PARAM_QPRANGETYPE *)paramData;
225211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
225311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(session_qp_range->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
225411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(venc_set_session_qp_range (session_qp_range->minQP,
225511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                session_qp_range->maxQP) == false) {
225611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting QP Range[%u %u] failed",
225711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            (unsigned int)session_qp_range->minQP, (unsigned int)session_qp_range->maxQP);
225811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
225911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
226011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        session_qp_values.minqp = session_qp_range->minQP;
226111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        session_qp_values.maxqp = session_qp_range->maxQP;
226211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
226311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
226411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoQPRange");
226511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
226611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
226711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
226811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
22692601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QcomIndexParamVideoIPBQPRange:
22702601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            {
22712601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:OMX_QcomIndexParamVideoIPBQPRange");
22722601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *qp =
22732601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    (OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE *)paramData;
22742601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U32 min_IPB_packed_QP = 0;
22752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                OMX_U32 max_IPB_packed_QP = 0;
22762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                 if (((qp->minIQP >= session_qp_range.minqp) && (qp->maxIQP <= session_qp_range.maxqp)) &&
22772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                          ((qp->minPQP >= session_qp_range.minqp) && (qp->maxPQP <= session_qp_range.maxqp)) &&
22782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                          ((qp->minBQP >= session_qp_range.minqp) && (qp->maxBQP <= session_qp_range.maxqp))) {
22792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
22802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                        /* When creating the packet, pack the qp value as
22812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                         * 0xbbppii, where ii = qp range for I-frames,
22822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                         * pp = qp range for P-frames, etc. */
22832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                       min_IPB_packed_QP = qp->minIQP | qp->minPQP << 8 | qp->minBQP << 16;
22842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                       max_IPB_packed_QP = qp->maxIQP | qp->maxPQP << 8 | qp->maxBQP << 16;
22852601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
22862601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                       if (qp->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
22872601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           if (venc_set_session_qp_range_packed(min_IPB_packed_QP,
22882601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                       max_IPB_packed_QP) == false) {
22892601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               DEBUG_PRINT_ERROR("ERROR: Setting IPB QP Range[%d %d] failed",
22902601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                                   min_IPB_packed_QP, max_IPB_packed_QP);
22912601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               return false;
22922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           } else {
22932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.min_i_qp = qp->minIQP;
22942601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.max_i_qp = qp->maxIQP;
22952601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.min_p_qp = qp->minPQP;
22962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.max_p_qp = qp->maxPQP;
22972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.min_b_qp = qp->minBQP;
22982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                               session_ipb_qp_values.max_b_qp = qp->maxBQP;
22992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           }
23002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                       } else {
23012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexParamVideoIPBQPRange");
23022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                       }
23032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                } else {
23042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    DEBUG_PRINT_ERROR("Wrong qp values: IQP range[%u %u], PQP range[%u,%u], BQP[%u,%u] range allowed range[%u %u]",
23052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           (unsigned int)qp->minIQP, (unsigned int)qp->maxIQP , (unsigned int)qp->minPQP,
23062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           (unsigned int)qp->maxPQP, (unsigned int)qp->minBQP, (unsigned int)qp->maxBQP,
23072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                           (unsigned int)session_qp_range.minqp, (unsigned int)session_qp_range.maxqp);
23082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                }
23092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                break;
23102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
231111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexEnableSliceDeliveryMode:
231211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
231311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_EXTNINDEX_PARAMTYPE* pParam =
231411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_EXTNINDEX_PARAMTYPE*)paramData;
231511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
231611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == PORT_INDEX_OUT) {
231711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_slice_delivery_mode(pParam->bEnable) == false) {
231811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Setting slice delivery mode failed");
231911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return OMX_ErrorUnsupportedSetting;
232011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
232111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
232211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("OMX_QcomIndexEnableSliceDeliveryMode "
232311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "called on wrong port(%u)", (unsigned int)pParam->nPortIndex);
232411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorBadPortIndex;
232511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
232611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
232711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
232811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
232911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataFrameDimension:
233011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
233111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataFrameDimension");
233211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BOOL extra_data = *(OMX_BOOL *)(paramData);
233311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
233411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_extradata(OMX_ExtraDataFrameDimension, extra_data) == false) {
233511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataFrameDimension failed");
233611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
233711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
233811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
233911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata = true;
234011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
234111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
234211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataVideoEncoderSliceInfo:
234311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
234411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderSliceInfo");
234511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BOOL extra_data = *(OMX_BOOL *)(paramData);
234611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
234711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_extradata(OMX_ExtraDataVideoEncoderSliceInfo, extra_data) == false) {
234811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoEncoderSliceInfo failed");
234911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
235011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
235111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
235211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata = true;
235311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
235411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
235511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataVideoEncoderMBInfo:
235611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
235711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoEncoderMBInfo");
235811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_BOOL extra_data =  *(OMX_BOOL *)(paramData);
235911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
236011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_extradata(OMX_ExtraDataVideoEncoderMBInfo, extra_data) == false) {
236111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoEncoderMBInfo failed");
236211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
236311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
236411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
236511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                extradata = true;
236611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
236711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
23682e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        case OMX_ExtraDataVideoLTRInfo:
23692e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            {
23702e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_ExtraDataVideoLTRInfo");
23712e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                OMX_BOOL extra_data =  *(OMX_BOOL *)(paramData);
23722e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
23732e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                if (venc_set_extradata(OMX_ExtraDataVideoLTRInfo, extra_data) == false) {
23742e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_ExtraDataVideoLTRInfo failed");
23752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    return false;
23762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                }
23772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
23782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                extradata = true;
23792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                break;
23802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            }
238111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamSequenceHeaderWithIDR:
238211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
238311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                PrependSPSPPSToIDRFramesParams * pParam =
238411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (PrependSPSPPSToIDRFramesParams *)paramData;
238511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
238611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set inband sps/pps: %d", pParam->bEnable);
238711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_inband_video_header(pParam->bEnable) == false) {
238811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: set inband sps/pps failed");
238911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
239011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
239111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
239311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
239411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamH264AUDelimiter:
239511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
239611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_H264_AUD * pParam =
239711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_QCOM_VIDEO_CONFIG_H264_AUD *)paramData;
239811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
239911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set AU delimiters: %d", pParam->bEnable);
240011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_au_delimiter(pParam->bEnable) == false) {
240111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: set H264 AU delimiter failed");
240211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
240311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
240411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
240511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
240611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
240711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamMBIStatisticsMode:
240811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
240911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QOMX_VIDEO_MBI_STATISTICS * pParam =
241011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_QOMX_VIDEO_MBI_STATISTICS *)paramData;
241111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set MBI Dump mode: %d", pParam->eMBIStatisticsType);
241311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_mbi_statistics_mode(pParam->eMBIStatisticsType) == false) {
241411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: set MBI Statistics mode failed");
241511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
241611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
241711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
241811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
241911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
242011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
242111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigH264EntropyCodingCabac:
242211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
242311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_VIDEO_H264ENTROPYCODINGTYPE * pParam =
242411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_VIDEO_H264ENTROPYCODINGTYPE *)paramData;
242511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
242611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("set Entropy info : %d", pParam->bCabac);
242711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_entropy_config (pParam->bCabac, 0) == false) {
242811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: set Entropy failed");
242911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
243011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
243111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
243311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
243411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
243511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         case OMX_QcomIndexHierarchicalStructure:
243611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           {
243711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               QOMX_VIDEO_HIERARCHICALLAYERS* pParam =
243811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   (QOMX_VIDEO_HIERARCHICALLAYERS*)paramData;
243911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
244011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == PORT_INDEX_OUT) {
244111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!venc_set_hier_layers(pParam->eHierarchicalCodingType, pParam->nNumLayers)) {
244211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("Setting Hier P count failed");
244311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
244411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
244511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
244611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("OMX_QcomIndexHierarchicalStructure called on wrong port(%d)", (int)pParam->nPortIndex);
244711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
244811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
244911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
245011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // For VP8, hier-p and ltr are mutually exclusive features in firmware
245111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // Disable ltr if hier-p is enabled.
245211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_codec == OMX_VIDEO_CodingVP8) {
245311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("Disable LTR as HIER-P is being set");
24542601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                    if(!venc_set_ltrmode(0, 0)) {
245511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         DEBUG_PRINT_ERROR("ERROR: Failed to disable ltrmode");
245611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     }
245711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
245811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
245911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           }
246011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamPerfLevel:
246111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
246211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_PARAM_PERF_LEVEL *pParam =
246311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_PARAM_PERF_LEVEL *)paramData;
246411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set perf level: %d", pParam->ePerfLevel);
246511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_perf_level(pParam->ePerfLevel)) {
246611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set perf level to %d", pParam->ePerfLevel);
246711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
246811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
246911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    performance_level.perflevel = (unsigned int) pParam->ePerfLevel;
247011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
247111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
247211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
247311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamH264VUITimingInfo:
247411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
247511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO *pParam =
247611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_PARAM_VUI_TIMING_INFO *)paramData;
247711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set VUI timing info: %d", pParam->bEnable);
247811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_vui_timing_info(pParam->bEnable) == false) {
247911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set vui timing info to %d", pParam->bEnable);
248011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
248111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
248211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    vui_timing_info.enabled = (unsigned int) pParam->bEnable;
248311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
248411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
248511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
248611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVQZIPSEIType:
248711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
248811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE*pParam =
248911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QTI_VIDEO_PARAM_VQZIP_SEI_TYPE *)paramData;
249011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Enable VQZIP SEI: %d", pParam->bEnable);
249111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_vqzip_sei_type(pParam->bEnable) == false) {
249211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set VQZIP SEI type %d", pParam->bEnable);
249311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
249411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
249511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
249611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
249711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamPeakBitrate:
249811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
249911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE *pParam =
250011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_PARAM_PEAK_BITRATE *)paramData;
250111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set peak bitrate: %u", (unsigned int)pParam->nPeakBitrate);
250211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_peak_bitrate(pParam->nPeakBitrate) == false) {
250311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set peak bitrate to %u", (unsigned int)pParam->nPeakBitrate);
250411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
250511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
250611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    peak_bitrate.peakbitrate = (unsigned int) pParam->nPeakBitrate;
250711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
250811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
250911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
251011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       case OMX_QcomIndexParamSetMVSearchrange:
251111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
251211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexParamSetMVSearchrange");
251311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               is_searchrange_set = true;
251411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               if (!venc_set_searchrange()) {
251511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   DEBUG_PRINT_ERROR("ERROR: Failed to set search range");
251611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   return false;
251711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               }
251811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
251911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
252011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoLTRCount:
252111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
252211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_QcomIndexParamVideoLTRCount");
252311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE* pParam =
252411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_PARAM_LTRCOUNT_TYPE*)paramData;
252511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nCount > 0) {
252611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_ltrmode(1, pParam->nCount) == false) {
252711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Enable LTR mode failed");
252811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
252911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
253011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
253111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_ltrmode(0, 0) == false) {
253211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Disable LTR mode failed");
253311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
253411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
253511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
253611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
253711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
253811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVideoHybridHierpMode:
253911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
254011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_hybrid_hierp((QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE*)paramData)) {
254111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("Setting hybrid Hier-P mode failed");
254211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return false;
254311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
254411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
254511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
254611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamBatchSize:
254711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
254811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PARAM_U32TYPE* pParam =
254911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_PARAM_U32TYPE*)paramData;
255011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == PORT_INDEX_OUT) {
255211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("For the moment, client-driven batching not supported"
255311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            " on output port");
255411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
255511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
255611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
255711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_batch_size(pParam->nU32)) {
255811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("Failed setting batch size as %d", pParam->nU32);
255911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return OMX_ErrorUnsupportedSetting;
256011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
256111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
256211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
256311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexParamVencAspectRatio:
256411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
256511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_aspectratio(paramData)) {
256611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_QcomIndexParamVencAspectRatio failed");
256711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
256811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
256911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
257011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
257111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamLowLatencyMode:
257211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
257311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE* pParam =
257411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE*)paramData;
257511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_low_latency(pParam->bLowLatencyMode)) {
257611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamLowLatencyMode failed");
257711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
257811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
257911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
258011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
258111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexParamVideoEnableRoiInfo:
258211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
258311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                struct v4l2_control control;
25842e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                OMX_QTI_VIDEO_PARAM_ENABLE_ROIINFO *pParam =
25852e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    (OMX_QTI_VIDEO_PARAM_ENABLE_ROIINFO *)paramData;
25862e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                if (pParam->bEnableRoiInfo == OMX_FALSE) {
25872e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    DEBUG_PRINT_INFO("OMX_QTIIndexParamVideoEnableRoiInfo: bEnableRoiInfo is false");
25882e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                    break;
25892e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                }
259011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264 &&
259111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) {
259211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("OMX_QTIIndexParamVideoEnableRoiInfo is not supported for %lu codec", m_sVenc_cfg.codectype);
259311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
259411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
259511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
259611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_MPEG_VIDC_EXTRADATA_ROI_QP;
259711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Setting param OMX_QTIIndexParamVideoEnableRoiInfo");
259811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
259911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamVideoEnableRoiInfo failed");
260011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
260111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
26022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                m_roi_enabled = true;
2603fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
2604fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                m_pq.pConfig.a_qp.roi_enabled = (OMX_U32)true;
2605b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                allocate_extradata(&m_pq.roi_extradata_info, ION_FLAG_CACHED);
2606b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                m_pq.configure(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
2607fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
260811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
260911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
261011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoVencLowLatencyMode:
261111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
261211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_ENABLETYPE *pParam = (QOMX_ENABLETYPE*)paramData;
261311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
261411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_lowlatency_mode(pParam->bEnable)) {
261511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     DEBUG_PRINT_ERROR("Setting low latency mode failed");
261611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                     return OMX_ErrorUnsupportedSetting;
261711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
261811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
261911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
2620fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_IndexParamAndroidVideoTemporalLayering:
2621fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
2622fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (venc_set_temporal_layers(
2623fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        (OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE*)paramData) != OMX_ErrorNone) {
2624fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("set_param: Failed to configure temporal layers");
2625fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return false;
2626fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
2627fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                break;
2628fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
2629fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        case OMX_QTIIndexParamDisablePQ:
2630fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            {
2631fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                QOMX_DISABLETYPE * pParam = (QOMX_DISABLETYPE *)paramData;
2632fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_QTIIndexParamDisablePQ: %d", pParam->bDisable);
2633fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#ifdef _PQ_
2634bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel                m_pq.is_pq_force_disable = (pParam->bDisable == OMX_TRUE);
2635fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel#endif
2636fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                break;
2637fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            }
2638a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case OMX_QTIIndexParamIframeSizeType:
2639a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            {
2640a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                QOMX_VIDEO_IFRAMESIZE* pParam =
2641a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    (QOMX_VIDEO_IFRAMESIZE *)paramData;
2642a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                isCBR = rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR ||
2643a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR;
2644a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                if (!isCBR) {
2645a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    DEBUG_PRINT_ERROR("venc_set_param: OMX_QTIIndexParamIframeSizeType not allowed for this configuration isCBR(%d)",
2646a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                        isCBR);
2647a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    return OMX_ErrorUnsupportedSetting;
2648a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                }
2649a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                if (!venc_set_iframesize_type(pParam->eType)) {
2650a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting OMX_QTIIndexParamIframeSizeType failed");
2651a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    return OMX_ErrorUnsupportedSetting;
2652a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                }
2653a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                break;
2654a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
265511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexParamVideoSliceFMO:
265611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
265711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Unsupported parameter in venc_set_param: %u",
265811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    index);
265911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
266011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            //case
266111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
266211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
266411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
266511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
266611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_check_valid_config()
266711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
266811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   if (streaming[OUTPUT_PORT] && streaming[CAPTURE_PORT] &&
266911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       ((m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 && hier_layers.hier_mode == HIER_P_HYBRID) ||
267011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC && hier_layers.hier_mode == HIER_P))) {
267111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("venc_set_config not allowed run time for following usecases");
267211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("For H264 : When Hybrid Hier P enabled");
267311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("For H265 : When Hier P enabled");
267411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
267511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
267611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel   return true;
267711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
267811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
267911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_config(void *configData, OMX_INDEXTYPE index)
268011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
268111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Inside venc_set_config");
268311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(!venc_check_valid_config()) {
268511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("venc_set_config not allowed for this configuration");
268611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
268711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
268811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
268911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)index) {
269011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoBitrate:
269111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
269211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_CONFIG_BITRATETYPE *bit_rate = (OMX_VIDEO_CONFIG_BITRATETYPE *)
269311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    configData;
269411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoBitrate");
269511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
269611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (bit_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
269711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_target_bitrate(bit_rate->nEncodeBitrate, 1) == false) {
269811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Target Bit rate failed");
269911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
270011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
270111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
270211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoBitrate");
270311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
270411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
270511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
270611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
270711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoFramerate:
270811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
270911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_CONFIG_FRAMERATETYPE *frame_rate = (OMX_CONFIG_FRAMERATETYPE *)
271011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    configData;
271111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoFramerate");
271211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
271311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (frame_rate->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
271411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_encode_framerate(frame_rate->xEncodeFramerate, 1) == false) {
271511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
271611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
271711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
2718fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
2719fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    venc_try_enable_pq();
2720fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
272111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
272211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
272311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
272411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
272511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
272611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
272711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_IndexConfigVideoIntraperiod:
272811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
272911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param:QOMX_IndexConfigVideoIntraperiod");
273011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_VIDEO_INTRAPERIODTYPE *intraperiod =
273111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_VIDEO_INTRAPERIODTYPE *)configData;
273211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
273311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (intraperiod->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
273411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_intra_period(intraperiod->nPFrames, intraperiod->nBFrames) == false) {
273511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
273611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
273711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
273811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
273911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
274011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
274111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
274211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoIntraVOPRefresh:
274311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
274411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_CONFIG_INTRAREFRESHVOPTYPE *intra_vop_refresh = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)
274511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    configData;
274611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoIntraVOPRefresh");
274711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
274811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (intra_vop_refresh->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
274911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_intra_vop_refresh(intra_vop_refresh->IntraRefreshVOP) == false) {
275011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Encode Framerate failed");
275111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
275211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
275311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
275411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoFramerate");
275511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
275611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
275711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
275811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
275911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonRotate:
276011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
276111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_CONFIG_ROTATIONTYPE *config_rotation =
276211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    reinterpret_cast<OMX_CONFIG_ROTATIONTYPE*>(configData);
276311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_U32 nFrameWidth;
276411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!config_rotation) {
276511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                   return false;
276611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
276711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (true == deinterlace_enabled) {
276811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Rotation is not supported with deinterlacing");
276911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
277011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
277111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(venc_set_vpe_rotation(config_rotation->nRotation) == false) {
277211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Dimension Change for Rotation failed");
277311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
277411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
277511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
277611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
277711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
277811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoAVCIntraPeriod:
277911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
278011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_CONFIG_AVCINTRAPERIOD *avc_iperiod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD*) configData;
278111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_param: OMX_IndexConfigVideoAVCIntraPeriod");
278211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
278311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_idr_period(avc_iperiod->nPFrames, avc_iperiod->nIDRPeriod)
278411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        == false) {
278511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Setting "
278611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            "OMX_IndexConfigVideoAVCIntraPeriod failed");
278711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
278811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
278911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
279011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
279111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigCommonDeinterlace:
279211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
279311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_CONFIG_DEINTERLACE *deinterlace = (OMX_VIDEO_CONFIG_DEINTERLACE *) configData;
279411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigCommonDeinterlace");
279511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if(deinterlace->nPortIndex == (OMX_U32)PORT_INDEX_OUT) {
279611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (m_sVenc_cfg.dvs_width == m_sVenc_cfg.input_height &&
279711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sVenc_cfg.dvs_height == m_sVenc_cfg.input_width)
279811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    {
279911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Deinterlace not supported with rotation");
280011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
280111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
280211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(venc_set_deinterlace(deinterlace->nEnable) == false) {
280311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Deinterlace failed");
280411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
280511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
280611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
280711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigCommonDeinterlace");
280811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
280911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
281011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
281111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigVideoVp8ReferenceFrame:
281211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
281311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_VP8REFERENCEFRAMETYPE* vp8refframe = (OMX_VIDEO_VP8REFERENCEFRAMETYPE*) configData;
281411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_IndexConfigVideoVp8ReferenceFrame");
281511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if ((vp8refframe->nPortIndex == (OMX_U32)PORT_INDEX_IN) &&
281611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (vp8refframe->bUseGoldenFrame)) {
281711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(venc_set_useltr(0x1) == false) {
281811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: use goldenframe failed");
281911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
282011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
282111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if((vp8refframe->nPortIndex == (OMX_U32)PORT_INDEX_IN) &&
282211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (vp8refframe->bGoldenFrameRefresh)) {
282311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if(venc_set_markltr(0x1) == false) {
282411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting goldenframe failed");
282511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
282611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
282711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
282811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoVp8ReferenceFrame");
282911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
283011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
283111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
283211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoLTRUse:
283311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
283411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_LTRUSE_TYPE* pParam = (OMX_QCOM_VIDEO_CONFIG_LTRUSE_TYPE*)configData;
283511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoLTRUse");
283611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
283711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_useltr(pParam->nID) == false) {
283811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Use LTR failed");
283911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
284011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
284111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
284211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexConfigVideoLTRUse");
284311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
284411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
284511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
284611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoLTRMark:
284711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
284811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_LTRMARK_TYPE* pParam = (OMX_QCOM_VIDEO_CONFIG_LTRMARK_TYPE*)configData;
284911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoLTRMark");
285011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (pParam->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
285111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_markltr(pParam->nID) == false) {
285211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Mark LTR failed");
285311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
285411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
285511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }  else {
285611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QcomIndexConfigVideoLTRMark");
285711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
285811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
285911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
286011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigPerfLevel:
286111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
286211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *perf =
286311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (OMX_QCOM_VIDEO_CONFIG_PERF_LEVEL *)configData;
286411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set perf level: %d", perf->ePerfLevel);
286511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_perf_level(perf->ePerfLevel)) {
286611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Failed to set perf level to %d", perf->ePerfLevel);
286711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
286811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
286911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    performance_level.perflevel = (unsigned int) perf->ePerfLevel;
287011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
287111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
287211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
287311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigVideoVencPerfMode:
287411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
287511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_EXTNINDEX_VIDEO_PERFMODE *pParam = (QOMX_EXTNINDEX_VIDEO_PERFMODE *) configData;
287611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigVideoVencPerfMode");
287711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_perf_mode(pParam->nPerfMode) == false) {
287811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE");
287911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
288011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
288111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
288211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
288311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigNumHierPLayers:
288411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
288511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS *pParam =
288611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS *) configData;
288711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigNumHierPLayers");
288811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_hierp_layers(pParam->nNumHierLayers) == false) {
288911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigNumHierPLayers");
289011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
289111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
289211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
289311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
289411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigBaseLayerId:
289511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
289611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID* pParam =
289711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID*) configData;
289811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_baselayerid(pParam->nPID) == false) {
289911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigBaseLayerId failed");
290011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
290111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
290211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
290311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
2904fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_IndexParamAndroidVideoTemporalLayering:
2905fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
2906fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("TemporalLayer: Changing layer-configuration dynamically is not supported!");
2907fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return false;
2908fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
290911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QcomIndexConfigQp:
291011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
291111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_SKYPE_VIDEO_CONFIG_QP* pParam =
291211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (OMX_SKYPE_VIDEO_CONFIG_QP*) configData;
291311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (venc_set_qp(pParam->nQP) == false) {
291411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigQp failed");
291511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return OMX_ErrorUnsupportedSetting;
291611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
291711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
291811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
291911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigPriority:
292011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
292111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PARAM_U32TYPE *priority = (OMX_PARAM_U32TYPE *)configData;
292211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set_config: priority %d",priority->nU32);
292311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_priority(priority->nU32)) {
292411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set priority");
292511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
292611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
292711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
292811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
292911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigOperatingRate:
293011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
293111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_PARAM_U32TYPE *rate = (OMX_PARAM_U32TYPE *)configData;
293211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Set_config: operating rate %d", rate->nU32);
293311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!venc_set_operatingrate(rate->nU32)) {
293411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set operating rate");
293511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
293611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
293711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
293811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
293911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef SUPPORT_CONFIG_INTRA_REFRESH
294011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_IndexConfigAndroidIntraRefresh:
294111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            {
294211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *intra_refresh = (OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE *)configData;
294311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("OMX_IndexConfigAndroidIntraRefresh : num frames = %d", intra_refresh->nRefreshPeriod);
294411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
294511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (intra_refresh->nPortIndex == (OMX_U32) PORT_INDEX_OUT) {
294611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 mb_size = m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC ? 32 : 16;
294711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 num_mbs_per_frame = (ALIGN(m_sVenc_cfg.dvs_height, mb_size)/mb_size) * (ALIGN(m_sVenc_cfg.dvs_width, mb_size)/mb_size);
294811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    OMX_U32 num_intra_refresh_mbs = ceil(num_mbs_per_frame / intra_refresh->nRefreshPeriod);
294911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
295011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (venc_set_intra_refresh(OMX_VIDEO_IntraRefreshRandom, num_intra_refresh_mbs) == false) {
295111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: Setting Intra refresh failed");
295211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
295311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
295411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
295511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_IndexConfigVideoIntraRefreshType");
295611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
295711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
295811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
295911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
296011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_QTIIndexConfigVideoBlurResolution:
296111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
296211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             OMX_QTI_VIDEO_CONFIG_BLURINFO *blur = (OMX_QTI_VIDEO_CONFIG_BLURINFO *)configData;
296311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             if (blur->nPortIndex == (OMX_U32)PORT_INDEX_IN) {
296411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 DEBUG_PRINT_LOW("Set_config: blur resolution: %d", blur->eTargetResol);
296511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 if(!venc_set_blur_resolution(blur)) {
296611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("Failed to set Blur Resolution");
296711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
296811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                 }
296911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             } else {
297011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  DEBUG_PRINT_ERROR("ERROR: Invalid Port Index for OMX_QTIIndexConfigVideoBlurResolution");
297111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                  return false;
297211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             }
297311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel             break;
297411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
29752601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case OMX_QcomIndexConfigH264Transform8x8:
29762601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        {
29772601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            OMX_CONFIG_BOOLEANTYPE *pEnable = (OMX_CONFIG_BOOLEANTYPE *) configData;
29782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            DEBUG_PRINT_LOW("venc_set_config: OMX_QcomIndexConfigH264Transform8x8");
29792601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            if (venc_h264_transform_8x8(pEnable->bEnabled) == false) {
29802601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                DEBUG_PRINT_ERROR("Failed to set OMX_QcomIndexConfigH264Transform8x8");
29812601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                return false;
29822601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            }
29832601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
29842601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
2985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_QTIIndexConfigDescribeColorAspects:
2986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            {
2987fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DescribeColorAspectsParams *params = (DescribeColorAspectsParams *)configData;
2988fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
2989fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 color_space = MSM_VIDC_BT601_6_625;
2990fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 full_range = 0;
2991fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 matrix_coeffs = MSM_VIDC_MATRIX_601_6_625;
2992fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                OMX_U32 transfer_chars = MSM_VIDC_TRANSFER_601_6_625;
2993fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
2994fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch((ColorAspects::Primaries)(params->sAspects.mPrimaries)) {
2995fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesBT709_5:
2996fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT709_5;
2997fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
2998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesBT470_6M:
2999fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT470_6_M;
3000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesBT601_6_625:
3002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT601_6_625;
3003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesBT601_6_525:
3005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT601_6_525;
3006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3007fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesGenericFilm:
3008fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_GENERIC_FILM;
3009fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3010fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::PrimariesBT2020:
3011fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT2020;
3012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3013fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
3014fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        color_space = MSM_VIDC_BT601_6_625;
3015fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        //params->sAspects.mPrimaries = ColorAspects::PrimariesBT601_6_625;
3016fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
3018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch((ColorAspects::Range)params->sAspects.mRange) {
3019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::RangeFull:
3020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        full_range = 1;
3021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::RangeLimited:
3023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        full_range = 0;
3024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3025fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
3026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
3028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch((ColorAspects::Transfer)params->sAspects.mTransfer) {
3029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferSMPTE170M:
3030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_601_6_525;
3031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferUnspecified:
3033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_UNSPECIFIED;
3034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferGamma22:
3036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_BT_470_6_M;
3037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferGamma28:
3039fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_BT_470_6_BG;
3040fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferSMPTE240M:
3042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_SMPTE_240M;
3043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferLinear:
3045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_LINEAR;
3046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferXvYCC:
3048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_IEC_61966;
3049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferBT1361:
3051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_BT_1361;
3052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::TransferSRGB:
3054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_SRGB;
3055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
3057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        //params->sAspects.mTransfer = ColorAspects::TransferSMPTE170M;
3058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_TRANSFER_601_6_625;
3059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
3061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                switch((ColorAspects::MatrixCoeffs)params->sAspects.mMatrixCoeffs) {
3062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixUnspecified:
3063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_UNSPECIFIED;
3064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixBT709_5:
3066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_BT_709_5;
3067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixBT470_6M:
3069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_FCC_47;
3070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixBT601_6:
3072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_601_6_525;
3073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixSMPTE240M:
3075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        transfer_chars = MSM_VIDC_MATRIX_SMPTE_240M;
3076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3077fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixBT2020:
3078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_BT_2020;
3079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    case ColorAspects::MatrixBT2020Constant:
3081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_BT_2020_CONST;
3082fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3083fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    default:
3084fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        //params->sAspects.mMatrixCoeffs = ColorAspects::MatrixBT601_6;
3085fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        matrix_coeffs = MSM_VIDC_MATRIX_601_6_625;
3086fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        break;
3087fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
3088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (!venc_set_colorspace(color_space, full_range,
3089fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            transfer_chars, matrix_coeffs)) {
3090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Failed to set operating rate");
3092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return false;
3093fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
3094fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                break;
3095fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
3096fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_QTIIndexConfigVideoRoiInfo:
3097fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        {
3098fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if(!venc_set_roi_qp_info((OMX_QTI_VIDEO_CONFIG_ROIINFO *)configData)) {
3099fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Failed to set ROI QP info");
3100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return false;
3101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
3102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
3103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
310411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
310511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported config index = %u", index);
310611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
310711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
310811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
310911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
311011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
311111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
311211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_stop( void)
311311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
311411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_msg venc_msg;
311511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
311611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0, ret = 0;
311711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
311811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!stopped) {
311911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type cap_type;
312011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
312111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (streaming[OUTPUT_PORT]) {
312211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            cap_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
312311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
312411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
312511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
312611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d",
312711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        cap_type, rc);
312811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else
312911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[OUTPUT_PORT] = false;
313011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
313111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Releasing registered buffers from driver on o/p port");
313211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.memory = V4L2_MEMORY_USERPTR;
313311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 0;
313411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
313511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
313611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
313711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
313811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: VIDIOC_REQBUFS OUTPUT MPLANE Failed");
313911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
314011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
314111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
314211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
314311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc && streaming[CAPTURE_PORT]) {
314411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            cap_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
314511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(m_nDriver_fd, VIDIOC_STREAMOFF, &cap_type);
314611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
314711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
314811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to call streamoff on driver: capability: %d, %d",
314911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        cap_type, rc);
315011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else
315111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                streaming[CAPTURE_PORT] = false;
315211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
315311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Releasing registered buffers from driver on capture port");
315411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.memory = V4L2_MEMORY_USERPTR;
315511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.count = 0;
315611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
315711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq);
315811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
315911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ret) {
316011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("ERROR: VIDIOC_REQBUFS CAPTURE MPLANE Failed");
316111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
316211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
316311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
316411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
316511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!rc && !ret) {
316611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            venc_stop_done();
316711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            stopped = 1;
316811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*set flag to re-configure when started again*/
316911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            resume_in_stopped = 1;
317011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
317111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
317211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
317311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
317411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return rc;
317511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
317611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
317711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_pause(void)
317811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
317911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&pause_resume_mlock);
318011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    paused = true;
318111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&pause_resume_mlock);
318211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
318311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
318411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
318511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_resume(void)
318611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
318711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&pause_resume_mlock);
318811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    paused = false;
318911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&pause_resume_mlock);
319011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
319111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return pthread_cond_signal(&pause_resume_cond);
319211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
319311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
319411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_start_done(void)
319511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
319611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_msg venc_msg;
319711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_msg.msgcode = VEN_MSG_START;
319811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_msg.statuscode = VEN_S_SUCCESS;
319911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_handle->async_message_process(venc_handle,&venc_msg);
320011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
320111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
320211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
320311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_stop_done(void)
320411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
320511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_msg venc_msg;
320642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    free_extradata_all();
320711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_msg.msgcode=VEN_MSG_STOP;
320811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_msg.statuscode=VEN_S_SUCCESS;
320911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_handle->async_message_process(venc_handle,&venc_msg);
321011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
321111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
321211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
321311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_set_message_thread_id(pthread_t tid)
321411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
321511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    async_thread_created = true;
321611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_tid=tid;
321711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
321811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
321911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vqzip_defaults()
322111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
322211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
322311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0, num_mbs_per_frame;
322411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    num_mbs_per_frame = m_sVenc_cfg.input_height * m_sVenc_cfg.input_width;
322611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
322711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (num_mbs_per_frame) {
322811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_CORE_720P_WIDTH  * OMX_CORE_720P_HEIGHT:
322911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_CORE_1080P_WIDTH * OMX_CORE_1080P_HEIGHT:
323011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_CORE_4KUHD_WIDTH * OMX_CORE_4KUHD_HEIGHT:
323111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_CORE_4KDCI_WIDTH * OMX_CORE_4KDCI_HEIGHT:
323211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
323311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
323411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("VQZIP is not supported for this resoultion : %lu X %lu",
323511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
323611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
323711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
323811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
323911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
324011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
324111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
324211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc)
324311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set Rate Control OFF for VQZIP");
324411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
324511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = INT_MAX;
324611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
324711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
324811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc)
324911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set P frame period for VQZIP");
325011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
325211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 0;
325311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
325511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc)
325611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set B frame period for VQZIP");
325711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
325811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE;
325911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = V4L2_MPEG_VIDC_VIDEO_PERF_MAX_QUALITY;
326011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
326211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc)
326311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set Max quality for VQZIP");
326411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
326611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = 1;
326711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
326811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
326911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc)
327011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set IDR period for VQZIP");
327111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
327211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
327311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
327411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
327511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_start(void)
327611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
327711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enum v4l2_buf_type buf_type;
327811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret, r;
327911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
328011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0, sizeof(control));
328211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("%s(): Check Profile/Level set in driver before start",
328411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            __func__);
328511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_level_set = false;
328611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
328711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_set_profile_level(0, 0)) {
328811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET",
328911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__);
329011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
329111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET",
329211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__, codec_profile.profile, profile_level.level);
329311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
329411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
3296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel   /*
3297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    * Make sure that PQ is still applicable for given configuration.
3298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    * This call mainly disables PQ if current encoder configuration
3299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    * doesn't support PQ. PQ cann't enabled here as buffer allocation
3300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    * is already done by this time.
3301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    */
3302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    venc_try_enable_pq();
3303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
3304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
330511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (vqzip_sei_info.enabled && !venc_set_vqzip_defaults())
330611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 1;
330711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
330811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
330911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        venc_set_low_latency((OMX_BOOL)!intra_period.num_bframes);
331011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // re-configure the temporal layers as RC-mode and key-frame interval
3312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // might have changed since the client last configured the layers.
3313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (temporal_layers_config.nPLayers) {
3314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (venc_set_temporal_layers_internal() != OMX_ErrorNone) {
3315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Re-configuring temporal layers failed !");
3316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else {
3317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            // request buffers on capture port again since internal (scratch)-
3318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            // buffer requirements may change (i.e if we switch from non-hybrid
3319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            // to hybrid mode and vice-versa)
3320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            struct v4l2_requestbuffers bufreq;
3321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3322fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            bufreq.memory = V4L2_MEMORY_USERPTR;
3323fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            bufreq.count = m_sOutput_buff_property.actualcount;
3324fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
3325fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_REQBUFS, &bufreq)) {
3326fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Request bufs failed while reconfiguring layers");
3327fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
3328fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
3329fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
3330fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
333111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    venc_config_print();
333211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(resume_in_stopped){
333411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*set buffercount when restarted*/
333511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        venc_reconfig_reqbufs();
333611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        resume_in_stopped = 0;
333711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
333811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
333911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* Check if slice_delivery mode is enabled & max slices is sufficient for encoding complete frame */
334011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (slice_mode.enable && multislice.mslice_size &&
334111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (m_sVenc_cfg.dvs_width *  m_sVenc_cfg.dvs_height)/(256 * multislice.mslice_size) >= MAX_SUPPORTED_SLICES_PER_FRAME) {
334211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("slice_mode: %lu, max slices (%lu) should be less than (%d)", slice_mode.enable,
334311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (m_sVenc_cfg.dvs_width *  m_sVenc_cfg.dvs_height)/(256 * multislice.mslice_size),
334411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                MAX_SUPPORTED_SLICES_PER_FRAME);
334511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 1;
334611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
334711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
334811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf_type=V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
334911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("send_command_proxy(): Idle-->Executing");
335011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret=ioctl(m_nDriver_fd, VIDIOC_STREAMON,&buf_type);
335111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret)
335311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return 1;
335411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    streaming[CAPTURE_PORT] = true;
335611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
335711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*
335811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Workaround for Skype usecase. Skpye doesn't like SPS\PPS come as
335911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     seperate buffer. It wants SPS\PPS with IDR frame FTB.
336011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
336111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
336211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_handle->m_slowLatencyMode.bLowLatencyMode) {
336311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_SEQ_HEADER;
336411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
336511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
336611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
336711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("failed to request seq header");
336811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return 1;
336911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
337011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
337111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /* This is intentionally done after SEQ_HEADER check. Because
337311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * PIC_ORDER_CNT is tightly coupled with lowlatency. Low latency
337411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * flag is also overloaded not to send SPS in separate buffer.
337511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Hence lowlatency setting is done after SEQ_HEADER check.
337611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     * Don't change this sequence unless you know what you are doing.
337711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     */
337811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
337911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264)
338011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        venc_set_low_latency((OMX_BOOL)!intra_period.num_bframes);
338111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
338211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    stopped = 0;
338311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
338411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
338511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
338611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelinline const char* hiermode_string(int val)
338711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
338811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch(val)
338911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
339011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case HIER_NONE:
339111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "No Hier";
339211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case HIER_P:
339311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "Hier-P";
339411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case HIER_B:
339511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "Hier-B";
339611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case HIER_P_HYBRID:
339711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "Hybrid Hier-P";
339811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
339911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "No hier";
340011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
340111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
340211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
340311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelinline const char* bitrate_type_string(int val)
340411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
340511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch(val)
340611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
340711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_DISABLE:
340811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "CUMULATIVE";
340911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE:
341011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "LAYER WISE";
341111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
341211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return "Unknown Bitrate Type";
341311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
341411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
341511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3416fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelstatic const char *codec_as_string(unsigned long codec) {
3417fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (codec) {
3418fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    case V4L2_PIX_FMT_H264:
3419fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "H264";
3420fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    case V4L2_PIX_FMT_MPEG4:
3421fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "MPEG4";
3422fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    case V4L2_PIX_FMT_H263:
3423fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "H263";
3424fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    case V4L2_PIX_FMT_HEVC:
3425fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "HEVC";
3426fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    case V4L2_PIX_FMT_VP8:
3427fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "VP8";
3428fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    default:
3429fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return "UNKOWN";
3430fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
3431fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
3432fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
343311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_config_print()
343411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
343511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3436fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Codec: %s, Profile %ld, level : %ld",
3437fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            codec_as_string(m_sVenc_cfg.codectype), codec_profile.profile, profile_level.level);
343811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
343911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Input Width: %ld, Height:%ld, Fps: %ld",
344011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.input_width, m_sVenc_cfg.input_height,
344111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
344211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
344311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Output Width: %ld, Height:%ld, Fps: %ld",
344411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.dvs_width, m_sVenc_cfg.dvs_height,
344511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.fps_num/m_sVenc_cfg.fps_den);
344611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3447fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Color Space: Primaries = %u, Range = %u, Transfer Chars = %u, Matrix Coeffs = %u",
3448fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_space.primaries, color_space.range, color_space.transfer_chars, color_space.matrix_coeffs);
3449fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
345011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Bitrate: %ld, RC: %ld, P - Frames : %ld, B - Frames = %ld",
345111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bitrate.target_bitrate, rate_ctrl.rcmode, intra_period.num_pframes, intra_period.num_bframes);
345211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
345311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: qpI: %ld, qpP: %ld, qpb: %ld",
345411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            session_qp.iframeqp, session_qp.pframeqp, session_qp.bframeqp);
345511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
345611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Init_qpI: %ld, Init_qpP: %ld, Init_qpb: %ld",
345711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            init_qp.iframeqp, init_qp.pframeqp, init_qp.bframeqp);
345811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
345911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: minQP: %lu, maxQP: %lu",
346011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            session_qp_values.minqp, session_qp_values.maxqp);
346111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: VOP_Resolution: %ld, Slice-Mode: %ld, Slize_Size: %ld",
346311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            voptimecfg.voptime_resolution, multislice.mslice_mode,
346411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            multislice.mslice_size);
346511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: EntropyMode: %d, CabacModel: %ld",
346711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            entropy.longentropysel, entropy.cabacmodel);
346811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
346911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: DB-Mode: %ld, alpha: %ld, Beta: %ld",
347011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dbkfilter.db_mode, dbkfilter.slicealpha_offset,
347111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dbkfilter.slicebeta_offset);
347211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
347311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: IntraMB/Frame: %ld, HEC: %ld, IDR Period: %ld",
347411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            intra_refresh.mbcount, hec.header_extension, idrperiod.idrperiod);
347511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
347611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: LTR Enabled: %d, Count: %d",
347711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ltrinfo.enabled, ltrinfo.count);
347811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3479fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (temporal_layers_config.nPLayers) {
3480fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("ENC_CONFIG: Temporal layers: P-layers: %u, B-layers: %u, Adjusted I-frame-interval: %lu",
3481fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                temporal_layers_config.nPLayers, temporal_layers_config.nBLayers,
3482fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                intra_period.num_pframes + intra_period.num_bframes + 1);
348311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3484fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        for (OMX_U32 l = 0; temporal_layers_config.bIsBitrateRatioValid
3485fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                && (l < temporal_layers_config.nPLayers + temporal_layers_config.nBLayers); ++l) {
3486fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_HIGH("ENC_CONFIG: Temporal layers: layer[%d] bitrate %% = %u%%",
3487fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    l, temporal_layers_config.nTemporalLayerBitrateFraction[l]);
3488fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
3489fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
3490fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3491fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("ENC_CONFIG: Hier layers: %d, Hier Mode: %s VPX_ErrorResilience: %d",
3492fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                hier_layers.numlayers, hiermode_string(hier_layers.hier_mode), vpx_err_resilience.enable);
349311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3494fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("ENC_CONFIG: Hybrid_HP PARAMS: Layers: %d, Frame Interval : %d, MinQP: %d, Max_QP: %d",
3495fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                hybrid_hp.nHpLayers, hybrid_hp.nKeyFrameInterval, hybrid_hp.nMinQuantizer, hybrid_hp.nMaxQuantizer);
3496fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3497fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("ENC_CONFIG: Hybrid_HP PARAMS: Layer0: %d, Layer1: %d, Later2: %d, Layer3: %d, Layer4: %d, Layer5: %d",
3498fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                hybrid_hp.nTemporalLayerBitrateRatio[0], hybrid_hp.nTemporalLayerBitrateRatio[1],
3499fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                hybrid_hp.nTemporalLayerBitrateRatio[2], hybrid_hp.nTemporalLayerBitrateRatio[3],
3500fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                hybrid_hp.nTemporalLayerBitrateRatio[4], hybrid_hp.nTemporalLayerBitrateRatio[5]);
3501fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
350211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
350311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Performace level: %d", performance_level.perflevel);
350411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
350511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: VUI timing info enabled: %d", vui_timing_info.enabled);
350611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
350711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Peak bitrate: %d", peak_bitrate.peakbitrate);
350811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
350911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Session Priority: %u", sess_priority.priority);
351011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
35112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: ROI : %u", m_roi_enabled);
3512fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
3513fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Adaptive QP (PQ): %u", m_pq.is_pq_enabled);
3514fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
3515fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
351611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("ENC_CONFIG: Operating Rate: %u", operating_rate);
351711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
351811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
351911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_reconfig_reqbufs()
352011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
352111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
352211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
352311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
352411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = m_sInput_buff_property.actualcount;
352511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
352611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
352711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed when resume");
352811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
352911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
353011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
353111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
353211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = m_sOutput_buff_property.actualcount;
353311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
353411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq))
353511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
353611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Request for setting o/p buffer count failed when resume");
353711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
353811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
353911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
354011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
354111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
354211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelunsigned venc_dev::venc_flush( unsigned port)
354311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
354411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_encoder_cmd enc;
354511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("in %s", __func__);
354611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
354742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    unsigned int cookie = 0;
354842adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) {
354942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        cookie = fd_list[i];
355042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        if (cookie != 0) {
355142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel            if (!ioctl(input_extradata_info.m_ion_dev, ION_IOC_FREE, &cookie)) {
355242adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                DEBUG_PRINT_HIGH("Freed handle = %u", cookie);
355342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel            }
355442adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel            fd_list[i] = 0;
355542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        }
355642adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel    }
355742adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
355811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enc.cmd = V4L2_ENC_QCOM_CMD_FLUSH;
355911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enc.flags = V4L2_QCOM_CMD_FLUSH_OUTPUT | V4L2_QCOM_CMD_FLUSH_CAPTURE;
356011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_ENCODER_CMD, &enc)) {
356211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Flush Port (%d) Failed ", port);
356311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
356411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
356511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return 0;
356711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
356811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
356911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel//allocating I/P memory from pmem and register with the device
357111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_use_buf(void *buf_addr, unsigned port,unsigned index)
357411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
357511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
357611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem *pmem_tmp;
357711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
357811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
357911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
358011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int extra_idx;
358111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int extradata_index = 0;
358211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_tmp = (struct pmem *)buf_addr;
358411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_use_buf:: pmem_tmp = %p", pmem_tmp);
358511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == PORT_INDEX_IN) {
358711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(num_input_planes);
358811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
358911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((num_input_planes > 1) && (extra_idx)) {
3590b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            rc = allocate_extradata(&input_extradata_info, ION_FLAG_CACHED);
359111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
359211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
359311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to allocate extradata: %d\n", rc);
359411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
359511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = index;
359611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
359711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
359811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = pmem_tmp->size;
359911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
360011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[0] = pmem_tmp->fd;
360111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[1] = 0;
360211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = pmem_tmp->offset;
360311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = plane;
360411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = num_input_planes;
360511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
360611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelif (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
36072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev, pmem_tmp->fd);
360811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (extradata_index < 0 ) {
360911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", pmem_tmp->fd);
361011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
361111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
361211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].length = input_extradata_info.buffer_size;
361311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size);
361411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
361511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd;
361611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
361711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index;
361811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].data_offset = 0;
361911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
362011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d\n", extra_idx);
362111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
362211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
362311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
362411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
362511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Registering [%d] fd=%d size=%d userptr=%lu", index,
362611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                pmem_tmp->fd, plane[0].length, plane[0].m.userptr);
362711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
362811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
362911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc)
363011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed");
363111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == PORT_INDEX_OUT) {
363211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        extra_idx = EXTRADATA_IDX(num_output_planes);
363311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
363411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if ((num_output_planes > 1) && (extra_idx)) {
3635b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            rc = allocate_extradata(&output_extradata_info, 0);
363611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
363711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
363811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to allocate extradata: %d", rc);
363911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
364011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
364111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.index = index;
364211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
364311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.memory = V4L2_MEMORY_USERPTR;
364411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = pmem_tmp->size;
364511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)pmem_tmp->buffer;
364611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[0] = pmem_tmp->fd;
364711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].reserved[1] = 0;
364811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = pmem_tmp->offset;
364911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.m.planes = plane;
365011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.length = num_output_planes;
365111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
365211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
365311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].length = output_extradata_info.buffer_size;
365411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].m.userptr = (unsigned long) (output_extradata_info.uaddr + index * output_extradata_info.buffer_size);
365511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
365611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[0] = output_extradata_info.ion.fd_ion_data.fd;
365711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
365811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].reserved[1] = output_extradata_info.buffer_size * index;
365911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[extra_idx].data_offset = 0;
366011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if  (extra_idx >= VIDEO_MAX_PLANES) {
366111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Extradata index is more than allowed: %d", extra_idx);
366211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return OMX_ErrorBadParameter;
366311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
366411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
366511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
366611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
366711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc)
366811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed");
366911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
367011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: venc_use_buf:Invalid Port Index ");
367111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
367211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
367311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
367411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
367511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
367611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
367711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_free_buf(void *buf_addr, unsigned port)
367811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
367911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem *pmem_tmp;
368011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_bufferpayload dev_buffer;
368111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&dev_buffer, 0, sizeof(dev_buffer));
368311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pmem_tmp = (struct pmem *)buf_addr;
368411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
368511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (port == PORT_INDEX_IN) {
368611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
368711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.fd  = pmem_tmp->fd;
368811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.maped_size = pmem_tmp->size;
368911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.sz = pmem_tmp->size;
369011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.offset = pmem_tmp->offset;
369111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %p,fd = %x, offset = %d, maped_size = %d", \
369211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.pbuffer, \
369311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.fd, \
369411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.offset, \
369511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.maped_size);
369611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
369711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (port == PORT_INDEX_OUT) {
369811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.pbuffer = (OMX_U8 *)pmem_tmp->buffer;
369911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.fd  = pmem_tmp->fd;
370011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.sz = pmem_tmp->size;
370111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.maped_size = pmem_tmp->size;
370211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dev_buffer.offset = pmem_tmp->offset;
370311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
370411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("venc_free_buf:pbuffer = %p,fd = %x, offset = %d, maped_size = %d", \
370511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.pbuffer, \
370611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.fd, \
370711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.offset, \
370811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dev_buffer.maped_size);
370911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
371011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: venc_free_buf:Invalid Port Index ");
371111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
371211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
371311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
371411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
371511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
371611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
371711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_color_align(OMX_BUFFERHEADERTYPE *buffer,
371811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 width, OMX_U32 height)
371911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
372011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 y_stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, width),
372111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            y_scanlines = VENUS_Y_SCANLINES(COLOR_FMT_NV12, height),
372211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_stride = VENUS_UV_STRIDE(COLOR_FMT_NV12, width),
372311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            uv_scanlines = VENUS_UV_SCANLINES(COLOR_FMT_NV12, height),
372411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            src_chroma_offset = width * height;
372511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
372611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer->nAllocLen >= VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height)) {
372711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8* src_buf = buffer->pBuffer, *dst_buf = buffer->pBuffer;
372811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Do chroma first, so that we can convert it in-place
372911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        src_buf += width * height;
373011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dst_buf += y_stride * y_scanlines;
373111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (int line = height / 2 - 1; line >= 0; --line) {
373211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memmove(dst_buf + line * uv_stride,
373311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    src_buf + line * width,
373411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    width);
373511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
373611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
373711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dst_buf = src_buf = buffer->pBuffer;
373811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //Copy the Y next
373911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (int line = height - 1; line > 0; --line) {
374011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memmove(dst_buf + line * y_stride,
374111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    src_buf + line * width,
374211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    width);
374311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
374411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
374511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to align Chroma. from %u to %u : \
374611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                Insufficient bufferLen=%u v/s Required=%u",
374711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)(width*height), (unsigned int)src_chroma_offset, (unsigned int)buffer->nAllocLen,
374811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                VENUS_BUFFER_SIZE(COLOR_FMT_NV12, width, height));
374911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
375011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
375111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
375211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
375311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
375411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
375511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_performance_level(OMX_U32 *perflevel)
375611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
375711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!perflevel) {
375811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Null pointer error");
375911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
376011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
376111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *perflevel = performance_level.perflevel;
376211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
376311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
376411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
376511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
376611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_vui_timing_info(OMX_U32 *enabled)
376711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
376811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
376911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Null pointer error");
377011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
377111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
377211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *enabled = vui_timing_info.enabled;
377311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
377411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
377511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
377611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
377711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_vqzip_sei_info(OMX_U32 *enabled)
377811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
377911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!enabled) {
378011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Null pointer error");
378111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
378211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
378311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *enabled = vqzip_sei_info.enabled;
378411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
378511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
378611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
378711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
378811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_peak_bitrate(OMX_U32 *peakbitrate)
378911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
379011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!peakbitrate) {
379111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Null pointer error");
379211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
379311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
379411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *peakbitrate = peak_bitrate.peakbitrate;
379511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
379611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
379711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
379811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
379911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_batch_size(OMX_U32 *size)
380011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
380111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!size) {
380211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Null pointer error");
380311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
380411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
380511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *size = mBatchSize;
380611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
380711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
380811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
380911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
381011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_empty_buf(void *buffer, void *pmem_data_buf, unsigned index, unsigned fd)
381111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
381211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem *temp_buffer;
381311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
381411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
381511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
381611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0, extra_idx;
381711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct OMX_BUFFERHEADERTYPE *bufhdr;
381811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    LEGACY_CAM_METADATA_TYPE * meta_buf = NULL;
381911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    temp_buffer = (struct pmem *)buffer;
382011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
382111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&buf, 0, sizeof(buf));
382211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset (&plane, 0, sizeof(plane));
382311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
382411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL) {
382511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: venc_etb: buffer is NULL");
382611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
382711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
382811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
382911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
383011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
383111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = m_sInput_buff_property.actualcount;
383211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
383311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Input buffer length %u, Timestamp = %lld", (unsigned int)bufhdr->nFilledLen, bufhdr->nTimeStamp);
383511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
383611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_data_buf) {
383711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("\n Internal PMEM addr for i/p Heap UseBuf: %p", pmem_data_buf);
383811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)pmem_data_buf;
383911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].data_offset = bufhdr->nOffset;
384011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].length = bufhdr->nAllocLen;
384111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].bytesused = bufhdr->nFilledLen;
384211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
384311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // --------------------------------------------------------------------------------------
384411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // [Usage]             [metadatamode] [Type]        [color_format] [Where is buffer info]
384511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // ---------------------------------------------------------------------------------------
384611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Camera-2              1            CameraSource   0              meta-handle
384711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Camera-3              1            GrallocSource  0              gralloc-private-handle
384811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // surface encode (RBG)  1            GrallocSource  1              bufhdr (color-converted)
384911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // CPU (Eg: MediaCodec)  0            --             0              bufhdr
385011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // ---------------------------------------------------------------------------------------
385111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (metadatamode) {
385211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].m.userptr = index;
385311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            meta_buf = (LEGACY_CAM_METADATA_TYPE *)bufhdr->pBuffer;
385411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
385511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!meta_buf) {
385611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                //empty EOS buffer
385711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!bufhdr->nFilledLen && (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)) {
385811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].data_offset = bufhdr->nOffset;
385911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].length = bufhdr->nAllocLen;
386011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].bytesused = bufhdr->nFilledLen;
386111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("venc_empty_buf: empty EOS buffer");
386211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else {
386311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
386411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
386511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else if (!color_format) {
386611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
386711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (meta_buf->buffer_type == LEGACY_CAM_SOURCE) {
386811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    native_handle_t *hnd = (native_handle_t*)meta_buf->meta_handle;
386911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!hnd) {
387011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("ERROR: venc_etb: handle is NULL");
387111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
387211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
3873a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    int usage = 0;
3874a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    usage = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_USAGE);
3875a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    usage = usage > 0 ? usage : 0;
3876a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
3877a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    if ((usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR)
3878a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                            && (is_csc_enabled)) {
3879a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                        buf.flags |= V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP;
3880a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    }
388111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
388211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!streaming[OUTPUT_PORT] && !(m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGB32 ||
388311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        m_sVenc_cfg.inputformat == V4L2_PIX_FMT_RGBA8888_UBWC)) {
3884a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
3885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        struct v4l2_format fmt;
388611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        OMX_COLOR_FORMATTYPE color_format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
3887fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3888b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        color_format = (OMX_COLOR_FORMATTYPE)MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_COLORFORMAT);
388911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        memset(&fmt, 0, sizeof(fmt));
3891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if (usage & private_handle_t::PRIV_FLAGS_ITU_R_709 ||
3892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                usage & private_handle_t::PRIV_FLAGS_ITU_R_601) {
3893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_ERROR("Camera buffer color format is not 601_FR.");
3894fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_ERROR(" This leads to unknown color space");
3895fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
3896fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if (usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR) {
3897fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            if (is_csc_enabled) {
3898a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                struct v4l2_control control;
3899a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC;
3900a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                control.value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE;
3901a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
3902a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                    DEBUG_PRINT_ERROR("venc_empty_buf: Failed to set VPE CSC for 601_to_709");
3903a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                } else {
3904a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                    DEBUG_PRINT_INFO("venc_empty_buf: Will convert 601-FR to 709");
3905a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                    fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709;
3906a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                    venc_set_colorspace(MSM_VIDC_BT709_5, 1,
3907a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                            MSM_VIDC_TRANSFER_BT709_5, MSM_VIDC_MATRIX_BT_709_5);
3908a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                                }
3909fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            } else {
3910fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                venc_set_colorspace(MSM_VIDC_BT601_6_525, 1,
3911fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                        MSM_VIDC_TRANSFER_601_6_525, MSM_VIDC_MATRIX_601_6_525);
3912fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
3913fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            }
3914fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
3915fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
3916fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
3917fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
3918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
3919fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if (usage & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) {
3920fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12_UBWC;
3921fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
3922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3923b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        if (color_format > 0 && !venc_set_color_format(color_format)) {
392411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Failed setting color format in Camerasource %lx", m_sVenc_cfg.inputformat);
392511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
392611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
392711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
392811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
392911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed");
393011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
393111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
393211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
393311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
393411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // Setting batch mode is sticky. We do not expect camera to change
393511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    // between batch and normal modes at runtime.
393611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (mBatchSize) {
3937b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        if ((unsigned int)MetaBufferUtil::getBatchSize(hnd) != mBatchSize) {
393811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Don't support dynamic batch sizes (changed from %d->%d)",
3939b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                                    mBatchSize, MetaBufferUtil::getBatchSize(hnd));
394011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
394111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
394211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
394311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return venc_empty_batch ((OMX_BUFFERHEADERTYPE*)buffer, index);
394411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
394511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3946b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    int offset = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_OFFSET);
3947b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    int length = MetaBufferUtil::getIntAt(hnd, 0, MetaBufferUtil::INT_SIZE);
3948b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    if (offset < 0 || length < 0) {
3949b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        DEBUG_PRINT_ERROR("Invalid meta buffer handle!");
3950b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                        return false;
395111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
3952b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    plane[0].data_offset = offset;
3953b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    plane[0].length = length;
3954b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    plane[0].bytesused = length;
395511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("venc_empty_buf: camera buf: fd = %d filled %d of %d flag 0x%x format 0x%lx",
395611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            fd, plane[0].bytesused, plane[0].length, buf.flags, m_sVenc_cfg.inputformat);
395711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                } else if (meta_buf->buffer_type == kMetadataBufferTypeGrallocSource) {
395811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    VideoGrallocMetadata *meta_buf = (VideoGrallocMetadata *)bufhdr->pBuffer;
395911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    private_handle_t *handle = (private_handle_t *)meta_buf->pHandle;
3960fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3961fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    if (!handle) {
3962fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        DEBUG_PRINT_ERROR("%s : handle is null!", __FUNCTION__);
3963fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        return false;
3964fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    }
3965fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
396611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (!streaming[OUTPUT_PORT]) {
3967fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        int color_space = 0;
3968fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        // Moment of truth... actual colorspace is known here..
3969fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        ColorSpace_t colorSpace = ITU_R_601;
3970fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if (getMetaData(handle, GET_COLOR_SPACE, &colorSpace) == 0) {
3971fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_INFO("ENC_CONFIG: gralloc ColorSpace = %d (601=%d 601_FR=%d 709=%d)",
3972fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    colorSpace, ITU_R_601, ITU_R_601_FR, ITU_R_709);
3973fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
3974fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
397511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        struct v4l2_format fmt;
397611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        memset(&fmt, 0, sizeof(fmt));
397711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
3978fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3979fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        bool isUBWC = (handle->flags & private_handle_t::PRIV_FLAGS_UBWC_ALIGNED) && is_gralloc_source_ubwc;
398011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (handle->format == HAL_PIXEL_FORMAT_NV12_ENCODEABLE) {
3981fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            m_sVenc_cfg.inputformat = isUBWC ? V4L2_PIX_FMT_NV12_UBWC : V4L2_PIX_FMT_NV12;
3982fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = NV12 %s", isUBWC ? "UBWC" : "Linear");
398311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        } else if (handle->format == HAL_PIXEL_FORMAT_RGBA_8888) {
3984fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            // In case of RGB, conversion to YUV is handled within encoder.
3985fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            // Disregard the Colorspace in gralloc-handle in case of RGB and use
3986fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            //   [a] 601 for non-UBWC case : C2D output is (apparently) 601-LR
3987fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            //   [b] 601 for UBWC case     : Venus can convert to 601-LR or FR. use LR for now.
3988fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            colorSpace = ITU_R_601;
3989fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            m_sVenc_cfg.inputformat = isUBWC ? V4L2_PIX_FMT_RGBA8888_UBWC : V4L2_PIX_FMT_RGB32;
3990fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = RGBA8888 %s", isUBWC ? "UBWC" : "Linear");
3991fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        } else if (handle->format == QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m) {
3992fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
3993fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            DEBUG_PRINT_INFO("ENC_CONFIG: Input Color = NV12 Linear");
3994fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
3995fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
3996fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        // If device recommendation (persist.vidc.enc.csc.enable) is to use 709, force CSC
3997fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        if (colorSpace == ITU_R_601_FR && is_csc_enabled) {
3998fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            struct v4l2_control control;
3999fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC;
4000fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            control.value = V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_ENABLE;
4001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
4002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                DEBUG_PRINT_ERROR("venc_empty_buf: Failed to set VPE CSC for 601_to_709");
400311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            } else {
4004fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                DEBUG_PRINT_INFO("venc_empty_buf: Will convert 601-FR to 709");
4005fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                buf.flags = V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP;
4006fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                colorSpace = ITU_R_709;
400711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            }
400811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
4009fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4010fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        msm_vidc_h264_color_primaries_values primary;
4011fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        msm_vidc_h264_transfer_chars_values transfer;
4012fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        msm_vidc_h264_matrix_coeff_values matrix;
4013fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        OMX_U32 range;
4014fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4015fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        switch (colorSpace) {
4016fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            case ITU_R_601_FR:
4017fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            {
4018fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                primary = MSM_VIDC_BT601_6_525;
4019fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                range = 1; // full
4020fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                transfer = MSM_VIDC_TRANSFER_601_6_525;
4021fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                matrix = MSM_VIDC_MATRIX_601_6_525;
4022fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
4024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                break;
4025fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            }
4026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            case ITU_R_709:
4027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            {
4028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                primary = MSM_VIDC_BT709_5;
4029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                range = 0; // limited
4030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                transfer = MSM_VIDC_TRANSFER_BT709_5;
4031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                matrix = MSM_VIDC_MATRIX_BT_709_5;
4032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709;
4034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                break;
4035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            }
4036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            default:
4037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            {
4038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                // 601 or something else ? assume 601
4039fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                primary = MSM_VIDC_BT601_6_625;
4040fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                range = 0; //limited
4041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                transfer = MSM_VIDC_TRANSFER_601_6_625;
4042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                matrix = MSM_VIDC_MATRIX_601_6_625;
4043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_470_SYSTEM_BG;
4045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                break;
4046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                            }
4047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        }
4048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        DEBUG_PRINT_INFO("ENC_CONFIG: selected ColorSpace = %d (601=%d 601_FR=%d 709=%d)",
4049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                    colorSpace, ITU_R_601, ITU_R_601_FR, ITU_R_709);
4050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                        venc_set_colorspace(primary, range, transfer, matrix);
4051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
405211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
405311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
405411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
405511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
405611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("Failed setting color format in Grallocsource %lx", m_sVenc_cfg.inputformat);
405711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
405811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
405911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        if(ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
406011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            DEBUG_PRINT_ERROR("VIDIOC_REQBUFS OUTPUT_MPLANE Failed");
406111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                            return false;
406211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        }
406311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
406411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
406511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fd = handle->fd;
406611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].data_offset = 0;
406711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].length = handle->size;
406811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    plane[0].bytesused = handle->size;
406911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_LOW("venc_empty_buf: Opaque camera buf: fd = %d "
407011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                ": filled %d of %d format 0x%lx", fd, plane[0].bytesused, plane[0].length, m_sVenc_cfg.inputformat);
407111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
407211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
407311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[0].m.userptr = (unsigned long) bufhdr->pBuffer;
407411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[0].data_offset = bufhdr->nOffset;
407511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[0].length = bufhdr->nAllocLen;
407611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                plane[0].bytesused = bufhdr->nFilledLen;
407711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("venc_empty_buf: Opaque non-camera buf: fd = %d filled %d of %d",
407811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        fd, plane[0].bytesused, plane[0].length);
407911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
408011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
408111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].m.userptr = (unsigned long) bufhdr->pBuffer;
408211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].data_offset = bufhdr->nOffset;
408311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].length = bufhdr->nAllocLen;
408411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            plane[0].bytesused = bufhdr->nFilledLen;
408511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("venc_empty_buf: non-camera buf: fd = %d filled %d of %d",
408611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    fd, plane[0].bytesused, plane[0].length);
408711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
408811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
408911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
409011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra_idx = EXTRADATA_IDX(num_input_planes);
409111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
409211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
40932601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        int extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev,fd);
409411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (extradata_index < 0 ) {
409511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", fd);
409611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return OMX_ErrorBadParameter;
409711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
409811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
409911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].bytesused = 0;
410011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].length = input_extradata_info.buffer_size;
410111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size);
410211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
410311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd;
410411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
410511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index;
4106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        plane[extra_idx].reserved[2] = input_extradata_info.size;
410711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].data_offset = 0;
410811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra_idx >= VIDEO_MAX_PLANES) {
410911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
411011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
411111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
411211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4113fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
4114b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if (!streaming[OUTPUT_PORT]) {
4115fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_pq.is_YUV_format_uncertain = false;
4116b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        if(venc_check_for_pq()) {
4117b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            /*
4118b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             * This is the place where all parameters for deciding
4119b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             * PQ enablement are available. Evaluate PQ for the final time.
4120b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel             */
4121b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            m_pq.reinit(m_sVenc_cfg.inputformat);
4122b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            venc_configure_pq();
4123b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        }
4124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
4126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
412711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = index;
412811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
412911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
413011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[0] = fd;
413111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[1] = 0;
413211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = plane;
413311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = num_input_planes;
4134a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    buf.timestamp.tv_sec = bufhdr->nTimeStamp / 1000000;
4135a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    buf.timestamp.tv_usec = (bufhdr->nTimeStamp % 1000000);
413611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4137a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (!handle_input_extradata(buf)) {
4138a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_ERROR("%s Failed to handle input extradata", __func__);
4139a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return false;
4140a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
4141b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    VIDC_TRACE_INT_LOW("ETB-TS", bufhdr->nTimeStamp / 1000);
4142b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
414311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
414411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf.flags |= V4L2_QCOM_BUF_FLAG_EOS;
414511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_debug.in_buffer_log) {
4147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        venc_input_log_buffers(bufhdr, fd, plane[0].data_offset, m_sVenc_cfg.inputformat);
4148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_debug.extradata_log && extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
4150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Extradata Addr 0x%llx, Buffer Addr = 0x%x", (OMX_U64)input_extradata_info.uaddr, (unsigned int)plane[extra_idx].m.userptr);
4151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        venc_extradata_log_buffers((char *)plane[extra_idx].m.userptr);
4152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
415311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
415411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
415511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
415611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf (etb) to driver");
415711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
415811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
415911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
416011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    etb++;
416111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
416211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!streaming[OUTPUT_PORT]) {
416311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type buf_type;
416411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
416511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret;
4166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
416711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
416811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
416911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
417011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call streamon");
417111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (errno == EBUSY) {
417211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hw_overload = true;
417311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
417411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
417511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
417611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            streaming[OUTPUT_PORT] = true;
417711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
417811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
417911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
418011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
418111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
418211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
418311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_empty_batch(OMX_BUFFERHEADERTYPE *bufhdr, unsigned index)
418411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
418511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
4186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
4187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    int rc = 0, extra_idx, numBufs;
418811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
418911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    LEGACY_CAM_METADATA_TYPE * meta_buf = NULL;
419011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    native_handle_t *hnd = NULL;
419111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
419211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufhdr == NULL) {
419311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s: buffer is NULL", __func__);
419411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
419511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
419611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
419711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
419811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (metadatamode) {
4199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        plane[0].m.userptr = index;
420011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        meta_buf = (LEGACY_CAM_METADATA_TYPE *)bufhdr->pBuffer;
420111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
420211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!color_format) {
420311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (meta_buf->buffer_type == LEGACY_CAM_SOURCE) {
420411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hnd = (native_handle_t*)meta_buf->meta_handle;
420511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (!hnd) {
420611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("venc_empty_batch: invalid handle !");
420711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
4208b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                } else if (MetaBufferUtil::getBatchSize(hnd) > kMaxBuffersInBatch) {
420911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("venc_empty_batch: Too many buffers (%d) in batch. "
4210b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                            "Max = %d", MetaBufferUtil::getBatchSize(hnd), kMaxBuffersInBatch);
421111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    status = false;
421211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
4213b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                DEBUG_PRINT_LOW("venc_empty_batch: Batch of %d bufs", MetaBufferUtil::getBatchSize(hnd));
421411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
421511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Batch supported for CameraSource buffers only !");
421611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
421711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
421811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
421911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Batch supported for Camera buffers only !");
422011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
422111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
422211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
422311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Batch supported for metabuffer mode only !");
422411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
422511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
422611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
422711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
422811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_TICKS bufTimeStamp = 0ll;
4229b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        int numBufs = MetaBufferUtil::getBatchSize(hnd);
423011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int v4l2Ids[kMaxBuffersInBatch] = {-1};
423111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (int i = 0; i < numBufs; ++i) {
423211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            v4l2Ids[i] = mBatchInfo.registerBuffer(index);
423311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (v4l2Ids[i] < 0) {
423411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to register buffer");
423511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                // TODO: cleanup the map and purge all slots of current index
423611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
423711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
423811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
423911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
424011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (int i = 0; i < numBufs; ++i) {
424111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            int v4l2Id = v4l2Ids[i];
4242a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            int usage = 0;
424311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
424411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&buf, 0, sizeof(buf));
424511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            memset(&plane, 0, sizeof(plane));
424611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
424711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Batch: registering %d as %d", index, v4l2Id);
424811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.index = (unsigned)v4l2Id;
424911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
425011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.memory = V4L2_MEMORY_USERPTR;
4251b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            plane[0].reserved[0] = MetaBufferUtil::getFdAt(hnd, i);
4252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            plane[0].reserved[1] = 0;
4253b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            plane[0].data_offset = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_OFFSET);
4254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            plane[0].m.userptr = (unsigned long)meta_buf;
4255b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            plane[0].length = plane[0].bytesused = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_SIZE);
4256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            buf.m.planes = plane;
4257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            buf.length = num_input_planes;
4258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4259a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            usage = MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_USAGE);
4260a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            usage = usage > 0 ? usage : 0;
4261a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
4262a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            if ((usage & private_handle_t::PRIV_FLAGS_ITU_R_601_FR)
4263a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                    && (is_csc_enabled)) {
4264a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel                buf.flags |= V4L2_MSM_BUF_FLAG_YUV_601_709_CLAMP;
4265a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            }
4266a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
4267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            extra_idx = EXTRADATA_IDX(num_input_planes);
4268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
4270fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                int fd = plane[0].reserved[0];
4271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                int extradata_index = venc_get_index_from_fd(input_extradata_info.m_ion_dev, fd);
4272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                if (extradata_index < 0) {
4273fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    DEBUG_PRINT_ERROR("Extradata index calculation went wrong for fd = %d", fd);
4274fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    return OMX_ErrorBadParameter;
4275fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                }
4276fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4277fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].bytesused = 0;
4278fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].length = input_extradata_info.buffer_size;
4279fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].m.userptr = (unsigned long) (input_extradata_info.uaddr + extradata_index * input_extradata_info.buffer_size);
4280fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].reserved[0] = input_extradata_info.ion.fd_ion_data.fd;
4281fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].reserved[1] = input_extradata_info.buffer_size * extradata_index;
4282fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].reserved[2] = input_extradata_info.size;
4283fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                plane[extra_idx].data_offset = 0;
4284fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            } else if (extra_idx >= VIDEO_MAX_PLANES) {
4285fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Extradata index higher than expected: %d\n", extra_idx);
4286fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return false;
4287fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
4288fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4289fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
4290b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            if (!streaming[OUTPUT_PORT]) {
4291fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                m_pq.is_YUV_format_uncertain = false;
4292b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                if(venc_check_for_pq()) {
4293b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    m_pq.reinit(m_sVenc_cfg.inputformat);
4294b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                    venc_configure_pq();
4295b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel                }
4296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
4297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
4298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
429911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(m_nDriver_fd, VIDIOC_PREPARE_BUF, &buf);
430011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc)
430111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("VIDIOC_PREPARE_BUF Failed");
430211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
430311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (bufhdr->nFlags & OMX_BUFFERFLAG_EOS)
430411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf.flags |= V4L2_QCOM_BUF_FLAG_EOS;
430511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (i != numBufs - 1) {
430611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                buf.flags |= V4L2_MSM_BUF_FLAG_DEFER;
430711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("for buffer %d (etb #%d) in batch of %d, marking as defer",
430811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        i, etb + 1, numBufs);
430911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
431011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
431111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            // timestamp differences from camera are in nano-seconds
4312b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            bufTimeStamp = bufhdr->nTimeStamp + MetaBufferUtil::getIntAt(hnd, i, MetaBufferUtil::INT_TIMESTAMP) / 1000;
431311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
431411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW(" Q Batch [%d of %d] : buf=%p fd=%d len=%d TS=%lld",
4315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                i, numBufs, bufhdr, plane[0].reserved[0], plane[0].length, bufTimeStamp);
431611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.timestamp.tv_sec = bufTimeStamp / 1000000;
431711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.timestamp.tv_usec = (bufTimeStamp % 1000000);
431811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            if (!handle_input_extradata(buf)) {
43202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                DEBUG_PRINT_ERROR("%s Failed to handle input extradata", __func__);
43212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                return false;
43222e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            }
4323b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel            VIDC_TRACE_INT_LOW("ETB-TS", bufTimeStamp / 1000);
4324b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
432511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
432611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (rc) {
432711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("%s: Failed to qbuf (etb) to driver", __func__);
432811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
432911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
433011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
433111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            etb++;
433211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
433311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
433411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
433511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status && !streaming[OUTPUT_PORT]) {
433611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        enum v4l2_buf_type buf_type;
433711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_type=V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
433811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int ret;
433911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = ioctl(m_nDriver_fd, VIDIOC_STREAMON, &buf_type);
434011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ret) {
434111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to call streamon");
434211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (errno == EBUSY) {
434311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hw_overload = true;
434411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
434511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
434611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
434711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            streaming[OUTPUT_PORT] = true;
434811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
434911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
435011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
435111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
435211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
435311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
435411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_fill_buf(void *buffer, void *pmem_data_buf,unsigned index,unsigned fd)
435511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
435611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct pmem *temp_buffer = NULL;
435711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_buffer  frameinfo;
435811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_buffer buf;
435911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_plane plane[VIDEO_MAX_PLANES];
436011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
436111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int extra_idx;
436211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct OMX_BUFFERHEADERTYPE *bufhdr;
436311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
436411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (buffer == NULL)
436511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
436611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
436711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufhdr = (OMX_BUFFERHEADERTYPE *)buffer;
436811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
436911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (pmem_data_buf) {
437011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Internal PMEM addr for o/p Heap UseBuf: %p", pmem_data_buf);
437111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)pmem_data_buf;
437211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
437311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Shared PMEM addr for o/p PMEM UseBuf/AllocateBuf: %p", bufhdr->pBuffer);
437411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[0].m.userptr = (unsigned long)bufhdr->pBuffer;
437511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
437611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
437711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&buf, 0, sizeof(buf));
437811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&plane, 0, sizeof(plane));
437911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
438011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.index = index;
438111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
438211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.memory = V4L2_MEMORY_USERPTR;
438311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].length = bufhdr->nAllocLen;
438411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].bytesused = bufhdr->nFilledLen;
438511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[0] = fd;
438611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].reserved[1] = 0;
438711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    plane[0].data_offset = bufhdr->nOffset;
438811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.m.planes = plane;
438911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.length = num_output_planes;
439011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    buf.flags = 0;
439111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
43922601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (venc_handle->is_secure_session()) {
4393a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        if (venc_handle->allocate_native_handle) {
4394a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            native_handle_t *handle_t = (native_handle_t *)(bufhdr->pBuffer);
4395a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            plane[0].length = handle_t->data[3];
4396a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        } else {
4397a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            output_metabuffer *meta_buf = (output_metabuffer *)(bufhdr->pBuffer);
4398a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            native_handle_t *handle_t = meta_buf->nh;
4399a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            plane[0].length = handle_t->data[3];
4400a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        }
44012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
44022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
440311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mBatchSize) {
440411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Should always mark first buffer as DEFER, since 0 % anything is 0, just offset by 1
440511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // This results in the first batch being of size mBatchSize + 1, but thats good because
440611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // we need an extra FTB for the codec specific data.
440711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
440811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!ftb || ftb % mBatchSize) {
440911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            buf.flags |= V4L2_MSM_BUF_FLAG_DEFER;
441011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("for ftb buffer %d marking as defer", ftb + 1);
441111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
441211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
441311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
441411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    extra_idx = EXTRADATA_IDX(num_output_planes);
441511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
441611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (extra_idx && (extra_idx < VIDEO_MAX_PLANES)) {
441711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].bytesused = 0;
441811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].length = output_extradata_info.buffer_size;
441911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].m.userptr = (unsigned long) (output_extradata_info.uaddr + index * output_extradata_info.buffer_size);
442011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef USE_ION
442111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[0] = output_extradata_info.ion.fd_ion_data.fd;
442211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
442311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].reserved[1] = output_extradata_info.buffer_size * index;
442411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        plane[extra_idx].data_offset = 0;
442511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (extra_idx >= VIDEO_MAX_PLANES) {
442611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Extradata index higher than expected: %d", extra_idx);
442711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
442811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
442911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
443011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_QBUF, &buf);
443111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
443211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
443311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to qbuf (ftb) to driver");
443411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
443511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
443611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
443711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ftb++;
443811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
443911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
444011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
444111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_inband_video_header(OMX_BOOL enable)
444211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
444311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
444411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
444511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_HEADER_MODE;
444611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(enable) {
444711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_I_FRAME;
444811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
444911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE;
445011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
445111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
445211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Set inband sps/pps: %d", enable);
445311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) {
445411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Request for inband sps/pps failed");
445511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
445611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
445711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
445811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
445911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
446011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_au_delimiter(OMX_BOOL enable)
446111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
446211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
446311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
446411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_AU_DELIMITER;
446511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(enable) {
446611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_ENABLED;
446711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
446811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_AU_DELIMITER_DISABLED;
446911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
447011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
447111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Set au delimiter: %d", enable);
447211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) {
447311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Request to set AU delimiter failed");
447411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
447511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
447611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
447711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
447811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
447911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_mbi_statistics_mode(OMX_U32 mode)
448011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
448111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
448211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
448311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_MBI_STATISTICS_MODE;
448411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = mode;
448511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
448611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Set MBI dumping mode: %d", mode);
448711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) {
448811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Setting MBI mode failed");
448911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
449011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
449111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
449211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
449311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
44942601808ee2992a94c325d05e4065aba60b01840bThierry Strudelint venc_dev::venc_get_index_from_fd(OMX_U32 ion_fd, OMX_U32 buffer_fd)
449511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
44962601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    unsigned int cookie = buffer_fd;
44972601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct ion_fd_data fdData;
44982601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
44992601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    memset(&fdData, 0, sizeof(fdData));
45002601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    fdData.fd = buffer_fd;
45012601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (ion_fd && !ioctl(ion_fd, ION_IOC_IMPORT, &fdData)) {
45022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        cookie = fdData.handle;
450342adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel        DEBUG_PRINT_HIGH("FD = %u imported handle = %u", fdData.fd, fdData.handle);
45042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
45052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
4506fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++) {
45072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        if (fd_list[i] == cookie) {
450811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FD is present at index = %d", i);
450942adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel            if (ion_fd && !ioctl(ion_fd, ION_IOC_FREE, &fdData.handle)) {
451042adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel                DEBUG_PRINT_HIGH("freed handle = %u", cookie);
451142adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel            }
451211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return i;
451311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
451411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
451542adfa335ea53084e6934b6dc9864f34e0833265Thierry Strudel
4516fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    for (unsigned int i = 0; i < (sizeof(fd_list)/sizeof(fd_list[0])); i++)
451711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (fd_list[i] == 0) {
451811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("FD added at index = %d", i);
45192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            fd_list[i] = cookie;
452011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return i;
45212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        }
452211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return -EINVAL;
452311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
452411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
452511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vqzip_sei_type(OMX_BOOL enable)
452611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
4527a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    struct v4l2_control sei_control = {0,0}, yuvstats_control = {0,0};
452811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
452911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Set VQZIP SEI: %d", enable);
453011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sei_control.id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI;
453111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    yuvstats_control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
453211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
453311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(enable) {
453411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sei_control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE;
4535a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        yuvstats_control.value = V4L2_MPEG_VIDC_EXTRADATA_YUV_STATS;
453611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
453711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sei_control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_DISABLE;
453811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
453911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
454011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &sei_control) < 0) {
454111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Non-Fatal: Request to set SEI failed");
454211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
454311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
454411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &yuvstats_control) < 0) {
454511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Non-Fatal: Request to set YUVSTATS failed");
454611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
454711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_
45482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    vqzip.pConfig.nWidth = m_sVenc_cfg.input_width;
45492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    vqzip.pConfig.nHeight = m_sVenc_cfg.input_height;
455011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vqzip.init();
455111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vqzip_sei_info.enabled = true;
455211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
455311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
455411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
455511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
455611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
455711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode)
455811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
455911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Check for layers in Hier-p/hier-B with Hier-P-Hybrid
456011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (layers && (mode == HIER_P || mode == HIER_B) && hier_layers.hier_mode == HIER_P_HYBRID)
456111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
456211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
456311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Check for bframes with Hier-P-Hybrid
456411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bFrames && hier_layers.hier_mode == HIER_P_HYBRID)
456511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
456611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
456711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Check for Hier-P-Hybrid with bframes/LTR/hier-p/Hier-B
456811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (layers && mode == HIER_P_HYBRID && (intra_period.num_bframes || hier_layers.hier_mode == HIER_P ||
456911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel           hier_layers.hier_mode == HIER_B || ltrinfo.count))
457011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
457111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Check for LTR with Hier-P-Hybrid
457311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (count && hier_layers.hier_mode == HIER_P_HYBRID)
457411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
457511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
457711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
457811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
457911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hier_layers(QOMX_VIDEO_HIERARCHICALCODINGTYPE type,
458011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                    OMX_U32 num_layers)
458111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
458211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
458311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_validate_hybridhp_params(num_layers, 0, 0, (int)type)){
458511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, Hier-pLayers enabled with HybridHP");
458611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
458711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
458811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
458911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (type == QOMX_HIERARCHICALCODING_P) {
459011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // Reduce layer count by 1 before sending to driver. This avoids
459111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        // driver doing the same in multiple places.
459211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS;
459311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = num_layers - 1;
459411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set MAX Hier P num layers: %u", (unsigned int)num_layers);
459511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
459611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Request to set MAX Hier P num layers failed");
459711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
459811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
459911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS;
460011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = num_layers - 1;
460111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set Hier P num layers: %u", (unsigned int)num_layers);
460211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
460311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Request to set Hier P num layers failed");
460411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
460511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
460611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
460711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Set H264_SVC_NAL");
460811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC;
460911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED;
461011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
461111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Failed to enable SVC_NAL");
461211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
461311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
461411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
461511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hier_layers.hier_mode = HIER_P;
461611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (type == QOMX_HIERARCHICALCODING_B) {
461711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) {
461811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed : Hier B layers supported only for HEVC encode");
461911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
462011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
462111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_B_NUM_LAYERS;
462211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = num_layers - 1;
462311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_INFO("Set Hier B num layers: %u", (unsigned int)num_layers);
462411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
462511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Request to set Hier P num layers failed");
462611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
462711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
462811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hier_layers.hier_mode = HIER_B;
462911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
463011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Request to set hier num layers failed for type: %d", type);
463111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
463211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
463311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hier_layers.numlayers = num_layers;
463411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
463511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
463611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
463711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_extradata(OMX_U32 extra_data, OMX_BOOL enable)
463811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
463911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
464011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
464111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("venc_set_extradata:: %x", (int) extra_data);
464211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
464311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable == OMX_FALSE) {
464411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* No easy way to turn off extradata to the driver
464511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * at the moment */
464611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
464711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
464811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
464911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_EXTRADATA;
465011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (extra_data) {
465111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataVideoEncoderSliceInfo:
465211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_MULTISLICE_INFO;
465311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
465411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataVideoEncoderMBInfo:
465511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_METADATA_MBI;
465611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
465711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_ExtraDataFrameDimension:
465811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_INPUT_CROP;
465911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
4660fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case OMX_ExtraDataEncoderOverrideQPInfo:
4661fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_PQ_INFO;
4662fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
46632e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        case OMX_ExtraDataVideoLTRInfo:
46642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            control.value = V4L2_MPEG_VIDC_EXTRADATA_LTR;
46652e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel            break;
466611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
466711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unrecognized extradata index 0x%x", (unsigned int)extra_data);
466811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
466911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
467011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
467111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
467211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Request for setting extradata (%x) failed %d",
467311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (unsigned int)extra_data, errno);
467411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
467511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
467611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
467711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
467811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
467911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
468011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_slice_delivery_mode(OMX_U32 enable)
468111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
468211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
468311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
468411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable) {
468511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_DELIVERY_MODE;
468611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
468711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Set slice_delivery_mode: %d", control.value);
468811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
468911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (multislice.mslice_mode == V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
469011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
469111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_ERROR("Request for setting slice delivery mode failed");
469211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
469311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
469411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("Successfully set Slice delivery mode id: %d, value=%d", control.id, control.value);
469511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                slice_mode.enable = 1;
469611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
469711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
469811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set slice delivery mode, slice_mode [%lu] "
469911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    "is not MB BASED or [%lu] is not H264 codec ", multislice.mslice_mode,
470011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    m_sVenc_cfg.codectype);
470111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
470211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
470311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Slice_DELIVERY_MODE not enabled");
470411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
470511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
470611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
470711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
470811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
470911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_enable_initial_qp(QOMX_EXTNINDEX_VIDEO_INITIALQP* initqp)
471011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
471111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
471211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
471311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[4];
471411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
471511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
471611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP;
471711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].value = initqp->nQpI;
471811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP;
471911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = initqp->nQpP;
472011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_B_FRAME_QP;
472111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[2].value = initqp->nQpB;
472211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_ENABLE_INITIAL_QP;
472311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[3].value = initqp->bEnableInitQp;
472411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
472511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 4;
472611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
472711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
472811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
472911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x val=%d, id=%x val=%d, id=%x val=%d, id=%x val=%d",
473011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
473111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value,
473211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[2].id, controls.controls[2].value,
473311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[3].id, controls.controls[3].value);
473411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
473511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls);
473611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
473711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set session_qp %d", rc);
473811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
473911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
474011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
474111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_qp.iframeqp = initqp->nQpI;
474211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_qp.pframeqp = initqp->nQpP;
474311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_qp.bframeqp = initqp->nQpB;
474411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    init_qp.enableinitqp = initqp->bEnableInitQp;
474511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
474611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x val=%d, id=%x val=%d, id=%x val=%d, id=%x val=%d",
474711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
474811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value,
474911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[2].id, controls.controls[2].value,
475011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[3].id, controls.controls[3].value);
475111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
475211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
475311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4754fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_set_colorspace(OMX_U32 primaries, OMX_U32 range,
4755fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 transfer_chars, OMX_U32 matrix_coeffs)
4756fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
4757fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    int rc;
4758fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    struct v4l2_control control;
4759fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4760fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Setting color space : Primaries = %d, Range = %d, Trans = %d, Matrix = %d",
4761fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        primaries, range, transfer_chars, matrix_coeffs);
4762fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4763fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE;
4764fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.value = primaries;
4765fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4766fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
4767fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
4768fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4769fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (rc) {
4770fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_COLOR_SPACE");
4771fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
4772fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4773fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4774fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
4775fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4776fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    color_space.primaries = control.value;
4777fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4778fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE;
4779fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.value = range;
4780fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4781fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
4782fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
4783fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4784fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (rc) {
4785fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_FULL_RANGE");
4786fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
4787fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4788fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4789fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
4790fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4791fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    color_space.range = control.value;
4792fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4793fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS;
4794fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.value = transfer_chars;
4795fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4796fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
4797fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
4798fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4799fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (rc) {
4800fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_TRANSFER_CHARS");
4801fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
4802fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4803fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4804fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
4805fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4806fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    color_space.transfer_chars = control.value;
4807fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4808fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS;
4809fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.value = matrix_coeffs;
4810fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4811fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
4812fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
4813fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4814fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (rc) {
4815fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Failed to set control : V4L2_CID_MPEG_VIDC_VIDEO_MATRIX_COEFFS");
4816fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
4817fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
4818fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4819fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
4820fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4821fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    color_space.matrix_coeffs = control.value;
4822fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
4823fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return true;
4824fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
4825fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
482611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp)
482711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
482811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
482911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
483011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
483111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP;
483211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = i_frame_qp;
483311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
483411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
483511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
483611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
483711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
483811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
483911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
484011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
484111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
484211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
484311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    session_qp.iframeqp = control.value;
484411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
484511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP;
484611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = p_frame_qp;
484711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
484811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
484911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
485011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
485111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
485211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
485311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
485411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
485511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
485611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
485711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
485811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    session_qp.pframeqp = control.value;
485911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
486011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) ||
486111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile == V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
486211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
486311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
486411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = b_frame_qp;
486511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
486611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
486711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
486811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
486911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
487011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
487111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
487211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
487311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
487411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
487511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
487611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp.bframeqp = control.value;
487711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
487811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
487911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
488011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
488111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
488211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_session_qp_range(OMX_U32 min_qp, OMX_U32 max_qp)
488311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
488411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
488511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
488611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
488711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((min_qp >= session_qp_range.minqp) && (max_qp <= session_qp_range.maxqp)) {
488811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
488911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)
489011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MIN_QP;
489111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
489211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_MIN_QP;
489311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = min_qp;
489411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
489511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set MIN_QP control id=%d, val=%d",
489611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id, control.value);
489711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
489811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
489911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
490011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
490111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
490211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
490311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)
490411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_MAX_QP;
490511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        else
490611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_MAX_QP;
490711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = max_qp;
490811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
490911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set MAX_QP control id=%d, val=%d",
491011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.id, control.value);
491111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
491211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
491311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
491411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
491511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
491611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
491711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Wrong qp values[%u %u], allowed range[%u %u]",
491811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)min_qp, (unsigned int)max_qp, (unsigned int)session_qp_range.minqp, (unsigned int)session_qp_range.maxqp);
491911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
492011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
492111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
492211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
492311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
49242601808ee2992a94c325d05e4065aba60b01840bThierry Strudelbool venc_dev::venc_set_session_qp_range_packed(OMX_U32 min_qp, OMX_U32 max_qp)
49252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel{
49262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    int rc;
49272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_control control;
49282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
49292601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_MIN_QP_PACKED;
49302601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    control.value = min_qp;
49312601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
49322601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set MIN_QP_PACKED control id=%d, val=%d",
49332601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            control.id, control.value);
49342601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
49352601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (rc) {
49362601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
49372601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        return false;
49382601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
49392601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
49402601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_MAX_QP_PACKED;
49412601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    control.value = max_qp;
49422601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
49432601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set MAX_QP_PACKED control id=%d, val=%d",
49442601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            control.id, control.value);
49452601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
49462601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (rc) {
49472601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
49482601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        return false;
49492601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
49502601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
49512601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    return true;
49522601808ee2992a94c325d05e4065aba60b01840bThierry Strudel}
49532601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
495411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel)
495511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
495611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_profile requested_profile = {0};
495711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct ven_profilelevel requested_level = {0};
495811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long mb_per_frame = 0;
495911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_profile_level:: eProfile = %u, Level = %u",
496011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)eProfile, (unsigned int)eLevel);
496111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mb_per_frame = ((m_sVenc_cfg.dvs_height + 15) >> 4)*
496211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ((m_sVenc_cfg.dvs_width + 15) >> 4);
496311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
496411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((eProfile == 0) && (eLevel == 0) && m_profile_set && m_level_set) {
496511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Profile/Level setting complete before venc_start");
496611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
496711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
496811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
496911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Validating Profile/Level from table");
497011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
497111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_validate_profile_level(&eProfile, &eLevel)) {
497211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ERROR: Profile/Level validation failed");
497311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
497411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
497511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
497611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
497711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("eProfile = %u, OMX_VIDEO_MPEG4ProfileSimple = %d and "
497811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "OMX_VIDEO_MPEG4ProfileAdvancedSimple = %d", (unsigned int)eProfile,
497911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4ProfileAdvancedSimple);
498011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
498111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
498211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE;
498311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
498411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE;
498511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
498611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("ERROR: Unsupported MPEG4 profile = %u",
498711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    (unsigned int)eProfile);
498811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
498911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
499011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
499111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("eLevel = %u, OMX_VIDEO_MPEG4Level0 = %d, OMX_VIDEO_MPEG4Level1 = %d,"
499211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "OMX_VIDEO_MPEG4Level2 = %d, OMX_VIDEO_MPEG4Level3 = %d, OMX_VIDEO_MPEG4Level4 = %d,"
499311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "OMX_VIDEO_MPEG4Level5 = %d", (unsigned int)eLevel, OMX_VIDEO_MPEG4Level0, OMX_VIDEO_MPEG4Level1,
499411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                OMX_VIDEO_MPEG4Level2, OMX_VIDEO_MPEG4Level3, OMX_VIDEO_MPEG4Level4, OMX_VIDEO_MPEG4Level5);
499511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
499611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mb_per_frame >= 3600) {
499711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
499811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
499911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
500011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (requested_profile.profile == V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
500111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
500211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
500311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (eLevel) {
500411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level0:
500511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0;
500611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
500711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level0b:
500811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B;
500911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
501011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level1:
501111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_1;
501211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
501311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level2:
501411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_2;
501511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
501611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level3:
501711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_3;
501811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
501911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level4a:
502011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_4;
502111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
502211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case OMX_VIDEO_MPEG4Level5:
502369b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                case OMX_VIDEO_MPEG4LevelMax:
502469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel                default: //Set max level possible as default so that invalid levels are non-fatal
502511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
502611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
502711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
502811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
502911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
503011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
503111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (eProfile) {
503211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileBaseline:
503311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BASELINE;
503411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
503511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileH320Coding:
503611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_H320CODING;
503711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
503811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileBackwardCompatible:
503911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_BACKWARDCOMPATIBLE;
504011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
504111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileISWV2:
504211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV2;
504311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
504411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileISWV3:
504511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_ISWV3;
504611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
504711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileHighCompression:
504811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHCOMPRESSION;
504911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
505011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileInternet:
505111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERNET;
505211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
505311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileInterlace:
505411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_INTERLACE;
505511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
505611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263ProfileHighLatency:
505711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_H263_PROFILE_HIGHLATENCY;
505811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
505911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
506011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                DEBUG_PRINT_LOW("ERROR: Unsupported H.263 profile = %lu",
506111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        requested_profile.profile);
506211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                return false;
506311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
506411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
506511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //profile level
506611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (eLevel) {
506711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level10:
506811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_1_0;
506911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
507011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level20:
507111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_2_0;
507211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
507311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level30:
507411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_3_0;
507511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
507611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level40:
507711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_0;
507811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
507911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level45:
508011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_4_5;
508111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
508211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level50:
508311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_5_0;
508411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
508511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level60:
508611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_6_0;
508711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
508811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_H263Level70:
508969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            case OMX_VIDEO_H263LevelMax:
509069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            default: //Set max level possible as default so that invalid levels are non-fatal
509111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_H263_LEVEL_7_0;
509211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
509311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
509411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
509511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eProfile == OMX_VIDEO_AVCProfileBaseline) {
509611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE;
509711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(eProfile == QOMX_VIDEO_AVCProfileConstrainedBaseline) {
509811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE;
509911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(eProfile == QOMX_VIDEO_AVCProfileConstrainedHigh) {
510011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH;
510111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileMain) {
510211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN;
510311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileExtended) {
510411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED;
510511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileHigh) {
510611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH;
510711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileHigh10) {
510811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10;
510911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileHigh422) {
511011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422;
511111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (eProfile == OMX_VIDEO_AVCProfileHigh444) {
511211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE;
511311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
511411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("ERROR: Unsupported H.264 profile = %lu",
511511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_profile.profile);
511611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
511711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
511811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
511911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //profile level
512011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (eLevel) {
512111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel1:
512211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
512311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
512411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel1b:
512511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1B;
512611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
512711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel11:
512811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
512911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
513011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel12:
513111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_2;
513211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
513311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel13:
513411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_1_3;
513511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
513611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel2:
513711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_0;
513811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
513911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel21:
514011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
514111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
514211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel22:
514311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
514411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
514511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel3:
514611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_0;
514711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
514811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel31:
514911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
515011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
515111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel32:
515211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
515311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
515411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel4:
515511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
515611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
515711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel41:
515811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
515911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
516011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel42:
516111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
516211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
516311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel5:
516411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
516511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
516611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel51:
516711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
516811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
516911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevel52:
517011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_AVCLevelMax:
517169b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            default: //Set max level possible as default so that invalid levels are non-fatal
517211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDEO_H264_LEVEL_5_2;
517311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
517411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
517511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
517611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!(eProfile == OMX_VIDEO_VP8ProfileMain)) {
517711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Unsupported VP8 profile = %u",
517811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        (unsigned int)eProfile);
517911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
518011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
518111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED;
518211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_profile_set = true;
518311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch(eLevel) {
518411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_VP8Level_Version0:
518511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0;
518611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
518711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_VP8Level_Version1:
518869b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            case OMX_VIDEO_VP8LevelMax:
518969b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            default: //Set max level possible as default so that invalid levels are non-fatal
519011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1;
519111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
519211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
519311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }  else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
519411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (eProfile == OMX_VIDEO_HEVCProfileMain) {
519511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN;
519611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if(eProfile == OMX_VIDEO_HEVCProfileMain10) {
519711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            requested_profile.profile = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10;
519811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
519911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("ERROR: Unsupported HEVC profile = %lu",
520011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    requested_profile.profile);
520111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
520211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
520311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
520411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //profile level
520511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (eLevel) {
520611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel1:
520711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1;
520811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
520911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel1:
521011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1;
521111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
521211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel2:
521311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2;
521411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
521511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel2:
521611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2;
521711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
521811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel21:
521911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1;
522011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
522111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel21:
522211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1;
522311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
522411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel3:
522511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3;
522611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
522711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel3:
522811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3;
522911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
523011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel31:
523111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1;
523211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
523311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel31:
523411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1;
523511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
523611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel4:
523711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4;
523811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
523911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel4:
524011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4;
524111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
524211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel41:
524311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1;
524411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
524511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel41:
524611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1;
524711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
524811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel5:
524911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5;
525011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
525111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel5:
525211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5;
525311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
525411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel51:
525511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1;
525611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
525711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel51:
525811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1;
525911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
526011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel52:
526111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_2;
526211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
526311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel52:
526411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2;
526511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
526611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel6:
526711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6;
526811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
526911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel6:
527011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6;
527111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
527211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCMainTierLevel61:
527311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_1;
527411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
527511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case OMX_VIDEO_HEVCHighTierLevel61:
527669b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            case OMX_VIDEO_HEVCLevelMax:
527769b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel            default: //Set max level possible as default so that invalid levels are non-fatal
527811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                requested_level.level = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_1;
527911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
528011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
528111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
528211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_profile_set) {
528411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
528511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
528611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
528711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
528811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
528911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
529011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
529111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
529211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_PROFILE;
529311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
529411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE;
529511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
529611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Wrong CODEC");
529711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
529811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
529911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = requested_profile.profile;
530111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
530311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
530411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
530511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
530611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
530711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
530811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
530911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
531111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        codec_profile.profile = control.value;
531311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_profile_set = true;
531411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
531511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
531611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!m_level_set) {
531711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
531811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
531911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
532011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
532111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
532211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
532311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
532411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
532511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_H263_LEVEL;
532611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
532711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL;
532811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
532911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL;
533011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
533111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Wrong CODEC");
533211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
533311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
533411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
533511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = requested_level.level;
533611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
533711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
533811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
533911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
534011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
534111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
534211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
534311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
534411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
534511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
534611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
534711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level.level = control.value;
534811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_level_set = true;
534911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
535011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
535211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
535311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_voptiming_cfg( OMX_U32 TimeIncRes)
535511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
535611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_voptimingcfg vop_timing_cfg;
535811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
535911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_voptiming_cfg: TimeRes = %u",
536011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)TimeIncRes);
536111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vop_timing_cfg.voptime_resolution = TimeIncRes;
536311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    voptimecfg.voptime_resolution = vop_timing_cfg.voptime_resolution;
536511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
536611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
536711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
536811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames)
536911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
537011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
537111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_intra_period: nPFrames = %u, nBFrames: %u", (unsigned int)nPFrames, (unsigned int)nBFrames);
537211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
537311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
537411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int pframe = 0, bframe = 0;
537511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    char property_value[PROPERTY_VALUE_MAX] = {0};
537611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
537711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((codec_profile.profile != V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE) &&
537811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) &&
537911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile != V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN) &&
538011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile != V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10) &&
538111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)) {
538211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        nBFrames=0;
538311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
538411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
538511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_validate_hybridhp_params(0, nBFrames, 0, 0) && !is_thulium_v1) {
538611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, bframes cannot be enabled with HybridHP");
538711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
538811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
538911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_period.num_pframes = nPFrames;
539111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_period.num_bframes = nBFrames;
539211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_calibrate_gop() && !is_thulium_v1)
539411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    {
539511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes");
539611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
539711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
539811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
539911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height >= 3840 * 2160 &&
540011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (property_get("vidc.enc.disable_bframes", property_value, "0") && atoi(property_value))) {
540111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        intra_period.num_pframes = intra_period.num_pframes + intra_period.num_bframes;
540211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        intra_period.num_bframes = 0;
540311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Warning: Disabling B frames for UHD recording pFrames = %lu bFrames = %lu",
540411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         intra_period.num_pframes, intra_period.num_bframes);
540511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
540611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5407bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel    if (m_sVenc_cfg.input_width * m_sVenc_cfg.input_height >= 5376 * 2688 &&
5408bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel        (property_get("vidc.enc.disable_pframes", property_value, "0") && atoi(property_value))) {
5409bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel          intra_period.num_pframes = 0;
5410bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel          DEBUG_PRINT_LOW("Warning: Disabling P frames for 5k/6k resolutions pFrames = %lu bFrames = %lu",
5411bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel          intra_period.num_pframes, intra_period.num_bframes);
5412bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel    }
5413bb740e8596fa53304e86875fed4c19762d53b321Thierry Strudel
541411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
541511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = intra_period.num_pframes;
541611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
541711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
541811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
541911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
542011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
542111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
542211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
542311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
542411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
542511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
542611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = intra_period.num_bframes;
542711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
542811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
542911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
543111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
543211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
543311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
543411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%lu", control.id, intra_period.num_bframes);
543611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
543711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264 ||
543811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
543911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
544011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
544111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
544211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
544311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
544411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
544511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
544611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
544711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
544811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        idrperiod.idrperiod = 1;
544911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
545011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
545111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
545211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
545311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod)
545411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
545511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
545611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
545711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_idr_period: nPFrames = %u, nIDRPeriod: %u",
545811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)nPFrames, (unsigned int)nIDRPeriod);
545911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
546111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: IDR period valid for H264 only!!");
546211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
546311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
546411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
546511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (venc_set_intra_period (nPFrames, intra_period.num_bframes) == false) {
546611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Request for setting intra period failed");
546711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
546811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
546911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!intra_period.num_bframes)
547111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        intra_period.num_pframes = nPFrames;
547211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD;
547311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = nIDRPeriod;
547411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
547611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
547711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
547811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
547911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
548011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
548111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    idrperiod.idrperiod = nIDRPeriod;
548311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
548411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
548511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
548611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level)
548711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
548811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
548911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
549011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_entropy_config: CABAC = %u level: %u", enable, (unsigned int)i_cabac_level);
549211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable && (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) &&
549411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (codec_profile.profile != V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE)) {
549511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC;
549711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
549811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
549911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
550011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
550111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
550311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
550411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
550511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
550611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
550711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
550811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        entropy.longentropysel = control.value;
550911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
551011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (i_cabac_level == 0) {
551111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0;
551211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (i_cabac_level == 1) {
551311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_1;
551411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (i_cabac_level == 2) {
551511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_2;
551611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
551711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
551811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL;
551911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //control.value = entropy_cfg.cabacmodel;
552011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
552111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
552211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
552411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
552511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
552611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
552711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
552811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
552911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        entropy.cabacmodel=control.value;
553011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (!enable) {
553111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value =  V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
553211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
553311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
553411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
553511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
553611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
553711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
553811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
553911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
554011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
554211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        entropy.longentropysel=control.value;
554311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
554411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid Entropy mode for Baseline Profile");
554511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
554611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
554711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
554811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
554911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
555011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_multislice_cfg(OMX_INDEXTYPE Codec, OMX_U32 nSlicesize) // MB
555211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
555311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
555411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
555511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
555611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
555711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((Codec != OMX_IndexParamVideoH263)  && (nSlicesize)) {
555811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value =  V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB;
555911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
556011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
556111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
556211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
556311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
556411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
556511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
556611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
556711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
556811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
556911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
557011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
557111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
557211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
557311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    multislice.mslice_mode=control.value;
557411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
557511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (multislice.mslice_mode!=V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
557611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
557711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB;
557811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = nSlicesize;
557911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling SLICE_MB IOCTL set control for id=%d, val=%d", control.id, control.value);
558011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
558111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
558211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
558311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
558411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
558511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
558611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
558711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
558811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice.mslice_size=control.value;
558911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
559111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
559311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
559411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
559511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_refresh(OMX_VIDEO_INTRAREFRESHTYPE ir_mode, OMX_U32 irMBs)
559611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
559711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
559811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
559911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control_mode,control_mbs;
560011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control_mode.id = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_MODE;
560111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control_mbs.id = V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
560211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control_mbs.value = 0;
560311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // There is no disabled mode.  Disabled mode is indicated by a 0 count.
560411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (irMBs == 0 || ir_mode == OMX_VIDEO_IntraRefreshMax) {
560511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_NONE;
560611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return status;
560711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((ir_mode == OMX_VIDEO_IntraRefreshCyclic) &&
560811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) {
560911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC;
561011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_CIR_MBS;
561111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.value=irMBs;
561211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((ir_mode == OMX_VIDEO_IntraRefreshAdaptive) &&
561311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) {
561411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_ADAPTIVE;
561511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.id=V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
561611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.value=irMBs;
561711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((ir_mode == OMX_VIDEO_IntraRefreshBoth) &&
561811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) {
561911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_CYCLIC_ADAPTIVE;
562011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((ir_mode == OMX_VIDEO_IntraRefreshRandom) &&
562111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (irMBs < ((m_sVenc_cfg.dvs_width * m_sVenc_cfg.dvs_height)>>8))) {
562211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mode.value = V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM;
562311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.id = V4L2_CID_MPEG_VIDC_VIDEO_AIR_MBS;
562411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control_mbs.value = irMBs;
562511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
562611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Invalid IntraRefresh Parameters:"
562711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "mb count: %u, mb mode:%d", (unsigned int)irMBs, ir_mode);
562811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
562911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
563011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%u, val=%d", control_mode.id, control_mode.value);
563211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mode);
563311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
563511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
563611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
563711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
563811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
563911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control_mode.id, control_mode.value);
564011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control_mbs.id, control_mbs.value);
564211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control_mbs);
564311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
564511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
564611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
564711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
564811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
564911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control_mbs.id, control_mbs.value);
565011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_refresh.irmode = control_mode.value;
565211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_refresh.mbcount = control_mbs.value;
565311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
565511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
565611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
565711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience)
565811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
565911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
566011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_headerextension hec_cfg;
566111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_multiclicecfg multislice_cfg;
566211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
566311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 resynchMarkerSpacingBytes = 0;
566411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
566511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&control, 0, sizeof(control));
566711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
566811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
566911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (error_resilience->bEnableHEC) {
567011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            hec_cfg.header_extension = 1;
567111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
567211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            hec_cfg.header_extension = 0;
567311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
567411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
567511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hec.header_extension = error_resilience->bEnableHEC;
567611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
567711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
567811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (error_resilience->bEnableRVLC) {
567911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("RVLC is not Supported");
568011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
568111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
568211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
568411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (error_resilience->bEnableDataPartitioning)) {
568511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("DataPartioning are not Supported for MPEG4/H264");
568611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
568711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
568811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
568911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (error_resilience->nResynchMarkerSpacing) {
569011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        resynchMarkerSpacingBytes = error_resilience->nResynchMarkerSpacing;
569111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        resynchMarkerSpacingBytes = ALIGN(resynchMarkerSpacingBytes, 8) >> 3;
569211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
569311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (( m_sVenc_cfg.codectype != V4L2_PIX_FMT_H263) &&
569411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (error_resilience->nResynchMarkerSpacing)) {
569511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_mode = VEN_MSLICE_CNT_BYTE;
569611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_size = resynchMarkerSpacingBytes;
569711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
569811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES;
569911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263 &&
570011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            error_resilience->bEnableDataPartitioning) {
570111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_mode = VEN_MSLICE_GOB;
570211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_size = resynchMarkerSpacingBytes;
570311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
570411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDEO_MULTI_SLICE_GOB;
570511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
570611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_mode = VEN_MSLICE_OFF;
570711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        multislice_cfg.mslice_size = 0;
570811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE;
570911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value =  V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
571011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
571111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("%s(): mode = %lu, size = %lu", __func__,
571311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            multislice_cfg.mslice_mode, multislice_cfg.mslice_size);
571411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
571511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
571611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
571711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
571811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Failed to set Slice mode control");
571911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
572011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
572111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
572211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
572311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    multislice.mslice_mode=control.value;
572411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5725fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.id = (multislice_cfg.mslice_mode == VEN_MSLICE_GOB) ?
5726fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                  V4L2_CID_MPEG_VIDEO_MULTI_SLICE_GOB : V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES;
572711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = resynchMarkerSpacingBytes;
572811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
572911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
573111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
573311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Failed to set MAX MB control");
573411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
573511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
573611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
573711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_ERROR("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
573811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    multislice.mslice_mode = multislice_cfg.mslice_mode;
573911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    multislice.mslice_size = multislice_cfg.mslice_size;
574011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
574111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
574211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
574311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loopfilter)
574411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
574511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
574611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
574711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE;
574811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value=0;
574911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
575011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (loopfilter == OMX_VIDEO_AVCLoopFilterEnable) {
575111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED;
575211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisable) {
575311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED;
575411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (loopfilter == OMX_VIDEO_AVCLoopFilterDisableSliceBoundary) {
575511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value=V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY;
575611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
575711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
575811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
575911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
576011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
576111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
576211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
576311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
576411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
576511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
576611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
576711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dbkfilter.db_mode=control.value;
576811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
576911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA;
577011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value=0;
577111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
577211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
577311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
577411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
577511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
577611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
577711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
577811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
577911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
578011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id=V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA;
578111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value=0;
578211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
578311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
578411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
578511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
578611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
578711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
578811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
578911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
579011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    dbkfilter.slicealpha_offset = dbkfilter.slicebeta_offset = 0;
579311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
579411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
579511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
579611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config)
579711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
579811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_target_bitrate: bitrate = %u",
579911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)nTargetBitrate);
580011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
580111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
580211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
580311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (vqzip_sei_info.enabled) {
580411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("For VQZIP 1.0, Bitrate setting is not supported");
580511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
580611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
580711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
580811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_BITRATE;
580911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = nTargetBitrate;
581011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
581211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
581311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
581511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set control");
581611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
581711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
581811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
581911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
582011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.targetbitrate = control.value;
582311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bitrate.target_bitrate = control.value;
582411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!config) {
582611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_level_set = false;
582711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
582811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (venc_set_profile_level(0, 0)) {
582911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Calling set level (Bitrate) with %lu",profile_level.level);
583011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
583111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
583211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5833fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // Configure layer-wise bitrate if temporal layers are enabled and layer-wise distribution
5834fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    //  has been specified
5835fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (temporal_layers_config.bIsBitrateRatioValid && temporal_layers_config.nPLayers) {
5836fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0},
5837fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                numLayers = temporal_layers_config.nPLayers + temporal_layers_config.nBLayers;
5838fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
5839fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("TemporalLayer: configuring layerwise bitrate");
5840fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        for (OMX_U32 i = 0; i < numLayers; ++i) {
5841fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            layerBitrates[i] =
5842fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    (temporal_layers_config.nTemporalLayerBitrateFraction[i] * bitrate.target_bitrate) / 100;
5843fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("TemporalLayer: layer[%u] ratio=%u%% bitrate=%u(of %ld)",
5844fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    i, temporal_layers_config.nTemporalLayerBitrateFraction[i],
5845fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    layerBitrates[i], bitrate.target_bitrate);
5846fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5847fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, numLayers)) {
5848fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return false;
5849fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
5850fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
5851fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
585211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
585311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
585411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
585511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config)
585611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
585711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_streamparm parm;
585811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
585911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct venc_framerate frame_rate_cfg;
586011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    Q16ToFraction(encode_framerate,frame_rate_cfg.fps_numerator,frame_rate_cfg.fps_denominator);
586111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
586211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    parm.parm.output.timeperframe.numerator = frame_rate_cfg.fps_denominator;
586311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    parm.parm.output.timeperframe.denominator = frame_rate_cfg.fps_numerator;
586411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
586511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (vqzip_sei_info.enabled) {
586611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("For VQZIP 1.0, Framerate setting is not supported");
586711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
586811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
586911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
587011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
587111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (frame_rate_cfg.fps_numerator > 0)
587211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_PARM, &parm);
587311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
587411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
587511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Request for setting framerate failed");
587611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
587711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
587811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
587911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.fps_den = frame_rate_cfg.fps_denominator;
588011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.fps_num = frame_rate_cfg.fps_numerator;
588111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
588211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!config) {
588311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_level_set = false;
588411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
588511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (venc_set_profile_level(0, 0)) {
588611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Calling set level (Framerate) with %lu",profile_level.level);
588711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
588811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
588911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
589111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
589211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_color_format(OMX_COLOR_FORMATTYPE color_format)
589411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
589511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
5896fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    int color_space = 0;
589711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_color_format: color_format = %u ", color_format);
589811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
589911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch ((int)color_format) {
590011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_COLOR_FormatYUV420SemiPlanar:
590111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
590211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12;
5903fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_space = V4L2_COLORSPACE_470_SYSTEM_BG;
590411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
590511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FormatYVU420SemiPlanar:
590611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV21;
5907fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_space = V4L2_COLORSPACE_470_SYSTEM_BG;
590811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
590911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed:
591011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_NV12_UBWC;
5911fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_space = V4L2_COLORSPACE_470_SYSTEM_BG;
591211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
591311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_Format32bitRGBA8888:
591411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_RGB32;
591511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
591611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case QOMX_COLOR_Format32bitRGBA8888Compressed:
591711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_PIX_FMT_RGBA8888_UBWC;
591811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
591911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
592011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("WARNING: Unsupported Color format [%d]", color_format);
592111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            m_sVenc_cfg.inputformat = V4L2_DEFAULT_OUTPUT_COLOR_FMT;
5922fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_space = V4L2_COLORSPACE_470_SYSTEM_BG;
592311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Default color format NV12 UBWC is set");
5924fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
5925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            /*
5926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel             * If Client is using Opaque, YUV format will be informed with
5927fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel             * first ETB. Till that point, it is unknown.
5928fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel             */
5929fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            m_pq.is_YUV_format_uncertain = true;
5930fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
593111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
593211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
593311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
593411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0, sizeof(fmt));
593511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
593611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.inputformat;
5937fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    fmt.fmt.pix_mp.colorspace = color_space;
593811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.height = m_sVenc_cfg.input_height;
593911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.width = m_sVenc_cfg.input_width;
594011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
594211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed setting color format %x", color_format);
594311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
594411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
594511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
594711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
594811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
594911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh)
595011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
595111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_intra_vop_refresh: intra_vop = %uc", intra_vop_refresh);
595211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
595311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (intra_vop_refresh == OMX_TRUE) {
595411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        struct v4l2_control control;
595511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int rc;
595611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_REQUEST_IFRAME;
595711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
595811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5959a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
596011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
5961a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_ERROR("Failed to set Intra Frame Request control");
596211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
596311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
5964a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_HIGH("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
596511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
596611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: VOP Refresh is False, no effect");
596711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
596811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
596911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
597011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
597111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
597211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_deinterlace(OMX_U32 enable)
597311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
597411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_deinterlace: enable = %u", (unsigned int)enable);
597511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
597611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
597711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE;
597811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable)
597911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE_ENABLED;
598011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
598111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_DEINTERLACE_ENABLED;
598211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
598311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
598411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
598511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
598611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set Deinterlcing control");
598711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
598811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
598911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
599011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    deinterlace_enabled = true;
599111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
599211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
599311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
599411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_calibrate_gop()
599511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
599611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ratio, sub_gop_size, gop_size, nPframes, nBframes, nLayers;
599711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int num_sub_gops_in_a_gop;
599811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nPframes = intra_period.num_pframes;
599911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nBframes = intra_period.num_bframes;
600011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    nLayers = hier_layers.numlayers;
6001fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (temporal_layers_config.nPLayers) {
6002fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        nLayers = temporal_layers_config.nPLayers + temporal_layers_config.nBLayers;
6003fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
600411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
600511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!nPframes && nLayers) {
600611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("nPframes should be non-zero when nLayers are present\n");
600711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
600811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
600911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
601011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nLayers > 1) { /*Multi-layer encoding*/
601111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        sub_gop_size = 1 << (nLayers - 1);
601211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Actual GOP definition is nPframes + nBframes + 1 but for the sake of
601311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * below calculations we are ignoring +1 . Ignoring +1 in below
601411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         * calculations is not a mistake but intentional.
601511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel         */
601611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        gop_size = MAX(sub_gop_size, ROUND(nPframes + nBframes, sub_gop_size));
601711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        num_sub_gops_in_a_gop = gop_size/sub_gop_size;
601811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nBframes) { /*Hier-B case*/
601911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /*
602011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Frame Type--> I  B  B  B  P  B  B  B  P  I  B  B  P ...
602111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Layer -->     0  2  1  2  0  2  1  2  0  0  2  1  2 ...
602211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * nPframes = 2, nBframes = 6, nLayers = 3
602311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *
602411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Intention is to keep the intraperiod as close as possible to what is desired
602511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * by the client while adjusting nPframes and nBframes to meet other constraints.
602611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg1: Input by client: nPframes =  9, nBframes = 14, nLayers = 2
602711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *    Output of this fn: nPframes = 12, nBframes = 12, nLayers = 2
602811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *
602911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg2: Input by client: nPframes = 9, nBframes = 4, nLayers = 2
603011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *    Output of this fn: nPframes = 7, nBframes = 7, nLayers = 2
603111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            */
603211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPframes = num_sub_gops_in_a_gop;
603311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBframes = gop_size - nPframes;
603411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else { /*Hier-P case*/
603511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /*
603611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Frame Type--> I  P  P  P  P  P  P  P  I  P  P  P  P ...
603711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Layer-->      0  2  1  2  0  2  1  2  0  2  1  2  0 ...
603811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * nPframes =  7, nBframes = 0, nLayers = 3
603911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *
604011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * Intention is to keep the intraperiod as close as possible to what is desired
604111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * by the client while adjusting nPframes and nBframes to meet other constraints.
604211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg1: Input by client: nPframes = 9, nBframes = 0, nLayers = 3
604311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *    Output of this fn: nPframes = 7, nBframes = 0, nLayers = 3
604411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *
604511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg2: Input by client: nPframes = 10, nBframes = 0, nLayers = 3
604611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *     Output of this fn:nPframes = 12, nBframes = 0, nLayers = 3
604711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            */
604811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nPframes = gop_size - 1;
604911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
605011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else { /*Single-layer encoding*/
605111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (nBframes) {
605211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            /* I  P  B  B  B  P  B  B  B   P   B   B   B   I   P   B   B...
605311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17...
605411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * nPframes = 3, nBframes = 9, nLayers = 0
605511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *
605611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * ratio is rounded,
605711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg1: nPframes = 9, nBframes = 11 => ratio = 1
605811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            * eg2: nPframes = 9, nBframes = 16 => ratio = 2
605911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            */
606011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ratio = MAX(1, MIN((nBframes + (nPframes >> 1))/nPframes, 3));
606111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            nBframes = ratio * nPframes;
606211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
606311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
606411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("P/B Frames changed from: %ld/%ld to %d/%d",
606511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        intra_period.num_pframes, intra_period.num_bframes, nPframes, nBframes);
606611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_period.num_pframes = nPframes;
606711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    intra_period.num_bframes = nBframes;
606811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hier_layers.numlayers = nLayers;
606911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
607011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
607111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
607211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_bitrate_type(OMX_U32 type)
607311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
607411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
607511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
607611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_TYPE;
607711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = type;
607811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Set Bitrate type to %s for %d \n", bitrate_type_string(type), type);
607911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
608011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
608111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Request to set Bitrate type to %s failed",
608211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            bitrate_type_string(type));
608311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
608411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
608511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
608611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
608711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_set_layer_bitrates(OMX_U32 *layerBitrate, OMX_U32 numLayers)
608911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
609011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_layer_bitrates");
6091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    struct v4l2_ext_control ctrl[OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS];
609211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
609311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
609411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 i;
609511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
609611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_set_bitrate_type(V4L2_CID_MPEG_VIDC_VIDEO_VENC_BITRATE_ENABLE)) {
609711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set layerwise bitrate type %d", rc);
609811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
609911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
610011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    for (OMX_U32 i = 0; i < numLayers && i < OMX_VIDEO_ANDROID_MAXTEMPORALLAYERS; ++i) {
6102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!layerBitrate[i]) {
6103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Invalid bitrate settings for layer %d", i);
610411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
610511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
610611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ctrl[i].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_LAYER_BITRATE;
6107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            ctrl[i].value = layerBitrate[i];
610811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
610911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6110fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    controls.count = numLayers;
611111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
611211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
611311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
611411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls);
611511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
611611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set layerwise bitrate %d", rc);
611711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
611811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
611911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("Layerwise bitrate configured successfully");
612111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
612211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
612311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
612411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hybrid_hierp(QOMX_EXTNINDEX_VIDEO_HYBRID_HP_MODE* hhp)
612511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
612611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_hybrid_hierp layers");
612711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
612811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
612911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
613011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_validate_hybridhp_params(hhp->nHpLayers, 0, 0, (int) HIER_P_HYBRID)) {
613111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes");
613211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
613311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
613411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
613511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!hhp->nHpLayers || hhp->nHpLayers > MAX_HYB_HIERP_LAYERS) {
613611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid numbers of layers set: %d (max supported is 6)", hhp->nHpLayers);
613711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
613811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
613911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_set_intra_period(hhp->nKeyFrameInterval, 0)) {
614011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Failed to set Intraperiod: %d", hhp->nKeyFrameInterval);
614111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return false;
614211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
614311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
614411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hier_layers.numlayers = hhp->nHpLayers;
614511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
614611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hier_layers.hier_mode = HIER_P_HYBRID;
614711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
614811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hier_layers.hier_mode = HIER_P;
614911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
615011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (venc_calibrate_gop()) {
615111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     // Update the driver with the new nPframes and nBframes
615211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES;
615311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = intra_period.num_pframes;
615411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
615511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
615611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
615711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
615811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
615911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
616011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES;
616111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = intra_period.num_bframes;
616211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
616311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
616411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
616511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
616611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
616711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Updated nPframes (%ld) and nBframes (%ld)",
616811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         intra_period.num_pframes, intra_period.num_bframes);
616911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
617011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, Hybrid HP enabled with LTR OR Hier-pLayers OR bframes");
617111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
617211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
617311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
617411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE;
617511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
617611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS;
617711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
617811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = hhp->nHpLayers - 1;
617911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d",
618111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id, control.value);
618211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
618411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
618511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set hybrid hierp/hierp %d", rc);
618611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
618711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
618811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
618911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("SUCCESS IOCTL set control for id=%x, val=%d",
619011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id, control.value);
619111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
619211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC;
619311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED;
619411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
619511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to enable SVC_NAL");
619611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
619711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
619811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
619911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS;
620011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = hhp->nHpLayers - 1;
620111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
620211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to enable SVC_NAL");
620311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
620411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
620511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
620611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed : Unsupported codec for Hybrid Hier P : %lu", m_sVenc_cfg.codectype);
620711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
620811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
620911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
621011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(venc_set_session_qp_range (hhp->nMinQuantizer,
621111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hhp->nMaxQuantizer) == false) {
621211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Setting QP Range for hybridHP [%u %u] failed",
621311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (unsigned int)hhp->nMinQuantizer, (unsigned int)hhp->nMaxQuantizer);
621411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
621511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
621611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_values.minqp = hhp->nMinQuantizer;
621711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        session_qp_values.maxqp = hhp->nMaxQuantizer;
621811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
621911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0};
6221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    for (OMX_U32 i = 0; i < hhp->nHpLayers; i++) {
6222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        layerBitrates[i] = hhp->nTemporalLayerBitrateRatio[i];
6223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        hybrid_hp.nTemporalLayerBitrateRatio[i] = hhp->nTemporalLayerBitrateRatio[i];
6224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("Setting Layer[%u] bitrate = %u", i, layerBitrates[i]);
6225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
6226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, hhp->nHpLayers)) {
622711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       DEBUG_PRINT_ERROR("Failed to set Layer wise bitrate: %d, %d, %d, %d, %d, %d",
622811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            hhp->nTemporalLayerBitrateRatio[0],hhp->nTemporalLayerBitrateRatio[1],
622911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            hhp->nTemporalLayerBitrateRatio[2],hhp->nTemporalLayerBitrateRatio[3],
623011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            hhp->nTemporalLayerBitrateRatio[4],hhp->nTemporalLayerBitrateRatio[5]);
623111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel       return false;
623211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    hybrid_hp.nHpLayers = hhp->nHpLayers;
6234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
623511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // Set this or else the layer0 bitrate will be overwritten by
623611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    // default value in component
623711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sVenc_cfg.targetbitrate  = bitrate.target_bitrate = hhp->nTemporalLayerBitrateRatio[0];
623811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hybrid_hp.nHpLayers = hhp->nHpLayers;
623911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hybrid_hp.nKeyFrameInterval = hhp->nKeyFrameInterval;
624011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hybrid_hp.nMaxQuantizer = hhp->nMaxQuantizer;
624111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hybrid_hp.nMinQuantizer = hhp->nMinQuantizer;
624211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
624311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
624411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
624511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_ltrmode(OMX_U32 enable, OMX_U32 count)
624611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
624711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_ltrmode: enable = %u", (unsigned int)enable);
624811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
624911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
625011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
625111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_validate_hybridhp_params(0, 0, count, 0)) {
625311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid settings, LTR enabled with HybridHP");
625411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
625511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
625611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
625711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_LTRMODE;
625811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable)
625911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_MANUAL;
626011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
626111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = V4L2_MPEG_VIDC_VIDEO_LTR_MODE_DISABLE;
626211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
626311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_LTRCOUNT;
626411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable && count > 0)
626511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = count;
626611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (enable)
626711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = 1;
626811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
626911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = 0;
627011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
627111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
627211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
627311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
627411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
627511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d id=%x, val=%d",
627611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
627711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value);
627811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
627911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls);
628011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
628111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set ltrmode %d", rc);
628211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
628311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
628411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ltrinfo.enabled = enable;
628511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ltrinfo.count = count;
628611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
628711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d id=%x, val=%d",
628811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
628911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value);
629011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
629111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!venc_set_profile_level(0, 0)) {
629211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: %s(): Driver Profile/Level is NOT SET",
629311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__);
629411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
629511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("%s(): Driver Profile[%lu]/Level[%lu] successfully SET",
629611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                __func__, codec_profile.profile, profile_level.level);
629711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
629811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
629911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
630011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
630111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
630211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_useltr(OMX_U32 frameIdx)
630311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
630411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_use_goldenframe");
630511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = true;
630611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
630711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
630811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_USELTRFRAME;
630911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = frameIdx;
631011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
631211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
631311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set use_ltr %d", rc);
631411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
631511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
631611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
631711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d",
631811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id, control.value);
631911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
632011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
632111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
632211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_markltr(OMX_U32 frameIdx)
632311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
632411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_goldenframe");
632511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = true;
632611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
632711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
632811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_MARKLTRFRAME;
632911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = frameIdx;
633011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
633111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
633211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
633311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set ltrmode %d", rc);
633411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
633511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
633611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
633711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, val=%d",
633811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    control.id, control.value);
633911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
634011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
634111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
634211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vpe_rotation(OMX_S32 rotation_angle)
634311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
634411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_vpe_rotation: rotation angle = %d", (int)rotation_angle);
634511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
634611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
634711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_format fmt;
634811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_requestbuffers bufreq;
634911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
635011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION;
635111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rotation_angle == 0)
635211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE;
635311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (rotation_angle == 90)
635411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_90;
635511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (rotation_angle == 180)
635611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_180;
635711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (rotation_angle == 270)
635811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_270;
635911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else {
636011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to find valid rotation angle");
636111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
636211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
636311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
636411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
636511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
636611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
636711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Failed to set VPE Rotation control");
636811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
636911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
637011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
637111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
637211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    memset(&fmt, 0, sizeof(fmt));
637311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
637411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.height = m_sVenc_cfg.dvs_height;
637511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.width = m_sVenc_cfg.dvs_width;
637611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    fmt.fmt.pix_mp.pixelformat = m_sVenc_cfg.codectype;
637711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_FMT, &fmt)) {
637811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set format on capture port");
637911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
638011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
638111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
638211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    m_sOutput_buff_property.datasize = fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
638311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.memory = V4L2_MEMORY_USERPTR;
638411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.count = m_sOutput_buff_property.actualcount;
638511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bufreq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
638611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd,VIDIOC_REQBUFS, &bufreq)) {
638711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("ERROR: Request for o/p buffer count failed for rotation");
638811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
638911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
639011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (bufreq.count >= m_sOutput_buff_property.mincount)
639111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        m_sOutput_buff_property.actualcount = m_sOutput_buff_property.mincount = bufreq.count;
639211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
639411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
639511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
639611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_searchrange()
639711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
639811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_searchrange");
639911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
640011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[6];
640111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
640211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
640311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
640411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
640511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE;
640611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = 16;
640711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE;
640811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = 4;
640911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE;
641011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].value = 16;
641111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE;
641211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].value = 4;
641311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE;
641411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].value = 12;
641511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE;
641611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].value = 4;
641711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if ((m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) ||
641811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel               (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)) {
641911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE;
642011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = 16;
642111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE;
642211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = 4;
642311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE;
642411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].value = 16;
642511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE;
642611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].value = 4;
642711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE;
642811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].value = 12;
642911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE;
643011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].value = 4;
643111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
643211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_X_RANGE;
643311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[0].value = 4;
643411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_Y_RANGE;
643511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[1].value = 4;
643611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_X_RANGE;
643711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[2].value = 4;
643811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].id = V4L2_CID_MPEG_VIDC_VIDEO_PFRAME_Y_RANGE;
643911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[3].value = 4;
644011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_X_RANGE;
644111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[4].value = 4;
644211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].id = V4L2_CID_MPEG_VIDC_VIDEO_BFRAME_Y_RANGE;
644311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ctrl[5].value = 4;
644411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
644511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid codec type");
644611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
644711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
644811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 6;
644911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
645011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
645111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
645211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW(" Calling IOCTL set control for"
645311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        "id=%x, val=%d id=%x, val=%d"
645411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        "id=%x, val=%d id=%x, val=%d"
645511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        "id=%x, val=%d id=%x, val=%d",
645611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[0].id, controls.controls[0].value,
645711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[1].id, controls.controls[1].value,
645811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[2].id, controls.controls[2].value,
645911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[3].id, controls.controls[3].value,
646011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[4].id, controls.controls[4].value,
646111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        controls.controls[5].id, controls.controls[5].value);
646211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
646311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls);
646411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
646511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set search range %d", rc);
646611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
646711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
646811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
646911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
647011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
647111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate)
647211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
647311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
647411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
647511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
647611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL;
647711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
64782601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    switch ((OMX_U32)eControlRate) {
647911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateDisable:
648011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF;
648111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
648211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateVariableSkipFrames:
648311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (supported_rc_modes & RC_VBR_VFR) ?
648411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_VFR :
648511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
648611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
648711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateVariable:
648811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (supported_rc_modes & RC_VBR_CFR) ?
648911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR :
649011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
649111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
649211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateConstantSkipFrames:
649311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (supported_rc_modes & RC_CBR_VFR) ?
649411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_VFR :
649511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
649611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
649711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case OMX_Video_ControlRateConstant:
649811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (supported_rc_modes & RC_CBR_CFR) ?
649911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_CBR_CFR :
650011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
650111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
65022601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case QOMX_Video_ControlRateMaxBitrate:
65032601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            (supported_rc_modes & RC_MBR_CFR) ?
65042601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR:
65052601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                status = false;
65062601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
65072601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        case QOMX_Video_ControlRateMaxBitrateSkipFrames:
65082601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            (supported_rc_modes & RC_MBR_VFR) ?
65092601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                control.value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR:
65102601808ee2992a94c325d05e4065aba60b01840bThierry Strudel                status = false;
65112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel            break;
651211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
651311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
651411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
651511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
651611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
651711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
651811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
651911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
652011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
652111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
652311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control");
652411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
652511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
652611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
652811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
652911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rate_ctrl.rcmode = control.value;
653011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
653111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_
653311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eControlRate == OMX_Video_ControlRateVariable && (supported_rc_modes & RC_VBR_CFR)
6534fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            && m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
653511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        /* Enable VQZIP SEI by default for camcorder RC modes */
653611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
653711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI;
653811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_VQZIP_SEI_ENABLE;
653911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("Set VQZIP SEI:");
654011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control) < 0) {
654111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_HIGH("Non-Fatal: Request to set VQZIP failed");
654211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
654311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
654411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
654511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
654711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
654811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
654911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_perf_level(QOMX_VIDEO_PERF_LEVEL ePerfLevel)
655011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
655111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
655211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
655311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
655411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL;
655511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
655611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (ePerfLevel) {
655711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_QCOM_PerfLevelNominal:
655811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
655911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
656011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    case OMX_QCOM_PerfLevelTurbo:
656111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO;
656211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
656311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    default:
65642e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL;
656511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
656611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        break;
656711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
656811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
656911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
657011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
657111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
657211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
657311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (rc) {
657411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set control for id=%d, val=%d", control.id, control.value);
657511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
657611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
657711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
657811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
65792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        DEBUG_PRINT_INFO("Requested perf level : %s",
65802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel                ePerfLevel == OMX_QCOM_PerfLevelTurbo ? "turbo" : "nominal");
658111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
658211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
658311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
658411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
658511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_perf_mode(OMX_U32 mode)
658611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
658711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
658811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mode && mode <= V4L2_MPEG_VIDC_VIDEO_PERF_POWER_SAVE) {
658911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE;
659011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = mode;
659111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE");
659211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
659311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE");
659411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
659511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
659611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
659711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
659811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid mode set for V4L2_CID_MPEG_VIDC_VIDEO_PERF_MODE: %d", mode);
659911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
660011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
660111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
660211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
660311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_qp(OMX_U32 nQp)
660411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
660511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
660611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (nQp) {
660711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP;
660811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = nQp;
660911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP");
661011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
661111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP");
661211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
661311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
661411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
661511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid qp set for V4L2_CID_MPEG_VIDC_VIDEO_CONFIG_QP: %d", nQp);
661611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
661711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
661811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
661911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
662011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
662111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_aspectratio(void *nSar)
662211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
662311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc;
662411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
662511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
662611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
662711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    QOMX_EXTNINDEX_VIDEO_VENC_SAR *sar;
662811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
662911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    sar = (QOMX_EXTNINDEX_VIDEO_VENC_SAR *) nSar;
663011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_WIDTH;
663211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].value = sar->nSARWidth;
663311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VENC_PARAM_SAR_HEIGHT;
663411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = sar->nSARHeight;
663511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
663611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
663711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
663811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
663911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x val=%d, id=%x val=%d",
664111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
664211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value);
664311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
664411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls);
664511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
664611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set SAR %d", rc);
664711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
664811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
664911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
665011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x val=%d, id=%x val=%d",
665111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[0].id, controls.controls[0].value,
665211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    controls.controls[1].id, controls.controls[1].value);
665311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
665411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
665511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
665611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_hierp_layers(OMX_U32 hierp_layers)
665711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
665811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
665911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (hierp_layers && (hier_layers.hier_mode == HIER_P) &&
666011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (hierp_layers <= hier_layers.numlayers)) {
666111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS;
666211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = hierp_layers - 1;
666311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS");
666411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
666511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set HIERP_LAYERS");
666611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
666711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
666811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
666911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
667011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid layers set for HIERP_LAYERS: %d",
667111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hierp_layers);
667211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
667311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
667411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
667511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
667611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_lowlatency_mode(OMX_BOOL enable)
667711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
667811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
667911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
668011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_MODE;
668211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable)
668311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_ENABLE;
668411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
668511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_LOWLATENCY_DISABLE;
668611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
668711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
668811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
668911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
669011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set lowlatency control");
669111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
669211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
669311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
669411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
669511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
669611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
669711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
669811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_low_latency(OMX_BOOL enable)
669911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
670011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
670111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
670211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264) {
670311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Low Latency mode is valid only for H264");
670411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
670511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
670611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
670711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    enable ? control.value = 2 : control.value = 0;
670811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
670911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_PIC_ORDER_CNT;
671011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
671111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set H264_PICORDER_CNT");
671211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
671311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
671411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
671511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    low_latency_mode = (OMX_BOOL) enable;
671611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
671711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
671811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
671911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6720a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudelbool venc_dev::venc_set_iframesize_type(QOMX_VIDEO_IFRAMESIZE_TYPE type)
6721a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel{
6722a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    struct v4l2_control control;
6723a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE;
6724a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
6725a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    switch (type) {
6726a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case QOMX_IFRAMESIZE_DEFAULT:
6727a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT;
6728a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
6729a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case QOMX_IFRAMESIZE_MEDIUM:
6730a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM;
6731a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
6732a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case QOMX_IFRAMESIZE_HUGE:
6733a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE;
6734a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
6735a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        case QOMX_IFRAMESIZE_UNLIMITED:
6736a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED;
6737a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            break;
6738a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        default:
6739a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            DEBUG_PRINT_INFO("Unknown Iframe Size found setting it to default");
6740a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel            control.value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT;
6741a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
6742a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
6743a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
6744a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        DEBUG_PRINT_ERROR("Failed to set iframe size hint");
6745a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel        return false;
6746a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    }
6747a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
6748a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel    return true;
6749a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel}
6750a5bf317aa35f90b6fcc533882760f86342b79547Thierry Strudel
675111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_baselayerid(OMX_U32 baseid)
675211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
675311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
675411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (hier_layers.hier_mode == HIER_P) {
675511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID;
675611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = baseid;
675711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Going to set V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID");
675811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
675911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Failed to set V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID");
676011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
676111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
676211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
676311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
676411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid mode set for V4L2_CID_MPEG_VIDC_VIDEO_BASELAYER_ID: %d",
676511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                hier_layers.hier_mode);
676611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
676711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
676811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
676911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vui_timing_info(OMX_BOOL enable)
677111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
677211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
677311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
677411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO;
677511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
677611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable)
677711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_ENABLED;
677811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
677911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_VUI_TIMING_INFO_DISABLED;
678011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
678111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%x, val=%d", control.id, control.value);
678211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
678311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
678411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set VUI timing info control");
678511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
678611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
678711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%x, value=%d", control.id, control.value);
678811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
678911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
679011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
679111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_peak_bitrate(OMX_U32 nPeakBitrate)
679211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
679311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
679411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
679511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDEO_BITRATE_PEAK;
679611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = nPeakBitrate;
679711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
679811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_peak_bitrate: bitrate = %u", (unsigned int)nPeakBitrate);
679911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
680011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
680111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
680211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
680311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
680411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set peak bitrate control");
680511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
680611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
680711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
680811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
680911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
681111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
681211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_vpx_error_resilience(OMX_BOOL enable)
681411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
681511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
681611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int rc = 0;
681711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_VPX_ERROR_RESILIENCE;
681811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
681911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (enable)
682011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 1;
682111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
682211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = 0;
682311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
682411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_vpx_error_resilience: %d", control.value);
682511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
682611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
682711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
682811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    rc = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
682911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rc) {
683011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set VPX Error Resilience");
683111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
683211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
683311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    vpx_err_resilience.enable = 1;
683411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Success IOCTL set control for id=%d, value=%d", control.id, control.value);
683511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
683611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
683711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
683811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_priority(OMX_U32 priority) {
683911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
684011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
684111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY;
684211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (priority == 0)
684311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_ENABLE;
684411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else
684511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE;
684611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
684711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
684811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_%s",
684911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                priority == 0 ? "ENABLE" : "DISABLE");
685011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
685111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
685211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
685311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
685411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
685511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_operatingrate(OMX_U32 rate) {
685611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
685711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
685811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_OPERATING_RATE;
685911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = rate;
686011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
686111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("venc_set_operating_rate: %d fps", rate >> 16);
686211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Calling IOCTL set control for id=%d, val=%d", control.id, control.value);
686311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
686411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
686511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hw_overload = errno == EBUSY;
686611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set operating rate %d fps (%s)",
686711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                rate >> 16, hw_overload ? "HW overload" : strerror(errno));
686811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
686911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
687011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    operating_rate = rate;
687111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Operating Rate Set = %d fps",  rate >> 16);
687211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
687311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
687411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
68752e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelbool venc_dev::venc_set_roi_qp_info(OMX_QTI_VIDEO_CONFIG_ROIINFO *roiInfo)
68762e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel{
68772e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    struct roidata roi;
68782e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
68792e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (!m_roi_enabled) {
68802e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        DEBUG_PRINT_ERROR("ROI info not enabled");
68812e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        return false;
68822e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
6883fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!roiInfo) {
6884fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("No ROI info present");
6885fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
6886fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
6887fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_sVenc_cfg.codectype != V4L2_PIX_FMT_H264 &&
6888fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_sVenc_cfg.codectype != V4L2_PIX_FMT_HEVC) {
6889fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("OMX_QTIIndexConfigVideoRoiInfo is not supported for %d codec", (OMX_U32) m_sVenc_cfg.codectype);
6890fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return false;
6891fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
6892fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
6893fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("ROI QP info received");
68942e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memset(&roi, 0, sizeof(struct roidata));
68952e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
68962e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#ifdef _PQ_
6897fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pthread_mutex_lock(&m_pq.lock);
68982e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nUpperQpOffset = roiInfo->nUpperQpOffset;
68992e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nLowerQpOffset = roiInfo->nLowerQpOffset;
69002e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.bUseRoiInfo = roiInfo->bUseRoiInfo;
69012e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nRoiMBInfoSize = roiInfo->nRoiMBInfoSize;
69022e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
69032e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.pRoiMBInfo = malloc(roi.info.nRoiMBInfoSize);
69042e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (!roi.info.pRoiMBInfo) {
69052e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        DEBUG_PRINT_ERROR("venc_set_roi_qp_info: malloc failed");
69062e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        return false;
69072e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
69082e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memcpy(roi.info.pRoiMBInfo, roiInfo->pRoiMBInfo, roiInfo->nRoiMBInfoSize);
69092e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    /*
69102e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * set the timestamp equal to previous etb timestamp + 1
69112e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * to know this roi data arrived after previous etb
69122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     */
69132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (venc_handle->m_etb_count)
69142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        roi.timestamp = venc_handle->m_etb_timestamp + 1;
69152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    else
69162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        roi.timestamp = 0;
69172e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
6918fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    roi.dirty = true;
69192e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
69202e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_lock(&m_roilock);
69212e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    DEBUG_PRINT_LOW("list add roidata with timestamp %lld us", roi.timestamp);
69222e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    m_roilist.push_back(roi);
69232e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_unlock(&m_roilock);
69242e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
6925fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pthread_mutex_unlock(&m_pq.lock);
6926fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#else // _PQ_
69272e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nUpperQpOffset = roiInfo->nUpperQpOffset;
69282e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nLowerQpOffset = roiInfo->nLowerQpOffset;
69292e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.bUseRoiInfo = roiInfo->bUseRoiInfo;
69302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.nRoiMBInfoSize = roiInfo->nRoiMBInfoSize;
69312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
69322e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi.info.pRoiMBInfo = malloc(roi.info.nRoiMBInfoSize);
69332e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (!roi.info.pRoiMBInfo) {
69342e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        DEBUG_PRINT_ERROR("venc_set_roi_qp_info: malloc failed.");
69352e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        return false;
69362e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
69372e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memcpy(roi.info.pRoiMBInfo, roiInfo->pRoiMBInfo, roiInfo->nRoiMBInfoSize);
69382e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    /*
69392e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * set the timestamp equal to previous etb timestamp + 1
69402e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     * to know this roi data arrived after previous etb
69412e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel     */
69422e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (venc_handle->m_etb_count)
69432e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        roi.timestamp = venc_handle->m_etb_timestamp + 1;
69442e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    else
69452e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        roi.timestamp = 0;
69462e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
6947fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    roi.dirty = true;
69482e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
69492e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_lock(&m_roilock);
69502e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    DEBUG_PRINT_LOW("list add roidata with timestamp %lld us.", roi.timestamp);
69512e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    m_roilist.push_back(roi);
69522e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    pthread_mutex_unlock(&m_roilock);
6953fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
6954fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
6955fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return true;
6956fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
6957fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
695811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_blur_resolution(OMX_QTI_VIDEO_CONFIG_BLURINFO *blurInfo)
695911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
696011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_control ctrl[2];
696111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_ext_controls controls;
696211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
696311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int blur_width = 0, blur_height = 0;
696411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
696511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    switch (blurInfo->eTargetResol) {
696611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case BLUR_RESOL_DISABLED:
696711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_width = 0;
696811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_height = 0;
696911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
697011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case BLUR_RESOL_240:
697111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_width = 426;
697211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_height = 240;
697311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
697411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case BLUR_RESOL_480:
697511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_width = 854;
697611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_height = 480;
697711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
697811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case BLUR_RESOL_720:
697911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_width = 1280;
698011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_height = 720;
698111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
698211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        case BLUR_RESOL_1080:
698311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_width = 1920;
698411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            blur_height = 1080;
698511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            break;
698611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        default:
698711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Blur resolution not recognized");
698811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
698911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
699011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
699111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_WIDTH;
699211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[0].value = blur_width;
699311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
699411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].id = V4L2_CID_MPEG_VIDC_VIDEO_BLUR_HEIGHT;
699511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ctrl[1].value = blur_height;
699611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
699711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.count = 2;
699811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
699911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    controls.controls = ctrl;
700011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
700111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(ioctl(m_nDriver_fd, VIDIOC_S_EXT_CTRLS, &controls)) {
700211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set blur resoltion");
700311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
700411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
700511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Blur resolution set = %d x %d", blur_width, blur_height);
700611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
700711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
700811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
700911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
70102601808ee2992a94c325d05e4065aba60b01840bThierry Strudelbool venc_dev::venc_h264_transform_8x8(OMX_BOOL enable)
70112601808ee2992a94c325d05e4065aba60b01840bThierry Strudel{
70122601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    struct v4l2_control control;
70132601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
70142601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8;
70152601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (enable)
70162601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE;
70172601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    else
70182601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        control.value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_DISABLE;
70192601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
70202601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    DEBUG_PRINT_LOW("Set h264_transform_8x8 mode: %d", control.value);
70212601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
70222601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        DEBUG_PRINT_ERROR("set control: H264 transform 8x8 failed");
70232601808ee2992a94c325d05e4065aba60b01840bThierry Strudel        return false;
70242601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    }
70252601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
70262601808ee2992a94c325d05e4065aba60b01840bThierry Strudel    return true;
70272601808ee2992a94c325d05e4065aba60b01840bThierry Strudel}
70282601808ee2992a94c325d05e4065aba60b01840bThierry Strudel
70292e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudelbool venc_dev::venc_get_pq_status(OMX_BOOL *pq_status) {
70302e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
70312e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    if (pq_status == NULL) {
70322e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel        return false;
70332e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    }
70342e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    *pq_status = OMX_FALSE;
70352e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#ifdef _PQ_
70362e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    *pq_status = m_pq.is_pq_force_disable ? OMX_FALSE : OMX_TRUE;
70372e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel#endif // _PQ_
70382e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    return true;
70392e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel}
70402e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel
7041fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_get_temporal_layer_caps(OMX_U32 *nMaxLayers,
7042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        OMX_U32 *nMaxBLayers) {
7043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // no B-layers for all cases
7045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.nMaxBLayers = 0;
7046fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.nMaxLayers = 1;
7047fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7048fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264
7049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            || m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
7050fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        temporal_layers_config.nMaxLayers = MAX_HYB_HIERP_LAYERS; // TODO: get this count from codec
7051fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
7052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        temporal_layers_config.nMaxLayers = 4; // TODO: get this count from codec
7053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    *nMaxLayers = temporal_layers_config.nMaxLayers;
7056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    *nMaxBLayers = temporal_layers_config.nMaxBLayers;
7057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return true;
7058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
7059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry StrudelOMX_ERRORTYPE venc_dev::venc_set_temporal_layers(
7061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE *pTemporalParams) {
7062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!(m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264
7064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            || m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC
7065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            || m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8)) {
7066fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Temporal layers not supported for %s", codec_as_string(m_sVenc_cfg.codectype));
7067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorUnsupportedSetting;
7068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (pTemporalParams->ePattern == OMX_VIDEO_AndroidTemporalLayeringPatternNone &&
7071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            (pTemporalParams->nBLayerCountActual != 0 ||
7072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel             pTemporalParams->nPLayerCountActual != 1)) {
7073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorBadParameter;
7074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (pTemporalParams->ePattern != OMX_VIDEO_AndroidTemporalLayeringPatternAndroid ||
7075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pTemporalParams->nPLayerCountActual < 1) {
7076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorBadParameter;
7077fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (pTemporalParams->nBLayerCountActual > temporal_layers_config.nMaxBLayers) {
7080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("TemporalLayer: Requested B-layers(%u) exceeds supported max(%u)",
7081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pTemporalParams->nBLayerCountActual, temporal_layers_config.nMaxBLayers);
7082fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorBadParameter;
7083fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else if (pTemporalParams->nPLayerCountActual >
7084fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel             temporal_layers_config.nMaxLayers - pTemporalParams->nBLayerCountActual) {
7085fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("TemporalLayer: Requested layers(%u) exceeds supported max(%u)",
7086fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pTemporalParams->nPLayerCountActual + pTemporalParams->nBLayerCountActual,
7087fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                temporal_layers_config.nMaxLayers);
7088fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorBadParameter;
7089fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // For AVC, if B-layer has not been configured and RC mode is VBR (camcorder),
7092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // use hybrid-HP for best results
7093fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool isAvc = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264;
7094fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool isVBR = rate_ctrl.rcmode == RC_VBR_CFR || rate_ctrl.rcmode == RC_VBR_VFR;
7095fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool bUseHybridMode = isAvc && pTemporalParams->nBLayerCountActual == 0 && isVBR;
7096fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7097fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // If there are more than 3 layers configured for AVC, normal HP will not work. force hybrid
7098fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bUseHybridMode |= (isAvc && pTemporalParams->nPLayerCountActual > MAX_AVC_HP_LAYERS);
7099fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("TemporalLayer: RC-mode = %ld : %s hybrid-HP",
7101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            rate_ctrl.rcmode, bUseHybridMode ? "enable" : "disable");
7102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bUseHybridMode &&
7104fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            !venc_validate_hybridhp_params(pTemporalParams->nPLayerCountActual,
7105fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                pTemporalParams->nBLayerCountActual,
7106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                0 /* LTR count */, (int) HIER_P_HYBRID)) {
7107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        bUseHybridMode = false;
7108fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("Failed to validate Hybrid HP. Will try fallback to normal HP");
7109fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7110fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7111fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (intra_period.num_bframes) {
7112fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("TemporalLayer: B frames are not supported with layers");
7113fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorUnsupportedSetting;
7114fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7115fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7116fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!venc_set_intra_period(intra_period.num_pframes, intra_period.num_bframes)) {
7117fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("TemporalLayer : Failed to set Intra-period nP(%lu)/pB(%lu)",
7118fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                intra_period.num_pframes, intra_period.num_bframes);
7119fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorUnsupportedSetting;
7120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7121fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7122fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    struct v4l2_control control;
7123fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // Num enhancements layers does not include the base-layer
7124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    control.value = pTemporalParams->nPLayerCountActual - 1;
7125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bUseHybridMode) {
7127fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("TemporalLayer: Try enabling hybrid HP with %u layers", control.value);
7128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE;
7129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            bUseHybridMode = false;
7131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Failed to set hybrid HP");
7132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else {
7133fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            // Disable normal HP if Hybrid mode is being enabled
7134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS;
7135fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.value = 0;
7136fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Failed to set max HP layers to %u", control.value);
7138fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
7139fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
7140fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS;
7141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.value = 0;
7142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Failed to set HP layers to %u", control.value);
7144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
7145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
7146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!bUseHybridMode) {
7150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // in case of normal HP, avc encoder cannot support more than MAX_AVC_HP_LAYERS
7152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (isAvc && pTemporalParams->nPLayerCountActual > MAX_AVC_HP_LAYERS) {
7153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("AVC supports only up to %d layers", MAX_AVC_HP_LAYERS);
7154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUnsupportedSetting;
7155fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7156fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7157fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("TemporalLayer: Try enabling HP with %u layers", control.value);
7158fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_HIER_P_NUM_LAYERS;
7159fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7160fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Failed to set hybrid hierp/hierp");
7161fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUnsupportedSetting;
7162fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7163fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7164fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // configure max layers for a session.. Okay to use current num-layers as max
7165fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        //  since we do not plan to support dynamic changes to number of layers
7166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_MAX_HIERP_LAYERS;
7167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.value = pTemporalParams->nPLayerCountActual - 1;
7168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Failed to set max HP layers to %u", control.value);
7170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUnsupportedSetting;
7171fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7172fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else if (temporal_layers_config.hier_mode == HIER_P_HYBRID) {
7173fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            // Disable hybrid mode if it was enabled already
7174fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("TemporalLayer: disable hybrid HP (normal-HP preferred)");
7175fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.id = V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE;
7176fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            control.value = 0;
7177fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7178fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Failed to disable hybrid HP !");
7179fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                return OMX_ErrorUnsupportedSetting;
7180fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
7181fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7182fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7183fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7184fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // SVC-NALs to indicate layer-id in case of H264 needs explicit enablement..
7185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
7186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("TemporalLayer: Enable H264_SVC_NAL");
7187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.id = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC;
7188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        control.value = V4L2_CID_MPEG_VIDC_VIDEO_H264_NAL_SVC_ENABLED;
7189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control)) {
7190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("Failed to enable SVC_NAL");
7191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUnsupportedSetting;
7192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7193fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7195fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.hier_mode = bUseHybridMode ? HIER_P_HYBRID : HIER_P;
7196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.nPLayers = pTemporalParams->nPLayerCountActual;
7197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.nBLayers = 0;
7198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.bIsBitrateRatioValid = OMX_FALSE;
7200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (pTemporalParams->bBitrateRatiosSpecified == OMX_FALSE) {
7201fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_LOW("TemporalLayer: layerwise bitrate ratio not specified. Will use cumulative..");
7202fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorNone;
7203fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7204fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_LOW("TemporalLayer: layerwise bitrate ratio specified");
7205fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7206fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 layerBitrates[OMX_VIDEO_MAX_HP_LAYERS] = {0},
7207fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            numLayers = pTemporalParams->nPLayerCountActual + pTemporalParams->nBLayerCountActual;
7208fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7209fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_U32 i = 0;
7210fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    for (; i < numLayers; ++i) {
7211fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        OMX_U32 previousLayersAccumulatedBitrateRatio = i == 0 ? 0 : pTemporalParams->nBitrateRatios[i-1];
7212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        OMX_U32 currentLayerBitrateRatio = pTemporalParams->nBitrateRatios[i] - previousLayersAccumulatedBitrateRatio;
7213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (previousLayersAccumulatedBitrateRatio > pTemporalParams->nBitrateRatios[i]) {
7214fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("invalid bitrate ratio for layer %d.. Will fallback to cumulative", i);
7215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorBadParameter;
7216fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else {
7217fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            layerBitrates[i] = (currentLayerBitrateRatio * bitrate.target_bitrate) / 100;
7218fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            temporal_layers_config.nTemporalLayerBitrateRatio[i] = pTemporalParams->nBitrateRatios[i];
7219fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            temporal_layers_config.nTemporalLayerBitrateFraction[i] = currentLayerBitrateRatio;
7220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_LOW("TemporalLayer: layer[%u] ratio=%u%% bitrate=%u(of %ld)",
7221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    i, currentLayerBitrateRatio, layerBitrates[i], bitrate.target_bitrate);
7222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    temporal_layers_config.bIsBitrateRatioValid = OMX_TRUE;
7226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    // Setting layerwise bitrate makes sense only if target bitrate is configured, else defer until later..
7228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (bitrate.target_bitrate > 0) {
7229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (!venc_set_layer_bitrates((OMX_U32 *)layerBitrates, numLayers)) {
7230fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            return OMX_ErrorUnsupportedSetting;
7231fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7232fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
7233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("Defer setting layerwise bitrate since target bitrate is not yet set");
7234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7235fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7236fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return OMX_ErrorNone;
7237fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
7238fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7239fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry StrudelOMX_ERRORTYPE venc_dev::venc_set_temporal_layers_internal() {
7240fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE pTemporalParams;
7241fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&pTemporalParams, 0x0, sizeof(OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE));
7242fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
7243fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!temporal_layers_config.nPLayers) {
7244fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return OMX_ErrorNone;
7245fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7246fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.eSupportedPatterns = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid;
7247fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.nLayerCountMax = temporal_layers_config.nMaxLayers;
7248fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.nBLayerCountMax = temporal_layers_config.nMaxBLayers;
7249fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.ePattern = OMX_VIDEO_AndroidTemporalLayeringPatternAndroid;
7250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.nPLayerCountActual = temporal_layers_config.nPLayers;
7251fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.nBLayerCountActual = temporal_layers_config.nBLayers;
7252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pTemporalParams.bBitrateRatiosSpecified = temporal_layers_config.bIsBitrateRatioValid;
7253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (temporal_layers_config.bIsBitrateRatioValid == OMX_TRUE) {
7254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        for (OMX_U32 i = 0; i < temporal_layers_config.nPLayers + temporal_layers_config.nBLayers; ++i) {
7255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pTemporalParams.nBitrateRatios[i] =
7256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                    temporal_layers_config.nTemporalLayerBitrateRatio[i];
7257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
7258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
7259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return venc_set_temporal_layers(&pTemporalParams);
7260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
7261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
726211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel)
726311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
726411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
726511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
726611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (eProfile == NULL || eLevel == NULL) {
726711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
726811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
726911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
727011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
727111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_profile.profile) {
727211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
727311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
727411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
727511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
727611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
727711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
727811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
727911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_MPEG4ProfileMax;
728011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
728111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
728211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
728311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!status) {
728511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return status;
728611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
728711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
728811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        //profile level
728911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (profile_level.level) {
729011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
729111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level0;
729211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
729311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
729411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level0b;
729511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
729611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
729711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level1;
729811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
729911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
730011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level2;
730111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
730211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
730311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level3;
730411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
730511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
730611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level4;
730711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
730811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
730911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4Level5;
731011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
731111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
731211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_MPEG4LevelMax;
731311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status =  false;
731411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
731511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
731611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
731711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_profile.profile == VEN_PROFILE_H263_BASELINE) {
731811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eProfile = OMX_VIDEO_H263ProfileBaseline;
731911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
732011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eProfile = OMX_VIDEO_H263ProfileMax;
732111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
732211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
732311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
732411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (profile_level.level) {
732511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_10:
732611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level10;
732711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
732811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_20:
732911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level20;
733011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
733111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_30:
733211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level30;
733311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
733411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_40:
733511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level40;
733611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
733711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_45:
733811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level45;
733911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
734011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_50:
734111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level50;
734211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
734311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_60:
734411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level60;
734511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
734611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case VEN_LEVEL_H263_70:
734711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263Level70;
734811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
734911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
735011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_H263LevelMax;
735111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
735211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
735311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
735411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
735511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_profile.profile) {
735611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
735711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileBaseline;
735811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
735911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
736011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline;
736111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
736211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
736311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh;
736411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
736511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
736611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileMain;
736711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
736811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
736911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileHigh;
737011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
737111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
737211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileExtended;
737311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
737411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
737511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileHigh10;
737611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
737711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
737811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileHigh422;
737911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
738011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
738111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileHigh444;
738211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
738311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
738411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileMax;
738511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
738611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
738711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
738811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
738911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!status) {
739011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return status;
739111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
739211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
739311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (profile_level.level) {
739411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
739511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel1;
739611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
739711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
739811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel1b;
739911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
740011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
740111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel11;
740211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
740311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
740411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel12;
740511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
740611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
740711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel13;
740811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
740911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
741011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel2;
741111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
741211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
741311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel21;
741411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
741511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
741611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel22;
741711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
741811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
741911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel3;
742011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
742111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
742211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel31;
742311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
742411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
742511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel32;
742611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
742711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
742811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel4;
742911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
743011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
743111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel41;
743211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
743311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
743411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel42;
743511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
743611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
743711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel5;
743811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
743911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
744011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel51;
744111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
744211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDEO_H264_LEVEL_5_2:
744311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevel52;
744411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
744511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default :
744611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_AVCLevelMax;
744711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
744811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
744911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
745011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
745111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
745211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_profile.profile) {
745311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
745411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_VP8ProfileMain;
745511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
745611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
745711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_VP8ProfileMax;
745811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
745911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
746011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
746111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!status) {
746211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return status;
746311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
746411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
746511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (profile_level.level) {
746611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
746711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_VP8Level_Version0;
746811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
746911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
747011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_VP8Level_Version1;
747111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
747211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
747311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_VP8LevelMax;
747411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
747511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
747611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
747711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
747811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (codec_profile.profile) {
747911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN:
748011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_HEVCProfileMain;
748111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
748211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10:
748311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_HEVCProfileMain10;
748411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
748511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
748611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_HEVCProfileMax;
748711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
748811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
748911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
749011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!status) {
749111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return status;
749211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
749311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
749411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        switch (profile_level.level) {
749511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_1:
749611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel1;
749711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
749811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_1:
749911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel1;
750011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
750111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2:
750211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel2;
750311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
750411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2:
750511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel2;
750611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
750711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_2_1:
750811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel21;
750911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
751011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_2_1:
751111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel21;
751211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
751311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3:
751411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel3;
751511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
751611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3:
751711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel3;
751811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
751911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_3_1:
752011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel31;
752111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
752211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_3_1:
752311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel31;
752411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
752511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4:
752611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel4;
752711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
752811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4:
752911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel4;
753011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
753111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_4_1:
753211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel41;
753311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
753411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_4_1:
753511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel41;
753611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
753711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5:
753811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel5;
753911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
754011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5:
754111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel5;
754211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
754311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_1:
754411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel51;
754511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
754611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_1:
754711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel51;
754811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
754911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_5_2:
755011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel52;
755111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
755211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5_2:
755311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel52;
755411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
755511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6:
755611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel6;
755711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
755811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6:
755911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel6;
756011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
756111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_1:
756211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel61;
756311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
756411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_6_1:
756511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCHighTierLevel61;
756611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
756711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            case V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_MAIN_TIER_LEVEL_6_2:
756811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCMainTierLevel62;
756911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
757011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            default:
757111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eLevel = OMX_VIDEO_HEVCLevelMax;
757211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
757311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                break;
757411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
757511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
757611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
757711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
757811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
757911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
758011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel)
758111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
7582fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    OMX_U32 new_level = 0;
758311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned const int *profile_tbl = NULL;
758411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 mb_per_frame, mb_per_sec;
758511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool profile_level_found = false;
758611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
758711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (vqzip_sei_info.enabled) {
758811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_HIGH("VQZIP is enabled. Profile and Level set by client. Skipping validation");
758911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
759011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
759111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Init profile table for respective codec");
759311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
759411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    //validate the ht,width,fps,bitrate and set the appropriate profile and level
759511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_MPEG4) {
759611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == 0) {
759711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_profile_set) {
759811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
759911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
760011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch (codec_profile.profile) {
760111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
760211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
760311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
760411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
760511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_MPEG4ProfileSimple;
760611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
760711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    default:
760811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
760911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
761011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
761111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
761211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
761311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
761411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eLevel == 0 && !m_level_set) {
761511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eLevel = OMX_VIDEO_MPEG4LevelMax;
761611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
761711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
761811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == OMX_VIDEO_MPEG4ProfileSimple) {
761911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            profile_tbl = (unsigned int const *)mpeg4_profile_level_table;
762011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else if (*eProfile == OMX_VIDEO_MPEG4ProfileAdvancedSimple) {
762111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            profile_tbl = (unsigned int const *)
762211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                (&mpeg4_profile_level_table[MPEG4_ASP_START]);
762311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
762411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Unsupported MPEG4 profile type %u", (unsigned int)*eProfile);
762511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
762611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
762711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264) {
762811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == 0) {
762911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_profile_set) {
763011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_AVCProfileBaseline;
763111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
763211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch (codec_profile.profile) {
763311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
763411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileBaseline;
763511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
763611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
763711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = QOMX_VIDEO_AVCProfileConstrainedBaseline;
763811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
763911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH:
764011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                         *eProfile = QOMX_VIDEO_AVCProfileConstrainedHigh;
764111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
764211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
764311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileMain;
764411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
764511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED:
764611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileExtended;
764711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
764811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
764911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileHigh;
765011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
765111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10:
765211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileHigh10;
765311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
765411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422:
765511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileHigh422;
765611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
765711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE:
765811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_AVCProfileHigh444;
765911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
766011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    default:
766111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
766211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
766311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
766411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
766511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
766611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
766711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eLevel == 0 && !m_level_set) {
766811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eLevel = OMX_VIDEO_AVCLevelMax;
766911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
767011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7671fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        profile_tbl = (unsigned int const *)h264_profile_level_table;
7672fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if ((*eProfile != OMX_VIDEO_AVCProfileBaseline) &&
7673fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            (*eProfile != QOMX_VIDEO_AVCProfileConstrainedBaseline) &&
7674fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            (*eProfile != OMX_VIDEO_AVCProfileHigh) &&
7675fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            (*eProfile != QOMX_VIDEO_AVCProfileConstrainedHigh) &&
7676fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            (*eProfile != OMX_VIDEO_AVCProfileMain)) {
767711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Unsupported AVC profile type %u", (unsigned int)*eProfile);
767811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
767911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
768011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_H263) {
768111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == 0) {
768211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_profile_set) {
768311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_H263ProfileBaseline;
768411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
768511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch (codec_profile.profile) {
768611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case VEN_PROFILE_H263_BASELINE:
768711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_H263ProfileBaseline;
768811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
768911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    default:
769011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("%s(): Unknown Error", __func__);
769111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
769211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
769311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
769411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
769511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
769611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eLevel == 0 && !m_level_set) {
769711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eLevel = OMX_VIDEO_H263LevelMax;
769811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
769911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
770011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == OMX_VIDEO_H263ProfileBaseline) {
770111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            profile_tbl = (unsigned int const *)h263_profile_level_table;
770211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
770311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_LOW("Unsupported H.263 profile type %u", (unsigned int)*eProfile);
770411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
770511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
770611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_VP8) {
770711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == 0) {
770811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eProfile = OMX_VIDEO_VP8ProfileMain;
770911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
771011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (codec_profile.profile) {
771111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case V4L2_MPEG_VIDC_VIDEO_VP8_UNUSED:
771211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    *eProfile = OMX_VIDEO_VP8ProfileMain;
771311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
771411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
771511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s(): Unknown VP8 profile", __func__);
771611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
771711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
771811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
771911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eLevel == 0) {
772011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            switch (profile_level.level) {
772111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_0:
772211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    *eLevel = OMX_VIDEO_VP8Level_Version0;
772311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
772411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                case V4L2_MPEG_VIDC_VIDEO_VP8_VERSION_1:
772511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    *eLevel = OMX_VIDEO_VP8Level_Version1;
772611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    break;
772711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                default:
772811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    DEBUG_PRINT_ERROR("%s(): Unknown VP8 level", __func__);
772911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    return false;
773011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
773111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
773211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
773311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (m_sVenc_cfg.codectype == V4L2_PIX_FMT_HEVC) {
773411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eProfile == 0) {
773511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!m_profile_set) {
773611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                *eProfile = OMX_VIDEO_HEVCProfileMain;
773711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            } else {
773811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                switch (codec_profile.profile) {
773911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN:
774011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_HEVCProfileMain;
774111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
774211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    case V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN10:
774311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        *eProfile = OMX_VIDEO_HEVCProfileMain10;
774411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
774511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    default:
774611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_ERROR("%s(): Unknown Error", __func__);
774711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        return false;
774811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
774911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
775011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
775111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
775211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (*eLevel == 0 && !m_level_set) {
775311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            *eLevel = OMX_VIDEO_HEVCLevelMax;
775411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
775511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7756fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        profile_tbl = (unsigned int const *)hevc_profile_level_table;
7757fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        if ((*eProfile != OMX_VIDEO_HEVCProfileMain) &&
7758fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            (*eProfile != OMX_VIDEO_HEVCProfileMain10)) {
775911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("Unsupported HEVC profile type %u", (unsigned int)*eProfile);
776011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return false;
776111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
776211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else {
776311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid codec type");
776411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
776511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
776611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
776711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mb_per_frame = ((m_sVenc_cfg.dvs_height + 15) >> 4)*
776811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ((m_sVenc_cfg.dvs_width + 15)>> 4);
776911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((mb_per_frame >= 3600) && (m_sVenc_cfg.codectype == (unsigned long) V4L2_PIX_FMT_MPEG4)) {
777111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)
777211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
777311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (codec_profile.profile == (unsigned long) V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE)
777511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            profile_level.level = V4L2_MPEG_VIDEO_MPEG4_LEVEL_5;
777611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
777711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        {
777811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            new_level = profile_level.level;
777911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            return true;
778011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
778111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
778211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
778311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_OFF) {
778411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *eLevel = rc_off_level; //No level calculation for RC_OFF
778511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_level_found = true;
778611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return true;
778711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
778811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
778911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mb_per_sec = mb_per_frame * m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den;
779011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool h264, ltr, hlayers;
779211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned int hybridp = 0, maxDpb = profile_tbl[5] / mb_per_frame;
779311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    h264 = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264;
779411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ltr = ltrinfo.enabled && ((ltrinfo.count + 2) <= MIN((unsigned int) (profile_tbl[5] / mb_per_frame), MAXDPB));
779511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    hlayers = hier_layers.numlayers && hier_layers.hier_mode == HIER_P &&
779611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel     ((intra_period.num_bframes + ltrinfo.count + hier_layers.numlayers + 1) <= (unsigned int) (profile_tbl[5] / profile_tbl[0]));
779711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
779811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    /*  Hybrid HP reference buffers:
779911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        layers = 1, 2 need 1 reference buffer
780011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        layers = 3, 4 need 2 reference buffers
780111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        layers = 5, 6 need 3 reference buffers
780211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    */
780311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
780411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if(hier_layers.hier_mode == HIER_P_HYBRID)
780511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        hybridp = MIN(MAX(maxDpb, ((hier_layers.numlayers + 1) / 2)), 16);
780611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
780711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    do {
780811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mb_per_frame <= (unsigned int)profile_tbl[0]) {
780911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (mb_per_sec <= (unsigned int)profile_tbl[1]) {
781011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                if (m_sVenc_cfg.targetbitrate <= (unsigned int)profile_tbl[2]) {
781111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    if (h264 && (ltr || hlayers || hybridp)) {
781211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        // Update profile and level to adapt to the LTR and Hier-p/Hybrid-HP settings
781311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        new_level = (int)profile_tbl[3];
781411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        profile_level_found = true;
781511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        DEBUG_PRINT_LOW("Appropriate profile/level for LTR count: %u OR Hier-p: %u is %u/%u, maxDPB: %u",
7816fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                                        ltrinfo.count, hier_layers.numlayers, (int)*eProfile, (int)new_level,
781711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                                        MIN((unsigned int) (profile_tbl[5] / mb_per_frame), MAXDPB));
781811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
781911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    } else {
782011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        new_level = (int)profile_tbl[3];
782111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        profile_level_found = true;
7822fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel                        DEBUG_PRINT_LOW("Appropriate profile/level found %u/%u", (int) *eProfile, (int) new_level);
782311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                        break;
782411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    }
782511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                }
782611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            }
782711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
782811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        profile_tbl = profile_tbl + MAX_PROFILE_PARAMS;
782911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } while (profile_tbl[0] != 0);
783011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (profile_level_found != true) {
783211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("ERROR: Unsupported profile/level");
783311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
783411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
783511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
783611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((*eLevel == OMX_VIDEO_MPEG4LevelMax) || (*eLevel == OMX_VIDEO_AVCLevelMax)
783711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            || (*eLevel == OMX_VIDEO_H263LevelMax) || (*eLevel == OMX_VIDEO_VP8ProfileMax)
783811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            || (*eLevel == OMX_VIDEO_HEVCLevelMax)) {
783911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        *eLevel = new_level;
784011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
784111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("%s: Returning with eProfile = %u"
784311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            "Level = %u", __func__, (unsigned int)*eProfile, (unsigned int)*eLevel);
784411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
784511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
784611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
784711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _ANDROID_ICS_
784811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_meta_mode(bool mode)
784911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
785011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    metadatamode = mode;
785111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
785211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
785311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
785411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
785511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_is_video_session_supported(unsigned long width,
785611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        unsigned long height)
785711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
785811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if ((width * height < capability.min_width *  capability.min_height) ||
785911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (width * height > capability.max_width *  capability.max_height)) {
786011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR(
786111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                "Unsupported video resolution WxH = (%lu)x(%lu) supported range = min (%d)x(%d) - max (%d)x(%d)",
786211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                width, height, capability.min_width, capability.min_height,
786311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                capability.max_width, capability.max_height);
786411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
786511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
786611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
786711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("video session supported");
786811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
786911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
787011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_set_batch_size(OMX_U32 batchSize)
787211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
787311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    struct v4l2_control control;
787411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int ret;
787511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.id = V4L2_CID_VIDC_QBUF_MODE;
787711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    control.value = batchSize ? V4L2_VIDC_QBUF_BATCHED : V4L2_VIDC_QBUF_STANDARD;
787811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
787911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    ret = ioctl(m_nDriver_fd, VIDIOC_S_CTRL, &control);
788011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (ret) {
788111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to set batching mode: %d", ret);
788211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
788311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
788411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
788511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mBatchSize = batchSize;
788611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Using batch size of %d", mBatchSize);
788711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return true;
788811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
788911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
789011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::BatchInfo::BatchInfo()
789111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    : mNumPending(0) {
789211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&mLock, NULL);
789311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for (int i = 0; i < kMaxBufs; ++i) {
789411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mBufMap[i] = kBufIDFree;
789511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
789611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
789711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
789811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::BatchInfo::registerBuffer(int bufferId) {
789911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&mLock);
790011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int availId = 0;
790111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for( ; availId < kMaxBufs && mBufMap[availId] != kBufIDFree; ++availId);
790211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (availId >= kMaxBufs) {
790311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Failed to find free entry !");
790411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&mLock);
790511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
790611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
790711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mBufMap[availId] = bufferId;
790811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mNumPending++;
790911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&mLock);
791011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return availId;
791111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
791211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
791311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::BatchInfo::retrieveBufferAt(int v4l2Id) {
791411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&mLock);
791511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (v4l2Id >= kMaxBufs || v4l2Id < 0) {
791611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Batch: invalid index %d", v4l2Id);
791711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&mLock);
791811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
791911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
792011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mBufMap[v4l2Id] == kBufIDFree) {
792111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Batch: buffer @ %d was not registered !", v4l2Id);
792211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&mLock);
792311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return -1;
792411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
792511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int bufferId = mBufMap[v4l2Id];
792611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mBufMap[v4l2Id] = kBufIDFree;
792711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mNumPending--;
792811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&mLock);
792911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return bufferId;
793011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
793111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
793211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::BatchInfo::isPending(int bufferId) {
793311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_lock(&mLock);
793411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int existsId = 0;
793511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    for(; existsId < kMaxBufs && mBufMap[existsId] != bufferId; ++existsId);
793611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_unlock(&mLock);
793711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return existsId < kMaxBufs;
793811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
793911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
794011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#ifdef _VQZIP_
794111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev_vqzip::venc_dev_vqzip()
794211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
794311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mLibHandle = NULL;
794411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_init(&lock, NULL);
794511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
794611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
794711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool venc_dev::venc_dev_vqzip::init()
794811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
794911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
795011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle) {
795111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("VQZIP init called twice");
795211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
795311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
795411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
795511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = dlopen("libvqzip.so", RTLD_NOW);
795611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mLibHandle) {
795711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mVQZIPInit = (vqzip_init_t)
795811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dlsym(mLibHandle,"VQZipInit");
795911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mVQZIPDeInit = (vqzip_deinit_t)
796011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dlsym(mLibHandle,"VQZipDeInit");
796111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mVQZIPComputeStats = (vqzip_compute_stats_t)
796211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dlsym(mLibHandle,"VQZipComputeStats");
796311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!mVQZIPInit || !mVQZIPDeInit || !mVQZIPComputeStats)
796411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
796511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else {
796611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("FATAL ERROR: could not dlopen libvqzip.so: %s", dlerror());
796711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
796811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
796911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (status) {
797011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mVQZIPHandle = mVQZIPInit();
797111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
797211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
797311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!status && mLibHandle) {
797411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
797511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = NULL;
797611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPHandle = NULL;
797711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPInit = NULL;
797811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPDeInit = NULL;
797911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPComputeStats = NULL;
798011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
798111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
798211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
798311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
798411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint venc_dev::venc_dev_vqzip::fill_stats_data(void* pBuf, void* extraData)
798511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
798611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VQZipStatus result;
798711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    VQZipStats *pStats = (VQZipStats *)extraData;
798811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pConfig.pSEIPayload = NULL;
798911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    unsigned long size;
799011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!pBuf || !pStats || !mVQZIPHandle) {
799211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid data passed to stats function");
799311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
799411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    result = mVQZIPComputeStats(mVQZIPHandle, (void* )pBuf, &pConfig, pStats);
799511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return result;
799611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
799711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
799811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid venc_dev::venc_dev_vqzip::deinit()
799911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
800011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle) {
800111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_lock(&lock);
800211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
800311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPDeInit(mVQZIPHandle);
800411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = NULL;
800511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPHandle = NULL;
800611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPInit = NULL;
800711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPDeInit = NULL;
800811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mVQZIPComputeStats = NULL;
800911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        pthread_mutex_unlock(&lock);
801011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
801111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
801211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
801311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvenc_dev::venc_dev_vqzip::~venc_dev_vqzip()
801411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
801511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Destroy C2D instance");
801611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle) {
801711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
801811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
801911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mLibHandle = NULL;
802011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    pthread_mutex_destroy(&lock);
802111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
802211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#endif
8023fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8024fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#ifdef _PQ_
8025b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelbool venc_dev::venc_check_for_pq(void)
8026fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8027fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool rc_mode_supported = false;
8028fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool codec_supported = false;
8029fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool resolution_supported = false;
8030fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool frame_rate_supported = false;
8031fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool yuv_format_supported = false;
8032fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool is_non_secure_session = false;
8033fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool is_pq_handle_valid = false;
8034fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool is_non_vpe_session = false;
8035fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool enable = false;
8036fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8037fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    codec_supported = m_sVenc_cfg.codectype == V4L2_PIX_FMT_H264;
8038fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8039d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel    rc_mode_supported = (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR) ||
8040d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel        (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_CFR) ||
8041d2bfc978bc0988b3a5ca83b89fb0fa3c293f8e35Thierry Strudel        (rate_ctrl.rcmode == V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_MBR_VFR);
8042fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8043fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    resolution_supported = m_sVenc_cfg.input_height * m_sVenc_cfg.input_width <=
8044fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        m_pq.caps.max_width * m_pq.caps.max_height;
8045fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8046fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    frame_rate_supported =
8047fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (m_sVenc_cfg.fps_num / m_sVenc_cfg.fps_den) <=
8048fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel        (m_pq.caps.max_mb_per_sec / ((m_sVenc_cfg.input_height * m_sVenc_cfg.input_width) / 256));
8049fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
80508a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel    frame_rate_supported = (((operating_rate >> 16) > 0) && ((operating_rate >> 16) < 5)) ? false : frame_rate_supported;
80518a262e157e0983fee79cc1b58d3c8abc2a18e380Thierry Strudel
8052fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    yuv_format_supported = ((m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12 && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV12)))
8053fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            || (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV21 && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV21)))
8054fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            || (m_sVenc_cfg.inputformat == V4L2_PIX_FMT_NV12_UBWC && (m_pq.caps.color_formats & BIT(COLOR_FMT_NV12_UBWC))));
8055fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8056fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    yuv_format_supported |= m_pq.is_YUV_format_uncertain; // When YUV format is uncertain, Let this condition pass
8057fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8058fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    is_non_secure_session = !venc_handle->is_secure_session();
8059fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8060fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    is_non_vpe_session = (m_sVenc_cfg.input_height == m_sVenc_cfg.dvs_height && m_sVenc_cfg.input_width == m_sVenc_cfg.dvs_width);
8061fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8062fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    is_pq_handle_valid = m_pq.is_pq_handle_valid();
8063fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8064fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    /* Add future PQ conditions here */
8065fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8066fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    enable = (!m_pq.is_pq_force_disable   &&
8067fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               codec_supported       &&
8068fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               rc_mode_supported     &&
8069fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               resolution_supported  &&
8070fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               frame_rate_supported  &&
8071fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               yuv_format_supported  &&
8072fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               is_non_secure_session &&
8073fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               is_non_vpe_session    &&
8074fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel               is_pq_handle_valid);
8075fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8076fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("PQ Condition : Force disable = %d Codec = %d, RC = %d, RES = %d, FPS = %d, YUV = %d, Non - Secure = %d, PQ lib = %d Non - VPE = %d PQ enable = %d",
8077fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel            m_pq.is_pq_force_disable, codec_supported, rc_mode_supported, resolution_supported, frame_rate_supported, yuv_format_supported,
8078fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            is_non_secure_session, is_pq_handle_valid, is_non_vpe_session, enable);
8079fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8080fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    m_pq.is_pq_enabled = enable;
8081fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8082b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    return enable;
8083b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel}
8084b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
8085b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelvoid venc_dev::venc_configure_pq()
8086b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{
8087b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    venc_set_extradata(OMX_ExtraDataEncoderOverrideQPInfo, (OMX_BOOL)true);
8088b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    extradata |= true;
8089b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    m_pq.configure(m_sVenc_cfg.input_width, m_sVenc_cfg.input_height);
8090fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return;
8091fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8092fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8093b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelvoid venc_dev::venc_try_enable_pq(void)
8094b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel{
8095b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    if(venc_check_for_pq()) {
8096b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        venc_configure_pq();
8097b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    }
8098b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel}
8099b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel
8100fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvenc_dev::venc_dev_pq::venc_dev_pq()
8101fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8102fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mLibHandle = NULL;
8103fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQHandle = NULL;
8104fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQInit = NULL;
8105fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQDeInit = NULL;
8106fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQGetCaps = NULL;
8107fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQConfigure = NULL;
8108fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQComputeStats = NULL;
8109fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    configured_format = 0;
8110fa202b9b18f17f7835fd602db5fff530e61112b4Thierry Strudel    is_pq_force_disable = 0;
8111fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pthread_mutex_init(&lock, NULL);
81122e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memset(&pConfig, 0, sizeof(gpu_stats_lib_input_config));
81132e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    memset(&roi_extradata_info, 0, sizeof(extradata_buffer_info));
81142e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi_extradata_info.size = 16 * 1024;            // Max size considering 4k
81152e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi_extradata_info.buffer_size = 16 * 1024;     // Max size considering 4k
81162e1e93b75bc282dafdff24eb3b473af177e3e35bThierry Strudel    roi_extradata_info.port_index = OUTPUT_PORT;
8117fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8118fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8119fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::init(unsigned long format)
8120fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8121fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool status = true;
8122fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    enum color_compression_format yuv_format;
8123fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8124fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (mLibHandle) {
8125fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_ERROR("PQ init called twice");
8126fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        status = false;
8127fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8128fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8129fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (format) {
8130fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV12:
8131fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV21:
8132fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            yuv_format = color_compression_format::LINEAR_NV12;
8133fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8134fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV12_UBWC:
8135fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
8136fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            yuv_format = color_compression_format::UBWC_NV12;
8137fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8138fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8139fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8140b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    ATRACE_BEGIN("PQ init");
8141fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (status) {
8142fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mLibHandle = dlopen(YUV_STATS_LIBRARY_NAME, RTLD_NOW);
8143fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (mLibHandle) {
8144fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQInit = (gpu_stats_lib_init_t)
8145fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                dlsym(mLibHandle,"gpu_stats_lib_init");
8146fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQDeInit = (gpu_stats_lib_deinit_t)
8147fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                dlsym(mLibHandle,"gpu_stats_lib_deinit");
8148fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQGetCaps = (gpu_stats_lib_get_caps_t)
8149fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                dlsym(mLibHandle,"gpu_stats_lib_get_caps");
8150fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQConfigure = (gpu_stats_lib_configure_t)
8151fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                dlsym(mLibHandle,"gpu_stats_lib_configure");
8152fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQComputeStats = (gpu_stats_lib_fill_data_t)
8153fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                dlsym(mLibHandle,"gpu_stats_lib_fill_data");
8154fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (!mPQInit || !mPQDeInit || !mPQGetCaps || !mPQConfigure || !mPQComputeStats)
8155fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                status = false;
8156fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else {
8157fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            DEBUG_PRINT_ERROR("FATAL ERROR: could not dlopen %s: %s", YUV_STATS_LIBRARY_NAME, dlerror());
8158fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            status = false;
8159fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
8160fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (status) {
8161fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            mPQInit(&mPQHandle, perf_hint::NORMAL, yuv_format);
8162fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            if (mPQHandle == NULL) {
8163fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_ERROR("Failed to get handle for PQ Library");
8164fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                status = false;
8165fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            } else {
8166fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                DEBUG_PRINT_HIGH("GPU PQ lib initialized successfully");
8167fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            }
8168fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8169fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
8170fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8171b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    ATRACE_END();
8172fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8173fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!status && mLibHandle) {
8174fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (mLibHandle)
8175fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            dlclose(mLibHandle);
8176fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mLibHandle = NULL;
8177fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQHandle = NULL;
8178fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQInit = NULL;
8179fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQDeInit = NULL;
8180fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQGetCaps = NULL;
8181fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQConfigure = NULL;
8182fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQComputeStats = NULL;
8183fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8184fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    is_YUV_format_uncertain = false;
8185fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    configured_format = format;
8186fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8187fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return status;
8188fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8189fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8190fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid venc_dev::venc_dev_pq::deinit()
8191fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8192fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (mLibHandle) {
8193fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQDeInit(mPQHandle);
8194fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        dlclose(mLibHandle);
8195fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQHandle = NULL;
8196fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mLibHandle = NULL;
8197fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQInit = NULL;
8198fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQDeInit = NULL;
8199fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQGetCaps = NULL;
8200fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQConfigure = NULL;
8201fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQComputeStats = NULL;
8202fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        configured_format = 0;
8203fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8204fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8205fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8206fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::reinit(unsigned long format)
8207fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8208fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool status = false;
8209fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
821069b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel    if ((configured_format != format) && (is_color_format_supported(format))) {
8211fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("New format (%lu) is different from configure format (%lu);"
8212fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                                " reinitializing PQ lib", format, configured_format);
8213fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        deinit();
821469b56682975340fc17ce9eac3cefd2d6c5bfdd84Thierry Strudel        status = init(format);
8215fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
8216fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        // ignore if new format is same as configured
8217fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8218fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8219fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return status;
8220fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8221fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8222fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvoid venc_dev::venc_dev_pq::get_caps()
8223fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8224fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    memset(&caps, 0, sizeof(gpu_stats_lib_caps_t));
8225fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (mPQHandle)
8226fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQGetCaps(mPQHandle, &caps);
8227fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("GPU lib stats caps max (w,h) = (%u, %u)",caps.max_width, caps.max_height);
8228fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("GPU lib stats caps max mb per sec = %u",caps.max_mb_per_sec);
8229fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("GPU lib stats caps color_format = %u",caps.color_formats);
8230fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8231fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8232fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::is_color_format_supported(unsigned long format)
8233fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8234fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    bool support = false;
8235fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    int color_format = -1;
8236fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8237fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    switch (format) {
8238fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV12:
8239fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = COLOR_FMT_NV12;
8240fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8241fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV21:
8242fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = COLOR_FMT_NV21;
8243fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8244fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_NV12_UBWC:
8245fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = COLOR_FMT_NV12_UBWC;
8246fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8247fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_RGB32:
8248fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = COLOR_FMT_RGBA8888;
8249fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8250fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        case V4L2_PIX_FMT_RGBA8888_UBWC:
8251fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = COLOR_FMT_RGBA8888_UBWC;
8252fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8253fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        default:
8254fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            color_format = -1;
8255fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            break;
8256fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8257fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8258fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (color_format >= 0) {
8259fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        support = (caps.color_formats & BIT(color_format)) ? true : false;
8260fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8261fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8262fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (support == true)
8263fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("GPU lib supports this format %lu",format);
8264fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    else
8265fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("GPU lib doesn't support this format %lu",format);
8266fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8267fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return support;
8268fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8269fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8270b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudelint venc_dev::venc_dev_pq::configure(unsigned long width, unsigned long height)
8271fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8272fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (mPQHandle) {
8273b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.algo = ADAPTIVE_QP;
8274b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.height = height;
8275b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.width = width;
8276b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.mb_height = 16;
8277b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.mb_width = 16;
8278b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.a_qp.pq_enabled = true;
8279b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel        pConfig.stride = VENUS_Y_STRIDE(COLOR_FMT_NV12, pConfig.width);
8280fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        pConfig.a_qp.gain = 1.0397;
8281fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        pConfig.a_qp.offset = 14.427;
8282fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        if (pConfig.a_qp.roi_enabled) {
8283fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pConfig.a_qp.minDeltaQPlimit = -16;
8284fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pConfig.a_qp.maxDeltaQPlimit = 15;
8285fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        } else {
8286fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pConfig.a_qp.minDeltaQPlimit = -6;
8287fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel            pConfig.a_qp.maxDeltaQPlimit = 9;
8288fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        }
8289fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return mPQConfigure(mPQHandle, &pConfig);
8290fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8291fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return -EINVAL;
8292fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8293fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8294fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelbool venc_dev::venc_dev_pq::is_pq_handle_valid()
8295fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8296fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return ((mPQHandle) ? true : false);
8297fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8298fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8299fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelint venc_dev::venc_dev_pq::fill_pq_stats(struct v4l2_buffer buf,
8300fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    unsigned int data_offset)
8301fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8302fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    gpu_stats_lib_buffer_params_t input, output;
8303fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    gpu_stats_lib_buffer_params_t roi_input;
8304fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8305fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (!mPQHandle || !is_pq_enabled) {
8306fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("Invalid Usage : Handle = %p PQ = %d",
8307fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel                mPQHandle, is_pq_enabled);
8308fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        return 0;
8309fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8310b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    ATRACE_BEGIN("PQ Compute Stats");
8311fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    input.fd =  buf.m.planes[0].reserved[0];
8312fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    input.data_offset =  buf.m.planes[0].data_offset;
8313fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    input.alloc_len =  buf.m.planes[0].length;
8314fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    input.filled_len =  buf.m.planes[0].bytesused;
8315fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8316fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    output.fd =  buf.m.planes[1].reserved[0];
8317fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    output.data_offset = buf.m.planes[1].reserved[1]; // This is current Extradata buffer
8318fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    output.data_offset += data_offset; // Offset to start in current buffer
8319fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    output.alloc_len =  buf.m.planes[1].reserved[2];
8320fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    output.filled_len =  buf.m.planes[1].bytesused;
8321fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8322fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("Input fd = %d, data_offset = %d", input.fd, input.data_offset);
8323fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("Final Output fd = %d, data_offset = %d", output.fd, output.data_offset);
8324fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8325fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (pConfig.a_qp.roi_enabled) {
8326fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        roi_input.fd =  roi_extradata_info.ion.fd_ion_data.fd;
8327fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        roi_input.data_offset =  0;
8328fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        roi_input.alloc_len = roi_extradata_info.size;
8329fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        roi_input.filled_len = 0;
8330fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("ROI fd = %d, offset = %d Length = %d", roi_input.fd, roi_input.data_offset, roi_input.alloc_len);
8331fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQComputeStats(mPQHandle, &input, &roi_input, &output, NULL, NULL);
8332fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        memset(roi_extradata_info.uaddr, 0, roi_extradata_info.size);
8333fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    } else {
8334fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        DEBUG_PRINT_HIGH("Output fd = %d, data_offset = %d", output.fd, output.data_offset);
8335fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQComputeStats(mPQHandle, &input, NULL, &output, NULL, NULL);
8336fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8337b50ee0d49e33884a5f998649944fff0a8e27cda6Thierry Strudel    ATRACE_END();
8338fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    DEBUG_PRINT_HIGH("PQ data length = %d", output.filled_len);
8339fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    return output.filled_len;
8340fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8341fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel
8342fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudelvenc_dev::venc_dev_pq::~venc_dev_pq()
8343fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel{
8344fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    if (mLibHandle) {
8345fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        mPQDeInit(mPQHandle);
8346fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel        dlclose(mLibHandle);
8347fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    }
8348fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mLibHandle = NULL;
8349fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQHandle = NULL;
8350fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQInit = NULL;
8351fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQDeInit = NULL;
8352fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQGetCaps = NULL;
8353fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQConfigure = NULL;
8354fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    mPQComputeStats = NULL;
8355fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel    pthread_mutex_destroy(&lock);
8356fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel}
8357fbc0b4aac30717e1ea0293751b1ac08fcb6fd0b3Thierry Strudel#endif // _PQ_
8358