tta demuxer: set packet duration
This commit is contained in:
parent
0b8b7db01b
commit
101c369b7c
@ -27,6 +27,8 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int totalframes, currentframe;
|
int totalframes, currentframe;
|
||||||
|
int frame_size;
|
||||||
|
int last_frame_size;
|
||||||
} TTAContext;
|
} TTAContext;
|
||||||
|
|
||||||
static int tta_probe(AVProbeData *p)
|
static int tta_probe(AVProbeData *p)
|
||||||
@ -42,7 +44,7 @@ static int tta_read_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
TTAContext *c = s->priv_data;
|
TTAContext *c = s->priv_data;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
int i, channels, bps, samplerate, datalen, framelen;
|
int i, channels, bps, samplerate, datalen;
|
||||||
uint64_t framepos, start_offset;
|
uint64_t framepos, start_offset;
|
||||||
|
|
||||||
if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
|
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
|
avio_skip(s->pb, 4); // header crc
|
||||||
|
|
||||||
framelen = samplerate*256/245;
|
c->frame_size = samplerate * 256 / 245;
|
||||||
c->totalframes = datalen / framelen + ((datalen % framelen) ? 1 : 0);
|
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;
|
c->currentframe = 0;
|
||||||
|
|
||||||
if(c->totalframes >= UINT_MAX/sizeof(uint32_t)){
|
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++) {
|
for (i = 0; i < c->totalframes; i++) {
|
||||||
uint32_t size = avio_rl32(s->pb);
|
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;
|
framepos += size;
|
||||||
}
|
}
|
||||||
avio_skip(s->pb, 4); // seektable crc
|
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);
|
ret = av_get_packet(s->pb, pkt, size);
|
||||||
pkt->dts = st->index_entries[c->currentframe++].timestamp;
|
pkt->dts = st->index_entries[c->currentframe++].timestamp;
|
||||||
|
pkt->duration = c->currentframe == c->totalframes ? c->last_frame_size :
|
||||||
|
c->frame_size;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user