annotate amr.c @ 2497:69adfbbdcdeb libavcodec

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