qtdemux: Don't emit GstSegment correcting start time when in MSE mode
[platform/upstream/gstreamer.git] / subprojects / gst-python / old_examples / buffer-draw.py
1 #!/usr/bin/env python
2
3 import sys
4 import traceback
5 from math import pi
6
7 import pygtk
8 pygtk.require ("2.0")
9 import gobject
10 gobject.threads_init()
11
12 import pygst
13 pygst.require('0.10')
14 import gst
15
16 import cairo
17
18 WIDTH, HEIGHT = 640, 480
19 FRAMES = 300
20 FRAMERATE = 15
21
22 class PyGstBufferDraw(gst.Element):
23     _sinkpadtemplate = gst.PadTemplate ("sink",
24                                          gst.PAD_SINK,
25                                          gst.PAD_ALWAYS,
26                                          gst.caps_from_string ("video/x-raw-rgb,bpp=32,depth=32,blue_mask=-16777216,green_mask=16711680, red_mask=65280, alpha_mask=255,width=[ 1, 2147483647 ],height=[ 1, 2147483647 ],framerate=[ 0/1, 2147483647/1 ]"))
27     _srcpadtemplate = gst.PadTemplate ("src",
28                                          gst.PAD_SRC,
29                                          gst.PAD_ALWAYS,
30                                          gst.caps_from_string ("video/x-raw-rgb,bpp=32,depth=32,blue_mask=-16777216,green_mask=16711680, red_mask=65280, alpha_mask=255,width=[ 1, 2147483647 ],height=[ 1, 2147483647 ],framerate=[ 0/1, 2147483647/1 ]"))
31
32     def __init__(self):
33         gst.Element.__init__(self)
34
35         self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink")
36         self.sinkpad.set_chain_function(self.chainfunc)
37         self.sinkpad.set_event_function(self.eventfunc)
38         self.sinkpad.set_getcaps_function(gst.Pad.proxy_getcaps)
39         self.sinkpad.set_setcaps_function(gst.Pad.proxy_setcaps)
40         self.add_pad (self.sinkpad)
41
42         self.srcpad = gst.Pad(self._srcpadtemplate, "src")
43
44         self.srcpad.set_event_function(self.srceventfunc)
45         self.srcpad.set_query_function(self.srcqueryfunc)
46         self.srcpad.set_getcaps_function(gst.Pad.proxy_getcaps)
47         self.srcpad.set_setcaps_function(gst.Pad.proxy_setcaps)
48         self.add_pad (self.srcpad)
49
50     def chainfunc(self, pad, buffer):
51         try:
52             outbuf = buffer.copy_on_write ()
53             self.draw_on (outbuf)
54             return self.srcpad.push (outbuf)
55         except:
56             return GST_FLOW_ERROR
57
58     def eventfunc(self, pad, event):
59         return self.srcpad.push_event (event)
60         
61     def srcqueryfunc (self, pad, query):
62         return self.sinkpad.query (query)
63     def srceventfunc (self, pad, event):
64         return self.sinkpad.push_event (event)
65
66     def draw_on (self, buf):
67         try:
68             caps = buf.get_caps()
69             width = caps[0]['width']
70             height = caps[0]['height']
71             framerate = caps[0]['framerate']
72             surface = cairo.ImageSurface.create_for_data (buf, cairo.FORMAT_ARGB32, width, height, 4 * width)
73             ctx = cairo.Context(surface)
74         except:
75             print "Failed to create cairo surface for buffer"
76             traceback.print_exc()
77             return
78
79         try:
80             center_x = width/4
81             center_y = 3*height/4
82
83             # draw a circle
84             radius = float (min (width, height)) * 0.25
85             ctx.set_source_rgba (0.0, 0.0, 0.0, 0.9)
86             ctx.move_to (center_x, center_y)
87             ctx.arc (center_x, center_y, radius, 0, 2.0*pi)
88             ctx.close_path()
89             ctx.fill()
90             ctx.set_source_rgba (1.0, 1.0, 1.0, 1.0)
91             ctx.set_font_size(0.3 * radius)
92             txt = "Hello World"
93             extents = ctx.text_extents (txt)
94             ctx.move_to(center_x - extents[2]/2, center_y + extents[3]/2)
95             ctx.text_path(txt)
96             ctx.fill()
97
98         except:
99             print "Failed cairo render"
100             traceback.print_exc()
101
102 gobject.type_register(PyGstBufferDraw)
103
104 pipe = gst.Pipeline()
105 vt = gst.element_factory_make ("videotestsrc")
106 cf = gst.element_factory_make ("capsfilter")
107 c1 = PyGstBufferDraw()
108 color = gst.element_factory_make ("ffmpegcolorspace")
109 scale = gst.element_factory_make ("videoscale")
110 q1 = gst.element_factory_make ("queue")
111 sink = gst.element_factory_make ("autovideosink")
112
113 caps = gst.caps_from_string ("video/x-raw-rgb,width=%d,height=%d,framerate=%d/1" % (WIDTH, HEIGHT, FRAMERATE))
114 cf.set_property ("caps", caps)
115
116 vt.set_property ("num-buffers", FRAMES)
117
118 pipe.add (vt, cf, c1, q1, color, scale, sink)
119 gst.element_link_many (vt, cf, c1, q1, color, scale, sink)
120
121 def on_eos (bus, msg):
122     mainloop.quit()
123
124 bus = pipe.get_bus()
125 bus.add_signal_watch()
126 bus.connect('message::eos', on_eos)
127
128 pipe.set_state (gst.STATE_PLAYING)
129
130 mainloop = gobject.MainLoop()
131 try:
132     mainloop.run()
133 except:
134     pass
135
136 pipe.set_state (gst.STATE_NULL)
137 pipe.get_state (gst.CLOCK_TIME_NONE)
138