Changeset - f233fa1ec801
[Not reviewed]
default
0 3 0
drewp@bigasterisk.com - 15 years ago 2010-06-15 06:22:40
drewp@bigasterisk.com
vidref displays the directory it's writing frames ot
Ignore-this: fe5419f4c36e596c1fd2cf5612dde9b3
3 files changed with 57 insertions and 5 deletions:
0 comments (0 inline, 0 general)
light9/vidref/main.py
Show inline comments
 
@@ -60,26 +60,27 @@ class MusicTime(object):
 
            # fraction of the way through)
 
            self.positionFetchTime = time.time()
 
            
 
            self.position = position
 
            time.sleep(self.period)
 
        
 
class VideoRecordSink(gst.Element):
 
    _sinkpadtemplate = gst.PadTemplate ("sinkpadtemplate",
 
                                        gst.PAD_SINK,
 
                                        gst.PAD_ALWAYS,
 
                                        gst.caps_new_any())
 

	
 
    def __init__(self, musicTime):
 
    def __init__(self, musicTime, updateRecordingTo):
 
        gst.Element.__init__(self)
 
        self.updateRecordingTo = updateRecordingTo
 
        self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink")
 
        self.add_pad(self.sinkpad)
 
        self.sinkpad.set_chain_function(self.chainfunc)
 
        self.lastTime = 0
 
        
 
        self.musicTime = musicTime
 

	
 
        self.imagesToSave = Queue()
 
        self.startBackgroundImageSaver(self.imagesToSave)
 
        
 
    def startBackgroundImageSaver(self, imagesToSave):
 
        """do image saves in another thread to not block gst"""
 
@@ -120,37 +121,40 @@ class VideoRecordSink(gst.Element):
 
        try:
 
            os.makedirs(outDir)
 
        except OSError:
 
            pass
 

	
 
        img.save(outFilename)
 

	
 
        now = time.time()
 
        log.debug("wrote %s delay of %.2fms, took %.2fms",
 
                  outFilename,
 
                  (now - self.lastTime) * 1000,
 
                  (now - t1) * 1000)
 
        self.updateRecordingTo(outDir)
 
        self.lastTime = now
 

	
 
gobject.type_register(VideoRecordSink)
 

	
 
class Main(object):
 
    def __init__(self):
 
        self.musicTime = MusicTime()
 
        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.recordingTo = wtree.get_object('recordingTo')
 

	
 
        # wtree.get_object("replayPanel").show() # demo only
 
        rp = wtree.get_object("replayVbox")
 
        self.replayViews = ReplayViews(rp)
 

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

	
 
        self.setInput('dv') # auto seems to not search for dv
 

	
 
        gobject.timeout_add(1000 // framerate, self.updateLoop)
 

	
 
    def updateLoop(self):
 
@@ -177,25 +181,33 @@ class Main(object):
 
              "videorate ! video/x-raw-yuv,framerate=%s/1 ! "
 
              "videoscale ! video/x-raw-yuv,width=320,height=240;video/x-raw-rgb,width=320,height=240 ! "
 
              "queue name=vid" % framerate)
 

	
 
        self.pipeline = gst.parse_launch(cam)
 

	
 
        def makeElem(t, n=None):
 
            e = gst.element_factory_make(t, n)
 
            self.pipeline.add(e)
 
            return e
 
        
 
        sink = makeElem("xvimagesink")
 
        recSink = VideoRecordSink(self.musicTime)
 
        def setRec(t):
 
            # if you're selecting the text while gtk is updating it,
 
            # you can get a crash in xcb_io
 
            if getattr(self, '_lastRecText', None) == t:
 
                return
 
            with gtk.gdk.lock:
 
                self.recordingTo.set_text(t)
 
            self._lastRecText = t
 
        recSink = VideoRecordSink(self.musicTime, setRec)
 
        self.pipeline.add(recSink)
 

	
 
        tee = makeElem("tee")
 
        
 
        caps = makeElem("capsfilter")
 
        caps.set_property('caps', gst.caps_from_string('video/x-raw-rgb'))
 

	
 
        gst.element_link_many(self.pipeline.get_by_name("vid"), tee, sink)
 
        gst.element_link_many(tee, makeElem("ffmpegcolorspace"), caps, recSink)
 
        sink.set_xwindow_id(self.liveVideoXid)
 
        self.pipeline.set_state(gst.STATE_PLAYING)        
 

	
