Mercurial > libavcodec.hg
annotate libgsm.c @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | 1c3bcb60bed4 |
children | e943e1409077 |
rev | line source |
---|---|
2729 | 1 /* |
2 * Interface to libgsm for gsm encoding/decoding | |
3 * Copyright (c) 2005 Alban Bedel <albeu@free.fr> | |
4551 | 4 * Copyright (c) 2006, 2007 Michel Bardiaux <mbardiaux@mediaxim.be> |
2729 | 5 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
2729 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
2729 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
2729 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3036
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2967
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2729 | 21 */ |
2967 | 22 |
2729 | 23 /** |
24 * @file libgsm.c | |
25 * Interface to libgsm for gsm encoding/decoding | |
26 */ | |
27 | |
4551 | 28 // The idiosyncrasies of GSM-in-WAV are explained at http://kbs.cs.tu-berlin.de/~jutta/toast.html |
29 | |
2729 | 30 #include "avcodec.h" |
31 #include <gsm.h> | |
32 | |
5408 | 33 // gsm.h misses some essential constants |
2729 | 34 #define GSM_BLOCK_SIZE 33 |
4551 | 35 #define GSM_MS_BLOCK_SIZE 65 |
2729 | 36 #define GSM_FRAME_SIZE 160 |
37 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5408
diff
changeset
|
38 static av_cold int libgsm_init(AVCodecContext *avctx) { |
6672
79984fdb1203
Allow bitrates zero and 13200 (needed for decoding mov and aiff)
mbardiaux
parents:
6517
diff
changeset
|
39 if (avctx->channels > 1) { |
79984fdb1203
Allow bitrates zero and 13200 (needed for decoding mov and aiff)
mbardiaux
parents:
6517
diff
changeset
|
40 av_log(avctx, AV_LOG_ERROR, "Mono required for GSM, got %d channels\n", |
79984fdb1203
Allow bitrates zero and 13200 (needed for decoding mov and aiff)
mbardiaux
parents:
6517
diff
changeset
|
41 avctx->channels); |
79984fdb1203
Allow bitrates zero and 13200 (needed for decoding mov and aiff)
mbardiaux
parents:
6517
diff
changeset
|
42 return -1; |
79984fdb1203
Allow bitrates zero and 13200 (needed for decoding mov and aiff)
mbardiaux
parents:
6517
diff
changeset
|
43 } |
6720 | 44 |
45 if(avctx->codec->decode){ | |
46 if(!avctx->channels) | |
47 avctx->channels= 1; | |
48 | |
49 if(!avctx->sample_rate) | |
50 avctx->sample_rate= 8000; | |
51 }else{ | |
6721 | 52 if (avctx->sample_rate != 8000) { |
53 av_log(avctx, AV_LOG_ERROR, "Sample rate 8000Hz required for GSM, got %dHz\n", | |
54 avctx->sample_rate); | |
55 if(avctx->strict_std_compliance > FF_COMPLIANCE_INOFFICIAL) | |
56 return -1; | |
57 } | |
58 if (avctx->bit_rate != 13000 /* Official */ && | |
59 avctx->bit_rate != 13200 /* Very common */ && | |
60 avctx->bit_rate != 0 /* Unknown; a.o. mov does not set bitrate when decoding */ ) { | |
61 av_log(avctx, AV_LOG_ERROR, "Bitrate 13000bps required for GSM, got %dbps\n", | |
62 avctx->bit_rate); | |
63 if(avctx->strict_std_compliance > FF_COMPLIANCE_INOFFICIAL) | |
64 return -1; | |
65 } | |
6720 | 66 } |
2729 | 67 |
4551 | 68 avctx->priv_data = gsm_create(); |
2729 | 69 |
4551 | 70 switch(avctx->codec_id) { |
71 case CODEC_ID_GSM: | |
72 avctx->frame_size = GSM_FRAME_SIZE; | |
73 avctx->block_align = GSM_BLOCK_SIZE; | |
74 break; | |
75 case CODEC_ID_GSM_MS: { | |
76 int one = 1; | |
77 gsm_option(avctx->priv_data, GSM_OPT_WAV49, &one); | |
78 avctx->frame_size = 2*GSM_FRAME_SIZE; | |
79 avctx->block_align = GSM_MS_BLOCK_SIZE; | |
80 } | |
81 } | |
2967 | 82 |
2729 | 83 avctx->coded_frame= avcodec_alloc_frame(); |
84 avctx->coded_frame->key_frame= 1; | |
2967 | 85 |
2729 | 86 return 0; |
87 } | |
88 | |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5408
diff
changeset
|
89 static av_cold int libgsm_close(AVCodecContext *avctx) { |
2729 | 90 gsm_destroy(avctx->priv_data); |
91 avctx->priv_data = NULL; | |
92 return 0; | |
93 } | |
94 | |
95 static int libgsm_encode_frame(AVCodecContext *avctx, | |
96 unsigned char *frame, int buf_size, void *data) { | |
97 // we need a full block | |
4551 | 98 if(buf_size < avctx->block_align) return 0; |
2729 | 99 |
4551 | 100 switch(avctx->codec_id) { |
101 case CODEC_ID_GSM: | |
102 gsm_encode(avctx->priv_data,data,frame); | |
103 break; | |
104 case CODEC_ID_GSM_MS: | |
105 gsm_encode(avctx->priv_data,data,frame); | |
106 gsm_encode(avctx->priv_data,((short*)data)+GSM_FRAME_SIZE,frame+32); | |
107 } | |
108 return avctx->block_align; | |
2729 | 109 } |
110 | |
111 | |
112 AVCodec libgsm_encoder = { | |
5102
4323e587708d
Give names of external library decoders/encoders a lib prefix
diego
parents:
4551
diff
changeset
|
113 "libgsm", |
2729 | 114 CODEC_TYPE_AUDIO, |
115 CODEC_ID_GSM, | |
116 0, | |
117 libgsm_init, | |
118 libgsm_encode_frame, | |
119 libgsm_close, | |
6717 | 120 .long_name = "libgsm GSM", |
2729 | 121 }; |
122 | |
4551 | 123 AVCodec libgsm_ms_encoder = { |
5102
4323e587708d
Give names of external library decoders/encoders a lib prefix
diego
parents:
4551
diff
changeset
|
124 "libgsm_ms", |
4551 | 125 CODEC_TYPE_AUDIO, |
126 CODEC_ID_GSM_MS, | |
127 0, | |
128 libgsm_init, | |
129 libgsm_encode_frame, | |
130 libgsm_close, | |
6717 | 131 .long_name = "libgsm GSM Microsoft variant", |
4551 | 132 }; |
133 | |
2729 | 134 static int libgsm_decode_frame(AVCodecContext *avctx, |
135 void *data, int *data_size, | |
136 uint8_t *buf, int buf_size) { | |
6673
679b9ef6f5f3
Make sure some value is always returned via data_size
mbardiaux
parents:
6672
diff
changeset
|
137 *data_size = 0; /* In case of error */ |
679b9ef6f5f3
Make sure some value is always returned via data_size
mbardiaux
parents:
6672
diff
changeset
|
138 if(buf_size < avctx->block_align) return -1; |
4551 | 139 switch(avctx->codec_id) { |
140 case CODEC_ID_GSM: | |
141 if(gsm_decode(avctx->priv_data,buf,data)) return -1; | |
142 *data_size = GSM_FRAME_SIZE*sizeof(int16_t); | |
143 break; | |
144 case CODEC_ID_GSM_MS: | |
145 if(gsm_decode(avctx->priv_data,buf,data) || | |
146 gsm_decode(avctx->priv_data,buf+33,((int16_t*)data)+GSM_FRAME_SIZE)) return -1; | |
147 *data_size = GSM_FRAME_SIZE*sizeof(int16_t)*2; | |
148 } | |
149 return avctx->block_align; | |
2729 | 150 } |
151 | |
152 AVCodec libgsm_decoder = { | |
5102
4323e587708d
Give names of external library decoders/encoders a lib prefix
diego
parents:
4551
diff
changeset
|
153 "libgsm", |
2729 | 154 CODEC_TYPE_AUDIO, |
155 CODEC_ID_GSM, | |
156 0, | |
157 libgsm_init, | |
158 NULL, | |
159 libgsm_close, | |
160 libgsm_decode_frame, | |
6717 | 161 .long_name = "libgsm GSM", |
2729 | 162 }; |
4551 | 163 |
164 AVCodec libgsm_ms_decoder = { | |
5102
4323e587708d
Give names of external library decoders/encoders a lib prefix
diego
parents:
4551
diff
changeset
|
165 "libgsm_ms", |
4551 | 166 CODEC_TYPE_AUDIO, |
167 CODEC_ID_GSM_MS, | |
168 0, | |
169 libgsm_init, | |
170 NULL, | |
171 libgsm_close, | |
172 libgsm_decode_frame, | |
6717 | 173 .long_name = "libgsm GSM Microsoft variant", |
4551 | 174 }; |