You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avformat/mxfenc: use track count to generate component instance uuid
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
a428f2fcd9
commit
ad2641c36b
@@ -45,7 +45,6 @@ enum MXFMetadataSetType {
|
|||||||
SubDescriptor,
|
SubDescriptor,
|
||||||
IndexTableSegment,
|
IndexTableSegment,
|
||||||
EssenceContainerData,
|
EssenceContainerData,
|
||||||
TypeBottom,// add metadata type before this
|
|
||||||
EssenceGroup,
|
EssenceGroup,
|
||||||
TaggedValue,
|
TaggedValue,
|
||||||
};
|
};
|
||||||
|
@@ -386,6 +386,7 @@ typedef struct MXFContext {
|
|||||||
uint32_t tagged_value_count;
|
uint32_t tagged_value_count;
|
||||||
AVRational audio_edit_rate;
|
AVRational audio_edit_rate;
|
||||||
int store_user_comments;
|
int store_user_comments;
|
||||||
|
int track_instance_count; // used to generate MXFTrack uuids
|
||||||
} MXFContext;
|
} MXFContext;
|
||||||
|
|
||||||
static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
|
static const uint8_t uuid_base[] = { 0xAD,0xAB,0x44,0x24,0x2f,0x25,0x4d,0xc7,0x92,0xff,0x29,0xbd };
|
||||||
@@ -853,7 +854,7 @@ static void mxf_write_track(AVFormatContext *s, AVStream *st, MXFPackage *packag
|
|||||||
|
|
||||||
// write track uid
|
// write track uid
|
||||||
mxf_write_local_tag(pb, 16, 0x3C0A);
|
mxf_write_local_tag(pb, 16, 0x3C0A);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? Track : Track + TypeBottom, st->index);
|
mxf_write_uuid(pb, Track, mxf->track_instance_count);
|
||||||
PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
|
PRINT_KEY(s, "track uid", pb->buf_ptr - 16);
|
||||||
|
|
||||||
// write track id
|
// write track id
|
||||||
@@ -884,7 +885,7 @@ static void mxf_write_track(AVFormatContext *s, AVStream *st, MXFPackage *packag
|
|||||||
|
|
||||||
// write sequence refs
|
// write sequence refs
|
||||||
mxf_write_local_tag(pb, 16, 0x4803);
|
mxf_write_local_tag(pb, 16, 0x4803);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
|
mxf_write_uuid(pb, Sequence, mxf->track_instance_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const uint8_t smpte_12m_timecode_track_data_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x01,0x01,0x00,0x00,0x00 };
|
static const uint8_t smpte_12m_timecode_track_data_ul[] = { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x01,0x03,0x02,0x01,0x01,0x00,0x00,0x00 };
|
||||||
@@ -924,7 +925,7 @@ static void mxf_write_sequence(AVFormatContext *s, AVStream *st, MXFPackage *pac
|
|||||||
klv_encode_ber_length(pb, 80);
|
klv_encode_ber_length(pb, 80);
|
||||||
|
|
||||||
mxf_write_local_tag(pb, 16, 0x3C0A);
|
mxf_write_local_tag(pb, 16, 0x3C0A);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? Sequence: Sequence + TypeBottom, st->index);
|
mxf_write_uuid(pb, Sequence, mxf->track_instance_count);
|
||||||
|
|
||||||
PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
|
PRINT_KEY(s, "sequence uid", pb->buf_ptr - 16);
|
||||||
mxf_write_common_fields(s, st);
|
mxf_write_common_fields(s, st);
|
||||||
@@ -936,9 +937,8 @@ static void mxf_write_sequence(AVFormatContext *s, AVStream *st, MXFPackage *pac
|
|||||||
component = TimecodeComponent;
|
component = TimecodeComponent;
|
||||||
else
|
else
|
||||||
component = SourceClip;
|
component = SourceClip;
|
||||||
if (package->type == SourcePackage)
|
|
||||||
component += TypeBottom;
|
mxf_write_uuid(pb, component, mxf->track_instance_count);
|
||||||
mxf_write_uuid(pb, component, st->index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
|
static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
|
||||||
@@ -951,8 +951,7 @@ static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, MXFPa
|
|||||||
|
|
||||||
// UID
|
// UID
|
||||||
mxf_write_local_tag(pb, 16, 0x3C0A);
|
mxf_write_local_tag(pb, 16, 0x3C0A);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? TimecodeComponent :
|
mxf_write_uuid(pb, TimecodeComponent, mxf->track_instance_count);
|
||||||
TimecodeComponent + TypeBottom, st->index);
|
|
||||||
|
|
||||||
mxf_write_common_fields(s, st);
|
mxf_write_common_fields(s, st);
|
||||||
|
|
||||||
@@ -971,6 +970,7 @@ static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, MXFPa
|
|||||||
|
|
||||||
static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
|
static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXFPackage *package)
|
||||||
{
|
{
|
||||||
|
MXFContext *mxf = s->priv_data;
|
||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -980,7 +980,7 @@ static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, MXF
|
|||||||
|
|
||||||
// write uid
|
// write uid
|
||||||
mxf_write_local_tag(pb, 16, 0x3C0A);
|
mxf_write_local_tag(pb, 16, 0x3C0A);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? SourceClip: SourceClip + TypeBottom, st->index);
|
mxf_write_uuid(pb, SourceClip, mxf->track_instance_count);
|
||||||
|
|
||||||
PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
|
PRINT_KEY(s, "structural component uid", pb->buf_ptr - 16);
|
||||||
mxf_write_common_fields(s, st);
|
mxf_write_common_fields(s, st);
|
||||||
@@ -1357,7 +1357,7 @@ static void mxf_write_package(AVFormatContext *s, MXFPackage *package)
|
|||||||
|
|
||||||
// write package umid
|
// write package umid
|
||||||
mxf_write_local_tag(pb, 32, 0x4401);
|
mxf_write_local_tag(pb, 32, 0x4401);
|
||||||
mxf_write_umid(s, package->type == SourcePackage);
|
mxf_write_umid(s, package->instance);
|
||||||
PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
|
PRINT_KEY(s, "package umid second part", pb->buf_ptr - 16);
|
||||||
|
|
||||||
// package name
|
// package name
|
||||||
@@ -1375,10 +1375,9 @@ static void mxf_write_package(AVFormatContext *s, MXFPackage *package)
|
|||||||
// write track refs
|
// write track refs
|
||||||
mxf_write_local_tag(pb, track_count*16 + 8, 0x4403);
|
mxf_write_local_tag(pb, track_count*16 + 8, 0x4403);
|
||||||
mxf_write_refs_count(pb, track_count);
|
mxf_write_refs_count(pb, track_count);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? Track :
|
// these are the uuids of the tracks the will be written in mxf_write_track
|
||||||
Track + TypeBottom, -1); // timecode track
|
for (i = 0; i < track_count; i++)
|
||||||
for (i = 0; i < s->nb_streams; i++)
|
mxf_write_uuid(pb, Track, mxf->track_instance_count + i);
|
||||||
mxf_write_uuid(pb, package->type == MaterialPackage ? Track : Track + TypeBottom, i);
|
|
||||||
|
|
||||||
// write user comment refs
|
// write user comment refs
|
||||||
if (mxf->store_user_comments) {
|
if (mxf->store_user_comments) {
|
||||||
@@ -1398,16 +1397,26 @@ static void mxf_write_package(AVFormatContext *s, MXFPackage *package)
|
|||||||
mxf_write_uuid(pb, SubDescriptor, 0);
|
mxf_write_uuid(pb, SubDescriptor, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* for every 1 track in a package there is 1 sequence and 1 component.
|
||||||
|
* all 3 of these elements share the same instance number for generating
|
||||||
|
* there instance uuids. mxf->track_instance_count stores this value.
|
||||||
|
* mxf->track_instance_count is incremented after a group of all 3 of
|
||||||
|
* these elements are written.
|
||||||
|
*/
|
||||||
|
|
||||||
// write timecode track
|
// write timecode track
|
||||||
mxf_write_track(s, mxf->timecode_track, package);
|
mxf_write_track(s, mxf->timecode_track, package);
|
||||||
mxf_write_sequence(s, mxf->timecode_track, package);
|
mxf_write_sequence(s, mxf->timecode_track, package);
|
||||||
mxf_write_timecode_component(s, mxf->timecode_track, package);
|
mxf_write_timecode_component(s, mxf->timecode_track, package);
|
||||||
|
mxf->track_instance_count++;
|
||||||
|
|
||||||
for (i = 0; i < s->nb_streams; i++) {
|
for (i = 0; i < s->nb_streams; i++) {
|
||||||
AVStream *st = s->streams[i];
|
AVStream *st = s->streams[i];
|
||||||
mxf_write_track(s, st, package);
|
mxf_write_track(s, st, package);
|
||||||
mxf_write_sequence(s, st, package);
|
mxf_write_sequence(s, st, package);
|
||||||
mxf_write_structural_component(s, st, package);
|
mxf_write_structural_component(s, st, package);
|
||||||
|
mxf->track_instance_count++;
|
||||||
|
|
||||||
if (package->type == SourcePackage) {
|
if (package->type == SourcePackage) {
|
||||||
MXFStreamContext *sc = st->priv_data;
|
MXFStreamContext *sc = st->priv_data;
|
||||||
@@ -1440,14 +1449,16 @@ static int mxf_write_essence_container_data(AVFormatContext *s)
|
|||||||
|
|
||||||
static int mxf_write_header_metadata_sets(AVFormatContext *s)
|
static int mxf_write_header_metadata_sets(AVFormatContext *s)
|
||||||
{
|
{
|
||||||
|
MXFContext *mxf = s->priv_data;
|
||||||
AVDictionaryEntry *entry = NULL;
|
AVDictionaryEntry *entry = NULL;
|
||||||
AVStream *st = NULL;
|
AVStream *st = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
MXFPackage packages[2] = {};
|
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;
|
||||||
|
|
||||||
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;
|
||||||
@@ -1468,6 +1479,7 @@ static int mxf_write_header_metadata_sets(AVFormatContext *s)
|
|||||||
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);
|
||||||
|
mxf->track_instance_count = 0;
|
||||||
for (i = 0; i < package_count; i++)
|
for (i = 0; i < package_count; i++)
|
||||||
mxf_write_package(s, &packages[i]);
|
mxf_write_package(s, &packages[i]);
|
||||||
mxf_write_essence_container_data(s);
|
mxf_write_essence_container_data(s);
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
d51f6bcc96885a2ce8517ae8c774f610 *tests/data/fate/copy-trac4914.mxf
|
05fdc4a6e28abb2c26e96224682d2684 *tests/data/fate/copy-trac4914.mxf
|
||||||
560697 tests/data/fate/copy-trac4914.mxf
|
560697 tests/data/fate/copy-trac4914.mxf
|
||||||
#tb 0: 1001/30000
|
#tb 0: 1001/30000
|
||||||
#media_type 0: video
|
#media_type 0: video
|
||||||
|
@@ -1 +1 @@
|
|||||||
d26a35b141551b36c5b8bd716451cfcb
|
f97551f884df5ab709c5869c66c7b9bc
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
1c06a9d69b6e309579784db5ecb0b69f *./tests/data/lavf/lavf.mxf
|
d4140129463dec64bdb4a7d7ad1b0c82 *./tests/data/lavf/lavf.mxf
|
||||||
525369 ./tests/data/lavf/lavf.mxf
|
525369 ./tests/data/lavf/lavf.mxf
|
||||||
./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
|
./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
|
||||||
50b4f9ca0493e6d83f4c52dc3aa2b7a5 *./tests/data/lavf/lavf.mxf
|
a27bb8cd5e185ea13b0a8daa4eb221cd *./tests/data/lavf/lavf.mxf
|
||||||
560697 ./tests/data/lavf/lavf.mxf
|
560697 ./tests/data/lavf/lavf.mxf
|
||||||
./tests/data/lavf/lavf.mxf CRC=0xf21b1b48
|
./tests/data/lavf/lavf.mxf CRC=0xf21b1b48
|
||||||
4b71b154ae37364c8028cb50850a54c5 *./tests/data/lavf/lavf.mxf
|
395bf0047c97ceca96935357166b94c7 *./tests/data/lavf/lavf.mxf
|
||||||
525369 ./tests/data/lavf/lavf.mxf
|
525369 ./tests/data/lavf/lavf.mxf
|
||||||
./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
|
./tests/data/lavf/lavf.mxf CRC=0x8dddfaab
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
73c0cb416548c33d0651c59519a8f7e2 *./tests/data/lavf/lavf.mxf_d10
|
f4694941b0cd5b5e3c91064d84dbd345 *./tests/data/lavf/lavf.mxf_d10
|
||||||
5330989 ./tests/data/lavf/lavf.mxf_d10
|
5330989 ./tests/data/lavf/lavf.mxf_d10
|
||||||
./tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488
|
./tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
1871bd11947924116776201f24fd0adf *./tests/data/lavf/lavf.mxf_dv25
|
1ca8143bf6cf322fd39f6e856959d502 *./tests/data/lavf/lavf.mxf_dv25
|
||||||
3833389 ./tests/data/lavf/lavf.mxf_dv25
|
3833389 ./tests/data/lavf/lavf.mxf_dv25
|
||||||
./tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52
|
./tests/data/lavf/lavf.mxf_dv25 CRC=0xbdaf7f52
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
6c9cb62911ac16c3b55f0ad0b052c05b *./tests/data/lavf/lavf.mxf_dvcpro50
|
987fd4b2abb36433fba0e35f4092efc6 *./tests/data/lavf/lavf.mxf_dvcpro50
|
||||||
7430189 ./tests/data/lavf/lavf.mxf_dvcpro50
|
7430189 ./tests/data/lavf/lavf.mxf_dvcpro50
|
||||||
./tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4
|
./tests/data/lavf/lavf.mxf_dvcpro50 CRC=0xe3bbe4b4
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
962c2cd582340f8961a8283636093abf *./tests/data/lavf/lavf.mxf_opatom
|
b8fe60f7457b83709f33357d04c8db0c *./tests/data/lavf/lavf.mxf_opatom
|
||||||
4717113 ./tests/data/lavf/lavf.mxf_opatom
|
4717113 ./tests/data/lavf/lavf.mxf_opatom
|
||||||
./tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a
|
./tests/data/lavf/lavf.mxf_opatom CRC=0xf55aa22a
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
d4ad5a0faf410a9d9e99b3328143e89d *./tests/data/lavf/lavf.mxf_opatom_audio
|
e7da52bd591e6eddb4e1af381a4e5bd4 *./tests/data/lavf/lavf.mxf_opatom_audio
|
||||||
101945 ./tests/data/lavf/lavf.mxf_opatom_audio
|
101945 ./tests/data/lavf/lavf.mxf_opatom_audio
|
||||||
./tests/data/lavf/lavf.mxf_opatom_audio CRC=0xd155c6ff
|
./tests/data/lavf/lavf.mxf_opatom_audio CRC=0xd155c6ff
|
||||||
|
Reference in New Issue
Block a user