e487a737f1debd2418c763ada62ba426f3517a6a
[ffmpeg.git] / libavcodec / libamr.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  /** @file
23  * Adaptive Multi-Rate (AMR) Audio decoder stub.
24  *
25  * This code implements both an AMR-NarrowBand (AMR-NB) and an AMR-WideBand
26  * (AMR-WB) audio encoder/decoder through external reference code from
27  * http://www.3gpp.org/. The license of the code from 3gpp is unclear so you
28  * have to download the code separately. Two versions exists: One fixed-point
29  * and one floating-point. For some reason the float encoder is significantly
30  * faster at least on a P4 1.5GHz (0.9s instead of 9.9s on a 30s audio clip
31  * at MR102). Both float and fixed point are supported for AMR-NB, but only
32  * float for AMR-WB.
33  *
34  * \section AMR-NB
35  *
36  * \subsection Float
37  * The float version (default) can be downloaded from:
38  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-610.zip
39  *
40  * \subsection Fixed-point
41  * The fixed-point (TS26.073) can be downloaded from:
42  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.073/26073-600.zip
43  *
44  * \subsection Specification
45  * The specification for AMR-NB can be found in TS 26.071
46  * (http://www.3gpp.org/ftp/Specs/html-info/26071.htm) and some other
47  * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm.
48  *
49  * \section AMR-WB
50  *
51  * \subsection Float
52  * The reference code can be downloaded from:
53  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-600.zip
54  *
55  * \subsection Fixed-point
56  * If someone wants to use the fixed point version it can be downloaded from:
57  * http://www.3gpp.org/ftp/Specs/archive/26_series/26.173/26173-571.zip.
58  *
59  * \subsection Specification
60  * The specification for AMR-WB can be found in TS 26.171
61  * (http://www.3gpp.org/ftp/Specs/html-info/26171.htm) and some other
62  * info at http://www.3gpp.org/ftp/Specs/html-info/26-series.htm.
63  *
64  */
65
66 #include "avcodec.h"
67
68 #if CONFIG_LIBAMR_NB_FIXED
69
70 #define MMS_IO
71
72 #include "amr/sp_dec.h"
73 #include "amr/d_homing.h"
74 #include "amr/typedef.h"
75 #include "amr/sp_enc.h"
76 #include "amr/sid_sync.h"
77 #include "amr/e_homing.h"
78
79 #else
80 #include <amrnb/interf_dec.h>
81 #include <amrnb/interf_enc.h>
82 #endif
83
84 static const char nb_bitrate_unsupported[] =
85     "bitrate not supported: use one of 4.75k, 5.15k, 5.9k, 6.7k, 7.4k, 7.95k, 10.2k or 12.2k\n";
86 static const char wb_bitrate_unsupported[] =
87     "bitrate not supported: use one of 6.6k, 8.85k, 12.65k, 14.25k, 15.85k, 18.25k, 19.85k, 23.05k, or 23.85k\n";
88
89 /* Common code for fixed and float version*/
90 typedef struct AMR_bitrates
91 {
92     int rate;
93     enum Mode mode;
94 } AMR_bitrates;
95
96 /* Match desired bitrate */
97 static int getBitrateMode(int bitrate)
98 {
99     /* make the correspondance between bitrate and mode */
100     AMR_bitrates rates[]={ {4750,MR475},
101                            {5150,MR515},
102                            {5900,MR59},
103                            {6700,MR67},
104                            {7400,MR74},
105                            {7950,MR795},
106                            {10200,MR102},
107                            {12200,MR122},
108                          };
109     int i;
110
111     for(i=0;i<8;i++)
112     {
113         if(rates[i].rate==bitrate)
114         {
115             return rates[i].mode;
116         }
117     }
118     /* no bitrate matching, return an error */
119     return -1;
120 }
121
122 static void amr_decode_fix_avctx(AVCodecContext * avctx)
123 {
124     const int is_amr_wb = 1 + (avctx->codec_id == CODEC_ID_AMR_WB);
125
126     if(avctx->sample_rate == 0)
127     {
128         avctx->sample_rate = 8000 * is_amr_wb;
129     }
130
131     if(avctx->channels == 0)
132     {
133         avctx->channels = 1;
134     }
135
136     avctx->frame_size = 160 * is_amr_wb;
137     avctx->sample_fmt = SAMPLE_FMT_S16;
138 }
139
140 #if CONFIG_LIBAMR_NB_FIXED
141 /* fixed point version*/
142 /* frame size in serial bitstream file (frame type + serial stream + flags) */
143 #define SERIAL_FRAMESIZE (1+MAX_SERIAL_SIZE+5)
144
145 typedef struct AMRContext {
146     int frameCount;
147     Speech_Decode_FrameState *speech_decoder_state;
148     enum RXFrameType rx_type;
149     enum Mode mode;
150     Word16 reset_flag;
151     Word16 reset_flag_old;
152
153     int enc_bitrate;
154     Speech_Encode_FrameState *enstate;
155     sid_syncState *sidstate;
156     enum TXFrameType tx_frametype;
157 } AMRContext;
158
159 static av_cold int amr_nb_decode_init(AVCodecContext * avctx)
160 {
161     AMRContext *s = avctx->priv_data;
162
163     s->frameCount=0;
164     s->speech_decoder_state=NULL;
165     s->rx_type = (enum RXFrameType)0;
166     s->mode= (enum Mode)0;
167     s->reset_flag=0;
168     s->reset_flag_old=1;
169
170     if(Speech_Decode_Frame_init(&s->speech_decoder_state, "Decoder"))
171     {
172         av_log(avctx, AV_LOG_ERROR, "Speech_Decode_Frame_init error\n");
173         return -1;
174     }
175
176     amr_decode_fix_avctx(avctx);
177
178     if(avctx->channels > 1)
179     {
180         av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n");
181         return -1;
182     }
183
184     return 0;
185 }
186
187 static av_cold int amr_nb_encode_init(AVCodecContext * avctx)
188 {
189     AMRContext *s = avctx->priv_data;
190
191     s->frameCount=0;
192     s->speech_decoder_state=NULL;
193     s->rx_type = (enum RXFrameType)0;
194     s->mode= (enum Mode)0;
195     s->reset_flag=0;
196     s->reset_flag_old=1;
197
198     if(avctx->sample_rate!=8000)
199     {
200         av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
201         return -1;
202     }
203
204     if(avctx->channels!=1)
205     {
206         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
207         return -1;
208     }
209
210     avctx->frame_size=160;
211     avctx->coded_frame= avcodec_alloc_frame();
212
213     if(Speech_Encode_Frame_init(&s->enstate, 0, "encoder") || sid_sync_init (&s->sidstate))
214     {
215         av_log(avctx, AV_LOG_ERROR, "Speech_Encode_Frame_init error\n");
216         return -1;
217     }
218
219     if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
220     {
221         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
222         return -1;
223     }
224
225     return 0;
226 }
227
228 static av_cold int amr_nb_encode_close(AVCodecContext * avctx)
229 {
230     AMRContext *s = avctx->priv_data;
231
232     Speech_Encode_Frame_exit(&s->enstate);
233     sid_sync_exit (&s->sidstate);
234     av_freep(&avctx->coded_frame);
235     return 0;
236 }
237
238 static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
239 {
240     AMRContext *s = avctx->priv_data;
241
242     Speech_Decode_Frame_exit(&s->speech_decoder_state);
243     return 0;
244 }
245
246 static int amr_nb_decode_frame(AVCodecContext * avctx,
247             void *data, int *data_size,
248             AVPacket *avpkt)
249 {
250     const uint8_t *buf = avpkt->data;
251     int buf_size = avpkt->size;
252     AMRContext *s = avctx->priv_data;
253     const uint8_t*amrData=buf;
254     int offset=0;
255     UWord8 toc, q, ft;
256     Word16 serial[SERIAL_FRAMESIZE];   /* coded bits */
257     Word16 *synth;
258     UWord8 *packed_bits;
259     static Word16 packed_size[16] = {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
260     int i;
261
262     //printf("amr_decode_frame data_size=%i buf=0x%X buf_size=%d frameCount=%d!!\n",*data_size,buf,buf_size,s->frameCount);
263
264     synth=data;
265
266     toc=amrData[offset];
267     /* read rest of the frame based on ToC byte */
268     q  = (toc >> 2) & 0x01;
269     ft = (toc >> 3) & 0x0F;
270
271     //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]);
272
273     offset++;
274
275     packed_bits=amrData+offset;
276
277     offset+=packed_size[ft];
278
279     //Unsort and unpack bits
280     s->rx_type = UnpackBits(q, ft, packed_bits, &s->mode, &serial[1]);
281
282     //We have a new frame
283     s->frameCount++;
284
285     if (s->rx_type == RX_NO_DATA)
286     {
287         s->mode = s->speech_decoder_state->prev_mode;
288     }
289     else {
290         s->speech_decoder_state->prev_mode = s->mode;
291     }
292
293     /* if homed: check if this frame is another homing frame */
294     if (s->reset_flag_old == 1)
295     {
296         /* only check until end of first subframe */
297         s->reset_flag = decoder_homing_frame_test_first(&serial[1], s->mode);
298     }
299     /* produce encoder homing frame if homed & input=decoder homing frame */
300     if ((s->reset_flag != 0) && (s->reset_flag_old != 0))
301     {
302         for (i = 0; i < L_FRAME; i++)
303         {
304             synth[i] = EHF_MASK;
305         }
306     }
307     else
308     {
309         /* decode frame */
310         Speech_Decode_Frame(s->speech_decoder_state, s->mode, &serial[1], s->rx_type, synth);
311     }
312
313     //Each AMR-frame results in 160 16-bit samples
314     *data_size=160*2;
315
316     /* if not homed: check whether current frame is a homing frame */
317     if (s->reset_flag_old == 0)
318     {
319         /* check whole frame */
320         s->reset_flag = decoder_homing_frame_test(&serial[1], s->mode);
321     }
322     /* reset decoder if current frame is a homing frame */
323     if (s->reset_flag != 0)
324     {
325         Speech_Decode_Frame_reset(s->speech_decoder_state);
326     }
327     s->reset_flag_old = s->reset_flag;
328
329     return offset;
330 }
331
332
333 static int amr_nb_encode_frame(AVCodecContext *avctx,
334                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
335 {
336     short serial_data[250] = {0};
337     AMRContext *s = avctx->priv_data;
338     int written;
339
340     s->reset_flag = encoder_homing_frame_test(data);
341
342     Speech_Encode_Frame(s->enstate, s->enc_bitrate, data, &serial_data[1], &s->mode);
343
344     /* add frame type and mode */
345     sid_sync (s->sidstate, s->mode, &s->tx_frametype);
346
347     written = PackBits(s->mode, s->enc_bitrate, s->tx_frametype, &serial_data[1], frame);
348
349     if (s->reset_flag != 0)
350     {
351         Speech_Encode_Frame_reset(s->enstate);
352         sid_sync_reset(s->sidstate);
353     }
354     return written;
355 }
356
357
358 #elif CONFIG_LIBAMR_NB /* Float point version*/
359
360 typedef struct AMRContext {
361     int frameCount;
362     void * decState;
363     int *enstate;
364     int enc_bitrate;
365 } AMRContext;
366
367 static av_cold int amr_nb_decode_init(AVCodecContext * avctx)
368 {
369     AMRContext *s = avctx->priv_data;
370
371     s->frameCount=0;
372     s->decState=Decoder_Interface_init();
373     if(!s->decState)
374     {
375         av_log(avctx, AV_LOG_ERROR, "Decoder_Interface_init error\r\n");
376         return -1;
377     }
378
379     amr_decode_fix_avctx(avctx);
380
381     if(avctx->channels > 1)
382     {
383         av_log(avctx, AV_LOG_ERROR, "amr_nb: multichannel decoding not supported\n");
384         return -1;
385     }
386
387     return 0;
388 }
389
390 static av_cold int amr_nb_encode_init(AVCodecContext * avctx)
391 {
392     AMRContext *s = avctx->priv_data;
393
394     s->frameCount=0;
395
396     if(avctx->sample_rate!=8000)
397     {
398         av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
399         return -1;
400     }
401
402     if(avctx->channels!=1)
403     {
404         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
405         return -1;
406     }
407
408     avctx->frame_size=160;
409     avctx->coded_frame= avcodec_alloc_frame();
410
411     s->enstate=Encoder_Interface_init(0);
412     if(!s->enstate)
413     {
414         av_log(avctx, AV_LOG_ERROR, "Encoder_Interface_init error\n");
415         return -1;
416     }
417
418     if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
419     {
420         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
421         return -1;
422     }
423
424     return 0;
425 }
426
427 static av_cold int amr_nb_decode_close(AVCodecContext * avctx)
428 {
429     AMRContext *s = avctx->priv_data;
430
431     Decoder_Interface_exit(s->decState);
432     return 0;
433 }
434
435 static av_cold int amr_nb_encode_close(AVCodecContext * avctx)
436 {
437     AMRContext *s = avctx->priv_data;
438
439     Encoder_Interface_exit(s->enstate);
440     av_freep(&avctx->coded_frame);
441     return 0;
442 }
443
444 static int amr_nb_decode_frame(AVCodecContext * avctx,
445             void *data, int *data_size,
446             AVPacket *avpkt)
447 {
448     const uint8_t *buf = avpkt->data;
449     int buf_size = avpkt->size;
450     AMRContext *s = avctx->priv_data;
451     const uint8_t*amrData=buf;
452     static const uint8_t block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
453     enum Mode dec_mode;
454     int packet_size;
455
456     /* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",buf,buf_size,s->frameCount); */
457
458     dec_mode = (buf[0] >> 3) & 0x000F;
459     packet_size = block_size[dec_mode]+1;
460
461     if(packet_size > buf_size) {
462         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size);
463         return -1;
464     }
465
466     s->frameCount++;
467     /* 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]); */
468     /* call decoder */
469     Decoder_Interface_Decode(s->decState, amrData, data, 0);
470     *data_size=160*2;
471
472     return packet_size;
473 }
474
475 static int amr_nb_encode_frame(AVCodecContext *avctx,
476                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
477 {
478     AMRContext *s = avctx->priv_data;
479     int written;
480
481     if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
482     {
483         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
484         return -1;
485     }
486
487     written = Encoder_Interface_Encode(s->enstate,
488         s->enc_bitrate,
489         data,
490         frame,
491         0);
492     /* 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] ); */
493
494     return written;
495 }
496
497 #endif
498
499 #if CONFIG_LIBAMR_NB || CONFIG_LIBAMR_NB_FIXED
500
501 AVCodec libamr_nb_decoder =
502 {
503     "libamr_nb",
504     CODEC_TYPE_AUDIO,
505     CODEC_ID_AMR_NB,
506     sizeof(AMRContext),
507     amr_nb_decode_init,
508     NULL,
509     amr_nb_decode_close,
510     amr_nb_decode_frame,
511     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"),
512 };
513
514 AVCodec libamr_nb_encoder =
515 {
516     "libamr_nb",
517     CODEC_TYPE_AUDIO,
518     CODEC_ID_AMR_NB,
519     sizeof(AMRContext),
520     amr_nb_encode_init,
521     amr_nb_encode_frame,
522     amr_nb_encode_close,
523     NULL,
524     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
525     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"),
526 };
527
528 #endif
529
530 /* -----------AMR wideband ------------*/
531 #if CONFIG_LIBAMR_WB
532
533 #ifdef _TYPEDEF_H
534 //To avoid duplicate typedefs from typedef in amr-nb
535 #define typedef_h
536 #endif
537
538 #include <amrwb/enc_if.h>
539 #include <amrwb/dec_if.h>
540 #include <amrwb/if_rom.h>
541
542 /* Common code for fixed and float version*/
543 typedef struct AMRWB_bitrates
544 {
545     int rate;
546     int mode;
547 } AMRWB_bitrates;
548
549 static int getWBBitrateMode(int bitrate)
550 {
551     /* make the correspondance between bitrate and mode */
552     AMRWB_bitrates rates[]={ {6600,0},
553                            {8850,1},
554                            {12650,2},
555                            {14250,3},
556                            {15850,4},
557                            {18250,5},
558                            {19850,6},
559                            {23050,7},
560                            {23850,8},
561                          };
562     int i;
563
564     for(i=0;i<9;i++)
565     {
566         if(rates[i].rate==bitrate)
567         {
568             return rates[i].mode;
569         }
570     }
571     /* no bitrate matching, return an error */
572     return -1;
573 }
574
575
576 typedef struct AMRWBContext {
577     int frameCount;
578     void *state;
579     int mode;
580     Word16 allow_dtx;
581 } AMRWBContext;
582
583 static int amr_wb_encode_init(AVCodecContext * avctx)
584 {
585     AMRWBContext *s = avctx->priv_data;
586
587     s->frameCount=0;
588
589     if(avctx->sample_rate!=16000)
590     {
591         av_log(avctx, AV_LOG_ERROR, "Only 16000Hz sample rate supported\n");
592         return -1;
593     }
594
595     if(avctx->channels!=1)
596     {
597         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
598         return -1;
599     }
600
601     if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
602     {
603         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
604         return -1;
605     }
606
607     avctx->frame_size=320;
608     avctx->coded_frame= avcodec_alloc_frame();
609
610     s->state = E_IF_init();
611     s->allow_dtx=0;
612
613     return 0;
614 }
615
616 static int amr_wb_encode_close(AVCodecContext * avctx)
617 {
618     AMRWBContext *s = avctx->priv_data;
619
620     E_IF_exit(s->state);
621     av_freep(&avctx->coded_frame);
622     s->frameCount++;
623     return 0;
624 }
625
626 static int amr_wb_encode_frame(AVCodecContext *avctx,
627                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
628 {
629     AMRWBContext *s = avctx->priv_data;
630     int size;
631
632     if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
633     {
634         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
635         return -1;
636     }
637     size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx);
638     return size;
639 }
640
641 static int amr_wb_decode_init(AVCodecContext * avctx)
642 {
643     AMRWBContext *s = avctx->priv_data;
644
645     s->frameCount=0;
646     s->state = D_IF_init();
647
648     amr_decode_fix_avctx(avctx);
649
650     if(avctx->channels > 1)
651     {
652         av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n");
653         return -1;
654     }
655
656     return 0;
657 }
658
659 static int amr_wb_decode_frame(AVCodecContext * avctx,
660             void *data, int *data_size,
661             AVPacket *avpkt)
662 {
663     const uint8_t *buf = avpkt->data;
664     int buf_size = avpkt->size;
665     AMRWBContext *s = avctx->priv_data;
666     const uint8_t*amrData=buf;
667     int mode;
668     int packet_size;
669     static const uint8_t block_size[16] = {18, 23, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
670
671     if(buf_size==0) {
672         /* nothing to do */
673         return 0;
674     }
675
676     mode = (amrData[0] >> 3) & 0x000F;
677     packet_size = block_size[mode];
678
679     if(packet_size > buf_size) {
680         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1);
681         return -1;
682     }
683
684     s->frameCount++;
685     D_IF_decode( s->state, amrData, data, _good_frame);
686     *data_size=320*2;
687     return packet_size;
688 }
689
690 static int amr_wb_decode_close(AVCodecContext * avctx)
691 {
692     AMRWBContext *s = avctx->priv_data;
693
694     D_IF_exit(s->state);
695     return 0;
696 }
697
698 AVCodec libamr_wb_decoder =
699 {
700     "libamr_wb",
701     CODEC_TYPE_AUDIO,
702     CODEC_ID_AMR_WB,
703     sizeof(AMRWBContext),
704     amr_wb_decode_init,
705     NULL,
706     amr_wb_decode_close,
707     amr_wb_decode_frame,
708     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
709 };
710
711 AVCodec libamr_wb_encoder =
712 {
713     "libamr_wb",
714     CODEC_TYPE_AUDIO,
715     CODEC_ID_AMR_WB,
716     sizeof(AMRWBContext),
717     amr_wb_encode_init,
718     amr_wb_encode_frame,
719     amr_wb_encode_close,
720     NULL,
721     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
722     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
723 };
724
725 #endif //CONFIG_LIBAMR_WB