History

mxfdec: Parse more values in PartitionPack

These values include KAGSize, HeaderByteCount and IndexByteCount. The length of the pack itself is also stored, and KAGSize is sanity checked. The FATE sample has KAGSize == 0, which is adjusted to 512. Other bad KAGSizes are set to 1.

Tomas Härdin committed 14 years ago

Commit fd34dbe1 parent 7560c261 file · +41 −18Browse files

Unified · Split

libavformat/mxfdec.c+41−18
@@ -69,6 +69,7 @@ typedef enum { · 68 unmodified lines
6969 OP3b,
7070 OP3c,
7171 OPAtom,
72+ OPSONYOpt, /* FATE sample, violates the spec in places */
7273 } MXFOP;
7374
7475 typedef struct {
@@ -81,6 +82,10 @@ typedef struct { · 6 unmodified lines
8182 int64_t this_partition;
8283 int64_t essence_offset; /* absolute offset of essence */
8384 int64_t essence_length;
85+ int32_t kag_size;
86+ int64_t header_byte_count;
87+ int64_t index_byte_count;
88+ int pack_length;
8489 } MXFPartition;
8590
8691 typedef struct {
@@ -203,7 +208,8 @@ enum MXFWrappingScheme { · 116 unmodified lines
203208 Clip,
204209 };
205210
206−typedef int MXFMetadataReadFunc(void *arg, AVIOContext *pb, int tag, int size, UID uid);
211+/* NOTE: klv_offset is not set (-1) for local keys */
212+typedef int MXFMetadataReadFunc(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset);
207213
208214 typedef struct {
209215 const UID key;
@@ -416,7 +422,7 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt) · 206 unmodified lines
416422 return AVERROR_EOF;
417423 }
418424
419−static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid)
425+static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
420426 {
421427 MXFContext *mxf = arg;
422428 int item_num = avio_rb32(pb);
@@ -436,7 +442,7 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U · 13 unmodified lines
436442 return 0;
437443 }
438444
439−static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid)
445+static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
440446 {
441447 MXFContext *mxf = arg;
442448 MXFPartition *partition;
@@ -464,6 +470,7 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size · 21 unmodified lines
464470
465471 memset(partition, 0, sizeof(*partition));
466472 mxf->partitions_count++;
473+ partition->pack_length = avio_tell(pb) - klv_offset + size;
467474
468475 switch(uid[13]) {
469476 case 2:
@@ -483,11 +490,13 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size · 13 unmodified lines
483490 /* consider both footers to be closed (there is only Footer and CompleteFooter) */
484491 partition->closed = partition->type == Footer || !(uid[14] & 1);
485492 partition->complete = uid[14] > 2;
486− avio_skip(pb, 8);
493+ avio_skip(pb, 4);
494+ partition->kag_size = avio_rb32(pb);
487495 partition->this_partition = avio_rb64(pb);
488496 partition->previous_partition = avio_rb64(pb);
489497 footer_partition = avio_rb64(pb);
490− avio_skip(pb, 16);
498+ partition->header_byte_count = avio_rb64(pb);
499+ partition->index_byte_count = avio_rb64(pb);
491500 partition->index_sid = avio_rb32(pb);
492501 avio_skip(pb, 8);
493502 partition->body_sid = avio_rb32(pb);
@@ -519,8 +528,22 @@ static int mxf_read_partition_pack(void *arg, AVIOContext *pb, int tag, int size · 25 unmodified lines
519528 else if (op[12] == 3 && op[13] == 2) mxf->op = OP3b;
520529 else if (op[12] == 3 && op[13] == 3) mxf->op = OP3c;
521530 else if (op[12] == 0x10) mxf->op = OPAtom;
522− else
523− av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh\n", op[12], op[13]);
531+ else if (op[12] == 64&& op[13] == 1) mxf->op = OPSONYOpt;
532+ else {
533+ av_log(mxf->fc, AV_LOG_ERROR, "unknown operational pattern: %02xh %02xh - guessing OP1a\n", op[12], op[13]);
534+ mxf->op = OP1a;
535+ }
536+
537+ if (partition->kag_size <= 0 || partition->kag_size > (1 << 20)) {
538+ av_log(mxf->fc, AV_LOG_WARNING, "invalid KAGSize %i - guessing ", partition->kag_size);
539+
540+ if (mxf->op == OPSONYOpt)
541+ partition->kag_size = 512;
542+ else
543+ partition->kag_size = 1;
544+
545+ av_log(mxf->fc, AV_LOG_WARNING, "%i\n", partition->kag_size);
546+ }
524547
525548 return 0;
526549 }
@@ -537,7 +560,7 @@ static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set) · 10 unmodified lines
537560 return 0;
538561 }
539562
540−static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid)
563+static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
541564 {
542565 MXFCryptoContext *cryptocontext = arg;
543566 if (size != 16)
@@ -547,7 +570,7 @@ static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, i · 3 unmodified lines
547570 return 0;
548571 }
549572
550−static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid)
573+static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
551574 {
552575 MXFContext *mxf = arg;
553576 switch (tag) {
@@ -565,7 +588,7 @@ static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int siz · 11 unmodified lines
565588 return 0;
566589 }
567590
568−static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid)
591+static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
569592 {
570593 MXFStructuralComponent *source_clip = arg;
571594 switch(tag) {
@@ -587,7 +610,7 @@ static int mxf_read_source_clip(void *arg, AVIOContext *pb, int tag, int size, U · 15 unmodified lines
587610 return 0;
588611 }
589612
590−static int mxf_read_material_package(void *arg, AVIOContext *pb, int tag, int size, UID uid)
613+static int mxf_read_material_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
591614 {
592615 MXFPackage *package = arg;
593616 switch(tag) {
@@ -605,7 +628,7 @@ static int mxf_read_material_package(void *arg, AVIOContext *pb, int tag, int si · 11 unmodified lines
605628 return 0;
606629 }
607630
608−static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid)
631+static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
609632 {
610633 MXFTrack *track = arg;
611634 switch(tag) {
@@ -626,7 +649,7 @@ static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid · 14 unmodified lines
626649 return 0;
627650 }
628651
629−static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid)
652+static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
630653 {
631654 MXFSequence *sequence = arg;
632655 switch(tag) {
@@ -650,7 +673,7 @@ static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID · 17 unmodified lines
650673 return 0;
651674 }
652675
653−static int mxf_read_source_package(void *arg, AVIOContext *pb, int tag, int size, UID uid)
676+static int mxf_read_source_package(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
654677 {
655678 MXFPackage *package = arg;
656679 switch(tag) {
@@ -729,7 +752,7 @@ static int mxf_read_index_entry_array(AVIOContext *pb, MXFIndexTableSegment *seg · 72 unmodified lines
729752 return 0;
730753 }
731754
732−static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid)
755+static int mxf_read_index_table_segment(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
733756 {
734757 MXFIndexTableSegment *segment = arg;
735758 switch(tag) {
@@ -792,7 +815,7 @@ static void mxf_read_pixel_layout(AVIOContext *pb, MXFDescriptor *descriptor) · 56 unmodified lines
792815 ff_mxf_decode_pixel_layout(layout, &descriptor->pix_fmt);
793816 }
794817
795−static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid)
818+static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
796819 {
797820 MXFDescriptor *descriptor = arg;
798821 switch(tag) {
@@ -1321,7 +1344,7 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF · 522 unmodified lines
13211344 }
13221345 if (ctx_size && tag == 0x3C0A)
13231346 avio_read(pb, ctx->uid, 16);
1324− else if (read_child(ctx, pb, tag, size, uid) < 0)
1347+ else if (read_child(ctx, pb, tag, size, uid, -1) < 0)
13251348 return -1;
13261349
13271350 avio_seek(pb, next, SEEK_SET);
@@ -1531,7 +1554,7 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap) · 203 unmodified lines
15311554 res = mxf_read_local_tags(mxf, &klv, metadata->read, metadata->ctx_size, metadata->type);
15321555 } else {
15331556 uint64_t next = avio_tell(s->pb) + klv.length;
1534− res = metadata->read(mxf, s->pb, 0, 0, klv.key);
1557+ res = metadata->read(mxf, s->pb, 0, klv.length, klv.key, klv.offset);
15351558 avio_seek(s->pb, next, SEEK_SET);
15361559 }
15371560 if (res < 0) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t