diff options
author | Thibault Saunier <thibault.saunier@collabora.com> | 2014-02-13 15:31:58 +0100 |
---|---|---|
committer | Thibault Saunier <thibault.saunier@collabora.com> | 2014-02-18 21:07:31 +0100 |
commit | c3adb05b2a366b195504233c57545fcaa2a60789 (patch) | |
tree | dbae66957208569ed1191b099a337335f8de4a34 | |
parent | 90d9a686d7a73751fbef69c865a2d844da7daeb6 (diff) |
validate:tools: Handle cases were EOS does not stop the pipeline in the launcher
+ Fix parsing of GstClockTime
+ Avoid using play_15s scenario when not necessary
-rw-r--r-- | validate/tools/launcher/apps/gst-validate.py | 27 | ||||
-rw-r--r-- | validate/tools/launcher/baseclasses.py | 21 | ||||
-rw-r--r-- | validate/tools/launcher/utils.py | 7 |
3 files changed, 48 insertions, 7 deletions
diff --git a/validate/tools/launcher/apps/gst-validate.py b/validate/tools/launcher/apps/gst-validate.py index f71201a..f1d16fd 100644 --- a/validate/tools/launcher/apps/gst-validate.py +++ b/validate/tools/launcher/apps/gst-validate.py @@ -17,6 +17,7 @@ # Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301, USA. import os +import time import urlparse import subprocess import ConfigParser @@ -168,7 +169,15 @@ class GstValidateTranscodingTest(GstValidateTest): combination, uri, file_infos, timeout=DEFAULT_TIMEOUT, scenario_name="play_15s"): - scenario = self._scenarios.get_scenario(scenario_name) + Loggable.__init__(self) + + file_dur = long(file_infos.get("media-info", "file-duration")) / GST_SECOND + if file_dur < 30: + self.debug("%s is short (%ds< 30 secs) playing it all" % (uri, file_dur)) + scenario = None + else: + self.debug("%s is long (%ds > 30 secs) playing it all" % (uri, file_dur)) + scenario = self._scenarios.get_scenario(scenario_name) try: timeout = G_V_PROTOCOL_TIMEOUTS[file_infos.get("file-info", "protocol")] except KeyError: @@ -206,14 +215,26 @@ class GstValidateTranscodingTest(GstValidateTest): self.add_arguments(self.uri, self.dest_file) def get_current_value(self): + sent_eos = self.sent_eos_position() + if sent_eos is not None: + if ((time.time() - sent_eos)) > 30: + if self.file_infos.get("file-info", "protocol") == Protocols.HLS: + self.set_result(Result.PASSED, + """Got no EOS 30 seconds after sending EOS, + in HLS known and tolerated issue: + https://bugzilla.gnome.org/show_bug.cgi?id=723868""") + return Result.KNOWN_ERROR + + return Result.FAILED + return self.get_current_size() def check_results(self): - if self.process.returncode == 0: + if self.result is Result.PASSED: orig_duration = long(self.file_infos.get("media-info", "file-duration")) res, msg = compare_rendered_with_original(orig_duration, self.dest_file) self.set_result(res, msg) - else: + elif self.message == "": GstValidateTest.check_results(self) diff --git a/validate/tools/launcher/baseclasses.py b/validate/tools/launcher/baseclasses.py index 5c24c73..9997f46 100644 --- a/validate/tools/launcher/baseclasses.py +++ b/validate/tools/launcher/baseclasses.py @@ -30,7 +30,7 @@ import ConfigParser from loggable import Loggable from optparse import OptionGroup -from utils import mkdir, Result, Colors, printc, DEFAULT_TIMEOUT +from utils import mkdir, Result, Colors, printc, DEFAULT_TIMEOUT, GST_SECOND class Test(Loggable): @@ -141,6 +141,8 @@ class Test(Loggable): elif val is Result.FAILED: self.result = Result.FAILED break + elif val is Result.KNOWN_ERROR: + break self.log("New val %s" % val) @@ -214,6 +216,7 @@ class GstValidateTest(Test): # defines how much the process can be outside of the configured # segment / seek self.max_outside_segment = max_outside_segment + self._sent_eos_pos = None if scenario is None or scenario.name.lower() == "none": self.scenario = None @@ -332,6 +335,22 @@ class GstValidateTest(Test): utils.gsttime_from_tuple(v[4:8]), float(str(v[8]) + "." + str(v[9]))) + def sent_eos_position(self): + if self._sent_eos_pos is not None: + return self._sent_eos_pos + + m = None + rate = start = stop = None + + for l in reversed(open(self.logfile, 'r').readlines()): + l = l.lower() + if "sending eos" in l: + m = l + self._sent_eos_pos = time.time() + return self._sent_eos_pos + + return None + def get_current_position(self): position, duration = self._get_position() diff --git a/validate/tools/launcher/utils.py b/validate/tools/launcher/utils.py index e43cf29..5244e4e 100644 --- a/validate/tools/launcher/utils.py +++ b/validate/tools/launcher/utils.py @@ -28,7 +28,7 @@ import subprocess from operator import itemgetter -GST_SECOND = 1000000000 +GST_SECOND = long(1000000000) DEFAULT_TIMEOUT = 10 DEFAULT_MAIN_DIR = os.path.expanduser("~/gst-validate/") DEFAULT_GST_QA_ASSETS = os.path.join(DEFAULT_MAIN_DIR, "gst-qa-assets") @@ -41,6 +41,7 @@ class Result(object): FAILED = "Failed" TIMEOUT = "Timeout" PASSED = "Passed" + KNOWN_ERROR = "Known error" class Protocols(object): @@ -203,12 +204,12 @@ def get_profile(combination): # Some utilities to parse gst-validate output # ################################################## def gsttime_from_tuple(stime): - return long((int(stime[0]) * 3600 + int(stime[1]) * 60 + int(stime[2]) * 60) * GST_SECOND + int(stime[3])) + return long((int(stime[0]) * 3600 + int(stime[1]) * 60 + int(stime[2])) * GST_SECOND + int(stime[3])) timeregex = re.compile(r'(?P<_0>.+):(?P<_1>.+):(?P<_2>.+)\.(?P<_3>.+)') def parse_gsttimeargs(time): stime = map(itemgetter(1), sorted(timeregex.match(time).groupdict().items())) - return long((int(stime[0]) * 3600 + int(stime[1]) * 60 + int(stime[2]) * 60) * GST_SECOND + int(stime[3])) + return long((int(stime[0]) * 3600 + int(stime[1]) * 60 + int(stime[2])) * GST_SECOND + int(stime[3])) def get_duration(media_file): |