|
|
|
@ -48,7 +48,7 @@ static int nut_write_header(AVFormatContext * avf) { |
|
|
|
|
AVCodecContext * codec = avf->streams[i]->codec; |
|
|
|
|
int j; |
|
|
|
|
int fourcc = 0; |
|
|
|
|
int nom, denom, ssize; |
|
|
|
|
int num, denom, ssize; |
|
|
|
|
|
|
|
|
|
s[i].type = codec->codec_type == CODEC_TYPE_VIDEO ? NUT_VIDEO_CLASS : NUT_AUDIO_CLASS; |
|
|
|
|
|
|
|
|
@ -64,11 +64,11 @@ static int nut_write_header(AVFormatContext * avf) { |
|
|
|
|
s[i].fourcc = av_malloc(s[i].fourcc_len); |
|
|
|
|
for (j = 0; j < s[i].fourcc_len; j++) s[i].fourcc[j] = (fourcc >> (j*8)) & 0xFF; |
|
|
|
|
|
|
|
|
|
ff_parse_specific_params(codec, &nom, &ssize, &denom); |
|
|
|
|
av_set_pts_info(avf->streams[i], 60, denom, nom); |
|
|
|
|
ff_parse_specific_params(codec, &num, &ssize, &denom); |
|
|
|
|
av_set_pts_info(avf->streams[i], 60, denom, num); |
|
|
|
|
|
|
|
|
|
s[i].time_base.nom = denom; |
|
|
|
|
s[i].time_base.den = nom; |
|
|
|
|
s[i].time_base.num = denom; |
|
|
|
|
s[i].time_base.den = num; |
|
|
|
|
|
|
|
|
|
s[i].fixed_fps = 0; |
|
|
|
|
s[i].decode_delay = codec->has_b_frames; |
|
|
|
@ -82,7 +82,7 @@ static int nut_write_header(AVFormatContext * avf) { |
|
|
|
|
s[i].sample_height = 0; |
|
|
|
|
s[i].colorspace_type = 0; |
|
|
|
|
} else { |
|
|
|
|
s[i].samplerate_nom = codec->sample_rate; |
|
|
|
|
s[i].samplerate_num = codec->sample_rate; |
|
|
|
|
s[i].samplerate_denom = 1; |
|
|
|
|
s[i].channel_count = codec->channels; |
|
|
|
|
} |
|
|
|
@ -199,7 +199,7 @@ static int nut_read_header(AVFormatContext * avf, AVFormatParameters * ap) { |
|
|
|
|
memcpy(st->codec->extradata, s[i].codec_specific, st->codec->extradata_size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
av_set_pts_info(avf->streams[i], 60, s[i].time_base.nom, s[i].time_base.den); |
|
|
|
|
av_set_pts_info(avf->streams[i], 60, s[i].time_base.num, s[i].time_base.den); |
|
|
|
|
st->start_time = 0; |
|
|
|
|
st->duration = s[i].max_pts; |
|
|
|
|
|
|
|
|
@ -211,7 +211,7 @@ static int nut_read_header(AVFormatContext * avf, AVFormatParameters * ap) { |
|
|
|
|
if (st->codec->codec_id == CODEC_ID_NONE) st->codec->codec_id = codec_get_wav_id(st->codec->codec_tag); |
|
|
|
|
|
|
|
|
|
st->codec->channels = s[i].channel_count; |
|
|
|
|
st->codec->sample_rate = s[i].samplerate_nom / s[i].samplerate_denom; |
|
|
|
|
st->codec->sample_rate = s[i].samplerate_num / s[i].samplerate_denom; |
|
|
|
|
break; |
|
|
|
|
case NUT_VIDEO_CLASS: |
|
|
|
|
st->codec->codec_type = CODEC_TYPE_VIDEO; |
|
|
|
@ -255,7 +255,7 @@ static int nut_read_packet(AVFormatContext * avf, AVPacket * pkt) { |
|
|
|
|
static int nut_read_seek(AVFormatContext * avf, int stream_index, int64_t target_ts, int flags) { |
|
|
|
|
NUTContext * priv = avf->priv_data; |
|
|
|
|
int active_streams[] = { stream_index, -1 }; |
|
|
|
|
double time_pos = target_ts * priv->s[stream_index].time_base.nom / (double)priv->s[stream_index].time_base.den; |
|
|
|
|
double time_pos = target_ts * priv->s[stream_index].time_base.num / (double)priv->s[stream_index].time_base.den; |
|
|
|
|
|
|
|
|
|
if (nut_seek(priv->nut, time_pos, 2*!(flags & AVSEEK_FLAG_BACKWARD), active_streams)) return -1; |
|
|
|
|
|
|
|
|
|