Commit 0bafe049 authored by Justin Ruggles's avatar Justin Ruggles

api-example: update to use avcodec_decode_audio4()

parent f199f385
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "libavcodec/avcodec.h" #include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"
#define INBUF_SIZE 4096 #define INBUF_SIZE 4096
#define AUDIO_INBUF_SIZE 20480 #define AUDIO_INBUF_SIZE 20480
...@@ -118,11 +119,11 @@ static void audio_decode_example(const char *outfilename, const char *filename) ...@@ -118,11 +119,11 @@ static void audio_decode_example(const char *outfilename, const char *filename)
{ {
AVCodec *codec; AVCodec *codec;
AVCodecContext *c= NULL; AVCodecContext *c= NULL;
int out_size, len; int len;
FILE *f, *outfile; FILE *f, *outfile;
uint8_t *outbuf;
uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
AVPacket avpkt; AVPacket avpkt;
AVFrame *decoded_frame = NULL;
av_init_packet(&avpkt); av_init_packet(&avpkt);
...@@ -143,8 +144,6 @@ static void audio_decode_example(const char *outfilename, const char *filename) ...@@ -143,8 +144,6 @@ static void audio_decode_example(const char *outfilename, const char *filename)
exit(1); exit(1);
} }
outbuf = malloc(AVCODEC_MAX_AUDIO_FRAME_SIZE);
f = fopen(filename, "rb"); f = fopen(filename, "rb");
if (!f) { if (!f) {
fprintf(stderr, "could not open %s\n", filename); fprintf(stderr, "could not open %s\n", filename);
...@@ -161,15 +160,27 @@ static void audio_decode_example(const char *outfilename, const char *filename) ...@@ -161,15 +160,27 @@ static void audio_decode_example(const char *outfilename, const char *filename)
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f); avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
while (avpkt.size > 0) { while (avpkt.size > 0) {
out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; int got_frame = 0;
len = avcodec_decode_audio3(c, (short *)outbuf, &out_size, &avpkt);
if (!decoded_frame) {
if (!(decoded_frame = avcodec_alloc_frame())) {
fprintf(stderr, "out of memory\n");
exit(1);
}
} else
avcodec_get_frame_defaults(decoded_frame);
len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
if (len < 0) { if (len < 0) {
fprintf(stderr, "Error while decoding\n"); fprintf(stderr, "Error while decoding\n");
exit(1); exit(1);
} }
if (out_size > 0) { if (got_frame) {
/* if a frame has been decoded, output it */ /* if a frame has been decoded, output it */
fwrite(outbuf, 1, out_size, outfile); int data_size = av_samples_get_buffer_size(NULL, c->channels,
decoded_frame->nb_samples,
c->sample_fmt, 1);
fwrite(decoded_frame->data[0], 1, data_size, outfile);
} }
avpkt.size -= len; avpkt.size -= len;
avpkt.data += len; avpkt.data += len;
...@@ -189,10 +200,10 @@ static void audio_decode_example(const char *outfilename, const char *filename) ...@@ -189,10 +200,10 @@ static void audio_decode_example(const char *outfilename, const char *filename)
fclose(outfile); fclose(outfile);
fclose(f); fclose(f);
free(outbuf);
avcodec_close(c); avcodec_close(c);
av_free(c); av_free(c);
av_free(decoded_frame);
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment