diff options
author | Aniket Kumar Lata <alata@codeaurora.org> | 2017-03-01 19:51:23 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-05 02:40:09 -0700 |
commit | 2ce1027d13f23e34d6528968e94d6af876dc009c (patch) | |
tree | 70d755520e41f8e1e0291b036ea4580e4e8b55f3 /mm-audio | |
parent | 653aaefa4f0a3b503976aa6f0bfd59a8cacfea42 (diff) | |
download | android_hardware_qcom_audio-2ce1027d13f23e34d6528968e94d6af876dc009c.tar.gz android_hardware_qcom_audio-2ce1027d13f23e34d6528968e94d6af876dc009c.tar.bz2 android_hardware_qcom_audio-2ce1027d13f23e34d6528968e94d6af876dc009c.zip |
hal: audio-test: Move omx tests mm-audio-internal
Moving omx test applications for encoders and decoders to
mm-audio-internal.
CRs-Fixed: 2014832
Change-Id: I8df3703dc84f7f277258b036bd6df87946af6efb
Diffstat (limited to 'mm-audio')
-rw-r--r-- | mm-audio/aenc-aac/qdsp6/Android.mk | 23 | ||||
-rw-r--r-- | mm-audio/aenc-aac/qdsp6/Makefile | 17 | ||||
-rw-r--r-- | mm-audio/aenc-aac/qdsp6/Makefile.am | 4 | ||||
-rw-r--r-- | mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c | 1295 | ||||
-rw-r--r-- | mm-audio/aenc-amrnb/qdsp6/Android.mk | 23 | ||||
-rw-r--r-- | mm-audio/aenc-amrnb/qdsp6/Makefile | 17 | ||||
-rw-r--r-- | mm-audio/aenc-amrnb/qdsp6/Makefile.am | 8 | ||||
-rw-r--r-- | mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c | 1093 | ||||
-rw-r--r-- | mm-audio/aenc-evrc/qdsp6/Android.mk | 22 | ||||
-rw-r--r-- | mm-audio/aenc-evrc/qdsp6/Makefile | 17 | ||||
-rw-r--r-- | mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c | 1098 | ||||
-rw-r--r-- | mm-audio/aenc-g711/qdsp6/Android.mk | 22 | ||||
-rw-r--r-- | mm-audio/aenc-g711/qdsp6/Makefile | 15 | ||||
-rw-r--r-- | mm-audio/aenc-g711/qdsp6/Makefile.am | 5 | ||||
-rw-r--r-- | mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c | 1026 | ||||
-rw-r--r-- | mm-audio/aenc-qcelp13/qdsp6/Android.mk | 24 | ||||
-rw-r--r-- | mm-audio/aenc-qcelp13/qdsp6/Makefile | 17 | ||||
-rw-r--r-- | mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c | 1101 |
18 files changed, 9 insertions, 5818 deletions
diff --git a/mm-audio/aenc-aac/qdsp6/Android.mk b/mm-audio/aenc-aac/qdsp6/Android.mk index d55733a3..acc1fdbf 100644 --- a/mm-audio/aenc-aac/qdsp6/Android.mk +++ b/mm-audio/aenc-aac/qdsp6/Android.mk @@ -40,29 +40,6 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) -# --------------------------------------------------------------------------------- -# Make the apps-test (mm-aenc-omxaac-test) -# --------------------------------------------------------------------------------- - -include $(CLEAR_VARS) - -mm-aac-enc-test-inc := $(LOCAL_PATH)/inc -mm-aac-enc-test-inc += $(LOCAL_PATH)/test -mm-aac-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-audio/audio-alsa -mm-aac-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore - -LOCAL_MODULE := mm-aenc-omxaac-test -LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS := $(libOmxAacEnc-def) -LOCAL_C_INCLUDES := $(mm-aac-enc-test-inc) -LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := libmm-omxcore -LOCAL_SHARED_LIBRARIES += libOmxAacEnc -LOCAL_SHARED_LIBRARIES += libaudioalsa -LOCAL_SRC_FILES := test/omx_aac_enc_test.c - -include $(BUILD_EXECUTABLE) - endif # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-aac/qdsp6/Makefile b/mm-audio/aenc-aac/qdsp6/Makefile index 5421d45b..e9da876d 100644 --- a/mm-audio/aenc-aac/qdsp6/Makefile +++ b/mm-audio/aenc-aac/qdsp6/Makefile @@ -39,7 +39,7 @@ BININSTALLDIR := $(DESTDIR)usr/bin # --------------------------------------------------------------------------------- # BUILD # --------------------------------------------------------------------------------- -all: libOmxAacEnc.so.$(LIBVER) mm-aenc-omxaac-test +all: libOmxAacEnc.so.$(LIBVER) install: echo "intalling aenc-aac in $(DESTDIR)" @@ -49,8 +49,7 @@ install: install -m 555 libOmxAacEnc.so.$(LIBVER) $(LIBINSTALLDIR) cd $(LIBINSTALLDIR) && ln -s libOmxAacEnc.so.$(LIBVER) libOmxAacEnc.so.$(LIBMAJOR) cd $(LIBINSTALLDIR) && ln -s libOmxAacEnc.so.$(LIBMAJOR) libOmxAacEnc.so - install -m 555 mm-aenc-omxaac-test $(BININSTALLDIR) - + # --------------------------------------------------------------------------------- # COMPILE LIBRARY # --------------------------------------------------------------------------------- @@ -65,17 +64,5 @@ libOmxAacEnc.so.$(LIBVER): $(SRCS) $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxAacEnc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS) # --------------------------------------------------------------------------------- -# COMPILE TEST APP -# --------------------------------------------------------------------------------- -TEST_LDLIBS := -lpthread -TEST_LDLIBS += -ldl -TEST_LDLIBS += -lOmxCore - -TEST_SRCS := test/omx_aac_enc_test.c - -mm-aenc-omxaac-test: libOmxAacEnc.so.$(LIBVER) $(TEST_SRCS) - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS) - -# --------------------------------------------------------------------------------- # END # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-aac/qdsp6/Makefile.am b/mm-audio/aenc-aac/qdsp6/Makefile.am index cb89ec17..2f63d0a7 100644 --- a/mm-audio/aenc-aac/qdsp6/Makefile.am +++ b/mm-audio/aenc-aac/qdsp6/Makefile.am @@ -26,7 +26,3 @@ libOmxAacEnc_la_CFLAGS = $(AM_CFLAGS) -fPIC $(GLIB_CFLAGS) -include glib.h -Dstr libOmxAacEnc_la_CPPFLAGS = $(AM_CPPFLAGS) -fPIC $(GLIB_CFLAGS) -include glib.h -Dstrlcpy=g_strlcpy libOmxAacEnc_la_LIBADD = -lmm-omxcore -lstdc++ -lpthread $(GLIB_LIBS) -ldl -llog libOmxAacEnc_la_LDFLAGS = -shared $(GLIB_LIBS) -avoid-version $(OMXAUDIO_LIBRARY_VERSION) - -bin_PROGRAMS = mm-aenc-omxaac-test -mm_aenc_omxaac_test_SOURCES = ./test/omx_aac_enc_test.c -mm_aenc_omxaac_test_LDADD = -lmm-omxcore -ldl -lpthread -llog libOmxAacEnc.la diff --git a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c b/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c deleted file mode 100644 index 43c676b5..00000000 --- a/mm-audio/aenc-aac/qdsp6/test/omx_aac_enc_test.c +++ /dev/null @@ -1,1295 +0,0 @@ -/*-------------------------------------------------------------------------- -Copyright (c) 2010-2014,2016 The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of The Linux Foundation nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------*/ - - -/* - An Open max test application .... -*/ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <time.h> -#include <sys/ioctl.h> -#include "OMX_Core.h" -#include "OMX_Component.h" -#include "pthread.h" -#include <signal.h> - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include<unistd.h> -#include<string.h> -#include <pthread.h> -#include "QOMX_AudioExtensions.h" -#include "QOMX_AudioIndexExtensions.h" -#ifdef AUDIOV2 -#include "control.h" -#endif -#include <linux/ioctl.h> - -typedef unsigned char uint8; -typedef unsigned char byte; -typedef unsigned int uint32; -typedef unsigned int uint16; -#define AUDAAC_MAX_ADIF_HEADER_LENGTH 64 -/* ADTS variable frame header, frame length field */ -#define AUDAAC_ADTS_FRAME_LENGTH_SIZE 13 -QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam; -void audaac_rec_install_bits -( - uint8 *input, - byte num_bits_reqd, - uint32 value, - uint16 *hdr_bit_index -); - -/* maximum ADTS frame header length */ -#define AUDAAC_MAX_ADTS_HEADER_LENGTH 7 -void audaac_rec_install_adts_header_variable (uint16 byte_num); -void Release_Encoder(); - -#ifdef AUDIOV2 -unsigned short session_id; -int device_id; -int control = 0; -const char *device="handset_tx"; -#define DIR_TX 2 -#endif - -#define AACHDR_LAYER_SIZE 2 -#define AACHDR_CRC_SIZE 1 -#define AAC_PROFILE_SIZE 2 -#define AAC_SAMPLING_FREQ_INDEX_SIZE 4 -#define AAC_ORIGINAL_COPY_SIZE 1 -#define AAC_HOME_SIZE 1 - -#define MIN(A,B) (((A) < (B))?(A):(B)) - -uint8 audaac_header[AUDAAC_MAX_ADTS_HEADER_LENGTH]; -unsigned int audaac_hdr_bit_index; - - -FILE *F1 = NULL; - -uint32_t aac_samplerate = 0; -uint32_t pcm_samplerate = 0; -uint32_t aac_channels = 0; -uint32_t pcm_channels = 0; -uint32_t bitrate = 128000; -uint32_t pcmplayback = 0; -uint32_t tunnel = 0; -uint32_t rectime = 0; -uint32_t format = 1; -uint32_t profile = OMX_AUDIO_AACObjectLC; -#define DEBUG_PRINT printf -unsigned to_idle_transition = 0; - -typedef enum adts_sample_index__ { - -ADTS_SAMPLE_INDEX_96000=0x0, -ADTS_SAMPLE_INDEX_88200, -ADTS_SAMPLE_INDEX_64000, -ADTS_SAMPLE_INDEX_48000, -ADTS_SAMPLE_INDEX_44100, -ADTS_SAMPLE_INDEX_32000, -ADTS_SAMPLE_INDEX_24000, -ADTS_SAMPLE_INDEX_22050, -ADTS_SAMPLE_INDEX_16000, -ADTS_SAMPLE_INDEX_12000, -ADTS_SAMPLE_INDEX_11025, -ADTS_SAMPLE_INDEX_8000, -ADTS_SAMPLE_INDEX_7350, -ADTS_SAMPLE_INDEX_MAX - -}adts_sample_index; -/************************************************************************/ -/* #DEFINES */ -/************************************************************************/ -#define false 0 -#define true 1 - -#define CONFIG_VERSION_SIZE(param) \ - param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\ - param.nSize = sizeof(param); - -#define FAILED(result) (result != OMX_ErrorNone) - -#define SUCCEEDED(result) (result == OMX_ErrorNone) - -/************************************************************************/ -/* GLOBAL DECLARATIONS */ -/************************************************************************/ - -pthread_mutex_t lock; -pthread_cond_t cond; -pthread_mutex_t elock; -pthread_cond_t econd; -pthread_cond_t fcond; -pthread_mutex_t etb_lock; -pthread_mutex_t etb_lock1; -pthread_cond_t etb_cond; -FILE * inputBufferFile; -FILE * outputBufferFile; -OMX_PARAM_PORTDEFINITIONTYPE inputportFmt; -OMX_PARAM_PORTDEFINITIONTYPE outputportFmt; -OMX_AUDIO_PARAM_AACPROFILETYPE aacparam; -OMX_AUDIO_PARAM_PCMMODETYPE pcmparam; -OMX_PORT_PARAM_TYPE portParam; -OMX_ERRORTYPE error; - - - - -#define ID_RIFF 0x46464952 -#define ID_WAVE 0x45564157 -#define ID_FMT 0x20746d66 -#define ID_DATA 0x61746164 - -#define FORMAT_PCM 1 - -struct wav_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint32_t data_id; - uint32_t data_sz; -}; -struct enc_meta_out{ - unsigned int offset_to_frame; - unsigned int frame_size; - unsigned int encoded_pcm_samples; - unsigned int msw_ts; - unsigned int lsw_ts; - unsigned int nflags; -} __attribute__ ((packed)); - -static int totaldatalen = 0; -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -unsigned int input_buf_cnt = 0; -unsigned int output_buf_cnt = 0; -int used_ip_buf_cnt = 0; -volatile int event_is_done = 0; -volatile int ebd_event_is_done = 0; -volatile int fbd_event_is_done = 0; -volatile int etb_event_is_done = 0; -int ebd_cnt; -int bInputEosReached = 0; -int bOutputEosReached = 0; -int bInputEosReached_tunnel = 0; -static int etb_done = 0; -int bFlushing = false; -int bPause = false; -const char *in_filename; -const char *out_filename; - -int timeStampLfile = 0; -int timestampInterval = 100; - -//* OMX Spec Version supported by the wrappers. Version = 1.1 */ -const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101; -OMX_COMPONENTTYPE* aac_enc_handle = 0; - -OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL; -OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL; - -/************************************************************************/ -/* GLOBAL FUNC DECL */ -/************************************************************************/ -int Init_Encoder(char*); -int Play_Encoder(); -OMX_STRING aud_comp; -/**************************************************************************/ -/* STATIC DECLARATIONS */ -/**************************************************************************/ - -static int open_audio_file (); -static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr ); -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *aac_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize); - - -static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData); -static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); - -static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); -static OMX_ERRORTYPE parse_pcm_header(); -void wait_for_event(void) -{ - pthread_mutex_lock(&lock); - DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done); - while (event_is_done == 0) { - pthread_cond_wait(&cond, &lock); - } - event_is_done = 0; - pthread_mutex_unlock(&lock); -} - -void event_complete(void ) -{ - pthread_mutex_lock(&lock); - if (event_is_done == 0) { - event_is_done = 1; - pthread_cond_broadcast(&cond); - } - pthread_mutex_unlock(&lock); -} - -void etb_wait_for_event(void) -{ - pthread_mutex_lock(&etb_lock1); - DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done); - while (etb_event_is_done == 0) { - pthread_cond_wait(&etb_cond, &etb_lock1); - } - etb_event_is_done = 0; - pthread_mutex_unlock(&etb_lock1); -} - -void etb_event_complete(void ) -{ - pthread_mutex_lock(&etb_lock1); - if (etb_event_is_done == 0) { - etb_event_is_done = 1; - pthread_cond_broadcast(&etb_cond); - } - pthread_mutex_unlock(&etb_lock1); -} - - -OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData) -{ - DEBUG_PRINT("Function %s \n", __FUNCTION__); - /* To remove warning for unused variable to keep prototype same */ - (void)hComponent; - (void)pAppData; - (void)pEventData; - - switch(eEvent) { - case OMX_EventCmdComplete: - DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent, - nData1,nData2); - event_complete(); - break; - case OMX_EventError: - DEBUG_PRINT("\n OMX_EventError \n"); - break; - case OMX_EventBufferFlag: - DEBUG_PRINT("\n OMX_EventBufferFlag \n"); - bOutputEosReached = true; - event_complete(); - break; - case OMX_EventPortSettingsChanged: - DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n"); - break; - default: - DEBUG_PRINT("\n Unknown Event \n"); - break; - } - return OMX_ErrorNone; -} - -OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - size_t bytes_writen = 0; - size_t total_bytes_writen = 0; - size_t len = 0; - struct enc_meta_out *meta = NULL; - OMX_U8 *src = pBuffer->pBuffer; - unsigned int num_of_frames = 1; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - DEBUG_PRINT("FBD::EOS on output port\n "); - bOutputEosReached = true; - return OMX_ErrorNone; - } - if(bInputEosReached_tunnel || bOutputEosReached) - { - DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n"); - return OMX_ErrorNone; - } - if(num_of_frames != src[0]){ - - printf("Data corrupt\n"); - return OMX_ErrorNone; - } - /* Skip the first bytes */ - - - - src += sizeof(unsigned char); - meta = (struct enc_meta_out *)src; - while (num_of_frames > 0) { - meta = (struct enc_meta_out *)src; - /*printf("offset=%d framesize=%d encoded_pcm[%d] msw_ts[%d]lsw_ts[%d] nflags[%d]\n", - meta->offset_to_frame, - meta->frame_size, - meta->encoded_pcm_samples, meta->msw_ts, meta->lsw_ts, meta->nflags);*/ - len = meta->frame_size; - - if(format == 6) - { - audaac_rec_install_adts_header_variable((uint16_t)(len + AUDAAC_MAX_ADTS_HEADER_LENGTH)); - bytes_writen = fwrite(audaac_header,1,AUDAAC_MAX_ADTS_HEADER_LENGTH,outputBufferFile); - if(bytes_writen < AUDAAC_MAX_ADTS_HEADER_LENGTH) - { - DEBUG_PRINT("error: invalid adts header length\n"); - return OMX_ErrorNone; - } - } - bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile); - if(bytes_writen < len) - { - DEBUG_PRINT("error: invalid AAC encoded data \n"); - return OMX_ErrorNone; - } - src += sizeof(struct enc_meta_out); - num_of_frames--; - total_bytes_writen += len; - } - DEBUG_PRINT(" FillBufferDone size writen to file %zu\n",total_bytes_writen); - totaldatalen = totaldatalen + (int)total_bytes_writen; - - DEBUG_PRINT(" FBD calling FTB\n"); - OMX_FillThisBuffer(hComponent,pBuffer); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - int readBytes =0; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - ebd_cnt++; - used_ip_buf_cnt--; - pthread_mutex_lock(&etb_lock); - if(!etb_done) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT("Wait till first set of buffers are given to component\n"); - DEBUG_PRINT("\n*********************************************\n"); - etb_done++; - pthread_mutex_unlock(&etb_lock); - etb_wait_for_event(); - } - else - { - pthread_mutex_unlock(&etb_lock); - } - - - if(bInputEosReached) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT(" EBD::EOS on input port\n "); - DEBUG_PRINT("*********************************************\n"); - return OMX_ErrorNone; - }else if (bFlushing == true) { - DEBUG_PRINT("omx_aac_adec_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - if (used_ip_buf_cnt == 0) { - bFlushing = false; - } else { - DEBUG_PRINT("omx_aac_adec_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - return OMX_ErrorNone; - } - } - - if((readBytes = Read_Buffer(pBuffer)) > 0) { - pBuffer->nFilledLen = (OMX_U32)readBytes; - used_ip_buf_cnt++; - OMX_EmptyThisBuffer(hComponent,pBuffer); - } - else{ - pBuffer->nFlags |= OMX_BUFFERFLAG_EOS; - used_ip_buf_cnt++; - bInputEosReached = true; - pBuffer->nFilledLen = 0; - OMX_EmptyThisBuffer(hComponent,pBuffer); - DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n"); - } - return OMX_ErrorNone; -} - -void signal_handler(int sig_id) { - - /* Flush */ - if (sig_id == SIGUSR1) { - DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__); - bFlushing = true; - OMX_SendCommand(aac_enc_handle, OMX_CommandFlush, OMX_ALL, NULL); - } else if (sig_id == SIGUSR2) { - if (bPause == true) { - DEBUG_PRINT("%s resume playback\n", __FUNCTION__); - bPause = false; - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); - } else { - DEBUG_PRINT("%s pause playback\n", __FUNCTION__); - bPause = true; - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL); - } - } -} - -int main(int argc, char **argv) -{ - unsigned int bufCnt=0; - OMX_ERRORTYPE result; - - struct sigaction sa; - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = &signal_handler; - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - - (void) signal(SIGINT, Release_Encoder); - - pthread_cond_init(&cond, 0); - pthread_mutex_init(&lock, 0); - pthread_cond_init(&etb_cond, 0); - pthread_mutex_init(&etb_lock, 0); - pthread_mutex_init(&etb_lock1, 0); - - if (argc >= 9) { - in_filename = argv[1]; - out_filename = argv[2]; - aac_samplerate = (uint32_t)atoi(argv[3]); - aac_channels = (uint32_t)atoi(argv[4]); - tunnel = (uint32_t)atoi(argv[5]); - rectime = (uint32_t)atoi(argv[6]); - bitrate = (uint32_t)atoi(argv[7]); - format = (uint32_t)atoi(argv[8]); - profile = (uint32_t)atoi(argv[9]); - - DEBUG_PRINT("Input parameters: aac_samplerate = %d, channels = %d, tunnel = %d," - " rectime = %d, bitrate = %d, format = %d, profile = %d\n", - aac_samplerate, aac_channels, tunnel, rectime, bitrate, format, profile); - - if (!((profile == 2) || (profile == 5) || (profile == 29))) { - DEBUG_PRINT("profile = %d, not supported. Supported " - "profile values are AAC_LC(2), AAC+(5), EAAC+(29)\n", profile); - return 0; - } - if (!((format == 1) || (format == 6))) { - DEBUG_PRINT("format = %d, not supported. Supported " - "formats are ADTS(1), RAW(6)\n", format); - return 0; - } - if ((aac_channels > 2) || (aac_channels <= 0)) { - DEBUG_PRINT("channels = %d, not supported. Supported " - "number of channels are 1 and 2\n", aac_channels); - return 0; - } - if ((aac_samplerate < 8000) && (aac_samplerate > 48000)) { - DEBUG_PRINT("samplerate = %d, not supported, Supported " - "samplerates are 8000, 11025, 12000, 16000, 22050, " - "24000, 32000, 44100, 48000\n", aac_samplerate); - return 0; - } else { - if ((profile == 5) || (profile == 29)) { - if (aac_samplerate < 24000) { - DEBUG_PRINT("samplerate = %d, not supported for AAC+/EAAC+." - " Supported samplerates are 24000, 32000," - " 44100, 48000\n", aac_samplerate); - return 0; - } - } - } - } else { - DEBUG_PRINT(" invalid format: \n"); - DEBUG_PRINT("ex: ./mm-aenc-omxaac INPUTFILE AAC_OUTPUTFILE SAMPFREQ CHANNEL TUNNEL RECORDTIME BITRATE FORMAT PROFILE\n"); - DEBUG_PRINT("FOR TUNNEL MOD PASS INPUT FILE AS ZERO\n"); - DEBUG_PRINT("RECORDTIME in seconds for AST Automation ...TUNNEL MODE ONLY\n"); - DEBUG_PRINT("FORMAT::ADTS(1), RAW(6)\n"); - DEBUG_PRINT("BITRATE in bits/sec \n"); - DEBUG_PRINT("PROFILE::AAC_LC(2), AAC+(5), EAAC+(29)\n"); - return 0; - } - if(tunnel == 0) - aud_comp = "OMX.qcom.audio.encoder.aac"; - else - aud_comp = "OMX.qcom.audio.encoder.tunneled.aac"; - if(Init_Encoder(aud_comp)!= 0x00) - { - DEBUG_PRINT("Decoder Init failed\n"); - return -1; - } - - fcntl(0, F_SETFL, O_NONBLOCK); - - if(Play_Encoder() != 0x00) - { - DEBUG_PRINT("Play_Decoder failed\n"); - return -1; - } - - // Wait till EOS is reached... - if(rectime && tunnel) - { - sleep(rectime); - rectime = 0; - bInputEosReached_tunnel = 1; - DEBUG_PRINT("\EOS ON INPUT PORT\n"); - } - else - { - wait_for_event(); - } - - if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel)) - { - - DEBUG_PRINT("\nMoving the decoder to idle state \n"); - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - wait_for_event(); - DEBUG_PRINT("\nMoving the encoder to loaded state \n"); - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0); - sleep(1); - if (!tunnel) - { - DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); - for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(aac_enc_handle, 0, pInputBufHdrs[bufCnt]); - } - } - - DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n"); - for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(aac_enc_handle, 1, pOutputBufHdrs[bufCnt]); - } - wait_for_event(); - - result = OMX_FreeHandle(aac_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - /* Deinit OpenMAX */ - if(tunnel) - { - #ifdef AUDIOV2 - if (msm_route_stream(DIR_TX,session_id,device_id, 0)) - { - DEBUG_PRINT("\ncould not set stream routing\n"); - return -1; - } - if (msm_en_device(device_id, 0)) - { - DEBUG_PRINT("\ncould not enable device\n"); - return -1; - } - msm_mixer_close(); - #endif - } - OMX_Deinit(); - ebd_cnt=0; - bOutputEosReached = false; - bInputEosReached_tunnel = false; - bInputEosReached = 0; - aac_enc_handle = NULL; - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - fclose(outputBufferFile); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...AAC ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - } - return 0; -} - -void Release_Encoder() -{ - static int cnt=0; - OMX_ERRORTYPE result; - - DEBUG_PRINT("END OF AAC ENCODING: EXITING PLEASE WAIT\n"); - bInputEosReached_tunnel = 1; - event_complete(); - cnt++; - if(cnt > 1) - { - /* FORCE RESET */ - aac_enc_handle = NULL; - ebd_cnt=0; - bInputEosReached_tunnel = false; - - result = OMX_FreeHandle(aac_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - - OMX_Deinit(); - - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...AAC ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - exit(0); - } -} - -int Init_Encoder(OMX_STRING audio_component) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE omxresult; - OMX_U32 total = 0; - typedef OMX_U8* OMX_U8_PTR; - char *role ="audio_encoder"; - - static OMX_CALLBACKTYPE call_back = { - &EventHandler,&EmptyBufferDone,&FillBufferDone - }; - - /* Init. the OpenMAX Core */ - DEBUG_PRINT("\nInitializing OpenMAX Core....\n"); - omxresult = OMX_Init(); - - if(OMX_ErrorNone != omxresult) { - DEBUG_PRINT("\n Failed to Init OpenMAX core"); - return -1; - } - else { - DEBUG_PRINT("\nOpenMAX Core Init Done\n"); - } - - /* Query for audio decoders*/ - DEBUG_PRINT("Aac_test: Before entering OMX_GetComponentOfRole"); - OMX_GetComponentsOfRole(role, &total, 0); - DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total); - - - omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&aac_enc_handle), - (OMX_STRING)audio_component, NULL, &call_back); - if (FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component); - return -1; - } - else - { - DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component); - } - - /* Get the port information */ - CONFIG_VERSION_SIZE(portParam); - omxresult = OMX_GetParameter(aac_enc_handle, OMX_IndexParamAudioInit, - (OMX_PTR)&portParam); - - if(FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to get Port Param\n"); - return -1; - } - else - { - DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts); - DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n", - portParam.nStartPortNumber); - } - return 0; -} - -int Play_Encoder() -{ - unsigned int i; - int Size=0; - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE ret; - OMX_INDEXTYPE index; -#ifdef __LP64__ - DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#else - DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#endif - - /* open the i/p and o/p files based on the video file format passed */ - if(open_audio_file()) { - DEBUG_PRINT("\n Returning -1"); - return -1; - } - - /* Query the encoder input min buf requirements */ - CONFIG_VERSION_SIZE(inputportFmt); - - /* Port for which the Client needs to obtain info */ - inputportFmt.nPortIndex = portParam.nStartPortNumber; - - OMX_GetParameter(aac_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt); - DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize); - - if(OMX_DirInput != inputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Input Port\n"); - return -1; - } - - pcmparam.nPortIndex = 0; - pcmparam.nChannels = pcm_channels; - pcmparam.nSamplingRate = pcm_samplerate; - OMX_SetParameter(aac_enc_handle,OMX_IndexParamAudioPcm,&pcmparam); - - - /* Query the encoder outport's min buf requirements */ - CONFIG_VERSION_SIZE(outputportFmt); - /* Port for which the Client needs to obtain info */ - outputportFmt.nPortIndex = portParam.nStartPortNumber + 1; - - OMX_GetParameter(aac_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt); - DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize); - - if(OMX_DirOutput != outputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Output Port\n"); - return -1; - } - - - CONFIG_VERSION_SIZE(aacparam); - - - aacparam.nPortIndex = 1; - aacparam.nChannels = aac_channels; //2 ; /* 1-> mono 2-> stereo*/ - aacparam.nBitRate = bitrate; - aacparam.nSampleRate = aac_samplerate; - aacparam.eChannelMode = OMX_AUDIO_ChannelModeStereo; - aacparam.eAACStreamFormat = (OMX_AUDIO_AACSTREAMFORMATTYPE)format; - aacparam.eAACProfile = (OMX_AUDIO_AACPROFILETYPE)profile; - OMX_SetParameter(aac_enc_handle,OMX_IndexParamAudioAac,&aacparam); - OMX_GetExtensionIndex(aac_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index); - OMX_GetParameter(aac_enc_handle,index,&streaminfoparam); - if(tunnel) - { - #ifdef AUDIOV2 - session_id = streaminfoparam.sessionId; - control = msm_mixer_open("/dev/snd/controlC0", 0); - if(control < 0) - printf("ERROR opening the device\n"); - device_id = msm_get_device(device); - DEBUG_PRINT ("\ndevice_id = %d\n",device_id); - DEBUG_PRINT("\nsession_id = %d\n",session_id); - if (msm_en_device(device_id, 1)) - { - perror("could not enable device\n"); - return -1; - } - - if (msm_route_stream(DIR_TX,session_id,device_id, 1)) - { - perror("could not set stream routing\n"); - return -1; - } - #endif - } - DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n"); - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - /* wait_for_event(); should not wait here event complete status will - not come until enough buffer are allocated */ - if (tunnel == 0) - { - input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5; - DEBUG_PRINT("Transition to Idle State succesful...\n"); - /* Allocate buffer on decoder's i/p port */ - error = Allocate_Buffer(aac_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex, - input_buf_cnt, inputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pInputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n"); - } - } - output_buf_cnt = outputportFmt.nBufferCountMin ; - - /* Allocate buffer on encoder's O/Pp port */ - error = Allocate_Buffer(aac_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex, - output_buf_cnt, outputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pOutputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n"); - } - - wait_for_event(); - - - if (tunnel == 1) - { - DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n"); - OMX_SendCommand(aac_enc_handle, OMX_CommandPortDisable,0,0); // disable input port - wait_for_event(); - } - - DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n"); - OMX_SendCommand(aac_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0); - wait_for_event(); - - DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n"); - - for(i=0; i < output_buf_cnt; i++) { - DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i); - pOutputBufHdrs[i]->nOutputPortIndex = 1; - pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - ret = OMX_FillThisBuffer(aac_enc_handle, pOutputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_FillThisBuffer success!\n"); - } - } - -if(tunnel == 0) -{ - DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n"); - for (i = 0;i < input_buf_cnt;i++) { - DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i); - pInputBufHdrs[i]->nInputPortIndex = 0; - Size = Read_Buffer(pInputBufHdrs[i]); - if(Size <=0 ){ - DEBUG_PRINT("NO DATA READ\n"); - bInputEosReached = true; - pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS; - } - pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size; - pInputBufHdrs[i]->nInputPortIndex = 0; - used_ip_buf_cnt++; - ret = OMX_EmptyThisBuffer(aac_enc_handle, pInputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_EmptyThisBuffer success!\n"); - } - if(Size <=0 ){ - break;//eos reached - } - } - pthread_mutex_lock(&etb_lock); - if(etb_done) -{ - DEBUG_PRINT("Component is waiting for EBD to be released.\n"); - etb_event_complete(); - } - else - { - DEBUG_PRINT("\n****************************\n"); - DEBUG_PRINT("EBD not yet happened ...\n"); - DEBUG_PRINT("\n****************************\n"); - etb_done++; - } - pthread_mutex_unlock(&etb_lock); -} - - return 0; -} - - - -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE error=OMX_ErrorNone; - unsigned int bufCnt=0; - /* To remove warning for unused variable to keep prototype same */ - (void)avc_enc_handle; - - *pBufHdrs= (OMX_BUFFERHEADERTYPE **) - malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin); - - for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) { - DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt); - error = OMX_AllocateBuffer(aac_enc_handle, &((*pBufHdrs)[bufCnt]), - nPortIndex, NULL, bufSize); - } - - return error; -} - - - - -static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr ) -{ - - size_t bytes_read=0; - - - pBufHdr->nFilledLen = 0; - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - - bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile); - - pBufHdr->nFilledLen = (OMX_U32)bytes_read; - if(bytes_read == 0) - { - - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - DEBUG_PRINT ("\nBytes read zero\n"); - } - else - { - pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - } - - return (int)bytes_read; -} - - - -//In Encoder this Should Open a PCM or WAV file for input. - -static int open_audio_file () -{ - int error_code = 0; - - if (!tunnel) - { - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename); - inputBufferFile = fopen (in_filename, "rb"); - if (inputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - in_filename); - error_code = -1; - } - if(parse_pcm_header() != 0x00) - { - DEBUG_PRINT("PCM parser failed \n"); - return -1; - } - } - - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename); - outputBufferFile = fopen (out_filename, "wb"); - if (outputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - out_filename); - error_code = -1; - } - return error_code; -} - - -void audaac_rec_install_bits -( - uint8 *input, - byte num_bits_reqd, - uint32 value, - uint16 *hdr_bit_index -) -{ - uint32 byte_index; - byte bit_index; - byte bits_avail_in_byte; - byte num_to_copy; - byte byte_to_copy; - - byte num_remaining = num_bits_reqd; - uint8 bit_mask; - - bit_mask = 0xFF; - - while (num_remaining) { - - byte_index = (*hdr_bit_index) >> 3; - bit_index = (*hdr_bit_index) & 0x07; - - bits_avail_in_byte = (uint8)(8 - bit_index); - - num_to_copy = MIN(bits_avail_in_byte, num_remaining); - - byte_to_copy = (uint8)(((value >> (num_remaining - num_to_copy)) & 0xFF) << - (bits_avail_in_byte - num_to_copy)); - - input[byte_index] &= ((uint8)(bit_mask << bits_avail_in_byte)); - input[byte_index] |= byte_to_copy; - - *hdr_bit_index += num_to_copy; - - num_remaining = (uint8)(num_remaining - num_to_copy); - } /* while (num_remaining) */ -} /* audaac_rec_install_bits */ - -adts_sample_index map_adts_sample_index(uint32 srate) -{ - adts_sample_index ret; - - switch(srate){ - - case 96000: - ret= ADTS_SAMPLE_INDEX_96000; - break; - case 88200: - ret= ADTS_SAMPLE_INDEX_88200; - break; - case 64000: - ret= ADTS_SAMPLE_INDEX_64000; - break; - case 48000: - ret=ADTS_SAMPLE_INDEX_48000; - break; - case 44100: - ret=ADTS_SAMPLE_INDEX_44100; - break; - case 32000: - ret=ADTS_SAMPLE_INDEX_32000; - break; - case 24000: - ret=ADTS_SAMPLE_INDEX_24000; - break; - case 22050: - ret=ADTS_SAMPLE_INDEX_22050; - break; - case 16000: - ret=ADTS_SAMPLE_INDEX_16000; - break; - case 12000: - ret=ADTS_SAMPLE_INDEX_12000; - break; - case 11025: - ret=ADTS_SAMPLE_INDEX_11025; - break; - case 8000: - ret=ADTS_SAMPLE_INDEX_8000; - break; - case 7350: - ret=ADTS_SAMPLE_INDEX_7350; - break; - default: - ret=ADTS_SAMPLE_INDEX_44100; - break; - } - return ret; -} - -void audaac_rec_install_adts_header_variable (uint16 byte_num) -{ - //uint16 bit_index=0; - - adts_sample_index srate_enum; - uint32 value; - - uint32 sample_index = (uint32)aac_samplerate; - uint8 channel_config = (uint8)aac_channels; - - /* Store Sync word first */ - audaac_header[0] = 0xFF; - audaac_header[1] = 0xF0; - - audaac_hdr_bit_index = 12; - - if ((format == OMX_AUDIO_AACStreamFormatRAW) && - ((profile == OMX_AUDIO_AACObjectHE) || - (profile == OMX_AUDIO_AACObjectHE_PS))){ - if (aac_samplerate >= 24000) - sample_index = aac_samplerate/2; - } - - /* ID field, 1 bit */ - value = 1; - audaac_rec_install_bits(audaac_header, - 1, - value, - &(audaac_hdr_bit_index)); - - /* Layer field, 2 bits */ - value = 0; - audaac_rec_install_bits(audaac_header, - AACHDR_LAYER_SIZE, - value, - &(audaac_hdr_bit_index)); - - /* Protection_absent field, 1 bit */ - value = 1; - audaac_rec_install_bits(audaac_header, - AACHDR_CRC_SIZE, - value, - &(audaac_hdr_bit_index)); - - /* profile_ObjectType field, 2 bit */ - value = 1; - audaac_rec_install_bits(audaac_header, - AAC_PROFILE_SIZE, - value, - &(audaac_hdr_bit_index)); - - /* sampling_frequency_index field, 4 bits */ - srate_enum = map_adts_sample_index(sample_index); - audaac_rec_install_bits(audaac_header, - AAC_SAMPLING_FREQ_INDEX_SIZE, - (uint32)srate_enum, - &(audaac_hdr_bit_index)); - - DEBUG_PRINT("%s: sample_index=%d; srate_enum = %d \n", - __FUNCTION__, sample_index, srate_enum); - - /* pravate_bit field, 1 bits */ - audaac_rec_install_bits(audaac_header, - 1, - 0, - &(audaac_hdr_bit_index)); - - /* channel_configuration field, 3 bits */ - audaac_rec_install_bits(audaac_header, - 3, - channel_config, - &(audaac_hdr_bit_index)); - - - /* original/copy field, 1 bits */ - audaac_rec_install_bits(audaac_header, - AAC_ORIGINAL_COPY_SIZE, - 0, - &(audaac_hdr_bit_index)); - - - /* home field, 1 bits */ - audaac_rec_install_bits(audaac_header, - AAC_HOME_SIZE, - 0, - &(audaac_hdr_bit_index)); - - // bit_index = audaac_hdr_bit_index; - // bit_index += 2; - - /* copyr. id. bit, 1 bits */ - audaac_rec_install_bits(audaac_header, - 1, - 0, - &(audaac_hdr_bit_index)); - - /* copyr. id. start, 1 bits */ - audaac_rec_install_bits(audaac_header, - 1, - 0, - &(audaac_hdr_bit_index)); - - /* aac_frame_length field, 13 bits */ - audaac_rec_install_bits(audaac_header, - AUDAAC_ADTS_FRAME_LENGTH_SIZE, - byte_num, - &audaac_hdr_bit_index); - - /* adts_buffer_fullness field, 11 bits */ - audaac_rec_install_bits(audaac_header, - 11, - 0x660,/*0x660 = CBR,0x7FF = VBR*/ - &audaac_hdr_bit_index); - - /* number_of_raw_data_blocks_in_frame, 2 bits */ - audaac_rec_install_bits(audaac_header, - 2, - 0, - &audaac_hdr_bit_index); - -} /* audaac_rec_install_adts_header_variable */ - -static OMX_ERRORTYPE parse_pcm_header() -{ - struct wav_header hdr; - - DEBUG_PRINT("\n***************************************************************\n"); - if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr)) - { - DEBUG_PRINT("Wav file cannot read header\n"); - return -1; - } - - if ((hdr.riff_id != ID_RIFF) || - (hdr.riff_fmt != ID_WAVE)|| - (hdr.fmt_id != ID_FMT)) - { - DEBUG_PRINT("Wav file is not a riff/wave file\n"); - return -1; - } - - if (hdr.audio_format != FORMAT_PCM) - { - DEBUG_PRINT("Wav file is not adpcm format %d and fmt size is %d\n", - hdr.audio_format, hdr.fmt_sz); - return -1; - } - - DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate); - DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels); - DEBUG_PRINT("\n***************************************************************\n"); - - pcm_samplerate = hdr.sample_rate; - pcm_channels = hdr.num_channels; - - return OMX_ErrorNone; -} diff --git a/mm-audio/aenc-amrnb/qdsp6/Android.mk b/mm-audio/aenc-amrnb/qdsp6/Android.mk index fa8cb234..346602cc 100644 --- a/mm-audio/aenc-amrnb/qdsp6/Android.mk +++ b/mm-audio/aenc-amrnb/qdsp6/Android.mk @@ -40,29 +40,6 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) -# --------------------------------------------------------------------------------- -# Make the apps-test (mm-aenc-omxamr-test) -# --------------------------------------------------------------------------------- - -include $(CLEAR_VARS) - -mm-amr-enc-test-inc := $(LOCAL_PATH)/inc -mm-amr-enc-test-inc += $(LOCAL_PATH)/test - -mm-amr-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore -mm-amr-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-audio/audio-alsa -LOCAL_MODULE := mm-aenc-omxamr-test -LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS := $(libOmxAmrEnc-def) -LOCAL_C_INCLUDES := $(mm-amr-enc-test-inc) -LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := libmm-omxcore -LOCAL_SHARED_LIBRARIES += libOmxAmrEnc -LOCAL_SHARED_LIBRARIES += libaudioalsa -LOCAL_SRC_FILES := test/omx_amr_enc_test.c - -include $(BUILD_EXECUTABLE) - endif # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-amrnb/qdsp6/Makefile b/mm-audio/aenc-amrnb/qdsp6/Makefile index 0abd31cf..4ea08499 100644 --- a/mm-audio/aenc-amrnb/qdsp6/Makefile +++ b/mm-audio/aenc-amrnb/qdsp6/Makefile @@ -39,7 +39,7 @@ BININSTALLDIR := $(DESTDIR)usr/bin # --------------------------------------------------------------------------------- # BUILD # --------------------------------------------------------------------------------- -all: libOmxAmrEnc.so.$(LIBVER) mm-aenc-omxamr-test +all: libOmxAmrEnc.so.$(LIBVER) install: echo "intalling aenc-amr in $(DESTDIR)" @@ -49,8 +49,7 @@ install: install -m 555 libOmxAmrEnc.so.$(LIBVER) $(LIBINSTALLDIR) cd $(LIBINSTALLDIR) && ln -s libOmxAmrEnc.so.$(LIBVER) libOmxAmrEnc.so.$(LIBMAJOR) cd $(LIBINSTALLDIR) && ln -s libOmxAmrEnc.so.$(LIBMAJOR) libOmxAmrEnc.so - install -m 555 mm-aenc-omxamr-test $(BININSTALLDIR) - + # --------------------------------------------------------------------------------- # COMPILE LIBRARY # --------------------------------------------------------------------------------- @@ -65,17 +64,5 @@ libOmxAmrEnc.so.$(LIBVER): $(SRCS) $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxAmrEnc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS) # --------------------------------------------------------------------------------- -# COMPILE TEST APP -# --------------------------------------------------------------------------------- -TEST_LDLIBS := -lpthread -TEST_LDLIBS += -ldl -TEST_LDLIBS += -lOmxCore - -TEST_SRCS := test/omx_amr_enc_test.c - -mm-aenc-omxamr-test: libOmxAmrEnc.so.$(LIBVER) $(TEST_SRCS) - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS) - -# --------------------------------------------------------------------------------- # END # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-amrnb/qdsp6/Makefile.am b/mm-audio/aenc-amrnb/qdsp6/Makefile.am index 13379a3a..fc19f878 100644 --- a/mm-audio/aenc-amrnb/qdsp6/Makefile.am +++ b/mm-audio/aenc-amrnb/qdsp6/Makefile.am @@ -32,11 +32,3 @@ libOmxAmrEnc_la_LIBADD = -lcutils -llog libOmxAmrEnc_la_CFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(GLIB_CFLAGS) -include glib.h -Dstrlcpy=g_strlcpy libOmxAmrEnc_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS) $(GLIB_CFLAGS) -include glib.h -Dstrlcpy=g_strlcpy libOmxAmrEnc_la_LDFLAGS = $(GLIB_LIBS) -shared -avoid-version - -bin_PROGRAMS = mm_aenc_omxamr_test - -mm_aenc_omxamr_test_c_sources = test/omx_amr_enc_test.c -mm_aenc_omxamr_test_CC = @CC@ -mm_aenc_omxamr_test_SOURCES = $(mm_aenc_omxamr_test_c_sources) -mm_aenc_omxamr_test_LDADD = libOmxAmrEnc.la -lmm-omxcore -mm_aenc_omxamr_test_CPPFLAGS = $(AM_CPPFLAGS) $(AM_CFLAGS) diff --git a/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c b/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c deleted file mode 100644 index 47d67f32..00000000 --- a/mm-audio/aenc-amrnb/qdsp6/test/omx_amr_enc_test.c +++ /dev/null @@ -1,1093 +0,0 @@ - -/*-------------------------------------------------------------------------- -Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of The Linux Foundation nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------*/ - - -/* - An Open max test application .... -*/ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <time.h> -#include <sys/ioctl.h> -#include "OMX_Core.h" -#include "OMX_Component.h" -#include "pthread.h" -#include <signal.h> - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include<unistd.h> -#include<string.h> -#include <pthread.h> -#include "QOMX_AudioExtensions.h" -#include "QOMX_AudioIndexExtensions.h" -#ifdef AUDIOV2 -#include "control.h" -#endif - - -#include <linux/ioctl.h> - -typedef unsigned char uint8; -typedef unsigned char byte; -typedef unsigned int uint32; -typedef unsigned int uint16; -QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam; -/* maximum ADTS frame header length */ -void Release_Encoder(); - -#ifdef AUDIOV2 -unsigned short session_id; -int device_id; -int control = 0; -const char *device="handset_tx"; -#define DIR_TX 2 -#endif - -uint32_t samplerate = 8000; -uint32_t channels = 1; -uint32_t bandmode = 7; -uint32_t dtxenable = 0; -uint32_t rectime = 0; -uint32_t recpath = 0; -uint32_t pcmplayback = 0; -uint32_t tunnel = 0; -uint32_t format = 1; -uint32_t amrwb_enable=0; -#define DEBUG_PRINT printf -unsigned to_idle_transition = 0; -unsigned long total_pcm_bytes; - -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -/************************************************************************/ -/* #DEFINES */ -/************************************************************************/ -#define false 0 -#define true 1 - -#define CONFIG_VERSION_SIZE(param) \ - param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\ - param.nSize = sizeof(param); - -#define MIN_BITRATE 4 /* Bit rate 1 - 13.6 , 2 - 6.2 , 3 - 2.7 , 4 - 1.0 kbps*/ -#define MAX_BITRATE 4 -#define AMR_HEADER_SIZE 6 -#define AMRWB_HEADER_SIZE 9 -#define FAILED(result) (result != OMX_ErrorNone) - -#define SUCCEEDED(result) (result == OMX_ErrorNone) - -/************************************************************************/ -/* GLOBAL DECLARATIONS */ -/************************************************************************/ - -pthread_mutex_t lock; -pthread_cond_t cond; -pthread_mutex_t elock; -pthread_cond_t econd; -pthread_cond_t fcond; -pthread_mutex_t etb_lock; -pthread_mutex_t etb_lock1; -pthread_cond_t etb_cond; -FILE * inputBufferFile; -FILE * outputBufferFile; -OMX_PARAM_PORTDEFINITIONTYPE inputportFmt; -OMX_PARAM_PORTDEFINITIONTYPE outputportFmt; -OMX_AUDIO_PARAM_AMRTYPE amrparam; -OMX_AUDIO_PARAM_PCMMODETYPE pcmparam; -OMX_PORT_PARAM_TYPE portParam; -OMX_PORT_PARAM_TYPE portFmt; -OMX_ERRORTYPE error; - - - - -#define ID_RIFF 0x46464952 -#define ID_WAVE 0x45564157 -#define ID_FMT 0x20746d66 -#define ID_DATA 0x61746164 - -#define FORMAT_PCM 1 - -struct wav_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint32_t data_id; - uint32_t data_sz; -}; -struct enc_meta_out{ - unsigned int offset_to_frame; - unsigned int frame_size; - unsigned int encoded_pcm_samples; - unsigned int msw_ts; - unsigned int lsw_ts; - unsigned int nflags; -} __attribute__ ((packed)); - -struct qcp_header { - /* RIFF Section */ - char riff[4]; - unsigned int s_riff; - char qlcm[4]; - - /* Format chunk */ - char fmt[4]; - unsigned int s_fmt; - char mjr; - char mnr; - unsigned int data1; /* UNIQUE ID of the codec */ - unsigned short data2; - unsigned short data3; - char data4[8]; - unsigned short ver; /* Codec Info */ - char name[80]; - unsigned short abps; /* average bits per sec of the codec */ - unsigned short bytes_per_pkt; - unsigned short samp_per_block; - unsigned short samp_per_sec; - unsigned short bits_per_samp; - unsigned char vr_num_of_rates; /* Rate Header fmt info */ - unsigned char rvd1[3]; - unsigned short vr_bytes_per_pkt[8]; - unsigned int rvd2[5]; - - /* Vrat chunk */ - unsigned char vrat[4]; - unsigned int s_vrat; - unsigned int v_rate; - unsigned int size_in_pkts; - - /* Data chunk */ - unsigned char data[4]; - unsigned int s_data; -} __attribute__ ((packed)); - -static int totaldatalen = 0; -static int framecnt = 0; -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -unsigned int input_buf_cnt = 0; -unsigned int output_buf_cnt = 0; -int used_ip_buf_cnt = 0; -volatile int event_is_done = 0; -volatile int ebd_event_is_done = 0; -volatile int fbd_event_is_done = 0; -volatile int etb_event_is_done = 0; -int ebd_cnt; -int bInputEosReached = 0; -int bOutputEosReached = 0; -int bInputEosReached_tunnel = 0; -static int etb_done = 0; -int bFlushing = false; -int bPause = false; -const char *in_filename; -const char *out_filename; - -int timeStampLfile = 0; -int timestampInterval = 100; - -//* OMX Spec Version supported by the wrappers. Version = 1.1 */ -const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101; -OMX_COMPONENTTYPE* amr_enc_handle = 0; - -OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL; -OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL; - -/************************************************************************/ -/* GLOBAL FUNC DECL */ -/************************************************************************/ -int Init_Encoder(char*); -int Play_Encoder(); -OMX_STRING aud_comp; -/**************************************************************************/ -/* STATIC DECLARATIONS */ -/**************************************************************************/ - -static int open_audio_file (); -static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr ); -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *amr_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize); - - -static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData); -static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); - -static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); -static OMX_ERRORTYPE parse_pcm_header(); -void wait_for_event(void) -{ - pthread_mutex_lock(&lock); - DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done); - while (event_is_done == 0) { - pthread_cond_wait(&cond, &lock); - } - event_is_done = 0; - pthread_mutex_unlock(&lock); -} - -void event_complete(void ) -{ - pthread_mutex_lock(&lock); - if (event_is_done == 0) { - event_is_done = 1; - pthread_cond_broadcast(&cond); - } - pthread_mutex_unlock(&lock); -} - -void etb_wait_for_event(void) -{ - pthread_mutex_lock(&etb_lock1); - DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done); - while (etb_event_is_done == 0) { - pthread_cond_wait(&etb_cond, &etb_lock1); - } - etb_event_is_done = 0; - pthread_mutex_unlock(&etb_lock1); -} - -void etb_event_complete(void ) -{ - pthread_mutex_lock(&etb_lock1); - if (etb_event_is_done == 0) { - etb_event_is_done = 1; - pthread_cond_broadcast(&etb_cond); - } - pthread_mutex_unlock(&etb_lock1); -} - - -OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData) -{ - DEBUG_PRINT("Function %s \n", __FUNCTION__); - - /* To remove warning for unused variable to keep prototype same */ - (void)hComponent; - (void)pAppData; - (void)pEventData; - switch(eEvent) { - case OMX_EventCmdComplete: - DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent, - nData1,nData2); - event_complete(); - break; - case OMX_EventError: - DEBUG_PRINT("\n OMX_EventError \n"); - break; - case OMX_EventBufferFlag: - DEBUG_PRINT("\n OMX_EventBufferFlag \n"); - bOutputEosReached = true; - event_complete(); - break; - case OMX_EventPortSettingsChanged: - DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n"); - break; - default: - DEBUG_PRINT("\n Unknown Event \n"); - break; - } - return OMX_ErrorNone; -} - -OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - size_t bytes_writen = 0; - size_t total_bytes_writen = 0; - size_t len = 0; - struct enc_meta_out *meta = NULL; - OMX_U8 *src = pBuffer->pBuffer; - unsigned int num_of_frames = 1; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - DEBUG_PRINT("FBD::EOS on output port\n "); - bOutputEosReached = true; - return OMX_ErrorNone; - } - if(bInputEosReached_tunnel || bOutputEosReached) - { - DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n"); - return OMX_ErrorNone; - } - if(num_of_frames != src[0]){ - - printf("Data corrupt\n"); - return OMX_ErrorNone; - } - /* Skip the first bytes */ - - - - src += sizeof(unsigned char); - meta = (struct enc_meta_out *)src; - while (num_of_frames > 0) { - meta = (struct enc_meta_out *)src; - /*printf("offset=%d framesize=%d encoded_pcm[%d] msw_ts[%d]lsw_ts[%d] nflags[%d]\n", - meta->offset_to_frame, - meta->frame_size, - meta->encoded_pcm_samples, meta->msw_ts, meta->lsw_ts, meta->nflags);*/ - len = meta->frame_size; - - bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile); - if(bytes_writen < len) - { - DEBUG_PRINT("error: invalid AMR encoded data \n"); - return OMX_ErrorNone; - } - src += sizeof(struct enc_meta_out); - num_of_frames--; - total_bytes_writen += len; - } - DEBUG_PRINT(" FillBufferDone size writen to file %zu count %d\n",total_bytes_writen, framecnt); - totaldatalen = totaldatalen + (int)total_bytes_writen; - framecnt++; - - DEBUG_PRINT(" FBD calling FTB\n"); - OMX_FillThisBuffer(hComponent,pBuffer); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - int readBytes =0; - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - ebd_cnt++; - used_ip_buf_cnt--; - pthread_mutex_lock(&etb_lock); - if(!etb_done) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT("Wait till first set of buffers are given to component\n"); - DEBUG_PRINT("\n*********************************************\n"); - etb_done++; - pthread_mutex_unlock(&etb_lock); - etb_wait_for_event(); - } - else - { - pthread_mutex_unlock(&etb_lock); - } - - - if(bInputEosReached) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT(" EBD::EOS on input port\n "); - DEBUG_PRINT("*********************************************\n"); - return OMX_ErrorNone; - }else if (bFlushing == true) { - DEBUG_PRINT("omx_amr_adec_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - if (used_ip_buf_cnt == 0) { - bFlushing = false; - } else { - DEBUG_PRINT("omx_amr_adec_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - return OMX_ErrorNone; - } - } - - if((readBytes = Read_Buffer(pBuffer)) > 0) { - pBuffer->nFilledLen = (OMX_U32)readBytes; - used_ip_buf_cnt++; - OMX_EmptyThisBuffer(hComponent,pBuffer); - } - else{ - pBuffer->nFlags |= OMX_BUFFERFLAG_EOS; - used_ip_buf_cnt++; - bInputEosReached = true; - pBuffer->nFilledLen = 0; - OMX_EmptyThisBuffer(hComponent,pBuffer); - DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n"); - } - return OMX_ErrorNone; -} - -void signal_handler(int sig_id) { - - /* Flush */ - if (sig_id == SIGUSR1) { - DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__); - bFlushing = true; - OMX_SendCommand(amr_enc_handle, OMX_CommandFlush, OMX_ALL, NULL); - } else if (sig_id == SIGUSR2) { - if (bPause == true) { - DEBUG_PRINT("%s resume record\n", __FUNCTION__); - bPause = false; - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); - } else { - DEBUG_PRINT("%s pause record\n", __FUNCTION__); - bPause = true; - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL); - } - } -} - -int main(int argc, char **argv) -{ - unsigned int bufCnt=0; - OMX_ERRORTYPE result; - - struct sigaction sa; - char amr_header[6] = {0x23, 0x21, 0x41, 0x4D, 0x52, 0x0A}; - char amrwb_header[9] = {0x23, 0x21, 0x41, 0x4D, 0x52,0x2D, 0x57, 0x42, 0x0A}; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = &signal_handler; - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - - (void) signal(SIGINT, Release_Encoder); - - pthread_cond_init(&cond, 0); - pthread_mutex_init(&lock, 0); - pthread_cond_init(&etb_cond, 0); - pthread_mutex_init(&etb_lock, 0); - pthread_mutex_init(&etb_lock1, 0); - - if (argc >= 9) { - in_filename = argv[1]; - out_filename = argv[2]; - tunnel = (uint32_t)atoi(argv[3]); - bandmode = (uint32_t)atoi(argv[4]); - dtxenable = (uint32_t)atoi(argv[5]); - recpath = (uint32_t)atoi(argv[6]); // No configuration support yet.. - rectime = (uint32_t)atoi(argv[7]); - amrwb_enable = (uint32_t)atoi(argv[8]); - - } else { - DEBUG_PRINT(" invalid format: \n"); - DEBUG_PRINT("ex: ./mm-aenc-omxamr-test INPUTFILE OUTPUTFILE Tunnel BANDMODE DTXENABLE RECORDPATH RECORDTIME amrwb_enable \n"); - DEBUG_PRINT("amrnb:Bandmode 1-8 amrwb:Bandmode 0-8, dtxenable 0-1\n"); - DEBUG_PRINT("RECORDPATH 0(TX),1(RX),2(BOTH),3(MIC)\n"); - DEBUG_PRINT("RECORDTIME in seconds for AST Automation\n"); - DEBUG_PRINT("amrwb_enable:1-amrwb 0-amrnb\n"); - return 0; - } - - if (!amrwb_enable && (bandmode < 1 || bandmode > 8)) { - DEBUG_PRINT("%d Bandmode is not supported for amrnb:supported Bandmodes are 1-8\n",bandmode); - return 0; - } - - if (amrwb_enable && (bandmode < 0 || bandmode > 8)) { - DEBUG_PRINT("%d Bandmode not supported for amrwb:supported Bandmodes are 0-8\n",bandmode); - return 0; - } - - if (dtxenable != 0 && dtxenable != 1) { - DEBUG_PRINT("dtxenable not supported:dtxenable should be 0-1\n"); - return 0; - } - - if(recpath != 3) { - DEBUG_PRINT("For RECORDPATH Only MIC supported\n"); - return 0; - } - if(!amrwb_enable) - { - if(tunnel == 0) - aud_comp = "OMX.qcom.audio.encoder.amrnb"; - else - aud_comp = "OMX.qcom.audio.encoder.tunneled.amrnb"; - } - else { - if(tunnel == 0) - aud_comp = "OMX.qcom.audio.encoder.amrwb"; - else - aud_comp = "OMX.qcom.audio.encoder.tunneled.amrwb"; - } - - if(Init_Encoder(aud_comp)!= 0x00) - { - DEBUG_PRINT("Decoder Init failed\n"); - return -1; - } - - fcntl(0, F_SETFL, O_NONBLOCK); - - if(Play_Encoder() != 0x00) - { - DEBUG_PRINT("Play_Decoder failed\n"); - return -1; - } - - // Wait till EOS is reached... - if(rectime && tunnel) - { - sleep(rectime); - rectime = 0; - bInputEosReached_tunnel = 1; - DEBUG_PRINT("\EOS ON INPUT PORT\n"); - } - else - { - wait_for_event(); - } - - if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel)) - { - - DEBUG_PRINT("\nMoving the decoder to idle state \n"); - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - wait_for_event(); - - DEBUG_PRINT("\nMoving the encoder to loaded state \n"); - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0); - sleep(1); - if (!tunnel) - { - DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); - for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(amr_enc_handle, 0, pInputBufHdrs[bufCnt]); - } - } - - DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n"); - for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(amr_enc_handle, 1, pOutputBufHdrs[bufCnt]); - } - wait_for_event(); - fseek(outputBufferFile, 0,SEEK_SET); - if(!amrwb_enable) - fwrite(amr_header,1,AMR_HEADER_SIZE,outputBufferFile); - else - fwrite(amrwb_header,1,AMRWB_HEADER_SIZE,outputBufferFile); - - result = OMX_FreeHandle(amr_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - if(tunnel) - { - #ifdef AUDIOV2 - if (msm_route_stream(DIR_TX,session_id,device_id, 0)) - { - DEBUG_PRINT("\ncould not set stream routing\n"); - return -1; - } - if (msm_en_device(device_id, 0)) - { - DEBUG_PRINT("\ncould not enable device\n"); - return -1; - } - msm_mixer_close(); - #endif - } - OMX_Deinit(); - ebd_cnt=0; - bOutputEosReached = false; - bInputEosReached_tunnel = false; - bInputEosReached = 0; - amr_enc_handle = NULL; - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - fclose(outputBufferFile); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...AMR ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - } - return 0; -} - -void Release_Encoder() -{ - static int cnt=0; - OMX_ERRORTYPE result; - - DEBUG_PRINT("END OF AMR ENCODING: EXITING PLEASE WAIT\n"); - bInputEosReached_tunnel = 1; - event_complete(); - cnt++; - if(cnt > 1) - { - /* FORCE RESET */ - amr_enc_handle = NULL; - ebd_cnt=0; - bInputEosReached_tunnel = false; - - result = OMX_FreeHandle(amr_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - - OMX_Deinit(); - - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...AMR ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - exit(0); - } -} - -int Init_Encoder(OMX_STRING audio_component) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE omxresult; - OMX_U32 total = 0; - typedef OMX_U8* OMX_U8_PTR; - char *role ="audio_encoder"; - - static OMX_CALLBACKTYPE call_back = { - &EventHandler,&EmptyBufferDone,&FillBufferDone - }; - - /* Init. the OpenMAX Core */ - DEBUG_PRINT("\nInitializing OpenMAX Core....\n"); - omxresult = OMX_Init(); - - if(OMX_ErrorNone != omxresult) { - DEBUG_PRINT("\n Failed to Init OpenMAX core"); - return -1; - } - else { - DEBUG_PRINT("\nOpenMAX Core Init Done\n"); - } - - /* Query for audio decoders*/ - DEBUG_PRINT("Amr_test: Before entering OMX_GetComponentOfRole"); - OMX_GetComponentsOfRole(role, &total, 0); - DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total); - - - omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&amr_enc_handle), - (OMX_STRING)audio_component, NULL, &call_back); - if (FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component); - return -1; - } - else - { - DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component); - } - - /* Get the port information */ - CONFIG_VERSION_SIZE(portParam); - omxresult = OMX_GetParameter(amr_enc_handle, OMX_IndexParamAudioInit, - (OMX_PTR)&portParam); - - if(FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to get Port Param\n"); - return -1; - } - else - { - DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts); - DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n", - portParam.nStartPortNumber); - } - - if(OMX_ErrorNone != omxresult) - { - DEBUG_PRINT("Set parameter failed"); - } - - return 0; -} - -int Play_Encoder() -{ - unsigned int i; - int Size=0; - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE ret; - OMX_INDEXTYPE index; -#ifdef __LP64__ - DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#else - DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#endif - - /* open the i/p and o/p files based on the video file format passed */ - if(open_audio_file()) { - DEBUG_PRINT("\n Returning -1"); - return -1; - } - - /* Query the encoder input min buf requirements */ - CONFIG_VERSION_SIZE(inputportFmt); - - /* Port for which the Client needs to obtain info */ - inputportFmt.nPortIndex = portParam.nStartPortNumber; - - OMX_GetParameter(amr_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt); - DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize); - - if(OMX_DirInput != inputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Input Port\n"); - return -1; - } - - pcmparam.nPortIndex = 0; - pcmparam.nChannels = channels; - pcmparam.nSamplingRate = samplerate; - OMX_SetParameter(amr_enc_handle,OMX_IndexParamAudioPcm,&pcmparam); - - - /* Query the encoder outport's min buf requirements */ - CONFIG_VERSION_SIZE(outputportFmt); - /* Port for which the Client needs to obtain info */ - outputportFmt.nPortIndex = portParam.nStartPortNumber + 1; - - OMX_GetParameter(amr_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt); - DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize); - - if(OMX_DirOutput != outputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Output Port\n"); - return -1; - } - - - CONFIG_VERSION_SIZE(amrparam); - - amrparam.nPortIndex = 1; - amrparam.nChannels = channels; //2 ; /* 1-> mono 2-> stereo*/ - amrparam.eAMRBandMode = bandmode; - amrparam.eAMRDTXMode = dtxenable; - OMX_SetParameter(amr_enc_handle,OMX_IndexParamAudioAmr,&amrparam); - OMX_GetExtensionIndex(amr_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index); - OMX_GetParameter(amr_enc_handle,index,&streaminfoparam); - if(tunnel) { - #ifdef AUDIOV2 - session_id = streaminfoparam.sessionId; - control = msm_mixer_open("/dev/snd/controlC0", 0); - if(control < 0) - printf("ERROR opening the device\n"); - device_id = msm_get_device(device); - DEBUG_PRINT ("\ndevice_id = %d\n",device_id); - DEBUG_PRINT("\nsession_id = %d\n",session_id); - if (msm_en_device(device_id, 1)) - { - perror("could not enable device\n"); - return -1; - } - if (msm_route_stream(DIR_TX,session_id,device_id, 1)) - { - perror("could not set stream routing\n"); - return -1; - } - #endif - } - - DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n"); - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - /* wait_for_event(); should not wait here event complete status will - not come until enough buffer are allocated */ - if (tunnel == 0) - { - input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5; - DEBUG_PRINT("Transition to Idle State succesful...\n"); - /* Allocate buffer on decoder's i/p port */ - error = Allocate_Buffer(amr_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex, - input_buf_cnt, inputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pInputBufHdrs == NULL ) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n"); - } - } - output_buf_cnt = outputportFmt.nBufferCountMin ; - - /* Allocate buffer on encoder's O/Pp port */ - error = Allocate_Buffer(amr_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex, - output_buf_cnt, outputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pOutputBufHdrs == NULL ) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n"); - } - - wait_for_event(); - - - if (tunnel == 1) - { - DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n"); - OMX_SendCommand(amr_enc_handle, OMX_CommandPortDisable,0,0); // disable input port - wait_for_event(); - } - - DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n"); - OMX_SendCommand(amr_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0); - wait_for_event(); - - DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n"); - - for(i=0; i < output_buf_cnt; i++) { - DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i); - pOutputBufHdrs[i]->nOutputPortIndex = 1; - pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - ret = OMX_FillThisBuffer(amr_enc_handle, pOutputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_FillThisBuffer success!\n"); - } - } - -if(tunnel == 0) -{ - DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n"); - for (i = 0;i < input_buf_cnt;i++) { - DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i); - pInputBufHdrs[i]->nInputPortIndex = 0; - Size = Read_Buffer(pInputBufHdrs[i]); - if(Size <=0 ){ - DEBUG_PRINT("NO DATA READ\n"); - bInputEosReached = true; - pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS; - } - pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size; - pInputBufHdrs[i]->nInputPortIndex = 0; - used_ip_buf_cnt++; - ret = OMX_EmptyThisBuffer(amr_enc_handle, pInputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_EmptyThisBuffer success!\n"); - } - if(Size <=0 ){ - break;//eos reached - } - } - pthread_mutex_lock(&etb_lock); - if(etb_done) -{ - DEBUG_PRINT("Component is waiting for EBD to be released.\n"); - etb_event_complete(); - } - else - { - DEBUG_PRINT("\n****************************\n"); - DEBUG_PRINT("EBD not yet happened ...\n"); - DEBUG_PRINT("\n****************************\n"); - etb_done++; - } - pthread_mutex_unlock(&etb_lock); -} - - return 0; -} - - - -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE error=OMX_ErrorNone; - unsigned int bufCnt=0; - - /* To remove warning for unused variable to keep prototype same */ - (void)avc_enc_handle; - *pBufHdrs= (OMX_BUFFERHEADERTYPE **) - malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin); - - for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) { - DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt); - error = OMX_AllocateBuffer(amr_enc_handle, &((*pBufHdrs)[bufCnt]), - nPortIndex, NULL, bufSize); - } - - return error; -} - - - - -static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr ) -{ - - size_t bytes_read=0; - - - pBufHdr->nFilledLen = 0; - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - - bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile); - - pBufHdr->nFilledLen = (OMX_U32)bytes_read; - // Time stamp logic - ((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp = \ - - (OMX_TICKS) ((total_pcm_bytes * 1000)/(samplerate * channels *2)); - - DEBUG_PRINT ("\n--time stamp -- %ld\n", (unsigned long)((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp); - if(bytes_read == 0) - { - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - DEBUG_PRINT ("\nBytes read zero\n"); - } - else - { - pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - - total_pcm_bytes = (unsigned)(total_pcm_bytes + bytes_read); - } - - return (int)bytes_read;; -} - - - -//In Encoder this Should Open a PCM or WAV file for input. - -static int open_audio_file () -{ - int error_code = 0; - - if (!tunnel) - { - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename); - inputBufferFile = fopen (in_filename, "rb"); - if (inputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - in_filename); - error_code = -1; - } - if(parse_pcm_header() != 0x00) - { - DEBUG_PRINT("PCM parser failed \n"); - return -1; - } - } - - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename); - outputBufferFile = fopen (out_filename, "wb"); - if (outputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - out_filename); - error_code = -1; - return error_code; - } - if(!amrwb_enable) { - fseek(outputBufferFile, AMR_HEADER_SIZE, SEEK_SET); - } else { - fseek(outputBufferFile, AMRWB_HEADER_SIZE, SEEK_SET); - } - return error_code; -} - -static OMX_ERRORTYPE parse_pcm_header() -{ - struct wav_header hdr; - - DEBUG_PRINT("\n***************************************************************\n"); - if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr)) - { - DEBUG_PRINT("Wav file cannot read header\n"); - return -1; - } - - if ((hdr.riff_id != ID_RIFF) || - (hdr.riff_fmt != ID_WAVE)|| - (hdr.fmt_id != ID_FMT)) - { - DEBUG_PRINT("Wav file is not a riff/wave file\n"); - return -1; - } - - if (hdr.audio_format != FORMAT_PCM) - { - DEBUG_PRINT("Wav file is not adpcm format %d and fmt size is %d\n", - hdr.audio_format, hdr.fmt_sz); - return -1; - } - - DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate); - DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels); - DEBUG_PRINT("\n***************************************************************\n"); - - samplerate = hdr.sample_rate; - channels = hdr.num_channels; - total_pcm_bytes = 0; - - return OMX_ErrorNone; -} diff --git a/mm-audio/aenc-evrc/qdsp6/Android.mk b/mm-audio/aenc-evrc/qdsp6/Android.mk index 42a6b13e..83f105e3 100644 --- a/mm-audio/aenc-evrc/qdsp6/Android.mk +++ b/mm-audio/aenc-evrc/qdsp6/Android.mk @@ -40,28 +40,6 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) -# --------------------------------------------------------------------------------- -# Make the apps-test (mm-aenc-omxevrc-test) -# --------------------------------------------------------------------------------- - -include $(CLEAR_VARS) - -mm-evrc-enc-test-inc := $(LOCAL_PATH)/inc -mm-evrc-enc-test-inc += $(LOCAL_PATH)/test -mm-evrc-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore -mm-evrc-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-audio/audio-alsa -LOCAL_MODULE := mm-aenc-omxevrc-test -LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS := $(libOmxEvrcEnc-def) -LOCAL_C_INCLUDES := $(mm-evrc-enc-test-inc) -LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := libmm-omxcore -LOCAL_SHARED_LIBRARIES += libOmxEvrcEnc -LOCAL_SHARED_LIBRARIES += libaudioalsa -LOCAL_SRC_FILES := test/omx_evrc_enc_test.c - -include $(BUILD_EXECUTABLE) - endif # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-evrc/qdsp6/Makefile b/mm-audio/aenc-evrc/qdsp6/Makefile index d0871dea..2c9c7bbe 100644 --- a/mm-audio/aenc-evrc/qdsp6/Makefile +++ b/mm-audio/aenc-evrc/qdsp6/Makefile @@ -39,7 +39,7 @@ BININSTALLDIR := $(DESTDIR)usr/bin # --------------------------------------------------------------------------------- # BUILD # --------------------------------------------------------------------------------- -all: libOmxEvrcEnc.so.$(LIBVER) mm-aenc-omxevrc-test +all: libOmxEvrcEnc.so.$(LIBVER) install: echo "intalling aenc-evrc in $(DESTDIR)" @@ -49,8 +49,7 @@ install: install -m 555 libOmxEvrcEnc.so.$(LIBVER) $(LIBINSTALLDIR) cd $(LIBINSTALLDIR) && ln -s libOmxEvrcEnc.so.$(LIBVER) libOmxEvrcEnc.so.$(LIBMAJOR) cd $(LIBINSTALLDIR) && ln -s libOmxEvrcEnc.so.$(LIBMAJOR) libOmxEvrcEnc.so - install -m 555 mm-aenc-omxevrc-test $(BININSTALLDIR) - + # --------------------------------------------------------------------------------- # COMPILE LIBRARY # --------------------------------------------------------------------------------- @@ -65,17 +64,5 @@ libOmxEvrcEnc.so.$(LIBVER): $(SRCS) $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxEvrcEnc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS) # --------------------------------------------------------------------------------- -# COMPILE TEST APP -# --------------------------------------------------------------------------------- -TEST_LDLIBS := -lpthread -TEST_LDLIBS += -ldl -TEST_LDLIBS += -lOmxCore - -TEST_SRCS := test/omx_evrc_enc_test.c - -mm-aenc-omxevrc-test: libOmxEvrcEnc.so.$(LIBVER) $(TEST_SRCS) - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS) - -# --------------------------------------------------------------------------------- # END # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c b/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c deleted file mode 100644 index 63d953bd..00000000 --- a/mm-audio/aenc-evrc/qdsp6/test/omx_evrc_enc_test.c +++ /dev/null @@ -1,1098 +0,0 @@ - -/*-------------------------------------------------------------------------- -Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of The Linux Foundation nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------*/ - - -/* - An Open max test application .... -*/ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <time.h> -#include <sys/ioctl.h> -#include "OMX_Core.h" -#include "OMX_Component.h" -#include "pthread.h" -#include <signal.h> - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include<unistd.h> -#include<string.h> -#include <pthread.h> -#include "QOMX_AudioExtensions.h" -#include "QOMX_AudioIndexExtensions.h" -#ifdef AUDIOV2 -#include "control.h" -#endif - - -#include <linux/ioctl.h> - -typedef unsigned char uint8; -typedef unsigned char byte; -typedef unsigned int uint32; -typedef unsigned int uint16; -QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam; -/* maximum ADTS frame header length */ -void Release_Encoder(); - -#ifdef AUDIOV2 -unsigned short session_id; -int device_id; -int control = 0; -const char *device="handset_tx"; -#define DIR_TX 2 -#endif - -uint32_t samplerate = 8000; -uint32_t channels = 1; -uint32_t min_bitrate = 0; -uint32_t max_bitrate = 0; -uint32_t cdmarate = 0; -uint32_t rectime = 0; -uint32_t recpath = 0; -int32_t pcmplayback = 0; -uint32_t tunnel = 0; -uint32_t format = 1; -#define DEBUG_PRINT printf -unsigned to_idle_transition = 0; -unsigned long total_pcm_bytes; - -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -/************************************************************************/ -/* #DEFINES */ -/************************************************************************/ -#define false 0 -#define true 1 - -#define CONFIG_VERSION_SIZE(param) \ - param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\ - param.nSize = sizeof(param); - -#define QCP_HEADER_SIZE sizeof(struct qcp_header) -#define MIN_BITRATE 4 /* Bit rate 1 - 13.6 , 2 - 6.2 , 3 - 2.7 , 4 - 1.0 kbps*/ -#define MAX_BITRATE 4 - -#define FAILED(result) (result != OMX_ErrorNone) - -#define SUCCEEDED(result) (result == OMX_ErrorNone) - -/************************************************************************/ -/* GLOBAL DECLARATIONS */ -/************************************************************************/ - -pthread_mutex_t lock; -pthread_cond_t cond; -pthread_mutex_t elock; -pthread_cond_t econd; -pthread_cond_t fcond; -pthread_mutex_t etb_lock; -pthread_mutex_t etb_lock1; -pthread_cond_t etb_cond; -FILE * inputBufferFile; -FILE * outputBufferFile; -OMX_PARAM_PORTDEFINITIONTYPE inputportFmt; -OMX_PARAM_PORTDEFINITIONTYPE outputportFmt; -OMX_AUDIO_PARAM_EVRCTYPE evrcparam; -OMX_AUDIO_PARAM_PCMMODETYPE pcmparam; -OMX_PORT_PARAM_TYPE portParam; -OMX_PORT_PARAM_TYPE portFmt; -OMX_ERRORTYPE error; - - - - -#define ID_RIFF 0x46464952 -#define ID_WAVE 0x45564157 -#define ID_FMT 0x20746d66 -#define ID_DATA 0x61746164 - -#define FORMAT_PCM 1 - -struct wav_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint32_t data_id; - uint32_t data_sz; -}; -struct enc_meta_out{ - unsigned int offset_to_frame; - unsigned int frame_size; - unsigned int encoded_pcm_samples; - unsigned int msw_ts; - unsigned int lsw_ts; - unsigned int nflags; -} __attribute__ ((packed)); - -struct qcp_header { - /* RIFF Section */ - char riff[4]; - unsigned int s_riff; - char qlcm[4]; - - /* Format chunk */ - char fmt[4]; - unsigned int s_fmt; - char mjr; - char mnr; - unsigned int data1; /* UNIQUE ID of the codec */ - unsigned short data2; - unsigned short data3; - char data4[8]; - unsigned short ver; /* Codec Info */ - char name[80]; - unsigned short abps; /* average bits per sec of the codec */ - unsigned short bytes_per_pkt; - unsigned short samp_per_block; - unsigned short samp_per_sec; - unsigned short bits_per_samp; - unsigned char vr_num_of_rates; /* Rate Header fmt info */ - unsigned char rvd1[3]; - unsigned short vr_bytes_per_pkt[8]; - unsigned int rvd2[5]; - - /* Vrat chunk */ - unsigned char vrat[4]; - unsigned int s_vrat; - unsigned int v_rate; - unsigned int size_in_pkts; - - /* Data chunk */ - unsigned char data[4]; - unsigned int s_data; -} __attribute__ ((packed)); - - /* Common part */ - static struct qcp_header append_header = { - {'R', 'I', 'F', 'F'}, 0, {'Q', 'L', 'C', 'M'}, - {'f', 'm', 't', ' '}, 150, 1, 0, 0, 0, 0,{0}, 0, {0},0,0,160,8000,16,0,{0},{0},{0}, - {'v','r','a','t'},0, 0, 0,{'d','a','t','a'},0 - }; - -static int totaldatalen = 0; -static int framecnt = 0; -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -unsigned int input_buf_cnt = 0; -unsigned int output_buf_cnt = 0; -int used_ip_buf_cnt = 0; -volatile int event_is_done = 0; -volatile int ebd_event_is_done = 0; -volatile int fbd_event_is_done = 0; -volatile int etb_event_is_done = 0; -int ebd_cnt; -int bInputEosReached = 0; -int bOutputEosReached = 0; -int bInputEosReached_tunnel = 0; -static int etb_done = 0; -int bFlushing = false; -int bPause = false; -const char *in_filename; -const char *out_filename; - -int timeStampLfile = 0; -int timestampInterval = 100; - -//* OMX Spec Version supported by the wrappers. Version = 1.1 */ -const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101; -OMX_COMPONENTTYPE* evrc_enc_handle = 0; - -OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL; -OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL; - -/************************************************************************/ -/* GLOBAL FUNC DECL */ -/************************************************************************/ -int Init_Encoder(char*); -int Play_Encoder(); -OMX_STRING aud_comp; -/**************************************************************************/ -/* STATIC DECLARATIONS */ -/**************************************************************************/ - -static int open_audio_file (); -static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr ); -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *evrc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize); - - -static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData); -static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); - -static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); -static OMX_ERRORTYPE parse_pcm_header(); -void wait_for_event(void) -{ - pthread_mutex_lock(&lock); - DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done); - while (event_is_done == 0) { - pthread_cond_wait(&cond, &lock); - } - event_is_done = 0; - pthread_mutex_unlock(&lock); -} - -void event_complete(void ) -{ - pthread_mutex_lock(&lock); - if (event_is_done == 0) { - event_is_done = 1; - pthread_cond_broadcast(&cond); - } - pthread_mutex_unlock(&lock); -} - -void etb_wait_for_event(void) -{ - pthread_mutex_lock(&etb_lock1); - DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done); - while (etb_event_is_done == 0) { - pthread_cond_wait(&etb_cond, &etb_lock1); - } - etb_event_is_done = 0; - pthread_mutex_unlock(&etb_lock1); -} - -void etb_event_complete(void ) -{ - pthread_mutex_lock(&etb_lock1); - if (etb_event_is_done == 0) { - etb_event_is_done = 1; - pthread_cond_broadcast(&etb_cond); - } - pthread_mutex_unlock(&etb_lock1); -} - -static void create_qcp_header(int Datasize, int Frames) -{ - append_header.s_riff = (unsigned)(Datasize + (int)QCP_HEADER_SIZE - 8); - /* exclude riff id and size field */ - append_header.data1 = 0xe689d48d; - append_header.data2 = 0x9076; - append_header.data3 = 0x46b5; - append_header.data4[0] = 0x91; - append_header.data4[1] = 0xef; - append_header.data4[2] = 0x73; - append_header.data4[3] = 0x6a; - append_header.data4[4] = 0x51; - append_header.data4[5] = 0x00; - append_header.data4[6] = 0xce; - append_header.data4[7] = 0xb4; - append_header.ver = 0x0001; - memcpy(append_header.name, "TIA IS-127 Enhanced Variable Rate Codec, Speech Service Option 3", 64); - append_header.abps = 9600; - append_header.bytes_per_pkt = 23; - append_header.vr_num_of_rates = 4; - append_header.vr_bytes_per_pkt[0] = 0x0416; - append_header.vr_bytes_per_pkt[1] = 0x030a; - append_header.vr_bytes_per_pkt[2] = 0x0200; - append_header.vr_bytes_per_pkt[3] = 0x0102; - append_header.s_vrat = 0x00000008; - append_header.v_rate = 0x00000001; - append_header.size_in_pkts = (unsigned)Frames; - append_header.s_data = (unsigned)Datasize; - return; -} - -OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData) -{ - DEBUG_PRINT("Function %s \n", __FUNCTION__); - - /* To remove warning for unused variable to keep prototype same */ - (void)hComponent; - (void)pAppData; - (void)pEventData; - switch(eEvent) { - case OMX_EventCmdComplete: - DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent, - nData1,nData2); - event_complete(); - break; - case OMX_EventError: - DEBUG_PRINT("\n OMX_EventError \n"); - break; - case OMX_EventBufferFlag: - DEBUG_PRINT("\n OMX_EventBufferFlag \n"); - bOutputEosReached = true; - event_complete(); - break; - case OMX_EventPortSettingsChanged: - DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n"); - break; - default: - DEBUG_PRINT("\n Unknown Event \n"); - break; - } - return OMX_ErrorNone; -} - -OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - size_t bytes_writen = 0; - size_t total_bytes_writen = 0; - size_t len = 0; - struct enc_meta_out *meta = NULL; - OMX_U8 *src = pBuffer->pBuffer; - unsigned int num_of_frames = 1; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - DEBUG_PRINT("FBD::EOS on output port\n "); - bOutputEosReached = true; - return OMX_ErrorNone; - } - if(bInputEosReached_tunnel || bOutputEosReached) - { - DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n"); - return OMX_ErrorNone; - } - if(num_of_frames != src[0]){ - - printf("Data corrupt\n"); - return OMX_ErrorNone; - } - /* Skip the first bytes */ - - - - src += sizeof(unsigned char); - meta = (struct enc_meta_out *)src; - while (num_of_frames > 0) { - meta = (struct enc_meta_out *)src; - /*printf("offset=%d framesize=%d encoded_pcm[%d] msw_ts[%d]lsw_ts[%d] nflags[%d]\n", - meta->offset_to_frame, - meta->frame_size, - meta->encoded_pcm_samples, meta->msw_ts, meta->lsw_ts, meta->nflags);*/ - len = meta->frame_size; - - bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile); - if(bytes_writen < len) - { - DEBUG_PRINT("error: invalid EVRC encoded data \n"); - return OMX_ErrorNone; - } - src += sizeof(struct enc_meta_out); - num_of_frames--; - total_bytes_writen += len; - } - DEBUG_PRINT(" FillBufferDone size writen to file %zu count %d\n",total_bytes_writen, framecnt); - totaldatalen = totaldatalen + (int)total_bytes_writen; - framecnt++; - - DEBUG_PRINT(" FBD calling FTB\n"); - OMX_FillThisBuffer(hComponent,pBuffer); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - int readBytes =0; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - ebd_cnt++; - used_ip_buf_cnt--; - pthread_mutex_lock(&etb_lock); - if(!etb_done) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT("Wait till first set of buffers are given to component\n"); - DEBUG_PRINT("\n*********************************************\n"); - etb_done++; - pthread_mutex_unlock(&etb_lock); - etb_wait_for_event(); - } - else - { - pthread_mutex_unlock(&etb_lock); - } - - - if(bInputEosReached) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT(" EBD::EOS on input port\n "); - DEBUG_PRINT("*********************************************\n"); - return OMX_ErrorNone; - }else if (bFlushing == true) { - DEBUG_PRINT("omx_evrc13_adec_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - if (used_ip_buf_cnt == 0) { - bFlushing = false; - } else { - DEBUG_PRINT("omx_evrc13_adec_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - return OMX_ErrorNone; - } - } - - if((readBytes = Read_Buffer(pBuffer)) > 0) { - pBuffer->nFilledLen = (OMX_U32)readBytes; - used_ip_buf_cnt++; - OMX_EmptyThisBuffer(hComponent,pBuffer); - } - else{ - pBuffer->nFlags |= OMX_BUFFERFLAG_EOS; - used_ip_buf_cnt++; - bInputEosReached = true; - pBuffer->nFilledLen = 0; - OMX_EmptyThisBuffer(hComponent,pBuffer); - DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n"); - } - return OMX_ErrorNone; -} - -void signal_handler(int sig_id) { - - /* Flush */ - if (sig_id == SIGUSR1) { - DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__); - bFlushing = true; - OMX_SendCommand(evrc_enc_handle, OMX_CommandFlush, OMX_ALL, NULL); - } else if (sig_id == SIGUSR2) { - if (bPause == true) { - DEBUG_PRINT("%s resume record\n", __FUNCTION__); - bPause = false; - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); - } else { - DEBUG_PRINT("%s pause record\n", __FUNCTION__); - bPause = true; - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL); - } - } -} - -int main(int argc, char **argv) -{ - unsigned int bufCnt=0; - OMX_ERRORTYPE result; - - struct sigaction sa; - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = &signal_handler; - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - - (void) signal(SIGINT, Release_Encoder); - - pthread_cond_init(&cond, 0); - pthread_mutex_init(&lock, 0); - pthread_cond_init(&etb_cond, 0); - pthread_mutex_init(&etb_lock, 0); - pthread_mutex_init(&etb_lock1, 0); - - if (argc >= 9) { - in_filename = argv[1]; - out_filename = argv[2]; - tunnel = (uint32_t)atoi(argv[3]); - min_bitrate = (uint32_t)atoi(argv[4]); - max_bitrate = (uint32_t)atoi(argv[5]); - cdmarate = (uint32_t)atoi(argv[6]); - recpath = (uint32_t)atoi(argv[7]); // No configuration support yet.. - rectime = (uint32_t)atoi(argv[8]); - - } else { - DEBUG_PRINT(" invalid format: \n"); - DEBUG_PRINT("ex: ./mm-aenc-omxevrc-test INPUTFILE OUTPUTFILE Tunnel MINRATE MAXRATE CDMARATE RECORDPATH RECORDTIME\n"); - DEBUG_PRINT("MINRATE MAXRATE and CDMARATE 1 to 4\n"); - DEBUG_PRINT("RECORDPATH 0(TX),1(RX),2(BOTH),3(MIC)\n"); - DEBUG_PRINT("RECORDTIME in seconds for AST Automation\n"); - return 0; - } - if(recpath != 3) { - DEBUG_PRINT("For RECORDPATH Only MIC supported\n"); - return 0; - } - if(tunnel == 0) - aud_comp = "OMX.qcom.audio.encoder.evrc"; - else - aud_comp = "OMX.qcom.audio.encoder.tunneled.evrc"; - if(Init_Encoder(aud_comp)!= 0x00) - { - DEBUG_PRINT("Decoder Init failed\n"); - return -1; - } - - fcntl(0, F_SETFL, O_NONBLOCK); - - if(Play_Encoder() != 0x00) - { - DEBUG_PRINT("Play_Decoder failed\n"); - return -1; - } - - // Wait till EOS is reached... - if(rectime && tunnel) - { - sleep(rectime); - rectime = 0; - bInputEosReached_tunnel = 1; - DEBUG_PRINT("\EOS ON INPUT PORT\n"); - } - else - { - wait_for_event(); - } - - if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel)) - { - - DEBUG_PRINT("\nMoving the decoder to idle state \n"); - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - wait_for_event(); - - DEBUG_PRINT("\nMoving the encoder to loaded state \n"); - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0); - sleep(1); - if (!tunnel) - { - DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); - for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(evrc_enc_handle, 0, pInputBufHdrs[bufCnt]); - } - } - - DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n"); - for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(evrc_enc_handle, 1, pOutputBufHdrs[bufCnt]); - } - wait_for_event(); - create_qcp_header(totaldatalen, framecnt); - fseek(outputBufferFile, 0,SEEK_SET); - fwrite(&append_header,1,QCP_HEADER_SIZE,outputBufferFile); - - - result = OMX_FreeHandle(evrc_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - if(tunnel) - { - #ifdef AUDIOV2 - if (msm_route_stream(DIR_TX,session_id,device_id, 0)) - { - DEBUG_PRINT("\ncould not set stream routing\n"); - return -1; - } - if (msm_en_device(device_id, 0)) - { - DEBUG_PRINT("\ncould not enable device\n"); - return -1; - } - msm_mixer_close(); - #endif - } - OMX_Deinit(); - ebd_cnt=0; - bOutputEosReached = false; - bInputEosReached_tunnel = false; - bInputEosReached = 0; - evrc_enc_handle = NULL; - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - fclose(outputBufferFile); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...EVRC ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - } - return 0; -} - -void Release_Encoder() -{ - static int cnt=0; - OMX_ERRORTYPE result; - - DEBUG_PRINT("END OF EVRC ENCODING: EXITING PLEASE WAIT\n"); - bInputEosReached_tunnel = 1; - event_complete(); - cnt++; - if(cnt > 1) - { - /* FORCE RESET */ - evrc_enc_handle = NULL; - ebd_cnt=0; - bInputEosReached_tunnel = false; - - result = OMX_FreeHandle(evrc_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - - OMX_Deinit(); - - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...EVRC ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - exit(0); - } -} - -int Init_Encoder(OMX_STRING audio_component) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE omxresult; - OMX_U32 total = 0; - typedef OMX_U8* OMX_U8_PTR; - char *role ="audio_encoder"; - - static OMX_CALLBACKTYPE call_back = { - &EventHandler,&EmptyBufferDone,&FillBufferDone - }; - - /* Init. the OpenMAX Core */ - DEBUG_PRINT("\nInitializing OpenMAX Core....\n"); - omxresult = OMX_Init(); - - if(OMX_ErrorNone != omxresult) { - DEBUG_PRINT("\n Failed to Init OpenMAX core"); - return -1; - } - else { - DEBUG_PRINT("\nOpenMAX Core Init Done\n"); - } - - /* Query for audio decoders*/ - DEBUG_PRINT("Evrc_test: Before entering OMX_GetComponentOfRole"); - OMX_GetComponentsOfRole(role, &total, 0); - DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total); - - - omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&evrc_enc_handle), - (OMX_STRING)audio_component, NULL, &call_back); - if (FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component); - return -1; - } - else - { - DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component); - } - - /* Get the port information */ - CONFIG_VERSION_SIZE(portParam); - omxresult = OMX_GetParameter(evrc_enc_handle, OMX_IndexParamAudioInit, - (OMX_PTR)&portParam); - - if(FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to get Port Param\n"); - return -1; - } - else - { - DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts); - DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n", - portParam.nStartPortNumber); - } - - if(OMX_ErrorNone != omxresult) - { - DEBUG_PRINT("Set parameter failed"); - } - - return 0; -} - -int Play_Encoder() -{ - unsigned int i; - int Size=0; - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE ret; - OMX_INDEXTYPE index; -#ifdef __LP64__ - DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#else - DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#endif - - /* open the i/p and o/p files based on the video file format passed */ - if(open_audio_file()) { - DEBUG_PRINT("\n Returning -1"); - return -1; - } - - /* Query the encoder input min buf requirements */ - CONFIG_VERSION_SIZE(inputportFmt); - - /* Port for which the Client needs to obtain info */ - inputportFmt.nPortIndex = portParam.nStartPortNumber; - - OMX_GetParameter(evrc_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt); - DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize); - - if(OMX_DirInput != inputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Input Port\n"); - return -1; - } - - pcmparam.nPortIndex = 0; - pcmparam.nChannels = channels; - pcmparam.nSamplingRate = samplerate; - OMX_SetParameter(evrc_enc_handle,OMX_IndexParamAudioPcm,&pcmparam); - - - /* Query the encoder outport's min buf requirements */ - CONFIG_VERSION_SIZE(outputportFmt); - /* Port for which the Client needs to obtain info */ - outputportFmt.nPortIndex = portParam.nStartPortNumber + 1; - - OMX_GetParameter(evrc_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt); - DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize); - - if(OMX_DirOutput != outputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Output Port\n"); - return -1; - } - - - CONFIG_VERSION_SIZE(evrcparam); - - evrcparam.nPortIndex = 1; - evrcparam.nChannels = channels; //2 ; /* 1-> mono 2-> stereo*/ - evrcparam.nMinBitRate = min_bitrate; - evrcparam.nMaxBitRate = max_bitrate; - OMX_SetParameter(evrc_enc_handle,OMX_IndexParamAudioEvrc,&evrcparam); - OMX_GetExtensionIndex(evrc_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index); - OMX_GetParameter(evrc_enc_handle,index,&streaminfoparam); - if(tunnel) { - #ifdef AUDIOV2 - session_id = streaminfoparam.sessionId; - control = msm_mixer_open("/dev/snd/controlC0", 0); - if(control < 0) - printf("ERROR opening the device\n"); - device_id = msm_get_device(device); - DEBUG_PRINT ("\ndevice_id = %d\n",device_id); - DEBUG_PRINT("\nsession_id = %d\n",session_id); - if (msm_en_device(device_id, 1)) - { - perror("could not enable device\n"); - return -1; - } - if (msm_route_stream(DIR_TX,session_id,device_id, 1)) - { - perror("could not set stream routing\n"); - return -1; - } - #endif - } - - DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n"); - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - /* wait_for_event(); should not wait here event complete status will - not come until enough buffer are allocated */ - if (tunnel == 0) - { - input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5; - DEBUG_PRINT("Transition to Idle State succesful...\n"); - /* Allocate buffer on decoder's i/p port */ - error = Allocate_Buffer(evrc_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex, - input_buf_cnt, inputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pInputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n"); - } - } - output_buf_cnt = outputportFmt.nBufferCountMin ; - - /* Allocate buffer on encoder's O/Pp port */ - error = Allocate_Buffer(evrc_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex, - output_buf_cnt, outputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pOutputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n"); - } - - wait_for_event(); - - - if (tunnel == 1) - { - DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n"); - OMX_SendCommand(evrc_enc_handle, OMX_CommandPortDisable,0,0); // disable input port - wait_for_event(); - } - - DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n"); - OMX_SendCommand(evrc_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0); - wait_for_event(); - - DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n"); - - for(i=0; i < output_buf_cnt; i++) { - DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i); - pOutputBufHdrs[i]->nOutputPortIndex = 1; - pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - ret = OMX_FillThisBuffer(evrc_enc_handle, pOutputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_FillThisBuffer success!\n"); - } - } - -if(tunnel == 0) -{ - DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n"); - for (i = 0;i < input_buf_cnt;i++) { - DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i); - pInputBufHdrs[i]->nInputPortIndex = 0; - Size = Read_Buffer(pInputBufHdrs[i]); - if(Size <=0 ){ - DEBUG_PRINT("NO DATA READ\n"); - bInputEosReached = true; - pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS; - } - pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size; - pInputBufHdrs[i]->nInputPortIndex = 0; - used_ip_buf_cnt++; - ret = OMX_EmptyThisBuffer(evrc_enc_handle, pInputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_EmptyThisBuffer success!\n"); - } - if(Size <=0 ){ - break;//eos reached - } - } - pthread_mutex_lock(&etb_lock); - if(etb_done) -{ - DEBUG_PRINT("Component is waiting for EBD to be released.\n"); - etb_event_complete(); - } - else - { - DEBUG_PRINT("\n****************************\n"); - DEBUG_PRINT("EBD not yet happened ...\n"); - DEBUG_PRINT("\n****************************\n"); - etb_done++; - } - pthread_mutex_unlock(&etb_lock); -} - - return 0; -} - - - -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE error=OMX_ErrorNone; - unsigned int bufCnt=0; - - /* To remove warning for unused variable to keep prototype same */ - (void)avc_enc_handle; - *pBufHdrs= (OMX_BUFFERHEADERTYPE **) - malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin); - - for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) { - DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt); - error = OMX_AllocateBuffer(evrc_enc_handle, &((*pBufHdrs)[bufCnt]), - nPortIndex, NULL, bufSize); - } - - return error; -} - - - - -static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr ) -{ - - size_t bytes_read=0; - - - pBufHdr->nFilledLen = 0; - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - - bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile); - - pBufHdr->nFilledLen = (OMX_U32)bytes_read; - // Time stamp logic - ((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp = \ - - (OMX_TICKS) ((total_pcm_bytes * 1000)/(samplerate * channels *2)); - - DEBUG_PRINT ("\n--time stamp -- %ld\n", (unsigned long)((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp); - if(bytes_read == 0) - { - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - DEBUG_PRINT ("\nBytes read zero\n"); - } - else - { - pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - - total_pcm_bytes = (unsigned)(total_pcm_bytes + bytes_read); - } - - return (int)bytes_read;; -} - - - -//In Encoder this Should Open a PCM or WAV file for input. - -static int open_audio_file () -{ - int error_code = 0; - - if (!tunnel) - { - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename); - inputBufferFile = fopen (in_filename, "rb"); - if (inputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - in_filename); - error_code = -1; - } - if(parse_pcm_header() != 0x00) - { - DEBUG_PRINT("PCM parser failed \n"); - return -1; - } - } - - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename); - outputBufferFile = fopen (out_filename, "wb"); - if (outputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - out_filename); - error_code = -1; - return error_code; - } - fseek(outputBufferFile, QCP_HEADER_SIZE, SEEK_SET); - return error_code; -} - -static OMX_ERRORTYPE parse_pcm_header() -{ - struct wav_header hdr; - - DEBUG_PRINT("\n***************************************************************\n"); - if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr)) - { - DEBUG_PRINT("Wav file cannot read header\n"); - return -1; - } - - if ((hdr.riff_id != ID_RIFF) || - (hdr.riff_fmt != ID_WAVE)|| - (hdr.fmt_id != ID_FMT)) - { - DEBUG_PRINT("Wav file is not a riff/wave file\n"); - return -1; - } - - if (hdr.audio_format != FORMAT_PCM) - { - DEBUG_PRINT("Wav file is not adpcm format %d and fmt size is %d\n", - hdr.audio_format, hdr.fmt_sz); - return -1; - } - - DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate); - DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels); - DEBUG_PRINT("\n***************************************************************\n"); - - samplerate = hdr.sample_rate; - channels = hdr.num_channels; - total_pcm_bytes = 0; - - return OMX_ErrorNone; -} diff --git a/mm-audio/aenc-g711/qdsp6/Android.mk b/mm-audio/aenc-g711/qdsp6/Android.mk index fd071eb1..b4e60d40 100644 --- a/mm-audio/aenc-g711/qdsp6/Android.mk +++ b/mm-audio/aenc-g711/qdsp6/Android.mk @@ -42,28 +42,6 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) - -# --------------------------------------------------------------------------------- -# Make the apps-test (mm-aenc-omxg711-test) -# --------------------------------------------------------------------------------- - -include $(CLEAR_VARS) - -mm-g711-enc-test-inc := $(LOCAL_PATH)/inc -mm-g711-enc-test-inc += $(LOCAL_PATH)/test -mm-g711-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore - -LOCAL_MODULE := mm-aenc-omxg711-test -LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS := $(libOmxG711Enc-def) -LOCAL_C_INCLUDES := $(mm-g711-enc-test-inc) -LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := libmm-omxcore -LOCAL_SHARED_LIBRARIES += libOmxG711Enc -LOCAL_SRC_FILES := test/omx_g711_enc_test.c - -include $(BUILD_EXECUTABLE) - endif # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-g711/qdsp6/Makefile b/mm-audio/aenc-g711/qdsp6/Makefile index 80dd4e53..f6bd921f 100644 --- a/mm-audio/aenc-g711/qdsp6/Makefile +++ b/mm-audio/aenc-g711/qdsp6/Makefile @@ -39,7 +39,7 @@ BININSTALLDIR := $(DESTDIR)usr/bin # --------------------------------------------------------------------------------- # BUILD # --------------------------------------------------------------------------------- -all: libOmxG711Enc.so.$(LIBVER) mm-aenc-omxg711-test +all: libOmxG711Enc.so.$(LIBVER) install: echo "intalling aenc-g711 in $(DESTDIR)" @@ -49,7 +49,6 @@ install: install -m 555 libOmxG711Enc.so.$(LIBVER) $(LIBINSTALLDIR) cd $(LIBINSTALLDIR) && ln -s libOmxG711Enc.so.$(LIBVER) libOmxG711Enc.so.$(LIBMAJOR) cd $(LIBINSTALLDIR) && ln -s libOmxG711Enc.so.$(LIBMAJOR) libOmxG711Enc.so - install -m 555 mm-aenc-omxg711-test $(BININSTALLDIR) # --------------------------------------------------------------------------------- # COMPILE LIBRARY @@ -65,17 +64,5 @@ libOmxG711Enc.so.$(LIBVER): $(SRCS) $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxG711Enc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS) # --------------------------------------------------------------------------------- -# COMPILE TEST APP -# --------------------------------------------------------------------------------- -TEST_LDLIBS := -lpthread -TEST_LDLIBS += -ldl -TEST_LDLIBS += -lOmxCore - -#TEST_SRCS := test/omx_g711_enc_test.c - -mm-aenc-omxg711-test: libOmxG711Enc.so.$(LIBVER) $(TEST_SRCS) - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS) - -# --------------------------------------------------------------------------------- # END # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-g711/qdsp6/Makefile.am b/mm-audio/aenc-g711/qdsp6/Makefile.am index f5ccca8b..688bae8e 100644 --- a/mm-audio/aenc-g711/qdsp6/Makefile.am +++ b/mm-audio/aenc-g711/qdsp6/Makefile.am @@ -23,8 +23,3 @@ libOmxG711Enc_la_CFLAGS = $(AM_CFLAGS) -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -inclu libOmxG711Enc_la_CPPFLAGS = $(AM_CFLAGS) -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -include glib.h libOmxG711Enc_la_LIBADD = $(GLIB_LIBS) -lcutils -llog -lstdc++ libOmxG711Enc_la_LDFLAGS = -shared -avoid-version - -bin_PROGRAMS = mm_aenc_omxg711_test -mm_aenc_omxg711_test_SOURCES = ./test/omx_g711_enc_test.c -mm_aenc_omxg711_test_CFLAGS = $(AM_CFLAGS) -Dstrlcpy=g_strlcpy $(GLIB_CFLAGS) -include glib.h -mm_aenc_omxg711_test_LDADD = $(GLIB_LIBS) -lmm-omxcore -lpthread libOmxG711Enc.la diff --git a/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c b/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c deleted file mode 100644 index 54e80ea2..00000000 --- a/mm-audio/aenc-g711/qdsp6/test/omx_g711_enc_test.c +++ /dev/null @@ -1,1026 +0,0 @@ -/*-------------------------------------------------------------------------- -Copyright (c) 2010, 2014, 2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------*/ - - -/* - An Open max test application .... -*/ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <time.h> -#include <sys/ioctl.h> -#include "OMX_Core.h" -#include "OMX_Component.h" -#include "pthread.h" -#include <signal.h> - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include<unistd.h> -#include<string.h> -#include <pthread.h> -#include "QOMX_AudioExtensions.h" -#include "QOMX_AudioIndexExtensions.h" -#include <linux/ioctl.h> - -typedef unsigned char uint8; -typedef unsigned char byte; -typedef unsigned int uint32; -typedef unsigned int uint16; - -QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam; - -void Release_Encoder(); - -#ifdef AUDIOV2 -unsigned short session_id; -int device_id; -int control = 0; -const char *device="handset_tx"; -#define DIR_TX 2 -#endif - -#define MIN(A,B) (((A) < (B))?(A):(B)) - -FILE *F1 = NULL; - -uint32_t channels = 1; -uint32_t samplerate = 8000; -uint32_t pcmplayback = 0; -uint32_t tunnel = 0; -uint32_t rectime = 0; -uint32_t encode_format = 0; -#define DEBUG_PRINT printf -unsigned to_idle_transition = 0; - - -/************************************************************************/ -/* #DEFINES */ -/************************************************************************/ -#define false 0 -#define true 1 - -#define CONFIG_VERSION_SIZE(param) \ - param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\ - param.nSize = sizeof(param); - -#define FAILED(result) (result != OMX_ErrorNone) - -#define SUCCEEDED(result) (result == OMX_ErrorNone) - -/************************************************************************/ -/* GLOBAL DECLARATIONS */ -/************************************************************************/ - -pthread_mutex_t lock; -pthread_cond_t cond; -pthread_mutex_t elock; -pthread_cond_t econd; -pthread_cond_t fcond; -pthread_mutex_t etb_lock; -pthread_mutex_t etb_lock1; -pthread_cond_t etb_cond; -FILE * inputBufferFile; -FILE * outputBufferFile; -OMX_PARAM_PORTDEFINITIONTYPE inputportFmt; -OMX_PARAM_PORTDEFINITIONTYPE outputportFmt; -OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; -OMX_PORT_PARAM_TYPE portParam; -OMX_ERRORTYPE error; - - - - -#define ID_RIFF 0x46464952 -#define ID_WAVE 0x45564157 -#define ID_FMT 0x20746d66 -#define ID_DATA 0x61746164 -#define ID_FACT 0x74636166 - -#define FORMAT_PCM 0x0001 -#define FORMAT_ALAW 0x0006 -#define FORMAT_MULAW 0x0007 - -struct wav_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint32_t data_id; - uint32_t data_sz; -}; - -struct __attribute__((__packed__)) g711_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint16_t extension_size; - uint32_t fact_id; - uint32_t fact_sz; - uint32_t sample_length; - uint32_t data_id; - uint32_t data_sz; -}; - -struct enc_meta_out{ - unsigned int offset_to_frame; - unsigned int frame_size; - unsigned int encoded_pcm_samples; - unsigned int msw_ts; - unsigned int lsw_ts; - unsigned int nflags; -} __attribute__ ((packed)); - -static int totaldatalen = 0; - -static struct wav_header hdr; -static struct g711_header g711hdr; -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -unsigned int input_buf_cnt = 0; -unsigned int output_buf_cnt = 0; -int used_ip_buf_cnt = 0; -volatile int event_is_done = 0; -volatile int ebd_event_is_done = 0; -volatile int fbd_event_is_done = 0; -volatile int etb_event_is_done = 0; -int ebd_cnt; -int bInputEosReached = 0; -int bOutputEosReached = 0; -int bInputEosReached_tunnel = 0; -static int etb_done = 0; -int bFlushing = false; -int bPause = false; -const char *in_filename; -const char *out_filename; - -int timeStampLfile = 0; -int timestampInterval = 100; - -//* OMX Spec Version supported by the wrappers. Version = 1.1 */ -const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101; -OMX_COMPONENTTYPE* g711_enc_handle = 0; - -OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL; -OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL; - -/************************************************************************/ -/* GLOBAL FUNC DECL */ -/************************************************************************/ -int Init_Encoder(char*); -int Play_Encoder(); -OMX_STRING aud_comp; -/**************************************************************************/ -/* STATIC DECLARATIONS */ -/**************************************************************************/ - -static int open_audio_file (); -static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr ); -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *g711_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize); - - -static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData); -static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); - -static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); -static OMX_ERRORTYPE parse_pcm_header(); -static OMX_ERRORTYPE attach_g711_header(); -void wait_for_event(void) -{ - pthread_mutex_lock(&lock); - DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done); - while (event_is_done == 0) { - pthread_cond_wait(&cond, &lock); - } - event_is_done = 0; - pthread_mutex_unlock(&lock); -} - -void event_complete(void ) -{ - pthread_mutex_lock(&lock); - if (event_is_done == 0) { - event_is_done = 1; - pthread_cond_broadcast(&cond); - } - pthread_mutex_unlock(&lock); -} - -void etb_wait_for_event(void) -{ - pthread_mutex_lock(&etb_lock1); - DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done); - while (etb_event_is_done == 0) { - pthread_cond_wait(&etb_cond, &etb_lock1); - } - etb_event_is_done = 0; - pthread_mutex_unlock(&etb_lock1); -} - -void etb_event_complete(void ) -{ - pthread_mutex_lock(&etb_lock1); - if (etb_event_is_done == 0) { - etb_event_is_done = 1; - pthread_cond_broadcast(&etb_cond); - } - pthread_mutex_unlock(&etb_lock1); -} - - -OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData) -{ - DEBUG_PRINT("Function %s \n", __FUNCTION__); - /* To remove warning for unused variable to keep prototype same */ - (void)hComponent; - (void)pAppData; - (void)pEventData; - - switch(eEvent) { - case OMX_EventCmdComplete: - DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent, - nData1,nData2); - event_complete(); - break; - case OMX_EventError: - DEBUG_PRINT("\n OMX_EventError \n"); - break; - case OMX_EventBufferFlag: - DEBUG_PRINT("\n OMX_EventBufferFlag \n"); - bOutputEosReached = true; - event_complete(); - break; - case OMX_EventPortSettingsChanged: - DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n"); - break; - default: - DEBUG_PRINT("\n Unknown Event \n"); - break; - } - return OMX_ErrorNone; -} - -OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - size_t bytes_writen = 0; - size_t total_bytes_writen = 0; - size_t len = 0; - struct enc_meta_out *meta = NULL; - OMX_U8 *src = pBuffer->pBuffer; - unsigned int num_of_frames = 1; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - DEBUG_PRINT("FBD::EOS on output port totaldatalen %d\n ", totaldatalen); - bOutputEosReached = true; - g711hdr.data_sz = (uint32_t)totaldatalen; - g711hdr.sample_length = (uint32_t)totaldatalen; - g711hdr.riff_sz = g711hdr.data_sz + sizeof(g711hdr) - 8; - fseek(outputBufferFile, 0, SEEK_SET); - fwrite(&g711hdr,1, sizeof(g711hdr), outputBufferFile); - fseek(outputBufferFile, 0, SEEK_END); - return OMX_ErrorNone; - } - if(bInputEosReached_tunnel || bOutputEosReached) - { - DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n"); - return OMX_ErrorNone; - } - if(num_of_frames != src[0]){ - - printf("Data corrupt\n"); - return OMX_ErrorNone; - } - /* Skip the first bytes */ - - - - src += sizeof(unsigned char); - meta = (struct enc_meta_out *)src; - while (num_of_frames > 0) { - meta = (struct enc_meta_out *)src; - len = meta->frame_size; - bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile); - if(bytes_writen < len) - { - DEBUG_PRINT("error: invalid g711 encoded data \n"); - return OMX_ErrorNone; - } - src += sizeof(struct enc_meta_out); - num_of_frames--; - total_bytes_writen += len; - } - DEBUG_PRINT(" FillBufferDone size writen to file %zu\n",total_bytes_writen); - totaldatalen = totaldatalen + (int)total_bytes_writen; - - DEBUG_PRINT(" FBD calling FTB\n"); - OMX_FillThisBuffer(hComponent,pBuffer); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - int readBytes =0; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - ebd_cnt++; - used_ip_buf_cnt--; - pthread_mutex_lock(&etb_lock); - if(!etb_done) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT("Wait till first set of buffers are given to component\n"); - DEBUG_PRINT("\n*********************************************\n"); - etb_done++; - pthread_mutex_unlock(&etb_lock); - etb_wait_for_event(); - } - else - { - pthread_mutex_unlock(&etb_lock); - } - - - if(bInputEosReached) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT(" EBD::EOS on input port\n "); - DEBUG_PRINT("*********************************************\n"); - return OMX_ErrorNone; - }else if (bFlushing == true) { - DEBUG_PRINT("omx_g711_aenc_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - if (used_ip_buf_cnt == 0) { - bFlushing = false; - } else { - DEBUG_PRINT("omx_g711_aenc_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - return OMX_ErrorNone; - } - } - - if((readBytes = Read_Buffer(pBuffer)) > 0) { - pBuffer->nFilledLen = (OMX_U32)readBytes; - used_ip_buf_cnt++; - OMX_EmptyThisBuffer(hComponent,pBuffer); - } - else{ - pBuffer->nFlags |= OMX_BUFFERFLAG_EOS; - used_ip_buf_cnt++; - bInputEosReached = true; - pBuffer->nFilledLen = 0; - OMX_EmptyThisBuffer(hComponent,pBuffer); - DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n"); - } - return OMX_ErrorNone; -} - -void signal_handler(int sig_id) { - - /* Flush */ - if (sig_id == SIGUSR1) { - DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__); - bFlushing = true; - OMX_SendCommand(g711_enc_handle, OMX_CommandFlush, OMX_ALL, NULL); - } else if (sig_id == SIGUSR2) { - if (bPause == true) { - DEBUG_PRINT("%s resume playback\n", __FUNCTION__); - bPause = false; - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); - } else { - DEBUG_PRINT("%s pause playback\n", __FUNCTION__); - bPause = true; - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL); - } - } -} - -int main(int argc, char **argv) -{ - unsigned int bufCnt=0; - OMX_ERRORTYPE result; - - struct sigaction sa; - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = &signal_handler; - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - - (void) signal(SIGINT, Release_Encoder); - - pthread_cond_init(&cond, 0); - pthread_mutex_init(&lock, 0); - pthread_cond_init(&etb_cond, 0); - pthread_mutex_init(&etb_lock, 0); - pthread_mutex_init(&etb_lock1, 0); - - if (argc >= 5) { - in_filename = argv[1]; - out_filename = argv[2]; - encode_format = (uint32_t)atoi(argv[3]); - tunnel = (uint32_t)atoi(argv[4]); - rectime = (uint32_t)atoi(argv[5]); - - - DEBUG_PRINT("Input parameters: enocder format= %d, tunnel %d, rectime = %d\n", - encode_format, tunnel, rectime); - - } else { - DEBUG_PRINT(" invalid format: \n"); - DEBUG_PRINT("ex: ./mm-aenc-omxg711 INPUTFILE G711_OUTPUTFILE ENCODE_FORMAT TUNNEL RECORDTIME \n"); - DEBUG_PRINT("ENCODE formats are : G711MLAW :0 , G711ALAW: 1"); - DEBUG_PRINT("FOR TUNNEL MOD PASS INPUT FILE AS ZERO\n"); - DEBUG_PRINT("RECORDTIME in seconds for AST Automation ...TUNNEL MODE ONLY\n"); - return 0; - } - if(tunnel == 0) { - if(encode_format == 0) { - aud_comp = "OMX.qcom.audio.encoder.g711mlaw"; - } - else { - aud_comp = "OMX.qcom.audio.encoder.g711alaw"; - } - } else { - if(encode_format == 0) { - aud_comp = "OMX.qcom.audio.encoder.tunneled.g711mlaw"; - } - else { - aud_comp = "OMX.qcom.audio.encoder.tunneled.g711alaw"; - } - } - if(Init_Encoder(aud_comp)!= 0x00) - { - DEBUG_PRINT("Decoder Init failed\n"); - return -1; - } - - fcntl(0, F_SETFL, O_NONBLOCK); - - if(Play_Encoder() != 0x00) - { - DEBUG_PRINT("Play_Decoder failed\n"); - return -1; - } - - // Wait till EOS is reached... - if(rectime && tunnel) - { - sleep(rectime); - rectime = 0; - bInputEosReached_tunnel = 1; - DEBUG_PRINT("\EOS ON INPUT PORT\n"); - } - else - { - wait_for_event(); - } - - if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel)) - { - - DEBUG_PRINT("\nMoving the decoder to idle state \n"); - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - wait_for_event(); - DEBUG_PRINT("\nMoving the encoder to loaded state \n"); - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0); - sleep(1); - if (!tunnel) - { - DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); - for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(g711_enc_handle, 0, pInputBufHdrs[bufCnt]); - } - } - - DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n"); - for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(g711_enc_handle, 1, pOutputBufHdrs[bufCnt]); - } - wait_for_event(); - - result = OMX_FreeHandle(g711_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - OMX_Deinit(); - ebd_cnt=0; - bOutputEosReached = false; - bInputEosReached_tunnel = false; - bInputEosReached = 0; - g711_enc_handle = NULL; - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - fclose(outputBufferFile); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...G711 ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - } - return 0; -} - -void Release_Encoder() -{ - static int cnt=0; - OMX_ERRORTYPE result; - - DEBUG_PRINT("END OF G711 ENCODING: EXITING PLEASE WAIT\n"); - bInputEosReached_tunnel = 1; - event_complete(); - cnt++; - if(cnt > 1) - { - /* FORCE RESET */ - g711_enc_handle = NULL; - ebd_cnt=0; - bInputEosReached_tunnel = false; - - result = OMX_FreeHandle(g711_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - - OMX_Deinit(); - - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...G711 ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - exit(0); - } -} - -int Init_Encoder(OMX_STRING audio_component) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE omxresult; - OMX_U32 total = 0; - typedef OMX_U8* OMX_U8_PTR; - char *role ="audio_encoder"; - - static OMX_CALLBACKTYPE call_back = { - &EventHandler,&EmptyBufferDone,&FillBufferDone - }; - - /* Init. the OpenMAX Core */ - DEBUG_PRINT("\nInitializing OpenMAX Core....\n"); - omxresult = OMX_Init(); - - if(OMX_ErrorNone != omxresult) { - DEBUG_PRINT("\n Failed to Init OpenMAX core"); - return -1; - } - else { - DEBUG_PRINT("\nOpenMAX Core Init Done\n"); - } - - /* Query for audio decoders*/ - DEBUG_PRINT("G711_test: Before entering OMX_GetComponentOfRole"); - OMX_GetComponentsOfRole(role, &total, 0); - DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total); - - - omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&g711_enc_handle), - (OMX_STRING)audio_component, NULL, &call_back); - if (FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component); - return -1; - } - else - { - DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component); - } - - /* Get the port information */ - CONFIG_VERSION_SIZE(portParam); - omxresult = OMX_GetParameter(g711_enc_handle, OMX_IndexParamAudioInit, - (OMX_PTR)&portParam); - - if(FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to get Port Param\n"); - return -1; - } - else - { - DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts); - DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n", - portParam.nStartPortNumber); - } - return 0; -} - -int Play_Encoder() -{ - unsigned int i; - int Size=0; - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE ret; - OMX_INDEXTYPE index; -#ifdef __LP64__ - DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#else - DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#endif - - /* open the i/p and o/p files based on the video file format passed */ - if(open_audio_file()) { - DEBUG_PRINT("\n Returning -1"); - return -1; - } - - /* Query the encoder input min buf requirements */ - CONFIG_VERSION_SIZE(inputportFmt); - - /* Port for which the Client needs to obtain info */ - inputportFmt.nPortIndex = portParam.nStartPortNumber; - - OMX_GetParameter(g711_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt); - DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize); - - if(OMX_DirInput != inputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Input Port\n"); - return -1; - } - - pcmParams.nPortIndex = 0; - pcmParams.nChannels = channels; - pcmParams.bInterleaved = OMX_TRUE; - pcmParams.nSamplingRate = samplerate; - OMX_SetParameter(g711_enc_handle,OMX_IndexParamAudioPcm,&pcmParams); - - - /* Query the encoder outport's min buf requirements */ - CONFIG_VERSION_SIZE(outputportFmt); - /* Port for which the Client needs to obtain info */ - outputportFmt.nPortIndex = portParam.nStartPortNumber + 1; - - OMX_GetParameter(g711_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt); - DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize); - - if(OMX_DirOutput != outputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Output Port\n"); - return -1; - } - - - CONFIG_VERSION_SIZE(pcmParams); - - - pcmParams.nPortIndex = 1; - pcmParams.nChannels = channels; //Only mono is supported - pcmParams.nSamplingRate = samplerate; - OMX_SetParameter(g711_enc_handle,OMX_IndexParamAudioPcm,&pcmParams); - OMX_GetExtensionIndex(g711_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index); - OMX_GetParameter(g711_enc_handle,index,&streaminfoparam); - DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n"); - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - /* wait_for_event(); should not wait here event complete status will - not come until enough buffer are allocated */ - if (tunnel == 0) - { - input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5; - DEBUG_PRINT("Transition to Idle State succesful...\n"); - /* Allocate buffer on decoder's i/p port */ - error = Allocate_Buffer(g711_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex, - input_buf_cnt, inputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pInputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n"); - } - } - output_buf_cnt = outputportFmt.nBufferCountMin ; - - /* Allocate buffer on encoder's O/Pp port */ - error = Allocate_Buffer(g711_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex, - output_buf_cnt, outputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pOutputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n"); - } - - wait_for_event(); - - if (tunnel == 1) - { - DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n"); - OMX_SendCommand(g711_enc_handle, OMX_CommandPortDisable,0,0); // disable input port - wait_for_event(); - } - - DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n"); - OMX_SendCommand(g711_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0); - wait_for_event(); - - DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n"); - - attach_g711_header(); - - for(i=0; i < output_buf_cnt; i++) { - DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i); - pOutputBufHdrs[i]->nOutputPortIndex = 1; - pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - ret = OMX_FillThisBuffer(g711_enc_handle, pOutputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_FillThisBuffer success!\n"); - } - } - - if(tunnel == 0) - { - DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n"); - for (i = 0;i < input_buf_cnt;i++) { - DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i); - pInputBufHdrs[i]->nInputPortIndex = 0; - Size = Read_Buffer(pInputBufHdrs[i]); - if(Size <=0 ){ - DEBUG_PRINT("NO DATA READ\n"); - bInputEosReached = true; - pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS; - } - pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size; - pInputBufHdrs[i]->nInputPortIndex = 0; - used_ip_buf_cnt++; - ret = OMX_EmptyThisBuffer(g711_enc_handle, pInputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_EmptyThisBuffer success!\n"); - } - if(Size <=0 ){ - break;//eos reached - } - } - pthread_mutex_lock(&etb_lock); - if(etb_done) - { - DEBUG_PRINT("Component is waiting for EBD to be released.\n"); - etb_event_complete(); - } - else - { - DEBUG_PRINT("\n****************************\n"); - DEBUG_PRINT("EBD not yet happened ...\n"); - DEBUG_PRINT("\n****************************\n"); - etb_done++; - } - pthread_mutex_unlock(&etb_lock); - } - return 0; -} - - - -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE error=OMX_ErrorNone; - unsigned int bufCnt=0; - /* To remove warning for unused variable to keep prototype same */ - (void)avc_enc_handle; - - *pBufHdrs= (OMX_BUFFERHEADERTYPE **) - malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin); - - for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) { - DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt); - error = OMX_AllocateBuffer(g711_enc_handle, &((*pBufHdrs)[bufCnt]), - nPortIndex, NULL, bufSize); - } - return error; -} - - - - -static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr ) -{ - size_t bytes_read=0; - pBufHdr->nFilledLen = 0; - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - - bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile); - - pBufHdr->nFilledLen = (OMX_U32)bytes_read; - if(bytes_read == 0) - { - - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - DEBUG_PRINT ("\nBytes read zero\n"); - } - else - { - pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - } - - return (int)bytes_read; -} - - - -//In Encoder this Should Open a PCM or WAV file for input. - -static int open_audio_file () -{ - int error_code = 0; - - if (!tunnel) - { - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename); - inputBufferFile = fopen (in_filename, "rb"); - if (inputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - in_filename); - error_code = -1; - } - if(parse_pcm_header() != 0x00) - { - DEBUG_PRINT("PCM parser failed \n"); - return -1; - } - } - - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename); - outputBufferFile = fopen (out_filename, "wb"); - if (outputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - out_filename); - error_code = -1; - } - return error_code; -} - -static OMX_ERRORTYPE attach_g711_header() -{ - - memset(&g711hdr, 0, sizeof(struct g711_header)); - - g711hdr.riff_id = ID_RIFF; - g711hdr.riff_fmt = ID_WAVE; - g711hdr.fmt_id = ID_FMT; - g711hdr.fmt_sz = 18; - - //change format type from wav to g711 - if(encode_format == 0) { - g711hdr.audio_format = FORMAT_MULAW; - } - else { - g711hdr.audio_format = FORMAT_ALAW; - } - - g711hdr.num_channels = hdr.num_channels; - g711hdr.sample_rate = hdr.sample_rate; - g711hdr.bits_per_sample = 8; - g711hdr.byte_rate = g711hdr.sample_rate * g711hdr.num_channels * (g711hdr.bits_per_sample / 8); - g711hdr.block_align = (uint16_t)((g711hdr.bits_per_sample / 8) * g711hdr.num_channels); - g711hdr.extension_size = 0; - g711hdr.fact_id = ID_FACT; - g711hdr.fact_sz = 4; - g711hdr.data_id = ID_DATA; - g711hdr.data_sz = 0; - g711hdr.riff_sz = g711hdr.data_sz + sizeof(g711hdr) - 8; - - fwrite(&g711hdr,1, sizeof(g711hdr), outputBufferFile); - - /*To Do : Attach Fact chunk for Non -PCM format */ - return OMX_ErrorNone; -} - -static OMX_ERRORTYPE parse_pcm_header() -{ - - DEBUG_PRINT("\n***************************************************************\n"); - if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr)) - { - DEBUG_PRINT("Wav file cannot read header\n"); - return -1; - } - - if ((hdr.riff_id != ID_RIFF) || - (hdr.riff_fmt != ID_WAVE)|| - (hdr.fmt_id != ID_FMT)) - { - DEBUG_PRINT("Wav file is not a riff/wave file\n"); - return -1; - } - - if (hdr.audio_format != FORMAT_PCM) - { - DEBUG_PRINT("Wav file is not pcm format %d and fmt size is %d\n", - hdr.audio_format, hdr.fmt_sz); - return -1; - } - - if ((hdr.sample_rate != 8000) && (hdr.sample_rate != 16000)) { - DEBUG_PRINT("samplerate = %d, not supported, Supported " - "samplerates are 8000, 16000", samplerate); - return -1; - } - - if (hdr.num_channels != 1) { - DEBUG_PRINT("stereo and multi channel are not supported, channels %d" - , hdr.num_channels); - return -1; - } - - DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate); - DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels); - DEBUG_PRINT("\n***************************************************************\n"); - - samplerate = hdr.sample_rate; - channels = hdr.num_channels; - - return OMX_ErrorNone; -} diff --git a/mm-audio/aenc-qcelp13/qdsp6/Android.mk b/mm-audio/aenc-qcelp13/qdsp6/Android.mk index 6841d1af..b575d7f3 100644 --- a/mm-audio/aenc-qcelp13/qdsp6/Android.mk +++ b/mm-audio/aenc-qcelp13/qdsp6/Android.mk @@ -41,30 +41,6 @@ LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr include $(BUILD_SHARED_LIBRARY) - -# --------------------------------------------------------------------------------- -# Make the apps-test (mm-aenc-omxqcelp13-test) -# --------------------------------------------------------------------------------- - -include $(CLEAR_VARS) - -mm-qcelp13-enc-test-inc := $(LOCAL_PATH)/inc -mm-qcelp13-enc-test-inc += $(LOCAL_PATH)/test - -mm-qcelp13-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-core/omxcore -mm-qcelp13-enc-test-inc += $(TARGET_OUT_HEADERS)/mm-audio/audio-alsa -LOCAL_MODULE := mm-aenc-omxqcelp13-test -LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS := $(libOmxQcelp13Enc-def) -LOCAL_C_INCLUDES := $(mm-qcelp13-enc-test-inc) -LOCAL_PRELINK_MODULE := false -LOCAL_SHARED_LIBRARIES := libmm-omxcore -LOCAL_SHARED_LIBRARIES += libOmxQcelp13Enc -LOCAL_SHARED_LIBRARIES += libaudioalsa -LOCAL_SRC_FILES := test/omx_qcelp13_enc_test.c - -include $(BUILD_EXECUTABLE) - endif # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-qcelp13/qdsp6/Makefile b/mm-audio/aenc-qcelp13/qdsp6/Makefile index b14655bd..9bbc4ab1 100644 --- a/mm-audio/aenc-qcelp13/qdsp6/Makefile +++ b/mm-audio/aenc-qcelp13/qdsp6/Makefile @@ -39,7 +39,7 @@ BININSTALLDIR := $(DESTDIR)usr/bin # --------------------------------------------------------------------------------- # BUILD # --------------------------------------------------------------------------------- -all: libOmxQcelp13Enc.so.$(LIBVER) mm-aenc-omxqcelp13-test +all: libOmxQcelp13Enc.so.$(LIBVER) install: echo "intalling aenc-qcelp13 in $(DESTDIR)" @@ -49,8 +49,7 @@ install: install -m 555 libOmxQcelp13Enc.so.$(LIBVER) $(LIBINSTALLDIR) cd $(LIBINSTALLDIR) && ln -s libOmxQcelp13Enc.so.$(LIBVER) libOmxQcelp13Enc.so.$(LIBMAJOR) cd $(LIBINSTALLDIR) && ln -s libOmxQcelp13Enc.so.$(LIBMAJOR) libOmxQcelp13Enc.so - install -m 555 mm-aenc-omxqcelp13-test $(BININSTALLDIR) - + # --------------------------------------------------------------------------------- # COMPILE LIBRARY # --------------------------------------------------------------------------------- @@ -65,17 +64,5 @@ libOmxQcelp13Enc.so.$(LIBVER): $(SRCS) $(CC) $(CPPFLAGS) $(CFLAGS_SO) $(LDFLAGS_SO) -Wl,-soname,libOmxQcelp13Enc.so.$(LIBMAJOR) -o $@ $^ $(LDFLAGS) $(LDLIBS) # --------------------------------------------------------------------------------- -# COMPILE TEST APP -# --------------------------------------------------------------------------------- -TEST_LDLIBS := -lpthread -TEST_LDLIBS += -ldl -TEST_LDLIBS += -lOmxCore - -TEST_SRCS := test/omx_qcelp13_enc_test.c - -mm-aenc-omxqcelp13-test: libOmxQcelp13Enc.so.$(LIBVER) $(TEST_SRCS) - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $^ $(TEST_LDLIBS) - -# --------------------------------------------------------------------------------- # END # --------------------------------------------------------------------------------- diff --git a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c b/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c deleted file mode 100644 index 432c07a1..00000000 --- a/mm-audio/aenc-qcelp13/qdsp6/test/omx_qcelp13_enc_test.c +++ /dev/null @@ -1,1101 +0,0 @@ - -/*-------------------------------------------------------------------------- -Copyright (c) 2010-2014, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of The Linux Foundation nor - the names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------------*/ - - -/* - An Open max test application .... -*/ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <time.h> -#include <sys/ioctl.h> -#include "OMX_Core.h" -#include "OMX_Component.h" -#include "pthread.h" -#include <signal.h> - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <stdint.h> -#include <sys/mman.h> -#include <sys/ioctl.h> -#include<unistd.h> -#include<string.h> -#include <pthread.h> -#include "QOMX_AudioExtensions.h" -#include "QOMX_AudioIndexExtensions.h" -#ifdef AUDIOV2 -#include "control.h" -#endif - - -#include <linux/ioctl.h> - -typedef unsigned char uint8; -typedef unsigned char byte; -typedef unsigned int uint32; -typedef unsigned int uint16; -QOMX_AUDIO_STREAM_INFO_DATA streaminfoparam; -/* maximum ADTS frame header length */ -void Release_Encoder(); - -#ifdef AUDIOV2 -unsigned short session_id; -int device_id; -int control = 0; -const char *device="handset_tx"; -#define DIR_TX 2 -#endif - -uint32_t samplerate = 8000; -uint32_t channels = 1; -uint32_t min_bitrate = 0; -uint32_t max_bitrate = 0; -uint32_t cdmarate = 0; -uint32_t rectime = 0; -uint32_t recpath = 0; -uint32_t pcmplayback = 0; -uint32_t tunnel = 0; -uint32_t format = 1; -#define DEBUG_PRINT printf -unsigned to_idle_transition = 0; -unsigned long total_pcm_bytes; - -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -/************************************************************************/ -/* #DEFINES */ -/************************************************************************/ -#define false 0 -#define true 1 - -#define CONFIG_VERSION_SIZE(param) \ - param.nVersion.nVersion = CURRENT_OMX_SPEC_VERSION;\ - param.nSize = sizeof(param); - -#define QCP_HEADER_SIZE sizeof(struct qcp_header) -#define MIN_BITRATE 4 /* Bit rate 1 - 13.6 , 2 - 6.2 , 3 - 2.7 , 4 - 1.0 kbps*/ -#define MAX_BITRATE 4 - -#define FAILED(result) (result != OMX_ErrorNone) - -#define SUCCEEDED(result) (result == OMX_ErrorNone) - -/************************************************************************/ -/* GLOBAL DECLARATIONS */ -/************************************************************************/ - -pthread_mutex_t lock; -pthread_cond_t cond; -pthread_mutex_t elock; -pthread_cond_t econd; -pthread_cond_t fcond; -pthread_mutex_t etb_lock; -pthread_mutex_t etb_lock1; -pthread_cond_t etb_cond; -FILE * inputBufferFile; -FILE * outputBufferFile; -OMX_PARAM_PORTDEFINITIONTYPE inputportFmt; -OMX_PARAM_PORTDEFINITIONTYPE outputportFmt; -OMX_AUDIO_PARAM_QCELP13TYPE qcelp13param; -OMX_AUDIO_PARAM_PCMMODETYPE pcmparam; -OMX_PORT_PARAM_TYPE portParam; -OMX_PORT_PARAM_TYPE portFmt; -OMX_ERRORTYPE error; - - - - -#define ID_RIFF 0x46464952 -#define ID_WAVE 0x45564157 -#define ID_FMT 0x20746d66 -#define ID_DATA 0x61746164 - -#define FORMAT_PCM 1 - -struct wav_header { - uint32_t riff_id; - uint32_t riff_sz; - uint32_t riff_fmt; - uint32_t fmt_id; - uint32_t fmt_sz; - uint16_t audio_format; - uint16_t num_channels; - uint32_t sample_rate; - uint32_t byte_rate; /* sample_rate * num_channels * bps / 8 */ - uint16_t block_align; /* num_channels * bps / 8 */ - uint16_t bits_per_sample; - uint32_t data_id; - uint32_t data_sz; -}; -struct enc_meta_out{ - unsigned int offset_to_frame; - unsigned int frame_size; - unsigned int encoded_pcm_samples; - unsigned int msw_ts; - unsigned int lsw_ts; - unsigned int nflags; -} __attribute__ ((packed)); - -struct qcp_header { - /* RIFF Section */ - char riff[4]; - unsigned int s_riff; - char qlcm[4]; - - /* Format chunk */ - char fmt[4]; - unsigned int s_fmt; - char mjr; - char mnr; - unsigned int data1; /* UNIQUE ID of the codec */ - unsigned short data2; - unsigned short data3; - char data4[8]; - unsigned short ver; /* Codec Info */ - char name[80]; - unsigned short abps; /* average bits per sec of the codec */ - unsigned short bytes_per_pkt; - unsigned short samp_per_block; - unsigned short samp_per_sec; - unsigned short bits_per_samp; - unsigned char vr_num_of_rates; /* Rate Header fmt info */ - unsigned char rvd1[3]; - unsigned short vr_bytes_per_pkt[8]; - unsigned int rvd2[5]; - - /* Vrat chunk */ - unsigned char vrat[4]; - unsigned int s_vrat; - unsigned int v_rate; - unsigned int size_in_pkts; - - /* Data chunk */ - unsigned char data[4]; - unsigned int s_data; -} __attribute__ ((packed)); - - /* Common part */ - static struct qcp_header append_header = { - {'R', 'I', 'F', 'F'}, 0, {'Q', 'L', 'C', 'M'}, - {'f', 'm', 't', ' '}, 150, 1, 0, 0, 0, 0,{0}, 0, {0},0,0,160,8000,16,0,{0},{0},{0}, - {'v','r','a','t'},0, 0, 0,{'d','a','t','a'},0 - }; - -static int totaldatalen = 0; -static int framecnt = 0; -/************************************************************************/ -/* GLOBAL INIT */ -/************************************************************************/ - -unsigned int input_buf_cnt = 0; -unsigned int output_buf_cnt = 0; -int used_ip_buf_cnt = 0; -volatile int event_is_done = 0; -volatile int ebd_event_is_done = 0; -volatile int fbd_event_is_done = 0; -volatile int etb_event_is_done = 0; -int ebd_cnt; -int bInputEosReached = 0; -int bOutputEosReached = 0; -int bInputEosReached_tunnel = 0; -static int etb_done = 0; -int bFlushing = false; -int bPause = false; -const char *in_filename; -const char *out_filename; - -int timeStampLfile = 0; -int timestampInterval = 100; - -//* OMX Spec Version supported by the wrappers. Version = 1.1 */ -const OMX_U32 CURRENT_OMX_SPEC_VERSION = 0x00000101; -OMX_COMPONENTTYPE* qcelp13_enc_handle = 0; - -OMX_BUFFERHEADERTYPE **pInputBufHdrs = NULL; -OMX_BUFFERHEADERTYPE **pOutputBufHdrs = NULL; - -/************************************************************************/ -/* GLOBAL FUNC DECL */ -/************************************************************************/ -int Init_Encoder(char*); -int Play_Encoder(); -OMX_STRING aud_comp; -/**************************************************************************/ -/* STATIC DECLARATIONS */ -/**************************************************************************/ - -static int open_audio_file (); -static int Read_Buffer(OMX_BUFFERHEADERTYPE *pBufHdr ); -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *qcelp13_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize); - - -static OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData); -static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); - -static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); -static OMX_ERRORTYPE parse_pcm_header(); -void wait_for_event(void) -{ - pthread_mutex_lock(&lock); - DEBUG_PRINT("%s: event_is_done=%d", __FUNCTION__, event_is_done); - while (event_is_done == 0) { - pthread_cond_wait(&cond, &lock); - } - event_is_done = 0; - pthread_mutex_unlock(&lock); -} - -void event_complete(void ) -{ - pthread_mutex_lock(&lock); - if (event_is_done == 0) { - event_is_done = 1; - pthread_cond_broadcast(&cond); - } - pthread_mutex_unlock(&lock); -} - -void etb_wait_for_event(void) -{ - pthread_mutex_lock(&etb_lock1); - DEBUG_PRINT("%s: etb_event_is_done=%d", __FUNCTION__, etb_event_is_done); - while (etb_event_is_done == 0) { - pthread_cond_wait(&etb_cond, &etb_lock1); - } - etb_event_is_done = 0; - pthread_mutex_unlock(&etb_lock1); -} - -void etb_event_complete(void ) -{ - pthread_mutex_lock(&etb_lock1); - if (etb_event_is_done == 0) { - etb_event_is_done = 1; - pthread_cond_broadcast(&etb_cond); - } - pthread_mutex_unlock(&etb_lock1); -} - -static void create_qcp_header(int Datasize, int Frames) -{ - append_header.s_riff = (unsigned)(Datasize + (int)QCP_HEADER_SIZE - 8); - /* exclude riff id and size field */ - append_header.data1 = 0x5E7F6D41; - append_header.data2 = 0xB115; - append_header.data3 = 0x11D0; - append_header.data4[0] = 0xBA; - append_header.data4[1] = 0x91; - append_header.data4[2] = 0x00; - append_header.data4[3] = 0x80; - append_header.data4[4] = 0x5F; - append_header.data4[5] = 0xB4; - append_header.data4[6] = 0xB9; - append_header.data4[7] = 0x7E; - append_header.ver = 0x0002; - memcpy(append_header.name, "Qcelp 13K", 9); - append_header.abps = 13000; - append_header.bytes_per_pkt = 35; - append_header.vr_num_of_rates = 5; - append_header.vr_bytes_per_pkt[0] = 0x0422; - append_header.vr_bytes_per_pkt[1] = 0x0310; - append_header.vr_bytes_per_pkt[2] = 0x0207; - append_header.vr_bytes_per_pkt[3] = 0x0103; - append_header.s_vrat = 0x00000008; - append_header.v_rate = 0x00000001; - append_header.size_in_pkts = (unsigned)Frames; - append_header.s_data = (unsigned)Datasize; - return; -} - -OMX_ERRORTYPE EventHandler(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_EVENTTYPE eEvent, - OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, - OMX_IN OMX_PTR pEventData) -{ - DEBUG_PRINT("Function %s \n", __FUNCTION__); - - /* To remove warning for unused variable to keep prototype same */ - (void)hComponent; - (void)pAppData; - (void)pEventData; - - switch(eEvent) { - case OMX_EventCmdComplete: - DEBUG_PRINT("\n OMX_EventCmdComplete event=%d data1=%u data2=%u\n",(OMX_EVENTTYPE)eEvent, - nData1,nData2); - event_complete(); - break; - case OMX_EventError: - DEBUG_PRINT("\n OMX_EventError \n"); - break; - case OMX_EventBufferFlag: - DEBUG_PRINT("\n OMX_EventBufferFlag \n"); - bOutputEosReached = true; - event_complete(); - break; - case OMX_EventPortSettingsChanged: - DEBUG_PRINT("\n OMX_EventPortSettingsChanged \n"); - break; - default: - DEBUG_PRINT("\n Unknown Event \n"); - break; - } - return OMX_ErrorNone; -} - -OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - size_t bytes_writen = 0; - size_t total_bytes_writen = 0; - size_t len = 0; - struct enc_meta_out *meta = NULL; - OMX_U8 *src = pBuffer->pBuffer; - unsigned int num_of_frames = 1; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - if(((pBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) { - DEBUG_PRINT("FBD::EOS on output port\n "); - bOutputEosReached = true; - return OMX_ErrorNone; - } - if(bInputEosReached_tunnel || bOutputEosReached) - { - DEBUG_PRINT("EOS REACHED NO MORE PROCESSING OF BUFFERS\n"); - return OMX_ErrorNone; - } - if(num_of_frames != src[0]){ - - printf("Data corrupt\n"); - return OMX_ErrorNone; - } - /* Skip the first bytes */ - - - - src += sizeof(unsigned char); - meta = (struct enc_meta_out *)src; - while (num_of_frames > 0) { - meta = (struct enc_meta_out *)src; - /*printf("offset=%d framesize=%d encoded_pcm[%d] msw_ts[%d]lsw_ts[%d] nflags[%d]\n", - meta->offset_to_frame, - meta->frame_size, - meta->encoded_pcm_samples, meta->msw_ts, meta->lsw_ts, meta->nflags);*/ - len = meta->frame_size; - - bytes_writen = fwrite(pBuffer->pBuffer + sizeof(unsigned char) + meta->offset_to_frame,1,len,outputBufferFile); - if(bytes_writen < len) - { - DEBUG_PRINT("error: invalid QCELP13 encoded data \n"); - return OMX_ErrorNone; - } - src += sizeof(struct enc_meta_out); - num_of_frames--; - total_bytes_writen += len; - } - DEBUG_PRINT(" FillBufferDone size writen to file %zu count %d\n",total_bytes_writen, framecnt); - totaldatalen = totaldatalen + (int)total_bytes_writen; - framecnt++; - - DEBUG_PRINT(" FBD calling FTB\n"); - OMX_FillThisBuffer(hComponent,pBuffer); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, - OMX_IN OMX_PTR pAppData, - OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) -{ - int readBytes =0; - - /* To remove warning for unused variable to keep prototype same */ - (void)pAppData; - - ebd_cnt++; - used_ip_buf_cnt--; - pthread_mutex_lock(&etb_lock); - if(!etb_done) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT("Wait till first set of buffers are given to component\n"); - DEBUG_PRINT("\n*********************************************\n"); - etb_done++; - pthread_mutex_unlock(&etb_lock); - etb_wait_for_event(); - } - else - { - pthread_mutex_unlock(&etb_lock); - } - - - if(bInputEosReached) - { - DEBUG_PRINT("\n*********************************************\n"); - DEBUG_PRINT(" EBD::EOS on input port\n "); - DEBUG_PRINT("*********************************************\n"); - return OMX_ErrorNone; - }else if (bFlushing == true) { - DEBUG_PRINT("omx_qcelp13_adec_test: bFlushing is set to TRUE used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - if (used_ip_buf_cnt == 0) { - bFlushing = false; - } else { - DEBUG_PRINT("omx_qcelp13_adec_test: more buffer to come back used_ip_buf_cnt=%d\n",used_ip_buf_cnt); - return OMX_ErrorNone; - } - } - - if((readBytes = Read_Buffer(pBuffer)) > 0) { - pBuffer->nFilledLen = (OMX_U32)readBytes; - used_ip_buf_cnt++; - OMX_EmptyThisBuffer(hComponent,pBuffer); - } - else{ - pBuffer->nFlags |= OMX_BUFFERFLAG_EOS; - used_ip_buf_cnt++; - bInputEosReached = true; - pBuffer->nFilledLen = 0; - OMX_EmptyThisBuffer(hComponent,pBuffer); - DEBUG_PRINT("EBD..Either EOS or Some Error while reading file\n"); - } - return OMX_ErrorNone; -} - -void signal_handler(int sig_id) { - - /* Flush */ - if (sig_id == SIGUSR1) { - DEBUG_PRINT("%s Initiate flushing\n", __FUNCTION__); - bFlushing = true; - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandFlush, OMX_ALL, NULL); - } else if (sig_id == SIGUSR2) { - if (bPause == true) { - DEBUG_PRINT("%s resume record\n", __FUNCTION__); - bPause = false; - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); - } else { - DEBUG_PRINT("%s pause record\n", __FUNCTION__); - bPause = true; - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StatePause, NULL); - } - } -} - -int main(int argc, char **argv) -{ - unsigned int bufCnt=0; - OMX_ERRORTYPE result; - - struct sigaction sa; - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = &signal_handler; - sigaction(SIGABRT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - sigaction(SIGUSR2, &sa, NULL); - - (void) signal(SIGINT, Release_Encoder); - - pthread_cond_init(&cond, 0); - pthread_mutex_init(&lock, 0); - pthread_cond_init(&etb_cond, 0); - pthread_mutex_init(&etb_lock, 0); - pthread_mutex_init(&etb_lock1, 0); - - if (argc >= 9) { - in_filename = argv[1]; - out_filename = argv[2]; - tunnel = (uint32_t)atoi(argv[3]); - min_bitrate = (uint32_t)atoi(argv[4]); - max_bitrate = (uint32_t)atoi(argv[5]); - cdmarate = (uint32_t)atoi(argv[6]); - recpath = (uint32_t)atoi(argv[7]); // No configuration support yet.. - rectime = (uint32_t)atoi(argv[8]); - - } else { - DEBUG_PRINT(" invalid format: \n"); - DEBUG_PRINT("ex: ./mm-aenc-omxqcelp13-test INPUTFILE OUTPUTFILE Tunnel MINRATE MAXRATE CDMARATE RECORDPATH RECORDTIME\n"); - DEBUG_PRINT("MINRATE, MAXRATE and CDMARATE 1 to 4\n"); - DEBUG_PRINT("RECORDPATH 0(TX),1(RX),2(BOTH),3(MIC)\n"); - DEBUG_PRINT("RECORDTIME in seconds for AST Automation\n"); - return 0; - } - if(recpath != 3) { - DEBUG_PRINT("For RECORDPATH Only MIC supported\n"); - return 0; - } - - if(tunnel == 0) - aud_comp = "OMX.qcom.audio.encoder.qcelp13"; - else - aud_comp = "OMX.qcom.audio.encoder.tunneled.qcelp13"; - if(Init_Encoder(aud_comp)!= 0x00) - { - DEBUG_PRINT("Decoder Init failed\n"); - return -1; - } - - fcntl(0, F_SETFL, O_NONBLOCK); - - if(Play_Encoder() != 0x00) - { - DEBUG_PRINT("Play_Decoder failed\n"); - return -1; - } - - // Wait till EOS is reached... - if(rectime && tunnel) - { - sleep(rectime); - rectime = 0; - bInputEosReached_tunnel = 1; - DEBUG_PRINT("\EOS ON INPUT PORT\n"); - } - else - { - wait_for_event(); - } - - if((bInputEosReached_tunnel) || ((bOutputEosReached) && !tunnel)) - { - - DEBUG_PRINT("\nMoving the decoder to idle state \n"); - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - wait_for_event(); - - DEBUG_PRINT("\nMoving the encoder to loaded state \n"); - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StateLoaded,0); - sleep(1); - if (!tunnel) - { - DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); - for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(qcelp13_enc_handle, 0, pInputBufHdrs[bufCnt]); - } - } - - DEBUG_PRINT ("\nFillBufferDone: Deallocating o/p buffers \n"); - for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { - OMX_FreeBuffer(qcelp13_enc_handle, 1, pOutputBufHdrs[bufCnt]); - } - wait_for_event(); - create_qcp_header(totaldatalen, framecnt); - fseek(outputBufferFile, 0,SEEK_SET); - fwrite(&append_header,1,QCP_HEADER_SIZE,outputBufferFile); - - - result = OMX_FreeHandle(qcelp13_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - if(tunnel) - { - #ifdef AUDIOV2 - if (msm_route_stream(DIR_TX,session_id,device_id, 0)) - { - DEBUG_PRINT("\ncould not set stream routing\n"); - return -1; - } - if (msm_en_device(device_id, 0)) - { - DEBUG_PRINT("\ncould not enable device\n"); - return -1; - } - msm_mixer_close(); - #endif - } - OMX_Deinit(); - ebd_cnt=0; - bOutputEosReached = false; - bInputEosReached_tunnel = false; - bInputEosReached = 0; - qcelp13_enc_handle = NULL; - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - fclose(outputBufferFile); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...QCELP13 ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - } - return 0; -} - -void Release_Encoder() -{ - static int cnt=0; - OMX_ERRORTYPE result; - - DEBUG_PRINT("END OF QCELP13 ENCODING: EXITING PLEASE WAIT\n"); - bInputEosReached_tunnel = 1; - event_complete(); - cnt++; - if(cnt > 1) - { - /* FORCE RESET */ - qcelp13_enc_handle = NULL; - ebd_cnt=0; - bInputEosReached_tunnel = false; - - result = OMX_FreeHandle(qcelp13_enc_handle); - if (result != OMX_ErrorNone) { - DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); - } - - /* Deinit OpenMAX */ - - OMX_Deinit(); - - pthread_cond_destroy(&cond); - pthread_mutex_destroy(&lock); - DEBUG_PRINT("*****************************************\n"); - DEBUG_PRINT("******...QCELP13 ENC TEST COMPLETED...***************\n"); - DEBUG_PRINT("*****************************************\n"); - exit(0); - } -} - -int Init_Encoder(OMX_STRING audio_component) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE omxresult; - OMX_U32 total = 0; - typedef OMX_U8* OMX_U8_PTR; - char *role ="audio_encoder"; - - static OMX_CALLBACKTYPE call_back = { - &EventHandler,&EmptyBufferDone,&FillBufferDone - }; - - /* Init. the OpenMAX Core */ - DEBUG_PRINT("\nInitializing OpenMAX Core....\n"); - omxresult = OMX_Init(); - - if(OMX_ErrorNone != omxresult) { - DEBUG_PRINT("\n Failed to Init OpenMAX core"); - return -1; - } - else { - DEBUG_PRINT("\nOpenMAX Core Init Done\n"); - } - - /* Query for audio decoders*/ - DEBUG_PRINT("Qcelp13_test: Before entering OMX_GetComponentOfRole"); - OMX_GetComponentsOfRole(role, &total, 0); - DEBUG_PRINT ("\nTotal components of role=%s :%u", role, total); - - - omxresult = OMX_GetHandle((OMX_HANDLETYPE*)(&qcelp13_enc_handle), - (OMX_STRING)audio_component, NULL, &call_back); - if (FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to Load the component:%s\n", audio_component); - return -1; - } - else - { - DEBUG_PRINT("\nComponent %s is in LOADED state\n", audio_component); - } - - /* Get the port information */ - CONFIG_VERSION_SIZE(portParam); - omxresult = OMX_GetParameter(qcelp13_enc_handle, OMX_IndexParamAudioInit, - (OMX_PTR)&portParam); - - if(FAILED(omxresult)) { - DEBUG_PRINT("\nFailed to get Port Param\n"); - return -1; - } - else - { - DEBUG_PRINT("\nportParam.nPorts:%u\n", portParam.nPorts); - DEBUG_PRINT("\nportParam.nStartPortNumber:%u\n", - portParam.nStartPortNumber); - } - - if(OMX_ErrorNone != omxresult) - { - DEBUG_PRINT("Set parameter failed"); - } - - return 0; -} - -int Play_Encoder() -{ - unsigned int i; - int Size=0; - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE ret; - OMX_INDEXTYPE index; -#ifdef __LP64__ - DEBUG_PRINT("sizeof[%ld]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#else - DEBUG_PRINT("sizeof[%d]\n", sizeof(OMX_BUFFERHEADERTYPE)); -#endif - - /* open the i/p and o/p files based on the video file format passed */ - if(open_audio_file()) { - DEBUG_PRINT("\n Returning -1"); - return -1; - } - - /* Query the encoder input min buf requirements */ - CONFIG_VERSION_SIZE(inputportFmt); - - /* Port for which the Client needs to obtain info */ - inputportFmt.nPortIndex = portParam.nStartPortNumber; - - OMX_GetParameter(qcelp13_enc_handle,OMX_IndexParamPortDefinition,&inputportFmt); - DEBUG_PRINT ("\nEnc Input Buffer Count %u\n", inputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Input Buffer Size %u\n", inputportFmt.nBufferSize); - - if(OMX_DirInput != inputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Input Port\n"); - return -1; - } - - pcmparam.nPortIndex = 0; - pcmparam.nChannels = channels; - pcmparam.nSamplingRate = samplerate; - OMX_SetParameter(qcelp13_enc_handle,OMX_IndexParamAudioPcm,&pcmparam); - - - /* Query the encoder outport's min buf requirements */ - CONFIG_VERSION_SIZE(outputportFmt); - /* Port for which the Client needs to obtain info */ - outputportFmt.nPortIndex = portParam.nStartPortNumber + 1; - - OMX_GetParameter(qcelp13_enc_handle,OMX_IndexParamPortDefinition,&outputportFmt); - DEBUG_PRINT ("\nEnc: Output Buffer Count %u\n", outputportFmt.nBufferCountMin); - DEBUG_PRINT ("\nEnc: Output Buffer Size %u\n", outputportFmt.nBufferSize); - - if(OMX_DirOutput != outputportFmt.eDir) { - DEBUG_PRINT ("\nEnc: Expect Output Port\n"); - return -1; - } - - - CONFIG_VERSION_SIZE(qcelp13param); - - qcelp13param.nPortIndex = 1; - qcelp13param.nChannels = channels; //2 ; /* 1-> mono 2-> stereo*/ - qcelp13param.nMinBitRate = min_bitrate; - qcelp13param.nMaxBitRate = max_bitrate; - OMX_SetParameter(qcelp13_enc_handle,OMX_IndexParamAudioQcelp13,&qcelp13param); - OMX_GetExtensionIndex(qcelp13_enc_handle,"OMX.Qualcomm.index.audio.sessionId",&index); - OMX_GetParameter(qcelp13_enc_handle,index,&streaminfoparam); - if(tunnel) { - #ifdef AUDIOV2 - session_id = streaminfoparam.sessionId; - control = msm_mixer_open("/dev/snd/controlC0", 0); - if(control < 0) - printf("ERROR opening the device\n"); - device_id = msm_get_device(device); - DEBUG_PRINT ("\ndevice_id = %d\n",device_id); - DEBUG_PRINT("\nsession_id = %d\n",session_id); - if (msm_en_device(device_id, 1)) - { - perror("could not enable device\n"); - return -1; - } - if (msm_route_stream(DIR_TX,session_id,device_id, 1)) - { - perror("could not set stream routing\n"); - return -1; - } - #endif - } - - DEBUG_PRINT ("\nOMX_SendCommand Encoder -> IDLE\n"); - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StateIdle,0); - /* wait_for_event(); should not wait here event complete status will - not come until enough buffer are allocated */ - if (tunnel == 0) - { - input_buf_cnt = inputportFmt.nBufferCountActual; // inputportFmt.nBufferCountMin + 5; - DEBUG_PRINT("Transition to Idle State succesful...\n"); - /* Allocate buffer on decoder's i/p port */ - error = Allocate_Buffer(qcelp13_enc_handle, &pInputBufHdrs, inputportFmt.nPortIndex, - input_buf_cnt, inputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pInputBufHdrs == NULL) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Input buffer success\n"); - } - } - output_buf_cnt = outputportFmt.nBufferCountMin ; - - /* Allocate buffer on encoder's O/Pp port */ - error = Allocate_Buffer(qcelp13_enc_handle, &pOutputBufHdrs, outputportFmt.nPortIndex, - output_buf_cnt, outputportFmt.nBufferSize); - if (error != OMX_ErrorNone || pOutputBufHdrs == NULL ) { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer error\n"); - return -1; - } - else { - DEBUG_PRINT ("\nOMX_AllocateBuffer Output buffer success\n"); - } - - wait_for_event(); - - - if (tunnel == 1) - { - DEBUG_PRINT ("\nOMX_SendCommand to enable TUNNEL MODE during IDLE\n"); - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandPortDisable,0,0); // disable input port - wait_for_event(); - } - - DEBUG_PRINT ("\nOMX_SendCommand encoder -> Executing\n"); - OMX_SendCommand(qcelp13_enc_handle, OMX_CommandStateSet, OMX_StateExecuting,0); - wait_for_event(); - - DEBUG_PRINT(" Start sending OMX_FILLthisbuffer\n"); - - for(i=0; i < output_buf_cnt; i++) { - DEBUG_PRINT ("\nOMX_FillThisBuffer on output buf no.%d\n",i); - pOutputBufHdrs[i]->nOutputPortIndex = 1; - pOutputBufHdrs[i]->nFlags = pOutputBufHdrs[i]->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - ret = OMX_FillThisBuffer(qcelp13_enc_handle, pOutputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_FillThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_FillThisBuffer success!\n"); - } - } - -if(tunnel == 0) -{ - DEBUG_PRINT(" Start sending OMX_emptythisbuffer\n"); - for (i = 0;i < input_buf_cnt;i++) { - DEBUG_PRINT ("\nOMX_EmptyThisBuffer on Input buf no.%d\n",i); - pInputBufHdrs[i]->nInputPortIndex = 0; - Size = Read_Buffer(pInputBufHdrs[i]); - if(Size <=0 ){ - DEBUG_PRINT("NO DATA READ\n"); - bInputEosReached = true; - pInputBufHdrs[i]->nFlags= OMX_BUFFERFLAG_EOS; - } - pInputBufHdrs[i]->nFilledLen = (OMX_U32)Size; - pInputBufHdrs[i]->nInputPortIndex = 0; - used_ip_buf_cnt++; - ret = OMX_EmptyThisBuffer(qcelp13_enc_handle, pInputBufHdrs[i]); - if (OMX_ErrorNone != ret) { - DEBUG_PRINT("OMX_EmptyThisBuffer failed with result %d\n", ret); - } - else { - DEBUG_PRINT("OMX_EmptyThisBuffer success!\n"); - } - if(Size <=0 ){ - break;//eos reached - } - } - pthread_mutex_lock(&etb_lock); - if(etb_done) -{ - DEBUG_PRINT("Component is waiting for EBD to be released.\n"); - etb_event_complete(); - } - else - { - DEBUG_PRINT("\n****************************\n"); - DEBUG_PRINT("EBD not yet happened ...\n"); - DEBUG_PRINT("\n****************************\n"); - etb_done++; - } - pthread_mutex_unlock(&etb_lock); -} - - return 0; -} - - - -static OMX_ERRORTYPE Allocate_Buffer ( OMX_COMPONENTTYPE *avc_enc_handle, - OMX_BUFFERHEADERTYPE ***pBufHdrs, - OMX_U32 nPortIndex, - unsigned int bufCntMin, unsigned int bufSize) -{ - DEBUG_PRINT("Inside %s \n", __FUNCTION__); - OMX_ERRORTYPE error=OMX_ErrorNone; - unsigned int bufCnt=0; - - /* To remove warning for unused variable to keep prototype same */ - (void)avc_enc_handle; - - *pBufHdrs= (OMX_BUFFERHEADERTYPE **) - malloc(sizeof(OMX_BUFFERHEADERTYPE*)*bufCntMin); - - for(bufCnt=0; bufCnt < bufCntMin; ++bufCnt) { - DEBUG_PRINT("\n OMX_AllocateBuffer No %d \n", bufCnt); - error = OMX_AllocateBuffer(qcelp13_enc_handle, &((*pBufHdrs)[bufCnt]), - nPortIndex, NULL, bufSize); - } - - return error; -} - - - - -static int Read_Buffer (OMX_BUFFERHEADERTYPE *pBufHdr ) -{ - - size_t bytes_read=0; - - - pBufHdr->nFilledLen = 0; - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - - bytes_read = fread(pBufHdr->pBuffer, 1, pBufHdr->nAllocLen , inputBufferFile); - - pBufHdr->nFilledLen = (OMX_U32)bytes_read; - // Time stamp logic - ((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp = \ - - (OMX_TICKS) ((total_pcm_bytes * 1000)/(samplerate * channels *2)); - - DEBUG_PRINT ("\n--time stamp -- %ld\n", (unsigned long)((OMX_BUFFERHEADERTYPE *)pBufHdr)->nTimeStamp); - if(bytes_read == 0) - { - pBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; - DEBUG_PRINT ("\nBytes read zero\n"); - } - else - { - pBufHdr->nFlags = pBufHdr->nFlags & (unsigned)~OMX_BUFFERFLAG_EOS; - - total_pcm_bytes = (unsigned)(total_pcm_bytes + bytes_read); - } - - return (int)bytes_read;; -} - - - -//In Encoder this Should Open a PCM or WAV file for input. - -static int open_audio_file () -{ - int error_code = 0; - - if (!tunnel) - { - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, in_filename); - inputBufferFile = fopen (in_filename, "rb"); - if (inputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - in_filename); - error_code = -1; - } - if(parse_pcm_header() != 0x00) - { - DEBUG_PRINT("PCM parser failed \n"); - return -1; - } - } - - DEBUG_PRINT("Inside %s filename=%s\n", __FUNCTION__, out_filename); - outputBufferFile = fopen (out_filename, "wb"); - if (outputBufferFile == NULL) { - DEBUG_PRINT("\ni/p file %s could NOT be opened\n", - out_filename); - error_code = -1; - return error_code; - } - fseek(outputBufferFile, QCP_HEADER_SIZE, SEEK_SET); - return error_code; -} - -static OMX_ERRORTYPE parse_pcm_header() -{ - struct wav_header hdr; - - DEBUG_PRINT("\n***************************************************************\n"); - if(fread(&hdr, 1, sizeof(hdr),inputBufferFile)!=sizeof(hdr)) - { - DEBUG_PRINT("Wav file cannot read header\n"); - return -1; - } - - if ((hdr.riff_id != ID_RIFF) || - (hdr.riff_fmt != ID_WAVE)|| - (hdr.fmt_id != ID_FMT)) - { - DEBUG_PRINT("Wav file is not a riff/wave file\n"); - return -1; - } - - if (hdr.audio_format != FORMAT_PCM) - { - DEBUG_PRINT("Wav file is not adpcm format %d and fmt size is %d\n", - hdr.audio_format, hdr.fmt_sz); - return -1; - } - - DEBUG_PRINT("Samplerate is %d\n", hdr.sample_rate); - DEBUG_PRINT("Channel Count is %d\n", hdr.num_channels); - DEBUG_PRINT("\n***************************************************************\n"); - - samplerate = hdr.sample_rate; - channels = hdr.num_channels; - total_pcm_bytes = 0; - - return OMX_ErrorNone; -} |