Mercurial > libavformat.hg
comparison avienc.c @ 479:d84d9d8bb0a4 libavformat
pass timestamps correctly for -sync 0
use zero sized frames in avi to handle duplicate frames
author | michael |
---|---|
date | Tue, 15 Jun 2004 13:49:12 +0000 |
parents | ea38edda3c13 |
children | cfcca046161a |
comparison
equal
deleted
inserted
replaced
478:ac85aafd0971 | 479:d84d9d8bb0a4 |
---|---|
41 typedef struct { | 41 typedef struct { |
42 offset_t riff_start, movi_list, odml_list; | 42 offset_t riff_start, movi_list, odml_list; |
43 offset_t frames_hdr_all, frames_hdr_strm[MAX_STREAMS]; | 43 offset_t frames_hdr_all, frames_hdr_strm[MAX_STREAMS]; |
44 int audio_strm_length[MAX_STREAMS]; | 44 int audio_strm_length[MAX_STREAMS]; |
45 int riff_id; | 45 int riff_id; |
46 int packet_count[MAX_STREAMS]; | |
46 | 47 |
47 AVIIndex indexes[MAX_STREAMS]; | 48 AVIIndex indexes[MAX_STREAMS]; |
48 } AVIContext; | 49 } AVIContext; |
49 | 50 |
50 static inline AVIIentry* avi_get_ientry(AVIIndex* idx, int ent_id) | 51 static inline AVIIentry* avi_get_ientry(AVIIndex* idx, int ent_id) |
380 put_le16(pb, 0); /* language */ | 381 put_le16(pb, 0); /* language */ |
381 put_le32(pb, 0); /* initial frame */ | 382 put_le32(pb, 0); /* initial frame */ |
382 | 383 |
383 put_le32(pb, stream->frame_rate_base); /* scale */ | 384 put_le32(pb, stream->frame_rate_base); /* scale */ |
384 put_le32(pb, stream->frame_rate); /* rate */ | 385 put_le32(pb, stream->frame_rate); /* rate */ |
386 av_set_pts_info(s->streams[i], 64, stream->frame_rate_base, stream->frame_rate); | |
385 | 387 |
386 put_le32(pb, 0); /* start */ | 388 put_le32(pb, 0); /* start */ |
387 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */ | 389 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */ |
388 put_le32(pb, nb_frames); /* length, XXX: fill later */ | 390 put_le32(pb, nb_frames); /* length, XXX: fill later */ |
389 put_le32(pb, 1024 * 1024); /* suggested buffer size */ | 391 put_le32(pb, 1024 * 1024); /* suggested buffer size */ |
402 put_le16(pb, 0); /* language */ | 404 put_le16(pb, 0); /* language */ |
403 put_le32(pb, 0); /* initial frame */ | 405 put_le32(pb, 0); /* initial frame */ |
404 parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale); | 406 parse_specific_params(stream, &au_byterate, &au_ssize, &au_scale); |
405 put_le32(pb, au_scale); /* scale */ | 407 put_le32(pb, au_scale); /* scale */ |
406 put_le32(pb, au_byterate); /* rate */ | 408 put_le32(pb, au_byterate); /* rate */ |
409 // av_set_pts_info(&s->streams[i], 64, au_scale, au_byterate); | |
407 put_le32(pb, 0); /* start */ | 410 put_le32(pb, 0); /* start */ |
408 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */ | 411 avi->frames_hdr_strm[i] = url_ftell(pb); /* remember this offset to fill later */ |
409 put_le32(pb, 0); /* length, XXX: filled later */ | 412 put_le32(pb, 0); /* length, XXX: filled later */ |
410 put_le32(pb, 12 * 1024); /* suggested buffer size */ | 413 put_le32(pb, 12 * 1024); /* suggested buffer size */ |
411 put_le32(pb, -1); /* quality */ | 414 put_le32(pb, -1); /* quality */ |
613 { | 616 { |
614 AVIContext *avi = s->priv_data; | 617 AVIContext *avi = s->priv_data; |
615 ByteIOContext *pb = &s->pb; | 618 ByteIOContext *pb = &s->pb; |
616 unsigned char tag[5]; | 619 unsigned char tag[5]; |
617 unsigned int flags=0; | 620 unsigned int flags=0; |
618 AVCodecContext *enc; | |
619 const int stream_index= pkt->stream_index; | 621 const int stream_index= pkt->stream_index; |
622 AVCodecContext *enc= &s->streams[stream_index]->codec;; | |
620 int size= pkt->size; | 623 int size= pkt->size; |
624 | |
625 // av_log(s, AV_LOG_DEBUG, "%lld %d %d\n", pkt->dts, avi->packet_count[stream_index], stream_index); | |
626 while(enc->codec_type == CODEC_TYPE_VIDEO && pkt->dts != AV_NOPTS_VALUE && pkt->dts > avi->packet_count[stream_index]){ | |
627 AVPacket empty_packet; | |
628 | |
629 av_init_packet(&empty_packet); | |
630 empty_packet.size= 0; | |
631 empty_packet.data= NULL; | |
632 empty_packet.stream_index= stream_index; | |
633 avi_write_packet(s, &empty_packet); | |
634 // av_log(s, AV_LOG_DEBUG, "dup %lld %d\n", pkt->dts, avi->packet_count[stream_index]); | |
635 } | |
636 avi->packet_count[stream_index]++; | |
621 | 637 |
622 if (url_ftell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE) { | 638 if (url_ftell(pb) - avi->riff_start > AVI_MAX_RIFF_SIZE) { |
623 avi_write_ix(s); | 639 avi_write_ix(s); |
624 end_tag(pb, avi->movi_list); | 640 end_tag(pb, avi->movi_list); |
625 | 641 |
628 | 644 |
629 end_tag(pb, avi->riff_start); | 645 end_tag(pb, avi->riff_start); |
630 avi->movi_list = avi_start_new_riff(avi, pb, "AVIX", "movi"); | 646 avi->movi_list = avi_start_new_riff(avi, pb, "AVIX", "movi"); |
631 } | 647 } |
632 | 648 |
633 enc = &s->streams[stream_index]->codec; | |
634 avi_stream2fourcc(&tag[0], stream_index, enc->codec_type); | 649 avi_stream2fourcc(&tag[0], stream_index, enc->codec_type); |
635 if(pkt->flags&PKT_FLAG_KEY) | 650 if(pkt->flags&PKT_FLAG_KEY) |
636 flags = 0x10; | 651 flags = 0x10; |
637 if (enc->codec_type == CODEC_TYPE_AUDIO) { | 652 if (enc->codec_type == CODEC_TYPE_AUDIO) { |
638 avi->audio_strm_length[stream_index] += size; | 653 avi->audio_strm_length[stream_index] += size; |