avpriv_request_sample(pb, "Primer pack item length %d", item_len);
return AVERROR_PATCHWELCOME;
}
- if (item_num > 65536) {
+ if (item_num > 65536 || item_num < 0) {
av_log(mxf->fc, AV_LOG_ERROR, "item_num %d is too large\n", item_num);
return AVERROR_INVALIDDATA;
}
segment->nb_index_entries = avio_rb32(pb);
length = avio_rb32(pb);
+ if(segment->nb_index_entries && length < 11)
+ return AVERROR_INVALIDDATA;
if (!(segment->temporal_offset_entries=av_calloc(segment->nb_index_entries, sizeof(*segment->temporal_offset_entries))) ||
!(segment->flag_entries = av_calloc(segment->nb_index_entries, sizeof(*segment->flag_entries))) ||
}
for (i = 0; i < segment->nb_index_entries; i++) {
+ if(avio_feof(pb))
+ return AVERROR_INVALIDDATA;
segment->temporal_offset_entries[i] = avio_r8(pb);
avio_r8(pb); /* KeyFrameOffset */
segment->flag_entries[i] = avio_r8(pb);
return 0;
}
+static int mxf_set_pts(MXFContext *mxf, AVStream *st, AVPacket *pkt, int64_t next_ofs)
+{
+ AVCodecParameters *par = st->codecpar;
+ MXFTrack *track = st->priv_data;
+
+ if (par->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) {
+ /* mxf->current_edit_unit good - see if we have an
+ * index table to derive timestamps from */
+ MXFIndexTable *t = &mxf->index_tables[0];
+
+ if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) {
+ pkt->dts = mxf->current_edit_unit + t->first_dts;
+ pkt->pts = t->ptses[mxf->current_edit_unit];
+ } else if (track && track->intra_only) {
+ /* intra-only -> PTS = EditUnit.
+ * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
+ pkt->pts = mxf->current_edit_unit;
+ }
+ } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
+ int ret = mxf_set_audio_pts(mxf, par, pkt);
+ if (ret < 0)
+ return ret;
+ }
+ return 0;
+}
+
static int mxf_read_packet_old(AVFormatContext *s, AVPacket *pkt)
{
KLVPacket klv;
int index = mxf_get_stream_index(s, &klv);
int64_t next_ofs, next_klv;
AVStream *st;
- MXFTrack *track;
- AVCodecParameters *par;
if (index < 0) {
av_log(s, AV_LOG_ERROR,
}
st = s->streams[index];
- track = st->priv_data;
if (s->streams[index]->discard == AVDISCARD_ALL)
goto skip;
pkt->stream_index = index;
pkt->pos = klv.offset;
- par = st->codecpar;
-
- if (par->codec_type == AVMEDIA_TYPE_VIDEO && next_ofs >= 0) {
- /* mxf->current_edit_unit good - see if we have an
- * index table to derive timestamps from */
- MXFIndexTable *t = &mxf->index_tables[0];
-
- if (mxf->nb_index_tables >= 1 && mxf->current_edit_unit < t->nb_ptses) {
- pkt->dts = mxf->current_edit_unit + t->first_dts;
- pkt->pts = t->ptses[mxf->current_edit_unit];
- } else if (track && track->intra_only) {
- /* intra-only -> PTS = EditUnit.
- * let utils.c figure out DTS since it can be < PTS if low_delay = 0 (Sony IMX30) */
- pkt->pts = mxf->current_edit_unit;
- }
- } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
- ret = mxf_set_audio_pts(mxf, par, pkt);
- if (ret < 0)
- return ret;
- }
+ ret = mxf_set_pts(mxf, st, pkt, next_ofs);
+ if (ret < 0)
+ return ret;
/* seek for truncated packets */
avio_seek(s->pb, next_klv, SEEK_SET);
pkt->stream_index = st->index;
- if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && t->ptses &&
- mxf->current_edit_unit >= 0 && mxf->current_edit_unit < t->nb_ptses) {
- pkt->dts = mxf->current_edit_unit + t->first_dts;
- pkt->pts = t->ptses[mxf->current_edit_unit];
- } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
- int ret = mxf_set_audio_pts(mxf, st->codecpar, pkt);
- if (ret < 0)
- return ret;
- }
+ ret = mxf_set_pts(mxf, st, pkt, next_pos);
+ if (ret < 0)
+ return ret;
mxf->current_edit_unit += edit_units;