aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-02-26 12:52:01 +0100
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2011-03-05 12:48:39 +0100
commitb09e5068203bb9852734c04e37f852dd4d1d1137 (patch)
tree6d61af508bf6a1e4d836b750ffa34258a13acf64 /libavformat
parent5e7950249397bcf850ef41134525895fe83dbd67 (diff)
downloadffmpeg-b09e5068203bb9852734c04e37f852dd4d1d1137.tar.gz
Make matroska demuxer also set timestamps for RealAudio packets.
Improves seeking in ffplay with http://samples.mplayerhq.hu/Matroska/RA_missing_timestamps.mkv
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/matroskadec.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index ffb9d73d3c..b0451020c0 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -127,6 +127,7 @@ typedef struct {
int sub_packet_size;
int sub_packet_cnt;
int pkt_cnt;
+ uint64_t buf_timecode;
uint8_t *buf;
} MatroskaTrackAudio;
@@ -1740,6 +1741,8 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
int x;
if (!track->audio.pkt_cnt) {
+ if (track->audio.sub_packet_cnt == 0)
+ track->audio.buf_timecode = timecode;
if (st->codec->codec_id == CODEC_ID_RA_288)
for (x=0; x<h/2; x++)
memcpy(track->audio.buf+x*2*w+y*cfs,
@@ -1762,6 +1765,8 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
av_new_packet(pkt, a);
memcpy(pkt->data, track->audio.buf
+ a * (h*w / a - track->audio.pkt_cnt--), a);
+ pkt->pts = track->audio.buf_timecode;
+ track->audio.buf_timecode = AV_NOPTS_VALUE;
pkt->pos = pos;
pkt->stream_index = st->index;
dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
@@ -1903,6 +1908,9 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
index_min = index;
for (i=0; i < matroska->tracks.nb_elem; i++) {
+ tracks[i].audio.pkt_cnt = 0;
+ tracks[i].audio.sub_packet_cnt = 0;
+ tracks[i].audio.buf_timecode = AV_NOPTS_VALUE;
tracks[i].end_timecode = 0;
if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE
&& !tracks[i].stream->discard != AVDISCARD_ALL) {