Ticket #4491: 0001-create-gst.bin-for-video-playback.patch

File 0001-create-gst.bin-for-video-playback.patch, 3.4 KB (added by walter, 11 years ago)
  • gplay.py

    From 582d7b6be8a20c577024e808db51056f4b78d7b3 Mon Sep 17 00:00:00 2001
    From: Walter Bender <walter@sugarlabs.org>
    Date: Tue, 28 May 2013 15:00:35 -0400
    Subject: [PATCH] create gst.bin for video playback
    
    ---
     gplay.py  | 40 +++++++++++++++++++++++++++++++++-------
     record.py |  3 +++
     2 files changed, 36 insertions(+), 7 deletions(-)
    
    diff --git a/gplay.py b/gplay.py
    index 168fb22..72a507c 100644
    a b class Gplay(gobject.GObject): 
    3636        super(Gplay, self).__init__()
    3737        self.activity = activity_obj
    3838        self._playback_monitor_handler = None
    39         self._player = gst.element_factory_make('playbin')
     39        self._player = gst.element_factory_make('playbin2', 'player')
     40        self._videosink = None
    4041
    4142        bus = self._player.get_bus()
    4243        bus.add_signal_watch()
    4344        bus.connect('message::error', self._bus_error)
    4445        bus.connect('message::eos', self._bus_eos)
    4546
     47    def _setup_video_bin(self):
     48        ''' Setup a gst bin for playing back video '''
     49        self.bin = gst.Bin()
     50        videoscale = gst.element_factory_make('videoscale')
     51        self.bin.add(videoscale)
     52        pad = videoscale.get_pad('sink')
     53        ghostpad = gst.GhostPad('sink', pad)
     54        self.bin.add_pad(ghostpad)
     55        videoscale.set_property('method', 0)
     56
     57        caps_string = 'video/x-raw-yuv, '
     58        logger.debug(self.activity.get_media_view_allocation)
     59        r = self.activity.get_media_view_allocation()
     60        caps_string += 'width=%d, height=%d' % (r[2], r[3])
     61        caps = gst.Caps(caps_string)
     62        self.filter = gst.element_factory_make('capsfilter', 'filter')
     63        self.bin.add(self.filter)
     64        self.filter.set_property('caps', caps)
     65
     66        conv = gst.element_factory_make('ffmpegcolorspace', 'conv')
     67        self.bin.add(conv)
     68        self.bin.add(self._videosink)
     69        gst.element_link_many(videoscale, self.filter, conv, self._videosink)
     70        self._player.set_property('video-sink', self.bin)
     71
    4672    def _bus_error(self, bus, message):
    4773        err, debug = message.parse_error()
    4874        logger.error('bus error=%s debug=%s' % (err, debug))
    class Gplay(gobject.GObject): 
    77103        if self.get_state() == gst.STATE_PLAYING:
    78104            return
    79105
    80         if not self._player.props.video_sink:
    81             sink = gst.element_factory_make('xvimagesink')
    82             sink.props.force_aspect_ratio = True
    83             self._player.props.video_sink = sink
     106        if self._videosink is None:
     107            self._videosink = gst.element_factory_make('xvimagesink')
     108            self._videosink.props.force_aspect_ratio = True
     109            self._setup_video_bin()
     110
     111        self.activity.set_gplay_sink(self._videosink)
    84112
    85         self.activity.set_gplay_sink(self._player.props.video_sink)
    86113        self._player.set_state(gst.STATE_PLAYING)
    87114        self._emit_playback_status(0)
    88115
    class Gplay(gobject.GObject): 
    113140
    114141        self._player.set_state(gst.STATE_NULL)
    115142        self._emit_playback_status(0)
    116 
  • record.py

    diff --git a/record.py b/record.py
    index e25010e..19d9ac3 100644
    a b class Record(activity.Activity): 
    284284    def set_gplay_sink(self, sink):
    285285        return self._media_view.set_video2_sink(sink)
    286286
     287    def get_media_view_allocation(self):
     288        return self._media_view.allocation
     289
    287290    def get_selected_quality(self):
    288291        return self._toolbar_controls.get_quality()
    289292