Mercurial > code > home > repos > light9
changeset 522:e20419d637d5
initial vidref tests
Ignore-this: f3ca12ad8071d889ed71689be0716827
author | drewp@bigasterisk.com |
---|---|
date | Tue, 08 Jun 2010 06:52:59 +0000 |
parents | fd4f06a93c95 |
children | 9f36a105adb3 |
files | bin/vidref light9/vidref/__init__.py light9/vidref/main.py light9/vidref/qt_test.py light9/vidref/vidref.glade light9/vidref/vidref.ui |
diffstat | 5 files changed, 514 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bin/vidref Tue Jun 08 06:52:59 2010 +0000 @@ -0,0 +1,8 @@ +#!/usr/bin/python +import gtk +from light9.vidref.main import Main + + +start=Main() +gtk.main() +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light9/vidref/main.py Tue Jun 08 06:52:59 2010 +0000 @@ -0,0 +1,126 @@ +#!/usr/bin/python +import pygst +pygst.require("0.10") +import gst, gobject +import pygtk +import gtk +from twisted.python.util import sibpath +import Image + +otherPic = None + + +import StringIO +# gtk.gdk.pixbuf_new_from_data(img.tostring() seems like it would be better +# http://www.daa.com.au/pipermail/pygtk/2003-June/005268.html +def Image_to_GdkPixbuf (image): + file = StringIO.StringIO () + image.save (file, 'ppm') + contents = file.getvalue() + file.close () + loader = gtk.gdk.PixbufLoader ('pnm') + loader.write (contents, len (contents)) + pixbuf = loader.get_pixbuf () + loader.close () + return pixbuf + +class MySink(gst.Element): + _sinkpadtemplate = gst.PadTemplate ("sinkpadtemplate", + gst.PAD_SINK, + gst.PAD_ALWAYS, + gst.caps_new_any()) + + def __init__(self): + gst.Element.__init__(self) + self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink") + self.add_pad(self.sinkpad) + self.sinkpad.set_chain_function(self.chainfunc) + + def chainfunc(self, pad, buffer): + global nextImageCb + self.info("%s timestamp(buffer):%d" % (pad, buffer.timestamp)) + + if 1: + try: + cap = buffer.caps[0] + img = Image.fromstring('RGB', (cap['width'], cap['height']), + buffer.data) + except: + import traceback + traceback.print_exc() + raise + + print "got image to save" + #pixbuf = Image_to_GdkPixbuf(img) + #otherPic.set_from_pixbuf(pixbuf) + + return gst.FLOW_OK +gobject.type_register(MySink) + +class Main(object): + def __init__(self): + global otherPic + wtree = gtk.Builder() + wtree.add_from_file(sibpath(__file__, "vidref.glade")) + mainwin = wtree.get_object("MainWindow") + otherPic = wtree.get_object("liveVideo") + mainwin.connect("destroy", gtk.main_quit) + wtree.connect_signals({ + "foo" : self.OnPlay, + }) + + pipeline = gst.Pipeline("player") + + def makeElem(t, n=None): + e = gst.element_factory_make(t, n) + pipeline.add(e) + return e + + if 0: + source = makeElem("videotestsrc", "video") + else: + source = makeElem("v4l2src", "vsource") + source.set_property("device", "/dev/video0") + + csp = makeElem("ffmpegcolorspace") + + caps = makeElem("capsfilter") + caps.set_property('caps', gst.caps_from_string('video/x-raw-rgb')) + + sink = makeElem("xvimagesink", "sink") + + recSink = MySink() + pipeline.add(recSink) + + # using this adds 5% cpu; not sure the advantage + scaler = makeElem("videoscale", "vscale") + + tee = makeElem("tee") + + source.link(csp) + csp.link(caps) + caps.link(tee) + tee.link(sink) + + tee.link(recSink) +# tee.link(sink2) + + mainwin.show_all() + +# sink2.set_xwindow_id(wtree.get_object("liveVideo").window.xid) + sink.set_xwindow_id(wtree.get_object("vid3").window.xid) + + pipeline.set_state(gst.STATE_PLAYING) + + def OnPlay(self, widget): + print "play" + # Tell the video sink to display the output in our DrawingArea + self.sinkx.set_xwindow_id(self.da.window.xid) + self.pipeline.set_state(gst.STATE_PLAYING) + + def OnStop(self, widget): + print "stop" + self.pipeline.set_state(gst.STATE_READY) + + def OnQuit(self, widget): + gtk.main_quit()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light9/vidref/qt_test.py Tue Jun 08 06:52:59 2010 +0000 @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +from PyQt4 import QtCore, QtGui, uic +import gst +import gobject + +class Vid(object): + def __init__(self, windowId): + self.player = gst.Pipeline("player") + self.source = gst.element_factory_make("v4l2src", "vsource") + self.sink = gst.element_factory_make("autovideosink", "outsink") + self.source.set_property("device", "/dev/video0") + self.scaler = gst.element_factory_make("videoscale", "vscale") + self.window_id = None + self.windowId = windowId + + self.fvidscale_cap = gst.element_factory_make("capsfilter", "fvidscale_cap") + self.fvidscale_cap.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) + + self.player.add(self.source, self.scaler, self.fvidscale_cap, self.sink) + gst.element_link_many(self.source,self.scaler, self.fvidscale_cap, self.sink) + + self.s = MySink() + self.player.add(self.s) +# self.scaler.link(self.s) + + bus = self.player.get_bus() + bus.add_signal_watch() +# bus.enable_sync_message_emission() # with this we segv +# bus.connect("message", self.on_message) # with this we segv + bus.connect("sync-message::element", self.on_sync_message) + + def on_message(self, bus, message): + print "msg", bus, message + t = message.type + if t == gst.MESSAGE_EOS: + self.player.set_state(gst.STATE_NULL) + elif t == gst.MESSAGE_ERROR: + err, debug = message.parse_error() + print "Error: %s" % err, debug + self.player.set_state(gst.STATE_NULL) + + def on_sync_message(self, bus, message): + print "syncmsg", bus, message + if message.structure is None: + return + message_name = message.structure.get_name() + if message_name == "prepare-xwindow-id": + print "pxi" + win_id = self.windowId + assert win_id + imagesink = message.src + imagesink.set_property("force-aspect-ratio", True) + print "set_xwindow_id" + imagesink.set_xwindow_id(win_id) + print "dnoe msg" + + def startPrev(self): + self.player.set_state(gst.STATE_PLAYING) + print "should be playing" + + +class MainWin(QtGui.QMainWindow): + def __init__(self, *args): + super(MainWin, self).__init__(*args) + + uic.loadUi('light9/vidref/vidref.ui', self) + v = Vid(self.liveView.winId()) + v.startPrev() + + @QtCore.pyqtSlot() + def startLiveView(self): + print "slv" + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light9/vidref/vidref.glade Tue Jun 08 06:52:59 2010 +0000 @@ -0,0 +1,71 @@ +<?xml version="1.0"?> +<interface> + <requires lib="gtk+" version="2.16"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkWindow" id="MainWindow"> + <property name="default_width">500</property> + <property name="default_height">500</property> + <child> + <object class="GtkFixed" id="fixed1"> + <property name="visible">True</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="width_request">85</property> + <property name="height_request">20</property> + <property name="visible">True</property> + <property name="yalign">0.47999998927116394</property> + <property name="label" translatable="yes">Live view</property> + </object> + <packing> + <property name="x">5</property> + <property name="y">16</property> + </packing> + </child> + <child> + <object class="GtkImage" id="liveVideo"> + <property name="width_request">320</property> + <property name="height_request">240</property> + <property name="visible">True</property> + </object> + <packing> + <property name="x">6</property> + <property name="y">40</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="width_request">338</property> + <property name="height_request">269</property> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <object class="GtkDrawingArea" id="vid3"> + <property name="width_request">100</property> + <property name="height_request">80</property> + <property name="visible">True</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Live view</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="x">332</property> + <property name="y">28</property> + </packing> + </child> + </object> + </child> + </object> +</interface>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/light9/vidref/vidref.ui Tue Jun 08 06:52:59 2010 +0000 @@ -0,0 +1,234 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>863</width> + <height>728</height> + </rect> + </property> + <property name="windowTitle"> + <string>MainWindow</string> + </property> + <widget class="QWidget" name="centralwidget"> + <widget class="QLabel" name="label"> + <property name="geometry"> + <rect> + <x>20</x> + <y>260</y> + <width>251</width> + <height>16</height> + </rect> + </property> + <property name="text"> + <string>Live view</string> + </property> + </widget> + <widget class="QWidget" name="liveView" native="true"> + <property name="geometry"> + <rect> + <x>20</x> + <y>10</y> + <width>320</width> + <height>240</height> + </rect> + </property> + </widget> + <widget class="QCheckBox" name="checkBox"> + <property name="geometry"> + <rect> + <x>50</x> + <y>280</y> + <width>121</width> + <height>19</height> + </rect> + </property> + <property name="text"> + <string>enabled</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + <widget class="QTableWidget" name="tableWidget"> + <property name="geometry"> + <rect> + <x>50</x> + <y>470</y> + <width>171</width> + <height>121</height> + </rect> + </property> + <row> + <property name="text"> + <string>song</string> + </property> + </row> + <row> + <property name="text"> + <string>time</string> + </property> + </row> + <column> + <property name="text"> + <string>value</string> + </property> + </column> + <item row="0" column="0"> + <property name="text"> + <string>whatever</string> + </property> + </item> + </widget> + <widget class="QLabel" name="label_3"> + <property name="geometry"> + <rect> + <x>40</x> + <y>340</y> + <width>52</width> + <height>13</height> + </rect> + </property> + <property name="text"> + <string>Song</string> + </property> + </widget> + <widget class="QLabel" name="label_4"> + <property name="geometry"> + <rect> + <x>40</x> + <y>360</y> + <width>52</width> + <height>13</height> + </rect> + </property> + <property name="text"> + <string>Time</string> + </property> + </widget> + <widget class="QLineEdit" name="lineEdit"> + <property name="geometry"> + <rect> + <x>90</x> + <y>330</y> + <width>113</width> + <height>23</height> + </rect> + </property> + </widget> + <widget class="QLineEdit" name="lineEdit_2"> + <property name="geometry"> + <rect> + <x>90</x> + <y>360</y> + <width>113</width> + <height>23</height> + </rect> + </property> + </widget> + <widget class="QScrollArea" name="scrollArea"> + <property name="geometry"> + <rect> + <x>570</x> + <y>330</y> + <width>191</width> + <height>191</height> + </rect> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>189</width> + <height>189</height> + </rect> + </property> + </widget> + </widget> + <widget class="QGroupBox" name="groupBox"> + <property name="geometry"> + <rect> + <x>270</x> + <y>310</y> + <width>411</width> + <height>331</height> + </rect> + </property> + <property name="title"> + <string>Replay from 16:10</string> + </property> + <widget class="QGraphicsView" name="graphicsView_2"> + <property name="geometry"> + <rect> + <x>20</x> + <y>30</y> + <width>311</width> + <height>231</height> + </rect> + </property> + </widget> + <widget class="QCheckBox" name="checkBox_2"> + <property name="geometry"> + <rect> + <x>60</x> + <y>270</y> + <width>191</width> + <height>19</height> + </rect> + </property> + <property name="text"> + <string>follow current time</string> + </property> + </widget> + <zorder>graphicsView_2</zorder> + <zorder>graphicsView_2</zorder> + <zorder>checkBox_2</zorder> + </widget> + </widget> + <widget class="QMenuBar" name="menubar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>863</width> + <height>21</height> + </rect> + </property> + </widget> + <widget class="QStatusBar" name="statusbar"/> + <widget class="QToolBar" name="toolBar"> + <property name="windowTitle"> + <string>toolBar</string> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + </widget> + <widget class="QToolBar" name="toolBar_2"> + <property name="windowTitle"> + <string>toolBar_2</string> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + </widget> + </widget> + <resources/> + <connections/> + <slots> + <slot>startLiveView()</slot> + </slots> +</ui>