changeset 1089:2ee97997ee56

vidref now reads from picamserve Ignore-this: 17bc49636b291f6640f2f2a4a8f93e40
author Drew Perttula <drewp@bigasterisk.com>
date Thu, 05 Jun 2014 07:22:29 +0000
parents bb92c50438ed
children 95b03a865879
files bin/picamserve bin/vidref light9/vidref/main.py light9/vidref/musictime.py light9/vidref/remotepivideo.py light9/vidref/replay.py light9/vidref/vidref.glade pydeps
diffstat 8 files changed, 218 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/bin/picamserve	Thu Jun 05 05:54:18 2014 +0000
+++ b/bin/picamserve	Thu Jun 05 07:22:29 2014 +0000
@@ -20,7 +20,7 @@
         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))
--- a/bin/vidref	Thu Jun 05 05:54:18 2014 +0000
+++ b/bin/vidref	Thu Jun 05 07:22:29 2014 +0000
@@ -25,11 +25,7 @@
 (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
--- a/light9/vidref/main.py	Thu Jun 05 05:54:18 2014 +0000
+++ b/light9/vidref/main.py	Thu Jun 05 07:22:29 2014 +0000
@@ -12,6 +12,7 @@
 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 @@
         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
--- a/light9/vidref/musictime.py	Thu Jun 05 05:54:18 2014 +0000
+++ b/light9/vidref/musictime.py	Thu Jun 05 07:22:29 2014 +0000
@@ -40,7 +40,7 @@
         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:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/light9/vidref/remotepivideo.py	Thu Jun 05 07:22:29 2014 +0000
@@ -0,0 +1,115 @@
+"""
+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()
--- a/light9/vidref/replay.py	Thu Jun 05 05:54:18 2014 +0000
+++ b/light9/vidref/replay.py	Thu Jun 05 07:22:29 2014 +0000
@@ -117,14 +117,11 @@
         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)
--- a/light9/vidref/vidref.glade	Thu Jun 05 05:54:18 2014 +0000
+++ b/light9/vidref/vidref.glade	Thu Jun 05 07:22:29 2014 +0000
@@ -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 @@
                             <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 @@
                         <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 @@
                 <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 @@
                     <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 @@
                 <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 @@
             <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 @@
           </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 @@
                 <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 @@
                     <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 @@
               </object>
               <packing>
                 <property name="expand">False</property>
+                <property name="fill">True</property>
                 <property name="position">0</property>
               </packing>
             </child>
@@ -359,9 +436,11 @@
                 <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 @@
                 <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 @@
                 <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>
--- a/pydeps	Thu Jun 05 05:54:18 2014 +0000
+++ b/pydeps	Thu Jun 05 07:22:29 2014 +0000
@@ -17,4 +17,5 @@
 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