#include "avformat.h"
#include "aes.h"
+#include "bytestream.h"
typedef uint8_t UID[16];
MultipleDescriptor,
Descriptor,
Track,
- EssenceContainerData,
CryptoContext,
};
-typedef struct MXFCryptoContext {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID context_uid;
UID source_container_ul;
} MXFCryptoContext;
-typedef struct MXFStructuralComponent {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID source_package_uid;
int source_track_id;
} MXFStructuralComponent;
-typedef struct MXFSequence {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID data_definition_ul;
int64_t duration;
} MXFSequence;
-typedef struct MXFTrack {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
MXFSequence *sequence; /* mandatory, and only one */
AVRational edit_rate;
} MXFTrack;
-typedef struct MXFDescriptor {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID essence_container_ul;
int extradata_size;
} MXFDescriptor;
-typedef struct MXFPackage {
+typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID package_uid;
UID descriptor_ref;
} MXFPackage;
-typedef struct MXFEssenceContainerData {
- UID uid;
- enum MXFMetadataSetType type;
- UID linked_package_uid;
-} MXFEssenceContainerData;
-
typedef struct {
UID uid;
enum MXFMetadataSetType type;
} MXFMetadataSet;
-typedef struct MXFContext {
+typedef struct {
UID *packages_refs;
int packages_count;
MXFMetadataSet **metadata_sets;
struct AVAES *aesc;
} MXFContext;
-typedef struct KLVPacket {
+typedef struct {
UID key;
offset_t offset;
uint64_t length;
Clip,
};
-typedef struct MXFCodecUL {
+typedef struct {
UID uid;
enum CodecID id;
enum MXFWrappingScheme wrapping;
} MXFCodecUL;
-typedef struct MXFDataDefinitionUL {
+typedef struct {
UID uid;
enum CodecType type;
} MXFDataDefinitionUL;
-typedef struct MXFMetadataReadTableEntry {
+typedef struct {
const UID key;
int (*read)();
int ctx_size;
{
uint8_t buffer[61444];
uint8_t *buf_ptr, *end_ptr, *data_ptr;
+ int i;
if (length > 61444) /* worst case PAL 1920 samples 8 channels */
return -1;
data_ptr = pkt->data;
end_ptr = buffer + length;
buf_ptr = buffer + 4; /* skip SMPTE 331M header */
- for (; buf_ptr < end_ptr; buf_ptr += 4) {
- if (st->codec->bits_per_sample == 24) {
- data_ptr[0] = (buf_ptr[2] >> 4) | ((buf_ptr[3] & 0x0f) << 4);
- data_ptr[1] = (buf_ptr[1] >> 4) | ((buf_ptr[2] & 0x0f) << 4);
- data_ptr[2] = (buf_ptr[0] >> 4) | ((buf_ptr[1] & 0x0f) << 4);
- data_ptr += 3;
- } else {
- data_ptr[0] = (buf_ptr[2] >> 4) | ((buf_ptr[3] & 0x0f) << 4);
- data_ptr[1] = (buf_ptr[1] >> 4) | ((buf_ptr[2] & 0x0f) << 4);
- data_ptr += 2;
+ for (; buf_ptr < end_ptr; ) {
+ for (i = 0; i < st->codec->channels; i++) {
+ uint32_t sample = bytestream_get_le32(&buf_ptr);
+ if (st->codec->bits_per_sample == 24)
+ bytestream_put_le24(&data_ptr, (sample >> 4) & 0xffffff);
+ else
+ bytestream_put_le16(&data_ptr, (sample >> 12) & 0xffff);
}
+ buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M
}
pkt->size = data_ptr - pkt->data;
return 0;
} else
url_fskip(&s->pb, klv.length);
}
- return AVERROR_IO;
+ return AVERROR(EIO);
}
static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x05 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 30Mbps PAL */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x03 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 40Mbps PAL */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x01 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 50Mbps PAL */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x06 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 30Mbps NTSC */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x04 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 40Mbps NTSC */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x02,0x02,0x01,0x02,0x01,0x02 }, CODEC_ID_MPEG2VIDEO, Frame }, /* D-10 50Mbps NTSC */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML I-Frame */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML Long GoP */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0x40,0x01 }, CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0x40 ??? stream id */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x01 }, CODEC_ID_MP2, Frame }, /* MPEG-ES Frame wrapped, 0xc0 MPA stream id */
{ { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x02,0x0D,0x01,0x03,0x01,0x02,0x04,0xc0,0x02 }, CODEC_ID_MP2, Clip }, /* MPEG-ES Clip wrapped, 0xc0 MPA stream id */
- { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, CODEC_ID_PCM_S16BE, Frame }, /* D-10 Mapping 30Mbps PAL Extended Template */
- { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, CODEC_ID_PCM_S16BE, Frame }, /* D-10 Mapping 40Mbps PAL Extended Template */
- { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, CODEC_ID_PCM_S16BE, Frame }, /* D-10 Mapping 50Mbps PAL Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x05,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 30Mbps PAL Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x03,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 40Mbps PAL Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x01,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 50Mbps PAL Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x06,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 30Mbps NTSC Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x04,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 40Mbps NTSC Extended Template */
+ { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x0D,0x01,0x03,0x01,0x02,0x01,0x02,0x01 }, CODEC_ID_PCM_S16LE, Frame }, /* D-10 Mapping 50Mbps NTSC Extended Template */
{ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, CODEC_ID_NONE, Frame },
};
st->codec->codec_id = CODEC_ID_PCM_S24BE;
else if (descriptor->bits_per_sample == 32)
st->codec->codec_id = CODEC_ID_PCM_S32BE;
- if (descriptor->essence_container_ul[13] == 0x01) /* D-10 Mapping */
- st->codec->channels = 8; /* force channels to 8 */
} else if (st->codec->codec_id == CODEC_ID_MP2) {
st->need_parsing = AVSTREAM_PARSE_FULL;
}