|
| 1 | +defmodule ExWebRTC.RTP.H264.DepayloaderTest do |
| 2 | + use ExUnit.Case, async: true |
| 3 | + |
| 4 | + alias ExWebRTC.RTP.Depayloader |
| 5 | + |
| 6 | + test "depayload/2" do |
| 7 | + payload_stapa = <<56, 0, 1, 128, 0, 1, 129>> |
| 8 | + payload_stapa_out = <<0, 0, 0, 1, 128, 0, 0, 0, 1, 129>> |
| 9 | + |
| 10 | + payload_fuas = <<60, 133, 128>> |
| 11 | + payload_fua = <<60, 5, 129>> |
| 12 | + payload_fuae = <<60, 69, 130>> |
| 13 | + payload_fua_out = <<0, 0, 0, 1, 37, 128, 129, 130>> |
| 14 | + |
| 15 | + payload_single = <<53, 131>> |
| 16 | + payload_single_out = <<0, 0, 0, 1, 131>> |
| 17 | + |
| 18 | + # reserved NALu types (22, 23, 30, 31) |
| 19 | + payloads_nalu_reserved = [<<55, 131>>, <<56, 131>>, <<62, 131>>, <<63, 131>>] |
| 20 | + # malformed STAP-A payload. First NAL should be 1-byte long, but is 2-bytes long |
| 21 | + payload_invalid = <<56, 0, 1, 128, 12, 0, 1, 129>> |
| 22 | + |
| 23 | + depayloader = Depayloader.H264.new() |
| 24 | + |
| 25 | + # Single NAL Unit |
| 26 | + packet = ExRTP.Packet.new(payload_single, timestamp: 123) |
| 27 | + |
| 28 | + assert {^payload_single_out, %{current_timestamp: 123, fu_parser_acc: nil}} = |
| 29 | + Depayloader.H264.depayload(depayloader, packet) |
| 30 | + |
| 31 | + # STAP-A NAL |
| 32 | + packet = ExRTP.Packet.new(payload_stapa, timestamp: 123) |
| 33 | + |
| 34 | + assert {^payload_stapa_out, %{current_timestamp: 123, fu_parser_acc: nil}} = |
| 35 | + Depayloader.H264.depayload(depayloader, packet) |
| 36 | + |
| 37 | + # FU-A NAL |
| 38 | + packet1 = ExRTP.Packet.new(payload_fuas, timestamp: 10) |
| 39 | + packet2 = ExRTP.Packet.new(payload_fua, timestamp: 10) |
| 40 | + packet3 = ExRTP.Packet.new(payload_fuae, timestamp: 10) |
| 41 | + |
| 42 | + {bin, depayloader} = Depayloader.H264.depayload(depayloader, packet1) |
| 43 | + |
| 44 | + assert {nil, %{current_timestamp: 10, fu_parser_acc: %{data: [<<128>>]}}} = |
| 45 | + {bin, depayloader} |
| 46 | + |
| 47 | + {bin, depayloader} = Depayloader.H264.depayload(depayloader, packet2) |
| 48 | + |
| 49 | + assert {nil, %{current_timestamp: 10, fu_parser_acc: %{data: [<<129>>, <<128>>]}}} = |
| 50 | + {bin, depayloader} |
| 51 | + |
| 52 | + assert {^payload_fua_out, %{current_timestamp: 10, fu_parser_acc: nil}} = |
| 53 | + Depayloader.H264.depayload(depayloader, packet3) |
| 54 | + |
| 55 | + # Colliding timestamps in one FU-A |
| 56 | + packet1 = ExRTP.Packet.new(payload_fuas, timestamp: 10) |
| 57 | + packet2 = ExRTP.Packet.new(payload_fua, timestamp: 11) |
| 58 | + |
| 59 | + {bin, depayloader} = Depayloader.H264.depayload(depayloader, packet1) |
| 60 | + |
| 61 | + assert {nil, %{current_timestamp: 10, fu_parser_acc: %{data: [<<128>>]}}} = |
| 62 | + {bin, depayloader} |
| 63 | + |
| 64 | + {bin, depayloader} = Depayloader.H264.depayload(depayloader, packet2) |
| 65 | + |
| 66 | + assert {nil, %{current_timestamp: nil, fu_parser_acc: nil}} = |
| 67 | + {bin, depayloader} |
| 68 | + |
| 69 | + # Check all reserved NAL types |
| 70 | + Enum.map(payloads_nalu_reserved, fn payload -> |
| 71 | + packet = ExRTP.Packet.new(payload, timestamp: 123) |
| 72 | + |
| 73 | + assert {nil, %{current_timestamp: nil, fu_parser_acc: nil}} = |
| 74 | + Depayloader.H264.depayload(depayloader, packet) |
| 75 | + end) |
| 76 | + |
| 77 | + # Check malformed NAL |
| 78 | + packet = ExRTP.Packet.new(payload_invalid, timestamp: 123) |
| 79 | + |
| 80 | + assert {nil, %{current_timestamp: nil, fu_parser_acc: nil}} = |
| 81 | + Depayloader.H264.depayload(depayloader, packet) |
| 82 | + end |
| 83 | +end |
0 commit comments