Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Olivier Aubert <olivier.aubert <at> liris.cnrs.fr>
Subject: Re: Managing single buffers (snapshot functionality)
Newsgroups: gmane.comp.video.gstreamer.devel
Date: Tuesday 3rd April 2007 20:15:24 UTC (over 10 years ago)
On Tue, 2007-01-16 at 15:09 +0100, Olivier Aubert wrote:
> The problem I am facing is the snapshot functionality. The playbin
> plugin offers a 'frame' property which points a gstBuffer containing the
> last decoded frame, in whatever format has been negociated in the
> pipeline. Now, I need this frame in PNG.

Just replying to myself... As I did not get any answer, but in the end
figured out how to do it, I am posting the solution I use. It may be of
use to someone else. It defines a conversion pipeline, that can take a
single gst.Buffer (obtained from the 'frame' property of the playbin
element) and convert it to png. In addition, some locking is used to
obtain a synchronous behaviour (the snapshot method returns the PNG
snapshot).

#! /usr/bin/python

import gst
import time
import gtk
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,width=160 ! 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')

# 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()
    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()
    return b

player.props.uri='file:///tmp/foo.avi'
player.set_state(gst.STATE_PLAYING)

gtk.main()



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share
your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
 
CD: 3ms