mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-22 17:51:16 +00:00
170 lines
9 KiB
Python
170 lines
9 KiB
Python
# -*- Mode: Python -*- vi:si:et:sw=4:sts=4:ts=4:syntax=python
|
|
#
|
|
# Copyright (c) 2014,Thibault Saunier <thibault.saunier@collabora.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this program; if not, write to the
|
|
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
# Boston, MA 02110-1301, USA.
|
|
|
|
"""
|
|
The GstValidate default testsuite
|
|
"""
|
|
|
|
import os
|
|
import glob
|
|
import pathlib
|
|
import re
|
|
import subprocess
|
|
|
|
from testsuiteutils import update_assets
|
|
from launcher import utils
|
|
from launcher.baseclasses import MediaFormatCombination
|
|
from launcher.apps.gstvalidate import GstValidateSimpleTestsGenerator
|
|
from validate_known_issues import KNOWN_ISSUES
|
|
|
|
|
|
TEST_MANAGER = "validate"
|
|
|
|
BLACKLIST = [('validate.file.transcode.to_vorbis_and_vp8_in_webm.GH1_00094_1920x1280_MTS',
|
|
'Got error: Internal data stream error. -- Debug message: mpegtsbase.c(1371):'
|
|
'mpegts_base_loop (): ...: stream stopped, reason not-negotiated'),
|
|
('validate.testbin.transcode.*',
|
|
"Encoding testsrc is not so interesting and the source is now unlimited"),
|
|
('validate.file.*.simple.fast_forward.synchronized',
|
|
'https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/541'),
|
|
('validate.hls.playback.change_state_intensive.*',
|
|
'https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/482'),
|
|
('validate.rtsp.*playback.switch.*',
|
|
'https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/issues/357'),
|
|
('validate.rtsp.*playback.*seek.*mxf$|validate.rtsp.*playback.*change_state_intensive.*mxf$',
|
|
'Actions on MXF streams with rtsp-server fail in racy ways.'
|
|
' (Deactivating as it is not very important.)'),
|
|
('validate.rtsp.*pal-dv25_mxf$',
|
|
'File has decoding issues with rtsp-server.'
|
|
' (Deactivating as it is not very important.)'),
|
|
("(?!.*.media_check.qtdemux-test-frag-basic_zero_dur_no_mehd_mp4).*.qtdemux-test-frag-basic_zero_dur_no_mehd_mp4",
|
|
'`qtdemux-test-frag-basic_zero_dur_no_mehd_mp4` is there only for media_check tests.'),
|
|
('validate.rtsp.*playback.*mp3_h265_0_mp4$',
|
|
'The version of libav shipped by Fedora 29 crashes in various ways with these tests.'),
|
|
('validate.rtsp.*playback.seek.*GH1_00094_1920x1280_MTS',
|
|
'Do not preroll after pause.'),
|
|
('validate.file.playback.reverse_playback.sample_mpeg_program_stream_scr_mpg',
|
|
'Do not decode any frame in reverse playback with SCR.'),
|
|
('validate.rtsp.*playback.seek.*sample_mpeg_program_stream_scr_mpg',
|
|
'Racy with CI. No frames decoded before the end of the stream.'),
|
|
]
|
|
|
|
def add_accurate_seek_tests(test_manager, media_dir, extra_data):
|
|
accurate_seeks_media_infos = []
|
|
for f in [
|
|
'mp4/timecoded_jpeg_23976fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_jpeg_2997fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_jpeg_30fps.mp4.media_info.skipped',
|
|
|
|
'mp4/timecoded_vp8_23976fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_vp8_2997fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_vp8_30fps.mp4.media_info.skipped',
|
|
|
|
'mp4/timecoded_h264_23976fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_h264_2997fps.mp4.media_info.skipped',
|
|
'mp4/timecoded_h264_30fps.mp4.media_info.skipped',
|
|
]:
|
|
dirname = os.path.join(media_dir, "defaults", os.path.dirname(f))
|
|
filename = os.path.basename(f)
|
|
media_info = os.path.join(dirname, filename)
|
|
reference_frames_dir = os.path.join(dirname, re.sub(r"\.media_info.*", "_reference_frames", filename).replace('.', '_'))
|
|
accurate_seeks_media_infos.append((media_info, reference_frames_dir))
|
|
|
|
test_manager.add_generators(
|
|
test_manager.GstValidateCheckAccurateSeekingTestGenerator(
|
|
'accurate_seeks',
|
|
test_manager,
|
|
[(os.path.join(media_dir, media_info), os.path.join(media_dir, reference_frames_dir)) for media_info, reference_frames_dir in accurate_seeks_media_infos],
|
|
extra_data=extra_data)
|
|
)
|
|
|
|
|
|
def setup_tests(test_manager, options):
|
|
testsuite_dir = os.path.realpath(os.path.join(os.path.dirname(__file__)))
|
|
media_dir = os.path.realpath(os.path.join(testsuite_dir, os.path.pardir, "medias"))
|
|
|
|
assets_dir = os.path.realpath(os.path.join(testsuite_dir, os.path.pardir, "medias", "defaults"))
|
|
if options.sync:
|
|
if not utils.USING_SUBPROJECT:
|
|
if not update_assets(options, assets_dir):
|
|
return False
|
|
else:
|
|
print("Syncing gst-integration-testsuites media files")
|
|
subprocess.check_call(['git', 'submodule', 'update', '--init'],
|
|
cwd=utils.DEFAULT_GST_QA_ASSETS)
|
|
subprocess.check_call(['git', 'lfs', 'pull', '--exclude='],
|
|
cwd=pathlib.Path(utils.DEFAULT_GST_QA_ASSETS) / 'medias')
|
|
|
|
options.add_paths(assets_dir)
|
|
options.set_http_server_dir(media_dir)
|
|
test_manager.set_default_blacklist(BLACKLIST)
|
|
|
|
extra_data = {
|
|
"config_path": os.path.dirname(testsuite_dir),
|
|
"medias": media_dir,
|
|
"validate-flow-expectations-dir": os.path.join(testsuite_dir, "validate", "flow-expectations"),
|
|
"validate-flow-actual-results-dir": test_manager.options.logsdir,
|
|
"ssim-results-dir": os.path.join(test_manager.options.logsdir, "ssim-results"),
|
|
}
|
|
add_accurate_seek_tests(test_manager, media_dir, extra_data)
|
|
|
|
test_manager.add_generators(
|
|
GstValidateSimpleTestsGenerator("simple", test_manager,
|
|
os.path.join(testsuite_dir, "validate"))
|
|
)
|
|
|
|
test_manager.add_expected_issues(KNOWN_ISSUES)
|
|
test_manager.register_defaults()
|
|
|
|
test_manager.add_encoding_formats([MediaFormatCombination("quicktime", "rawaudio", "prores")])
|
|
|
|
valid_mixing_scenarios = ["play_15s",
|
|
"fast_forward",
|
|
"seek_forward",
|
|
"seek_backward",
|
|
"seek_with_stop",
|
|
"scrub_forward_seeking"]
|
|
|
|
for compositor in ["compositor", "glvideomixer"]:
|
|
test_manager.add_generators(
|
|
test_manager.GstValidateMixerTestsGenerator(compositor + ".simple", test_manager,
|
|
compositor,
|
|
"video",
|
|
converter="deinterlace ! videoconvert",
|
|
mixed_srcs={
|
|
"synchronized": {"mixer_props": "sink_1::alpha=0.5 sink_1::xpos=50 sink_1::ypos=50", # noqa
|
|
"sources":
|
|
("videotestsrc pattern=snow timestamp-offset=3000000000 ! 'video/x-raw,format=AYUV,width=640,height=480,framerate=(fraction)30/1' ! timeoverlay", # noqa
|
|
"videotestsrc pattern=smpte ! 'video/x-raw,format=AYUV,width=800,height=600,framerate=(fraction)10/1' ! timeoverlay")}, # noqa
|
|
"bgra": ("videotestsrc ! video/x-raw, framerate=\(fraction\)10/1, width=100, height=100", # noqa
|
|
"videotestsrc ! video/x-raw, framerate=\(fraction\)5/1, width=320, height=240")
|
|
},
|
|
valid_scenarios=valid_mixing_scenarios))
|
|
|
|
test_manager.add_generators(
|
|
test_manager.GstValidateMixerTestsGenerator("audiomixer.simple", test_manager,
|
|
"audiomixer",
|
|
"audio",
|
|
converter="audioconvert ! audioresample",
|
|
mixed_srcs={"basic": {"mixer_props": "",
|
|
"sources": ("audiotestsrc wave=triangle",
|
|
"audiotestsrc wave=ticks")}},
|
|
valid_scenarios=valid_mixing_scenarios))
|
|
|
|
return True
|