void g729a_dec_process (void *decState, UWord8 *bitstream, Word16 *pcm, Flag badFrame) #endif { g729a_decode_frame_state *state = (g729a_decode_frame_state *)decState; static Word16 bad_lsf = 0; /* Initialize bad LSF indicator */ Word16 parm[PRM_SIZE+1]; /* Synthesis parameters */ Word16 Az_dec[MP1*2]; /* Decoded Az for post-filter */ Word16 T2[2]; /* Pitch lag for 2 subframes */ bits2prm_ld8k( bitstream, &parm[1]); parm[0] = badFrame ? 1 : 0; /* No frame erasure */ /* check pitch parity and put 1 in parm[4] if parity error */ parm[4] = Check_Parity_Pitch(parm[3], parm[4]); Decod_ld8a(&state->decoderState, parm, state->synth, Az_dec, T2, bad_lsf); Post_Filter(&state->postFilterState, state->synth, Az_dec, T2); /* Post-filter */ Post_Process(&state->postProcessState, state->synth, pcm, L_FRAME); }
void G729aDecoder(Word16 serial[], Word16 speech[]) { extern Word16 *synth; /* Synthesis */ Word16 parm[PRM_SIZE+1]; /* Synthesis parameters */ Word16 Az_dec[MP1*2]; /* Decoded Az for post-filter */ Word16 T2[2]; /* Pitch lag for 2 subframes */ Word16 i; bits2prm_ld8k( &serial[2], &parm[1]); parm[0] = 0; for (i=2; i < SERIAL_SIZE; i++) if (serial[i] == 0 ) parm[0] = 1; parm[4] = Check_Parity_Pitch(parm[3], parm[4]); Decod_ld8a(parm, synth, Az_dec, T2); Post_Filter(synth, Az_dec, T2); Post_Process(synth, L_FRAME); for(i=0;i<L_FRAME;i++) speech[i]=synth[i]; }
Word16 read_frame(FILE *f_serial, Word16 *parm) { Word16 i; Word16 serial[SERIAL_SIZE]; /* Serial stream */ if(fread(serial, sizeof(short), 2, f_serial) != 2) { return(0); } if(fread(&serial[2], sizeof(Word16), (size_t)serial[1], f_serial) != (size_t)serial[1]) { return(0); } bits2prm_ld8k(&serial[1], parm); /* This part was modified for version V1.3 */ /* for speech and SID frames, the hardware detects frame erasures by checking if all bits are set to zero */ /* for untransmitted frames, the hardware detects frame erasures by testing serial[0] */ parm[0] = 0; /* No frame erasure */ if(serial[1] != 0) { for (i=0; i < serial[1]; i++) if (serial[i+2] == 0 ) parm[0] = 1; /* frame erased */ } else if(serial[0] != SYNC_WORD) parm[0] = 1; if(parm[1] == 1) { /* check parity and put 1 in parm[5] if parity error */ parm[5] = Check_Parity_Pitch(parm[4], parm[5]); } return(1); }
//#if 0 int main(int argc, char *argv[] ) { Word16 synth_buf[L_FRAME+M], *synth; /* Synthesis */ Word16 parm[PRM_SIZE+1]; /* Synthesis parameters */ Word16 serial[SERIAL_SIZE]; /* Serial stream */ Word16 Az_dec[MP1*2]; /* Decoded Az for post-filter */ Word16 T2[2]; /* Pitch lag for 2 subframes */ Word16 i, frame; FILE *f_syn, *f_serial; printf("\n"); printf("************ G.729a 8.0 KBIT/S SPEECH DECODER ************\n"); printf("\n"); printf("------------------- Fixed point C simulation ----------------\n"); printf("\n"); printf("----------------- Version 1.1 ---------------\n"); printf("\n"); /* Passed arguments */ argc = 3; strcpy(argv[1],"test.bit"); strcpy(argv[2],"test.dec"); if ( argc != 3) { printf("Usage :%s bitstream_file outputspeech_file\n",argv[0]); printf("\n"); printf("Format for bitstream_file:\n"); printf(" One (2-byte) synchronization word \n"); printf(" One (2-byte) size word,\n"); printf(" 80 words (2-byte) containing 80 bits.\n"); printf("\n"); printf("Format for outputspeech_file:\n"); printf(" Synthesis is written to a binary file of 16 bits data.\n"); exit( 1 ); } /* Open file for synthesis and packed serial stream */ if( (f_serial = fopen(argv[1],"rb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[1]); exit(0); } if( (f_syn = fopen(argv[2], "wb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[2]); exit(0); } printf("Input bitstream file : %s\n",argv[1]); printf("Synthesis speech file : %s\n",argv[2]); /*-----------------------------------------------------------------* * Initialization of decoder * *-----------------------------------------------------------------*/ for (i=0; i<M; i++) synth_buf[i] = 0; synth = synth_buf + M; bad_lsf = 0; /* Initialize bad LSF indicator */ Init_Decod_ld8a(); Init_Post_Filter(); Init_Post_Process(); /*-----------------------------------------------------------------* * Loop for each "L_FRAME" speech data * *-----------------------------------------------------------------*/ frame = 0; /* c code */ while( fread(serial, sizeof(Word16), SERIAL_SIZE, f_serial) == SERIAL_SIZE) { //printf("Frame =%d\n", frame++); printf("Frame =%d \n", frame); frame = frame + 1; bits2prm_ld8k( &serial[2], &parm[1]); /* the hardware detects frame erasures by checking if all bits are set to zero */ parm[0] = 0; /* No frame erasure */ for (i=2; i < SERIAL_SIZE; i++) if (serial[i] == 0 ) parm[0] = 1; /* frame erased */ /* check pitch parity and put 1 in parm[4] if parity error */ parm[4] = Check_Parity_Pitch(parm[3], parm[4]); Decod_ld8a(parm, synth, Az_dec, T2); Post_Filter(synth, Az_dec, T2); /* Post-filter */ Post_Process(synth, L_FRAME); fwrite(synth, sizeof(short), L_FRAME, f_syn); } return(0); }
int main( int argc, char *argv[]) { static FLOAT synth_buf[L_FRAME+M]; /* Synthesis */ FLOAT *synth; static int parm[PRM_SIZE+2]; /* Synthesis parameters + BFI */ static INT16 serial[SERIAL_SIZE]; /* Serial stream */ static FLOAT Az_dec[MP1*2]; /* Decoded Az for post-filter */ static int T2[2]; /* Decoded Pitch */ INT32 frame; int i; FILE *f_syn, *f_serial; printf("\n"); printf("************** G.729A 8 KBIT/S SPEECH DECODER ************\n"); printf("\n"); printf("----------------- Floating point C simulation ----------------\n"); printf("\n"); printf("------------ Version 1.01 (Release 2, November 2006) --------\n"); printf("\n"); /* Passed arguments */ if ( argc != 3) { printf("Usage :%s bitstream_file outputspeech_file\n",argv[0]); printf("\n"); printf("Format for bitstream_file:\n"); printf(" One (2-byte) synchronization word \n"); printf(" One (2-byte) size word,\n"); printf(" 80 words (2-byte) containing 80 bits.\n"); printf("\n"); printf("Format for outputspeech_file:\n"); printf(" Synthesis is written to a binary file of 16 bits data.\n"); exit( 1 ); } /* Open file for synthesis and packed serial stream */ if( (f_serial = fopen(argv[1],"rb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[1]); exit(0); } if( (f_syn = fopen(argv[2], "wb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[2]); exit(0); } printf("Input bitstream file : %s\n",argv[1]); printf("Synthesis speech file : %s\n",argv[2]); /*-----------------------------------------------------------------* * Initialization of decoder * *-----------------------------------------------------------------*/ for (i=0; i<M; i++) synth_buf[i] = (F)0.0; synth = synth_buf + M; bad_lsf = 0; /* Initialize bad LSF indicator */ init_decod_ld8a(); init_post_filter(); init_post_process(); /*-----------------------------------------------------------------* * Loop for each "L_FRAME" speech data * *-----------------------------------------------------------------*/ frame =0; while( fread(serial, sizeof(INT16), SERIAL_SIZE, f_serial) == SERIAL_SIZE) { frame++; printf(" Frame: %ld\r", frame); bits2prm_ld8k( &serial[2], &parm[1]); if (serial[0] == SYNC_WORD) { parm[0] = 0; /* No frame erasure */ } else { parm[0] = 1; /* frame erased */ } parm[4] = check_parity_pitch(parm[3], parm[4] ); /* get parity check result */ decod_ld8a(parm, synth, Az_dec, T2); /* decoder */ post_filter(synth, Az_dec, T2); /* Post-filter */ post_process(synth, L_FRAME); /* Highpass filter */ fwrite16(synth, L_FRAME, f_syn); } return(0); }
int main(int argc, char *argv[] ) { Word16 synth_buf[L_FRAME+M], *synth; /* Synthesis */ Word16 parm[PRM_SIZE+1]; /* Synthesis parameters */ Word16 serial[SERIAL_SIZE]; /* Serial stream */ Word16 Az_dec[MP1*2], *ptr_Az; /* Decoded Az for post-filter */ Word16 T0_first; /* Pitch lag in 1st subframe */ Word16 pst_out[L_FRAME]; /* Postfilter output */ Word16 voicing; /* voicing from previous frame */ Word16 sf_voic; /* voicing for subframe */ Word16 i, frame; FILE *f_syn, *f_serial; printf("\n"); printf("*********** ITU G.729 8 KBIT/S SPEECH CODER ***********\n"); printf("\n"); printf("------------------- Fixed point C simulation -----------------\n"); printf("\n"); printf("----------------- Version 3.3 ----------------\n"); printf("\n"); /* Passed arguments */ if ( argc != 3 ) { printf("Usage :%s bitstream_file outputspeech_file\n",argv[0]); printf("\n"); printf("Format for bitstream_file:\n"); printf(" One (2-byte) synchronization word,\n"); printf(" One (2-byte) size word,\n"); printf(" 80 words (2-byte) containing 80 bits.\n"); printf("\n"); printf("Format for outputspeech_file:\n"); printf(" Output is written to a binary file of 16 bits data.\n"); exit( 1 ); } /* Open file for synthesis and packed serial stream */ if( (f_serial = fopen(argv[1],"rb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[1]); exit(0); } if( (f_syn = fopen(argv[2], "wb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[2]); exit(0); } printf("Input bitstream file : %s\n",argv[1]); printf("Synthesis speech file : %s\n",argv[2]); /*-----------------------------------------------------------------* * Initialization of decoder * *-----------------------------------------------------------------*/ for (i=0; i<M; i++) synth_buf[i] = 0; synth = synth_buf + M; Init_Decod_ld8k(); Init_Post_Filter(); Init_Post_Process(); voicing = 60; /*-----------------------------------------------------------------* * Loop for each "L_FRAME" speech data * *-----------------------------------------------------------------*/ frame = 0; while( fread(serial, sizeof(Word16), SERIAL_SIZE, f_serial) == SERIAL_SIZE) { bits2prm_ld8k( &serial[2], &parm[1]); /* the hardware detects frame erasures by checking if all bits are set to zero */ parm[0] = 0; /* No frame erasure */ for (i=2; i < SERIAL_SIZE; i++) if (serial[i] == 0 ) parm[0] = 1; /* frame erased */ /* check parity and put 1 in parm[4] if parity error */ parm[4] = Check_Parity_Pitch(parm[3], parm[4]); Decod_ld8k(parm, voicing, synth, Az_dec, &T0_first); /* Postfilter */ voicing = 0; ptr_Az = Az_dec; for(i=0; i<L_FRAME; i+=L_SUBFR) { Post(T0_first, &synth[i], ptr_Az, &pst_out[i], &sf_voic); if (sf_voic != 0) { voicing = sf_voic;} ptr_Az += MP1; } Copy(&synth_buf[L_FRAME], &synth_buf[0], M); Post_Process(pst_out, L_FRAME); #ifdef HARDW { Word16 *my_pt; Word16 my_temp; int my_i; my_pt = pst_out; for(my_i=0; my_i < L_FRAME; my_i++) { my_temp = *my_pt; my_temp = add( my_temp, (Word16) 4); /* rounding on 13 bit */ my_temp = my_temp & 0xFFF8; /* mask on 13 bit */ *my_pt++ = my_temp; } } #endif fwrite(pst_out, sizeof(Word16), L_FRAME, f_syn); frame++; printf("Frame =%d\r", frame); } return(0); }
int main( int argc, char *argv[]) { FLOAT synth_buf[L_FRAME+M]; /* Synthesis */ FLOAT *synth; int parm[PRM_SIZE+1]; /* Synthesis parameters + BFI */ INT16 serial[SERIAL_SIZE]; /* Serial stream */ FLOAT Az_dec[2*MP1], *ptr_Az; /* Decoded Az for post-filter */ int t0_first; FLOAT pst_out[L_FRAME]; /* postfilter output */ int voicing; /* voicing for previous subframe */ int sf_voic; /* voicing for subframe */ INT32 frame; FILE *f_syn, *f_serial; int i; printf("\n"); printf("************** G.729 8 KBIT/S SPEECH DECODER ************\n"); printf("\n"); printf("----------------- Floating point C simulation ----------------\n"); printf("\n"); printf("------------ Version 1.01 (Release 2, November 2006) --------\n"); printf("\n"); /* Passed arguments */ if ( argc != 3) { printf("Usage :%s bitstream_file outputspeech_file\n",argv[0]); printf("\n"); printf("Format for bitstream_file:\n"); printf(" One (2-byte) synchronization word \n"); printf(" One (2-byte) size word,\n"); printf(" 80 words (2-byte) containing 80 bits.\n"); printf("\n"); printf("Format for outputspeech_file:\n"); printf(" Synthesis is written to a binary file of 16 bits data.\n"); exit( 1 ); } /* Open file for synthesis and packed serial stream */ if( (f_serial = fopen(argv[1],"rb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[1]); exit(0); } if( (f_syn = fopen(argv[2], "wb") ) == NULL ) { printf("%s - Error opening file %s !!\n", argv[0], argv[2]); exit(0); } printf("Input bitstream file : %s\n",argv[1]); printf("Synthesis speech file : %s\n",argv[2]); /*-----------------------------------------------------------------* * Initialization of decoder * *-----------------------------------------------------------------*/ for (i=0; i<M; i++) synth_buf[i] = (F)0.0; synth = synth_buf + M; init_decod_ld8k(); init_post_filter(); init_post_process(); voicing = 60; /*-----------------------------------------------------------------* * Loop for each "L_FRAME" speech data * *-----------------------------------------------------------------*/ frame =0; while( fread(serial, sizeof(INT16), SERIAL_SIZE, f_serial) == SERIAL_SIZE) { frame++; printf(" Frame: %ld\r", frame); bits2prm_ld8k( &serial[2], &parm[1]); /* the hardware detects frame erasures by checking if all bits are set to zero */ parm[0] = 0; /* No frame erasure */ for (i=2; i < SERIAL_SIZE; i++) if (serial[i] == 0 ) parm[0] = 1; /* frame erased */ /* check parity and put 1 in parm[4] if parity error */ parm[4] = check_parity_pitch(parm[3], parm[4] ); decod_ld8k(parm, voicing, synth, Az_dec, &t0_first); /* Decoder */ /* Post-filter and decision on voicing parameter */ voicing = 0; ptr_Az = Az_dec; for(i=0; i<L_FRAME; i+=L_SUBFR) { post(t0_first, &synth[i], ptr_Az, &pst_out[i], &sf_voic); if (sf_voic != 0) { voicing = sf_voic;} ptr_Az += MP1; } copy(&synth_buf[L_FRAME], &synth_buf[0], M); post_process(pst_out, L_FRAME); fwrite16(pst_out, L_FRAME, f_syn); } return(0); }
static tsk_size_t tdav_codec_g729ab_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { tsk_size_t out_size = 0; int i, frame_count; const uint8_t* data_start = (const uint8_t*)in_data; const uint8_t* data_end; tdav_codec_g729ab_t* g729a = (tdav_codec_g729ab_t*)self; if(!self || !in_data || !in_size || !out_data || ((in_size % 10) && (in_size % 10 != 2))){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } data_end = (data_start + in_size); frame_count = (in_size/10) + ((in_size % 10) ? 1 : 0); out_size = 160*frame_count; /* allocate new buffer if needed */ if(*out_max_size <out_size){ if(!(*out_data = tsk_realloc(*out_data, out_size))){ TSK_DEBUG_ERROR("Failed to allocate new buffer"); *out_max_size = 0; return 0; } *out_max_size = out_size; } for(i=0; i<frame_count; i++){ memset(g729a->decoder.synth_buf, 0, M); g729a->decoder.synth = g729a->decoder.synth_buf + M; if((data_end - data_start) == 2){ unpack_SID(data_start, g729a->decoder.serial); data_start += 2; } else{ unpack_G729(data_start, g729a->decoder.serial, 10); data_start += 10; } bits2prm_ld8k(&g729a->decoder.serial[1], g729a->decoder.parm); /* This part was modified for version V1.3 */ /* for speech and SID frames, the hardware detects frame erasures by checking if all bits are set to zero */ /* for untransmitted frames, the hardware detects frame erasures by testing serial[0] */ g729a->decoder.parm[0] = 0; /* No frame erasure */ if(g729a->decoder.serial[1] != 0) { int j; for (j=0; j < g729a->decoder.serial[1]; j++){ if (g729a->decoder.serial[j+2] == 0){ g729a->decoder.parm[0] = 1; /* frame erased */ break; } } } else if(g729a->decoder.serial[0] != SYNC_WORD){ g729a->decoder.parm[0] = 1; } if(g729a->decoder.parm[1] == 1) { /* check parity and put 1 in parm[5] if parity error */ g729a->decoder.parm[5] = Check_Parity_Pitch(g729a->decoder.parm[4], g729a->decoder.parm[5]); } Decod_ld8a(g729a->decoder.parm, g729a->decoder.synth, g729a->decoder.Az_dec, g729a->decoder.T2, &g729a->decoder.Vad); Post_Filter(g729a->decoder.synth, g729a->decoder.Az_dec, g729a->decoder.T2, g729a->decoder.Vad); /* Post-filter */ Post_Process(g729a->decoder.synth, L_FRAME); memcpy(&((uint8_t*)*out_data)[160*i], g729a->decoder.synth, 160); } return out_size; }