1 /*-------------------------------------------------------------------------- 2 Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 --------------------------------------------------------------------------*/ 29 #ifndef __OMX_VENC_DEV__ 30 #define __OMX_VENC_DEV__ 31 32 #include "OMX_Types.h" 33 #include "OMX_Core.h" 34 #include "OMX_VideoExt.h" 35 #include "OMX_QCOMExtns.h" 36 #include "qc_omx_component.h" 37 #include "omx_video_common.h" 38 #include "omx_video_base.h" 39 #include "omx_video_encoder.h" 40 #include <linux/videodev2.h> 41 #include <poll.h> 42 43 #define TIMEOUT 5*60*1000 44 #define BIT(num) (1 << (num)) 45 #define MAX_HYB_HIERP_LAYERS 6 46 47 enum hier_type { 48 HIER_NONE = 0x0, 49 HIER_P = 0x1, 50 HIER_B = 0x2, 51 HIER_P_HYBRID = 0x3, 52 }; 53 54 struct msm_venc_switch { 55 unsigned char status; 56 }; 57 58 struct msm_venc_allocatorproperty { 59 unsigned long mincount; 60 unsigned long actualcount; 61 unsigned long datasize; 62 unsigned long suffixsize; 63 unsigned long alignment; 64 unsigned long bufpoolid; 65 }; 66 67 struct msm_venc_basecfg { 68 unsigned long input_width; 69 unsigned long input_height; 70 unsigned long dvs_width; 71 unsigned long dvs_height; 72 unsigned long codectype; 73 unsigned long fps_num; 74 unsigned long fps_den; 75 unsigned long targetbitrate; 76 unsigned long inputformat; 77 }; 78 79 struct msm_venc_profile { 80 unsigned long profile; 81 }; 82 struct msm_venc_profilelevel { 83 unsigned long level; 84 }; 85 86 struct msm_venc_sessionqp { 87 unsigned long iframeqp; 88 unsigned long pframeqp; 89 unsigned long bframeqp; 90 }; 91 92 struct msm_venc_initqp { 93 unsigned long iframeqp; 94 unsigned long pframeqp; 95 unsigned long bframeqp; 96 unsigned long enableinitqp; 97 }; 98 99 struct msm_venc_qprange { 100 unsigned long maxqp; 101 unsigned long minqp; 102 }; 103 struct msm_venc_intraperiod { 104 unsigned long num_pframes; 105 unsigned long num_bframes; 106 }; 107 struct msm_venc_seqheader { 108 unsigned char *hdrbufptr; 109 unsigned long bufsize; 110 unsigned long hdrlen; 111 }; 112 113 struct msm_venc_capability { 114 unsigned long codec_types; 115 unsigned long maxframe_width; 116 unsigned long maxframe_height; 117 unsigned long maxtarget_bitrate; 118 unsigned long maxframe_rate; 119 unsigned long input_formats; 120 unsigned char dvs; 121 }; 122 123 struct msm_venc_entropycfg { 124 unsigned longentropysel; 125 unsigned long cabacmodel; 126 }; 127 128 struct msm_venc_dbcfg { 129 unsigned long db_mode; 130 unsigned long slicealpha_offset; 131 unsigned long slicebeta_offset; 132 }; 133 134 struct msm_venc_intrarefresh { 135 unsigned long irmode; 136 unsigned long mbcount; 137 }; 138 139 struct msm_venc_multiclicecfg { 140 unsigned long mslice_mode; 141 unsigned long mslice_size; 142 }; 143 144 struct msm_venc_bufferflush { 145 unsigned long flush_mode; 146 }; 147 148 struct msm_venc_ratectrlcfg { 149 unsigned long rcmode; 150 }; 151 152 struct msm_venc_voptimingcfg { 153 unsigned long voptime_resolution; 154 }; 155 struct msm_venc_framerate { 156 unsigned long fps_denominator; 157 unsigned long fps_numerator; 158 }; 159 160 struct msm_venc_targetbitrate { 161 unsigned long target_bitrate; 162 }; 163 164 165 struct msm_venc_rotation { 166 unsigned long rotation; 167 }; 168 169 struct msm_venc_timeout { 170 unsigned long millisec; 171 }; 172 173 struct msm_venc_headerextension { 174 unsigned long header_extension; 175 }; 176 177 struct msm_venc_video_capability { 178 unsigned int min_width; 179 unsigned int max_width; 180 unsigned int min_height; 181 unsigned int max_height; 182 }; 183 184 struct msm_venc_idrperiod { 185 unsigned long idrperiod; 186 }; 187 188 struct msm_venc_slice_delivery { 189 unsigned long enable; 190 }; 191 192 struct msm_venc_hierlayers { 193 unsigned int numlayers; 194 enum hier_type hier_mode; 195 }; 196 197 struct msm_venc_ltrinfo { 198 unsigned int enabled; 199 unsigned int count; 200 }; 201 202 struct msm_venc_perf_level { 203 unsigned int perflevel; 204 }; 205 206 struct msm_venc_vui_timing_info { 207 unsigned int enabled; 208 }; 209 210 struct msm_venc_peak_bitrate { 211 unsigned int peakbitrate; 212 }; 213 214 struct msm_venc_vpx_error_resilience { 215 unsigned int enable; 216 }; 217 218 struct msm_venc_priority { 219 OMX_U32 priority; 220 }; 221 222 enum v4l2_ports { 223 CAPTURE_PORT, 224 OUTPUT_PORT, 225 MAX_PORT 226 }; 227 228 struct extradata_buffer_info { 229 unsigned long buffer_size; 230 char* uaddr; 231 int count; 232 int size; 233 int allocated; 234 #ifdef USE_ION 235 struct venc_ion ion; 236 #endif 237 }; 238 239 enum rc_modes { 240 RC_VBR_VFR = BIT(0), 241 RC_VBR_CFR = BIT(1), 242 RC_CBR_VFR = BIT(2), 243 RC_CBR_CFR = BIT(3), 244 RC_ALL = (RC_VBR_VFR | RC_VBR_CFR 245 | RC_CBR_VFR | RC_CBR_CFR) 246 }; 247 248 class venc_dev 249 { 250 public: 251 venc_dev(class omx_venc *venc_class); //constructor 252 ~venc_dev(); //des 253 254 static void* async_venc_message_thread (void *); 255 bool venc_open(OMX_U32); 256 void venc_close(); 257 unsigned venc_stop(void); 258 unsigned venc_pause(void); 259 unsigned venc_start(void); 260 unsigned venc_flush(unsigned); 261 #ifdef _ANDROID_ICS_ 262 bool venc_set_meta_mode(bool); 263 #endif 264 unsigned venc_resume(void); 265 unsigned venc_start_done(void); 266 unsigned venc_stop_done(void); 267 unsigned venc_set_message_thread_id(pthread_t); 268 bool venc_use_buf(void*, unsigned,unsigned); 269 bool venc_free_buf(void*, unsigned); 270 bool venc_empty_buf(void *, void *,unsigned,unsigned); 271 bool venc_fill_buf(void *, void *,unsigned,unsigned); 272 273 bool venc_get_buf_req(OMX_U32 *,OMX_U32 *, 274 OMX_U32 *,OMX_U32); 275 bool venc_set_buf_req(OMX_U32 *,OMX_U32 *, 276 OMX_U32 *,OMX_U32); 277 bool venc_set_param(void *,OMX_INDEXTYPE); 278 bool venc_set_config(void *configData, OMX_INDEXTYPE index); 279 bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel); 280 bool venc_get_seq_hdr(void *, unsigned, unsigned *); 281 bool venc_loaded_start(void); 282 bool venc_loaded_stop(void); 283 bool venc_loaded_start_done(void); 284 bool venc_loaded_stop_done(void); 285 bool venc_is_video_session_supported(unsigned long width, unsigned long height); 286 bool venc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, 287 OMX_U32 height); 288 bool venc_get_performance_level(OMX_U32 *perflevel); 289 bool venc_get_vui_timing_info(OMX_U32 *enabled); 290 bool venc_get_peak_bitrate(OMX_U32 *peakbitrate); 291 bool venc_get_output_log_flag(); 292 int venc_output_log_buffers(const char *buffer_addr, int buffer_len); 293 int venc_input_log_buffers(OMX_BUFFERHEADERTYPE *buffer, int fd, int plane_offset); 294 int venc_extradata_log_buffers(char *buffer_addr); 295 296 struct venc_debug_cap m_debug; 297 OMX_U32 m_nDriver_fd; 298 bool m_profile_set; 299 bool m_level_set; 300 int num_planes; 301 int etb, ebd, ftb, fbd; 302 struct recon_buffer { 303 unsigned char* virtual_address; 304 int pmem_fd; 305 int size; 306 int alignment; 307 int offset; 308 #ifdef USE_ION 309 int ion_device_fd; 310 struct ion_allocation_data alloc_data; 311 struct ion_fd_data ion_alloc_fd; 312 #endif 313 }; 314 315 int stopped; 316 int resume_in_stopped; 317 bool m_max_allowed_bitrate_check; 318 pthread_t m_tid; 319 bool async_thread_created; 320 class omx_venc *venc_handle; 321 OMX_ERRORTYPE allocate_extradata(); 322 void free_extradata(); 323 int append_mbi_extradata(void *, struct msm_vidc_extradata_header*); 324 bool handle_extradata(void *, int); 325 int venc_set_format(int); 326 bool deinterlace_enabled; 327 bool hw_overload; 328 private: 329 OMX_U32 m_codec; 330 struct msm_venc_basecfg m_sVenc_cfg; 331 struct msm_venc_ratectrlcfg rate_ctrl; 332 struct msm_venc_targetbitrate bitrate; 333 struct msm_venc_intraperiod intra_period; 334 struct msm_venc_profile codec_profile; 335 struct msm_venc_profilelevel profile_level; 336 struct msm_venc_switch set_param; 337 struct msm_venc_voptimingcfg time_inc; 338 struct msm_venc_allocatorproperty m_sInput_buff_property; 339 struct msm_venc_allocatorproperty m_sOutput_buff_property; 340 struct msm_venc_sessionqp session_qp; 341 struct msm_venc_initqp init_qp; 342 struct msm_venc_qprange session_qp_range; 343 struct msm_venc_qprange session_qp_values; 344 struct msm_venc_multiclicecfg multislice; 345 struct msm_venc_entropycfg entropy; 346 struct msm_venc_dbcfg dbkfilter; 347 struct msm_venc_intrarefresh intra_refresh; 348 struct msm_venc_headerextension hec; 349 struct msm_venc_voptimingcfg voptimecfg; 350 struct msm_venc_video_capability capability; 351 struct msm_venc_idrperiod idrperiod; 352 struct msm_venc_slice_delivery slice_mode; 353 struct msm_venc_hierlayers hier_layers; 354 struct msm_venc_perf_level performance_level; 355 struct msm_venc_vui_timing_info vui_timing_info; 356 struct msm_venc_peak_bitrate peak_bitrate; 357 struct msm_venc_ltrinfo ltrinfo; 358 struct msm_venc_vpx_error_resilience vpx_err_resilience; 359 struct msm_venc_priority sess_priority; 360 OMX_U32 operating_rate; 361 362 bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel); 363 bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames); 364 bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config); 365 bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate); 366 bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp); 367 bool venc_set_session_qp_range(OMX_U32 min_qp, OMX_U32 max_qp); 368 bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config); 369 bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh); 370 bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format); 371 bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel); 372 bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize); 373 bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level); 374 bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter); 375 bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs); 376 bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience); 377 bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes); 378 void venc_config_print(); 379 bool venc_set_slice_delivery_mode(OMX_U32 enable); 380 bool venc_set_extradata(OMX_U32 extra_data, OMX_BOOL enable); 381 bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod); 382 bool venc_reconfig_reqbufs(); 383 bool venc_set_vpe_rotation(OMX_S32 rotation_angle); 384 bool venc_set_deinterlace(OMX_U32 enable); 385 bool venc_set_ltrmode(OMX_U32 enable, OMX_U32 count); 386 bool venc_enable_initial_qp(QOMX_EXTNINDEX_VIDEO_INITIALQP* initqp); 387 bool venc_set_useltr(OMX_U32 frameIdx); 388 bool venc_set_markltr(OMX_U32 frameIdx); 389 bool venc_set_inband_video_header(OMX_BOOL enable); 390 bool venc_set_au_delimiter(OMX_BOOL enable); 391 bool venc_set_hier_layers(QOMX_VIDEO_HIERARCHICALCODINGTYPE type, OMX_U32 num_layers); 392 bool venc_set_perf_level(QOMX_VIDEO_PERF_LEVEL ePerfLevel); 393 bool venc_set_vui_timing_info(OMX_BOOL enable); 394 bool venc_set_peak_bitrate(OMX_U32 nPeakBitrate); 395 bool venc_set_searchrange(); 396 bool venc_set_vpx_error_resilience(OMX_BOOL enable); 397 bool venc_set_perf_mode(OMX_U32 mode); 398 bool venc_set_hybrid_hierp(OMX_U32 layers); 399 bool venc_calibrate_gop(); 400 bool venc_validate_hybridhp_params(OMX_U32 layers, OMX_U32 bFrames, OMX_U32 count, int mode); 401 bool venc_set_session_priority(OMX_U32 priority); 402 bool venc_set_operatingrate(OMX_U32 rate); 403 404 #ifdef MAX_RES_1080P 405 OMX_U32 pmem_free(); 406 OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count); 407 OMX_U32 venc_allocate_recon_buffers(); 408 inline int clip2(int x) { 409 x = x -1; 410 x = x | x >> 1; 411 x = x | x >> 2; 412 x = x | x >> 4; 413 x = x | x >> 16; 414 x = x + 1; 415 return x; 416 } 417 #endif 418 int metadatamode; 419 bool streaming[MAX_PORT]; 420 bool extradata; 421 struct extradata_buffer_info extradata_info; 422 423 pthread_mutex_t pause_resume_mlock; 424 pthread_cond_t pause_resume_cond; 425 bool paused; 426 int color_format; 427 bool is_searchrange_set; 428 bool enable_mv_narrow_searchrange; 429 int supported_rc_modes; 430 bool camera_mode_enabled; 431 }; 432 433 enum instance_state { 434 MSM_VIDC_CORE_UNINIT_DONE = 0x0001, 435 MSM_VIDC_CORE_INIT, 436 MSM_VIDC_CORE_INIT_DONE, 437 MSM_VIDC_OPEN, 438 MSM_VIDC_OPEN_DONE, 439 MSM_VIDC_LOAD_RESOURCES, 440 MSM_VIDC_LOAD_RESOURCES_DONE, 441 MSM_VIDC_START, 442 MSM_VIDC_START_DONE, 443 MSM_VIDC_STOP, 444 MSM_VIDC_STOP_DONE, 445 MSM_VIDC_RELEASE_RESOURCES, 446 MSM_VIDC_RELEASE_RESOURCES_DONE, 447 MSM_VIDC_CLOSE, 448 MSM_VIDC_CLOSE_DONE, 449 MSM_VIDC_CORE_UNINIT, 450 }; 451 #endif 452 453