On 2017-11-29 05:11, Mark Reid wrote:
---
libavformat/mxf.h| 1 +
libavformat/mxfenc.c | 42 +++---
2 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/libavformat/mxf.h b/libavformat/mxf.h
index 2d5b44943b..ffcc429a8b 100644
--- a/libavformat/mxf.h
+++ b/libavformat/mxf.h
@@ -47,6 +47,7 @@ enum MXFMetadataSetType {
EssenceContainerData,
EssenceGroup,
TaggedValue,
+TapeDescriptor,
};
enum MXFFrameLayout {
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index baaeb8c617..02192aa22b 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -105,6 +105,7 @@ typedef struct MXFPackage {
char *name;
enum MXFMetadataSetType type;
int instance;
+struct MXFPackage *ref;
} MXFPackage;
enum ULIndex {
@@ -991,20 +992,33 @@ static void
mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXF
// write source package uid, end of the reference
mxf_write_local_tag(pb, 32, 0x1101);
-if (package->type == SourcePackage) {
+if (!package->ref) {
for (i = 0; i < 4; i++)
avio_wb64(pb, 0);
} else
-mxf_write_umid(s, 1);
+mxf_write_umid(s, package->ref->instance);
// write source track id
mxf_write_local_tag(pb, 4, 0x1102);
-if (package->type == SourcePackage)
+if (package->type == SourcePackage && !package->ref)
avio_wb32(pb, 0);
else
avio_wb32(pb, st->index+2);
}
+static void mxf_write_tape_descriptor(AVFormatContext *s)
+{
+AVIOContext *pb = s->pb;
+
+mxf_write_metadata_key(pb, 0x012e00);
+PRINT_KEY(s, "tape descriptor key", pb->buf_ptr - 16);
+klv_encode_ber_length(pb, 20);
+mxf_write_local_tag(pb, 16, 0x3C0A);
+mxf_write_uuid(pb, TapeDescriptor, 0);
+PRINT_KEY(s, "tape_desc uid", pb->buf_ptr - 16);
+}
+
+
static void mxf_write_multi_descriptor(AVFormatContext *s)
{
MXFContext *mxf = s->priv_data;
@@ -1388,13 +1402,17 @@ static void mxf_write_package(AVFormatContext *s,
MXFPackage *package)
}
// write multiple descriptor reference
-if (package->type == SourcePackage) {
+if (package->type == SourcePackage && package->instance == 1) {
mxf_write_local_tag(pb, 16, 0x4701);
if (s->nb_streams > 1) {
mxf_write_uuid(pb, MultipleDescriptor, 0);
mxf_write_multi_descriptor(s);
} else
mxf_write_uuid(pb, SubDescriptor, 0);
+} else if (package->type == SourcePackage && package->instance == 2) {
+mxf_write_local_tag(pb, 16, 0x4701);
+mxf_write_uuid(pb, TapeDescriptor, 0);
+mxf_write_tape_descriptor(s);
}
// write timecode track
@@ -1410,7 +1428,7 @@ static void mxf_write_package(AVFormatContext *s,
MXFPackage *package)
mxf_write_structural_component(s, st, package);
mxf->track_uuid_offset++;
-if (package->type == SourcePackage) {
+if (package->type == SourcePackage && package->instance == 1) {
MXFStreamContext *sc = st->priv_data;
mxf_essence_container_uls[sc->index].write_desc(s, st);
}
@@ -1445,12 +1463,13 @@ static int
mxf_write_header_metadata_sets(AVFormatContext *s)
AVDictionaryEntry *entry = NULL;
AVStream *st = NULL;
int i;
-
-MXFPackage packages[2] = {};
+MXFPackage packages[3] = {};
int package_count = 2;
packages[0].type = MaterialPackage;
packages[1].type = SourcePackage;
packages[1].instance = 1;
+packages[0].ref = [1];
+
if (entry = av_dict_get(s->metadata, "material_package_name", NULL, 0))
packages[0].name = entry->value;
@@ -1468,6 +1487,15 @@ static int
mxf_write_header_metadata_sets(AVFormatContext *s)
}
}
+entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
+if (entry) {
+packages[2].name = entry->value;
+packages[2].type = SourcePackage;
+packages[2].instance = 2;
+packages[1].ref = [2];
+package_count = 3;
+}
+
mxf_write_preface(s);
mxf_write_identification(s);
mxf_write_content_storage(s, packages, package_count);
Looks OK
/Tomas
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel