void write_audio_frame(AVFormatContext *oc, AVStream *st)
{
- int out_size;
AVCodecContext *c;
-
-
+ AVPacket pkt;
+ av_init_packet(&pkt);
+
c = &st->codec;
get_audio_frame(samples, audio_input_frame_size, c->channels);
- out_size = avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, samples);
+ pkt.size= avcodec_encode_audio(c, audio_outbuf, audio_outbuf_size, samples);
+
+ pkt.pts= c->coded_frame->pts;
+ pkt.flags |= PKT_FLAG_KEY;
+ pkt.stream_index= st->index;
+ pkt.data= audio_outbuf;
/* write the compressed frame in the media file */
- if (av_write_frame(oc, st->index, audio_outbuf, out_size) != 0) {
+ if (av_write_frame(oc, &pkt) != 0) {
fprintf(stderr, "Error while writing audio frame\n");
exit(1);
}
c->width = 352;
c->height = 288;
/* frames per second */
- c->frame_rate = STREAM_FRAME_RATE;
- c->frame_rate_base = 1;
+ c->time_base.den = STREAM_FRAME_RATE;
+ c->time_base.num = 1;
c->gop_size = 12; /* emit one intra frame every twelve frames at most */
if (c->codec_id == CODEC_ID_MPEG2VIDEO) {
/* just for testing, we also add B frames */
if (oc->oformat->flags & AVFMT_RAWPICTURE) {
/* raw video case. The API will change slightly in the near
futur for that */
- ret = av_write_frame(oc, st->index,
- (uint8_t *)picture_ptr, sizeof(AVPicture));
+ AVPacket pkt;
+ av_init_packet(&pkt);
+
+ pkt.flags |= PKT_FLAG_KEY;
+ pkt.stream_index= st->index;
+ pkt.data= (uint8_t *)picture_ptr;
+ pkt.size= sizeof(AVPicture);
+
+ ret = av_write_frame(oc, &pkt);
} else {
/* encode the image */
out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture_ptr);
/* if zero size, it means the image was buffered */
if (out_size != 0) {
+ AVPacket pkt;
+ av_init_packet(&pkt);
+
+ pkt.pts= c->coded_frame->pts;
+ if(c->coded_frame->key_frame)
+ pkt.flags |= PKT_FLAG_KEY;
+ pkt.stream_index= st->index;
+ pkt.data= video_outbuf;
+ pkt.size= out_size;
+
/* write the compressed frame in the media file */
- /* XXX: in case of B frames, the pts is not yet valid */
- ret = av_write_frame(oc, st->index, video_outbuf, out_size);
+ ret = av_write_frame(oc, &pkt);
} else {
ret = 0;
}
for(;;) {
/* compute current audio and video time */
if (audio_st)
- audio_pts = (double)audio_st->pts.val * oc->pts_num / oc->pts_den;
+ audio_pts = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
else
audio_pts = 0.0;
if (video_st)
- video_pts = (double)video_st->pts.val * oc->pts_num / oc->pts_den;
+ video_pts = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
else
video_pts = 0.0;