[FFmpeg-cvslog] Merge commit 'f76698e759a08e8d3b629c06edb0439f474e7fee'

Clément Bœsch git at videolan.org
Wed Mar 29 14:32:37 EEST 2017


ffmpeg | branch: master | Clément Bœsch <u at 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 at 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);
  }



More information about the ffmpeg-cvslog mailing list