diff options
author | Tomas Härdin <tomas.hardin@codemill.se> | 2014-10-28 14:27:06 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-10-28 18:59:31 +0100 |
commit | b83affdc94a90a3e6cddc5e21ec06c14089a9208 (patch) | |
tree | d5c330378009a1be00e3640ff982a791ca51ebc1 | |
parent | 1b17b64ee4d6d7070e0ef3ab312e5f81f45dad49 (diff) | |
download | ffmpeg-b83affdc94a90a3e6cddc5e21ec06c14089a9208.tar.gz |
mxfdec: Merge last_partition and footer_partition
FooterPartition offset specified in RIP takes precedence over any value written
in PartitionPacks. This fixes the same issue f06f6da tries to fix without
introducing an extra variable.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/mxfdec.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index ef4b36824e..fd08bf76eb 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -227,7 +227,6 @@ typedef struct { struct AVAES *aesc; uint8_t *local_tags; int local_tags_count; - uint64_t last_partition; uint64_t footer_partition; KLVPacket current_klv_data; int current_klv_index; @@ -2141,30 +2140,27 @@ static int mxf_parse_handle_essence(MXFContext *mxf) if (mxf->parsing_backward) { return mxf_seek_to_previous_partition(mxf); } else { - uint64_t offset = mxf->footer_partition ? mxf->footer_partition - : mxf->last_partition; - - if (!offset) { - av_dlog(mxf->fc, "no last partition\n"); + if (!mxf->footer_partition) { + av_dlog(mxf->fc, "no FooterPartition\n"); return 0; } - av_dlog(mxf->fc, "seeking to last partition\n"); + av_dlog(mxf->fc, "seeking to FooterPartition\n"); /* remember where we were so we don't end up seeking further back than this */ mxf->last_forward_tell = avio_tell(pb); if (!pb->seekable) { - av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing last partition\n"); + av_log(mxf->fc, AV_LOG_INFO, "file is not seekable - not parsing FooterPartition\n"); return -1; } - /* seek to last partition and parse backward */ - if ((ret = avio_seek(pb, mxf->run_in + offset, SEEK_SET)) < 0) { + /* seek to FooterPartition and parse backward */ + if ((ret = avio_seek(pb, mxf->run_in + mxf->footer_partition, SEEK_SET)) < 0) { av_log(mxf->fc, AV_LOG_ERROR, - "failed to seek to last partition @ 0x%" PRIx64 + "failed to seek to FooterPartition @ 0x%" PRIx64 " (%"PRId64") - partial file?\n", - mxf->run_in + offset, ret); + mxf->run_in + mxf->footer_partition, ret); return ret; } @@ -2202,7 +2198,7 @@ static void mxf_compute_essence_containers(MXFContext *mxf) continue; /* BodySID == 0 -> no essence */ if (x >= mxf->partitions_count - 1) - break; /* last partition - can't compute length (and we don't need to) */ + break; /* FooterPartition - can't compute length (and we don't need to) */ /* essence container spans to the next partition */ p->essence_length = mxf->partitions[x+1].this_partition - p->essence_offset; @@ -2283,7 +2279,7 @@ static void mxf_read_random_index_pack(AVFormatContext *s) goto end; avio_skip(s->pb, klv.length - 12); - mxf->last_partition = avio_rb64(s->pb); + mxf->footer_partition = avio_rb64(s->pb); end: avio_seek(s->pb, mxf->run_in, SEEK_SET); |