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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to