mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
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:
commit
4ea942f2ce
@ -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) {
|
/* flush the encoder */
|
||||||
printf("Write frame %3d (size=%5d)\n", i, pkt.size);
|
encode(c, NULL, &pkt, f);
|
||||||
fwrite(pkt.data, 1, pkt.size, f);
|
|
||||||
av_packet_unref(&pkt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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);
|
||||||
|
Loading…
Reference in New Issue
Block a user