|
|
|
@ -281,6 +281,48 @@ static void write_mainheader(NUTContext *nut, ByteIOContext *bc){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int write_streamheader(NUTContext *nut, ByteIOContext *bc, AVCodecContext *codec, int i){ |
|
|
|
|
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, (nut->stream[i].time_base - nut->time_base)/sizeof(AVRational)); |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int write_header(AVFormatContext *s){ |
|
|
|
|
NUTContext *nut = s->priv_data; |
|
|
|
|
ByteIOContext *bc = &s->pb; |
|
|
|
@ -334,44 +376,7 @@ static int write_header(AVFormatContext *s){ |
|
|
|
|
|
|
|
|
|
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, (nut->stream[i].time_base - nut->time_base)/sizeof(AVRational)); |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
write_streamheader(nut, bc, codec, i); |
|
|
|
|
update_packetheader(nut, bc, 0, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|