1/*--------------------------------------------------------------------------
2Copyright (c) 2010,2014 The Linux Foundation. All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are met:
6    * Redistributions of source code must retain the above copyright
7      notice, this list of conditions and the following disclaimer.
8    * Redistributions in binary form must reproduce the above copyright
9      notice, this list of conditions and the following disclaimer in the
10      documentation and/or other materials provided with the distribution.
11    * Neither the name of The Linux Foundation nor
12      the names of its contributors may be used to endorse or promote
13      products derived from this software without specific prior written
14      permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27--------------------------------------------------------------------------*/
28#ifndef _EVRC_ENC_H_
29#define _EVRC_ENC_H_
30/*============================================================================
31                    Audio Encoder
32
33@file omx_evrc_aenc.h
34This module contains the class definition for openMAX encoder component.
35
36
37
38============================================================================*/
39
40//////////////////////////////////////////////////////////////////////////////
41//                             Include Files
42//////////////////////////////////////////////////////////////////////////////
43
44/* Uncomment out below line #define LOG_NDEBUG 0 if we want to see
45 *  all DEBUG_PRINT or LOGV messaging */
46#include<stdlib.h>
47#include <stdio.h>
48#include <pthread.h>
49#include <time.h>
50#include <inttypes.h>
51#include <unistd.h>
52#include "QOMX_AudioExtensions.h"
53#include "QOMX_AudioIndexExtensions.h"
54#include "OMX_Core.h"
55#include "OMX_Audio.h"
56#include "aenc_svr.h"
57#include "qc_omx_component.h"
58#include "Map.h"
59#include <semaphore.h>
60#include <linux/msm_audio.h>
61#include <linux/msm_audio_qcp.h>
62extern "C" {
63    void * get_omx_component_factory_fn(void);
64}
65
66
67//////////////////////////////////////////////////////////////////////////////
68//                       Module specific globals
69//////////////////////////////////////////////////////////////////////////////
70
71
72
73#define OMX_SPEC_VERSION  0x00000101
74#define MIN(x,y) (((x) < (y)) ? (x) : (y))
75#define MAX(x,y) (x >= y?x:y)
76
77//////////////////////////////////////////////////////////////////////////////
78//               Macros
79//////////////////////////////////////////////////////////////////////////////
80//
81
82
83#define PrintFrameHdr(i,bufHdr) \
84                           DEBUG_PRINT("i=%d OMX bufHdr[%p]buf[%p]size[%d]TS[%lld]nFlags[0x%x]\n",\
85                           i,\
86                           bufHdr,                                     \
87                           ((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,   \
88                           (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
89                           ((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp, \
90                           (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFlags)
91
92
93// BitMask Management logic
94#define BITS_PER_BYTE 8
95#define BITMASK_SIZE(mIndex) \
96            (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
97#define BITMASK_OFFSET(mIndex)\
98            ((mIndex)/BITS_PER_BYTE)
99#define BITMASK_FLAG(mIndex) \
100            (1 << ((mIndex) % BITS_PER_BYTE))
101#define BITMASK_CLEAR(mArray,mIndex)\
102            (mArray)[BITMASK_OFFSET(mIndex)] &=  ~(BITMASK_FLAG(mIndex))
103#define BITMASK_SET(mArray,mIndex)\
104            (mArray)[BITMASK_OFFSET(mIndex)] |=  BITMASK_FLAG(mIndex)
105#define BITMASK_PRESENT(mArray,mIndex)\
106            ((mArray)[BITMASK_OFFSET(mIndex)] & BITMASK_FLAG(mIndex))
107#define BITMASK_ABSENT(mArray,mIndex)\
108            (((mArray)[BITMASK_OFFSET(mIndex)] & \
109            BITMASK_FLAG(mIndex)) == 0x0)
110
111#define OMX_CORE_NUM_INPUT_BUFFERS    2
112#define OMX_CORE_NUM_OUTPUT_BUFFERS   16
113
114#define OMX_CORE_INPUT_BUFFER_SIZE    8160 // Multiple of 160
115#define OMX_CORE_CONTROL_CMDQ_SIZE   100
116#define OMX_AENC_VOLUME_STEP         0x147
117#define OMX_AENC_MIN                 0
118#define OMX_AENC_MAX                 100
119#define NON_TUNNEL                   1
120#define TUNNEL                       0
121#define IP_PORT_BITMASK                 0x02
122#define OP_PORT_BITMASK                 0x01
123#define IP_OP_PORT_BITMASK              0x03
124
125#define OMX_EVRC_DEFAULT_SF            8000
126#define OMX_EVRC_DEFAULT_CH_CFG        1
127#define OMX_EVRC_DEFAULT_VOL         25
128// 14 bytes for input meta data
129#define OMX_AENC_SIZEOF_META_BUF     (OMX_CORE_INPUT_BUFFER_SIZE+14)
130
131#define TRUE 1
132#define FALSE 0
133
134#define NUMOFFRAMES                   1
135#define MAXFRAMELENGTH                25
136#define OMX_EVRC_OUTPUT_BUFFER_SIZE    ((NUMOFFRAMES * (sizeof(ENC_META_OUT) + MAXFRAMELENGTH) \
137                        + 1))
138
139#define OMX_EVRC_DEFAULT_MINRATE 4
140#define OMX_EVRC_DEFAULT_MAXRATE 4
141
142class omx_evrc_aenc;
143
144// OMX EVRC audio encoder class
145class omx_evrc_aenc: public qc_omx_component
146{
147public:
148    omx_evrc_aenc();                             // constructor
149    virtual ~omx_evrc_aenc();                    // destructor
150
151    OMX_ERRORTYPE allocate_buffer(OMX_HANDLETYPE             hComp,
152                                  OMX_BUFFERHEADERTYPE **bufferHdr,
153                                  OMX_U32                     port,
154                                  OMX_PTR                  appData,
155                                  OMX_U32                    bytes);
156
157
158    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
159
160    OMX_ERRORTYPE component_init(OMX_STRING role);
161
162    OMX_ERRORTYPE component_role_enum(OMX_HANDLETYPE hComp,
163                                      OMX_U8         *role,
164                                      OMX_U32        index);
165
166    OMX_ERRORTYPE component_tunnel_request(OMX_HANDLETYPE             hComp,
167                                           OMX_U32                     port,
168                                           OMX_HANDLETYPE     peerComponent,
169                                           OMX_U32                 peerPort,
170                                           OMX_TUNNELSETUPTYPE *tunnelSetup);
171
172    OMX_ERRORTYPE empty_this_buffer(OMX_HANDLETYPE         hComp,
173                                    OMX_BUFFERHEADERTYPE *buffer);
174
175
176    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE         hComp,
177                                          OMX_BUFFERHEADERTYPE *buffer);
178
179
180    OMX_ERRORTYPE fill_this_buffer(OMX_HANDLETYPE         hComp,
181                                   OMX_BUFFERHEADERTYPE *buffer);
182
183
184    OMX_ERRORTYPE free_buffer(OMX_HANDLETYPE         hComp,
185                              OMX_U32                 port,
186                              OMX_BUFFERHEADERTYPE *buffer);
187
188    OMX_ERRORTYPE get_component_version(OMX_HANDLETYPE              hComp,
189                                        OMX_STRING          componentName,
190                                        OMX_VERSIONTYPE *componentVersion,
191                                        OMX_VERSIONTYPE *     specVersion,
192                                        OMX_UUIDTYPE       *componentUUID);
193
194    OMX_ERRORTYPE get_config(OMX_HANDLETYPE      hComp,
195                             OMX_INDEXTYPE configIndex,
196                             OMX_PTR        configData);
197
198    OMX_ERRORTYPE get_extension_index(OMX_HANDLETYPE     hComp,
199                                      OMX_STRING     paramName,
200                                      OMX_INDEXTYPE *indexType);
201
202    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
203                                OMX_INDEXTYPE paramIndex,
204                                OMX_PTR paramData);
205
206    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
207                            OMX_STATETYPE *state);
208
209    static void process_in_port_msg(void          *client_data,
210                                    unsigned char id);
211
212    static void process_out_port_msg(void          *client_data,
213                                     unsigned char id);
214
215    static void process_command_msg(void          *client_data,
216                                    unsigned char id);
217
218    static void process_event_cb(void          *client_data,
219                                   unsigned char id);
220
221
222    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp,
223                                OMX_CALLBACKTYPE *callbacks,
224                                OMX_PTR appData);
225
226    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
227                             OMX_INDEXTYPE configIndex,
228                             OMX_PTR configData);
229
230    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
231                                OMX_INDEXTYPE paramIndex,
232                                OMX_PTR paramData);
233
234    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE             hComp,
235                             OMX_BUFFERHEADERTYPE **bufferHdr,
236                             OMX_U32                     port,
237                             OMX_PTR                  appData,
238                             OMX_U32                    bytes,
239                             OMX_U8                  *buffer);
240
241    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE             hComp,
242                                OMX_BUFFERHEADERTYPE **bufferHdr,
243                                OMX_U32                     port,
244                                OMX_PTR                  appData,
245                                void *                  eglImage);
246
247    bool post_command(unsigned int p1, unsigned int p2,
248        unsigned char id);
249
250    // Deferred callback identifiers
251    enum
252    {
253        //Event Callbacks from the component thread context
254        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
255        //Buffer Done callbacks from component thread context
256        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
257        OMX_COMPONENT_GENERATE_ETB         = 0x3,
258        //Command
259        OMX_COMPONENT_GENERATE_COMMAND     = 0x4,
260        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x05,
261        OMX_COMPONENT_GENERATE_FTB         = 0x06,
262        OMX_COMPONENT_GENERATE_EOS         = 0x07,
263        OMX_COMPONENT_PORTSETTINGS_CHANGED = 0x08,
264        OMX_COMPONENT_SUSPEND              = 0x09,
265        OMX_COMPONENT_RESUME               = 0x0a
266    };
267private:
268
269    ///////////////////////////////////////////////////////////
270    // Type definitions
271    ///////////////////////////////////////////////////////////
272    // Bit Positions
273    enum flags_bit_positions
274    {
275        // Defer transition to IDLE
276        OMX_COMPONENT_IDLE_PENDING            =0x1,
277        // Defer transition to LOADING
278        OMX_COMPONENT_LOADING_PENDING         =0x2,
279
280        OMX_COMPONENT_MUTED                   =0x3,
281
282        // Defer transition to Enable
283        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x4,
284        // Defer transition to Enable
285        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x5,
286        // Defer transition to Disable
287        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x6,
288        // Defer transition to Disable
289        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x7
290    };
291
292
293    typedef Map<OMX_BUFFERHEADERTYPE*, OMX_BUFFERHEADERTYPE*>
294    input_buffer_map;
295
296    typedef Map<OMX_BUFFERHEADERTYPE*, OMX_BUFFERHEADERTYPE*>
297    output_buffer_map;
298
299    enum port_indexes
300    {
301        OMX_CORE_INPUT_PORT_INDEX        =0,
302        OMX_CORE_OUTPUT_PORT_INDEX       =1
303    };
304
305    struct omx_event
306    {
307        unsigned long param1;
308        unsigned long param2;
309        unsigned char id;
310    };
311
312    struct omx_cmd_queue
313    {
314        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
315        unsigned m_read;
316        unsigned m_write;
317        unsigned m_size;
318
319        omx_cmd_queue();
320        ~omx_cmd_queue();
321        bool insert_entry(unsigned long p1, unsigned long p2, unsigned char id);
322        bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned char *id);
323        bool get_msg_id(unsigned char *id);
324        bool get_msg_with_id(unsigned *p1,unsigned *p2, unsigned char id);
325    };
326
327    typedef struct TIMESTAMP
328    {
329        unsigned int LowPart;
330        unsigned int HighPart;
331    }__attribute__((packed)) TIMESTAMP;
332
333    typedef struct metadata_input
334    {
335        unsigned short   offsetVal;
336        TIMESTAMP      nTimeStamp;
337        unsigned int   nFlags;
338    }__attribute__((packed)) META_IN;
339
340    typedef struct enc_meta_out
341    {
342        unsigned int offset_to_frame;
343        unsigned int frame_size;
344        unsigned int encoded_pcm_samples;
345        unsigned int msw_ts;
346        unsigned int lsw_ts;
347        unsigned int nflags;
348    } __attribute__ ((packed))ENC_META_OUT;
349
350    typedef struct
351    {
352        OMX_U32 tot_in_buf_len;
353        OMX_U32 tot_out_buf_len;
354        OMX_TICKS tot_pb_time;
355        OMX_U32 fbd_cnt;
356        OMX_U32 ftb_cnt;
357        OMX_U32 etb_cnt;
358        OMX_U32 ebd_cnt;
359    }EVRC_PB_STATS;
360
361    ///////////////////////////////////////////////////////////
362    // Member variables
363    ///////////////////////////////////////////////////////////
364    OMX_U8                         *m_tmp_meta_buf;
365    OMX_U8                         *m_tmp_out_meta_buf;
366    OMX_U8                         m_flush_cnt ;
367    OMX_U8                         m_comp_deinit;
368
369    // the below var doesnt hold good if combo of use and alloc bufs are used
370    OMX_S32                        m_volume;//Unit to be determined
371    OMX_PTR                        m_app_data;// Application data
372    int                            nNumInputBuf;
373    int                            nNumOutputBuf;
374    int                            m_drv_fd;   // Kernel device node file handle
375    bool                           bFlushinprogress;
376    bool                           is_in_th_sleep;
377    bool                           is_out_th_sleep;
378    unsigned int                   m_flags;      //encapsulate the waiting states.
379    OMX_TICKS                      nTimestamp;
380    unsigned int                   pcm_input; //tunnel or non-tunnel
381    unsigned int                   m_inp_act_buf_count;    // Num of Input Buffers
382    unsigned int                   m_out_act_buf_count;    // Numb of Output Buffers
383    unsigned int                   m_inp_current_buf_count;    // Num of Input Buffers
384    unsigned int                   m_out_current_buf_count;    // Numb of Output Buffers
385    unsigned int                   output_buffer_size;
386    unsigned int                   input_buffer_size;
387    unsigned short                 m_session_id;
388    // store I/P PORT state
389    OMX_BOOL                       m_inp_bEnabled;
390    // store O/P PORT state
391    OMX_BOOL                       m_out_bEnabled;
392    //Input port Populated
393    OMX_BOOL                       m_inp_bPopulated;
394    //Output port Populated
395    OMX_BOOL                       m_out_bPopulated;
396    sem_t                          sem_States;
397    sem_t                          sem_read_msg;
398    sem_t                          sem_write_msg;
399
400    volatile int                   m_is_event_done;
401    volatile int                   m_is_in_th_sleep;
402    volatile int                   m_is_out_th_sleep;
403    input_buffer_map               m_input_buf_hdrs;
404    output_buffer_map              m_output_buf_hdrs;
405    omx_cmd_queue                  m_input_q;
406    omx_cmd_queue                  m_input_ctrl_cmd_q;
407    omx_cmd_queue                  m_input_ctrl_ebd_q;
408    omx_cmd_queue                  m_command_q;
409    omx_cmd_queue                  m_output_q;
410    omx_cmd_queue                  m_output_ctrl_cmd_q;
411    omx_cmd_queue                  m_output_ctrl_fbd_q;
412    pthread_mutexattr_t            m_outputlock_attr;
413    pthread_mutexattr_t            m_commandlock_attr;
414    pthread_mutexattr_t            m_lock_attr;
415    pthread_mutexattr_t            m_state_attr;
416    pthread_mutexattr_t            m_flush_attr;
417    pthread_mutexattr_t            m_in_th_attr_1;
418    pthread_mutexattr_t            m_out_th_attr_1;
419    pthread_mutexattr_t            m_event_attr;
420    pthread_mutexattr_t            m_in_th_attr;
421    pthread_mutexattr_t            m_out_th_attr;
422    pthread_mutexattr_t            out_buf_count_lock_attr;
423    pthread_mutexattr_t            in_buf_count_lock_attr;
424    pthread_cond_t                 cond;
425    pthread_cond_t                 in_cond;
426    pthread_cond_t                 out_cond;
427    pthread_mutex_t                m_lock;
428    pthread_mutex_t                m_commandlock;
429    pthread_mutex_t                m_outputlock;
430    // Mutexes for state change
431    pthread_mutex_t                m_state_lock;
432    // Mutexes for  flush acks from input and output threads
433    pthread_mutex_t                m_flush_lock;
434    pthread_mutex_t                m_event_lock;
435    pthread_mutex_t                m_in_th_lock;
436    pthread_mutex_t                m_out_th_lock;
437    pthread_mutex_t                m_in_th_lock_1;
438    pthread_mutex_t                m_out_th_lock_1;
439    pthread_mutex_t                out_buf_count_lock;
440    pthread_mutex_t                in_buf_count_lock;
441
442    OMX_STATETYPE                  m_state;      // OMX State
443    OMX_STATETYPE                  nState;
444    OMX_CALLBACKTYPE               m_cb;         // Application callbacks
445    EVRC_PB_STATS                  m_evrc_pb_stats;
446    struct evrc_ipc_info           *m_ipc_to_in_th;    // for input thread
447    struct evrc_ipc_info           *m_ipc_to_out_th;    // for output thread
448    struct evrc_ipc_info           *m_ipc_to_cmd_th;    // for command thread
449    struct evrc_ipc_info          *m_ipc_to_event_th;    //for txco event thread
450    OMX_PRIORITYMGMTTYPE           m_priority_mgm ;
451    OMX_AUDIO_PARAM_EVRCTYPE m_evrc_param; // Cache EVRC encoder parameter
452    OMX_AUDIO_PARAM_PCMMODETYPE    m_pcm_param;  // Cache pcm  parameter
453    OMX_PARAM_COMPONENTROLETYPE    component_Role;
454    OMX_PARAM_BUFFERSUPPLIERTYPE   m_buffer_supplier;
455
456    ///////////////////////////////////////////////////////////
457    // Private methods
458    ///////////////////////////////////////////////////////////
459    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
460                                         OMX_BUFFERHEADERTYPE **bufferHdr,
461                                         OMX_U32 port,OMX_PTR appData,
462                                         OMX_U32              bytes);
463
464    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
465                                        OMX_BUFFERHEADERTYPE **bufferHdr,
466                                        OMX_U32              port,
467                                        OMX_PTR              appData,
468                                        OMX_U32              bytes);
469
470    OMX_ERRORTYPE use_input_buffer(OMX_IN OMX_HANDLETYPE          hComp,
471                                   OMX_INOUT OMX_BUFFERHEADERTYPE **bufHdr,
472                                   OMX_IN OMX_U32                 port,
473                                   OMX_IN OMX_PTR                 appData,
474                                   OMX_IN OMX_U32                 bytes,
475                                   OMX_IN OMX_U8*                 buffer);
476
477    OMX_ERRORTYPE use_output_buffer(OMX_IN OMX_HANDLETYPE          hComp,
478                                    OMX_INOUT OMX_BUFFERHEADERTYPE **bufHdr,
479                                    OMX_IN OMX_U32                 port,
480                                    OMX_IN OMX_PTR                 appData,
481                                    OMX_IN OMX_U32                 bytes,
482                                    OMX_IN OMX_U8*                 buffer);
483
484    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
485                                         OMX_BUFFERHEADERTYPE *buffer);
486
487    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
488                                     OMX_COMMANDTYPE cmd,
489                                     OMX_U32         param1,
490                                     OMX_PTR         cmdData);
491
492    OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp,
493                               OMX_COMMANDTYPE  cmd,
494                               OMX_U32       param1,
495                               OMX_PTR      cmdData);
496
497    bool allocate_done(void);
498
499    bool release_done(OMX_U32         param1);
500
501    bool execute_omx_flush(OMX_IN OMX_U32 param1, bool cmd_cmpl=true);
502
503    bool execute_input_omx_flush(void);
504
505    bool execute_output_omx_flush(void);
506
507    bool search_input_bufhdr(OMX_BUFFERHEADERTYPE *buffer);
508
509    bool search_output_bufhdr(OMX_BUFFERHEADERTYPE *buffer);
510
511    bool post_input(unsigned long p1, unsigned long p2,
512                    unsigned char id);
513
514    bool post_output(unsigned long p1, unsigned long p2,
515                     unsigned char id);
516
517    void process_events(omx_evrc_aenc *client_data);
518
519    void buffer_done_cb(OMX_BUFFERHEADERTYPE *bufHdr);
520
521    void frame_done_cb(OMX_BUFFERHEADERTYPE *bufHdr);
522
523    void wait_for_event();
524
525    void event_complete();
526
527    void in_th_goto_sleep();
528
529    void in_th_wakeup();
530
531    void out_th_goto_sleep();
532
533    void out_th_wakeup();
534
535    void flush_ack();
536    void deinit_encoder();
537
538};
539#endif
540