Skip to content

Commit

Permalink
libavformat/mxfdec: read source timecode from pulldown component
Browse files Browse the repository at this point in the history
Reviewed-by: Tomas Härdin <[email protected]>
Signed-off-by: Michael Niedermayer <[email protected]>
  • Loading branch information
markreidvfx authored and michaelni committed Oct 25, 2014
1 parent a6555f8 commit 90bf1e3
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 6 deletions.
1 change: 1 addition & 0 deletions libavformat/mxf.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ enum MXFMetadataSetType {
SourcePackage,
SourceClip,
TimecodeComponent,
PulldownComponent,
Sequence,
MultipleDescriptor,
Descriptor,
Expand Down
31 changes: 29 additions & 2 deletions libavformat/mxfdec.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@ typedef struct {
AVTimecode tc;
} MXFTimecodeComponent;

typedef struct {
UID uid;
enum MXFMetadataSetType type;
UID input_segment_ref;
} MXFPulldownComponent;

typedef struct {
UID uid;
enum MXFMetadataSetType type;
Expand Down Expand Up @@ -693,6 +699,17 @@ static int mxf_read_timecode_component(void *arg, AVIOContext *pb, int tag, int
return 0;
}

static int mxf_read_pulldown_component(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
MXFPulldownComponent *mxf_pulldown = arg;
switch(tag) {
case 0x0d01:
avio_read(pb, mxf_pulldown->input_segment_ref, 16);
break;
}
return 0;
}

static int mxf_read_track(void *arg, AVIOContext *pb, int tag, int size, UID uid, int64_t klv_offset)
{
MXFTrack *track = arg;
Expand Down Expand Up @@ -1413,6 +1430,7 @@ static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_t
MXFStructuralComponent *component = NULL;
MXFStructuralComponent *sourceclip = NULL;
MXFTimecodeComponent *mxf_tc = NULL;
MXFPulldownComponent *mxf_pulldown = NULL;
int i, j, k;
AVTimecode tc;
int flags;
Expand Down Expand Up @@ -1456,8 +1474,16 @@ static int mxf_parse_physical_source_package(MXFContext *mxf, MXFTrack *source_t

for (k = 0; k < physical_track->sequence->structural_components_count; k++) {
component = mxf_resolve_strong_ref(mxf, &physical_track->sequence->structural_components_refs[k], TimecodeComponent);
if (!component)
continue;
if (!component){
/* timcode component may be located on a pulldown component */
component = mxf_resolve_strong_ref(mxf, &physical_track->sequence->structural_components_refs[k], PulldownComponent);
if (!component)
continue;
mxf_pulldown = (MXFPulldownComponent*)component;
component = mxf_resolve_strong_ref(mxf, &mxf_pulldown->input_segment_ref, TimecodeComponent);
if (!component)
continue;
}

mxf_tc = (MXFTimecodeComponent*)component;
flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
Expand Down Expand Up @@ -1944,6 +1970,7 @@ static const MXFMetadataReadTableEntry mxf_metadata_read_table[] = {
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3A,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Static Track */
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x3B,0x00 }, mxf_read_track, sizeof(MXFTrack), Track }, /* Generic Track */
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x14,0x00 }, mxf_read_timecode_component, sizeof(MXFTimecodeComponent), TimecodeComponent },
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x0c,0x00 }, mxf_read_pulldown_component, sizeof(MXFPulldownComponent), PulldownComponent },
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x04,0x01,0x02,0x02,0x00,0x00 }, mxf_read_cryptographic_context, sizeof(MXFCryptoContext), CryptoContext },
{ { 0x06,0x0e,0x2b,0x34,0x02,0x53,0x01,0x01,0x0d,0x01,0x02,0x01,0x01,0x10,0x01,0x00 }, mxf_read_index_table_segment, sizeof(MXFIndexTableSegment), IndexTableSegment },
{ { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, NULL, 0, AnyType },
Expand Down
6 changes: 3 additions & 3 deletions tests/ref/lavf/mxf
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
103403355e6dec356c7342ee2d034691 *./tests/data/lavf/lavf.mxf
dbc4ced82ef1c2fa4df3571b4f994a22 *./tests/data/lavf/lavf.mxf
525369 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1
f61e4c8481610f30b2f5e2279e254f6b *./tests/data/lavf/lavf.mxf
fe4294023cd990938f042c7855405f63 *./tests/data/lavf/lavf.mxf
560697 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0x11a6178e
a586dad4ff94136be460afb02ff6101e *./tests/data/lavf/lavf.mxf
ef0c741e17bf7963fc51adcb6bab8ec8 *./tests/data/lavf/lavf.mxf
525369 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1
2 changes: 1 addition & 1 deletion tests/ref/lavf/mxf_d10
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
838b732d832dcf40b0eb9944bc6d8f55 *./tests/data/lavf/lavf.mxf_d10
87e0903ef7ea55b1a032b9d878588683 *./tests/data/lavf/lavf.mxf_d10
5330989 ./tests/data/lavf/lavf.mxf_d10
./tests/data/lavf/lavf.mxf_d10 CRC=0x6c74d488

0 comments on commit 90bf1e3

Please sign in to comment.