Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- Mode: Python -*-
  3. # -*- encoding: utf-8 -*-
  4. # Copyright (c) Vito Caldaralo <vito.caldaralo@gmail.com>
  5.  
  6. # This file may be distributed and/or modified under the terms of
  7. # the GNU General Public License version 2 as published by
  8. # the Free Software Foundation.
  9. # This file is distributed without any warranty; without even the implied
  10. # warranty of merchantability or fitness for a particular purpose.
  11. # See "LICENSE" in the source distribution for more information.
  12. import os, sys
  13. from utils_py.util import debug, format_bytes
  14. from BaseController import BaseController
  15.  
  16. DEBUG = 1
  17.  
  18. # This controller is an implementation of the Conventional Controller
  19. # described in Algorithm 1 of the paper:
  20. # Zhi Li, et al, "Probe and Adapt: Rate Adaptation for HTTP Video
  21. # Streaming At Scale", IEEE JSAC, vol.32, no.4, Apr 2014
  22.  
  23. class ConventionalController(BaseController):
  24.  
  25. def __init__(self):
  26. super(ConventionalController, self).__init__()
  27. self.iteration = 0
  28. self.t_last = -1
  29. self.filter_old = -1
  30. #Controller parameters
  31. self.Q = 15 #seconds
  32. self.alpha = 0.2 #Ewma filter
  33. self.eps = 0.15
  34. self.steady_state = False
  35.  
  36. def __repr__(self):
  37. return '<ConventionalController-%d>' %id(self)
  38.  
  39. def mapF(self,r,cu,b,maxi,mini):
  40. return (maxi-mini)*(b-r)/cu + mini
  41.  
  42. def calcControlAction(self):
  43. #T = self.feedback['last_download_time']
  44. #cur = self.feedback['cur_rate']
  45. #tau = self.feedback['fragment_duration']
  46. # x = cur * tau / T
  47. #y = self.__ewma_filter(x)
  48. #self.setIdleDuration(tau-T)
  49. # debug(DEBUG, "%s calcControlAction: y: %s/s x: %s/s T: %.2f", self,
  50. #format_bytes(y), format_bytes(x), T)
  51. ratePrev=self.feedback['cur_rate']
  52. bufNow=self.feedback['queued_time']
  53. r=0.15
  54. cu=0.65
  55. rates =self.feedback['rates']
  56. maxRate =max(rates)
  57. minRate =min(rates)
  58. if ratePrev == maxRate:
  59. ratep = maxrate
  60. else:
  61. ratep = min([x for x in rates if x > ratePrev])
  62. if ratePrev == minRate:
  63. ratem = minRate
  64. else:
  65. ratem = max([x for x in rates if x < ratePrev])
  66. if bufNow<=r:
  67. nextRate=minRate
  68. elif bufNow>=(r+cu):
  69. nextRate=maxRate
  70. elif self.mapF(r,cu,bufNow,maxRate,minRate) >= ratep:
  71. nextRate=max([x for x in rates if x < self.mapF(r,cu,bufNow,maxRate,minRate)])
  72. elif self.mapF(r,cu,bufNow,maxRate,minRate) <= ratem:
  73. nextRate=min([x for x in rates if x > self.mapF(r,cu,bufNow,maxRate,minRate)])
  74. else:
  75. nextRate = ratePrev
  76. return nextRate
  77.  
  78.  
  79.  
  80.  
  81.  
  82. return y
  83.  
  84. def isBuffering(self):
  85. return self.feedback['queued_time'] < self.Q
  86.  
  87. def quantizeRate(self,rate):
  88. video_rates = self.feedback['rates']
  89. cur = self.feedback['cur_rate']
  90. level = self.feedback['level']
  91. D_up = self.eps*rate
  92. D_down = 0
  93.  
  94. r_up = self.__levelLessThanRate(rate - D_up)
  95. r_down = self.__levelLessThanRate(rate - D_down)
  96. new_level = 0
  97. if level < r_up:
  98. new_level = r_up
  99. elif r_up <= level and level <= r_down:
  100. new_level = level
  101. else:
  102. new_level = r_down
  103. debug(DEBUG, "%s quantizeRate: rate: %s/s cur: %s/s D_up: %s/s D_down: %s/s r_up: %d r_down: %d new_level: %d", self,
  104. format_bytes(rate), format_bytes(cur), format_bytes(D_up), format_bytes(D_down), r_up, r_down, new_level)
  105. debug(DEBUG, "%s quantizeRate: rates: %s", self, video_rates)
  106. return new_level
  107.  
  108.  
  109. def __ewma_filter(self, x):
  110. #First time called
  111. if self.filter_old < 0:
  112. self.filter_old = x
  113. return x
  114. T = self.feedback['last_download_time']
  115. y_old = self.filter_old
  116. y = y_old - T * self.alpha * ( y_old - x )
  117. self.filter_old = y
  118. return y
  119.  
  120.  
  121. def __levelLessThanRate(self, rate):
  122. vr = self.feedback['rates']
  123. l = 0
  124. for i in range(0,len(vr)):
  125. if rate >= vr[i]:
  126. l = i
  127. return l
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement