diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-12 12:13:05 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-25 14:38:08 -0400 |
commit | 8febd6afbca652b331ddd8e75e356656c153cad1 (patch) | |
tree | eeba73524ebd405a4323a2c0234b3c3cf7d9a857 | |
parent | d853e571ad5e7e12c6a68cfde390daced7d85fbb (diff) | |
download | ffmpeg-8febd6afbca652b331ddd8e75e356656c153cad1.tar.gz |
libgsm: split init and close fuctions for encoder and decoder.
The decoder shouldn't be allocating coded_frame. It's also cleaner to split
them than to check avctx->codec->encode and avctx->codec->decode.
-rw-r--r-- | libavcodec/libgsm.c | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c index 8115d28d77..afbeba106f 100644 --- a/libavcodec/libgsm.c +++ b/libavcodec/libgsm.c @@ -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"), }; |