ffmpeg | branch: master | Clément Bœsch <u...@pkh.me> | Wed Mar 29 13:31:44 2017 +0200| [780cc080d85656429ba97426f35c7bc1f7f201bb] | committer: Clément Bœsch
Merge commit 'f76698e759a08e8d3b629c06edb0439f474e7fee' * commit 'f76698e759a08e8d3b629c06edb0439f474e7fee': examples/encode_audio: use the AVFrame API for allocating the data Merged-by: Clément Bœsch <u...@pkh.me> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=780cc080d85656429ba97426f35c7bc1f7f201bb --- doc/examples/encode_audio.c | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/doc/examples/encode_audio.c b/doc/examples/encode_audio.c index b788775..f3bb102 100644 --- a/doc/examples/encode_audio.c +++ b/doc/examples/encode_audio.c @@ -99,7 +99,6 @@ int main(int argc, char **argv) AVFrame *frame; AVPacket pkt; int i, j, k, ret, got_output; - int buffer_size; FILE *f; uint16_t *samples; float t, tincr; @@ -165,25 +164,10 @@ int main(int argc, char **argv) frame->format = c->sample_fmt; frame->channel_layout = c->channel_layout; - /* the codec gives us the frame size, in samples, - * we calculate the size of the samples buffer in bytes */ - buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size, - c->sample_fmt, 0); - if (buffer_size < 0) { - fprintf(stderr, "Could not get sample buffer size\n"); - exit(1); - } - samples = av_malloc(buffer_size); - if (!samples) { - fprintf(stderr, "Could not allocate %d bytes for samples buffer\n", - buffer_size); - exit(1); - } - /* setup the data pointers in the AVFrame */ - ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, - (const uint8_t*)samples, buffer_size, 0); + /* allocate the data buffers */ + ret = av_frame_get_buffer(frame, 0); if (ret < 0) { - fprintf(stderr, "Could not setup audio frame\n"); + fprintf(stderr, "Could not allocate audio data buffers\n"); exit(1); } @@ -195,6 +179,13 @@ int main(int argc, char **argv) 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); + if (ret < 0) + exit(1); + samples = (uint16_t*)frame->data[0]; + for (j = 0; j < c->frame_size; j++) { samples[2*j] = (int)(sin(t) * 10000); @@ -229,7 +220,6 @@ int main(int argc, char **argv) } fclose(f); - av_freep(&samples); av_frame_free(&frame); avcodec_free_context(&c); } ====================================================================== diff --cc doc/examples/encode_audio.c index b788775,db2440f..f3bb102 --- a/doc/examples/encode_audio.c +++ b/doc/examples/encode_audio.c @@@ -165,25 -158,10 +164,10 @@@ int main(int argc, char **argv frame->format = c->sample_fmt; frame->channel_layout = c->channel_layout; - /* the codec gives us the frame size, in samples, - * we calculate the size of the samples buffer in bytes */ - buffer_size = av_samples_get_buffer_size(NULL, c->channels, c->frame_size, - c->sample_fmt, 0); - if (buffer_size < 0) { - fprintf(stderr, "Could not get sample buffer size\n"); - exit(1); - } - samples = av_malloc(buffer_size); - if (!samples) { - fprintf(stderr, "Could not allocate %d bytes for samples buffer\n", - buffer_size); - exit(1); - } - /* setup the data pointers in the AVFrame */ - ret = avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, - (const uint8_t*)samples, buffer_size, 0); + /* allocate the data buffers */ + ret = av_frame_get_buffer(frame, 0); if (ret < 0) { - fprintf(stderr, "Could not setup audio frame\n"); - fprintf(stderr, "could not allocate audio data buffers\n"); ++ fprintf(stderr, "Could not allocate audio data buffers\n"); exit(1); } @@@ -213,23 -198,8 +204,22 @@@ av_packet_unref(&pkt); } } + + /* 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); + } + + if (got_output) { + fwrite(pkt.data, 1, pkt.size, f); + av_packet_unref(&pkt); + } + } fclose(f); - av_freep(&samples); av_frame_free(&frame); avcodec_free_context(&c); } _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog