From 4c3c6e60f97e450c35a90dc6d66f3726b7b938b4 Mon Sep 17 00:00:00 2001 From: Clément Bœsch Date: Wed, 6 Jul 2011 15:04:26 +0200 Subject: mxf: move framenum to timecode convert to timecode helpers. This is based on the original work by Baptiste Coudurier. --- libavcodec/timecode.c | 18 ++++++++++++++++++ libavcodec/timecode.h | 9 +++++++++ libavformat/mxfenc.c | 22 +++------------------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/libavcodec/timecode.c b/libavcodec/timecode.c index 434b3cb03a..b12506f74d 100644 --- a/libavcodec/timecode.c +++ b/libavcodec/timecode.c @@ -37,6 +37,24 @@ int ff_framenum_to_drop_timecode(int frame_num) return frame_num + 18 * d + 2 * ((m - 2) / 1798); } +uint32_t ff_framenum_to_smtpe_timecode(unsigned frame, int fps, int drop) +{ + return (0 << 31) | // color frame flag + (drop << 30) | // drop frame flag + ( ((frame % fps) / 10) << 28) | // tens of frames + ( ((frame % fps) % 10) << 24) | // units of frames + (0 << 23) | // field phase (NTSC), b0 (PAL) + ((((frame / fps) % 60) / 10) << 20) | // tens of seconds + ((((frame / fps) % 60) % 10) << 16) | // units of seconds + (0 << 15) | // b0 (NTSC), b2 (PAL) + ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes + ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes + (0 << 7) | // b1 + (0 << 6) | // b2 (NTSC), field phase (PAL) + ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours + ( (frame / (fps * 3600) % 24)) % 10; // units of hours +} + int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc) { int hh, mm, ss, ff, fps; diff --git a/libavcodec/timecode.h b/libavcodec/timecode.h index bf4116b28a..d8507a7419 100644 --- a/libavcodec/timecode.h +++ b/libavcodec/timecode.h @@ -51,6 +51,15 @@ struct ff_timecode { */ int ff_framenum_to_drop_timecode(int frame_num); +/** + * @brief Convert frame id (timecode) to SMPTE 12M binary representation + * @param frame Frame number + * @param fps Frame rate + * @param drop Drop flag + * @return The actual binary representation + */ +uint32_t ff_framenum_to_smtpe_timecode(unsigned frame, int fps, int drop); + /** * Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields * from tc struct must be set. diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index b84504cf5c..50d2deda7b 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -37,6 +37,7 @@ #include "libavutil/random_seed.h" #include "libavcodec/bytestream.h" +#include "libavcodec/timecode.h" #include "audiointerleave.h" #include "avformat.h" #include "internal.h" @@ -1546,24 +1547,6 @@ static int mxf_write_header(AVFormatContext *s) static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 }; static const uint8_t system_metadata_package_set_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x43,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x02,0x01 }; -static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps) -{ - return (0 << 31) | // color frame flag - (drop << 30) | // drop frame flag - ( ((frame % fps) / 10) << 28) | // tens of frames - ( ((frame % fps) % 10) << 24) | // units of frames - (0 << 23) | // field phase (NTSC), b0 (PAL) - ((((frame / fps) % 60) / 10) << 20) | // tens of seconds - ((((frame / fps) % 60) % 10) << 16) | // units of seconds - (0 << 15) | // b0 (NTSC), b2 (PAL) - ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes - ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes - (0 << 7) | // b1 - (0 << 6) | // b2 (NTSC), field phase (PAL) - ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours - ( (frame / (fps * 3600) % 24)) % 10; // units of hours -} - static void mxf_write_system_item(AVFormatContext *s) { MXFContext *mxf = s->priv_data; @@ -1592,7 +1575,8 @@ static void mxf_write_system_item(AVFormatContext *s) avio_wb64(pb, 0); // creation date/time stamp avio_w8(pb, 0x81); // SMPTE 12M time code - time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base); + time_code = ff_framenum_to_smtpe_timecode(frame, mxf->timecode_base, + mxf->timecode_drop_frame); avio_wb32(pb, time_code); avio_wb32(pb, 0); // binary group data avio_wb64(pb, 0); -- cgit v1.2.3