00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include "avcodec.h"
00057
00058 #ifdef AMR_NB_FIXED
00059
00060 #define MMS_IO
00061
00062 #include "amr/sp_dec.h"
00063 #include "amr/d_homing.h"
00064 #include "amr/typedef.h"
00065 #include "amr/sp_enc.h"
00066 #include "amr/sid_sync.h"
00067 #include "amr/e_homing.h"
00068
00069 #else
00070 #include "amr_float/interf_dec.h"
00071 #include "amr_float/interf_enc.h"
00072 #endif
00073
00074
00075 typedef struct AMR_bitrates
00076 {
00077 int startrate;
00078 int stoprate;
00079 enum Mode mode;
00080
00081 } AMR_bitrates;
00082
00083
00084 static enum Mode getBitrateMode(int bitrate)
00085 {
00086
00087
00088 AMR_bitrates rates[]={ {0,4999,MR475},
00089 {5000,5899,MR515},
00090 {5900,6699,MR59},
00091 {6700,7000,MR67},
00092 {7001,7949,MR74},
00093 {7950,9999,MR795},
00094 {10000,11999,MR102},
00095 {12000,64000,MR122},
00096
00097 };
00098 int i;
00099 for(i=0;i<8;i++)
00100 {
00101 if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
00102 {
00103 return(rates[i].mode);
00104 }
00105 }
00106
00107 return(MR122);
00108 }
00109
00110 #ifdef AMR_NB_FIXED
00111
00112
00113 #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)
00114
00115 typedef struct AMRContext {
00116 int frameCount;
00117 Speech_Decode_FrameState *speech_decoder_state;
00118 enum RXFrameType rx_type;
00119 enum Mode mode;
00120 Word16 reset_flag;
00121 Word16 reset_flag_old;
00122
00123 enum Mode enc_bitrate;
00124 Speech_Encode_FrameState *enstate;
00125 sid_syncState *sidstate;
00126 enum TXFrameType tx_frametype;
00127
00128
00129 } AMRContext;
00130
00131 static int amr_nb_decode_init(AVCodecContext * avctx)
00132 {
00133 AMRContext *s = avctx->priv_data;
00134 s->frameCount=0;
00135 s->speech_decoder_state=NULL;
00136 s->rx_type = (enum RXFrameType)0;
00137 s->mode= (enum Mode)0;
00138 s->reset_flag=0;
00139 s->reset_flag_old=1;
00140
00141 if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder"))
00142 {
00143 av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init error\n");
00144 return -1;
00145 }
00146 return 0;
00147 }
00148
00149 static int amr_nb_encode_init(AVCodecContext * avctx)
00150 {
00151 AMRContext *s = avctx->priv_data;
00152 s->frameCount=0;
00153 s->speech_decoder_state=NULL;
00154 s->rx_type = (enum RXFrameType)0;
00155 s->mode= (enum Mode)0;
00156 s->reset_flag=0;
00157 s->reset_flag_old=1;
00158
00159 if(avctx->sample_rate!=8000)
00160 {
00161 if(avctx->debug)
00162 {
00163 av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supported\n");
00164 }
00165 return -1;
00166 }
00167
00168 if(avctx->channels!=1)
00169 {
00170 if(avctx->debug)
00171 {
00172 av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
00173 }
00174 return -1;
00175 }
00176
00177 avctx->frame_size=160;
00178 avctx->coded_frame= avcodec_alloc_frame();
00179
00180 if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate))
00181 {
00182 if(avctx->debug)
00183 {
00184 av_log(avctx, AV_LOG_DEBUG, "Speech_Encode_Frame_init error\n");
00185 }
00186 return -1;
00187 }
00188
00189 s->enc_bitrate=getBitrateMode(avctx->bit_rate);
00190
00191 return 0;
00192 }
00193
00194 static int amr_nb_encode_close(AVCodecContext * avctx)
00195 {
00196 AMRContext *s = avctx->priv_data;
00197 Speech_Encode_Frame_exit(&s->enstate);
00198 sid_sync_exit (&s->sidstate);
00199 av_freep(&avctx->coded_frame);
00200 return 0;
00201 }
00202
00203 static int amr_nb_decode_close(AVCodecContext * avctx)
00204 {
00205 AMRContext *s = avctx->priv_data;
00206 Speech_Decode_Frame_exit(&s->speech_decoder_state);
00207 return 0;
00208 }
00209
00210 static int amr_nb_decode_frame(AVCodecContext * avctx,
00211 void *data, int *data_size,
00212 uint8_t * buf, int buf_size)
00213 {
00214 AMRContext *s = avctx->priv_data;
00215
00216 uint8_t*amrData=buf;
00217 int offset=0;
00218
00219 UWord8 toc, q, ft;
00220
00221 Word16 serial[SERIAL_FRAMESIZE];
00222 Word16 *synth;
00223 UWord8 *packed_bits;
00224
00225 static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
00226 int i;
00227
00228
00229
00230 synth=data;
00231
00232
00233 {
00234 toc=amrData[offset];
00235
00236 q = (toc >> 2) & 0x01;
00237 ft = (toc >> 3) & 0x0F;
00238
00239
00240
00241 offset++;
00242
00243 packed_bits=amrData+offset;
00244
00245 offset+=packed_size[ft];
00246
00247
00248 s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]);
00249
00250
00251 s->frameCount++;
00252
00253 if (s->rx_type == RX_NO_DATA)
00254 {
00255 s->mode = s->speech_decoder_state->prev_mode;
00256 }
00257 else {
00258 s->speech_decoder_state->prev_mode = s->mode;
00259 }
00260
00261
00262 if (s->reset_flag_old == 1)
00263 {
00264
00265 s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode);
00266 }
00267
00268 if ((s->reset_flag != 0) && (s->reset_flag_old != 0))
00269 {
00270 for (i = 0; i < L_FRAME; i++)
00271 {
00272 synth[i] = EHF_MASK;
00273 }
00274 }
00275 else
00276 {
00277
00278 Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth);
00279 }
00280
00281
00282 *data_size+=160*2;
00283 synth+=160;
00284
00285
00286 if (s->reset_flag_old == 0)
00287 {
00288
00289 s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode);
00290 }
00291
00292 if (s->reset_flag != 0)
00293 {
00294 Speech_Decode_Frame_reset(s->speech_decoder_state);
00295 }
00296 s->reset_flag_old = s->reset_flag;
00297
00298 }
00299 return offset;
00300 }
00301
00302
00303 static int amr_nb_encode_frame(AVCodecContext *avctx,
00304 unsigned char *frame, int buf_size, void *data)
00305 {
00306 short serial_data[250] = {0};
00307
00308 AMRContext *s = avctx->priv_data;
00309 int written;
00310
00311 s->reset_flag = encoder_homing_frame_test(data);
00312
00313 Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode);
00314
00315
00316 sid_sync (s->sidstate, s->mode, &s->tx_frametype);
00317
00318 written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame);
00319
00320 if (s->reset_flag != 0)
00321 {
00322 Speech_Encode_Frame_reset(s->enstate);
00323 sid_sync_reset(s->sidstate);
00324 }
00325 return written;
00326 }
00327
00328
00329 #else
00330
00331 typedef struct AMRContext {
00332 int frameCount;
00333 void * decState;
00334 int *enstate;
00335 enum Mode enc_bitrate;
00336 } AMRContext;
00337
00338 static int amr_nb_decode_init(AVCodecContext * avctx)
00339 {
00340 AMRContext *s = avctx->priv_data;
00341 s->frameCount=0;
00342 s->decState=Decoder_Interface_init();
00343 if(!s->decState)
00344 {
00345 av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n");
00346 return -1;
00347 }
00348 return 0;
00349 }
00350
00351 static int amr_nb_encode_init(AVCodecContext * avctx)
00352 {
00353 AMRContext *s = avctx->priv_data;
00354 s->frameCount=0;
00355
00356 if(avctx->sample_rate!=8000)
00357 {
00358 if(avctx->debug)
00359 {
00360 av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supported\n");
00361 }
00362 return -1;
00363 }
00364
00365 if(avctx->channels!=1)
00366 {
00367 if(avctx->debug)
00368 {
00369 av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
00370 }
00371 return -1;
00372 }
00373
00374 avctx->frame_size=160;
00375 avctx->coded_frame= avcodec_alloc_frame();
00376
00377 s->enstate=Encoder_Interface_init(0);
00378 if(!s->enstate)
00379 {
00380 if(avctx->debug)
00381 {
00382 av_log(avctx, AV_LOG_DEBUG, "Encoder_Interface_init error\n");
00383 }
00384 return -1;
00385 }
00386
00387 s->enc_bitrate=getBitrateMode(avctx->bit_rate);
00388
00389 return 0;
00390 }
00391
00392 static int amr_nb_decode_close(AVCodecContext * avctx)
00393 {
00394 AMRContext *s = avctx->priv_data;
00395 Decoder_Interface_exit(s->decState);
00396 return 0;
00397 }
00398
00399 static int amr_nb_encode_close(AVCodecContext * avctx)
00400 {
00401 AMRContext *s = avctx->priv_data;
00402 Encoder_Interface_exit(s->enstate);
00403 av_freep(&avctx->coded_frame);
00404 return 0;
00405 }
00406
00407 static int amr_nb_decode_frame(AVCodecContext * avctx,
00408 void *data, int *data_size,
00409 uint8_t * buf, int buf_size)
00410 {
00411 AMRContext *s = (AMRContext*)avctx->priv_data;
00412
00413 uint8_t*amrData=buf;
00414 static short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
00415 enum Mode dec_mode;
00416 int packet_size;
00417
00418
00419
00420 if(buf_size==0) {
00421
00422 return 0;
00423 }
00424
00425 dec_mode = (buf[0] >> 3) & 0x000F;
00426 packet_size = block_size[dec_mode]+1;
00427
00428 if(packet_size > buf_size) {
00429 av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size);
00430 return -1;
00431 }
00432
00433 s->frameCount++;
00434
00435
00436 Decoder_Interface_Decode(s->decState, amrData, data, 0);
00437 *data_size=160*2;
00438
00439 return packet_size;
00440 }
00441
00442 static int amr_nb_encode_frame(AVCodecContext *avctx,
00443 unsigned char *frame, int buf_size, void *data)
00444 {
00445 AMRContext *s = (AMRContext*)avctx->priv_data;
00446 int written;
00447
00448 written = Encoder_Interface_Encode(s->enstate,
00449 s->enc_bitrate,
00450 data,
00451 frame,
00452 0);
00453
00454
00455 return written;
00456 }
00457
00458 #endif
00459
00460 AVCodec amr_nb_decoder =
00461 {
00462 "amr_nb",
00463 CODEC_TYPE_AUDIO,
00464 CODEC_ID_AMR_NB,
00465 sizeof(AMRContext),
00466 amr_nb_decode_init,
00467 NULL,
00468 amr_nb_decode_close,
00469 amr_nb_decode_frame,
00470 };
00471
00472 AVCodec amr_nb_encoder =
00473 {
00474 "amr_nb",
00475 CODEC_TYPE_AUDIO,
00476 CODEC_ID_AMR_NB,
00477 sizeof(AMRContext),
00478 amr_nb_encode_init,
00479 amr_nb_encode_frame,
00480 amr_nb_encode_close,
00481 NULL,
00482 };
00483
00484
00485 #ifdef AMR_WB
00486
00487 #ifdef _TYPEDEF_H
00488
00489 #define typedef_h
00490 #endif
00491
00492 #include "amrwb_float/enc_if.h"
00493 #include "amrwb_float/dec_if.h"
00494
00495
00496 typedef struct AMRWB_bitrates
00497 {
00498 int startrate;
00499 int stoprate;
00500 int mode;
00501
00502 } AMRWB_bitrates;
00503
00504 static int getWBBitrateMode(int bitrate)
00505 {
00506
00507
00508 AMRWB_bitrates rates[]={ {0,7999,0},
00509 {8000,9999,1},
00510 {10000,13000,2},
00511 {13001,14999,3},
00512 {15000,17000,4},
00513 {17001,18000,5},
00514 {18001,22000,6},
00515 {22001,23000,7},
00516 {23001,24000,8},
00517
00518 };
00519 int i;
00520
00521 for(i=0;i<9;i++)
00522 {
00523 if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
00524 {
00525 return(rates[i].mode);
00526 }
00527 }
00528
00529 return(8);
00530 }
00531
00532
00533 typedef struct AMRWBContext {
00534 int frameCount;
00535 void *state;
00536 int mode;
00537 Word16 allow_dtx;
00538 } AMRWBContext;
00539
00540 static int amr_wb_encode_init(AVCodecContext * avctx)
00541 {
00542 AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
00543 s->frameCount=0;
00544
00545 if(avctx->sample_rate!=16000)
00546 {
00547 if(avctx->debug)
00548 {
00549 av_log(avctx, AV_LOG_DEBUG, "Only 16000Hz sample rate supported\n");
00550 }
00551 return -1;
00552 }
00553
00554 if(avctx->channels!=1)
00555 {
00556 if(avctx->debug)
00557 {
00558 av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
00559 }
00560 return -1;
00561 }
00562
00563 avctx->frame_size=320;
00564 avctx->coded_frame= avcodec_alloc_frame();
00565
00566 s->state = E_IF_init();
00567 s->mode=getWBBitrateMode(avctx->bit_rate);
00568 s->allow_dtx=0;
00569
00570 return 0;
00571 }
00572
00573 static int amr_wb_encode_close(AVCodecContext * avctx)
00574 {
00575 AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
00576 E_IF_exit(s->state);
00577 av_freep(&avctx->coded_frame);
00578 s->frameCount++;
00579 return 0;
00580 }
00581
00582 static int amr_wb_encode_frame(AVCodecContext *avctx,
00583 unsigned char *frame, int buf_size, void *data)
00584 {
00585 AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
00586 int size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx);
00587 return size;
00588 }
00589
00590 static int amr_wb_decode_init(AVCodecContext * avctx)
00591 {
00592 AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
00593 s->frameCount=0;
00594 s->state = D_IF_init();
00595 return 0;
00596 }
00597
00598 extern const UWord8 block_size[];
00599
00600 static int amr_wb_decode_frame(AVCodecContext * avctx,
00601 void *data, int *data_size,
00602 uint8_t * buf, int buf_size)
00603 {
00604 AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
00605
00606 uint8_t*amrData=buf;
00607 int mode;
00608 int packet_size;
00609
00610 if(buf_size==0) {
00611
00612 return 0;
00613 }
00614
00615 mode = (amrData[0] >> 3) & 0x000F;
00616 packet_size = block_size[mode];
00617
00618 if(packet_size > buf_size) {
00619 av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1);
00620 return -1;
00621 }
00622
00623 s->frameCount++;
00624 D_IF_decode( s->state, amrData, data, _good_frame);
00625 *data_size=320*2;
00626 return packet_size;
00627 }
00628
00629 static int amr_wb_decode_close(AVCodecContext * avctx)
00630 {
00631 AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
00632 D_IF_exit(s->state);
00633 return 0;
00634 }
00635
00636 AVCodec amr_wb_decoder =
00637 {
00638 "amr_wb",
00639 CODEC_TYPE_AUDIO,
00640 CODEC_ID_AMR_WB,
00641 sizeof(AMRWBContext),
00642 amr_wb_decode_init,
00643 NULL,
00644 amr_wb_decode_close,
00645 amr_wb_decode_frame,
00646 };
00647
00648 AVCodec amr_wb_encoder =
00649 {
00650 "amr_wb",
00651 CODEC_TYPE_AUDIO,
00652 CODEC_ID_AMR_WB,
00653 sizeof(AMRWBContext),
00654 amr_wb_encode_init,
00655 amr_wb_encode_frame,
00656 amr_wb_encode_close,
00657 NULL,
00658 };
00659
00660 #endif //AMR_WB