timecode: move dropframe code and doxycomment it.
authorClément Bœsch <clement.boesch@smartjog.com>
Wed, 6 Jul 2011 12:55:06 +0000 (14:55 +0200)
committerClément Bœsch <ubitux@gmail.com>
Wed, 10 Aug 2011 14:00:32 +0000 (16:00 +0200)
This is based on the original work by Baptiste Coudurier.

libavcodec/mpeg12enc.c
libavcodec/timecode.c
libavcodec/timecode.h

index c9fa41b..b3ed367 100644 (file)
@@ -299,13 +299,8 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s)
             time_code = s->current_picture_ptr->f.coded_picture_number + s->avctx->timecode_frame_start;
 
             s->gop_picture_number = s->current_picture_ptr->f.coded_picture_number;
-            if (s->tc.drop) {
-                /* only works for NTSC 29.97 */
-                int d = time_code / 17982;
-                int m = time_code % 17982;
-                //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */
-                time_code += 18 * d + 2 * ((m - 2) / 1798);
-            }
+            if (s->tc.drop)
+                time_code = ff_framenum_to_drop_timecode(time_code);
             put_bits(&s->pb, 5, (uint32_t)((time_code / (fps * 3600)) % 24));
             put_bits(&s->pb, 6, (uint32_t)((time_code / (fps * 60)) % 60));
             put_bits(&s->pb, 1, 1);
index d9c3f7d..434b3cb 100644 (file)
 #include "timecode.h"
 #include "libavutil/log.h"
 
+int ff_framenum_to_drop_timecode(int frame_num)
+{
+    /* only works for NTSC 29.97 */
+    int d = frame_num / 17982;
+    int m = frame_num % 17982;
+    //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */
+    return frame_num + 18 * d + 2 * ((m - 2) / 1798);
+}
+
 int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc)
 {
     int hh, mm, ss, ff, fps;
index d2f6606..bf4116b 100644 (file)
@@ -43,6 +43,14 @@ struct ff_timecode {
     AVRational rate; ///< Frame rate in rationnal form
 };
 
+/**
+ * @brief           Adjust frame number for NTSC drop frame time code
+ * @param frame_num Actual frame number to adjust
+ * @return          Adjusted frame number
+ * @warning         Adjustment is only valid in NTSC 29.97
+ */
+int ff_framenum_to_drop_timecode(int frame_num);
+
 /**
  * Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields
  * from tc struct must be set.