66 lines
2.5 KiB
Python
66 lines
2.5 KiB
Python
"""Prüft die Formataushandlung nach dem Wi-Fi-Display-Standard."""
|
|
|
|
import os
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from wfd import formats
|
|
|
|
|
|
class FormatTest(unittest.TestCase):
|
|
|
|
# So antwortet ein handelsüblicher Fernseher auf M3.
|
|
TYPICAL = "00 00 02 04 0001DEFF 155557FF 00000FFF 00 0000 0000 11 none none"
|
|
|
|
def test_parses_capabilities(self):
|
|
caps = formats.parse_video_formats(self.TYPICAL)
|
|
self.assertEqual(1, len(caps))
|
|
self.assertEqual(0x02, caps[0].profile)
|
|
self.assertEqual(0x04, caps[0].level)
|
|
self.assertEqual(0x0001DEFF, caps[0].cea_mask)
|
|
|
|
def test_chooses_720p30(self):
|
|
chosen = formats.choose(formats.parse_video_formats(self.TYPICAL))
|
|
self.assertEqual((1280, 720, 30), (chosen.width, chosen.height, chosen.fps))
|
|
|
|
def test_respects_height_limit(self):
|
|
caps = formats.parse_video_formats(self.TYPICAL)
|
|
chosen = formats.choose(caps, max_height=480)
|
|
self.assertEqual(480, chosen.height)
|
|
|
|
def test_falls_back_to_small_format(self):
|
|
caps = formats.parse_video_formats(
|
|
"00 00 01 02 00000003 00000000 00000000 00 0000 0000 00 none none")
|
|
chosen = formats.choose(caps)
|
|
self.assertEqual((640, 480), (chosen.width, chosen.height))
|
|
|
|
def test_no_common_format(self):
|
|
caps = formats.parse_video_formats(
|
|
"00 00 01 02 00000000 00000000 00000000 00 0000 0000 00 none none")
|
|
self.assertIsNone(formats.choose(caps))
|
|
|
|
def test_never_picks_interlaced(self):
|
|
# Nur interlaced-Bits gesetzt: 2, 4, 9, 14
|
|
mask = (1 << 2) | (1 << 4) | (1 << 9) | (1 << 14)
|
|
caps = formats.parse_video_formats(
|
|
f"00 00 01 02 {mask:08X} 00000000 00000000 00 0000 0000 00 none none")
|
|
self.assertIsNone(formats.choose(caps))
|
|
|
|
def test_selection_announces_exactly_one_format(self):
|
|
selection = formats.build_selection(formats.CEA[5], 0x02, 0x04)
|
|
fields = selection.split()
|
|
self.assertEqual(13, len(fields))
|
|
self.assertEqual(1 << 5, int(fields[4], 16))
|
|
self.assertEqual(1, bin(int(fields[4], 16)).count("1"))
|
|
self.assertEqual(["none", "none"], fields[11:13])
|
|
|
|
def test_reads_rtp_port(self):
|
|
self.assertEqual(19000, formats.parse_rtp_port("RTP/AVP/UDP;unicast 19000 0 mode=play"))
|
|
self.assertEqual(0, formats.parse_rtp_port(None))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|