Changeset - 2ee97997ee56
[Not reviewed]
default
0 7 1
Drew Perttula - 11 years ago 2014-06-05 07:22:29
drewp@bigasterisk.com
vidref now reads from picamserve
Ignore-this: 17bc49636b291f6640f2f2a4a8f93e40
8 files changed with 218 insertions and 23 deletions:
0 comments (0 inline, 0 general)
bin/picamserve
Show inline comments
 
@@ -20,7 +20,7 @@ except ImportError:
 
        def capture_continuous(self, *a, **kw):
 
            for i in range(1000):
 
                time.sleep(1)
 
                yield i
 
                yield str(i)
 

	
 
def setCameraParams(c, arg):
 
    res = int(arg('res', 480))
bin/vidref
Show inline comments
 
@@ -25,11 +25,7 @@ parser.add_option("-v", "--verbose", act
 
(options, args) = parser.parse_args()
 

	
 

	
 
log.setLevel(logging.DEBUG)
 
# limit the stdout one, but leave debug messages for the gtk logger
 
log.handlers[0].setLevel(logging.DEBUG if options.verbose else logging.WARN)
 
logging.getLogger("restkit.client").setLevel(logging.WARN)
 

	
 
log.setLevel(logging.DEBUG if options.verbose else logging.INFO)
 

	
 
class Snapshot(cyclone.web.RequestHandler):
 
    @defer.inlineCallbacks
light9/vidref/main.py
Show inline comments
 
@@ -12,6 +12,7 @@ from twisted.python.util import sibpath
 
from light9.vidref.replay import ReplayViews, framerate
 
from light9.vidref.musictime import MusicTime
 
from light9.vidref.videorecorder import Pipeline
 
from light9.vidref import remotepivideo
 
log = logging.getLogger()
 

	
 
class Gui(object):
 
@@ -39,8 +40,17 @@ class Gui(object):
 
        mainwin.show_all()
 
        vid3 = wtree.get_object("vid3")
 

	
 
        self.pipeline = Pipeline(vid3.window.xid, self.musicTime,
 
                                 self.recordingTo)
 
        if 0:
 
            self.pipeline = Pipeline(
 
                liveVideoXid=vid3.window.xid,
 
                musicTime=self.musicTime,
 
                recordingTo=self.recordingTo)
 
        else:
 
            self.pipeline = remotepivideo.Pipeline(
 
                liveVideo=vid3,
 
                musicTime=self.musicTime,
 
                recordingTo=self.recordingTo,
 
                picsUrl='http://10.1.0.125:8001/pics?res=1080&resize=450&x=0&y=.3&w=1&h=.5&awb_mode=auto&exposure_mode=auto')
 

	
 
        vid3.props.width_request = 360
 
        vid3.props.height_request = 220
light9/vidref/musictime.py
Show inline comments
 
@@ -40,7 +40,7 @@ class MusicTime(object):
 
        if not hasattr(self, 'position'):
 
            return {'t' : 0, 'song' : None}
 
        pos = self.position.copy()
 
        if pos['playing']:
 
        if pos.get('playing'):
 
            pos['t'] = pos['t'] + (time.time() - self.positionFetchTime)
 
        else:
 
            if self.lastHoverTime is not None:
light9/vidref/remotepivideo.py
Show inline comments
 
new file 100644
 
"""
 
like videorecorder.py, but talks to a bin/picamserve instance
 
"""
 
import os, time, logging
 
import gtk
 
import numpy
 
import treq
 
from light9.vidref.replay import framerate, songDir, takeDir, snapshotDir
 
from light9 import prof
 
from PIL import Image
 
from StringIO import StringIO
 
log = logging.getLogger('remotepi')
 

	
 
class Pipeline(object):
 
    def __init__(self, liveVideo, musicTime, recordingTo, picsUrl):
 
        self.musicTime = musicTime
 
        self.recordingTo = recordingTo
 

	
 
        self.liveVideo = self._replaceLiveVideoWidget(liveVideo)
 
        
 
        self._startRequest(picsUrl)
 
        self._buffer = ''
 

	
 
    def _replaceLiveVideoWidget(self, liveVideo):
 
        aspectFrame = liveVideo.get_parent()
 
        liveVideo.destroy()
 
        img = gtk.Image()
 
        img.set_visible(True)
 
        #img.set_size_request(320, 240)
 
        aspectFrame.add(img)
 
        return img
 
        
 
    def _startRequest(self, url):
 
        d = treq.get(url)
 
        d.addCallback(treq.collect, self._dataReceived)
 
        # not sure how to stop this
 
        return d
 

	
 
    def _dataReceived(self, chunk):
 
        self._buffer += chunk
 
        if len(self._buffer) < 100:
 
            return
 
        i = self._buffer.index('\n')
 
        size, frameTime = self._buffer[:i].split()
 
        size = int(size)
 
        if len(self._buffer) - i - 1 < size:
 
            return
 
        jpg = self._buffer[i+1:i+1+size]
 
        self.onFrame(jpg, float(frameTime))
 
        self._buffer = self._buffer[i+1+size:]
 
        
 
    def snapshot(self):
 
        """
 
        returns deferred to the path (which is under snapshotDir()) where
 
        we saved the image.
 
        """
 
        filename = "%s/%s.jpg" % (snapshotDir(), time.time())
 
        return
 

	
 
    def setInput(self, name):
 
        pass
 

	
 
    def setLiveVideo(self, on):
 
        print "setLiveVideo", on
 

	
 
    def onFrame(self, jpg, frameTime):
 
        position = self.musicTime.getLatest()
 
        if not position['song']:
 
            self.updateLiveFromTemp(jpg)
 
            return 
 
        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
 
            self.updateLiveFromTemp(jpg)
 
            return
 
        try:
 
            os.makedirs(outDir)
 
        except OSError:
 
            pass
 
        with open(outFilename, 'w') as out:
 
            out.write(jpg)
 

	
 
        self.updateLiveFromFile(outFilename)
 
            
 
        # if you're selecting the text while gtk is updating it,
 
        # you can get a crash in xcb_io
 
        if getattr(self, '_lastRecText', None) != outDir:
 
            with gtk.gdk.lock:
 
                self.recordingTo.set_text(outDir)
 
            self._lastRecText = outDir
 
            
 
    def updateLiveFromFile(self, outFilename):
 
        self.liveVideo.set_from_file(outFilename)
 

	
 
    def updateLiveFromTemp(self, jpg):
 
        try:
 
            img = Image.open(StringIO(jpg))
 
            if not hasattr(self, 'livePixBuf'):
 
                self.livePixBuf = gtk.gdk.pixbuf_new_from_data(
 
                    img.tostring(),
 
                    gtk.gdk.COLORSPACE_RGB,
 
                    False, 8,
 
                    img.size[0], img.size[1],
 
                    img.size[0]*3)
 
                log.info("live images are %r", img.size)
 
            else:
 
                # don't leak pixbufs; update the one we have
 
                a = self.livePixBuf.pixel_array
 
                newImg = numpy.fromstring(img.tostring(), dtype=numpy.uint8)
 
                a[:,:,:] = newImg.reshape(a.shape)
 
            self.liveVideo.set_from_pixbuf(self.livePixBuf)
 

	
 
        except Exception:
 
            import traceback
 
            traceback.print_exc()
light9/vidref/replay.py
Show inline comments
 
@@ -117,14 +117,11 @@ class ReplayView(object):
 
        if True:
 
            af = gtk.AspectFrame()
 
            af.set_visible(True)
 
            w,h = (640-140-110), (480-130-70)
 
            af.set_size_request(w, h)
 
            af.set_shadow_type(gtk.SHADOW_OUT)
 
            af.props.obey_child = True
 

	
 
            img = gtk.Image()
 
            img.set_visible(True)
 
            img.set_size_request(w, h)
 
            self.picWidget = img
 

	
 
            af.add(img)
light9/vidref/vidref.glade
Show inline comments
 
@@ -3,28 +3,34 @@
 
  <requires lib="gtk+" version="2.16"/>
 
  <!-- interface-naming-policy project-wide -->
 
  <object class="GtkWindow" id="MainWindow">
 
    <property name="can_focus">False</property>
 
    <property name="title" translatable="yes">vidref</property>
 
    <property name="default_width">690</property>
 
    <property name="default_height">500</property>
 
    <child>
 
      <object class="GtkVBox" id="vbox1">
 
        <property name="visible">True</property>
 
        <property name="can_focus">False</property>
 
        <child>
 
          <object class="GtkHBox" id="hbox3">
 
            <property name="visible">True</property>
 
            <property name="can_focus">False</property>
 
            <child>
 
              <object class="GtkVBox" id="vbox3">
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <child>
 
                  <object class="GtkFrame" id="frame1">
 
                    <property name="width_request">336</property>
 
                    <property name="width_request">450</property>
 
                    <property name="height_request">277</property>
 
                    <property name="visible">True</property>
 
                    <property name="can_focus">False</property>
 
                    <property name="label_xalign">0</property>
 
                    <property name="shadow_type">out</property>
 
                    <child>
 
                      <object class="GtkAspectFrame" id="aspectframe2">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</property>
 
                        <property name="label_xalign">0</property>
 
                        <property name="shadow_type">none</property>
 
                        <property name="ratio">1.3300000429153442</property>
 
@@ -33,6 +39,7 @@
 
                            <property name="width_request">320</property>
 
                            <property name="height_request">240</property>
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">False</property>
 
                          </object>
 
                        </child>
 
                      </object>
 
@@ -40,6 +47,7 @@
 
                    <child type="label">
 
                      <object class="GtkLabel" id="label2">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</property>
 
                        <property name="label" translatable="yes">&lt;b&gt;Live view&lt;/b&gt;</property>
 
                        <property name="use_markup">True</property>
 
                      </object>
 
@@ -47,12 +55,14 @@
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
                    <property name="fill">True</property>
 
                    <property name="position">0</property>
 
                  </packing>
 
                </child>
 
                <child>
 
                  <object class="GtkVBox" id="vbox4">
 
                    <property name="visible">True</property>
 
                    <property name="can_focus">False</property>
 
                    <child>
 
                      <object class="GtkToggleButton" id="liveVideoEnabled">
 
                        <property name="label" translatable="yes">Enabled</property>
 
@@ -61,26 +71,31 @@
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">True</property>
 
                        <property name="receives_default">True</property>
 
                        <property name="use_action_appearance">False</property>
 
                        <property name="active">True</property>
 
                        <signal name="toggled" handler="on_liveVideoEnabled_toggled"/>
 
                        <signal name="toggled" handler="on_liveVideoEnabled_toggled" swapped="no"/>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">False</property>
 
                        <property name="fill">True</property>
 
                        <property name="position">0</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkHBox" id="hbox4">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</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="can_focus">False</property>
 
                            <property name="label" translatable="yes">Frame rate:</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">False</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">0</property>
 
                          </packing>
 
                        </child>
 
@@ -91,30 +106,40 @@
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">True</property>
 
                            <property name="invisible_char">●</property>
 
                            <property name="primary_icon_activatable">False</property>
 
                            <property name="secondary_icon_activatable">False</property>
 
                            <property name="primary_icon_sensitive">True</property>
 
                            <property name="secondary_icon_sensitive">True</property>
 
                            <property name="numeric">True</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">True</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">1</property>
 
                          </packing>
 
                        </child>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">False</property>
 
                        <property name="fill">True</property>
 
                        <property name="position">1</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkHBox" id="hbox5">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</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="can_focus">False</property>
 
                            <property name="label" translatable="yes">Input source:</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">False</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">0</property>
 
                          </packing>
 
                        </child>
 
@@ -122,27 +147,35 @@
 
                          <object class="GtkComboBox" id="videoSource">
 
                            <property name="width_request">100</property>
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">False</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">True</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">1</property>
 
                          </packing>
 
                        </child>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">False</property>
 
                        <property name="fill">True</property>
 
                        <property name="position">2</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkHBox" id="hbox1">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</property>
 
                        <child>
 
                          <object class="GtkLabel" id="label6">
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">False</property>
 
                            <property name="label" translatable="yes">Recording
 
to:</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">True</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">0</property>
 
                          </packing>
 
                        </child>
 
@@ -155,17 +188,22 @@ to:</property>
 
                            <property name="buffer">recordingTo</property>
 
                          </object>
 
                          <packing>
 
                            <property name="expand">True</property>
 
                            <property name="fill">True</property>
 
                            <property name="position">1</property>
 
                          </packing>
 
                        </child>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">True</property>
 
                        <property name="fill">True</property>
 
                        <property name="position">3</property>
 
                      </packing>
 
                    </child>
 
                    <child>
 
                      <object class="GtkFrame" id="frame2">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</property>
 
                        <property name="label_xalign">0</property>
 
                        <property name="shadow_type">none</property>
 
                        <child>
 
@@ -179,24 +217,29 @@ to:</property>
 
                        <child type="label">
 
                          <object class="GtkLabel" id="label8">
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">False</property>
 
                            <property name="label" translatable="yes">&lt;b&gt;Last log&lt;/b&gt;</property>
 
                            <property name="use_markup">True</property>
 
                          </object>
 
                        </child>
 
                      </object>
 
                      <packing>
 
                        <property name="expand">True</property>
 
                        <property name="fill">True</property>
 
                        <property name="position">4</property>
 
                      </packing>
 
                    </child>
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
                    <property name="fill">True</property>
 
                    <property name="position">1</property>
 
                  </packing>
 
                </child>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="fill">True</property>
 
                <property name="position">0</property>
 
              </packing>
 
            </child>
 
@@ -205,6 +248,7 @@ to:</property>
 
                <property name="width_request">336</property>
 
                <property name="height_request">259</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <property name="label_xalign">0</property>
 
                <property name="shadow_type">out</property>
 
                <child>
 
@@ -219,10 +263,12 @@ to:</property>
 
                    <child>
 
                      <object class="GtkViewport" id="replayScroll">
 
                        <property name="visible">True</property>
 
                        <property name="can_focus">False</property>
 
                        <property name="resize_mode">queue</property>
 
                        <child>
 
                          <object class="GtkVBox" id="replayVbox">
 
                            <property name="visible">True</property>
 
                            <property name="can_focus">False</property>
 
                            <child>
 
                              <placeholder/>
 
                            </child>
 
@@ -241,28 +287,35 @@ to:</property>
 
                <child type="label">
 
                  <object class="GtkLabel" id="label3">
 
                    <property name="visible">True</property>
 
                    <property name="can_focus">False</property>
 
                    <property name="label" translatable="yes">&lt;b&gt;Playback 1&lt;/b&gt;</property>
 
                    <property name="use_markup">True</property>
 
                  </object>
 
                </child>
 
              </object>
 
              <packing>
 
                <property name="expand">True</property>
 
                <property name="fill">True</property>
 
                <property name="position">1</property>
 
              </packing>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">True</property>
 
            <property name="fill">True</property>
 
            <property name="position">0</property>
 
          </packing>
 
        </child>
 
        <child>
 
          <object class="GtkFrame" id="musicPosition">
 
            <property name="visible">True</property>
 
            <property name="can_focus">False</property>
 
            <property name="label_xalign">0</property>
 
            <property name="shadow_type">none</property>
 
            <child>
 
              <object class="GtkAlignment" id="alignment1">
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <property name="left_padding">12</property>
 
                <child>
 
                  <object class="GtkHScale" id="musicScale">
 
@@ -276,6 +329,7 @@ to:</property>
 
            <child type="label">
 
              <object class="GtkLabel" id="label7">
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <property name="label" translatable="yes">&lt;b&gt;Music position&lt;/b&gt;</property>
 
                <property name="use_markup">True</property>
 
              </object>
 
@@ -283,21 +337,34 @@ to:</property>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="fill">True</property>
 
            <property name="position">1</property>
 
          </packing>
 
        </child>
 
      </object>
 
    </child>
 
  </object>
 
  <object class="GtkImage" id="image2">
 
    <property name="visible">True</property>
 
    <property name="can_focus">False</property>
 
    <property name="stock">gtk-delete</property>
 
  </object>
 
  <object class="GtkTextBuffer" id="lastLog"/>
 
  <object class="GtkTextBuffer" id="recordingTo">
 
    <property name="text" translatable="yes">/home/drewp/light9-vidref/play-light9.bigasterisk.com_show_dance2010_song6/1276582699</property>
 
  </object>
 
  <object class="GtkWindow" id="replayPanel">
 
    <property name="can_focus">False</property>
 
    <child>
 
      <object class="GtkHBox" id="replayPanel2">
 
        <property name="visible">True</property>
 
        <property name="can_focus">False</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="can_focus">False</property>
 
            <property name="label_xalign">0</property>
 
            <property name="shadow_type">out</property>
 
            <property name="ratio">1.3300000429153442</property>
 
@@ -306,24 +373,29 @@ to:</property>
 
                <property name="width_request">320</property>
 
                <property name="height_request">240</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <property name="stock">gtk-missing-image</property>
 
              </object>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="fill">True</property>
 
            <property name="position">0</property>
 
          </packing>
 
        </child>
 
        <child>
 
          <object class="GtkVBox" id="vbox2">
 
            <property name="visible">True</property>
 
            <property name="can_focus">False</property>
 
            <child>
 
              <object class="GtkHBox" id="hbox2">
 
                <property name="visible">True</property>
 
                <property name="can_focus">False</property>
 
                <child>
 
                  <object class="GtkLabel" id="label5">
 
                    <property name="visible">True</property>
 
                    <property name="can_focus">False</property>
 
                    <property name="label" translatable="yes">Started:</property>
 
                  </object>
 
                  <packing>
 
@@ -340,6 +412,10 @@ to:</property>
 
                    <property name="invisible_char">●</property>
 
                    <property name="width_chars">12</property>
 
                    <property name="text" translatable="yes">Sat 14:22:25</property>
 
                    <property name="primary_icon_activatable">False</property>
 
                    <property name="secondary_icon_activatable">False</property>
 
                    <property name="primary_icon_sensitive">True</property>
 
                    <property name="secondary_icon_sensitive">True</property>
 
                  </object>
 
                  <packing>
 
                    <property name="expand">False</property>
 
@@ -350,6 +426,7 @@ to:</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="fill">True</property>
 
                <property name="position">0</property>
 
              </packing>
 
            </child>
 
@@ -359,9 +436,11 @@ to:</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">True</property>
 
                <property name="use_action_appearance">False</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="fill">True</property>
 
                <property name="position">1</property>
 
              </packing>
 
            </child>
 
@@ -371,10 +450,12 @@ to:</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">True</property>
 
                <property name="use_action_appearance">False</property>
 
                <property name="image">image2</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="fill">True</property>
 
                <property name="position">2</property>
 
              </packing>
 
            </child>
 
@@ -384,28 +465,23 @@ to:</property>
 
                <property name="visible">True</property>
 
                <property name="can_focus">True</property>
 
                <property name="receives_default">False</property>
 
                <property name="use_action_appearance">False</property>
 
                <property name="draw_indicator">True</property>
 
              </object>
 
              <packing>
 
                <property name="expand">False</property>
 
                <property name="fill">True</property>
 
                <property name="position">3</property>
 
              </packing>
 
            </child>
 
          </object>
 
          <packing>
 
            <property name="expand">False</property>
 
            <property name="fill">True</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>
 
  <object class="GtkTextBuffer" id="lastLog"/>
 
</interface>
pydeps
Show inline comments
 
@@ -17,4 +17,5 @@ python-dateutil==2.2
 
txosc==0.2.0
 
service_identity==0.2
 
Pillow==2.4.0
 
faulthandler==2.3
 
\ No newline at end of file
 
faulthandler==2.3
 
treq==0.2.1
 
\ No newline at end of file
0 comments (0 inline, 0 general)