|
|
|
@ -6009,67 +6009,6 @@ static int mov_read_tenc(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_read_saiz(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
{ |
|
|
|
|
AVStream *st; |
|
|
|
|
MOVStreamContext *sc; |
|
|
|
|
size_t data_size; |
|
|
|
|
int atom_header_size; |
|
|
|
|
int flags; |
|
|
|
|
|
|
|
|
|
if (c->decryption_key_len == 0 || c->fc->nb_streams < 1) |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
st = c->fc->streams[c->fc->nb_streams - 1]; |
|
|
|
|
sc = st->priv_data; |
|
|
|
|
|
|
|
|
|
if (sc->cenc.auxiliary_info_sizes || sc->cenc.auxiliary_info_default_size) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "duplicate saiz atom\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
atom_header_size = 9; |
|
|
|
|
|
|
|
|
|
avio_r8(pb); /* version */ |
|
|
|
|
flags = avio_rb24(pb); |
|
|
|
|
|
|
|
|
|
if ((flags & 0x01) != 0) { |
|
|
|
|
atom_header_size += 8; |
|
|
|
|
|
|
|
|
|
avio_rb32(pb); /* info type */ |
|
|
|
|
avio_rb32(pb); /* info type param */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sc->cenc.auxiliary_info_default_size = avio_r8(pb); |
|
|
|
|
avio_rb32(pb); /* entries */ |
|
|
|
|
|
|
|
|
|
if (atom.size <= atom_header_size) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (atom.size > FFMIN(INT_MAX, SIZE_MAX)) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "saiz atom auxiliary_info_sizes size %"PRId64" invalid\n", atom.size); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* save the auxiliary info sizes as is */ |
|
|
|
|
data_size = atom.size - atom_header_size; |
|
|
|
|
|
|
|
|
|
sc->cenc.auxiliary_info_sizes = av_malloc(data_size); |
|
|
|
|
if (!sc->cenc.auxiliary_info_sizes) { |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sc->cenc.auxiliary_info_sizes_count = data_size; |
|
|
|
|
|
|
|
|
|
if (avio_read(pb, sc->cenc.auxiliary_info_sizes, data_size) != data_size) { |
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "failed to read the auxiliary info sizes"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_read_dfla(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
{ |
|
|
|
|
AVStream *st; |
|
|
|
@ -6107,36 +6046,6 @@ static int mov_read_dfla(MOVContext *c, AVIOContext *pb, MOVAtom atom) |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int mov_seek_auxiliary_info(MOVContext *c, MOVStreamContext *sc, int64_t index) |
|
|
|
|
{ |
|
|
|
|
size_t auxiliary_info_seek_offset = 0; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (sc->cenc.auxiliary_info_default_size) { |
|
|
|
|
auxiliary_info_seek_offset = (size_t)sc->cenc.auxiliary_info_default_size * index; |
|
|
|
|
} else if (sc->cenc.auxiliary_info_sizes) { |
|
|
|
|
if (index > sc->cenc.auxiliary_info_sizes_count) { |
|
|
|
|
av_log(c, AV_LOG_ERROR, "current sample %"PRId64" greater than the number of auxiliary info sample sizes %"SIZE_SPECIFIER"\n", |
|
|
|
|
index, sc->cenc.auxiliary_info_sizes_count); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < index; i++) { |
|
|
|
|
auxiliary_info_seek_offset += sc->cenc.auxiliary_info_sizes[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (auxiliary_info_seek_offset > sc->cenc.auxiliary_info_end - sc->cenc.auxiliary_info) { |
|
|
|
|
av_log(c, AV_LOG_ERROR, "auxiliary info offset %"SIZE_SPECIFIER" greater than auxiliary info size %"SIZE_SPECIFIER"\n", |
|
|
|
|
auxiliary_info_seek_offset, (size_t)(sc->cenc.auxiliary_info_end - sc->cenc.auxiliary_info)); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sc->cenc.auxiliary_info_pos = sc->cenc.auxiliary_info + auxiliary_info_seek_offset; |
|
|
|
|
sc->cenc.auxiliary_info_index = index; |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cenc_decrypt(MOVContext *c, MOVStreamContext *sc, AVEncryptionInfo *sample, uint8_t *input, int size) |
|
|
|
|
{ |
|
|
|
|
int i, ret; |
|
|
|
|