|
|
|
@@ -36,12 +36,39 @@ |
|
|
|
#include <libavutil/opt.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) |
|
|
|
{ |
|
|
|
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 *frame; |
|
|
|
AVPacket pkt; |
|
|
|
@@ -150,35 +177,11 @@ int main(int argc, char **argv) |
|
|
|
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, 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); |
|
|
|
|