]> git.sesse.net Git - ffmpeg/blob - libavcodec/amr.c
make state transition tables global as they are constant and the code is slightly...
[ffmpeg] / libavcodec / amr.c
1 /*
2  * AMR Audio decoder stub
3  * Copyright (c) 2003 the ffmpeg project
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21  /*
22     This code implements amr-nb and amr-wb audio encoder/decoder through external reference
23     code from www.3gpp.org. The licence of the code from 3gpp is unclear so you
24     have to download the code separately. Two versions exists: One fixed-point
25     and one with floats. For some reason the float-encoder is significant faster
26     atleast on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip at MR102).
27     Both float and fixed point is supported for amr-nb, but only float for
28     amr-wb.
29
30     --AMR-NB--
31     The fixed-point (TS26.073) can be downloaded from:
32     http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-510.zip
33     Extract the soure into ffmpeg/libavcodec/amr
34     To use the fixed version run "./configure" with "--enable-amr_nb-fixed"
35
36     The float version (default) can be downloaded from:
37     http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip
38     Extract the soure into ffmpeg/libavcodec/amr_float
39
40     The specification for amr-nb can be found in TS 26.071
41     (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other
42     info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm
43
44     --AMR-WB--
45     The reference code can be downloaded from:
46     http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip
47     It should be extracted to "libavcodec/amrwb_float". Enable it with
48     "--enable-amr_wb".
49
50     The specification for amr-wb can be downloaded from:
51     http://www.3gpp.org/ftp/Specs/archive/26_series/26.171/26171-500.zip
52
53     If someone want to use the fixed point version it can be downloaded
54     from: http://www.3gpp.org/ftp/Specs/archive/26_series/26.173/26173-571.zip
55
56  */
57
58 #include "avcodec.h"
59
60 #ifdef CONFIG_AMR_NB_FIXED
61
62 #define MMS_IO
63
64 #include "amr/sp_dec.h"
65 #include "amr/d_homing.h"
66 #include "amr/typedef.h"
67 #include "amr/sp_enc.h"
68 #include "amr/sid_sync.h"
69 #include "amr/e_homing.h"
70
71 #else
72 #include "amr_float/interf_dec.h"
73 #include "amr_float/interf_enc.h"
74 #endif
75
76 /* Common code for fixed and float version*/
77 typedef struct AMR_bitrates
78 {
79     int startrate;
80     int stoprate;
81     enum Mode mode;
82
83 } AMR_bitrates;
84
85 /* Match desired bitrate with closest one*/
86 static enum Mode getBitrateMode(int bitrate)
87 {
88     /* Adjusted so that all bitrates can be used from commandline where
89        only a multiple of 1000 can be specified*/
90     AMR_bitrates rates[]={ {0,4999,MR475}, //4
91                            {5000,5899,MR515},//5
92                            {5900,6699,MR59},//6
93                            {6700,7000,MR67},//7
94                            {7001,7949,MR74},//8
95                            {7950,9999,MR795},//9
96                            {10000,11999,MR102},//10
97                            {12000,64000,MR122},//12
98
99                          };
100     int i;
101     for(i=0;i<8;i++)
102     {
103         if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
104         {
105             return(rates[i].mode);
106         }
107     }
108     /*Return highest possible*/
109     return(MR122);
110 }
111
112 #ifdef CONFIG_AMR_NB_FIXED
113 /* fixed point version*/
114 /* frame size in serial bitstream file (frame type + serial stream + flags) */
115 #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)
116
117 typedef struct AMRContext {
118     int frameCount;
119     Speech_Decode_FrameState *speech_decoder_state;
120     enum RXFrameType rx_type;
121     enum Mode mode;
122     Word16 reset_flag;
123     Word16 reset_flag_old;
124
125     enum Mode enc_bitrate;
126     Speech_Encode_FrameState *enstate;
127     sid_syncState *sidstate;
128     enum TXFrameType tx_frametype;
129
130
131 } AMRContext;
132
133 static int amr_nb_decode_init(AVCodecContext * avctx)
134 {
135     AMRContext *s = avctx->priv_data;
136     s->frameCount=0;
137     s->speech_decoder_state=NULL;
138     s->rx_type = (enum RXFrameType)0;
139     s->mode= (enum Mode)0;
140     s->reset_flag=0;
141     s->reset_flag_old=1;
142
143     if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder"))
144     {
145         av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init error\n");
146         return -1;
147     }
148     return 0;
149 }
150
151 static int amr_nb_encode_init(AVCodecContext * avctx)
152 {
153     AMRContext *s = avctx->priv_data;
154     s->frameCount=0;
155     s->speech_decoder_state=NULL;
156     s->rx_type = (enum RXFrameType)0;
157     s->mode= (enum Mode)0;
158     s->reset_flag=0;
159     s->reset_flag_old=1;
160
161     if(avctx->sample_rate!=8000)
162     {
163         if(avctx->debug)
164         {
165             av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supported\n");
166         }
167         return -1;
168     }
169
170     if(avctx->channels!=1)
171     {
172         if(avctx->debug)
173         {
174             av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
175         }
176         return -1;
177     }
178
179     avctx->frame_size=160;
180     avctx->coded_frame= avcodec_alloc_frame();
181
182     if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate))
183     {
184         if(avctx->debug)
185         {
186             av_log(avctx, AV_LOG_DEBUG, "Speech_Encode_Frame_init error\n");
187         }
188         return -1;
189     }
190
191     s->enc_bitrate=getBitrateMode(avctx->bit_rate);
192
193     return 0;
194 }
195
196 static int amr_nb_encode_close(AVCodecContext * avctx)
197 {
198     AMRContext *s = avctx->priv_data;
199     Speech_Encode_Frame_exit(&s->enstate);
200     sid_sync_exit (&s->sidstate);
201     av_freep(&avctx->coded_frame);
202     return 0;
203 }
204
205 static int amr_nb_decode_close(AVCodecContext * avctx)
206 {
207     AMRContext *s = avctx->priv_data;
208     Speech_Decode_Frame_exit(&s->speech_decoder_state);
209     return 0;
210 }
211
212 static int amr_nb_decode_frame(AVCodecContext * avctx,
213             void *data, int *data_size,
214             uint8_t * buf, int buf_size)
215 {
216     AMRContext *s = avctx->priv_data;
217
218     uint8_t*amrData=buf;
219     int offset=0;
220
221     UWord8 toc, q, ft;
222
223     Word16 serial[SERIAL_FRAMESIZE];   /* coded bits */
224     Word16 *synth;
225     UWord8 *packed_bits;
226
227     static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
228     int i;
229
230     //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount);
231
232     synth=data;
233
234 //    while(offset<buf_size)
235     {
236         toc=amrData[offset];
237         /* read rest of the frame based on ToC byte */
238         q  = (toc >> 2) & 0x01;
239         ft = (toc >> 3) & 0x0F;
240
241         //printf("offset=%d, packet_size=%d amrData= 0x%X %X %X %X\n",offset,packed_size[ft],amrData[offset],amrData[offset+1],amrData[offset+2],amrData[offset+3]);
242
243         offset++;
244
245         packed_bits=amrData+offset;
246
247         offset+=packed_size[ft];
248
249         //Unsort and unpack bits
250         s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]);
251
252         //We have a new frame
253         s->frameCount++;
254
255         if (s->rx_type == RX_NO_DATA)
256         {
257             s->mode = s->speech_decoder_state->prev_mode;
258         }
259         else {
260             s->speech_decoder_state->prev_mode = s->mode;
261         }
262
263         /* if homed: check if this frame is another homing frame */
264         if (s->reset_flag_old == 1)
265         {
266             /* only check until end of first subframe */
267             s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode);
268         }
269         /* produce encoder homing frame if homed & input=decoder homing frame */
270         if ((s->reset_flag != 0) && (s->reset_flag_old != 0))
271         {
272             for (i = 0; i < L_FRAME; i++)
273             {
274                 synth[i] = EHF_MASK;
275             }
276         }
277         else
278         {
279             /* decode frame */
280             Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth);
281         }
282
283         //Each AMR-frame results in 160 16-bit samples
284         *data_size+=160*2;
285         synth+=160;
286
287         /* if not homed: check whether current frame is a homing frame */
288         if (s->reset_flag_old == 0)
289         {
290             /* check whole frame */
291             s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode);
292         }
293         /* reset decoder if current frame is a homing frame */
294         if (s->reset_flag != 0)
295         {
296             Speech_Decode_Frame_reset(s->speech_decoder_state);
297         }
298         s->reset_flag_old = s->reset_flag;
299
300     }
301     return offset;
302 }
303
304
305 static int amr_nb_encode_frame(AVCodecContext *avctx,
306                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
307 {
308     short serial_data[250] = {0};
309
310     AMRContext *s = avctx->priv_data;
311     int written;
312
313     s->reset_flag = encoder_homing_frame_test(data);
314
315     Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode);
316
317     /* add frame type and mode */
318     sid_sync (s->sidstate, s->mode, &s->tx_frametype);
319
320     written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame);
321
322     if (s->reset_flag != 0)
323     {
324         Speech_Encode_Frame_reset(s->enstate);
325         sid_sync_reset(s->sidstate);
326     }
327     return written;
328 }
329
330
331 #elif defined(CONFIG_AMR_NB) /* Float point version*/
332
333 typedef struct AMRContext {
334     int frameCount;
335     void * decState;
336     int *enstate;
337     enum Mode enc_bitrate;
338 } AMRContext;
339
340 static int amr_nb_decode_init(AVCodecContext * avctx)
341 {
342     AMRContext *s = avctx->priv_data;
343     s->frameCount=0;
344     s->decState=Decoder_Interface_init();
345     if(!s->decState)
346     {
347         av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n");
348         return -1;
349     }
350     return 0;
351 }
352
353 static int amr_nb_encode_init(AVCodecContext * avctx)
354 {
355     AMRContext *s = avctx->priv_data;
356     s->frameCount=0;
357
358     if(avctx->sample_rate!=8000)
359     {
360         if(avctx->debug)
361         {
362             av_log(avctx, AV_LOG_DEBUG, "Only 8000Hz sample rate supported\n");
363         }
364         return -1;
365     }
366
367     if(avctx->channels!=1)
368     {
369         if(avctx->debug)
370         {
371             av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
372         }
373         return -1;
374     }
375
376     avctx->frame_size=160;
377     avctx->coded_frame= avcodec_alloc_frame();
378
379     s->enstate=Encoder_Interface_init(0);
380     if(!s->enstate)
381     {
382         if(avctx->debug)
383         {
384             av_log(avctx, AV_LOG_DEBUG, "Encoder_Interface_init error\n");
385         }
386         return -1;
387     }
388
389     s->enc_bitrate=getBitrateMode(avctx->bit_rate);
390
391     return 0;
392 }
393
394 static int amr_nb_decode_close(AVCodecContext * avctx)
395 {
396     AMRContext *s = avctx->priv_data;
397     Decoder_Interface_exit(s->decState);
398     return 0;
399 }
400
401 static int amr_nb_encode_close(AVCodecContext * avctx)
402 {
403     AMRContext *s = avctx->priv_data;
404     Encoder_Interface_exit(s->enstate);
405     av_freep(&avctx->coded_frame);
406     return 0;
407 }
408
409 static int amr_nb_decode_frame(AVCodecContext * avctx,
410             void *data, int *data_size,
411             uint8_t * buf, int buf_size)
412 {
413     AMRContext *s = (AMRContext*)avctx->priv_data;
414
415     uint8_t*amrData=buf;
416     static short block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
417     enum Mode dec_mode;
418     int packet_size;
419
420     /* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",buf,buf_size,s->frameCount); */
421
422     if(buf_size==0) {
423         /* nothing to do */
424         return 0;
425     }
426
427     dec_mode = (buf[0] >> 3) & 0x000F;
428     packet_size = block_size[dec_mode]+1;
429
430     if(packet_size > buf_size) {
431         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size);
432         return -1;
433     }
434
435     s->frameCount++;
436     /* av_log(NULL,AV_LOG_DEBUG,"packet_size=%d amrData= 0x%X %X %X %X\n",packet_size,amrData[0],amrData[1],amrData[2],amrData[3]); */
437     /* call decoder */
438     Decoder_Interface_Decode(s->decState, amrData, data, 0);
439     *data_size=160*2;
440
441     return packet_size;
442 }
443
444 static int amr_nb_encode_frame(AVCodecContext *avctx,
445                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
446 {
447     AMRContext *s = (AMRContext*)avctx->priv_data;
448     int written;
449
450     written = Encoder_Interface_Encode(s->enstate,
451         s->enc_bitrate,
452         data,
453         frame,
454         0);
455     /* av_log(NULL,AV_LOG_DEBUG,"amr_nb_encode_frame encoded %u bytes, bitrate %u, first byte was %#02x\n",written, s->enc_bitrate, frame[0] ); */
456
457     return written;
458 }
459
460 #endif
461
462 #if defined(CONFIG_AMR_NB) || defined(CONFIG_AMR_NB_FIXED)
463
464 AVCodec amr_nb_decoder =
465 {
466     "amr_nb",
467     CODEC_TYPE_AUDIO,
468     CODEC_ID_AMR_NB,
469     sizeof(AMRContext),
470     amr_nb_decode_init,
471     NULL,
472     amr_nb_decode_close,
473     amr_nb_decode_frame,
474 };
475
476 AVCodec amr_nb_encoder =
477 {
478     "amr_nb",
479     CODEC_TYPE_AUDIO,
480     CODEC_ID_AMR_NB,
481     sizeof(AMRContext),
482     amr_nb_encode_init,
483     amr_nb_encode_frame,
484     amr_nb_encode_close,
485     NULL,
486 };
487
488 #endif
489
490 /* -----------AMR wideband ------------*/
491 #ifdef CONFIG_AMR_WB
492
493 #ifdef _TYPEDEF_H
494 //To avoid duplicate typedefs from typdef in amr-nb
495 #define typedef_h
496 #endif
497
498 #include "amrwb_float/enc_if.h"
499 #include "amrwb_float/dec_if.h"
500
501 /* Common code for fixed and float version*/
502 typedef struct AMRWB_bitrates
503 {
504     int startrate;
505     int stoprate;
506     int mode;
507
508 } AMRWB_bitrates;
509
510 static int getWBBitrateMode(int bitrate)
511 {
512     /* Adjusted so that all bitrates can be used from commandline where
513        only a multiple of 1000 can be specified*/
514     AMRWB_bitrates rates[]={ {0,7999,0}, //6.6kHz
515                            {8000,9999,1},//8.85
516                            {10000,13000,2},//12.65
517                            {13001,14999,3},//14.25
518                            {15000,17000,4},//15.85
519                            {17001,18000,5},//18.25
520                            {18001,22000,6},//19.85
521                            {22001,23000,7},//23.05
522                            {23001,24000,8},//23.85
523
524                          };
525     int i;
526
527     for(i=0;i<9;i++)
528     {
529         if(rates[i].startrate<=bitrate && rates[i].stoprate>=bitrate)
530         {
531             return(rates[i].mode);
532         }
533     }
534     /*Return highest possible*/
535     return(8);
536 }
537
538
539 typedef struct AMRWBContext {
540     int frameCount;
541     void *state;
542     int mode;
543     Word16 allow_dtx;
544 } AMRWBContext;
545
546 static int amr_wb_encode_init(AVCodecContext * avctx)
547 {
548     AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
549     s->frameCount=0;
550
551     if(avctx->sample_rate!=16000)
552     {
553         if(avctx->debug)
554         {
555             av_log(avctx, AV_LOG_DEBUG, "Only 16000Hz sample rate supported\n");
556         }
557         return -1;
558     }
559
560     if(avctx->channels!=1)
561     {
562         if(avctx->debug)
563         {
564             av_log(avctx, AV_LOG_DEBUG, "Only mono supported\n");
565         }
566         return -1;
567     }
568
569     avctx->frame_size=320;
570     avctx->coded_frame= avcodec_alloc_frame();
571
572     s->state = E_IF_init();
573     s->mode=getWBBitrateMode(avctx->bit_rate);
574     s->allow_dtx=0;
575
576     return 0;
577 }
578
579 static int amr_wb_encode_close(AVCodecContext * avctx)
580 {
581     AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
582     E_IF_exit(s->state);
583     av_freep(&avctx->coded_frame);
584     s->frameCount++;
585     return 0;
586 }
587
588 static int amr_wb_encode_frame(AVCodecContext *avctx,
589                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
590 {
591     AMRWBContext *s = (AMRWBContext*) avctx->priv_data;
592     int size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx);
593     return size;
594 }
595
596 static int amr_wb_decode_init(AVCodecContext * avctx)
597 {
598     AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
599     s->frameCount=0;
600     s->state = D_IF_init();
601     return 0;
602 }
603
604 extern const UWord8 block_size[];
605
606 static int amr_wb_decode_frame(AVCodecContext * avctx,
607             void *data, int *data_size,
608             uint8_t * buf, int buf_size)
609 {
610     AMRWBContext *s = (AMRWBContext*)avctx->priv_data;
611
612     uint8_t*amrData=buf;
613     int mode;
614     int packet_size;
615
616     if(buf_size==0) {
617         /* nothing to do */
618         return 0;
619     }
620
621     mode = (amrData[0] >> 3) & 0x000F;
622     packet_size = block_size[mode];
623
624     if(packet_size > buf_size) {
625         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1);
626         return -1;
627     }
628
629     s->frameCount++;
630     D_IF_decode( s->state, amrData, data, _good_frame);
631     *data_size=320*2;
632     return packet_size;
633 }
634
635 static int amr_wb_decode_close(AVCodecContext * avctx)
636 {
637     AMRWBContext *s = (AMRWBContext *)avctx->priv_data;
638     D_IF_exit(s->state);
639     return 0;
640 }
641
642 AVCodec amr_wb_decoder =
643 {
644     "amr_wb",
645     CODEC_TYPE_AUDIO,
646     CODEC_ID_AMR_WB,
647     sizeof(AMRWBContext),
648     amr_wb_decode_init,
649     NULL,
650     amr_wb_decode_close,
651     amr_wb_decode_frame,
652 };
653
654 AVCodec amr_wb_encoder =
655 {
656     "amr_wb",
657     CODEC_TYPE_AUDIO,
658     CODEC_ID_AMR_WB,
659     sizeof(AMRWBContext),
660     amr_wb_encode_init,
661     amr_wb_encode_frame,
662     amr_wb_encode_close,
663     NULL,
664 };
665
666 #endif //CONFIG_AMR_WB