diff options
Diffstat (limited to 'libavcodec/libgsm.c')
-rw-r--r-- | libavcodec/libgsm.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/libavcodec/libgsm.c b/libavcodec/libgsm.c index 1a2145581a..8a5ad0024f 100644 --- a/libavcodec/libgsm.c +++ b/libavcodec/libgsm.c @@ -30,10 +30,13 @@ #include <gsm/gsm.h> #include "avcodec.h" +#include "internal.h" #include "gsm.h" static av_cold int libgsm_encode_close(AVCodecContext *avctx) { +#if FF_API_OLD_ENCODE_AUDIO av_freep(&avctx->coded_frame); +#endif gsm_destroy(avctx->priv_data); avctx->priv_data = NULL; return 0; @@ -78,9 +81,11 @@ static av_cold int libgsm_encode_init(AVCodecContext *avctx) { } } +#if FF_API_OLD_ENCODE_AUDIO avctx->coded_frame= avcodec_alloc_frame(); if (!avctx->coded_frame) goto error; +#endif return 0; error: @@ -88,20 +93,29 @@ error: return -1; } -static int libgsm_encode_frame(AVCodecContext *avctx, - unsigned char *frame, int buf_size, void *data) { - // we need a full block - if(buf_size < avctx->block_align) return 0; +static int libgsm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr) +{ + int ret; + gsm_signal *samples = (gsm_signal *)frame->data[0]; + struct gsm_state *state = avctx->priv_data; + + if ((ret = ff_alloc_packet(avpkt, avctx->block_align))) { + av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); + return ret; + } switch(avctx->codec_id) { case CODEC_ID_GSM: - gsm_encode(avctx->priv_data,data,frame); + gsm_encode(state, samples, avpkt->data); break; case CODEC_ID_GSM_MS: - gsm_encode(avctx->priv_data,data,frame); - gsm_encode(avctx->priv_data,((short*)data)+GSM_FRAME_SIZE,frame+32); + gsm_encode(state, samples, avpkt->data); + gsm_encode(state, samples + GSM_FRAME_SIZE, avpkt->data + 32); } - return avctx->block_align; + + *got_packet_ptr = 1; + return 0; } @@ -110,7 +124,7 @@ AVCodec ff_libgsm_encoder = { .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_GSM, .init = libgsm_encode_init, - .encode = libgsm_encode_frame, + .encode2 = libgsm_encode_frame, .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"), @@ -121,7 +135,7 @@ AVCodec ff_libgsm_ms_encoder = { .type = AVMEDIA_TYPE_AUDIO, .id = CODEC_ID_GSM_MS, .init = libgsm_encode_init, - .encode = libgsm_encode_frame, + .encode2 = libgsm_encode_frame, .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"), |