[FFmpeg-devel] [PATCH 4/8] mxf: move framenum to timecode convert to timecode helpers.

Clément Bœsch ubitux at gmail.com
Wed Jul 27 18:45:14 CEST 2011


From: Clément Bœsch <clement.boesch at smartjog.com>

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 434b3cb..b12506f 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 bf4116b..d8507a7 100644
--- a/libavcodec/timecode.h
+++ b/libavcodec/timecode.h
@@ -52,6 +52,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 b84504c..50d2ded 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);
-- 
1.7.5.4



More information about the ffmpeg-devel mailing list