|
|
@ -251,6 +251,12 @@ static int write_header(AVFormatContext *s){ |
|
|
|
nut->time_base[j]= nut->stream[i].time_base; |
|
|
|
nut->time_base[j]= nut->stream[i].time_base; |
|
|
|
if(j==nut->time_base_count) |
|
|
|
if(j==nut->time_base_count) |
|
|
|
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
|
|
|
|
//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); |
|
|
|
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); |
|
|
|
put_flush_packet(bc); |
|
|
|
|
|
|
|
|
|
|
|
//FIXME stream header, ...
|
|
|
|
//FIXME info header, header repeation, header packet CRC, ...
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
@ -350,4 +402,5 @@ AVOutputFormat nut_muxer = { |
|
|
|
write_packet, |
|
|
|
write_packet, |
|
|
|
// write_trailer,
|
|
|
|
// write_trailer,
|
|
|
|
.flags = AVFMT_GLOBALHEADER, |
|
|
|
.flags = AVFMT_GLOBALHEADER, |
|
|
|
|
|
|
|
.codec_tag= (const AVCodecTag*[]){codec_bmp_tags, codec_wav_tags, 0}, |
|
|
|
}; |
|
|
|
}; |
|
|
|