tapas icon indicating copy to clipboard operation
tapas copied to clipboard

Python Gstreamer plugin not working - no video output

Open shamidrasool opened this issue 7 years ago • 6 comments

System: Ubuntu 14.04 osboxes.org image with 3.13.0-112-generic kernel

No video output even with explicit -m gst option selected. IIRC video output played smoothly a few months earlier on a similar machine.

Command: sudo python play.py -a max -m gst -u http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd

Output: 2017-03-24 11:43:26+0500 [-] Log opened. 2017-03-24 11:43:26+0500 [-] http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd ^C2017-03-24 11:45:05+0500 [-] Received SIGINT, shutting down. 2017-03-24 11:45:05+0500 [-] Main loop terminated.

Fake option also returns verbose errors related to python and twisted.

shamidrasool avatar Mar 24 '17 06:03 shamidrasool

What Python version are you using? Can you please attach the error messages that are returned when running with the fake media renderer? You should make sure to resolve any Python related issues first before trying to debug the GStreamer stuff.

pckbls avatar Mar 24 '17 13:03 pckbls

Hi @shamidrasool , as @pckbls correctly mentions, probably you are missing some python dependencies. Can you confirm you have installed all the required packages? Try to run: GST_DEBUG=2 DEBUG=2 python play.py -a max -m fake -u http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd

and check if some gstreamer plugin is missing.

ldecicco avatar Mar 24 '17 18:03 ldecicco

osboxes@osboxes:~$ python -V Python 2.7.6

I have rechecked the dependencies:

gstreamer0.10-plugins-base is already the newest version.
gstreamer0.10-plugins-base-apps is already the newest version.
gstreamer0.10-plugins-base-dbg is already the newest version.
gstreamer0.10-plugins-base-doc is already the newest version.
gstreamer0.10-tools is already the newest version.
libgstreamer0.10-dev is already the newest version.
python-gst0.10 is already the newest version.
python-gst0.10-dbg is already the newest version.
python-gst0.10-dev is already the newest version.
python-psutil is already the newest version.
python-twisted is already the newest version.
python-twisted-bin is already the newest version.
python-twisted-core is already the newest version.
python-twisted-web is already the newest version.
gstreamer0.10-plugins-cutter is already the newest version.
gstreamer0.10-plugins-ugly is already the newest version.
gstreamer0.10-plugins-ugly-dbg is already the newest version.
gstreamer0.10-plugins-ugly-doc is already the newest version.
python-gst0.10-rtsp is already the newest version.
python-scipy is already the newest version.
gstreamer0.10-plugins-bad-multiverse is already the newest version.
gstreamer0.10-plugins-bad-multiverse-dbg is already the newest version.
gstreamer0.10-plugins-good is already the newest version.
gstreamer0.10-plugins-good-dbg is already the newest version.
gstreamer0.10-plugins-good-doc is already the newest version.
gstreamer0.10-plugins-bad is already the newest version.
gstreamer0.10-plugins-bad-dbg is already the newest version.
gstreamer0.10-plugins-bad-doc is already the newest version.
gstreamer0.10-ffmpeg is already the newest version.
python-psutil is already the newest version.
python-twisted is already the newest version.
python-twisted-bin is already the newest version.
python-twisted-core is already the newest version.
python-twisted-web is already the newest version.
python-scipy is already the newest version.

shamidrasool avatar Mar 25 '17 06:03 shamidrasool

Here is the output of debug command:

