]> git.sesse.net Git - ffmpeg/blob - libavcodec/libamr.c
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
[ffmpeg] / 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             const uint8_t * buf, int buf_size)
447 {
448     AMRContext *s = avctx->priv_data;
449     const uint8_t*amrData=buf;
450     static const uint8_t block_size[16]={ 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0 };
451     enum Mode dec_mode;
452     int packet_size;
453
454     /* av_log(NULL,AV_LOG_DEBUG,"amr_decode_frame buf=%p buf_size=%d frameCount=%d!!\n",buf,buf_size,s->frameCount); */
455
456     dec_mode = (buf[0] >> 3) & 0x000F;
457     packet_size = block_size[dec_mode]+1;
458
459     if(packet_size > buf_size) {
460         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size);
461         return -1;
462     }
463
464     s->frameCount++;
465     /* 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]); */
466     /* call decoder */
467     Decoder_Interface_Decode(s->decState, amrData, data, 0);
468     *data_size=160*2;
469
470     return packet_size;
471 }
472
473 static int amr_nb_encode_frame(AVCodecContext *avctx,
474                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
475 {
476     AMRContext *s = avctx->priv_data;
477     int written;
478
479     if((s->enc_bitrate=getBitrateMode(avctx->bit_rate))<0)
480     {
481         av_log(avctx, AV_LOG_ERROR, nb_bitrate_unsupported);
482         return -1;
483     }
484
485     written = Encoder_Interface_Encode(s->enstate,
486         s->enc_bitrate,
487         data,
488         frame,
489         0);
490     /* 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] ); */
491
492     return written;
493 }
494
495 #endif
496
497 #if CONFIG_LIBAMR_NB || CONFIG_LIBAMR_NB_FIXED
498
499 AVCodec libamr_nb_decoder =
500 {
501     "libamr_nb",
502     CODEC_TYPE_AUDIO,
503     CODEC_ID_AMR_NB,
504     sizeof(AMRContext),
505     amr_nb_decode_init,
506     NULL,
507     amr_nb_decode_close,
508     amr_nb_decode_frame,
509     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"),
510 };
511
512 AVCodec libamr_nb_encoder =
513 {
514     "libamr_nb",
515     CODEC_TYPE_AUDIO,
516     CODEC_ID_AMR_NB,
517     sizeof(AMRContext),
518     amr_nb_encode_init,
519     amr_nb_encode_frame,
520     amr_nb_encode_close,
521     NULL,
522     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
523     .long_name = NULL_IF_CONFIG_SMALL("libamr-nb Adaptive Multi-Rate (AMR) Narrow-Band"),
524 };
525
526 #endif
527
528 /* -----------AMR wideband ------------*/
529 #if CONFIG_LIBAMR_WB
530
531 #ifdef _TYPEDEF_H
532 //To avoid duplicate typedefs from typedef in amr-nb
533 #define typedef_h
534 #endif
535
536 #include <amrwb/enc_if.h>
537 #include <amrwb/dec_if.h>
538 #include <amrwb/if_rom.h>
539
540 /* Common code for fixed and float version*/
541 typedef struct AMRWB_bitrates
542 {
543     int rate;
544     int mode;
545 } AMRWB_bitrates;
546
547 static int getWBBitrateMode(int bitrate)
548 {
549     /* make the correspondance between bitrate and mode */
550     AMRWB_bitrates rates[]={ {6600,0},
551                            {8850,1},
552                            {12650,2},
553                            {14250,3},
554                            {15850,4},
555                            {18250,5},
556                            {19850,6},
557                            {23050,7},
558                            {23850,8},
559                          };
560     int i;
561
562     for(i=0;i<9;i++)
563     {
564         if(rates[i].rate==bitrate)
565         {
566             return rates[i].mode;
567         }
568     }
569     /* no bitrate matching, return an error */
570     return -1;
571 }
572
573
574 typedef struct AMRWBContext {
575     int frameCount;
576     void *state;
577     int mode;
578     Word16 allow_dtx;
579 } AMRWBContext;
580
581 static int amr_wb_encode_init(AVCodecContext * avctx)
582 {
583     AMRWBContext *s = avctx->priv_data;
584
585     s->frameCount=0;
586
587     if(avctx->sample_rate!=16000)
588     {
589         av_log(avctx, AV_LOG_ERROR, "Only 16000Hz sample rate supported\n");
590         return -1;
591     }
592
593     if(avctx->channels!=1)
594     {
595         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
596         return -1;
597     }
598
599     if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
600     {
601         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
602         return -1;
603     }
604
605     avctx->frame_size=320;
606     avctx->coded_frame= avcodec_alloc_frame();
607
608     s->state = E_IF_init();
609     s->allow_dtx=0;
610
611     return 0;
612 }
613
614 static int amr_wb_encode_close(AVCodecContext * avctx)
615 {
616     AMRWBContext *s = avctx->priv_data;
617
618     E_IF_exit(s->state);
619     av_freep(&avctx->coded_frame);
620     s->frameCount++;
621     return 0;
622 }
623
624 static int amr_wb_encode_frame(AVCodecContext *avctx,
625                             unsigned char *frame/*out*/, int buf_size, void *data/*in*/)
626 {
627     AMRWBContext *s = avctx->priv_data;
628     int size;
629
630     if((s->mode=getWBBitrateMode(avctx->bit_rate))<0)
631     {
632         av_log(avctx, AV_LOG_ERROR, wb_bitrate_unsupported);
633         return -1;
634     }
635     size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx);
636     return size;
637 }
638
639 static int amr_wb_decode_init(AVCodecContext * avctx)
640 {
641     AMRWBContext *s = avctx->priv_data;
642
643     s->frameCount=0;
644     s->state = D_IF_init();
645
646     amr_decode_fix_avctx(avctx);
647
648     if(avctx->channels > 1)
649     {
650         av_log(avctx, AV_LOG_ERROR, "amr_wb: multichannel decoding not supported\n");
651         return -1;
652     }
653
654     return 0;
655 }
656
657 static int amr_wb_decode_frame(AVCodecContext * avctx,
658             void *data, int *data_size,
659             AVPacket *avpkt)
660 {
661     const uint8_t *buf = avpkt->data;
662     int buf_size = avpkt->size;
663     AMRWBContext *s = avctx->priv_data;
664     const uint8_t*amrData=buf;
665     int mode;
666     int packet_size;
667     static const uint8_t block_size[16] = {18, 23, 33, 37, 41, 47, 51, 59, 61, 6, 6, 0, 0, 0, 1, 1};
668
669     if(buf_size==0) {
670         /* nothing to do */
671         return 0;
672     }
673
674     mode = (amrData[0] >> 3) & 0x000F;
675     packet_size = block_size[mode];
676
677     if(packet_size > buf_size) {
678         av_log(avctx, AV_LOG_ERROR, "amr frame too short (%u, should be %u)\n", buf_size, packet_size+1);
679         return -1;
680     }
681
682     s->frameCount++;
683     D_IF_decode( s->state, amrData, data, _good_frame);
684     *data_size=320*2;
685     return packet_size;
686 }
687
688 static int amr_wb_decode_close(AVCodecContext * avctx)
689 {
690     AMRWBContext *s = avctx->priv_data;
691
692     D_IF_exit(s->state);
693     return 0;
694 }
695
696 AVCodec libamr_wb_decoder =
697 {
698     "libamr_wb",
699     CODEC_TYPE_AUDIO,
700     CODEC_ID_AMR_WB,
701     sizeof(AMRWBContext),
702     amr_wb_decode_init,
703     NULL,
704     amr_wb_decode_close,
705     amr_wb_decode_frame,
706     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
707 };
708
709 AVCodec libamr_wb_encoder =
710 {
711     "libamr_wb",
712     CODEC_TYPE_AUDIO,
713     CODEC_ID_AMR_WB,
714     sizeof(AMRWBContext),
715     amr_wb_encode_init,
716     amr_wb_encode_frame,
717     amr_wb_encode_close,
718     NULL,
719     .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
720     .long_name = NULL_IF_CONFIG_SMALL("libamr-wb Adaptive Multi-Rate (AMR) Wide-Band"),
721 };
722
723 #endif //CONFIG_LIBAMR_WB