Merge remote-tracking branch 'qatar/master'

* qatar/master:
  mxfenc: switch to av_reallocp_array() and check allocation errors

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-08-05 09:57:07 +02:00
commit dd98d9d1ff
1 changed files with 29 additions and 18 deletions

View File

@ -1300,7 +1300,7 @@ static void mxf_write_klv_fill(AVFormatContext *s)
} }
} }
static void mxf_write_partition(AVFormatContext *s, int bodysid, static int mxf_write_partition(AVFormatContext *s, int bodysid,
int indexsid, int indexsid,
const uint8_t *key, int write_metadata) const uint8_t *key, int write_metadata)
{ {
@ -1309,6 +1309,7 @@ static void mxf_write_partition(AVFormatContext *s, int bodysid,
int64_t header_byte_count_offset; int64_t header_byte_count_offset;
unsigned index_byte_count = 0; unsigned index_byte_count = 0;
uint64_t partition_offset = avio_tell(pb); uint64_t partition_offset = avio_tell(pb);
int err;
if (!mxf->edit_unit_byte_count && mxf->edit_units_count) if (!mxf->edit_unit_byte_count && mxf->edit_units_count)
index_byte_count = 85 + 12+(s->nb_streams+1)*6 + index_byte_count = 85 + 12+(s->nb_streams+1)*6 +
@ -1323,10 +1324,11 @@ static void mxf_write_partition(AVFormatContext *s, int bodysid,
} }
if (!memcmp(key, body_partition_key, 16)) { if (!memcmp(key, body_partition_key, 16)) {
mxf->body_partition_offset = if ((err = av_reallocp_array(&mxf->body_partition_offset, mxf->body_partitions_count + 1,
av_realloc(mxf->body_partition_offset, sizeof(*mxf->body_partition_offset))) < 0) {
(mxf->body_partitions_count+1)* mxf->body_partitions_count = 0;
sizeof(*mxf->body_partition_offset)); return err;
}
mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset; mxf->body_partition_offset[mxf->body_partitions_count++] = partition_offset;
} }
@ -1391,6 +1393,8 @@ static void mxf_write_partition(AVFormatContext *s, int bodysid,
} }
avio_flush(pb); avio_flush(pb);
return 0;
} }
static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st, static int mxf_parse_dnxhd_frame(AVFormatContext *s, AVStream *st,
@ -1917,13 +1921,14 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
AVStream *st = s->streams[pkt->stream_index]; AVStream *st = s->streams[pkt->stream_index];
MXFStreamContext *sc = st->priv_data; MXFStreamContext *sc = st->priv_data;
MXFIndexEntry ie = {0}; MXFIndexEntry ie = {0};
int err;
if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) { if (!mxf->edit_unit_byte_count && !(mxf->edit_units_count % EDIT_UNITS_PER_BODY)) {
mxf->index_entries = av_realloc(mxf->index_entries, if ((err = av_reallocp_array(&mxf->index_entries, mxf->edit_units_count
(mxf->edit_units_count + EDIT_UNITS_PER_BODY)*sizeof(*mxf->index_entries)); + EDIT_UNITS_PER_BODY, sizeof(*mxf->index_entries))) < 0) {
if (!mxf->index_entries) { mxf->edit_units_count = 0;
av_log(s, AV_LOG_ERROR, "could not allocate index entries\n"); av_log(s, AV_LOG_ERROR, "could not allocate index entries\n");
return -1; return err;
} }
} }
@ -1946,11 +1951,13 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
if (!mxf->header_written) { if (!mxf->header_written) {
if (mxf->edit_unit_byte_count) { if (mxf->edit_unit_byte_count) {
mxf_write_partition(s, 1, 2, header_open_partition_key, 1); if ((err = mxf_write_partition(s, 1, 2, header_open_partition_key, 1)) < 0)
return err;
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf_write_index_table_segment(s); mxf_write_index_table_segment(s);
} else { } else {
mxf_write_partition(s, 0, 0, header_open_partition_key, 1); if ((err = mxf_write_partition(s, 0, 0, header_open_partition_key, 1)) < 0)
return err;
} }
mxf->header_written = 1; mxf->header_written = 1;
} }
@ -1960,8 +1967,8 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
(!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) && (!mxf->edit_units_count || mxf->edit_units_count > EDIT_UNITS_PER_BODY) &&
!(ie.flags & 0x33)) { // I frame, Gop start !(ie.flags & 0x33)) { // I frame, Gop start
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf_write_partition(s, 1, 2, body_partition_key, 0); if ((err = mxf_write_partition(s, 1, 2, body_partition_key, 0)) < 0)
return err;
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf_write_index_table_segment(s); mxf_write_index_table_segment(s);
} }
@ -2030,16 +2037,18 @@ static int mxf_write_footer(AVFormatContext *s)
{ {
MXFContext *mxf = s->priv_data; MXFContext *mxf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int err;
mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count; mxf->duration = mxf->last_indexed_edit_unit + mxf->edit_units_count;
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf->footer_partition_offset = avio_tell(pb); mxf->footer_partition_offset = avio_tell(pb);
if (mxf->edit_unit_byte_count) { // no need to repeat index if (mxf->edit_unit_byte_count) { // no need to repeat index
mxf_write_partition(s, 0, 0, footer_partition_key, 0); if ((err = mxf_write_partition(s, 0, 0, footer_partition_key, 0)) < 0)
return err;
} else { } else {
mxf_write_partition(s, 0, 2, footer_partition_key, 0); if ((err = mxf_write_partition(s, 0, 2, footer_partition_key, 0)) < 0)
return err;
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf_write_index_table_segment(s); mxf_write_index_table_segment(s);
} }
@ -2050,11 +2059,13 @@ static int mxf_write_footer(AVFormatContext *s)
if (s->pb->seekable) { if (s->pb->seekable) {
avio_seek(pb, 0, SEEK_SET); avio_seek(pb, 0, SEEK_SET);
if (mxf->edit_unit_byte_count) { if (mxf->edit_unit_byte_count) {
mxf_write_partition(s, 1, 2, header_closed_partition_key, 1); if ((err = mxf_write_partition(s, 1, 2, header_closed_partition_key, 1)) < 0)
return err;
mxf_write_klv_fill(s); mxf_write_klv_fill(s);
mxf_write_index_table_segment(s); mxf_write_index_table_segment(s);
} else { } else {
mxf_write_partition(s, 0, 0, header_closed_partition_key, 1); if ((err = mxf_write_partition(s, 0, 0, header_closed_partition_key, 1)) < 0)
return err;
} }
} }