Changeset - edb75a48fcb8
[Not reviewed]
default
0 4 0
drewp@bigasterisk.com - 15 years ago 2010-06-13 09:41:45
drewp@bigasterisk.com
vidref now finds and plays back multiple takes of the current song
Ignore-this: 951b6526b8e2af0e261c11d93bb1e255
4 files changed with 172 insertions and 146 deletions:
0 comments (0 inline, 0 general)
bin/vidref
Show inline comments
 
@@ -3,13 +3,13 @@ import gobject
 
gobject.threads_init()
 
import gtk
 
import sys, logging
 
sys.path.append(".")
 
from light9.vidref.main import Main
 

	
 
 # then vidref file cleanup, livevideo ui elements, input picker. find replay dirs correctly. show multiple replays. trash. reorder/pin.
 
 # find replay dirs correctly. show multiple replays. trash. reorder/pin.
 
                
 

	
 
logging.basicConfig()
 
log = logging.getLogger()
 
log.setLevel(logging.DEBUG)
 
logging.getLogger("restkit.client").setLevel(logging.WARN)
light9/vidref/main.py
Show inline comments
 
@@ -13,13 +13,13 @@ from decimal import Decimal
 
import gtk
 
from twisted.python.util import sibpath
 
import Image
 
from threading import Thread
 
from Queue import Queue
 
from light9 import networking
 
from light9.vidref.replay import ReplayViews
 
from light9.vidref.replay import ReplayViews, songDir, takeDir
 

	
 
log = logging.getLogger()
 

	
 
