avformat/mxfenc: write reel_name if metadata key is present
Reviewed-by: Tomas Härdin <tjoppen@acc.umu.se> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
committed by
Michael Niedermayer
parent
ad2641c36b
commit
901d87aa83
@@ -47,6 +47,7 @@ enum MXFMetadataSetType {
|
|||||||
EssenceContainerData,
|
EssenceContainerData,
|
||||||
EssenceGroup,
|
EssenceGroup,
|
||||||
TaggedValue,
|
TaggedValue,
|
||||||
|
TapeDescriptor,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MXFFrameLayout {
|
enum MXFFrameLayout {
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ typedef struct MXFPackage {
|
|||||||
char *name;
|
char *name;
|
||||||
enum MXFMetadataSetType type;
|
enum MXFMetadataSetType type;
|
||||||
int instance;
|
int instance;
|
||||||
|
struct MXFPackage *ref;
|
||||||
} MXFPackage;
|
} MXFPackage;
|
||||||
|
|
||||||
enum ULIndex {
|
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
|
// write source package uid, end of the reference
|
||||||
mxf_write_local_tag(pb, 32, 0x1101);
|
mxf_write_local_tag(pb, 32, 0x1101);
|
||||||
if (package->type == SourcePackage) {
|
if (!package->ref) {
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
avio_wb64(pb, 0);
|
avio_wb64(pb, 0);
|
||||||
} else
|
} else
|
||||||
mxf_write_umid(s, 1);
|
mxf_write_umid(s, package->ref->instance);
|
||||||
|
|
||||||
// write source track id
|
// write source track id
|
||||||
mxf_write_local_tag(pb, 4, 0x1102);
|
mxf_write_local_tag(pb, 4, 0x1102);
|
||||||
if (package->type == SourcePackage)
|
if (package->type == SourcePackage && !package->ref)
|
||||||
avio_wb32(pb, 0);
|
avio_wb32(pb, 0);
|
||||||
else
|
else
|
||||||
avio_wb32(pb, st->index+2);
|
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)
|
static void mxf_write_multi_descriptor(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
MXFContext *mxf = s->priv_data;
|
MXFContext *mxf = s->priv_data;
|
||||||
@@ -1388,13 +1402,17 @@ static void mxf_write_package(AVFormatContext *s, MXFPackage *package)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// write multiple descriptor reference
|
// write multiple descriptor reference
|
||||||
if (package->type == SourcePackage) {
|
if (package->type == SourcePackage && package->instance == 1) {
|
||||||
mxf_write_local_tag(pb, 16, 0x4701);
|
mxf_write_local_tag(pb, 16, 0x4701);
|
||||||
if (s->nb_streams > 1) {
|
if (s->nb_streams > 1) {
|
||||||
mxf_write_uuid(pb, MultipleDescriptor, 0);
|
mxf_write_uuid(pb, MultipleDescriptor, 0);
|
||||||
mxf_write_multi_descriptor(s);
|
mxf_write_multi_descriptor(s);
|
||||||
} else
|
} else
|
||||||
mxf_write_uuid(pb, SubDescriptor, 0);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1418,7 +1436,7 @@ static void mxf_write_package(AVFormatContext *s, MXFPackage *package)
|
|||||||
mxf_write_structural_component(s, st, package);
|
mxf_write_structural_component(s, st, package);
|
||||||
mxf->track_instance_count++;
|
mxf->track_instance_count++;
|
||||||
|
|
||||||
if (package->type == SourcePackage) {
|
if (package->type == SourcePackage && package->instance == 1) {
|
||||||
MXFStreamContext *sc = st->priv_data;
|
MXFStreamContext *sc = st->priv_data;
|
||||||
mxf_essence_container_uls[sc->index].write_desc(s, st);
|
mxf_essence_container_uls[sc->index].write_desc(s, st);
|
||||||
}
|
}
|
||||||
@@ -1453,12 +1471,13 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s)
|
|||||||
AVDictionaryEntry *entry = NULL;
|
AVDictionaryEntry *entry = NULL;
|
||||||
AVStream *st = NULL;
|
AVStream *st = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
MXFPackage packages[3] = {{0}};
|
||||||
MXFPackage packages[2] = {{0}};
|
|
||||||
int package_count = 2;
|
int package_count = 2;
|
||||||
packages[0].type = MaterialPackage;
|
packages[0].type = MaterialPackage;
|
||||||
packages[1].type = SourcePackage;
|
packages[1].type = SourcePackage;
|
||||||
packages[1].instance = 1;
|
packages[1].instance = 1;
|
||||||
|
packages[0].ref = &packages[1];
|
||||||
|
|
||||||
|
|
||||||
if (entry = av_dict_get(s->metadata, "material_package_name", NULL, 0))
|
if (entry = av_dict_get(s->metadata, "material_package_name", NULL, 0))
|
||||||
packages[0].name = entry->value;
|
packages[0].name = entry->value;
|
||||||
@@ -1476,6 +1495,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 = &packages[2];
|
||||||
|
package_count = 3;
|
||||||
|
}
|
||||||
|
|
||||||
mxf_write_preface(s);
|
mxf_write_preface(s);
|
||||||
mxf_write_identification(s);
|
mxf_write_identification(s);
|
||||||
mxf_write_content_storage(s, packages, package_count);
|
mxf_write_content_storage(s, packages, package_count);
|
||||||
|
|||||||
Reference in New Issue
Block a user