~nagos/openshot/nagos

« back to all changes in this revision

Viewing changes to openshot/classes/clip.py

  • Committer: Jonathan Thomas
  • Date: 2010-01-28 07:39:38 UTC
  • Revision ID: jonathan@jonathan64-20100128073938-xlmzndtbuqwgtama
Bumped version to 1.0.3

Intergrated a patch from Cody to fix some translation
strings missing (i.e. Track 1, Track 2)

Improved the speed of GenerateXML() 1300%.  This was mainly due to 
a very poor project.fps() method, which was slow and used all
over the place.  So, I tried to not call the method as much,
and I implemented some caching of the fps value.

Show diffs side-by-side

added added

removed removed

Lines of Context:
227
227
                f.close()
228
228
         
229
229
         
230
 
        def GenerateXML(self, dom, xmlParentNode, current_frame=0, preview_mode=False):
 
230
        def GenerateXML(self, dom, xmlParentNode, current_frame=0, preview_mode=False, fps=None):
231
231
 
232
232
                # get the project
233
233
                project = self.parent.parent.project
234
234
 
235
 
                # get the frames per second (from the project)
236
 
                fps = project.fps()
 
235
                # init the frame offset
237
236
                frame_offset = 0
238
237
                
239
238
                # calculate what the new frame number is (and the size of the gap from the previous clip)
479
478
                        ##############################
480
479
                        #         COMPOSITE
481
480
                        #############################
482
 
                        self.GenerateComposites(dom, current_frame, ending_frame, preview_mode)
 
481
                        self.GenerateComposites(dom, current_frame, ending_frame, preview_mode, fps=fps)
483
482
 
484
483
                        
485
484
                        ##############################
528
527
                        return ending_frame
529
528
                        
530
529
 
531
 
        def GenerateComposites(self, dom, in_current_frame, in_ending_frame, preview_mode=False):
 
530
        def GenerateComposites(self, dom, in_current_frame, in_ending_frame, preview_mode=False, fps=None):
532
531
                # get the project
533
532
                project = self.parent.parent.project
534
 
 
535
 
                # get the frames per second (from the project)
536
 
                fps = project.fps()
537
533
                
538
534
                overlapping_transitions = []
539
535
                has_left = None
569
565
                ### IF ENTIRE CLIP IS OVERLAPPED, ADD JUST 1 TRANSITION
570
566
                if has_entire:
571
567
                        # add just 1 transition (which is the length of the clip)
572
 
                        self.CreateCompositeXML(dom, current_frame, end_frame, "entire", has_entire)
 
568
                        self.CreateCompositeXML(dom, current_frame, end_frame, "entire", has_entire, fps=fps)
573
569
                        
574
570
                else:
575
571
                        # NOT OVERLAPPING THE ENTIRE CLIP
577
573
                        if has_left:
578
574
                                # LEFT TRANSITION
579
575
                                end = round((has_left.position_on_track + has_left.length) * fps)
580
 
                                self.CreateCompositeXML(dom, current_frame, end, "left", has_left)
 
576
                                self.CreateCompositeXML(dom, current_frame, end, "left", has_left, fps=fps)
581
577
                                current_frame = end
582
578
                        elif self.video_fade_in:
583
579
                                # LEFT FADE IN
584
580
                                end = current_frame + round((self.video_fade_amount) * fps)
585
581
                                if end > end_frame:
586
582
                                        end = end_frame
587
 
                                self.CreateCompositeXML(dom, current_frame, end, "fade in")
 
583
                                self.CreateCompositeXML(dom, current_frame, end, "fade in", fps=fps)
588
584
                                current_frame = end
589
585
        
590
586
                                
597
593
                                
598
594
                                if current_frame < trans_begin_frame:
599
595
                                        # add filler
600
 
                                        self.CreateCompositeXML(dom, current_frame, trans_begin_frame, "filler")
 
596
                                        self.CreateCompositeXML(dom, current_frame, trans_begin_frame, "filler", fps=fps)
601
597
                                
602
598
                                # add transition
603
599
                                current_frame = trans_begin_frame
604
600
                                end = trans_end_frame
605
 
                                self.CreateCompositeXML(dom, current_frame, end, "inside", t)
 
601
                                self.CreateCompositeXML(dom, current_frame, end, "inside", t, fps=fps)
606
602
                                current_frame = end
607
603
        
608
604
        
615
611
                                
616
612
                                if current_frame < trans_begin_frame:
617
613
                                        # add filler
618
 
                                        self.CreateCompositeXML(dom, current_frame, trans_begin_frame, "filler")
 
614
                                        self.CreateCompositeXML(dom, current_frame, trans_begin_frame, "filler", fps=fps)
619
615
        
620
616
                                # add transition
621
617
                                current_frame = trans_begin_frame
622
618
                                end = end_frame
623
 
                                self.CreateCompositeXML(dom, current_frame, end, "right", has_right)
 
619
                                self.CreateCompositeXML(dom, current_frame, end, "right", has_right, fps=fps)
624
620
                                current_frame = end
625
621
        
626
622
                        elif self.video_fade_out:
628
624
                                begin_of_fade_out = end_frame - round(self.video_fade_amount * fps)
629
625
                                if current_frame < begin_of_fade_out:
630
626
                                        # add filler
