X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibvo-amrwbenc.c;h=650245646233e4849181515bd9faa1d5ec77cd2b;hb=015da965a68bdb48819dc98317888fc84eced599;hp=0d6dbd421a25c0550e4c2982d28cd219c1fa5b29;hpb=ec6402b7c595c3ceed6d1b8c1b75c6aa8336e052;p=ffmpeg diff --git a/libavcodec/libvo-amrwbenc.c b/libavcodec/libvo-amrwbenc.c index 0d6dbd421a2..65024564623 100644 --- a/libavcodec/libvo-amrwbenc.c +++ b/libavcodec/libvo-amrwbenc.c @@ -20,10 +20,17 @@ */ #include +#include +#include -#include "avcodec.h" #include "libavutil/avstring.h" +#include "libavutil/internal.h" +#include "libavutil/mem.h" #include "libavutil/opt.h" +#include "avcodec.h" +#include "internal.h" + +#define MAX_PACKET_SIZE (1 + (477 + 7) / 8) typedef struct AMRWBContext { AVClass *av_class; @@ -34,7 +41,7 @@ typedef struct AMRWBContext { } AMRWBContext; static const AVOption options[] = { - { "dtx", "Allow DTX (generate comfort noise)", offsetof(AMRWBContext, allow_dtx), FF_OPT_TYPE_INT, { 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, + { "dtx", "Allow DTX (generate comfort noise)", offsetof(AMRWBContext, allow_dtx), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM }, { NULL } }; @@ -86,7 +93,12 @@ static av_cold int amr_wb_encode_init(AVCodecContext *avctx) s->last_bitrate = avctx->bit_rate; avctx->frame_size = 320; + avctx->delay = 80; +#if FF_API_OLD_ENCODE_AUDIO avctx->coded_frame = avcodec_alloc_frame(); + if (!avctx->coded_frame) + return AVERROR(ENOMEM); +#endif s->state = E_IF_init(); @@ -102,32 +114,47 @@ static int amr_wb_encode_close(AVCodecContext *avctx) return 0; } -static int amr_wb_encode_frame(AVCodecContext *avctx, - unsigned char *frame/*out*/, - int buf_size, void *data/*in*/) +static int amr_wb_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, + const AVFrame *frame, int *got_packet_ptr) { AMRWBContext *s = avctx->priv_data; - int size; + const int16_t *samples = (const int16_t *)frame->data[0]; + int size, ret; + + if ((ret = ff_alloc_packet(avpkt, MAX_PACKET_SIZE))) { + av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n"); + return ret; + } if (s->last_bitrate != avctx->bit_rate) { s->mode = get_wb_bitrate_mode(avctx->bit_rate, avctx); s->last_bitrate = avctx->bit_rate; } - size = E_IF_encode(s->state, s->mode, data, frame, s->allow_dtx); - return size; + size = E_IF_encode(s->state, s->mode, samples, avpkt->data, s->allow_dtx); + if (size <= 0 || size > MAX_PACKET_SIZE) { + av_log(avctx, AV_LOG_ERROR, "Error encoding frame\n"); + return AVERROR(EINVAL); + } + + if (frame->pts != AV_NOPTS_VALUE) + avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay); + + avpkt->size = size; + *got_packet_ptr = 1; + return 0; } AVCodec ff_libvo_amrwbenc_encoder = { .name = "libvo_amrwbenc", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_AMR_WB, + .id = AV_CODEC_ID_AMR_WB, .priv_data_size = sizeof(AMRWBContext), .init = amr_wb_encode_init, - .encode = amr_wb_encode_frame, + .encode2 = amr_wb_encode_frame, .close = amr_wb_encode_close, - .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE}, - .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn Adaptive Multi-Rate " - "(AMR) Wide-Band"), - .priv_class = &class, + .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16, + AV_SAMPLE_FMT_NONE }, + .long_name = NULL_IF_CONFIG_SMALL("Android VisualOn AMR-WB " + "(Adaptive Multi-Rate Wide-Band)"), + .priv_class = &class, }; -