[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42641] trunk/blender/source/blender: Free run no gaps time code implementation

Sergey Sharybin sergey.vfx at gmail.com
Thu Dec 15 13:18:22 CET 2011


Revision: 42641
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42641
Author:   nazgul
Date:     2011-12-15 12:18:09 +0000 (Thu, 15 Dec 2011)
Log Message:
-----------
Free run no gaps time code implementation

This commit adds new timecode type which counts frames in gapless mode (counting
actually decoded frames instead of using pts to find frame number) which might
resolve issues with files which have got broken or incorrect base time value stored
in the header.

This timecode allows to deal with movies from #29388: Abnormal frame length on MP4 files

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/IMB_imbuf.h
    trunk/blender/source/blender/imbuf/intern/indexer.c
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/source/blender/imbuf/IMB_imbuf.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_imbuf.h	2011-12-15 10:44:33 UTC (rev 42640)
+++ trunk/blender/source/blender/imbuf/IMB_imbuf.h	2011-12-15 12:18:09 UTC (rev 42641)
@@ -198,7 +198,8 @@
 				  record date and time written by recording
 				  device (*every* consumer camcorder can do
 				  that :) )*/
-	IMB_TC_MAX_SLOT   = 3
+	IMB_TC_RECORD_RUN_NO_GAPS = 8,
+	IMB_TC_MAX_SLOT   = 8
 } IMB_Timecode_Type;
 
 typedef enum IMB_Proxy_Size {

Modified: trunk/blender/source/blender/imbuf/intern/indexer.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/indexer.c	2011-12-15 10:44:33 UTC (rev 42640)
+++ trunk/blender/source/blender/imbuf/intern/indexer.c	2011-12-15 12:18:09 UTC (rev 42641)
@@ -52,8 +52,11 @@
 static float proxy_fac[] = { 0.25, 0.50, 0.75, 1.00 };
 
 #ifdef WITH_FFMPEG
-static int tc_types[] = { IMB_TC_RECORD_RUN, IMB_TC_FREE_RUN,
-                          IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN };
+static int tc_types[] = { IMB_TC_RECORD_RUN,
+                          IMB_TC_FREE_RUN,
+                          IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN,
+                          IMB_TC_RECORD_RUN_NO_GAPS,
+                        };
 #endif
 
 #define INDEX_FILE_VERSION 1
@@ -102,7 +105,7 @@
 }
 
 void IMB_index_builder_add_entry(anim_index_builder * fp, 
-				 int frameno,unsigned long long seek_pos,
+				 int frameno, unsigned long long seek_pos,
 				 unsigned long long seek_pos_dts,
 				 unsigned long long pts)
 {
@@ -344,6 +347,8 @@
 		return 1;
 	case IMB_TC_INTERPOLATED_REC_DATE_FREE_RUN:
 		return 2;
+	case IMB_TC_RECORD_RUN_NO_GAPS:
+		return 3;
 	default:
 		return 0;
 	};
@@ -401,8 +406,10 @@
 	char index_dir[FILE_MAXDIR];
 	int i = IMB_timecode_to_array_index(tc);
 	const char * index_names[] = {
-		"record_run%s.blen_tc", "free_run%s.blen_tc",
-		"interp_free_run%s.blen_tc" };
+		"record_run%s.blen_tc",
+		"free_run%s.blen_tc",
+		"interp_free_run%s.blen_tc",
+		"record_run_no_gaps%s.blen_tc"};
 
 	char stream_suffix[20];
 	char index_name[256];
@@ -696,7 +703,7 @@
 	unsigned long long start_pts = 0;
 	double frame_rate;
 	double pts_time_base;
-	int frameno = 0;
+	int frameno = 0, frameno_gapless = 0;
 	int start_pts_set = FALSE;
 
 	AVFormatContext *iFormatCtx;
@@ -858,13 +865,21 @@
 
 			for (i = 0; i < num_indexers; i++) {
 				if (tcs_in_use & tc_types[i]) {
+					int tc_frameno = frameno;
+
+					if(tc_types[i] == IMB_TC_RECORD_RUN_NO_GAPS)
+						tc_frameno = frameno_gapless;
+
 					IMB_index_builder_proc_frame(
 						indexer[i], 
 						next_packet.data, 
 						next_packet.size,
-						frameno, s_pos,	s_dts, pts);
+						tc_frameno,
+						s_pos, s_dts, pts);
 				}
 			}
+
+			frameno_gapless++;
 		}
 		av_free_packet(&next_packet);
 	}

Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2011-12-15 10:44:33 UTC (rev 42640)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2011-12-15 12:18:09 UTC (rev 42641)
@@ -309,7 +309,8 @@
 #define SEQ_PROXY_TC_RECORD_RUN                 1
 #define SEQ_PROXY_TC_FREE_RUN                   2
 #define SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN   4
-#define SEQ_PROXY_TC_ALL                        7
+#define SEQ_PROXY_TC_RECORD_RUN_NO_GAPS         8
+#define SEQ_PROXY_TC_ALL                        15
 
 /* seq->type WATCH IT: SEQ_EFFECT BIT is used to determine if this is an effect strip!!! */
 #define SEQ_IMAGE		0

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2011-12-15 10:44:33 UTC (rev 42640)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2011-12-15 12:18:09 UTC (rev 42641)
@@ -822,6 +822,9 @@
 		{SEQ_PROXY_TC_INTERP_REC_DATE_FREE_RUN, "FREE_RUN_REC_DATE", 0, "Free Run (rec date)",
 		                                        "Interpolate a global timestamp using the "
 		                                        "record date and time written by recording device"},
+		{SEQ_PROXY_TC_RECORD_RUN_NO_GAPS, "FREE_RUN_NO_GAPS", 0, "Free Run No Gaps",
+		                                        "Record run, but ignore timecode, "
+		                                        "changes in framerate or dropouts"},
 		{0, NULL, 0, NULL, NULL}};
 	
 	srna = RNA_def_struct(brna, "SequenceProxy", NULL);




More information about the Bf-blender-cvs mailing list