161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/*--------------------------------------------------------------------------
261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCopyright (c) 2010-2013, The Linux Foundation. All rights reserved.
361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanRedistribution and use in source and binary forms, with or without
561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanmodification, are permitted provided that the following conditions are met:
661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Redistributions of source code must retain the above copyright
761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      notice, this list of conditions and the following disclaimer.
861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Redistributions in binary form must reproduce the above copyright
961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      notice, this list of conditions and the following disclaimer in the
1061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      documentation and/or other materials provided with the distribution.
1161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Neither the name of The Linux Foundation nor
1261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      the names of its contributors may be used to endorse or promote
1361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      products derived from this software without specific prior written
1461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      permission.
1561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
2061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
2361a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
2661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan--------------------------------------------------------------------------*/
2861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifndef __OMX_VENC_DEV__
2961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define __OMX_VENC_DEV__
3061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "OMX_Types.h"
3261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "OMX_Core.h"
3361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "OMX_QCOMExtns.h"
3461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "qc_omx_component.h"
3561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "omx_video_common.h"
3661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <linux/msm_vidc_enc.h>
3761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <pthread.h>
3861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <linux/videodev2.h>
3961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <poll.h>
4061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define TIMEOUT 5000
4161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define MAX_RECON_BUFFERS 4
4261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid* async_venc_message_thread (void *);
4461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanclass venc_dev
4661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
4761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    public:
4861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        venc_dev(class omx_venc *venc_class); //constructor
4961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ~venc_dev(); //des
5061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_open(OMX_U32);
5261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        void venc_close();
5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_stop(void);
5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_pause(void);
5561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_start(void);
5661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_flush(unsigned);
5761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef _ANDROID_ICS_
5861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_meta_mode(bool);
5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
6061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_resume(void);
6161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_start_done(void);
6261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        unsigned venc_set_message_thread_id(pthread_t);
6361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_use_buf(void*, unsigned,unsigned);
6461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_free_buf(void*, unsigned);
6561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_empty_buf(void *, void *,unsigned,unsigned);
6661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_fill_buf(void *, void *,unsigned,unsigned);
6761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_get_buf_req(unsigned long *,unsigned long *,
6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                unsigned long *,unsigned long);
7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_buf_req(unsigned long *,unsigned long *,
7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                unsigned long *,unsigned long);
7261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_param(void *,OMX_INDEXTYPE);
7361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_config(void *configData, OMX_INDEXTYPE index);
7461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_get_profile_level(OMX_U32 *eProfile,OMX_U32 *eLevel);
7561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_max_allowed_bitrate_check(OMX_U32 nTargetBitrate);
76f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        bool venc_get_seq_hdr(void *, unsigned, unsigned *);
7761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_loaded_start(void);
7861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_loaded_stop(void);
7961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_loaded_start_done(void);
8061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_loaded_stop_done(void);
818767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        bool venc_get_output_log_flag();
828767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int venc_output_log_buffers(const char *buffer_addr, int buffer_len);
838767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int venc_input_log_buffers(OMX_BUFFERHEADERTYPE *buffer, void* pmem_data_buf, int framelen);
848767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        int venc_extradata_log_buffers(char *buffer_addr);
8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *);
8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 m_nDriver_fd;
8761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool m_profile_set;
8861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool m_level_set;
8961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_mutex_t loaded_start_stop_mlock;
9061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        pthread_cond_t loaded_start_stop_cond;
918767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan        struct venc_debug_cap m_debug;
9261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct recon_buffer {
9461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            unsigned char* virtual_address;
9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int pmem_fd;
9661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int size;
9761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int alignment;
9861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int offset;
9961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef USE_ION
10061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            int ion_device_fd;
10161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct ion_allocation_data alloc_data;
10261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            struct ion_fd_data ion_alloc_fd;
10361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
10461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        };
10561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
10661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        recon_buffer recon_buff[MAX_RECON_BUFFERS];
10761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int recon_buffers_count;
10861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool m_max_allowed_bitrate_check;
10961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int m_eProfile;
11061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int m_eLevel;
11161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int etb_count;
11261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    private:
11361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_basecfg             m_sVenc_cfg;
11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_ratectrlcfg         rate_ctrl;
11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_targetbitrate       bitrate;
11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_intraperiod         intra_period;
11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_profile             codec_profile;
11861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct ven_profilelevel         profile_level;
11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_switch              set_param;
12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_voptimingcfg        time_inc;
12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_allocatorproperty   m_sInput_buff_property;
12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_allocatorproperty   m_sOutput_buff_property;
12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_sessionqp           session_qp;
12461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_qprange             qp_range;
12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_multiclicecfg       multislice;
12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_entropycfg          entropy;
12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_dbcfg               dbkfilter;
12861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_intrarefresh        intra_refresh;
12961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_headerextension     hec;
13061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_voptimingcfg        voptimecfg;
13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_seqheader           seqhdr;
13261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_ltrmode             ltrmode;
13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_ltrcount            ltrcount;
13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        struct venc_ltrperiod           ltrperiod;
13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_profile_level(OMX_U32 eProfile,OMX_U32 eLevel);
13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_intra_period(OMX_U32 nPFrames, OMX_U32 nBFrames);
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_target_bitrate(OMX_U32 nTargetBitrate, OMX_U32 config);
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_ratectrl_cfg(OMX_VIDEO_CONTROLRATETYPE eControlRate);
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_qp_range(OMX_U32 min_qp, OMX_U32 max_qp);
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_session_qp(OMX_U32 i_frame_qp, OMX_U32 p_frame_qp);
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_extradata(OMX_U32 extra_data);
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_encode_framerate(OMX_U32 encode_framerate, OMX_U32 config);
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_intra_vop_refresh(OMX_BOOL intra_vop_refresh);
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_color_format(OMX_COLOR_FORMATTYPE color_format);
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_validate_profile_level(OMX_U32 *eProfile, OMX_U32 *eLevel);
14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_multislice_cfg(OMX_INDEXTYPE codec, OMX_U32 slicesize);
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_entropy_config(OMX_BOOL enable, OMX_U32 i_cabac_level);
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_inloop_filter(OMX_VIDEO_AVCLOOPFILTERTYPE loop_filter);
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_intra_refresh (OMX_VIDEO_INTRAREFRESHTYPE intrarefresh, OMX_U32 nMBs);
15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_error_resilience(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE* error_resilience);
15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_voptiming_cfg(OMX_U32 nTimeIncRes);
15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        void venc_config_print();
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_slice_delivery_mode(OMX_BOOL enable);
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_plusptype(OMX_BOOL enable);
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_ltrmode(QOMX_VIDEO_LTRMODETYPE mode);
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_ltrcount(OMX_U32 count);
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_ltrperiod(OMX_U32 period);
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bool venc_set_ltruse(OMX_U32 id, OMX_U32 frames);
160c66f61266df4158140e76c2fab3946dad764eee8Praveen Chavan        bool venc_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width, OMX_U32 height);
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#ifdef MAX_RES_1080P
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 pmem_free();
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 pmem_allocate(OMX_U32 size, OMX_U32 alignment, OMX_U32 count);
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        OMX_U32 venc_allocate_recon_buffers();
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        inline int clip2(int x) {
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x -1;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x | x >> 1;
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x | x >> 2;
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x | x >> 4;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x | x >> 16;
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            x = x + 1;
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            return x;
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        }
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
17561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan};
17661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#endif
178