Merge commit '5f102a9559099429826e84758b8b5182244c52db'

* commit '5f102a9559099429826e84758b8b5182244c52db':
  examples/encode_video: switch to the new encoding API

Merged-by: Clément Bœsch <cboesch@gopro.com>
This commit is contained in:
Clément Bœsch 2017-04-04 11:44:45 +02:00
commit 4ea942f2ce

View File

@ -36,12 +36,39 @@
#include <libavutil/opt.h> #include <libavutil/opt.h>
#include <libavutil/imgutils.h> #include <libavutil/imgutils.h>
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 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) {
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) int main(int argc, char **argv)
{ {
const char *filename, *codec_name; const char *filename, *codec_name;
const AVCodec *codec; const AVCodec *codec;
AVCodecContext *c= NULL; AVCodecContext *c= NULL;
int i, ret, x, y, got_output; int i, ret, x, y;
FILE *f; FILE *f;
AVFrame *frame; AVFrame *frame;
AVPacket pkt; AVPacket pkt;
@ -150,35 +177,11 @@ int main(int argc, char **argv)
frame->pts = i; frame->pts = i;
/* encode the image */ /* encode the image */
ret = avcodec_encode_video2(c, &pkt, frame, &got_output); encode(c, frame, &pkt, f);
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);
}
} }
/* get the delayed frames */ /* flush the encoder */
for (got_output = 1; got_output; i++) { encode(c, NULL, &pkt, f);
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);
}
}
/* add sequence end code to have a real MPEG file */ /* add sequence end code to have a real MPEG file */
fwrite(endcode, 1, sizeof(endcode), f); fwrite(endcode, 1, sizeof(endcode), f);