ffmpeg | branch: master | Mark Reid <mindm...@gmail.com> | Fri Oct 24 17:31:24 2014 -0700| [90bf1e3046000def2142e06c9f084b7542256804] | committer: Michael Niedermayer
libavformat/mxfdec: read source timecode from pulldown component Reviewed-by: Tomas Härdin <tomas.har...@codemill.se> Signed-off-by: Michael Niedermayer <michae...@gmx.at> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=90bf1e3046000def2142e06c9f084b7542256804 --- libavformat/mxf.h | 1 + libavformat/mxfdec.c | 31 +++++++++++++++++++++++++++++-- tests/ref/lavf/mxf | 6 +++--- tests/ref/lavf/mxf_d10 | 2 +- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libavformat/mxf.h b/libavformat/mxf.h index 036c15e..5b95efa 100644 --- a/libavformat/mxf.h +++ b/libavformat/mxf.h @@ -33,6 +33,7 @@ enum MXFMetadataSetType { SourcePackage, SourceClip, TimecodeComponent, + PulldownComponent, Sequence, MultipleDescriptor, Descriptor, diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 94fe7d4..9d7f2ff 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -129,6 +129,12 @@ typedef struct { typedef struct { UID uid; enum MXFMetadataSetType type; + UID input_segment_ref; +} MXFPulldownComponent; + +typedef struct { + UID uid; + enum MXFMetadataSetType type; MXFSequence *sequence; /* mandatory, and only one */ UID sequence_ref; int track_id; @@ -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; @@ -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; @@ -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; @@ -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 }, diff --git a/tests/ref/lavf/mxf b/tests/ref/lavf/mxf index 27991ff..236661c 100644 --- a/tests/ref/lavf/mxf +++ b/tests/ref/lavf/mxf @@ -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 diff --git a/tests/ref/lavf/mxf_d10 b/tests/ref/lavf/mxf_d10 index 98c2f6f..ff7d876 100644 --- a/tests/ref/lavf/mxf_d10 +++ b/tests/ref/lavf/mxf_d10 @@ -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 _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog