@@ -148,6 +148,37 @@ defmodule ExHLS.DemuxingEngine.MPEGTS do
148148 end
149149 end
150150
151+ defp maybe_read_tden_tag ( demuxer , packet_pts ) do
152+ withl no_id3_stream:
153+ { id3_track_id , _stream_description } <-
154+ demuxer . pmt . streams
155+ |> Enum . find ( fn { _pid , stream_description } ->
156+ stream_description . stream_type == :METADATA_IN_PES
157+ end ) ,
158+ no_id3_data: { [ id3 ] , demuxer } <- Demuxer . take ( demuxer , id3_track_id ) ,
159+ id3_not_in_timerange: true <- id3 . pts <= packet_pts do
160+ { parse_tden_tag ( id3 . data ) , demuxer }
161+ else
162+ no_id3_stream: nil -> { nil , demuxer }
163+ no_id3_data: { [ ] , updated_demuxer } -> { nil , updated_demuxer }
164+ id3_not_in_timerange: false -> { nil , demuxer }
165+ end
166+ end
167+
168+ defp parse_tden_tag ( payload ) do
169+ # UTF-8 encoding
170+ encoding = 3
171+
172+ with { pos , _len } <- :binary . match ( payload , "TDEN" ) ,
173+ << _skip :: binary - size ( pos ) , "TDEN" , tden :: binary >> <- payload ,
174+ << size :: integer - size ( 4 ) - unit ( 8 ) , _flags :: 16 , ^ encoding :: 8 , text :: binary - size ( size - 2 ) ,
175+ 0 :: 8 , _rest :: binary >> <- tden do
176+ text
177+ else
178+ _error -> nil
179+ end
180+ end
181+
151182 # value returned by Demuxer is represented in nanoseconds
152183 defp packet_ts_to_millis ( ts ) , do: div ( ts , 1_000_000 )
153184
0 commit comments