aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2007-08-09 10:45:19 +0000
committerMichael Niedermayer <michaelni@gmx.at>2007-08-09 10:45:19 +0000
commitdcc9bde0101f8246b34ac857fac1b6c3608f0c3f (patch)
tree5b014af29e55a08168ed1b89d3dd007eab4703ea
parent3bf981617073a5927984466fdc312dd7430191b1 (diff)
downloadffmpeg-dcc9bde0101f8246b34ac857fac1b6c3608f0c3f.tar.gz
write stream headers
Originally committed as revision 10008 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/nutenc.c55
1 files changed, 54 insertions, 1 deletions
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},
};