class MusicTime(object):
 
    """
 
    fetch times from ascoltami in a background thread; return times
 
@@ -106,15 +106,13 @@ class VideoRecordSink(gst.Element):
 
        except:
 
            traceback.print_exc()
 

	
 
        return gst.FLOW_OK
 

	
 
    def saveImg(self, position, img, bufferTimestamp):
 
        outDir = "/tmp/vidref/play-%s-%d" % (
 
            position['song'].split('://')[-1].replace('/','_'),
 
            position['started'])
 
        outDir = takeDir(songDir(position['song']), position['started'])
 
        outFilename = "%s/%08.03f.jpg" % (outDir, position['t'])
 
        if os.path.exists(outFilename): # we're paused on one time
 
            return
 
        
 
        try:
 
            os.makedirs(outDir)
 
@@ -137,13 +135,15 @@ class Main(object):
 
        wtree = gtk.Builder()
 
        wtree.add_from_file(sibpath(__file__, "vidref.glade"))
 
        mainwin = wtree.get_object("MainWindow")
 
        mainwin.connect("destroy", gtk.main_quit)
 
        wtree.connect_signals(self)
 

	
 
        self.replayViews = ReplayViews(wtree.get_object("image1"))#"replayScroll"))
 
        wtree.get_object("replayPanel").show()
 
        rp = wtree.get_object("replayVbox")
 
        self.replayViews = ReplayViews(rp)
 

	
 
        mainwin.show_all()
 
        self.liveVideoXid = wtree.get_object("vid3").window.xid
 

	
 
        self.setInput('dv')
 

	
light9/vidref/replay.py
Show inline comments
 
import os, gtk
 
from bisect import bisect_left
 
from decimal import Decimal
 

	
 
existingDir = "/tmp/vidref/play-_my_proj_light9_show_dance2010_music_01-chorusmix.wav-1276415052"
 
existingFrames = sorted([Decimal(f.split('.jpg')[0])
 
                         for f in os.listdir(existingDir)])
 

	
 
def songDir(song):
 
    return "/tmp/vidref/play-%s" % song.split('://')[-1].replace('/','_')
 

	
 
def takeDir(songDir, startTime):
 
    """
 
    startTime: unix seconds (str ok)
 
    """
 
    return os.path.join(songDir, str(int(startTime)))
 

	
 
class ReplayViews(object):
 
    """
 
    the whole list of replay windows. parent is the scrolling area for
 
    these windows to be added
 
    """
 
    def __init__(self, parent):
 
        self.out = ReplayView(parent, Replay(existingDir))
 
        return
 
        for x in range(1000):
 
            lab = gtk.Label()
 
            lab.set_text("hello")
 
            parent.add_with_viewport(lab)
 
    
 
        # today, parent is the vbox the replay windows should appear in
 
        self.parent = parent
 
        self.lastSong = None
 

	
 
        self.views = []
 
     
 
    def update(self, position):
 
        """
 
        freshen all replay windows. We get called this about every
 
        time there's a new live video frame.
 

	
 
        may be responsible for making new children if we change song
 
        """
 
        self.out.updatePic(position)
 
        if position['song'] != self.lastSong:
 
            self.loadViewsForSong(position['song'])
 
            self.lastSong = position['song']
 
        for v in self.views:
 
            v.updatePic(position)
 

	
 

	
 
class Replay(object):
 
    """
 
    model for one of the replay widgets
 
    """
 
    def __init__(self, sourceDir):
 
        self.sourceDir = sourceDir
 

	
 
    def findClosestFrame(self, t):
 
        i = bisect_left(existingFrames, Decimal(str(t)))
 
        if i >= len(existingFrames):
 
            i = len(existingFrames) - 1
 
        return os.path.join(existingDir, "%08.03f.jpg" % existingFrames[i])
 
    def loadViewsForSong(self, song):
 
        # remove previous ones
 
        
 
        takes = os.listdir(songDir(song))
 
        for take in takes:
 
            td = takeDir(songDir(song), take)
 
            rv = ReplayView(self.parent, Replay(td))
 
            self.views.append(rv)
 

	
 
class ReplayView(object):
 
    """
 
    one of the replay widgets
 
    """
 
    def __init__(self, parent, replay):
 
        self.replay = replay
 
#        self.loadWindwos
 
        self.picWidget = parent
 

	
 
        # this *should* be a composite widget from glade
 
        img = gtk.Image()
 
        img.set_size_request(320, 240)
 
        parent.pack_end(img, False, False)
 
        img.show()
 
        self.picWidget = img
 
        
 
#        self.picWidget = parent.get_children()[0].get_child()
 
        
 
    def updatePic(self, position):
 
        inPic = self.replay.findClosestFrame(position['t']+.25)
 
        with gtk.gdk.lock:
 
            self.picWidget.set_from_file(inPic)
 
            if 0:
 
                # force redraw of that widget
 
                self.picWidget.queue_draw_area(0,0,320,240)
 
                self.picWidget.get_window().process_updates(True)
 
    
 
class Replay(object):
 
    """
 
    model for one of the replay widgets
 
    """
 
    def __init__(self, takeDir):
 
        self.takeDir = takeDir
 

	
 
    def findClosestFrame(self, t):
 
        existingFrames = sorted([Decimal(f.split('.jpg')[0])
 
                                 for f in os.listdir(self.takeDir)])
 
        i = bisect_left(existingFrames, Decimal(str(t)))
 
        if i >= len(existingFrames):
 
            i = len(existingFrames) - 1
 
        return os.path.join(self.takeDir, "%08.03f.jpg" % existingFrames[i])
light9/vidref/vidref.glade
Show inline comments
 
<?xml version="1.0"?>
 
<interface>
 
  <requires lib="gtk+" version="2.16"/>
 
  <!-- interface-naming-policy project-wide -->
 
  <object class="GtkWindow" id="MainWindow">
 
    <property name="width_request">990</property>
 
    <property name="height_request">709</property>
 
    <property name="default_width">500</property>
 
    <property name="default_height">500</property>
 
    <child>
 
      <object class="GtkHBox" id="hbox3">
 
        <property name="visible">True</property>
 
        <child>
 
@@ -157,129 +159,16 @@
 
                <property name="shadow_type">out</property>
 
                <child>
 
                  <object class="GtkViewport" id="replayScroll">
 
                    <property name="visible">True</property>
 
                    <property name="resize_mode">queue</property>
 
                    <child>
 
                      <object class="GtkVBox" id="vbox1">
 
                      <object class="GtkVBox" id="replayVbox">
 
                        <property name="visible">True</property>
 
                        <child>
 
                          <object class="GtkHandleBox" id="handlebox1">
 
                            <property name="height_request">273</property>
 
                            <property name="visible">True</property>
 
                            <child>
 
                              <object class="GtkHBox" id="hbox1">
 
                                <property name="visible">True</property>
 
                                <child>
 
                                  <object class="GtkAspectFrame" id="aspectframe1">
 
                                    <property name="width_request">320</property>
 
                                    <property name="height_request">240</property>
 
                                    <property name="visible">True</property>
 
                                    <property name="label_xalign">0</property>
 
                                    <property name="shadow_type">out</property>
 
                                    <property name="ratio">1.3300000429153442</property>
 
                                    <child>
 
                                      <object class="GtkImage" id="image1">
 
                                        <property name="width_request">320</property>
 
                                        <property name="height_request">240</property>
 
                                        <property name="visible">True</property>
 
                                        <property name="stock">gtk-missing-image</property>
 
                                      </object>
 
                                    </child>
 
                                  </object>
 
                                  <packing>
 
                                    <property name="position">0</property>
 
                                  </packing>
 
                                </child>
 
                                <child>
 
                                  <object class="GtkVBox" id="vbox2">
 
                                    <property name="visible">True</property>
 
                                    <child>
 
                                      <object class="GtkHBox" id="hbox2">
 
                                        <property name="visible">True</property>
 
                                        <child>
 
                                          <object class="GtkLabel" id="label5">
 
                                            <property name="visible">True</property>
 
                                            <property name="label" translatable="yes">Started:</property>
 
                                          </object>
 
                                          <packing>
 
                                            <property name="expand">False</property>
 
                                            <property name="fill">False</property>
 
                                            <property name="position">0</property>
 
                                          </packing>
 
                                        </child>
 
                                        <child>
 
                                          <object class="GtkEntry" id="entry1">
 
                                            <property name="visible">True</property>
 
                                            <property name="can_focus">True</property>
 
                                            <property name="editable">False</property>
 
                                            <property name="invisible_char">&#x25CF;</property>
 
                                            <property name="width_chars">12</property>
 
                                            <property name="text" translatable="yes">Sat 14:22:25</property>
 
                                          </object>
 
                                          <packing>
 
                                            <property name="expand">False</property>
 
                                            <property name="fill">False</property>
 
                                            <property name="position">1</property>
 
                                          </packing>
 
                                        </child>
 
                                      </object>
 
                                      <packing>
 
                                        <property name="expand">False</property>
 
                                        <property name="position">0</property>
 
                                      </packing>
 
                                    </child>
 
                                    <child>
 
                                      <object class="GtkToggleButton" id="togglebutton1">
 
                                        <property name="label" translatable="yes">Enabled</property>
 
                                        <property name="visible">True</property>
 
                                        <property name="can_focus">True</property>
 
                                        <property name="receives_default">True</property>
 
                                      </object>
 
                                      <packing>
 
                                        <property name="expand">False</property>
 
                                        <property name="position">1</property>
 
                                      </packing>
 
                                    </child>
 
                                    <child>
 
                                      <object class="GtkButton" id="button1">
 
                                        <property name="label" translatable="yes">Delete</property>
 
                                        <property name="visible">True</property>
 
                                        <property name="can_focus">True</property>
 
                                        <property name="receives_default">True</property>
 
                                        <property name="image">image2</property>
 
                                      </object>
 
                                      <packing>
 
                                        <property name="expand">False</property>
 
                                        <property name="position">2</property>
 
                                      </packing>
 
                                    </child>
 
                                    <child>
 
                                      <object class="GtkCheckButton" id="checkbutton1">
 
                                        <property name="label" translatable="yes">Pin to top</property>
 
                                        <property name="visible">True</property>
 
                                        <property name="can_focus">True</property>
 
                                        <property name="receives_default">False</property>
 
                                        <property name="draw_indicator">True</property>
 
                                      </object>
 
                                      <packing>
 
                                        <property name="expand">False</property>
 
                                        <property name="position">3</property>
 
                                      </packing>
 
                                    </child>
 
                                  </object>
 
                                  <packing>
 
                                    <property name="position">1</property>
 
                                  </packing>
 
                                </child>
 
                              </object>
 
                            </child>
 
                          </object>
 
                          <packing>
 
                            <property name="position">0</property>
 
                          </packing>
 
                          <placeholder/>
 
                        </child>
 
                        <child>
 
                          <placeholder/>
 
                        </child>
 
                        <child>
 
                          <placeholder/>
 
@@ -302,11 +191,122 @@
 
            <property name="position">1</property>
 
          </packing>
 
        </child>
 
      </object>
 
    </child>
 
  </object>
 
  <object class="GtkWindow" id="replayPanel">
 
    <child>
 
      <object class="GtkHBox" id="replayPanel2">
 
        <property name="visible">True</property>
 
        <child>
 
          <object class="GtkAspectFrame" id="aspectframe1">
 
            <property name="width_request">320</property>
 
            <property name="height_request">240</property>
 
            <property name="visible">True</property>
 
            <property name="label_xalign">0</property>
 
            <property name="shadow_type">out</property>
 
            <property name="ratio">1.3300000429153442</property>
 
            <child>
 
              <object class="GtkImage" id="image1">
 
                <property name="width_request">320</property>
 
                <property name="height_request">240</property>
 
                <property name="visible">True</property>
 
                <property name="stock">gtk-missing-image</property>
 
              </object>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="position">0</property>
 
          </packing>
 
        </child>
 
        <child>
 
          <object class="GtkVBox" id="vbox2">
 
            <property name="visible">True</property>
 
            <child>
 
              <object class="GtkHBox" id="hbox2">
 
                <property name="visible">True</property>
 
                <child>
 
                  <object class="GtkLabel" id="label5">
 
                    <property name="visible">True</property>
 
                    <property name="label" translatable="yes">Started:</property>
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
                    <property name="fill">False</property>
 
                    <property name="position">0</property>
 
                  </packing>
 
                </child>
 
                <child>
 
                  <object class="GtkEntry" id="entry1">
 
                    <property name="visible">True</property>
 
                    <property name="can_focus">True</property>
 
                    <property name="editable">False</property>
 
                    <property name="invisible_char">&#x25CF;</property>
 
                    <property name="width_chars">12</property>
 
                    <property name="text" translatable="yes">Sat 14:22:25</property>
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
                    <property name="fill">False</property>
 
                    <property name="position">1</property>
 
                  </packing>
 
                </child>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="position">0</property>
 
              </packing>
 
            </child>
 
            <child>
 
              <object class="GtkToggleButton" id="togglebutton1">
 
                <property name="label" translatable="yes">Enabled</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">True</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="position">1</property>
 
              </packing>
 
            </child>
 
            <child>
 
              <object class="GtkButton" id="button1">
 
                <property name="label" translatable="yes">Delete</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">True</property>
 
                <property name="image">image2</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="position">2</property>
 
              </packing>
 
            </child>
 
            <child>
 
              <object class="GtkCheckButton" id="checkbutton1">
 
                <property name="label" translatable="yes">Pin to top</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">False</property>
 
                <property name="draw_indicator">True</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="position">3</property>
 
              </packing>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="position">1</property>
 
          </packing>
 
        </child>
 
      </object>
 
    </child>
 
  </object>
 
  <object class="GtkImage" id="image2">
 
    <property name="visible">True</property>
 
    <property name="stock">gtk-delete</property>
 
  </object>
 
</interface>
0 comments (0 inline, 0 general)