75
#if FF_API_OLD_ENCODE_AUDIO
72
76
avctx->coded_frame= avcodec_alloc_frame();
73
avctx->coded_frame->key_frame= 1;
77
if (!avctx->coded_frame) {
78
gsm_destroy(avctx->priv_data);
79
return AVERROR(ENOMEM);
78
86
static av_cold int libgsm_encode_close(AVCodecContext *avctx) {
87
#if FF_API_OLD_ENCODE_AUDIO
79
88
av_freep(&avctx->coded_frame);
80
90
gsm_destroy(avctx->priv_data);
81
91
avctx->priv_data = NULL;
85
static int libgsm_encode_frame(AVCodecContext *avctx,
86
unsigned char *frame, int buf_size, void *data) {
87
// we need a full block
88
if(buf_size < avctx->block_align) return 0;
95
static int libgsm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
96
const AVFrame *frame, int *got_packet_ptr)
99
gsm_signal *samples = (gsm_signal *)frame->data[0];
100
struct gsm_state *state = avctx->priv_data;
102
if ((ret = ff_alloc_packet(avpkt, avctx->block_align))) {
103
av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
90
107
switch(avctx->codec_id) {
92
gsm_encode(avctx->priv_data,data,frame);
108
case AV_CODEC_ID_GSM:
109
gsm_encode(state, samples, avpkt->data);
95
gsm_encode(avctx->priv_data,data,frame);
96
gsm_encode(avctx->priv_data,((short*)data)+GSM_FRAME_SIZE,frame+32);
111
case AV_CODEC_ID_GSM_MS:
112
gsm_encode(state, samples, avpkt->data);
113
gsm_encode(state, samples + GSM_FRAME_SIZE, avpkt->data + 32);
98
return avctx->block_align;
102
121
AVCodec ff_libgsm_encoder = {
103
122
.name = "libgsm",
104
123
.type = AVMEDIA_TYPE_AUDIO,
124
.id = AV_CODEC_ID_GSM,
106
125
.init = libgsm_encode_init,
107
.encode = libgsm_encode_frame,
126
.encode2 = libgsm_encode_frame,
108
127
.close = libgsm_encode_close,
109
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
110
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"),
128
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
129
AV_SAMPLE_FMT_NONE },
130
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"),
113
133
AVCodec ff_libgsm_ms_encoder = {
114
134
.name = "libgsm_ms",
115
135
.type = AVMEDIA_TYPE_AUDIO,
116
.id = CODEC_ID_GSM_MS,
136
.id = AV_CODEC_ID_GSM_MS,
117
137
.init = libgsm_encode_init,
118
.encode = libgsm_encode_frame,
138
.encode2 = libgsm_encode_frame,
119
139
.close = libgsm_encode_close,
120
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
121
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"),
140
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
141
AV_SAMPLE_FMT_NONE },
142
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"),
124
145
typedef struct LibGSMDecodeContext {
129
150
static av_cold int libgsm_decode_init(AVCodecContext *avctx) {
130
151
LibGSMDecodeContext *s = avctx->priv_data;
132
if (avctx->channels > 1) {
133
av_log(avctx, AV_LOG_ERROR, "Mono required for GSM, got %d channels\n",
138
if (!avctx->channels)
141
if (!avctx->sample_rate)
142
avctx->sample_rate = 8000;
144
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
154
avctx->channel_layout = AV_CH_LAYOUT_MONO;
155
avctx->sample_rate = 8000;
156
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
146
158
s->state = gsm_create();
148
160
switch(avctx->codec_id) {
161
case AV_CODEC_ID_GSM:
150
162
avctx->frame_size = GSM_FRAME_SIZE;
151
163
avctx->block_align = GSM_BLOCK_SIZE;
153
case CODEC_ID_GSM_MS: {
165
case AV_CODEC_ID_GSM_MS: {
155
167
gsm_option(s->state, GSM_OPT_WAV49, &one);
156
168
avctx->frame_size = 2 * GSM_FRAME_SIZE;
214
226
gsm_destroy(s->state);
215
227
s->state = gsm_create();
216
if (avctx->codec_id == CODEC_ID_GSM_MS)
228
if (avctx->codec_id == AV_CODEC_ID_GSM_MS)
217
229
gsm_option(s->state, GSM_OPT_WAV49, &one);
220
232
AVCodec ff_libgsm_decoder = {
221
233
.name = "libgsm",
222
234
.type = AVMEDIA_TYPE_AUDIO,
235
.id = AV_CODEC_ID_GSM,
224
236
.priv_data_size = sizeof(LibGSMDecodeContext),
225
237
.init = libgsm_decode_init,
226
238
.close = libgsm_decode_close,
227
239
.decode = libgsm_decode_frame,
228
240
.flush = libgsm_flush,
229
241
.capabilities = CODEC_CAP_DR1,
230
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"),
242
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"),
233
245
AVCodec ff_libgsm_ms_decoder = {
234
246
.name = "libgsm_ms",
235
247
.type = AVMEDIA_TYPE_AUDIO,
236
.id = CODEC_ID_GSM_MS,
248
.id = AV_CODEC_ID_GSM_MS,
237
249
.priv_data_size = sizeof(LibGSMDecodeContext),
238
250
.init = libgsm_decode_init,
239
251
.close = libgsm_decode_close,
240
252
.decode = libgsm_decode_frame,
241
253
.flush = libgsm_flush,
242
254
.capabilities = CODEC_CAP_DR1,
243
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"),
255
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"),