static const uint8_t mxf_crypto_source_container_ul[] = { 0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x02,0x02,0x00,0x00,0x00 };
static const uint8_t mxf_encrypted_triplet_key[] = { 0x06,0x0e,0x2b,0x34,0x02,0x04,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x7e,0x01,0x00 };
static const uint8_t mxf_encrypted_essence_container[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x07,0x0d,0x01,0x03,0x01,0x02,0x0b,0x01,0x00 };
+static const uint8_t mxf_sony_mpeg4_extradata[] = { 0x06,0x0e,0x2b,0x34,0x04,0x01,0x01,0x01,0x0e,0x06,0x06,0x02,0x02,0x01,0x00,0x00 };
#define IS_KLV_KEY(x, y) (!memcmp(x, y, sizeof(y)))
static int mxf_get_d10_aes3_packet(ByteIOContext *pb, AVStream *st, AVPacket *pkt, int64_t length)
{
uint8_t buffer[61444];
- uint8_t *buf_ptr, *end_ptr, *data_ptr;
+ const uint8_t *buf_ptr, *end_ptr;
+ uint8_t *data_ptr;
int i;
if (length > 61444) /* worst case PAL 1920 samples 8 channels */
} while (code != 0); /* SMPTE 377M E.2.46 */
}
-static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size)
+static int mxf_read_generic_descriptor(MXFDescriptor *descriptor, ByteIOContext *pb, int tag, int size, UID uid)
{
switch(tag) {
case 0x3F01:
case 0x3401:
mxf_read_pixel_layout(pb, descriptor);
break;
- case 0x8201: /* Private tag used by SONY C0023S01.mxf */
- descriptor->extradata = av_malloc(size);
- if (!descriptor->extradata)
- return -1;
- descriptor->extradata_size = size;
- get_buffer(pb, descriptor->extradata, size);
+ default:
+ /* Private uid used by SONY C0023S01.mxf */
+ if (IS_KLV_KEY(uid, mxf_sony_mpeg4_extradata)) {
+ descriptor->extradata = av_malloc(size);
+ if (!descriptor->extradata)
+ return -1;
+ descriptor->extradata_size = size;
+ get_buffer(pb, descriptor->extradata, size);
+ }
break;
}
return 0;
int tag = get_be16(pb);
int size = get_be16(pb); /* KLV specified by 0x53 */
uint64_t next = url_ftell(pb) + size;
- UID uid;
+ UID uid = {0};
if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */
av_log(mxf->fc, AV_LOG_ERROR, "local tag 0x%04X with 0 size\n", tag);
}
if (ctx_size && tag == 0x3C0A)
get_buffer(pb, ctx->uid, 16);
- else
- read_child(ctx, pb, tag, size, uid);
+ else if (read_child(ctx, pb, tag, size, uid) < 0)
+ return -1;
url_fseek(pb, next, SEEK_SET);
}