From d74279c53bf201140f0f8c48e276b24b3fa69a94 Mon Sep 17 00:00:00 2001 From: Karol Konkol Date: Fri, 24 Oct 2025 15:59:41 +0200 Subject: [PATCH 1/2] Fix vp8 keyframe detection --- lib/ex_webrtc/rtp/vp8.ex | 3 ++- test/ex_webrtc/rtp/vp8_test.exs | 35 +++++++++++++++++++++++++++++++ test/fixtures/rtp/vp8_packet.bin | Bin 0 -> 1257 bytes 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 test/ex_webrtc/rtp/vp8_test.exs create mode 100644 test/fixtures/rtp/vp8_packet.bin diff --git a/lib/ex_webrtc/rtp/vp8.ex b/lib/ex_webrtc/rtp/vp8.ex index e0e7cbe1..32d8a060 100644 --- a/lib/ex_webrtc/rtp/vp8.ex +++ b/lib/ex_webrtc/rtp/vp8.ex @@ -17,7 +17,8 @@ defmodule ExWebRTC.RTP.VP8 do # for more information refer to RFC 7741 Sections 4.2 and 4.3 with {:ok, vp8_payload} <- VP8.Payload.parse(rtp_payload), - <<_size0::3, _h::1, _ver::3, p::1, _size1::8, _size2::8, _rest::binary>> <- rtp_payload do + <<_size0::3, _h::1, _ver::3, p::1, _size1::8, _size2::8, _rest::binary>> <- + vp8_payload.payload do vp8_payload.s == 1 and vp8_payload.pid == 0 and p == 0 else _err -> false diff --git a/test/ex_webrtc/rtp/vp8_test.exs b/test/ex_webrtc/rtp/vp8_test.exs new file mode 100644 index 00000000..1c372309 --- /dev/null +++ b/test/ex_webrtc/rtp/vp8_test.exs @@ -0,0 +1,35 @@ +defmodule ExWebRTC.RTP.VP8Test do + use ExUnit.Case, async: true + + alias ExRTP.Packet + alias ExWebRTC.RTP.VP8 + + @vp8_packet "test/fixtures/rtp/vp8_packet.bin" + + test "keyframe?/1" do + # from https://github.com/jech/galene/blob/master/codecs/codecs_test.go + binary1 = + <<0x80, 0xE0, 0x71, 0x3E, 0x5D, 0x6F, 0x3C, 0xC5, 0x75, 0xC, 0x80, 0x96, 0x90, 0x80, 0xB0, + 0x4C, 0x90, 0x2, 0x0, 0x9D, 0x1, 0x2A, 0x10, 0x0, 0x10, 0x0, 0x39, 0x3, 0x0, 0x0, 0x1C, + 0x22, 0x16, 0x16, 0x22, 0x66, 0x12, 0x20, 0x4, 0x90, 0x40, 0x4E, 0x9E, 0x8D, 0xE9, 0x40, + 0xFE, 0xFF, 0xAB, 0x59, 0x72, 0x30, 0xD1, 0xAF, 0xE4, 0x6A, 0x11, 0x3, 0xFD, 0x15, 0xE9, + 0x2, 0x2E, 0xDF, 0xD9, 0xD1, 0xB8, 0x0, 0x0>> + + {:ok, packet1} = Packet.decode(binary1) + assert VP8.keyframe?(packet1) + + binary2 = + <<0x80, 0x6F, 0x61, 0x8F, 0xD5, 0x36, 0xDC, 0x15, 0x1B, 0x4A, 0xB5, 0x29, 0x78, 0x9, 0xA1, + 0x93, 0xA0, 0x5B, 0xD8, 0xF1, 0xDE, 0x87, 0x23, 0x5A, 0xB9, 0x19, 0x97, 0xB7, 0xBD, 0xBF, + 0xF7, 0x6E, 0xAD, 0x82, 0xC4, 0x70, 0x1C, 0xC9, 0x3A, 0xB4, 0x1F, 0x13, 0x45, 0xB5, 0xF1, + 0x0, 0xA5, 0xA5, 0xA9, 0xD0, 0xA5, 0xDF, 0x67, 0x88, 0x26, 0x30, 0x32>> + + {:ok, packet2} = Packet.decode(binary2) + assert not VP8.keyframe?(packet2) + + # https://github.com/elixir-webrtc/ex_webrtc/issues/234 + {:ok, binary_packet3} = File.read(@vp8_packet) + packet3 = :erlang.binary_to_term(binary_packet3) + assert not VP8.keyframe?(packet3) + end +end diff --git a/test/fixtures/rtp/vp8_packet.bin b/test/fixtures/rtp/vp8_packet.bin new file mode 100644 index 0000000000000000000000000000000000000000..3c4873c15cf57da74653d1689746cf8b0449aaf5 GIT binary patch literal 1257 zcmZoJVPIh3E9Wf9%uOvWNz5(CV_|6Jt=&`3UY1%^oSC1O$W+dmT2Ydk2jY~orX}VS zr94pTq}Y?0`vkBle1Gx%GnDNQ&KYX z(qSe5`IR~Oi7B}Z49s6AG;I1I7|QV2`Td#8>PyU-ezBw`{%a7h0y>Qh!1)~Cw1E50+Z6!@)Y^S$J< zQt`6olMLKA4)UCD6#Wh~;<8WYx#^dexV znRbwqK`JBHotZIv0&|}4$(`nEPnIu<&8ui%>{9e7f2tkxxBJO6V`fh-%1SZ3xR^^^w+2>BlmW}CNat|YfnG(F0w_jYOIN3fxQr)Zav;T}wezgi; zFP$lv_LkvP$i3&MDnCCn3 zKYsYGW_hh{Pfd*C@40%R_uF@Vnpg9yW&T2&pFgT|RvA3{3DWf7@pF*6xj#SIEeBfm z;mGp&_WZ?9t?qxS{`B|!lt{O-vmdzcZ|vJ~YrB6g zi_IsgiIs}ZZ_1}wE_=T4nkp}=L4&dNvrU%T`N2EbX1w^Z^8(B9W7E&KxbxSFDod4^ z*Xc8hh32iaJSo?acU&wKX7KTlU{WFV-Qp{B!TsXn2Dz>z# zc7+y~Bcp}&*7?RC+;>Nsd|s$(DpGINxrY6wqo;3H`VW1lMQ_!*Wd4-w%`1AQ(ZEx8 zGvv9)&P}asn;1BeeU65>lL3sMsk%2|qwi;|Q4HX1dSv*jih zWv3Rw3J?C`)WXu#yyVpQywcpH)S@H?2DX-RmSmv%ta3qk*%V(;l%JNFlL{`P08O4E A0RR91 literal 0 HcmV?d00001 From 120a56dc8f18d6641501b7e00288dbcf9fdf0964 Mon Sep 17 00:00:00 2001 From: Karol Konkol Date: Tue, 28 Oct 2025 11:23:09 +0100 Subject: [PATCH 2/2] Requested changes --- test/ex_webrtc/rtp/vp8_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ex_webrtc/rtp/vp8_test.exs b/test/ex_webrtc/rtp/vp8_test.exs index 1c372309..f17989f6 100644 --- a/test/ex_webrtc/rtp/vp8_test.exs +++ b/test/ex_webrtc/rtp/vp8_test.exs @@ -28,7 +28,7 @@ defmodule ExWebRTC.RTP.VP8Test do assert not VP8.keyframe?(packet2) # https://github.com/elixir-webrtc/ex_webrtc/issues/234 - {:ok, binary_packet3} = File.read(@vp8_packet) + binary_packet3 = File.read!(@vp8_packet) packet3 = :erlang.binary_to_term(binary_packet3) assert not VP8.keyframe?(packet3) end