mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
tta demuxer: set packet duration
This commit is contained in:
parent
0b8b7db01b
commit
101c369b7c
@ -27,6 +27,8 @@
|
||||
|
||||
typedef struct {
|
||||
int totalframes, currentframe;
|
||||
int frame_size;
|
||||
int last_frame_size;
|
||||
} TTAContext;
|
||||
|
||||
static int tta_probe(AVProbeData *p)
|
||||
@ -42,7 +44,7 @@ static int tta_read_header(AVFormatContext *s)
|
||||
{
|
||||
TTAContext *c = s->priv_data;
|
||||
AVStream *st;
|
||||
int i, channels, bps, samplerate, datalen, framelen;
|
||||
int i, channels, bps, samplerate, datalen;
|
||||
uint64_t framepos, start_offset;
|
||||
|
||||
if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
|
||||
@ -69,8 +71,11 @@ static int tta_read_header(AVFormatContext *s)
|
||||
|
||||
avio_skip(s->pb, 4); // header crc
|
||||
|
||||
framelen = samplerate*256/245;
|
||||
c->totalframes = datalen / framelen + ((datalen % framelen) ? 1 : 0);
|
||||
c->frame_size = samplerate * 256 / 245;
|
||||
c->last_frame_size = datalen % c->frame_size;
|
||||
if (!c->last_frame_size)
|
||||
c->last_frame_size = c->frame_size;
|
||||
c->totalframes = datalen / c->frame_size + (c->last_frame_size < c->frame_size);
|
||||
c->currentframe = 0;
|
||||
|
||||
if(c->totalframes >= UINT_MAX/sizeof(uint32_t)){
|
||||
@ -90,7 +95,8 @@ static int tta_read_header(AVFormatContext *s)
|
||||
|
||||
for (i = 0; i < c->totalframes; i++) {
|
||||
uint32_t size = avio_rl32(s->pb);
|
||||
av_add_index_entry(st, framepos, i*framelen, size, 0, AVINDEX_KEYFRAME);
|
||||
av_add_index_entry(st, framepos, i * c->frame_size, size, 0,
|
||||
AVINDEX_KEYFRAME);
|
||||
framepos += size;
|
||||
}
|
||||
avio_skip(s->pb, 4); // seektable crc
|
||||
@ -132,6 +138,8 @@ static int tta_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
|
||||
ret = av_get_packet(s->pb, pkt, size);
|
||||
pkt->dts = st->index_entries[c->currentframe++].timestamp;
|
||||
pkt->duration = c->currentframe == c->totalframes ? c->last_frame_size :
|
||||
c->frame_size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user