Commit ab3c04c4 authored by James Almer's avatar James Almer

avformat/dtshddec: parse chunks stored after audio data

Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 72e33eec
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#define TIMECODE 0x54494D45434F4445 #define TIMECODE 0x54494D45434F4445
typedef struct DTSHDDemuxContext { typedef struct DTSHDDemuxContext {
uint64_t data_start;
uint64_t data_end; uint64_t data_end;
} DTSHDDemuxContext; } DTSHDDemuxContext;
...@@ -64,10 +65,13 @@ static int dtshd_read_header(AVFormatContext *s) ...@@ -64,10 +65,13 @@ static int dtshd_read_header(AVFormatContext *s)
st->codecpar->codec_id = AV_CODEC_ID_DTS; st->codecpar->codec_id = AV_CODEC_ID_DTS;
st->need_parsing = AVSTREAM_PARSE_FULL_RAW; st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
while (!avio_feof(pb)) { for (;;) {
chunk_type = avio_rb64(pb); chunk_type = avio_rb64(pb);
chunk_size = avio_rb64(pb); chunk_size = avio_rb64(pb);
if (avio_feof(pb))
break;
if (chunk_size < 4) { if (chunk_size < 4) {
av_log(s, AV_LOG_ERROR, "chunk size too small\n"); av_log(s, AV_LOG_ERROR, "chunk size too small\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
...@@ -79,10 +83,13 @@ static int dtshd_read_header(AVFormatContext *s) ...@@ -79,10 +83,13 @@ static int dtshd_read_header(AVFormatContext *s)
switch (chunk_type) { switch (chunk_type) {
case STRMDATA: 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) if (dtshd->data_end <= chunk_size)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
return 0; if (!pb->seekable)
return 0;
goto skip;
break; break;
case FILEINFO: case FILEINFO:
if (chunk_size > INT_MAX) if (chunk_size > INT_MAX)
...@@ -103,7 +110,12 @@ skip: ...@@ -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) static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment