diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-01-13 13:35:06 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-03-03 17:03:26 -0500 |
commit | 101c369b7cccc6a0c4fcbd4aec26894a5ffc74f7 (patch) | |
tree | 969985cebaac13d65526cd33c6801bbf0954102d /libavformat | |
parent | 0b8b7db01b30248430b2dcc29c6e904df47a991e (diff) | |
download | ffmpeg-101c369b7cccc6a0c4fcbd4aec26894a5ffc74f7.tar.gz |
tta demuxer: set packet duration
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/tta.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/libavformat/tta.c b/libavformat/tta.c index d7d41172d6..0b2337baf2 100644 --- a/libavformat/tta.c +++ b/libavformat/tta.c @@ -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; } |