diff options
author | Clément Bœsch <u@pkh.me> | 2017-04-03 21:12:15 +0200 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2017-04-03 21:14:16 +0200 |
commit | a434657de9dc1084b47cd484bc69cdb1b4057844 (patch) | |
tree | 22c7ecd579ae0cdefa2b0a11f2d2a1e748cb889a /doc/examples | |
parent | 54e195cf52b6b24cdb22bbd1ca9ecacaa6418b20 (diff) | |
parent | f27e262dbdea1991b22e08b639ac03e642a3482c (diff) | |
download | ffmpeg-streaming-a434657de9dc1084b47cd484bc69cdb1b4057844.zip ffmpeg-streaming-a434657de9dc1084b47cd484bc69cdb1b4057844.tar.gz |
Merge commit 'f27e262dbdea1991b22e08b639ac03e642a3482c'
* commit 'f27e262dbdea1991b22e08b639ac03e642a3482c':
examples/encode_audio: switch to the new audio encoding API
Merged-by: Clément Bœsch <u@pkh.me>
Diffstat (limited to 'doc/examples')
-rw-r--r-- | doc/examples/encode_audio.c | 69 |
1 files changed, 41 insertions, 28 deletions
diff --git a/doc/examples/encode_audio.c b/doc/examples/encode_audio.c index ba9ef6d..d1ef105 100644 --- a/doc/examples/encode_audio.c +++ b/doc/examples/encode_audio.c @@ -92,14 +92,42 @@ static int select_channel_layout(const AVCodec *codec) return best_ch_layout; } +static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, + FILE *output) +{ + int ret; + + /* send the frame for encoding */ + ret = avcodec_send_frame(ctx, frame); + if (ret < 0) { + fprintf(stderr, "Error sending the frame to the encoder\n"); + exit(1); + } + + /* read all the available output packets (in general there may be any + * number of them */ + while (ret >= 0) { + ret = avcodec_receive_packet(ctx, pkt); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + return; + else if (ret < 0) { + fprintf(stderr, "Error encoding audio frame\n"); + exit(1); + } + + fwrite(pkt->data, 1, pkt->size, output); + av_packet_unref(pkt); + } +} + int main(int argc, char **argv) { const char *filename; const AVCodec *codec; AVCodecContext *c= NULL; AVFrame *frame; - AVPacket pkt; - int i, j, k, ret, got_output; + AVPacket *pkt; + int i, j, k, ret; FILE *f; uint16_t *samples; float t, tincr; @@ -154,6 +182,13 @@ int main(int argc, char **argv) exit(1); } + /* packet for holding encoded output */ + pkt = av_packet_alloc(); + if (!pkt) { + fprintf(stderr, "could not allocate the packet\n"); + exit(1); + } + /* frame containing input raw audio */ frame = av_frame_alloc(); if (!frame) { @@ -176,10 +211,6 @@ int main(int argc, char **argv) t = 0; tincr = 2 * M_PI * 440.0 / c->sample_rate; for (i = 0; i < 200; i++) { - av_init_packet(&pkt); - pkt.data = NULL; // packet data will be allocated by the encoder - pkt.size = 0; - /* make sure the frame is writable -- makes a copy if the encoder * kept a reference internally */ ret = av_frame_make_writable(frame); @@ -194,34 +225,16 @@ int main(int argc, char **argv) samples[2*j + k] = samples[2*j]; t += tincr; } - /* encode the samples */ - ret = avcodec_encode_audio2(c, &pkt, frame, &got_output); - if (ret < 0) { - fprintf(stderr, "Error encoding audio frame\n"); - exit(1); - } - if (got_output) { - fwrite(pkt.data, 1, pkt.size, f); - av_packet_unref(&pkt); - } + encode(c, frame, pkt, f); } - /* get the delayed frames */ - for (got_output = 1; got_output; i++) { - ret = avcodec_encode_audio2(c, &pkt, NULL, &got_output); - if (ret < 0) { - fprintf(stderr, "Error encoding frame\n"); - exit(1); - } + /* flush the encoder */ + encode(c, NULL, pkt, f); - if (got_output) { - fwrite(pkt.data, 1, pkt.size, f); - av_packet_unref(&pkt); - } - } fclose(f); av_frame_free(&frame); + av_packet_free(&pkt); avcodec_free_context(&c); return 0; |