int main(int argc, char **argv) { int bufCnt=0; OMX_ERRORTYPE result; struct sigaction sa; struct wav_header hdr; int bytes_writen = 0; memset(&sa, 0, sizeof(sa)); sa.sa_handler = &signal_handler; sigaction(SIGABRT, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR2, &sa, NULL); pthread_cond_init(&cond, 0); pthread_mutex_init(&lock, 0); if (argc >= 8) { in_filename = argv[1]; samplerate = atoi(argv[2]); channels = atoi(argv[3]); pcmplayback = atoi(argv[4]); tunnel = atoi(argv[5]); filewrite = atoi(argv[6]); sbr_ps_enabled = atoi(argv[7]); if (tunnel == 1) { pcmplayback = 0; /* This feature holds good only for non tunnel mode*/ filewrite = 0; /* File write not supported in tunnel mode */ } } else { DEBUG_PRINT(" invalid format: \n"); DEBUG_PRINT("ex: ./mm-adec-omxaac AACINPUTFILE SAMPFREQ CHANNEL PCMPLAYBACK TUNNEL FILEWRITE\n"); DEBUG_PRINT( "PCMPLAYBACK = 1 (ENABLES PCM PLAYBACK IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "PCMPLAYBACK = 0 (DISABLES PCM PLAYBACK IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "TUNNEL = 1 (DECODED AAC SAMPLES IS PLAYED BACK)\n"); DEBUG_PRINT( "TUNNEL = 0 (DECODED AAC SAMPLES IS LOOPED BACK TO THE USER APP)\n"); DEBUG_PRINT( "FILEWRITE = 1 (ENABLES PCM FILEWRITE IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "FILEWRITE = 0 (DISABLES PCM FILEWRITE IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "SBR_PS_ENABLED = 0 (SBR AND PS DISABLED) \n"); DEBUG_PRINT( "SBR_PS_ENABLED = 1 (SBR IS ENABLED) \n"); DEBUG_PRINT( "SBR_PS_ENABLED = 2 (SBR AND PS ENABLED) \n"); return 0; } if(tunnel == 0) aud_comp = "OMX.qcom.audio.decoder.aac"; else aud_comp = "OMX.qcom.audio.decoder.tunneled.aac"; printf("Init_Decoder()\n"); if(Init_Decoder(aud_comp)!= 0x00) { DEBUG_PRINT("Decoder Init failed\n"); return -1; } printf("Play_Decoder()\n"); if(Play_Decoder() != 0x00) { DEBUG_PRINT("Play_Decoder failed\n"); return -1; } printf("Play_Decoder() done\n"); // Wait till EOS is reached... printf("************* before wait_for_event\n"); wait_for_event(); printf(" after wait_for_event bOutputEosReached %d tunnel %d bInputEosReached %d \n",bOutputEosReached,tunnel,bInputEosReached); if(bOutputEosReached || (tunnel && bInputEosReached)) { DEBUG_PRINT(" going to sleep \n"); // sleep(15); DEBUG_PRINT(" wake up \n"); /******************************************************************/ #ifdef PCM_PLAYBACK if(pcmplayback == 1) { ioctl(m_pcmdrv_fd, AUDIO_STOP, 0); if(m_pcmdrv_fd >= 0) { close(m_pcmdrv_fd); m_pcmdrv_fd = -1; DEBUG_PRINT(" PCM device closed succesfully \n"); } else { DEBUG_PRINT(" PCM device close failure \n"); } } #endif // PCM_PLAYBACK if((tunnel == 0)&& (filewrite == 1)) { hdr.riff_id = ID_RIFF; hdr.riff_sz = 0; hdr.riff_fmt = ID_WAVE; hdr.fmt_id = ID_FMT; hdr.fmt_sz = 16; hdr.audio_format = FORMAT_PCM; hdr.num_channels = channels;//2; hdr.sample_rate = samplerate; //SAMPLE_RATE; //44100; hdr.byte_rate = hdr.sample_rate * hdr.num_channels * 2; hdr.block_align = hdr.num_channels * 2; hdr.bits_per_sample = 16; hdr.data_id = ID_DATA; hdr.data_sz = 0; DEBUG_PRINT("output file closed and EOS reached total decoded data length %d\n",totaldatalen); hdr.data_sz = totaldatalen; hdr.riff_sz = totaldatalen + 8 + 16 + 8; fseek(outputBufferFile, 0L , SEEK_SET); bytes_writen = fwrite(&hdr,1,sizeof(hdr),outputBufferFile); if (bytes_writen <= 0) { DEBUG_PRINT("Invalid Wav header write failed\n"); } bFileclose = 1; fclose(outputBufferFile); } /************************************************************************************/ DEBUG_PRINT("\nMoving the decoder to idle state \n"); OMX_SendCommand(aac_dec_handle, OMX_CommandStateSet, OMX_StateIdle,0); wait_for_event(); DEBUG_PRINT("\nMoving the decoder to loaded state \n"); OMX_SendCommand(aac_dec_handle, OMX_CommandStateSet, OMX_StateLoaded,0); DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { OMX_FreeBuffer(aac_dec_handle, 0, pInputBufHdrs[bufCnt]); } if(tunnel == 0) { DEBUG_PRINT("\nFillBufferDone: Deallocating o/p buffers \n"); for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { OMX_FreeBuffer(aac_dec_handle, 1, pOutputBufHdrs[bufCnt]); } } ebd_cnt=0; bInputEosReached = false; wait_for_event(); ebd_cnt=0; bOutputEosReached = false; result = OMX_FreeHandle(aac_dec_handle); if (result != OMX_ErrorNone) { DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); } aac_dec_handle = NULL; /* Deinit OpenMAX */ OMX_Deinit(); pthread_cond_destroy(&cond); pthread_mutex_destroy(&lock); DEBUG_PRINT("*****************************************\n"); DEBUG_PRINT("******...TEST COMPLETED...***************\n"); DEBUG_PRINT("*****************************************\n"); } return 0; }
int main(int argc, char **argv) { int bufCnt=0; OMX_ERRORTYPE result; struct sigaction sa; struct wav_header hdr; int bytes_writen = 0; memset(&sa, 0, sizeof(sa)); sa.sa_handler = &signal_handler; sigaction(SIGABRT, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR2, &sa, NULL); 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); pthread_mutexattr_init(&lock1_attr); pthread_mutex_init(&lock1, &lock1_attr); if (argc >= 6) { in_filename = argv[1]; samplerate = atoi(argv[2]); channels = atoi(argv[3]); pcmplayback = atoi(argv[4]); filewrite = atoi(argv[5]); strlcpy((char *)out_filename,argv[1],sizeof((char *)out_filename)); strlcat((char *)out_filename,".wav",sizeof((char *)out_filename)); } else { DEBUG_PRINT(" invalid format: \n"); DEBUG_PRINT("ex: ./sw-adec-omxaac-test AACINPUTFILE SAMPFREQ CHANNEL PCMPLAYBACK FILEWRITE\n"); DEBUG_PRINT( "PCMPLAYBACK = 1 (ENABLES PCM PLAYBACK IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "PCMPLAYBACK = 0 (DISABLES PCM PLAYBACK IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "FILEWRITE = 1 (ENABLES PCM FILEWRITE IN NON TUNNEL MODE) \n"); DEBUG_PRINT( "FILEWRITE = 0 (DISABLES PCM FILEWRITE IN NON TUNNEL MODE) \n"); return 0; } aud_comp = "OMX.PV.aacdec"; if(Init_Decoder(aud_comp)!= 0x00) { DEBUG_PRINT("Decoder Init failed\n"); return -1; } if(Play_Decoder() != 0x00) { DEBUG_PRINT("Play_Decoder failed\n"); return -1; } // Wait till EOS is reached... printf("before wait_for_event\n"); if(bReconfigureOutputPort) { wait_for_event(); } if(bOutputEosReached) { /******************************************************************/ #ifdef PCM_PLAYBACK if(pcmplayback == 1) { sleep(1); ioctl(m_pcmdrv_fd, AUDIO_STOP, 0); #ifdef AUDIOV2 if(devmgr_fd >= 0) { write_devctlcmd(devmgr_fd, "-cmd=unregister_session_rx -sid=", session_id_hpcm); } else { if (msm_route_stream(1, session_id_hpcm, device_id, 0)) { DEBUG_PRINT("\ncould not set stream routing\n"); } } #endif if(m_pcmdrv_fd >= 0) { close(m_pcmdrv_fd); m_pcmdrv_fd = -1; DEBUG_PRINT(" PCM device closed succesfully \n"); } else { DEBUG_PRINT(" PCM device close failure \n"); } } #endif // PCM_PLAYBACK if(filewrite == 1) { hdr.riff_id = ID_RIFF; hdr.riff_sz = 0; hdr.riff_fmt = ID_WAVE; hdr.fmt_id = ID_FMT; hdr.fmt_sz = 16; hdr.audio_format = FORMAT_PCM; hdr.num_channels = channels;//2; hdr.sample_rate = samplerate; //SAMPLE_RATE; //44100; hdr.byte_rate = hdr.sample_rate * hdr.num_channels * 2; hdr.block_align = hdr.num_channels * 2; hdr.bits_per_sample = 16; hdr.data_id = ID_DATA; hdr.data_sz = 0; DEBUG_PRINT("output file closed and EOS reached total decoded data length %d\n",totaldatalen); hdr.data_sz = totaldatalen; hdr.riff_sz = totaldatalen + 8 + 16 + 8; fseek(outputBufferFile, 0L , SEEK_SET); bytes_writen = fwrite(&hdr,1,sizeof(hdr),outputBufferFile); if (bytes_writen <= 0) { DEBUG_PRINT("Invalid Wav header write failed\n"); } bFileclose = 1; fclose(outputBufferFile); } /************************************************************************************/ DEBUG_PRINT("\nMoving the decoder to idle state \n"); OMX_SendCommand(aac_dec_handle, OMX_CommandStateSet, OMX_StateIdle,0); wait_for_event(); DEBUG_PRINT("\nMoving the decoder to loaded state \n"); OMX_SendCommand(aac_dec_handle, OMX_CommandStateSet, OMX_StateLoaded,0); DEBUG_PRINT("\nFillBufferDone: Deallocating i/p buffers \n"); for(bufCnt=0; bufCnt < input_buf_cnt; ++bufCnt) { OMX_FreeBuffer(aac_dec_handle, 0, pInputBufHdrs[bufCnt]); } DEBUG_PRINT("\nFillBufferDone: Deallocating o/p buffers \n"); for(bufCnt=0; bufCnt < output_buf_cnt; ++bufCnt) { OMX_FreeBuffer(aac_dec_handle, 1, pOutputBufHdrs[bufCnt]); } ebd_cnt=0; wait_for_event(); ebd_cnt=0; bOutputEosReached = false; bInputEosReached = false; bEosOnInputBuf = 0; bEosOnOutputBuf = 0; result = OMX_FreeHandle(aac_dec_handle); if (result != OMX_ErrorNone) { DEBUG_PRINT ("\nOMX_FreeHandle error. Error code: %d\n", result); } aac_dec_handle = NULL; #ifdef AUDIOV2 if(devmgr_fd >= 0) { write_devctlcmd(devmgr_fd, "-cmd=unregister_session_rx -sid=", session_id); close(devmgr_fd); } else { if (msm_route_stream(1,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 /* Deinit OpenMAX */ OMX_Deinit(); pthread_cond_destroy(&cond); pthread_mutex_destroy(&lock); pthread_cond_destroy(&etb_cond); pthread_mutex_destroy(&etb_lock); pthread_mutex_destroy(&etb_lock1); etb_done = 0; bReconfigureOutputPort = 0; if (pBuffer_tmp) { free(pBuffer_tmp); pBuffer_tmp =NULL; } DEBUG_PRINT("*****************************************\n"); DEBUG_PRINT("******...TEST COMPLETED...***************\n"); DEBUG_PRINT("*****************************************\n"); } return 0; }