codec_munge_state_t *codec_munge_init(int codec) { codec_munge_state_t *s; if ((s = (codec_munge_state_t *) malloc(sizeof(*s)))) { switch (codec) { case MUNGE_CODEC_G726_40K: g726_init(&s->g726_enc_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_32K: g726_init(&s->g726_enc_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_24K: g726_init(&s->g726_enc_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_16K: g726_init(&s->g726_enc_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; default: s->munging_codec = codec; break; } } return s; }
static int decode_update(struct audec_state **adsp, const struct aucodec *ac, const char *fmtp) { struct g726_aucodec *gac = (struct g726_aucodec *)ac; struct audec_state *st; int err = 0; (void)fmtp; if (!adsp || !ac) return EINVAL; if (*adsp) return 0; st = mem_zalloc(sizeof(*st), decode_destructor); if (!st) return ENOMEM; if (!g726_init(&st->st, gac->bitrate, G726_ENCODING_LINEAR, G726_PACKING_LEFT)) { err = ENOMEM; goto out; } out: if (err) mem_deref(st); else *adsp = st; return err; }
int Hi3511AudioDecOpen(int nChannel, int encType) { HI_S32 s32ret; AIO_ATTR_S stAttr; ADEC_CHN_ATTR_S stAdecAttr; ADEC_ATTR_ADPCM_S stAdpcm; AENC_ATTR_G726_S stG726; if (nChannel<0 || nChannel>=MAX_ADEC_CHANNEL) { return -1; } #if 0//G726 stAdecAttr.enType = PT_G726; stAdecAttr.u32BufSize = 8; stAdecAttr.u32BufSize = 10; ////mody by lv add------------ stAdecAttr.enMode = ADEC_MODE_PACK; stAdecAttr.pValue = &stG726; stG726.enG726bps = G726_16K; s32ret = HI_MPI_ADEC_CreateChn(0, &stAdecAttr); if (s32ret) { printf("create adnc chn %d err:0x%x\n", 0, s32ret); return -1; } //mody by lv start add------------ #if 1 g_State726_32 = (g726_state_t *)malloc(sizeof(g726_state_t)); g_State726_32 = g726_init(g_State726_32, 8000*4); g_pDecFile = fopen("/mnt/mtd/dvs/mobile/tmpfs/g726.dec", "w+"); if(!g_pDecFile){ printf("fopen error\n"); } #endif //mody by lv end add------------ #endif g_adec_chn_flag[nChannel] = 1; return 0; }
CODEC_API void *PLG_INIT_V1_2(g726_24)(const char* fmtp, int isDecoder, struct MppCodecFmtpInfoV1_2* pCodecInfo) { if (pCodecInfo == NULL) { return NULL; } pCodecInfo->signalingCodec = FALSE; pCodecInfo->minBitrate = 24000; pCodecInfo->maxBitrate = 24000; pCodecInfo->numSamplesPerFrame = 8; pCodecInfo->minFrameBytes = 3; pCodecInfo->maxFrameBytes = 3; pCodecInfo->packetLossConcealment = CODEC_PLC_NONE; pCodecInfo->vadCng = CODEC_CNG_NONE; pCodecInfo->algorithmicDelay = 0; return g726_init(NULL, 24000, G726_ENCODING_LINEAR, G726_PACKING_LEFT); }
int G726ToPcm::Init(InAudioInfo info) { m_g7FrameSize = G711_ONE_LEN; m_state726 = (g726_state_t *)malloc(sizeof(g726_state_t)); int rateBits = info.G726RateBits(); switch (rateBits) { default: case Rate16kBits: { m_bitRate = 8000*2; m_pcmSize = (2*m_g7FrameSize*120+30)/30; } break; case Rate24kBits: { m_bitRate = 8000*3; m_pcmSize = (2*m_g7FrameSize*80+30)/30; } break; case Rate32kBits: { m_bitRate = 8000*4; m_pcmSize = (2*m_g7FrameSize*60+30)/30; } break; case Rate40kBits: { m_bitRate = 8000*5; m_pcmSize = (2*m_g7FrameSize*48+30)/30; } break; } m_state726 = g726_init(m_state726, m_bitRate ); return 0; }
SPAN_DECLARE(codec_munge_state_t *) codec_munge_init(int codec, int info) { codec_munge_state_t *s; if ((s = (codec_munge_state_t *) malloc(sizeof(*s)))) { switch (codec) { case MUNGE_CODEC_G726_40K: g726_init(&s->g726_enc_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 40000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_32K: g726_init(&s->g726_enc_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 32000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_24K: g726_init(&s->g726_enc_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 24000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; case MUNGE_CODEC_G726_16K: g726_init(&s->g726_enc_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); g726_init(&s->g726_dec_state, 16000, G726_ENCODING_LINEAR, G726_PACKING_NONE); s->munging_codec = MUNGE_CODEC_G726_32K; break; default: s->munging_codec = codec; break; } s->sequence = 0; s->rbs_pattern = info; } return s; }
static switch_status_t switch_g726_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings) { uint32_t encoding, decoding; int packing = G726_PACKING_RIGHT; g726_state_t *context = NULL; encoding = (flags & SWITCH_CODEC_FLAG_ENCODE); decoding = (flags & SWITCH_CODEC_FLAG_DECODE); if (!(encoding || decoding)) { return SWITCH_STATUS_FALSE; } if ((flags & SWITCH_CODEC_FLAG_AAL2 || strstr(codec->implementation->iananame, "AAL2"))) { packing = G726_PACKING_LEFT; } context = g726_init(context, codec->implementation->bits_per_second, G726_ENCODING_LINEAR, packing); codec->private_info = context; return SWITCH_STATUS_SUCCESS; }
int main(int argc, char *argv[]) { g726_state_t *enc_state; g726_state_t *dec_state; int opt; int itutests; int bit_rate; SNDFILE *inhandle; SNDFILE *outhandle; int16_t amp[1024]; int frames; int adpcm; int packing; bit_rate = 32000; itutests = true; packing = G726_PACKING_NONE; while ((opt = getopt(argc, argv, "b:LR")) != -1) { switch (opt) { case 'b': bit_rate = atoi(optarg); if (bit_rate != 16000 && bit_rate != 24000 && bit_rate != 32000 && bit_rate != 40000) { fprintf(stderr, "Invalid bit rate selected. Only 16000, 24000, 32000 and 40000 are valid.\n"); exit(2); } itutests = false; break; case 'L': packing = G726_PACKING_LEFT; break; case 'R': packing = G726_PACKING_RIGHT; break; default: //usage(); exit(2); } } if (itutests) { itu_compliance_tests(); } else { if ((inhandle = sf_open_telephony_read(IN_FILE_NAME, 1)) == NULL) { fprintf(stderr, " Cannot open audio file '%s'\n", IN_FILE_NAME); exit(2); } if ((outhandle = sf_open_telephony_write(OUT_FILE_NAME, 1)) == NULL) { fprintf(stderr, " Cannot create audio file '%s'\n", OUT_FILE_NAME); exit(2); } printf("ADPCM packing is %d\n", packing); enc_state = g726_init(NULL, bit_rate, G726_ENCODING_LINEAR, packing); dec_state = g726_init(NULL, bit_rate, G726_ENCODING_LINEAR, packing); while ((frames = sf_readf_short(inhandle, amp, 159))) { adpcm = g726_encode(enc_state, adpcmdata, amp, frames); frames = g726_decode(dec_state, amp, adpcmdata, adpcm); sf_writef_short(outhandle, amp, frames); } if (sf_close_telephony(inhandle)) { printf(" Cannot close audio file '%s'\n", IN_FILE_NAME); exit(2); } if (sf_close_telephony(outhandle)) { printf(" Cannot close audio file '%s'\n", OUT_FILE_NAME); exit(2); } printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); g726_free(enc_state); g726_free(dec_state); } return 0; }
static void itu_compliance_tests(void) { g726_state_t enc_state; g726_state_t dec_state; int len2; int len3; int i; int test; int bad_samples; int conditioning_samples; int samples; int conditioning_adpcm; int adpcm; len2 = 0; conditioning_samples = 0; for (test = 0; itu_test_sets[test].rate; test++) { printf("Test %2d: '%s' + '%s'\n" " -> '%s' + '%s'\n" " -> '%s' [%d, %d, %d]\n", test, itu_test_sets[test].conditioning_pcm_file, itu_test_sets[test].pcm_file, itu_test_sets[test].conditioning_adpcm_file, itu_test_sets[test].adpcm_file, itu_test_sets[test].output_file, itu_test_sets[test].rate, itu_test_sets[test].compression_law, itu_test_sets[test].decompression_law); if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test the encode side */ g726_init(&enc_state, itu_test_sets[test].rate, itu_test_sets[test].compression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_pcm_file[0]) { conditioning_samples = get_test_vector(itu_test_sets[test].conditioning_pcm_file, xlaw, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d samples at %dbps\n", test, conditioning_samples, itu_test_sets[test].rate); } else { conditioning_samples = 0; } samples = get_test_vector(itu_test_sets[test].pcm_file, xlaw + conditioning_samples, MAX_TEST_VECTOR_LEN); memcpy(itudata, xlaw, samples + conditioning_samples); printf("Test %d: Compressing %d samples at %dbps\n", test, samples, itu_test_sets[test].rate); len2 = g726_encode(&enc_state, adpcmdata, itudata, conditioning_samples + samples); } /* Test the decode side */ g726_init(&dec_state, itu_test_sets[test].rate, itu_test_sets[test].decompression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_adpcm_file[0]) { conditioning_adpcm = get_test_vector(itu_test_sets[test].conditioning_adpcm_file, unpacked, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d octets at %dbps\n", test, conditioning_adpcm, itu_test_sets[test].rate); } else { conditioning_adpcm = 0; } adpcm = get_test_vector(itu_test_sets[test].adpcm_file, unpacked + conditioning_adpcm, MAX_TEST_VECTOR_LEN); if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test our compressed version against the reference compressed version */ printf("Test %d: Compressed data check - %d/%d octets\n", test, conditioning_adpcm + adpcm, len2); if (conditioning_adpcm + adpcm == len2) { for (bad_samples = 0, i = conditioning_samples; i < len2; i++) { if (adpcmdata[i] != unpacked[i]) { bad_samples++; printf("Test %d: Compressed mismatch %d %x %x\n", test, i, adpcmdata[i], unpacked[i]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, conditioning_adpcm + adpcm, len2); exit(2); } } len3 = g726_decode(&dec_state, outdata, unpacked, conditioning_adpcm + adpcm); /* Get the output reference data */ samples = get_test_vector(itu_test_sets[test].output_file, xlaw, MAX_TEST_VECTOR_LEN); memcpy(itu_ref, xlaw, samples); /* Test our decompressed version against the reference decompressed version */ printf("Test %d: Decompressed data check - %d/%d samples\n", test, samples, len3 - conditioning_adpcm); if (samples == len3 - conditioning_adpcm) { for (bad_samples = 0, i = 0; i < len3; i++) { if (itu_ref[i] != ((uint8_t *) outdata)[i + conditioning_adpcm]) { bad_samples++; printf("Test %d: Decompressed mismatch %d %x %x\n", test, i, itu_ref[i], ((uint8_t *) outdata)[i + conditioning_adpcm]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, samples, len3 - conditioning_adpcm); exit(2); } } printf("Tests passed.\n"); }
int main(int argc, char *argv[]) { g726_state_t enc_state; g726_state_t dec_state; int len2; int len3; int i; int test; int bits_per_code; int itutests; int bit_rate; int bad_samples; AFfilehandle inhandle; AFfilehandle outhandle; AFfilesetup filesetup; int16_t amp[1024]; int frames; int outframes; int conditioning_samples; int samples; int conditioning_adpcm; int adpcm; int packing; float x; i = 1; bit_rate = 32000; itutests = TRUE; packing = G726_PACKING_NONE; while (argc > i) { if (strcmp(argv[i], "-16") == 0) { bit_rate = 16000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-24") == 0) { bit_rate = 24000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-32") == 0) { bit_rate = 32000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-40") == 0) { bit_rate = 40000; itutests = FALSE; i++; } else if (strcmp(argv[i], "-l") == 0) { packing = G726_PACKING_LEFT; i++; } else if (strcmp(argv[i], "-r") == 0) { packing = G726_PACKING_RIGHT; i++; } else { fprintf(stderr, "Unknown parameter %s specified.\n", argv[i]); exit(2); } } len2 = 0; conditioning_samples = 0; if (itutests) { for (test = 0; itu_test_sets[test].rate; test++) { printf("Test %2d: '%s' + '%s'\n" " -> '%s' + '%s'\n" " -> '%s' [%d, %d, %d]\n", test, itu_test_sets[test].conditioning_pcm_file, itu_test_sets[test].pcm_file, itu_test_sets[test].conditioning_adpcm_file, itu_test_sets[test].adpcm_file, itu_test_sets[test].output_file, itu_test_sets[test].rate, itu_test_sets[test].compression_law, itu_test_sets[test].decompression_law); switch (itu_test_sets[test].rate) { case 16000: bits_per_code = 2; break; case 24000: bits_per_code = 3; break; case 32000: default: bits_per_code = 4; break; case 40000: bits_per_code = 5; break; } if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test the encode side */ g726_init(&enc_state, itu_test_sets[test].rate, itu_test_sets[test].compression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_pcm_file[0]) { conditioning_samples = get_test_vector(itu_test_sets[test].conditioning_pcm_file, xlaw, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d samples at %dbps\n", test, conditioning_samples, itu_test_sets[test].rate); } else { conditioning_samples = 0; } samples = get_test_vector(itu_test_sets[test].pcm_file, xlaw + conditioning_samples, MAX_TEST_VECTOR_LEN); memcpy(itudata, xlaw, samples + conditioning_samples); printf("Test %d: Compressing %d samples at %dbps\n", test, samples, itu_test_sets[test].rate); len2 = g726_encode(&enc_state, adpcmdata, itudata, conditioning_samples + samples); } /* Test the decode side */ g726_init(&dec_state, itu_test_sets[test].rate, itu_test_sets[test].decompression_law, G726_PACKING_NONE); if (itu_test_sets[test].conditioning_adpcm_file[0]) { conditioning_adpcm = get_test_vector(itu_test_sets[test].conditioning_adpcm_file, unpacked, MAX_TEST_VECTOR_LEN); printf("Test %d: Homing %d octets at %dbps\n", test, conditioning_adpcm, itu_test_sets[test].rate); } else { conditioning_adpcm = 0; } adpcm = get_test_vector(itu_test_sets[test].adpcm_file, unpacked + conditioning_adpcm, MAX_TEST_VECTOR_LEN); if (itu_test_sets[test].compression_law != G726_ENCODING_NONE) { /* Test our compressed version against the reference compressed version */ printf("Test %d: Compressed data check - %d/%d octets\n", test, conditioning_adpcm + adpcm, len2); if (conditioning_adpcm + adpcm == len2) { for (bad_samples = 0, i = conditioning_samples; i < len2; i++) { if (adpcmdata[i] != unpacked[i]) { bad_samples++; printf("Test %d: Compressed mismatch %d %x %x\n", test, i, adpcmdata[i], unpacked[i]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, conditioning_adpcm + adpcm, len2); exit(2); } } len3 = g726_decode(&dec_state, outdata, unpacked, conditioning_adpcm + adpcm); /* Get the output reference data */ samples = get_test_vector(itu_test_sets[test].output_file, xlaw, MAX_TEST_VECTOR_LEN); memcpy(itu_ref, xlaw, samples); /* Test our decompressed version against the reference decompressed version */ printf("Test %d: Decompressed data check - %d/%d samples\n", test, samples, len3 - conditioning_adpcm); if (samples == len3 - conditioning_adpcm) { for (bad_samples = 0, i = 0; i < len3; i++) { if (itu_ref[i] != ((uint8_t *) outdata)[i + conditioning_adpcm]) { bad_samples++; printf("Test %d: Decompressed mismatch %d %x %x\n", test, i, itu_ref[i], ((uint8_t *) outdata)[i + conditioning_adpcm]); } } if (bad_samples > 0) { printf("Test failed\n"); exit(2); } printf("Test passed\n"); } else { printf("Test %d: Length mismatch - ref = %d, processed = %d\n", test, samples, len3 - conditioning_adpcm); exit(2); } } printf("Tests passed.\n"); } else { if ((inhandle = afOpenFile(IN_FILE_NAME, "r", 0)) == AF_NULL_FILEHANDLE) { printf(" Cannot open wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetFrameSize(inhandle, AF_DEFAULT_TRACK, 1)) != 2.0) { printf(" Unexpected frame size in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetRate(inhandle, AF_DEFAULT_TRACK)) != (float) SAMPLE_RATE) { printf(" Unexpected sample rate in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((x = afGetChannels(inhandle, AF_DEFAULT_TRACK)) != 1.0) { printf(" Unexpected number of channels in wave file '%s'\n", IN_FILE_NAME); exit(2); } if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) { fprintf(stderr, " Failed to create file setup\n"); exit(2); } afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); afInitFileFormat(filesetup, AF_FILE_WAVE); afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup); if (outhandle == AF_NULL_FILEHANDLE) { fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); exit(2); } printf("ADPCM packing is %d\n", packing); g726_init(&enc_state, bit_rate, G726_ENCODING_LINEAR, packing); g726_init(&dec_state, bit_rate, G726_ENCODING_LINEAR, packing); while ((frames = afReadFrames(inhandle, AF_DEFAULT_TRACK, amp, 159))) { adpcm = g726_encode(&enc_state, adpcmdata, amp, frames); frames = g726_decode(&dec_state, amp, adpcmdata, adpcm); outframes = afWriteFrames(outhandle, AF_DEFAULT_TRACK, amp, frames); } if (afCloseFile(inhandle) != 0) { printf(" Cannot close wave file '%s'\n", IN_FILE_NAME); exit(2); } if (afCloseFile(outhandle) != 0) { printf(" Cannot close wave file '%s'\n", OUT_FILE_NAME); exit(2); } afFreeFileSetup(filesetup); printf("'%s' transcoded to '%s' at %dbps.\n", IN_FILE_NAME, OUT_FILE_NAME, bit_rate); } return 0; }