631
 
                                        self.CreateCompositeXML(dom, current_frame, begin_of_fade_out, "filler")
 
627
                                        self.CreateCompositeXML(dom, current_frame, begin_of_fade_out, "filler", fps=fps)
632
628
                                
633
629
                                current_frame = begin_of_fade_out
634
630
                                end = end_frame
635
 
                                self.CreateCompositeXML(dom, current_frame, end, "fade out")
 
631
                                self.CreateCompositeXML(dom, current_frame, end, "fade out", fps=fps)
636
632
                                current_frame = end
637
633
                                
638
634
                                
639
635
                        #### ADD FINAL FILLER, IF NEEDED ####
640
636
                        if current_frame < end_frame:
641
637
                                # add filler
642
 
                                self.CreateCompositeXML(dom, current_frame, end_frame, "filler")
643
 
                        
644
 
                        
645
 
        def CreateCompositeXML(self, dom, current_frame, end_frame, comment, t = None):
646
 
                
 
638
                                self.CreateCompositeXML(dom, current_frame, end_frame, "filler", fps=fps)
 
639
                        
 
640
                        
 
641
        def CreateCompositeXML(self, dom, current_frame, end_frame, comment, t = None, fps = None):
 
642
 
647
643
                # get the frames per second (from the project)
648
644
                project = self.parent.parent.project
649
 
                fps = project.fps()
650
 
                
 
645
 
651
646
                # dont' add composite for a "filler" (if requested)
652
647
                if self.composite == False and comment == "filler":
653
648
                        return
 
649
                
 
650
                # get length and geometry key frames of clip (in frames)
 
651
                clip_length_frames = self.length() * fps
 
652
                kf_start = self.keyframes["start"]
 
653
                kf_end = self.keyframes["end"]
654
654
 
655
 
                h1, h2 = self.get_keyframe_values("height", current_frame, end_frame)
656
 
                w1, w2 = self.get_keyframe_values("width", current_frame, end_frame)
657
 
                x1, x2 = self.get_keyframe_values("x", current_frame, end_frame)
658
 
                y1, y2 = self.get_keyframe_values("y", current_frame, end_frame)
659
 
                a1, a2 = self.get_keyframe_values("alpha", current_frame, end_frame)
 
655
                h1, h2 = self.get_keyframe_values("height", current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end)
 
656
                w1, w2 = self.get_keyframe_values("width", current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end)
 
657
                x1, x2 = self.get_keyframe_values("x", current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end)
 
658
                y1, y2 = self.get_keyframe_values("y", current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end)
 
659
                a1, a2 = self.get_keyframe_values("alpha", current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end)
660
660
 
661
661
                # get the root tractor node 
662
662
                tractor_node = dom.getElementsByTagName("tractor")[0]
663
663
                
664
 
                # Get clip index.  Subtract this from the IN / OUT frame.  This is
665
 
                # to correct a problem with the blank space (in the XML) getting offset from the composites
666
 
                # for some reason.  Not really sure, but this seems to fix it. =)
667
 
                #clip_index = self.parent.clips.index(self) + 1
668
 
                        
669
664
                # get the IN / OUT frame for the Transistion (absolute frame # of the project)
670
 
                trans_in_frame_number = current_frame #- clip_index
671
 
                trans_out_frame_number = end_frame #- clip_index
 
665
                trans_in_frame_number = current_frame
 
666
                trans_out_frame_number = end_frame
672
667
                
673
668
                # Get the track index (i.e. track 0, 1, 2, 3, etc...)
674
669
                if self.parent.name != "Background Track":
680
675
                        track_index = len(self.parent.parent.tracks)
681
676
                        track_index_flipped = 0
682
677
                
683
 
                
684
678
                transition = dom.createElement("transition")
685
679
                transition.setAttribute("in", str(round(trans_in_frame_number)))
686
680
                transition.setAttribute("out", str(round(trans_out_frame_number)))
729
723
                                a1 = t.mask_value / 100
730
724
                                a2 = t.mask_value / 100
731
725
                
732
 
                
733
726
                geometry_start = "%d=%s%%,%s%%:%s%%x%s%%:%s; " % (0, locale.str(x1), locale.str(y1), locale.str(w1), locale.str(h1), locale.str(a1 * 100.0))
734
727
                geometry_end = "%d=%s%%,%s%%:%s%%x%s%%:%s; " % (-1, locale.str(x2), locale.str(y2), locale.str(w2), locale.str(h2), locale.str(a2 * 100.0))
735
728
                geometry = geometry_start + geometry_end
791
784
                                
792
785
                                
793
786
 
794
 
        def get_keyframe_values(self, prop_name, current_frame, end_frame):
 
787
        def get_keyframe_values(self, prop_name, current_frame, end_frame, fps, clip_length_frames, kf_start, kf_end):
 
788
                
795
789
                # get the frames per second (from the project)
796
790
                project = self.parent.parent.project
797
 
                fps = project.fps()
798
 
                
799
 
                # get length of clip (in frames)
800
 
                clip_length_frames = self.length() * fps
801
 
                
802
 
                # get geometry key frames (since they have to be calculated across many composites)
803
 
                kf_start = self.keyframes["start"]
804
 
                kf_end = self.keyframes["end"]
805
791
                
806
792
                if prop_name == "height":
807
793
                        prop_start = kf_start.height