diff options
Diffstat (limited to 'media/libstagefright/codecs/amrnb/dec')
7 files changed, 184 insertions, 14 deletions
diff --git a/media/libstagefright/codecs/amrnb/dec/Android.mk b/media/libstagefright/codecs/amrnb/dec/Android.mk index b067456..3750e2e 100644 --- a/media/libstagefright/codecs/amrnb/dec/Android.mk +++ b/media/libstagefright/codecs/amrnb/dec/Android.mk @@ -45,7 +45,7 @@ LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/../common/include LOCAL_CFLAGS := \ - -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF= + -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_IMPORT_REF= LOCAL_CFLAGS += -Werror @@ -83,3 +83,24 @@ LOCAL_MODULE := libstagefright_soft_amrdec LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) + +################################################################################ +include $(CLEAR_VARS) +LOCAL_SRC_FILES := \ + test/amrnbdec_test.cpp + +LOCAL_C_INCLUDES := \ + $(LOCAL_PATH)/src \ + $(LOCAL_PATH)/../common/include \ + $(call include-path-for, audio-utils) + +LOCAL_STATIC_LIBRARIES := \ + libstagefright_amrnbdec libsndfile + +LOCAL_SHARED_LIBRARIES := \ + libstagefright_amrnb_common libaudioutils + +LOCAL_MODULE := libstagefright_amrnbdec_test +LOCAL_MODULE_TAGS := optional + +include $(BUILD_EXECUTABLE) diff --git a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp index 899daba..861b3e6 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp @@ -209,7 +209,7 @@ void dec_10i40_35bits( Word16 cod[] /* (o) : algebraic (fixed) codebook excitation */ ) { - register Word16 i, j, pos1, pos2; + Word16 i, j, pos1, pos2; Word16 sign, tmp; for (i = 0; i < L_CODE; i++) diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp index 08b690d..7068c0a 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp @@ -308,7 +308,7 @@ void D_plsf_5( Flag *pOverflow /* o : Flag set when overflow occurs */ ) { - register Word16 i; + Word16 i; Word16 temp; Word16 sign; diff --git a/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp index c5aefe4..2ca30de 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp @@ -218,9 +218,9 @@ void Int_lsf( Flag *pOverflow /* o : flag set if overflow occurs */ ) { - register Word16 i; - register Word16 temp1; - register Word16 temp2; + Word16 i; + Word16 temp1; + Word16 temp2; if (i_subfr == 0) { diff --git a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp index da5445b..285465f 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp @@ -207,7 +207,7 @@ int ph_disp_reset (ph_dispState *state) Word16 ph_disp_reset(ph_dispState *state) { - register Word16 i; + Word16 i; if (state == (ph_dispState *) NULL) { @@ -667,15 +667,15 @@ void ph_disp( Flag *pOverflow /* i/o : oveflow indicator */ ) { - register Word16 i, i1; - register Word16 tmp1; + Word16 i, i1; + Word16 tmp1; Word32 L_temp; Word32 L_temp2; Word16 impNr; /* indicator for amount of disp./filter used */ Word16 inno_sav[L_SUBFR]; Word16 ps_poss[L_SUBFR]; - register Word16 nze, nPulse; + Word16 nze, nPulse; Word16 ppos; const Word16 *ph_imp; /* Pointer to phase dispersion filter */ diff --git a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp index 0336990..39e01a2 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp @@ -445,13 +445,13 @@ void Post_Filter( ) { Word16 Ap3[MP1]; - Word16 Ap4[MP1]; /* bandwidth expanded LP parameters */ - Word16 *Az; /* pointer to Az_4: */ + Word16 Ap4[MP1]; /* bandwidth expanded LP parameters */ + Word16 *Az; /* pointer to Az_4: */ /* LPC parameters in each subframe */ - register Word16 i_subfr; /* index for beginning of subframe */ + Word16 i_subfr; /* index for beginning of subframe */ Word16 h[L_H]; - register Word16 i; + Word16 i; Word16 temp1; Word16 temp2; Word32 L_tmp; diff --git a/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp new file mode 100644 index 0000000..521fe2b --- /dev/null +++ b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * 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. + * + * 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 AND FITNESS + * FOR A PARTICULAR PURPOSE 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. + */ + +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <assert.h> + +#include "gsmamr_dec.h" +#include <audio_utils/sndfile.h> + +// Constants for AMR-NB +enum { + kInputBufferSize = 64, + kSamplesPerFrame = 160, + kBitsPerSample = 16, + kOutputBufferSize = kSamplesPerFrame * kBitsPerSample/8, + kSampleRate = 8000, + kChannels = 1, + kFileHeaderSize = 6 +}; +const uint32_t kFrameSizes[] = {12, 13, 15, 17, 19, 20, 26, 31}; + + +int main(int argc, char *argv[]) { + + if(argc != 3) { + fprintf(stderr, "Usage %s <input file> <output file>\n", argv[0]); + return 1; + } + + // Open the input file + FILE* fpInput = fopen(argv[1], "rb"); + if (!fpInput) { + fprintf(stderr, "Could not open %s\n", argv[1]); + return 1; + } + + // Validate the input AMR file + char header[kFileHeaderSize]; + int bytesRead = fread(header, 1, kFileHeaderSize, fpInput); + if (bytesRead != kFileHeaderSize || memcmp(header, "#!AMR\n", kFileHeaderSize)) { + fprintf(stderr, "Invalid AMR-NB file\n"); + return 1; + } + + // Open the output file + SF_INFO sfInfo; + memset(&sfInfo, 0, sizeof(SF_INFO)); + sfInfo.channels = kChannels; + sfInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; + sfInfo.samplerate = kSampleRate; + SNDFILE *handle = sf_open(argv[2], SFM_WRITE, &sfInfo); + if(!handle){ + fprintf(stderr, "Could not create %s\n", argv[2]); + return 1; + } + + // Create AMR-NB decoder instance + void* amrHandle; + int err = GSMInitDecode(&amrHandle, (Word8*)"AMRNBDecoder"); + if(err != 0){ + fprintf(stderr, "Error creating AMR-NB decoder instance\n"); + return 1; + } + + //Allocate input buffer + void *inputBuf = malloc(kInputBufferSize); + assert(inputBuf != NULL); + + //Allocate output buffer + void *outputBuf = malloc(kOutputBufferSize); + assert(outputBuf != NULL); + + + // Decode loop + uint32_t retVal = 0; + while (1) { + // Read mode + uint8_t mode; + bytesRead = fread(&mode, 1, 1, fpInput); + if (bytesRead != 1) break; + + // Find frame type + Frame_Type_3GPP frameType = (Frame_Type_3GPP)((mode >> 3) & 0x0f); + if (frameType >= AMR_SID){ + fprintf(stderr, "Frame type %d not supported\n",frameType); + retVal = 1; + break; + } + + // Find frame type + int32_t frameSize = kFrameSizes[frameType]; + bytesRead = fread(inputBuf, 1, frameSize, fpInput); + if (bytesRead != frameSize) break; + + //Decode frame + int32_t decodeStatus; + decodeStatus = AMRDecode(amrHandle, frameType, (uint8_t*)inputBuf, + (int16_t*)outputBuf, MIME_IETF); + if(decodeStatus == -1) { + fprintf(stderr, "Decoder encountered error\n"); + retVal = 1; + break; + } + + //Write output to wav + sf_writef_short(handle, (int16_t*)outputBuf, kSamplesPerFrame); + + } + + // Close input and output file + fclose(fpInput); + sf_close(handle); + + //Free allocated memory + free(inputBuf); + free(outputBuf); + + // Close decoder instance + GSMDecodeFrameExit(&amrHandle); + + return retVal; +} |