summaryrefslogtreecommitdiff
path: root/libavformat/dtshddec.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2016-05-16 02:13:46 -0300
committerJames Almer <jamrial@gmail.com>2016-05-16 19:29:55 -0300
commitab3c04c4580563b12e3433ac5920850cdd29ddd1 (patch)
treeafc3541f9c1129c8353cc556159fea46121a6404 /libavformat/dtshddec.c
parent72e33eec3a5e6d04d891e89ef0ab9d42054a6271 (diff)
downloadffmpeg-ab3c04c4580563b12e3433ac5920850cdd29ddd1.tar.gz
avformat/dtshddec: parse chunks stored after audio data
Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/dtshddec.c')
-rw-r--r--libavformat/dtshddec.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/libavformat/dtshddec.c b/libavformat/dtshddec.c
index f3af096f3a..1fba95740f 100644
--- a/libavformat/dtshddec.c
+++ b/libavformat/dtshddec.c
@@ -38,6 +38,7 @@
#define TIMECODE 0x54494D45434F4445
typedef struct DTSHDDemuxContext {
+ uint64_t data_start;
uint64_t data_end;
} DTSHDDemuxContext;
@@ -64,10 +65,13 @@ static int dtshd_read_header(AVFormatContext *s)
st->codecpar->codec_id = AV_CODEC_ID_DTS;
st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
- while (!avio_feof(pb)) {
+ for (;;) {
chunk_type = avio_rb64(pb);
chunk_size = avio_rb64(pb);
+ if (avio_feof(pb))
+ break;
+
if (chunk_size < 4) {
av_log(s, AV_LOG_ERROR, "chunk size too small\n");
return AVERROR_INVALIDDATA;
@@ -79,10 +83,13 @@ static int dtshd_read_header(AVFormatContext *s)
switch (chunk_type) {
case STRMDATA:
- dtshd->data_end = chunk_size + avio_tell(pb);
+ dtshd->data_start = avio_tell(pb);
+ dtshd->data_end = dtshd->data_start + chunk_size;
if (dtshd->data_end <= chunk_size)
return AVERROR_INVALIDDATA;
- return 0;
+ if (!pb->seekable)
+ return 0;
+ goto skip;
break;
case FILEINFO:
if (chunk_size > INT_MAX)
@@ -103,7 +110,12 @@ skip:
};
}
- return AVERROR_EOF;
+ if (!dtshd->data_end)
+ return AVERROR_EOF;
+
+ avio_seek(pb, dtshd->data_start, SEEK_SET);
+
+ return 0;
}
static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)