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): |
36 | 36 | super(Gplay, self).__init__() |
37 | 37 | self.activity = activity_obj |
38 | 38 | 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 |
40 | 41 | |
41 | 42 | bus = self._player.get_bus() |
42 | 43 | bus.add_signal_watch() |
43 | 44 | bus.connect('message::error', self._bus_error) |
44 | 45 | bus.connect('message::eos', self._bus_eos) |
45 | 46 | |
| 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 | |
46 | 72 | def _bus_error(self, bus, message): |
47 | 73 | err, debug = message.parse_error() |
48 | 74 | logger.error('bus error=%s debug=%s' % (err, debug)) |
… |
… |
class Gplay(gobject.GObject): |
77 | 103 | if self.get_state() == gst.STATE_PLAYING: |
78 | 104 | return |
79 | 105 | |
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) |
84 | 112 | |
85 | | self.activity.set_gplay_sink(self._player.props.video_sink) |
86 | 113 | self._player.set_state(gst.STATE_PLAYING) |
87 | 114 | self._emit_playback_status(0) |
88 | 115 | |
… |
… |
class Gplay(gobject.GObject): |
113 | 140 | |
114 | 141 | self._player.set_state(gst.STATE_NULL) |
115 | 142 | self._emit_playback_status(0) |
116 | | |
diff --git a/record.py b/record.py
index e25010e..19d9ac3 100644
a
|
b
|
class Record(activity.Activity): |
284 | 284 | def set_gplay_sink(self, sink): |
285 | 285 | return self._media_view.set_video2_sink(sink) |
286 | 286 | |
| 287 | def get_media_view_allocation(self): |
| 288 | return self._media_view.allocation |
| 289 | |
287 | 290 | def get_selected_quality(self): |
288 | 291 | return self._toolbar_controls.get_quality() |
289 | 292 | |