1
mirror of https://git.videolan.org/git/ffmpeg.git synced 2024-09-13 10:39:08 +02:00

Merge commit '3d66717f7cb5555257244be8f5bce172ed3af7ac'

* commit '3d66717f7cb5555257244be8f5bce172ed3af7ac':
  examples/decode_audio: use the new audio decoding API

Merged-by: Clément Bœsch <cboesch@gopro.com>
This commit is contained in:
Clément Bœsch 2017-04-04 11:33:04 +02:00
commit 3d12d10677

View File

@ -42,29 +42,34 @@
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame,
FILE *outfile)
{
int len, got_frame;
int i, ch;
int ret, data_size;
while (pkt->size > 0) {
len = avcodec_decode_audio4(dec_ctx, frame, &got_frame, pkt);
if (len < 0) {
fprintf(stderr, "Error while decoding\n");
/* send the packet with the compressed data to the decoder */
ret = avcodec_send_packet(dec_ctx, pkt);
if (ret < 0) {
fprintf(stderr, "Error submitting the packet to the decoder\n");
exit(1);
}
/* read all the output frames (in general there may be any number of them */
while (ret >= 0) {
ret = avcodec_receive_frame(dec_ctx, frame);
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
return;
else if (ret < 0) {
fprintf(stderr, "Error during decoding\n");
exit(1);
}
if (got_frame) {
int i, ch;
/* if a frame has been decoded, output it */
int data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);
if (data_size < 0) {
/* This should not occur, checking just for paranoia */
fprintf(stderr, "Failed to calculate data size\n");
exit(1);
}
for (i = 0; i < frame->nb_samples; i++)
for (ch = 0; ch < dec_ctx->channels; ch++)
fwrite(frame->data[ch] + data_size*i, 1, data_size, outfile);
data_size = av_get_bytes_per_sample(dec_ctx->sample_fmt);
if (data_size < 0) {
/* This should not occur, checking just for paranoia */
fprintf(stderr, "Failed to calculate data size\n");
exit(1);
}
pkt->size -= len;
pkt->data += len;
for (i = 0; i < frame->nb_samples; i++)
for (ch = 0; ch < dec_ctx->channels; ch++)
fwrite(frame->data[ch] + data_size*i, 1, data_size, outfile);
}
}