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;