Home | History | Annotate | Download | only in inc
      1 /*--------------------------------------------------------------------------
      2 Copyright (c) 2012-2013, 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 
     45 
     46 struct msm_venc_switch {
     47     unsigned char    status;
     48 };
     49 
     50 struct msm_venc_allocatorproperty {
     51     unsigned long     mincount;
     52     unsigned long     actualcount;
     53     unsigned long     datasize;
     54     unsigned long     suffixsize;
     55     unsigned long     alignment;
     56     unsigned long     bufpoolid;
     57 };
     58 
     59 struct msm_venc_basecfg {
     60     unsigned long    input_width;
     61     unsigned long    input_height;
     62     unsigned long    dvs_width;
     63     unsigned long    dvs_height;
     64     unsigned long    codectype;
     65     unsigned long    fps_num;
     66     unsigned long    fps_den;
     67     unsigned long    targetbitrate;
     68     unsigned long    inputformat;
     69 };
     70 
     71 struct msm_venc_profile {
     72     unsigned long    profile;
     73 };
     74 struct msm_venc_profilelevel {
     75     unsigned long    level;
     76 };
     77 
     78 struct msm_venc_sessionqp {
     79     unsigned long    iframeqp;
     80     unsigned long    pframqp;
     81     unsigned long    bframqp;
     82 };
     83 
     84 struct msm_venc_qprange {
     85     unsigned long    maxqp;
     86     unsigned long    minqp;
     87 };
     88 struct msm_venc_intraperiod {
     89     unsigned long    num_pframes;
     90     unsigned long    num_bframes;
     91 };
     92 struct msm_venc_seqheader {
     93     unsigned char *hdrbufptr;
     94     unsigned long    bufsize;
     95     unsigned long    hdrlen;
     96 };
     97 
     98 struct msm_venc_capability {
     99     unsigned long    codec_types;
    100     unsigned long    maxframe_width;
    101     unsigned long    maxframe_height;
    102     unsigned long    maxtarget_bitrate;
    103     unsigned long    maxframe_rate;
    104     unsigned long    input_formats;
    105     unsigned char    dvs;
    106 };
    107 
    108 struct msm_venc_entropycfg {
    109     unsigned longentropysel;
    110     unsigned long    cabacmodel;
    111 };
    112 
    113 struct msm_venc_dbcfg {
    114     unsigned long    db_mode;
    115     unsigned long    slicealpha_offset;
    116     unsigned long    slicebeta_offset;
    117 };
    118 
    119 struct msm_venc_intrarefresh {
    120     unsigned long    irmode;
    121     unsigned long    mbcount;
    122 };
    123 
    124 struct msm_venc_multiclicecfg {
    125     unsigned long    mslice_mode;
    126     unsigned long    mslice_size;
    127 };
    128 
    129 struct msm_venc_bufferflush {
    130     unsigned long    flush_mode;
    131 };
    132 
    133 struct msm_venc_ratectrlcfg {
    134     unsigned long    rcmode;
    135 };
    136 
    137 struct    msm_venc_voptimingcfg {
    138     unsigned long    voptime_resolution;
    139 };
    140 struct msm_venc_framerate {
    141     unsigned long    fps_denominator;
    142     unsigned long    fps_numerator;
    143 };
    144 
    145 struct msm_venc_targetbitrate {
    146     unsigned long    target_bitrate;
    147 };
    148 
    149 
    150 struct msm_venc_rotation {
    151     unsigned long    rotation;
    152 };
    153 
    154 struct msm_venc_timeout {
    155     unsigned long    millisec;
    156 };
    157 
    158 struct msm_venc_headerextension {
    159     unsigned long    header_extension;
    160 };
    161 
    162 struct msm_venc_video_capability {
    163     unsigned int min_width;
    164     unsigned int max_width;
    165     unsigned int min_height;
    166     unsigned int max_height;
    167 };
    168 
    169 struct msm_venc_idrperiod {
    170     unsigned long idrperiod;
    171 };
    172 
    173 struct msm_venc_slice_delivery {
    174     unsigned long enable;
    175 };
    176 
    177 enum v4l2_ports {
    178     CAPTURE_PORT,
    179     OUTPUT_PORT,
    180     MAX_PORT
    181 };
    182 
    183 struct extradata_buffer_info {
    184     int buffer_size;
    185     char* uaddr;
    186     int count;
    187     int size;
    188     int allocated;
    189 #ifdef USE_ION
    190     struct venc_ion ion;
    191 #endif
    192 };
    193 
    194 class venc_dev
    195 {
    196     public:
    197         venc_dev(class omx_venc *venc_class); //constructor
    198         ~venc_dev(); //des
    199 
    200         static void* async_venc_message_thread (void *);
    201         bool venc_open(OMX_U32);
    202         void venc_close();
    203         unsigned venc_stop(void);
    204         unsigned venc_pause(void);
    205         unsigned venc_start(void);
    206         unsigned venc_flush(unsigned);
    207 #ifdef _ANDROID_ICS_
    208         bool venc_set_meta_mode(bool);
    209 #endif
    210         unsigned venc_resume(void);
    211         unsigned venc_start_done(void);
    212         unsigned venc_stop_done(void);
    213         unsigned venc_set_message_thread_id(pthread_t);
    214         bool venc_use_buf(void*, unsigned,unsigned);
    215         bool venc_free_buf(void*, unsigned);
    216         bool venc_empty_buf(void *, void *,unsigned,unsigned);
    217         bool venc_fill_buf(void *, void *,unsigned,unsigned);
    218 
    219         bool venc_get_buf_req(unsigned long *,unsigned long *,
    220                 unsigned long *,unsigned long);
    221         bool venc_set_buf_req(unsigned long *,unsigned long *,
    222                 unsigned long *,unsigned long);
    223         bool venc_set_param(void *,OMX_INDEXTYPE);
    224         bool venc_set_config(void *configData, OMX_INDEXTYPE index);
    225         bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
    226         bool venc_get_seq_hdr(void *, unsigned, unsigned *);
    227         bool venc_loaded_start(void);
    228         bool venc_loaded_stop(void);
    229         bool venc_loaded_start_done(void);
    230         bool venc_loaded_stop_done(void);
    231         bool venc_is_video_session_supported(unsigned long width, unsigned long height);
    232         bool venc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
    233                         OMX_U32 height);
    234 
    235         OMX_U32 m_nDriver_fd;
    236         bool m_profile_set;
    237         bool m_level_set;
    238         int num_planes;
    239         int etb, ebd, ftb, fbd;
    240         struct recon_buffer {
    241             unsigned char* virtual_address;
    242             int pmem_fd;
    243             int size;
    244             int alignment;
    245             int offset;
    246 #ifdef USE_ION
    247             int ion_device_fd;
    248             struct ion_allocation_data alloc_data;
    249             struct ion_fd_data ion_alloc_fd;
    250 #endif
    251         };
    252 
    253         int stopped;
    254         int resume_in_stopped;
    255         bool m_max_allowed_bitrate_check;
    256         pthread_t m_tid;
    257         bool async_thread_created;
    258         class omx_venc *venc_handle;
    259         OMX_ERRORTYPE allocate_extradata();
    260         void free_extradata();
    261         bool handle_extradata(void *, int);
    262         int venc_set_format(int);
    263     private:
    264         struct msm_venc_basecfg             m_sVenc_cfg;
    265         struct msm_venc_ratectrlcfg         rate_ctrl;
    266         struct msm_venc_targetbitrate       bitrate;
    267         struct msm_venc_intraperiod         intra_period;
    268         struct msm_venc_profile             codec_profile;
    269         struct msm_venc_profilelevel        profile_level;
    270         struct msm_venc_switch              set_param;
    271         struct msm_venc_voptimingcfg        time_inc;
    272         struct msm_venc_allocatorproperty   m_sInput_buff_property;
    273         struct msm_venc_allocatorproperty   m_sOutput_buff_property;
    274         struct msm_venc_sessionqp           session_qp;
    275         struct msm_venc_multiclicecfg       multislice;
    276         struct msm_venc_entropycfg          entropy;
    277         struct msm_venc_dbcfg               dbkfilter;
    278         struct msm_venc_intrarefresh        intra_refresh;
    279         struct msm_venc_headerextension     hec;
    280         struct msm_venc_voptimingcfg        voptimecfg;
    281         struct msm_venc_video_capability    capability;
    282         struct msm_venc_idrperiod           idrperiod;
    283         struct msm_venc_slice_delivery      slice_mode;
    284 
    285         bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
    286         bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
    287         bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
    288         bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
    289         bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp,OMX_U32 b_frame_qp);
    290         bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
    291         bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
    292         bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
    293         bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
    294         bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
    295         bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
    296         bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
    297         bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
    298         bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
    299         bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
    300         void venc_config_print();
    301         bool venc_set_slice_delivery_mode(OMX_U32 enable);
    302         bool venc_set_extradata(OMX_U32 extra_data);
    303         bool venc_set_idr_period(OMX_U32 nPFrames, OMX_U32 nIDRPeriod);
    304         bool venc_reconfig_reqbufs();
    305 
    306 #ifdef MAX_RES_1080P
    307         OMX_U32 pmem_free();
    308         OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
    309         OMX_U32 venc_allocate_recon_buffers();
    310         inline int clip2(int x) {
    311             x = x -1;
    312             x = x | x >> 1;
    313             x = x | x >> 2;
    314             x = x | x >> 4;
    315             x = x | x >> 16;
    316             x = x + 1;
    317             return x;
    318         }
    319 #endif
    320         int metadatamode;
    321         bool streaming[MAX_PORT];
    322         bool extradata;
    323         struct extradata_buffer_info extradata_info;
    324 
    325         pthread_mutex_t pause_resume_mlock;
    326         pthread_cond_t pause_resume_cond;
    327         bool paused;
    328         int color_format;
    329 };
    330 
    331 enum instance_state {
    332     MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
    333     MSM_VIDC_CORE_INIT,
    334     MSM_VIDC_CORE_INIT_DONE,
    335     MSM_VIDC_OPEN,
    336     MSM_VIDC_OPEN_DONE,
    337     MSM_VIDC_LOAD_RESOURCES,
    338     MSM_VIDC_LOAD_RESOURCES_DONE,
    339     MSM_VIDC_START,
    340     MSM_VIDC_START_DONE,
    341     MSM_VIDC_STOP,
    342     MSM_VIDC_STOP_DONE,
    343     MSM_VIDC_RELEASE_RESOURCES,
    344     MSM_VIDC_RELEASE_RESOURCES_DONE,
    345     MSM_VIDC_CLOSE,
    346     MSM_VIDC_CLOSE_DONE,
    347     MSM_VIDC_CORE_UNINIT,
    348 };
    349 #endif
    350 
    351