From dcc9bde0101f8246b34ac857fac1b6c3608f0c3f Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 9 Aug 2007 10:45:19 +0000 Subject: [PATCH] write stream headers Originally committed as revision 10008 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/nutenc.c | 55 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/libavformat/nutenc.c b/libavformat/nutenc.c index 6cb57f0ed9..cda4704f6f 100644 --- a/libavformat/nutenc.c +++ b/libavformat/nutenc.c @@ -251,6 +251,12 @@ static int write_header(AVFormatContext *s){ nut->time_base[j]= nut->stream[i].time_base; if(j==nut->time_base_count) nut->time_base_count++; + + if(av_q2d(nut->stream[i].time_base) >= 0.001) + nut->stream[i].msb_pts_shift = 7; + else + nut->stream[i].msb_pts_shift = 14; + nut->stream[i].max_pts_distance= FFMAX(1/av_q2d(nut->stream[i].time_base), 1); } //FIXME make nut->stream[i].time_base pointers into nut->time_base @@ -320,9 +326,55 @@ static int write_header(AVFormatContext *s){ update_packetheader(nut, bc, 0, 1); + for (i=0; i < s->nb_streams; i++){ + codec = s->streams[i]->codec; + + put_be64(bc, STREAM_STARTCODE); + put_packetheader(nut, bc, 120/*FIXME check*/ + codec->extradata_size, 1); + put_v(bc, i); + switch(codec->codec_type){ + case CODEC_TYPE_VIDEO: put_v(bc, 0); break; + case CODEC_TYPE_AUDIO: put_v(bc, 1); break; +// case CODEC_TYPE_TEXT : put_v(bc, 2); break; + default : put_v(bc, 3); break; + } + put_v(bc, 4); + if (codec->codec_tag){ + put_le32(bc, codec->codec_tag); + }else + return -1; + + put_v(bc, 0); //FIXME + put_v(bc, nut->stream[i].msb_pts_shift); + put_v(bc, nut->stream[i].max_pts_distance); + put_v(bc, codec->has_b_frames); + put_byte(bc, 0); /* flags: 0x1 - fixed_fps, 0x2 - index_present */ + + put_v(bc, codec->extradata_size); + put_buffer(bc, codec->extradata, codec->extradata_size); + + switch(codec->codec_type){ + case CODEC_TYPE_AUDIO: + put_v(bc, codec->sample_rate); + put_v(bc, 1); + put_v(bc, codec->channels); + break; + case CODEC_TYPE_VIDEO: + put_v(bc, codec->width); + put_v(bc, codec->height); + put_v(bc, codec->sample_aspect_ratio.num); + put_v(bc, codec->sample_aspect_ratio.den); + put_v(bc, 0); /* csp type -- unknown */ + break; + default: + break; + } + update_packetheader(nut, bc, 0, 1); + } + put_flush_packet(bc); - //FIXME stream header, ... + //FIXME info header, header repeation, header packet CRC, ... return 0; } @@ -350,4 +402,5 @@ AVOutputFormat nut_muxer = { write_packet, // write_trailer, .flags = AVFMT_GLOBALHEADER, + .codec_tag= (const AVCodecTag*[]){codec_bmp_tags, codec_wav_tags, 0}, };