#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
-#undef exit
-
/* 5 seconds stream duration */
#define STREAM_DURATION 5.0
#define STREAM_FRAME_RATE 25 /* 25 images/s */
{
AVCodecContext *c;
AVPacket pkt = { 0 }; // data and size must be 0;
- AVFrame *frame = avcodec_alloc_frame();
+ AVFrame *frame = av_frame_alloc();
int got_packet;
av_init_packet(&pkt);
/* video output */
static AVFrame *picture, *tmp_picture;
-static uint8_t *video_outbuf;
-static int frame_count, video_outbuf_size;
+static int frame_count;
/* Add a video output stream. */
static AVStream *add_video_stream(AVFormatContext *oc, enum AVCodecID codec_id)
uint8_t *picture_buf;
int size;
- picture = avcodec_alloc_frame();
+ picture = av_frame_alloc();
if (!picture)
return NULL;
size = avpicture_get_size(pix_fmt, width, height);
exit(1);
}
- video_outbuf = NULL;
- if (!(oc->oformat->flags & AVFMT_RAWPICTURE)) {
- /* Allocate output buffer. */
- /* XXX: API change will be done. */
- /* Buffers passed into lav* can be allocated any way you prefer,
- * as long as they're aligned enough for the architecture, and
- * they're freed appropriately (such as using av_free for buffers
- * allocated with av_malloc). */
- video_outbuf_size = 200000;
- video_outbuf = av_malloc(video_outbuf_size);
- }
-
/* Allocate the encoded raw picture. */
picture = alloc_picture(c->pix_fmt, c->width, c->height);
if (!picture) {
static void write_video_frame(AVFormatContext *oc, AVStream *st)
{
- int out_size, ret;
+ int ret;
AVCodecContext *c;
static struct SwsContext *img_convert_ctx;
ret = av_interleaved_write_frame(oc, &pkt);
} else {
+ AVPacket pkt = { 0 };
+ int got_packet;
+ av_init_packet(&pkt);
+
/* encode the image */
- out_size = avcodec_encode_video(c, video_outbuf,
- video_outbuf_size, picture);
+ ret = avcodec_encode_video2(c, &pkt, picture, &got_packet);
/* If size is zero, it means the image was buffered. */
- if (out_size > 0) {
- AVPacket pkt;
- av_init_packet(&pkt);
-
- if (c->coded_frame->pts != AV_NOPTS_VALUE)
- pkt.pts = av_rescale_q(c->coded_frame->pts,
+ if (!ret && got_packet && pkt.size) {
+ if (pkt.pts != AV_NOPTS_VALUE) {
+ pkt.pts = av_rescale_q(pkt.pts,
+ c->time_base, st->time_base);
+ }
+ if (pkt.dts != AV_NOPTS_VALUE) {
+ pkt.dts = av_rescale_q(pkt.dts,
c->time_base, st->time_base);
- if (c->coded_frame->key_frame)
- pkt.flags |= AV_PKT_FLAG_KEY;
+ }
pkt.stream_index = st->index;
- pkt.data = video_outbuf;
- pkt.size = out_size;
/* Write the compressed frame to the media file. */
ret = av_interleaved_write_frame(oc, &pkt);
av_free(tmp_picture->data[0]);
av_free(tmp_picture);
}
- av_free(video_outbuf);
}
/**************************************************************/