osboxes@osboxes:~/tapas-master$ GST_DEBUG=2 DEBUG=2 python play.py -a max -m gst -u http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd
2017-03-25 11:34:41+0500 [-] Log opened.
2017-03-25 11:34:43+0500 [-] http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd
2017-03-25 11:34:45+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 5.00
2017-03-25 11:34:45+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> start
2017-03-25 11:34:45+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> Playing type: video/MP4
2017-03-25 11:34:45+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pipeline: 
2017-03-25 11:34:45+0500 [ClientProtocol,client] appsrc name=src is-live=0 max-bytes=0
2017-03-25 11:34:45+0500 [ClientProtocol,client]     ! identity sync=true single-segment=true
2017-03-25 11:34:45+0500 [ClientProtocol,client]     ! qtdemux name=demux
2017-03-25 11:34:45+0500 [ClientProtocol,client]      
2017-03-25 11:34:45+0500 [ClientProtocol,client] demux.
2017-03-25 11:34:45+0500 [ClientProtocol,client]     ! h264parse name=parser
2017-03-25 11:34:45+0500 [ClientProtocol,client]     ! queue name=queue_v max-size-buffers=0 max-size-time=0 max-size-bytes=0 min-threshold-time=0
2017-03-25 11:34:45+0500 [ClientProtocol,client]     ! ffdec_h264 ! timeoverlay ! videorate ! videoscale ! video/x-raw-yuv,width=1280,height=720,framerate=30/1 ! xvimagesink qos=0
2017-03-25 11:34:45+0500 [ClientProtocol,client]     
0:00:03.727166194  8355      0x1b6a720 WARN             xvimagesink xvimagesink.c:1443:gst_xvimagesink_get_xv_support:<xvimagesink0> error: Could not initialise Xv output
0:00:03.727254114  8355      0x1b6a720 WARN             xvimagesink xvimagesink.c:1443:gst_xvimagesink_get_xv_support:<xvimagesink0> error: No port available
2017-03-25 11:34:45+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 0 (12.21 KB/s) 0/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-160.mp4 (byterange=0-62067)
2017-03-25 11:34:45+0500 [-] <TapasPlayer-140602424757008> fetchNextSegment level: 0 (12.21 KB/s) 0/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-160.mp4 (byterange=0-62067)
2017-03-25 11:34:46+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> __got_request: bwe: 86.09 KB/s (fragment size: 60.61 KB)
2017-03-25 11:34:46+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pushData: pushed 60.61 KB of data (duration= 5s) for level 0
2017-03-25 11:34:46+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 0.00
2017-03-25 11:34:46+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 0 (12.21 KB/s) 1/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-160.mp4 (byterange=62068-123084)
2017-03-25 11:34:47+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> __got_request: bwe: 125.68 KB/s (fragment size: 59.59 KB)
2017-03-25 11:34:47+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pushData: pushed 59.59 KB of data (duration= 5s) for level 0
2017-03-25 11:34:47+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 0.00
2017-03-25 11:34:47+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> setLevel: level: 5
2017-03-25 11:34:47+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 5 (511.57 KB/s) 2/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-89.mp4 (byterange=7700067-11242044)
2017-03-25 11:34:57+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> __got_request: bwe: 333.77 KB/s (fragment size: 3.38 MB)
2017-03-25 11:34:57+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pushData: pushed 3.38 MB of data (duration= 5s) for level 5
2017-03-25 11:34:57+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 0.00
2017-03-25 11:34:57+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 5 (511.57 KB/s) 3/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-89.mp4 (byterange=11242045-13591842)
2017-03-25 11:35:04+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> __got_request: bwe: 330.89 KB/s (fragment size: 2.24 MB)
2017-03-25 11:35:04+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pushData: pushed 2.24 MB of data (duration= 5s) for level 5
2017-03-25 11:35:04+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 0.00
2017-03-25 11:35:04+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 5 (511.57 KB/s) 4/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-89.mp4 (byterange=13591843-16143538)
2017-03-25 11:35:12+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> __got_request: bwe: 310.42 KB/s (fragment size: 2.43 MB)
2017-03-25 11:35:12+0500 [ClientProtocol,client] <GstMediaEngine-140602554531584> pushData: pushed 2.43 MB of data (duration= 5s) for level 5
2017-03-25 11:35:12+0500 [ClientProtocol,client] <MaxQualityController-140602566675600> setting Idle duration: 0.00
2017-03-25 11:35:12+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 5 (511.57 KB/s) 5/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-89.mp4 (byterange=16143539-19839409)
^C2017-03-25 11:35:16+0500 [-] Received SIGINT, shutting down.
2017-03-25 11:35:16+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> _onConnectionLost
2017-03-25 11:35:16+0500 [ClientProtocol,client] <TapasPlayer-140602424757008> fetchNextSegment level: 5 (511.57 KB/s) 5/37 : http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-89.mp4 (byterange=16143539-19839409)
2017-03-25 11:35:16+0500 [-] Main loop terminated.