light9/vidref/replay.py
Show inline comments
 
@@ -45,25 +45,30 @@ class ReplayViews(object):
 
            v.updatePic(position)
 
        log.debug("update %s views in %.2fms",
 
                  len(self.views), (time.time() - t1) * 1000)
 

	
 
    def loadViewsForSong(self, song):
 
        """
 
        replace previous views, and cleanup short ones
 
        """
 
        for v in self.views:
 
            v.destroy()
 
        self.views[:] = []
 

	
 
        takes = sorted(os.listdir(songDir(song)))
 
        d = songDir(song)
 
        try:
 
            takes = sorted(os.listdir(d))
 
        except OSError:
 
            return
 
        
 
        for take in takes:
 
            td = takeDir(songDir(song), take)
 
            r = Replay(td)
 
            if r.tooShort():
 
                log.warn("cleaning up %s; too short" % r.takeDir)
 
                r.deleteDir()
 
                continue
 
            rv = ReplayView(self.parent, r)
 
            self.views.append(rv)
 

	
 
class ReplayView(object):
 
    """
light9/vidref/vidref.glade
Show inline comments
 
@@ -65,27 +65,28 @@
 
                    <property name="expand">False</property>
 
                    <property name="position">0</property>
 
                  </packing>
 
                </child>
 
                <child>
 
                  <object class="GtkHBox" id="hbox4">
 
                    <property name="visible">True</property>
 
                    <child>
 
                      <object class="GtkLabel" id="label1">
 
                        <property name="width_request">75</property>
 
                        <property name="height_request">20</property>
 
                        <property name="visible">True</property>
 
                        <property name="label" translatable="yes">Frame rate</property>
 
                        <property name="label" translatable="yes">Frame rate:</property>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">False</property>
 
                        <property name="position">0</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkSpinButton" id="liveFrameRate">
 
                        <property name="width_request">52</property>
 
                        <property name="height_request">25</property>
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">True</property>
 
                        <property name="numeric">True</property>
 
                      </object>
 
                      <packing>
 
@@ -97,45 +98,76 @@
 
                    <property name="expand">False</property>
 
                    <property name="position">1</property>
 
                  </packing>
 
                </child>
 
                <child>
 
                  <object class="GtkHBox" id="hbox5">
 
                    <property name="visible">True</property>
 
                    <child>
 
                      <object class="GtkLabel" id="label4">
 
                        <property name="width_request">85</property>
 
                        <property name="height_request">20</property>
 
                        <property name="visible">True</property>
 
                        <property name="label" translatable="yes">Input source</property>
 
                        <property name="label" translatable="yes">Input source:</property>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">False</property>
 
                        <property name="position">0</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkComboBox" id="videoSource">
 
                        <property name="width_request">100</property>
 
                        <property name="visible">True</property>
 
                      </object>
 
                      <packing>
 
                        <property name="position">1</property>
 
                      </packing>
 
                    </child>
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
                    <property name="position">2</property>
 
                  </packing>
 
                </child>
 
                <child>
 
                  <object class="GtkHBox" id="hbox1">
 
                    <property name="visible">True</property>
 
                    <child>
 
                      <object class="GtkLabel" id="label6">
 
                        <property name="visible">True</property>
 
                        <property name="label" translatable="yes">Recording
 
to:</property>
 
                      </object>
 
                      <packing>
 
                        <property name="position">0</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkTextView" id="recordingToView">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">True</property>
 
                        <property name="editable">False</property>
 
                        <property name="wrap_mode">char</property>
 
                        <property name="buffer">recordingTo</property>
 
                      </object>
 
                      <packing>
 
                        <property name="position">1</property>
 
                      </packing>
 
                    </child>
 
                  </object>
 
                  <packing>
 
                    <property name="position">3</property>
 
                  </packing>
 
                </child>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="position">1</property>
 
              </packing>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="position">0</property>
 
          </packing>
 
        </child>
 
@@ -298,13 +330,16 @@
 
          <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>
 
  <object class="GtkTextBuffer" id="recordingTo">
 
    <property name="text" translatable="yes">/home/drewp/light9-vidref/play-light9.bigasterisk.com_show_dance2010_song6/1276582699</property>
 
  </object>
 
</interface>
0 comments (0 inline, 0 general)