<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def play(self):
 		""" Starts playback. """

		# Signal player to start video playback
		self.paused = False

		# Start listening for incoming audio frames
		if self.decoder.audioformat:
			self.audio.start()

		self.decoder.play()

		# While video is playing, render frames
		while self.decoder.status in [mediadecoder.PLAYING, mediadecoder.PAUSED]:
			texture_update_time = 0
			if self.texUpdated:
				t1 = time.time()
				# Update texture
				self.texture_locked = True
				glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, self.vidsize[0], 
					self.vidsize[1], GL_RGB, GL_UNSIGNED_BYTE, self.buffer)
				self.texture_locked = False
				texture_update_time = int((time.time()-t1)*1000)
				self.texUpdated = False
			
			# Draw the texture to the back buffer
			t1 = time.time()
			self.__drawFrame()
			draw_time = (time.time()-t1)*1000
			# Flip the buffer to show frame to screen
			t1 = time.time()
			pygame.display.flip()
			flip_time = (time.time()-t1)*1000

			logger.debug("================== Frame {} ========================"
				"".format(self.decoder.current_frame_no))
			if texture_update_time:
				logger.debug("Texture updated in {0} ms".format(texture_update_time))
			logger.debug("Texture drawn in {0} ms".format(draw_time))
			logger.debug("Screen flipped in {0} ms".format(flip_time))
			logger.debug("-----------------------------------------------------")
			logger.debug("Total: {} ms".format(texture_update_time+draw_time+flip_time))

			for e in pygame.event.get():
				if e.type == pygame.QUIT:
					self.stop()
				if e.type == pygame.KEYDOWN:
					# Quitting
					if e.key == pygame.K_ESCAPE:
						self.stop()
					# Pausing
					elif e.key == pygame.K_SPACE:
						self.pause()
					# Seeking
					elif e.key == pygame.K_RIGHT:
						new_time = min(
							self.decoder.current_playtime + 10,
							self.decoder.duration)
						self.decoder.seek(new_time)
					elif e.key == pygame.K_LEFT:
						new_time = max(
							self.decoder.current_playtime - 10,
							0)
						self.decoder.seek(new_time)

			pygame.event.pump()   # Prevent freezing of screen while dragging 

			# Without this sleep, the video rendering threard goes haywire...
			time.sleep(0.005)
		
		if self.decoder.audioformat:
			self.audio.close_stream()
				
		pygame.quit()