Still no display. I have enabled 3D acceleration in Virtualbox machine settings and VLC media player is playing videos seamlessly, even YouTube video from network stream.

shamidrasool avatar Mar 25 '17 06:03 shamidrasool

And here is the fake errors:

osboxes@osboxes:~/tapas-master$ GST_DEBUG=2 DEBUG=2 python play.py -a max -m fake -u http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd
2017-03-25 11:37:54+0500 [-] Log opened.
2017-03-25 11:37:54+0500 [-] /usr/lib/python2.7/dist-packages/gobject/constants.py:24: gobject.Warning: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed
2017-03-25 11:37:54+0500 [-] http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
2017-03-25 11:37:55+0500 [Uninitialized] Unhandled Error
	Traceback (most recent call last):
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
	    return callWithContext({"system": lp}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
	    return context.call({ILogContext: newCtx}, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
	    return self.currentContext().callWithContext(ctx, func, *args, **kw)
	  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
	    return func(*args,**kw)
	--- <exception caught here> ---
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 619, in _doReadOrWrite
	    why = selectable.doWrite()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 593, in doConnect
	    self._connectDone()
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 612, in _connectDone
	    self.protocol.makeConnection(self)
	  File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
	    self.connectionMade()
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 30, in connectionMade
	    self.factory.connectionMade(self.transport.getPeer().host)
	  File "/home/osboxes/tapas-master/utils_py/connection.py", line 198, in connectionMade
	    self.emit('connection-made', host)
	exceptions.TypeError: could not convert type str to PyObject required for parameter 0
	
^C2017-03-25 11:38:01+0500 [-] Received SIGINT, shutting down.
2017-03-25 11:38:01+0500 [-] Main loop terminated.

It goes without saying that any DASH ABR algorithm prototyping experiments can be carried out on the 'nodec' mode yielding acceptable results but the great thing I liked about your framework was the video player capability which can be useful in demos and presentations. :)

shamidrasool avatar Mar 25 '17 06:03 shamidrasool

I also tested on Ubuntu 15.04 VBox with 3.19.0-82-generic kernel with all dependencies installed.

Still no video in gst mode. Here is the fake media engine error:

mpegclient1@mpegclient1-VirtualBox:~/tapas-master$ sudo GST_DEBUG=2 DEBUG=2 python play.py -a max -m fake -u http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd
2017-03-25 15:30:10+0500 [-] Log opened.
2017-03-25 15:30:11+0500 [-] Traceback (most recent call last):
2017-03-25 15:30:11+0500 [-]   File "play.py", line 104, in <module>
2017-03-25 15:30:11+0500 [-]     select_player()
2017-03-25 15:30:11+0500 [-]   File "play.py", line 46, in select_player
2017-03-25 15:30:11+0500 [-]     from media_engines.FakeMediaEngine import FakeMediaEngine
2017-03-25 15:30:11+0500 [-]   File "/home/mpegclient1/tapas-master/media_engines/FakeMediaEngine.py", line 20, in <module>
2017-03-25 15:30:11+0500 [-]     from utils_py.util import debug, format_bytes
2017-03-25 15:30:11+0500 [-]   File "/home/mpegclient1/tapas-master/utils_py/util.py", line 255, in <module>
2017-03-25 15:30:11+0500 [-]     class RateCalc(gobject.GObject):
2017-03-25 15:30:11+0500 [-]   File "/usr/lib/python2.7/dist-packages/gi/__init__.py", line 62, in __getattr__
2017-03-25 15:30:11+0500 [-]     raise AttributeError(_static_binding_error)
2017-03-25 15:30:11+0500 [-] AttributeError: When using gi.repository you must not import static modules like "gobject". Please change all occurrences of "import gobject" to "from gi.repository import GObject". See: https://bugzilla.gnome.org/show_bug.cgi?id=709183

shamidrasool avatar Mar 25 '17 10:03 shamidrasool