|
|
|
@ -35,22 +35,13 @@ |
|
|
|
|
#define GSM_MS_BLOCK_SIZE 65 |
|
|
|
|
#define GSM_FRAME_SIZE 160 |
|
|
|
|
|
|
|
|
|
static av_cold int libgsm_init(AVCodecContext *avctx) { |
|
|
|
|
static av_cold int libgsm_encode_init(AVCodecContext *avctx) { |
|
|
|
|
if (avctx->channels > 1) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Mono required for GSM, got %d channels\n", |
|
|
|
|
avctx->channels); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(avctx->codec->decode){ |
|
|
|
|
if(!avctx->channels) |
|
|
|
|
avctx->channels= 1; |
|
|
|
|
|
|
|
|
|
if(!avctx->sample_rate) |
|
|
|
|
avctx->sample_rate= 8000; |
|
|
|
|
|
|
|
|
|
avctx->sample_fmt = AV_SAMPLE_FMT_S16; |
|
|
|
|
}else{ |
|
|
|
|
if (avctx->sample_rate != 8000) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Sample rate 8000Hz required for GSM, got %dHz\n", |
|
|
|
|
avctx->sample_rate); |
|
|
|
@ -65,7 +56,6 @@ static av_cold int libgsm_init(AVCodecContext *avctx) { |
|
|
|
|
if(avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avctx->priv_data = gsm_create(); |
|
|
|
|
|
|
|
|
@ -88,7 +78,7 @@ static av_cold int libgsm_init(AVCodecContext *avctx) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int libgsm_close(AVCodecContext *avctx) { |
|
|
|
|
static av_cold int libgsm_encode_close(AVCodecContext *avctx) { |
|
|
|
|
av_freep(&avctx->coded_frame); |
|
|
|
|
gsm_destroy(avctx->priv_data); |
|
|
|
|
avctx->priv_data = NULL; |
|
|
|
@ -116,9 +106,9 @@ AVCodec ff_libgsm_encoder = { |
|
|
|
|
.name = "libgsm", |
|
|
|
|
.type = AVMEDIA_TYPE_AUDIO, |
|
|
|
|
.id = CODEC_ID_GSM, |
|
|
|
|
.init = libgsm_init, |
|
|
|
|
.init = libgsm_encode_init, |
|
|
|
|
.encode = libgsm_encode_frame, |
|
|
|
|
.close = libgsm_close, |
|
|
|
|
.close = libgsm_encode_close, |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"), |
|
|
|
|
}; |
|
|
|
@ -127,13 +117,52 @@ AVCodec ff_libgsm_ms_encoder = { |
|
|
|
|
.name = "libgsm_ms", |
|
|
|
|
.type = AVMEDIA_TYPE_AUDIO, |
|
|
|
|
.id = CODEC_ID_GSM_MS, |
|
|
|
|
.init = libgsm_init, |
|
|
|
|
.init = libgsm_encode_init, |
|
|
|
|
.encode = libgsm_encode_frame, |
|
|
|
|
.close = libgsm_close, |
|
|
|
|
.close = libgsm_encode_close, |
|
|
|
|
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static av_cold int libgsm_decode_init(AVCodecContext *avctx) { |
|
|
|
|
if (avctx->channels > 1) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Mono required for GSM, got %d channels\n", |
|
|
|
|
avctx->channels); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!avctx->channels) |
|
|
|
|
avctx->channels = 1; |
|
|
|
|
|
|
|
|
|
if (!avctx->sample_rate) |
|
|
|
|
avctx->sample_rate = 8000; |
|
|
|
|
|
|
|
|
|
avctx->sample_fmt = AV_SAMPLE_FMT_S16; |
|
|
|
|
|
|
|
|
|
avctx->priv_data = gsm_create(); |
|
|
|
|
|
|
|
|
|
switch(avctx->codec_id) { |
|
|
|
|
case CODEC_ID_GSM: |
|
|
|
|
avctx->frame_size = GSM_FRAME_SIZE; |
|
|
|
|
avctx->block_align = GSM_BLOCK_SIZE; |
|
|
|
|
break; |
|
|
|
|
case CODEC_ID_GSM_MS: { |
|
|
|
|
int one = 1; |
|
|
|
|
gsm_option(avctx->priv_data, GSM_OPT_WAV49, &one); |
|
|
|
|
avctx->frame_size = 2 * GSM_FRAME_SIZE; |
|
|
|
|
avctx->block_align = GSM_MS_BLOCK_SIZE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static av_cold int libgsm_decode_close(AVCodecContext *avctx) { |
|
|
|
|
gsm_destroy(avctx->priv_data); |
|
|
|
|
avctx->priv_data = NULL; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int libgsm_decode_frame(AVCodecContext *avctx, |
|
|
|
|
void *data, int *data_size, |
|
|
|
|
AVPacket *avpkt) { |
|
|
|
@ -158,8 +187,8 @@ AVCodec ff_libgsm_decoder = { |
|
|
|
|
.name = "libgsm", |
|
|
|
|
.type = AVMEDIA_TYPE_AUDIO, |
|
|
|
|
.id = CODEC_ID_GSM, |
|
|
|
|
.init = libgsm_init, |
|
|
|
|
.close = libgsm_close, |
|
|
|
|
.init = libgsm_decode_init, |
|
|
|
|
.close = libgsm_decode_close, |
|
|
|
|
.decode = libgsm_decode_frame, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM"), |
|
|
|
|
}; |
|
|
|
@ -168,8 +197,8 @@ AVCodec ff_libgsm_ms_decoder = { |
|
|
|
|
.name = "libgsm_ms", |
|
|
|
|
.type = AVMEDIA_TYPE_AUDIO, |
|
|
|
|
.id = CODEC_ID_GSM_MS, |
|
|
|
|
.init = libgsm_init, |
|
|
|
|
.close = libgsm_close, |
|
|
|
|
.init = libgsm_decode_init, |
|
|
|
|
.close = libgsm_decode_close, |
|
|
|
|
.decode = libgsm_decode_frame, |
|
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("libgsm GSM Microsoft variant"), |
|
|
|
|
}; |
|
|
|
|