Mercurial > code > home > repos > light9
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"><b>Live view</b></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"><b>Last log</b></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"><b>Playback 1</b></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"><b>Music position</b></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>