examples/encode_audio: use the AVFrame API for allocating the data
authorAnton Khirnov <anton@khirnov.net>
Wed, 19 Oct 2016 19:21:08 +0000 (21:21 +0200)
committerAnton Khirnov <anton@khirnov.net>
Wed, 2 Nov 2016 09:12:39 +0000 (10:12 +0100)
It is simpler and more efficient.

doc/examples/encode_audio.c

index a8e0cd0..db2440f 100644 (file)
@@ -97,7 +97,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;
@@ -159,21 +158,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);
-    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);
     }
 
@@ -185,6 +173,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);
 
@@ -205,7 +200,6 @@ int main(int argc, char **argv)
     }
     fclose(f);
 
-    av_freep(&samples);
     av_frame_free(&frame);
     avcodec_free_context(&c);
 }