#! /usr/bin/python

import gst
import time
import gtk
import gtk.glade
import pygtk
from threading import Condition

player=gst.element_factory_make("playbin", "player")
p_conv=gst.parse_launch('fakesrc name=src ! queue name=queue ! videoscale ! ffmpegcolorspace ! video/x-raw-rgb ! pngenc ! fakesink name=sink signal-handoffs=true')
p_conv._lock = Condition()

src=p_conv.get_by_name('src')
queue=p_conv.get_by_name('queue')
sink=p_conv.get_by_name('sink')

#player.props.uri='file:///tmp/foo.avi'
player.props.uri='file:////home/rgareus/ext/video/oceanwaves-xj.avi'

# Run the p_conv pipeline
p_conv.set_state(gst.STATE_PLAYING)

def buffer_cb(element, buffer, pad):
    print "Snapshot captured", buffer.timestamp / gst.MSECOND
    p_conv._lock.acquire()
    p_conv._buffer=buffer
    p_conv._lock.notify()
    p_conv._lock.release()
    p_conv.timestamp=buffer.timestamp / gst.MSECOND
    return True

sink.connect('handoff', buffer_cb)

def snapshot():
    """Synchronous snapshot method.

    Returns a gst.Buffer containing a scaled-down PNG version of the
    current frame.
    """
    # Get the current frame
    b=player.props.frame.copy()

    # Lock the snapshot object
    p_conv._lock.acquire()
    p_conv._buffer=None

    # Push it into the conversion pipeline
    queue.get_pad('src').push(b)

    # Wait for the lock to be released
    while p_conv._buffer is None:
        p_conv._lock.wait()

    b=p_conv._buffer.copy()
    p_conv._lock.release()

    fn="/tmp/snapshot-%07i.png" % p_conv.timestamp
    print "saving "+fn
    f=open(fn, 'w')
    f.write(b)


def OnPlay(widget):
	print "play"
	player.set_state(gst.STATE_PLAYING)

def OnSnapshot(widget):
	print "snapshot"
	snapshot()

def OnPause(widget):
	print "pause"
	player.set_state(gst.STATE_PAUSED)

def OnStop(widget):
	print "stop"
	player.set_state(gst.STATE_READY)
	
def OnQuit(widget):
	gtk.main_quit()



wTree = gtk.glade.XML("gui.glade", "mainwindow")
		
signals = {
	"on_play_clicked" : OnPlay,
	"on_stop_clicked" : OnStop,
	"on_quit_clicked" : OnQuit,
	"on_snap_clicked" : OnSnapshot,
	"on_pause_clicked" : OnPause,
}

wTree.signal_autoconnect(signals)
window = wTree.get_widget("mainwindow")
window.show_all()
gtk.main()


