Commit 659713bf authored by Baptiste Coudurier's avatar Baptiste Coudurier

use index 0 for timecode track and write it in source package also

Originally committed as revision 17415 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 6c53bf63
...@@ -573,7 +573,7 @@ static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSe ...@@ -573,7 +573,7 @@ static void mxf_write_track(AVFormatContext *s, AVStream *st, enum MXFMetadataSe
// write track id // write track id
mxf_write_local_tag(pb, 4, 0x4801); mxf_write_local_tag(pb, 4, 0x4801);
put_be32(pb, st->index); put_be32(pb, st->index+1);
// write track number // write track number
mxf_write_local_tag(pb, 4, 0x4804); mxf_write_local_tag(pb, 4, 0x4804);
...@@ -637,14 +637,14 @@ static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadat ...@@ -637,14 +637,14 @@ static void mxf_write_sequence(AVFormatContext *s, AVStream *st, enum MXFMetadat
mxf_write_refs_count(pb, 1); mxf_write_refs_count(pb, 1);
if (st == mxf->timecode_track) if (st == mxf->timecode_track)
component = TimecodeComponent; component = TimecodeComponent;
else if (type == MaterialPackage)
component = SourceClip;
else else
component = SourceClip+TypeBottom; component = SourceClip;
if (type == SourcePackage)
component += TypeBottom;
mxf_write_uuid(pb, component, st->index); mxf_write_uuid(pb, component, st->index);
} }
static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st) static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st, enum MXFMetadataSetType type)
{ {
MXFContext *mxf = s->priv_data; MXFContext *mxf = s->priv_data;
ByteIOContext *pb = s->pb; ByteIOContext *pb = s->pb;
...@@ -654,7 +654,8 @@ static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st) ...@@ -654,7 +654,8 @@ static void mxf_write_timecode_component(AVFormatContext *s, AVStream *st)
// UID // UID
mxf_write_local_tag(pb, 16, 0x3C0A); mxf_write_local_tag(pb, 16, 0x3C0A);
mxf_write_uuid(pb, TimecodeComponent, st->index); mxf_write_uuid(pb, type == MaterialPackage ? TimecodeComponent :
TimecodeComponent + TypeBottom, st->index);
mxf_write_common_fields(s, st); mxf_write_common_fields(s, st);
...@@ -704,7 +705,7 @@ static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enu ...@@ -704,7 +705,7 @@ static void mxf_write_structural_component(AVFormatContext *s, AVStream *st, enu
if (type == SourcePackage) if (type == SourcePackage)
put_be32(pb, 0); put_be32(pb, 0);
else else
put_be32(pb, st->index); put_be32(pb, st->index+1);
} }
static void mxf_write_multi_descriptor(AVFormatContext *s) static void mxf_write_multi_descriptor(AVFormatContext *s)
...@@ -757,7 +758,7 @@ static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID k ...@@ -757,7 +758,7 @@ static void mxf_write_generic_desc(AVFormatContext *s, AVStream *st, const UID k
mxf_write_uuid(pb, SubDescriptor, st->index); mxf_write_uuid(pb, SubDescriptor, st->index);
mxf_write_local_tag(pb, 4, 0x3006); mxf_write_local_tag(pb, 4, 0x3006);
put_be32(pb, st->index); put_be32(pb, st->index+1);
mxf_write_local_tag(pb, 8, 0x3001); mxf_write_local_tag(pb, 8, 0x3001);
put_be32(pb, mxf->time_base.den); put_be32(pb, mxf->time_base.den);
...@@ -916,15 +917,13 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) ...@@ -916,15 +917,13 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
{ {
MXFContext *mxf = s->priv_data; MXFContext *mxf = s->priv_data;
ByteIOContext *pb = s->pb; ByteIOContext *pb = s->pb;
int i, track_count; int i, track_count = s->nb_streams+1;
if (type == MaterialPackage) { if (type == MaterialPackage) {
track_count = s->nb_streams + 1; // add timecode track
mxf_write_metadata_key(pb, 0x013600); mxf_write_metadata_key(pb, 0x013600);
PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16); PRINT_KEY(s, "Material Package key", pb->buf_ptr - 16);
klv_encode_ber_length(pb, 92 + 16*track_count); klv_encode_ber_length(pb, 92 + 16*track_count);
} else { } else {
track_count = s->nb_streams;
mxf_write_metadata_key(pb, 0x013700); mxf_write_metadata_key(pb, 0x013700);
PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16); PRINT_KEY(s, "Source Package key", pb->buf_ptr - 16);
klv_encode_ber_length(pb, 112 + 16*track_count); // 20 bytes length for descriptor reference klv_encode_ber_length(pb, 112 + 16*track_count); // 20 bytes length for descriptor reference
...@@ -952,10 +951,10 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) ...@@ -952,10 +951,10 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
// 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, type == MaterialPackage ? Track :
Track + TypeBottom, -1); // timecode track
for (i = 0; i < s->nb_streams; i++) for (i = 0; i < s->nb_streams; i++)
mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i); mxf_write_uuid(pb, type == MaterialPackage ? Track : Track + TypeBottom, i);
if (type == MaterialPackage)
mxf_write_uuid(pb, Track, s->nb_streams); // timecode track
// write multiple descriptor reference // write multiple descriptor reference
if (type == SourcePackage) { if (type == SourcePackage) {
...@@ -965,13 +964,13 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type) ...@@ -965,13 +964,13 @@ static void mxf_write_package(AVFormatContext *s, enum MXFMetadataSetType type)
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 {
// write timecode track
mxf_write_track(s, mxf->timecode_track, type);
mxf_write_sequence(s, mxf->timecode_track, type);
mxf_write_timecode_component(s, mxf->timecode_track);
} }
// write timecode track
mxf_write_track(s, mxf->timecode_track, type);
mxf_write_sequence(s, mxf->timecode_track, type);
mxf_write_timecode_component(s, mxf->timecode_track, type);
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, type); mxf_write_track(s, st, type);
...@@ -1498,7 +1497,7 @@ static int mxf_write_header(AVFormatContext *s) ...@@ -1498,7 +1497,7 @@ static int mxf_write_header(AVFormatContext *s)
mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext)); mxf->timecode_track->priv_data = av_mallocz(sizeof(MXFStreamContext));
if (!mxf->timecode_track->priv_data) if (!mxf->timecode_track->priv_data)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
mxf->timecode_track->index = s->nb_streams; mxf->timecode_track->index = -1;
if (!samples_per_frame) if (!samples_per_frame)
samples_per_frame = PAL_samples_per_frame; samples_per_frame = PAL_samples_per_frame;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment