mirror of
https://github.com/librempeg/librempeg
synced 2024-11-23 11:39:47 +00:00
avformat/dsfdec: set packet pts/duration/pos correctly
This commit is contained in:
parent
ef73ccc2c4
commit
98f5cbcb7d
@ -130,6 +130,7 @@ static int dsf_read_header(AVFormatContext *s)
|
|||||||
}
|
}
|
||||||
st->codecpar->block_align *= st->codecpar->channels;
|
st->codecpar->block_align *= st->codecpar->channels;
|
||||||
st->codecpar->bit_rate = st->codecpar->channels * st->codecpar->sample_rate * 8LL;
|
st->codecpar->bit_rate = st->codecpar->channels * st->codecpar->sample_rate * 8LL;
|
||||||
|
avpriv_set_pts_info(st, 64, 1, st->codecpar->sample_rate);
|
||||||
avio_skip(pb, 4);
|
avio_skip(pb, 4);
|
||||||
|
|
||||||
/* data chunk */
|
/* data chunk */
|
||||||
@ -150,11 +151,11 @@ static int dsf_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
AVStream *st = s->streams[0];
|
AVStream *st = s->streams[0];
|
||||||
int64_t pos = avio_tell(pb);
|
int64_t pos = avio_tell(pb);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (pos >= dsf->data_end)
|
if (pos >= dsf->data_end)
|
||||||
return AVERROR_EOF;
|
return AVERROR_EOF;
|
||||||
|
|
||||||
pkt->stream_index = 0;
|
|
||||||
if (dsf->data_size > dsf->audio_size) {
|
if (dsf->data_size > dsf->audio_size) {
|
||||||
int last_packet = pos == (dsf->data_end - st->codecpar->block_align);
|
int last_packet = pos == (dsf->data_end - st->codecpar->block_align);
|
||||||
|
|
||||||
@ -180,10 +181,22 @@ static int dsf_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
avio_skip(pb, skip_size / st->codecpar->channels);
|
avio_skip(pb, skip_size / st->codecpar->channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pkt->pos = pos;
|
||||||
|
pkt->stream_index = 0;
|
||||||
|
pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels;
|
||||||
|
pkt->duration = packet_size / st->codecpar->channels;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align));
|
ret = av_get_packet(pb, pkt, FFMIN(dsf->data_end - pos, st->codecpar->block_align));
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
pkt->stream_index = 0;
|
||||||
|
pkt->pts = (pos - s->internal->data_offset) / st->codecpar->channels;
|
||||||
|
pkt->duration = st->codecpar->block_align / st->codecpar->channels;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
AVInputFormat ff_dsf_demuxer = {
|
AVInputFormat ff_dsf_demuxer = {
|
||||||
|
Loading…
Reference in New Issue
Block a user