@@ -12,27 +12,20 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
1212
1313 alias ExWebRTC.RTP.H264 . { FU , NAL , StapA }
1414
15- @ frame_prefix << 1 :: 32 >>
16- @ annexb_prefix << 1 :: 4 >>
17-
18- defmodule State do
19- @ moduledoc false
20- defstruct parser_acc: nil
21- end
15+ @ annexb_prefix << 1 :: 32 >>
2216
2317 @ type t ( ) :: % __MODULE__ {
24- current_nal : nil ,
25- current_timestamp : nil
18+ current_timestamp : nil ,
19+ fu_parser_acc : nil
2620 }
2721
28- defstruct [ :current_nal , :current_timestamp ]
22+ defstruct [ :current_timestamp , :fu_parser_acc ]
2923
3024 @ impl true
3125 def new ( ) do
3226 % __MODULE__ { }
3327 end
3428
35- # TODO: handle timestamps
3629 @ impl true
3730 def depayload ( depayloader , packet )
3831
@@ -41,8 +34,9 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
4134 def depayload ( depayloader , packet ) do
4235 with { :ok , { header , _payload } = nal } <- NAL.Header . parse_unit_header ( packet . payload ) ,
4336 unit_type = NAL.Header . decode_type ( header ) ,
44- { :ok , { nalu , depayloader } } <- handle_unit_type ( unit_type , depayloader , packet , nal ) do
45- { nalu , depayloader }
37+ { :ok , { nal , depayloader } } <-
38+ handle_unit_type ( unit_type , depayloader , packet , nal ) do
39+ { nal , depayloader }
4640 else
4741 { :error , reason } ->
4842 Logger . warning ( """
@@ -54,18 +48,18 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
5448 end
5549 end
5650
57- defp handle_unit_type ( :single_nalu , _depayloader , _packet , nal ) do
58- { header , payload } = nal
59- { :ok , { prefix_annexb ( payload ) , depayloader } }
51+ defp handle_unit_type ( :single_nalu , depayloader , packet , { _header , payload } ) do
52+ { :ok ,
53+ { prefix_annexb ( payload ) , % __MODULE__ { depayloader | current_timestamp: packet . timestamp } } }
6054 end
6155
6256 defp handle_unit_type (
6357 :fu_a ,
64- { current_nal , current_timestamp } = depayloader ,
58+ % { current_timestamp: current_timestamp , fu_parser_acc: fu_parser_acc } ,
6559 packet ,
66- { header , payload } = nal
60+ { header , payload }
6761 ) do
68- if current_nal != nil and current_timestamp != packet . timestamp do
62+ if fu_parser_acc != nil and current_timestamp != packet . timestamp do
6963 { :error , "fu-a colliding rtp timestamps" }
7064
7165 Logger . debug ( """
@@ -74,25 +68,37 @@ defmodule ExWebRTC.RTP.Depayloader.H264 do
7468 """ )
7569 end
7670
77- case FU . parse ( payload , current_nal ) do
78- { :ok , { payload , type } } ->
79- { :ok , result }
71+ case FU . parse ( payload , fu_parser_acc || % FU { } ) do
72+ { :ok , { data , type } } ->
73+ data = NAL.Header . add_header ( data , 0 , header . nal_ref_idc , type )
74+
75+ { :ok ,
76+ { prefix_annexb ( data ) ,
77+ % __MODULE__ { current_timestamp: packet . timestamp , fu_parser_acc: nil } } }
8078
81- { :incomplete , tmp } ->
82- { :ok , { nil , % { depayloader | current_nal: curent_nal <> tmp } } }
79+ { :incomplete , fu } ->
80+ { :ok , { nil , % __MODULE__ { fu_parser_acc: fu } } }
8381
8482 { :error , _reason } = error ->
8583 error
8684 end
8785 end
8886
89- defp handle_unit_type ( :stap_a , depayloader , { _header , data } , buffer , state ) do
90- with { :ok , result } <- StapA . parse ( data ) do
87+ defp handle_unit_type ( :stap_a , depayloader , packet , { _header , payload } ) do
88+ with { :ok , result } <- StapA . parse ( payload ) do
9189 nals = Enum . reduce ( result , << >> , fn nal , acc -> acc <> prefix_annexb ( nal ) end )
92- { :ok , { nals , depayloader } }
90+ { :ok , { nals , % __MODULE__ { depayloader | current_timestamp: packet . timestamp } } }
9391 end
9492 end
9593
94+ defp handle_unit_type ( unsupported_type , _depayloader , _packet , _nal ) do
95+ { :error , "unsupported nal type #{ unsupported_type } " }
96+
97+ Logger . debug ( """
98+ Received packet with unsupported NAL type. Supported types are: NAL unit types, STAP-A, FU-A. Dropping packet.
99+ """ )
100+ end
101+
96102 defp prefix_annexb ( nal ) do
97103 @ annexb_prefix <> nal
98104 end
0 commit comments