OSDN Git Service

Merge commit '5f102a9559099429826e84758b8b5182244c52db'
authorClément Bœsch <cboesch@gopro.com>
Tue, 4 Apr 2017 09:44:45 +0000 (11:44 +0200)
committerClément Bœsch <cboesch@gopro.com>
Tue, 4 Apr 2017 09:44:45 +0000 (11:44 +0200)
* commit '5f102a9559099429826e84758b8b5182244c52db':
  examples/encode_video: switch to the new encoding API

Merged-by: Clément Bœsch <cboesch@gopro.com>
1  2 
doc/examples/encode_video.c

  #include <stdlib.h>
  #include <string.h>
  
 -#include "libavcodec/avcodec.h"
 +#include <libavcodec/avcodec.h>
  
 -#include "libavutil/frame.h"
 -#include "libavutil/imgutils.h"
 +#include <libavutil/opt.h>
 +#include <libavutil/imgutils.h>
  
 -        fprintf(stderr, "error sending a frame for encoding\n");
+ static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt,
+                    FILE *outfile)
+ {
+     int ret;
+     /* send the frame to the encoder */
+     ret = avcodec_send_frame(enc_ctx, frame);
+     if (ret < 0) {
 -            fprintf(stderr, "error during encoding\n");
++        fprintf(stderr, "Error sending a frame for encoding\n");
+         exit(1);
+     }
+     while (ret >= 0) {
+         ret = avcodec_receive_packet(enc_ctx, pkt);
+         if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
+             return;
+         else if (ret < 0) {
 -        printf("encoded frame %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
++            fprintf(stderr, "Error during encoding\n");
+             exit(1);
+         }
++        printf("Write frame %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size);
+         fwrite(pkt->data, 1, pkt->size, outfile);
+         av_packet_unref(pkt);
+     }
+ }
  int main(int argc, char **argv)
  {
 -    const char *filename;
 +    const char *filename, *codec_name;
      const AVCodec *codec;
      AVCodecContext *c= NULL;
-     int i, ret, x, y, got_output;
+     int i, ret, x, y;
      FILE *f;
 -    AVFrame *picture;
 +    AVFrame *frame;
      AVPacket pkt;
      uint8_t endcode[] = { 0, 0, 1, 0xb7 };
  
              }
          }
  
 -        picture->pts = i;
 +        frame->pts = i;
  
          /* encode the image */
-         ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
-         if (ret < 0) {
-             fprintf(stderr, "Error encoding frame\n");
-             exit(1);
-         }
-         if (got_output) {
-             printf("Write frame %3d (size=%5d)\n", i, pkt.size);
-             fwrite(pkt.data, 1, pkt.size, f);
-             av_packet_unref(&pkt);
-         }
 -        encode(c, picture, &pkt, f);
++        encode(c, frame, &pkt, f);
      }
  
-     /* get the delayed frames */
-     for (got_output = 1; got_output; i++) {
-         fflush(stdout);
-         ret = avcodec_encode_video2(c, &pkt, NULL, &got_output);
-         if (ret < 0) {
-             fprintf(stderr, "Error encoding frame\n");
-             exit(1);
-         }
-         if (got_output) {
-             printf("Write frame %3d (size=%5d)\n", i, pkt.size);
-             fwrite(pkt.data, 1, pkt.size, f);
-             av_packet_unref(&pkt);
-         }
-     }
+     /* flush the encoder */
+     encode(c, NULL, &pkt, f);
  
      /* add sequence end code to have a real MPEG file */
      fwrite(endcode, 1, sizeof(endcode), f);