~ubuntu-branches/ubuntu/utopic/ffmpeg-debian/utopic

« back to all changes in this revision

Viewing changes to libavformat/mxfdec.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-01-20 09:20:53 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090120092053-izz63p40hc98qfgp
Tags: 3:0.svn20090119-1ubuntu1
* merge from debian. LP: #318501
* new version fixes CVE-2008-3230, LP: #253767

Show diffs side-by-side

added added

removed removed

Lines of Context:
104
104
typedef struct {
105
105
    UID uid;
106
106
    enum MXFMetadataSetType type;
 
107
} MXFIndexTableSegment;
 
108
 
 
109
typedef struct {
 
110
    UID uid;
 
111
    enum MXFMetadataSetType type;
107
112
    UID package_uid;
108
113
    UID *tracks_refs;
109
114
    int tracks_count;
300
305
        if (klv_read_packet(&klv, s->pb) < 0)
301
306
            return -1;
302
307
        PRINT_KEY(s, "read packet", klv.key);
 
308
        dprintf(s, "size %lld offset %#llx\n", klv.length, klv.offset);
303
309
        if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key)) {
304
310
            int res = mxf_decrypt_triplet(s, pkt, &klv);
305
311
            if (res < 0) {
496
502
    return 0;
497
503
}
498
504
 
 
505
static int mxf_read_index_table_segment(MXFIndexTableSegment *segment, ByteIOContext *pb, int tag)
 
506
{
 
507
    switch(tag) {
 
508
    case 0x3F05: dprintf(NULL, "EditUnitByteCount %d\n", get_be32(pb)); break;
 
509
    case 0x3F06: dprintf(NULL, "IndexSID %d\n", get_be32(pb)); break;
 
510
    case 0x3F07: dprintf(NULL, "BodySID %d\n", get_be32(pb)); break;
 
511
    case 0x3F0B: dprintf(NULL, "IndexEditRate %d/%d\n", get_be32(pb), get_be32(pb)); break;
 
512
    case 0x3F0C: dprintf(NULL, "IndexStartPosition %lld\n", get_be64(pb)); break;
 
513
    case 0x3F0D: dprintf(NULL, "IndexDuration %lld\n", get_be64(pb)); break;
 
514
    }
 
515
    return 0;
 
516
}
 
517
 
499
518
static void mxf_read_pixel_layout(ByteIOContext *pb, MXFDescriptor *descriptor)
500
519
{
501
520
    int code;
502
521
 
503
522
    do {
504
523
        code = get_byte(pb);
505
 
        dprintf(NULL, "pixel layout: code 0x%x\n", code);
 
524
        dprintf(NULL, "pixel layout: code %#x\n", code);
506
525
        switch (code) {
507
526
        case 0x52: /* R */
508
527
            descriptor->bits_per_sample += get_byte(pb);
837
856
    { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
838
857
    { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
839
858
    { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
 
859
    { { 0x06,0x0E,0x2B,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
840
860
    { { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
841
861
};
842
862
 
854
874
        uint64_t next = url_ftell(pb) + size;
855
875
        UID uid = {0};
856
876
 
 
877
        dprintf(mxf->fc, "local tag %#04x size %d\n", tag, size);
857
878
        if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
858
 
            av_log(mxf->fc, AV_LOG_ERROR, "local tag 0x%04X with 0 size\n", tag);
 
879
            av_log(mxf->fc, AV_LOG_ERROR, "local tag %#04x with 0 size\n", tag);
859
880
            continue;
860
881
        }
861
882
        if (tag > 0x7FFF) { /* dynamic tag */
864
885
                int local_tag = AV_RB16(mxf->local_tags+i*18);
865
886
                if (local_tag == tag) {
866
887
                    memcpy(uid, mxf->local_tags+i*18+2, 16);
867
 
                    dprintf(mxf->fc, "local tag 0x%04X\n", local_tag);
 
888
                    dprintf(mxf->fc, "local tag %#04x\n", local_tag);
868
889
                    PRINT_KEY(mxf->fc, "uid", uid);
869
890
                }
870
891
            }
897
918
        if (klv_read_packet(&klv, s->pb) < 0)
898
919
            return -1;
899
920
        PRINT_KEY(s, "read header", klv.key);
 
921
        dprintf(s, "size %lld offset %#llx\n", klv.length, klv.offset);
900
922
        if (IS_KLV_KEY(klv.key, mxf_encrypted_triplet_key) ||
901
923
            IS_KLV_KEY(klv.key, mxf_essence_element_key)) {
902
924
            /* FIXME avoid seek */