1dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, The Linux Foundation. All rights reserved.
3dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRedistribution and use in source and binary forms, with or without
5dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandmodification, are permitted provided that the following conditions are met:
6dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions of source code must retain the above copyright
7dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer.
8dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions in binary form must reproduce the above copyright
9dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer in the
10dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      documentation and/or other materials provided with the distribution.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora nor
12dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      the names of its contributors may be used to endorse or promote
13dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      products derived from this software without specific prior written
14dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      permission.
15dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
16dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand--------------------------------------------------------------------------*/
28dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifndef __OMX_VENC_DEV__
29dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define __OMX_VENC_DEV__
30dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
31dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "OMX_Types.h"
32dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "OMX_Core.h"
33dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "OMX_QCOMExtns.h"
34dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "qc_omx_component.h"
35dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "omx_video_common.h"
36dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <linux/msm_vidc_enc.h>
37dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <pthread.h>
38dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <linux/videodev2.h>
39dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include <poll.h>
40dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define TIMEOUT 5000
41dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define MAX_RECON_BUFFERS 4
42dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
43dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid* async_venc_message_thread (void *);
44dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
45dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandclass venc_dev
46dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
47dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandpublic:
48dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  venc_dev(class omx_venc *venc_class); //constructor
49dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  ~venc_dev(); //des
50dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
51dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_open(OMX_U32);
52dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  void venc_close();
53dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_stop(void);
54dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_pause(void);
55dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_start(void);
56dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_flush(unsigned);
57dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef _ANDROID_ICS_
58dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_meta_mode(bool);
59dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
60dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_resume(void);
61dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_start_done(void);
62dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  unsigned venc_stop_done(void);
63dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_use_buf(void*, unsigned,unsigned);
64dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_free_buf(void*, unsigned);
65dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_empty_buf(void *, void *,unsigned,unsigned);
66dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_fill_buf(void *, void *,unsigned,unsigned);
67dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
68dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_get_buf_req(unsigned long *,unsigned long *,
69dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        unsigned long *,unsigned long);
70dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_buf_req(unsigned long *,unsigned long *,
71dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                        unsigned long *,unsigned long);
72dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_param(void *,OMX_INDEXTYPE);
73dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_config(void *configData, OMX_INDEXTYPE index);
74dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
75dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate);
76dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_get_seq_hdr(void *, unsigned, unsigned *);
77dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_loaded_start(void);
78dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_loaded_stop(void);
79dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_loaded_start_done(void);
80dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_loaded_stop_done(void);
81dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 m_nDriver_fd;
82dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool m_profile_set;
83dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool m_level_set;
84dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_mutex_t loaded_start_stop_mlock;
85dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  pthread_cond_t loaded_start_stop_cond;
86dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
87dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct recon_buffer {
88dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  unsigned char* virtual_address;
89dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  int pmem_fd;
90dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  int size;
91dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  int alignment;
92dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  int offset;
93dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef USE_ION
94dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          int ion_device_fd;
95dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          struct ion_allocation_data alloc_data;
96dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand          struct ion_fd_data ion_alloc_fd;
97dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
98dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  };
99dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  recon_buffer recon_buff[MAX_RECON_BUFFERS];
101dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int recon_buffers_count;
102dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool m_max_allowed_bitrate_check;
103dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int m_eProfile;
104dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int m_eLevel;
105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  int etb_count;
106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandprivate:
107dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  class omx_venc *venc_encoder;
108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_basecfg             m_sVenc_cfg;
109dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_ratectrlcfg         rate_ctrl;
110dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_targetbitrate       bitrate;
111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_intraperiod         intra_period;
112dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_profile             codec_profile;
113dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct ven_profilelevel         profile_level;
114dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_switch              set_param;
115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_voptimingcfg        time_inc;
116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_allocatorproperty   m_sInput_buff_property;
117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_allocatorproperty   m_sOutput_buff_property;
118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_sessionqp           session_qp;
119dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_multiclicecfg       multislice;
120dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_entropycfg          entropy;
121dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_dbcfg               dbkfilter;
122dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_intrarefresh        intra_refresh;
123dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_headerextension     hec;
124dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_voptimingcfg        voptimecfg;
125dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  struct venc_seqheader           seqhdr;
126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
128dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
130dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
131dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp);
132dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_extradata(OMX_U32 extra_data);
133dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
135dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  void venc_config_print();
144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_slice_delivery_mode(OMX_BOOL enable);
145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_inband_video_header(OMX_BOOL enable);
146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  bool venc_set_bitstream_restrict_in_vui(OMX_BOOL enable);
147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#ifdef MAX_RES_1080P
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 pmem_free();
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  OMX_U32 venc_allocate_recon_buffers();
151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  inline int clip2(int x)
152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  {
153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x -1;
154dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x | x >> 1;
155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x | x >> 2;
156dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x | x >> 4;
157dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x | x >> 16;
158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  x = x + 1;
159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	  return x;
160dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand  }
161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand};
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#endif
165