summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHung <zxiiro@gmail.com>2010-01-30 17:07:22 -0500
committerHung <zxiiro@gmail.com>2010-01-30 17:07:22 -0500
commit6f814ea140109acd6ce9e08d8e47dcbc0e685298 (patch)
tree2667fafc725e49c20c795ab683635a9b7a46fd09
parent356aae7f97e8ae0f45c2e891cd5bda2fa052141d (diff)
downloadfreeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.tar.gz
freeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.tar.xz
freeseer-6f814ea140109acd6ce9e08d8e47dcbc0e685298.zip
Merge wasn't complete
-rw-r--r--freeseer-gui-gtk.py57
-rwxr-xr-xfreeseer-gui-qt.py310
-rwxr-xr-xfreeseer.py184
-rwxr-xr-xtalks.txt2
4 files changed, 0 insertions, 553 deletions
diff --git a/freeseer-gui-gtk.py b/freeseer-gui-gtk.py
deleted file mode 100644
index ea44126..0000000
--- a/freeseer-gui-gtk.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/python
-
-# freeseer - vga/presentation capture software
-#
-# Copyright (C) 2010 Free and Open Source Software Learning Centre
-# http://fosslc.org
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# For support, questions, suggestions or any other inquiries, visit:
-# the #fosslc channel on IRC (freenode.net)
-
-from freeseer import *
-import sys, os
-import pygtk, gtk
-
-class GTK_Main:
- def __init__(self):
- window = gtk.Window(gtk.WINDOW_TOPLEVEL)
- window.set_title("FreeSeeR GTK GUI - example")
- window.set_default_size(480,320)
- window.connect("destroy", gtk.main_quit, "WM destroy")
- vbox = gtk.VBox()
- window.add(vbox)
- self.button = gtk.Button("Record")
- self.button.connect("clicked", self.record)
- vbox.add(self.button)
- self.videosrc_list = gtk.combo_box_new_text()
- self.videosrc_list.append_text('v4lsrc')
- self.videosrc_list.append_text('v4l2src')
- vbox.add(self.videosrc_list)
- self.videobox = gtk.DrawingArea()
- vbox.add(self.videobox)
- window.show_all()
-
- self.freeseer = FreeSeeR()
- self.freeseer.enable_preview(self.videobox.window.xid)
-
- def record(self, w):
- self.freeseer.change_videosrc(self.videosrc_list.get_active_text(), '/dev/video0')
- self.freeseer.record('default.mkv')
-
-GTK_Main()
-gtk.gdk.threads_init()
-gtk.main()
-
diff --git a/freeseer-gui-qt.py b/freeseer-gui-qt.py
deleted file mode 100755
index 60e57d0..0000000
--- a/freeseer-gui-qt.py
+++ /dev/null
@@ -1,310 +0,0 @@
-#!/usr/bin/python
-
-# freeseer - vga/presentation capture software
-#
-# Copyright (C) 2010 Free and Open Source Software Learning Centre
-# http://fosslc.org
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# For support, questions, suggestions or any other inquiries, visit:
-# the #fosslc channel on IRC (freenode.net)
-
-NAME = "freeseer"
-VERSION = "playground"
-
-from freeseer import *
-import os, sys, time, alsaaudio, audioop
-from PyQt4 import QtGui, QtCore
-
-CONFIG = dict()
-
-# Initialize some defaults
-PWD = os.getcwd()
-TALKSFILE = sys.path[0] + '/talks.txt'
-CONFIG['FILENAME'] = 'default.mkv'
-CONFIG['FILE_INDEX'] = 0
-CONFIG['VODEVICE'] = '/dev/video0'
-CONFIG['VODRIVER'] = 'v4l2src'
-
-# Find video devices
-viddevs=0
-dev='/dev/video' + str(viddevs)
-while QtCore.QFile.exists(dev):
- print 'Video device ' + str(viddevs) + ' found.'
- viddevs=viddevs+1
- dev='/dev/video'+str(viddevs)
-print 'Found ' + str(viddevs) + ' video devices.'
-
-###########################################
-#
-# Widget to hold GST Player window instance
-#
-###########################################
-class GSTPlayerWidget(QtGui.QWidget):
-
- def __init__(self, parent):
- QtGui.QWidget.__init__(self, parent)
- self.freeseer = FreeSeeR()
- self.change_videosrc()
- self.freeseer.enable_preview(self.winId())
-
- def change_videosrc(self):
- self.freeseer.change_videosrc(str(CONFIG['VODRIVER']), str(CONFIG['VODEVICE']))
-
- def record(self):
- self.freeseer.record(str(CONFIG['FILENAME']))
-
- def stop(self):
- self.freeseer.stop()
-
-class volcheck(QtCore.QThread):
- def __init__(self, parent):
- QtCore.QThread.__init__(self, parent)
- self.parent = parent
-
- def run(self):
- self.run = True
- inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NONBLOCK)
- inp.setchannels(2)
- inp.setrate(8000)
- inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
-
- inp.setperiodsize(160)
-
- while self.run:
- l,data = inp.read()
- if l:
- #print audioop.max(data, 2)
- self.parent.volume.setValue(audioop.max(data, 2))
- time.sleep(.001)
-
-class EditTalks(QtGui.QWidget):
- def __init__(self, parent=None):
- QtGui.QWidget.__init__(self, parent)
-
- # Layout
- layout = QtGui.QHBoxLayout()
-
- leftside = QtGui.QVBoxLayout()
- self.editBox = QtGui.QLineEdit()
- leftside.addWidget(self.editBox)
-
- self.talkList = QtGui.QListWidget()
- leftside.addWidget(self.talkList)
-
- rightside = QtGui.QVBoxLayout()
- self.addTalkButton = QtGui.QPushButton('add')
- rightside.addWidget(self.addTalkButton)
- self.delTalkButton = QtGui.QPushButton('remove')
- rightside.addWidget(self.delTalkButton)
- self.savTalkButton = QtGui.QPushButton('save')
- rightside.addWidget(self.savTalkButton)
-
- layout.addLayout(leftside)
- layout.addLayout(rightside)
- self.setLayout(layout)
- # End Layout
-
- # Connections
- self.connect(self.addTalkButton, QtCore.SIGNAL('clicked()'), self.addTalk)
- self.connect(self.delTalkButton, QtCore.SIGNAL('clicked()'), self.delTalk)
- self.connect(self.savTalkButton, QtCore.SIGNAL('clicked()'), self.saveTalks)
-
- # Add talks
- file = QtCore.QFile(TALKSFILE)
- file.open(QtCore.QIODevice.ReadOnly)
-
- txtStream = QtCore.QTextStream(file)
- while not txtStream.atEnd():
- text = txtStream.readLine()
- self.talkList.addItem(text)
- file.close()
-
- def addTalk(self):
- self.talkList.addItem(self.editBox.text())
-
- def delTalk(self):
- self.talkList.takeItem(self.talkList.currentRow())
-
- def saveTalks(self):
- file = QtCore.QFile(TALKSFILE)
- file.open(QtCore.QIODevice.WriteOnly)
-
- txtStream = QtCore.QTextStream(file)
- i = 0
- while i < self.talkList.count():
- txtStream << self.talkList.item(i).text() << '\n'
- i = i+1
-
- txtStream.flush()
- file.flush()
- file.close()
-
-class MainApp(QtGui.QWidget):
-
- def __init__(self, parent=None):
- QtGui.QWidget.__init__(self, parent)
-
- #############################
- # Begin Layout
- #############################
- layout = QtGui.QVBoxLayout()
- playerbox = QtGui.QHBoxLayout()
-
- self.record = QtGui.QPushButton("Record")
- self.record.setCheckable(True)
- layout.addWidget(self.record)
-
- videoLabel = QtGui.QLabel('Device:')
- videoLabel.setMaximumWidth(50)
- self.videoDevices = QtGui.QComboBox()
- i = 0
- while i < viddevs:
- self.videoDevices.addItem('/dev/video' + str(i))
- i=i+1
- self.videoDevices.addItem('/dev/fw1')
- self.videoDrivers = QtGui.QComboBox()
- self.videoDrivers.addItem('v4l2src')
- self.videoDrivers.addItem('v4lsrc')
- self.videoDrivers.addItem('dv1394src')
- self.videoDrivers.addItem('ximagesrc')
- viddevLayout = QtGui.QHBoxLayout()
- viddevLayout.addWidget(videoLabel)
- viddevLayout.addWidget(self.videoDevices)
- viddevLayout.addWidget(self.videoDrivers)
- layout.addLayout(viddevLayout)
-
- talkLabel = QtGui.QLabel('Title:')
- talkLabel.setMaximumWidth(50)
- self.talk = QtGui.QComboBox()
- self.talk.addItem('Foo Bar - Test Presentation')
- self.talkEditButton = QtGui.QPushButton("Edit")
- self.talkEditButton.setMaximumWidth(50)
- talkLayout = QtGui.QHBoxLayout()
- talkLayout.addWidget(talkLabel)
- talkLayout.addWidget(self.talk)
- talkLayout.addWidget(self.talkEditButton)
- layout.addLayout(talkLayout)
-
- self.playerWidget = GSTPlayerWidget(self)
- playerbox.addWidget(self.playerWidget)
-
- self.volume = QtGui.QSlider(QtCore.Qt.Vertical, self)
- self.volume.setFocusPolicy(QtCore.Qt.NoFocus)
- self.volume.setRange(1, 32768)
- playerbox.addWidget(self.volume)
-
- layout.addLayout(playerbox)
-
- self.logger = QtGui.QTextBrowser(self)
- self.logger.setMaximumHeight(30)
- layout.addWidget(self.logger)
-
- self.setLayout(layout)
- ##############################
- # End layout
- ##############################
-
- # Connections
- self.connect(self.record, QtCore.SIGNAL('toggled(bool)'), self.Capture)
- self.connect(self.talkEditButton, QtCore.SIGNAL('clicked()'), self.editTalks)
- self.connect(self.videoDevices, QtCore.SIGNAL('currentIndexChanged(int)'), self.changeVideoDevice)
- self.connect(self.videoDrivers, QtCore.SIGNAL('currentIndexChanged(int)'), self.changeVideoDevice)
-
- self.volcheck = volcheck(self)
- self.volcheck.start()
-
- # Add talks
- file = QtCore.QFile(TALKSFILE)
- file.open(QtCore.QIODevice.ReadOnly)
-
- txtStream = QtCore.QTextStream(file)
- while not txtStream.atEnd():
- text = txtStream.readLine()
- self.talk.addItem(text)
- file.close()
-
- def changeVideoDevice(self):
- print 'Changing video devices'
- self.playerWidget.stop()
- CONFIG['VODEVICE'] = self.videoDevices.currentText()
- CONFIG['VODRIVER'] = self.videoDrivers.currentText()
- self.playerWidget.change_videosrc()
-
- def closeEvent(self, event):
- print 'Exiting freeseer...'
- self.volcheck.run = False
- self.playerWidget.stop()
- event.accept()
-
- def editTalks(self):
- self.talkEdit = EditTalks()
- self.talkEdit.show()
- self.talkEdit.resize(480, 320)
-
- # Check capture status, sets filename, and begin capture.
- def Capture(self):
-
- if not (self.record.isChecked()):
- self.stopCapture()
- return
-
- self.checkFileExists()
- self.startCapture()
-
- # checks if a filename exists or not and increments index until it finds
- # at filename that is not taken
- def checkFileExists(self):
- i = 0
- while True:
- CONFIG['FILENAME'] = QtCore.QDate.currentDate().toString(QtCore.Qt.ISODate) + " " + self.talk.currentText() + " (" + str(i) + ").mkv"
- rfile = QtCore.QFileInfo(CONFIG['FILENAME'])
-
- if (rfile.exists()):
- i += 1
- print "File Exists. Incrementing index to " + str(i)
- else:
- break
-
- def startCapture(self):
- self.playerWidget.record()
- self.record.setText('Stop')
- self.videoDevices.setEnabled(False)
- self.videoDrivers.setEnabled(False)
- self.talk.setEnabled(False)
- print 'Started capture'
-
- def stopCapture(self):
- self.record.setText('Record')
- self.playerWidget.stop()
- self.videoDevices.setEnabled(True)
- self.videoDrivers.setEnabled(True)
- self.talk.setEnabled(True)
- print 'Stopped capture'
-
-
-
-#######################
-# Program starts here #
-#######################
-gobject.threads_init()
-app = QtGui.QApplication(sys.argv)
-
-widget = MainApp()
-widget.show()
-widget.resize(480, 320)
-
-sys.exit(app.exec_())
-
diff --git a/freeseer.py b/freeseer.py
deleted file mode 100755
index d88abba..0000000
--- a/freeseer.py
+++ /dev/null
@@ -1,184 +0,0 @@
-# freeseer - vga/presentation capture software
-#
-# Copyright (C) 2010 Free and Open Source Software Learning Centre
-# http://fosslc.org
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# For support, questions, suggestions or any other inquiries, visit:
-# the #fosslc channel on IRC (freenode.net)
-
-import gobject, pygst
-pygst.require("0.10")
-import gst
-
-class FreeSeeR:
- def __init__(self):
- self.window_id = None
-
- self.viddrv = 'v4lsrc'
- self.viddev = '/dev/video0'
- self.filename = 'default.mkv'
- self.video_codec = 'theoraenc'
- self.audio_codec = 'vorbisenc'
-
- self.player = gst.Pipeline("player")
-
- # GST Video
- self.vidsrc = gst.element_factory_make(self.viddrv, "vidsrc")
- self.cspace = gst.element_factory_make("ffmpegcolorspace", "cspace")
- self.vidtee = gst.element_factory_make("tee", "vidtee")
- self.vidqueue1 = gst.element_factory_make("queue", "vidqueue1")
- self.vidqueue2 = gst.element_factory_make("queue", "vidqueue2")
- self.vidcodec = gst.element_factory_make(self.video_codec, "vidcodec")
- self.vidsink = gst.element_factory_make("autovideosink", "vidsink")
-
- # GST Video Filtering
- self.fvidrate = gst.element_factory_make("videorate", "fvidrate")
- self.fvidrate_cap = gst.element_factory_make("capsfilter", "fvidrate_cap")
- self.fvidrate_cap.set_property('caps', gst.caps_from_string('video/x-raw-yuv, framerate=25/1'))
- self.fvidscale = gst.element_factory_make("videoscale", "fvidscale")
- 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=720, height=480'))
- self.fvidcspace = gst.element_factory_make("ffmpegcolorspace", "fvidcspace")
-
-
- # GST Sound
- self.sndsrc = gst.element_factory_make("alsasrc", "sndsrc")
- self.sndtee = gst.element_factory_make("tee", "sndtee")
- self.sndqueue1 = gst.element_factory_make("queue", "sndqueue1")
- self.sndqueue2 = gst.element_factory_make("queue", "sndqueue2")
- self.audioconvert = gst.element_factory_make("audioconvert", "audioconvert")
- self.sndcodec = gst.element_factory_make(self.audio_codec, "sndcodec")
- self.sndsink = gst.element_factory_make("autoaudiosink", "sndsink")
-
- # GST Muxer
- self.mux = gst.element_factory_make("matroskamux", "mux")
- self.filesink = gst.element_factory_make("filesink", "filesink")
- self.filesink.set_property("location", 'default.mkv')
-
- # GST Add Components
- self.player.add(self.vidsrc, self.cspace, self.vidtee, self.vidqueue1, self.vidcodec)
- self.player.add(self.fvidrate, self.fvidrate_cap, self.fvidscale, self.fvidscale_cap, self.fvidcspace)
- self.player.add(self.sndsrc, self.sndtee, self.sndqueue1, self.audioconvert, self.sndcodec)
- self.player.add(self.mux, self.filesink)
-
- # GST Link Components
- gst.element_link_many(self.vidsrc, self.cspace, self.fvidrate, self.fvidrate_cap, self.fvidscale, self.fvidscale_cap, self.fvidcspace, self.vidtee)
- gst.element_link_many(self.vidtee, self.vidqueue1, self.vidcodec, self.mux)
- gst.element_link_many(self.sndsrc, self.sndtee)
- gst.element_link_many(self.sndtee, self.sndqueue1, self.audioconvert, self.sndcodec, self.mux)
- gst.element_link_many(self.mux, self.filesink)
-
- bus = self.player.get_bus()
- bus.add_signal_watch()
- bus.enable_sync_message_emission()
- bus.connect("message", self.on_message)
- bus.connect("sync-message::element", self.on_sync_message)
-
- def on_message(self, 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):
- if message.structure is None:
- return
- message_name = message.structure.get_name()
- if message_name == "prepare-xwindow-id":
- imagesink = message.src
- imagesink.set_property("force-aspect-ratio", True)
- imagesink.set_xwindow_id(self.window_id)
-
- def change_videosrc(self, new_source, new_device):
- if (self.viddrv == 'dv1394src'):
- self.player.remove(self.dv1394q1)
- self.player.remove(self.dv1394q2)
- self.player.remove(self.dv1394dvdemux)
- self.player.remove(self.dv1394dvdec)
- self.dv1394q1 = None
- self.dv1394q2 = None
- self.dv1394dvdemux = None
- self.dv1394dvdec = None
-
- self.viddrv = new_source
- self.viddev = new_device
- self.player.remove(self.vidsrc)
- self.vidsrc = gst.element_factory_make(self.viddrv, "vidsrc")
- self.player.add(self.vidsrc)
-
- if (self.viddrv == 'v4lsrc'):
- self.vidsrc.set_property("device", self.viddev)
- elif (self.viddrv == 'v4l2src'):
- self.vidsrc.set_property("device", self.viddev)
- elif (self.viddrv == 'dv1394src'):
- self.dv1394q1 = gst.element_factory_make("queue", "dv1394q1")
- self.dv1394q2 = gst.element_factory_make("queue", "dv1394q2")
- self.dv1394dvdemux = gst.element_factory_make("dvdemux", "dv1394dvdemux")
- self.dv1394dvdec = gst.element_factory_make("dvdec", "dv1394dvdec")
- self.player.add(self.dv1394q1, self.dv1394q2, self.dv1394dvdemux, self.dv1394dvdec)
- gst.element_link_many(self.vidsrc, self.dv1394q1, self.dv1394dvdemux, self.dv1394q2, self.dv1394dvdec, self.cspace)
- return
-
- gst.element_link_many(self.vidsrc, self.cspace)
-
- def record(self, filename):
- self.filename = filename
- self.filesink.set_property("location", self.filename)
- self.player.set_state(gst.STATE_PLAYING)
-
- def stop(self):
- self.player.set_state(gst.STATE_NULL)
-
- def change_video_codec(self, new_vcodec):
- self.video_codec = new_vcodec
- self.player.remove(self.vidcodec)
- self.vidcodec = gst.element_factory_make(self.video_codec, "vidcodec")
- self.player.add(self.vidcodec)
- gst.element_link_many(self.vidqueue1, self.vidcodec, self.mux)
-
- def change_audio_codec(self, new_acodec):
- self.audio_codec = new_acodec
- self.player.remove(self.sndcodec)
- self.sndcodec = gst.element_factory_make(self.audio_codec, "sndcodec")
- self.player.add(self.sndcodec)
- gst.element_link_many(self.audioconvert, self.sndcodec, self.mux)
-
- def change_muxer(self, new_mux):
- self.muxer = new_mux
- self.player.remove(self.mux)
- self.mux = gst.element_factory_make(self.muxer, "mux")
- self.player.add(self.mux)
- gst.element_link_many(self.sndcodec, self.mux)
- gst.element_link_many(self.vidcodec, self.mux)
- gst.element_link_many(self.mux, self.filesink)
-
- def enable_preview(self, window_id):
- self.window_id = window_id
- self.player.add(self.vidqueue2, self.vidsink)
- gst.element_link_many(self.vidtee, self.vidqueue2, self.vidsink)
-
- def disable_preview(self):
- self.player.remove(self.vidqueue2, self.vidsink)
-
- def enable_audio_feedback(self):
- self.player.add(self.sndqueue2, self.sndsink)
- gst.element_link_many(self.sndtee, self.sndqueue2, self.sndsink)
-
- def disable_audio_feedback(self):
- self.player.remove(self.sndqueue2, self.sndsink) \ No newline at end of file
diff --git a/talks.txt b/talks.txt
deleted file mode 100755
index 5a70aa6..0000000
--- a/talks.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Thanh Ha - Intro to PyQt4
-Thanh Ha - Intro to freeseer