Skip to content

Commit 85968c2

Browse files
committed
Revert "Implement CR wip"
This reverts commit f6fdf34.
1 parent f6fdf34 commit 85968c2

File tree

9 files changed

+79
-82
lines changed

9 files changed

+79
-82
lines changed

lib/ex_hls/client.ex

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
defmodule ExHLS.Client do
22
@moduledoc """
33
Module providing functionality to demux HLS streams.
4-
It allows reading samples from the stream, choosing variants, and managing media playlists.
4+
It allows reading frames from the stream, choosing variants, and managing media playlists.
55
"""
66

77
alias ExHLS.DemuxingEngine
88
alias Membrane.{AAC, H264, RemoteStream}
99

1010
@opaque client :: map()
11-
@type sample :: any()
11+
@type frame :: any()
1212

1313
@type variant_description :: %{
1414
id: integer(),
@@ -37,8 +37,8 @@ defmodule ExHLS.Client do
3737
media_base_url: nil,
3838
multivariant_playlist: multivariant_playlist,
3939
base_url: Path.dirname(url),
40-
audio_samples: [],
41-
video_samples: [],
40+
audio_frames: [],
41+
video_frames: [],
4242
demuxing_engine_impl: demuxing_engine_impl,
4343
demuxing_engine: demuxing_engine_impl.new(),
4444
queues: %{audio: Qex.new(), video: Qex.new()},
@@ -60,7 +60,7 @@ defmodule ExHLS.Client do
6060
_many_variants ->
6161
raise """
6262
If there are available variants, you have to choose one of them using \
63-
`choose_variant/2` function before reading samples. Available variants:
63+
`choose_variant/2` function before reading frames. Available variants:
6464
#{get_variants(client) |> inspect(limit: :infinity, pretty: true)}
6565
"""
6666
end
@@ -119,50 +119,50 @@ defmodule ExHLS.Client do
119119
}
120120
end
121121

122-
@spec read_video_sample(client()) :: sample() | :end_of_stream
123-
def read_video_sample(client), do: pop_queue_or_do_read_sample(client, :video)
122+
@spec read_video_frame(client()) :: frame() | :end_of_stream
123+
def read_video_frame(client), do: pop_queue_or_do_read_frame(client, :video)
124124

125-
@spec read_audio_sample(client()) :: sample() | :end_of_stream
126-
def read_audio_sample(client), do: pop_queue_or_do_read_sample(client, :audio)
125+
@spec read_audio_frame(client()) :: frame() | :end_of_stream
126+
def read_audio_frame(client), do: pop_queue_or_do_read_frame(client, :audio)
127127

128-
defp pop_queue_or_do_read_sample(client, media_type) do
128+
defp pop_queue_or_do_read_frame(client, media_type) do
129129
client.queues[media_type]
130130
|> Qex.pop()
131131
|> case do
132-
{{:value, sample}, queue} ->
132+
{{:value, frame}, queue} ->
133133
client = client |> put_in([:queues, media_type], queue)
134-
{sample, client}
134+
{frame, client}
135135

136136
{:empty, _queue} ->
137-
do_read_sample(client, media_type)
137+
do_read_frame(client, media_type)
138138
end
139139
end
140140

141-
@spec do_read_sample(client(), :audio | :video) :: {sample() | :end_of_stream, client()}
142-
defp do_read_sample(client, media_type) do
141+
@spec do_read_frame(client(), :audio | :video) :: {frame() | :end_of_stream, client()}
142+
defp do_read_frame(client, media_type) do
143143
client = ensure_media_playlist_loaded(client)
144144

145145
impl = client.demuxing_engine_impl
146146
track_id = get_track_id(client, media_type)
147147

148-
case client.demuxing_engine |> impl.pop_sample(track_id) do
148+
case client.demuxing_engine |> impl.pop_frame(track_id) do
149149
{:error, _reason, demuxing_engine} ->
150150
%{client | demuxing_engine: demuxing_engine}
151151
|> download_chunk()
152152
|> case do
153-
{:ok, client} -> do_read_sample(client, media_type)
153+
{:ok, client} -> do_read_frame(client, media_type)
154154
{:end_of_stream, client} -> {:end_of_stream, client}
155155
end
156156

157-
{:ok, sample, demuxing_engine} ->
157+
{:ok, frame, demuxing_engine} ->
158158
client =
159159
with %{timestamp_offsets: %{^media_type => nil}} <- client do
160-
client |> put_in([:timestamp_offsets, media_type], sample.dts_ms)
160+
client |> put_in([:timestamp_offsets, media_type], frame.dts)
161161
end
162-
|> put_in([:last_timestamps, media_type], sample.dts_ms)
162+
|> put_in([:last_timestamps, media_type], frame.dts)
163163
|> put_in([:demuxing_engine], demuxing_engine)
164164

165-
{sample, client}
165+
{frame, client}
166166
end
167167
end
168168

@@ -178,11 +178,11 @@ defmodule ExHLS.Client do
178178

179179
{:error, _reason} ->
180180
media_type = media_type_with_lower_ts(client)
181-
{sample_or_eos, client} = do_read_sample(client, media_type)
181+
{frame, client} = do_read_frame(client, media_type)
182182

183-
with %ExHLS.Sample{} <- sample_or_eos do
183+
with %ExHLS.Frame{} <- frame do
184184
client
185-
|> update_in([:queues, media_type], &Qex.push(&1, sample_or_eos))
185+
|> update_in([:queues, media_type], &Qex.push(&1, frame))
186186
|> get_tracks_info()
187187
else
188188
:end_of_stream ->

lib/ex_hls/demuxing_engine.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ defmodule ExHLS.DemuxingEngine do
99

1010
@callback get_tracks_info(t()) :: {:ok, %{optional(integer()) => struct()}} | {:error, any()}
1111

12-
@callback pop_sample(t(), track_id :: any()) ::
13-
{:ok, ExHLS.Sample.t(), t()} | {:error, :empty_track_data, t()}
12+
@callback pop_frame(t(), track_id :: any()) ::
13+
{:ok, ExHLS.Frame.t(), t()} | {:error, :empty_track_data, t()}
1414

1515
@callback end_stream(t()) :: {:ok, t()}
1616
end

lib/ex_hls/demuxing_engine/cmaf.ex

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ defmodule ExHLS.DemuxingEngine.CMAF do
55
@behaviour ExHLS.DemuxingEngine
66

77
@enforce_keys [:demuxer]
8-
defstruct @enforce_keys ++ [tracks_to_samples: %{}]
8+
defstruct @enforce_keys ++ [tracks_to_frames: %{}]
99

1010
@type t :: %__MODULE__{
1111
demuxer: CMAF.Engine.t(),
12-
tracks_to_samples: map()
12+
tracks_to_frames: map()
1313
}
1414

1515
@impl true
@@ -26,34 +26,31 @@ defmodule ExHLS.DemuxingEngine.CMAF do
2626
|> CMAF.Engine.feed!(binary)
2727
|> CMAF.Engine.pop_samples()
2828

29-
new_tracks_to_samples =
29+
new_tracks_to_frames =
3030
samples
3131
|> Enum.group_by(
3232
fn sample -> sample.track_id end,
3333
fn %CMAF.Engine.Sample{} = sample ->
34-
%ExHLS.Sample{
34+
%ExHLS.Frame{
3535
payload: sample.payload,
36-
pts_ms: sample.pts,
37-
dts_ms: sample.dts,
36+
pts: sample.pts,
37+
dts: sample.dts,
3838
track_id: sample.track_id
3939
}
4040
end
4141
)
4242

43-
tracks_to_samples =
44-
new_tracks_to_samples
45-
|> Enum.reduce(
46-
demuxing_engine.tracks_to_samples,
47-
fn {track_id, new_samples}, tracks_to_samples ->
48-
tracks_to_samples
49-
|> Map.put_new_lazy(track_id, &Qex.new/0)
50-
|> Map.update!(track_id, fn track_qex ->
51-
new_samples |> Enum.reduce(track_qex, &Qex.push(&2, &1))
52-
end)
53-
end
54-
)
43+
tracks_to_frames =
44+
new_tracks_to_frames
45+
|> Enum.reduce(demuxing_engine.tracks_to_frames, fn {track_id, frames}, tracks_to_frames ->
46+
tracks_to_frames
47+
|> Map.put_new_lazy(track_id, &Qex.new/0)
48+
|> Map.update!(track_id, fn track_qex ->
49+
frames |> Enum.reduce(track_qex, &Qex.push(&2, &1))
50+
end)
51+
end)
5552

56-
%__MODULE__{demuxing_engine | demuxer: demuxer, tracks_to_samples: tracks_to_samples}
53+
%__MODULE__{demuxing_engine | demuxer: demuxer, tracks_to_frames: tracks_to_frames}
5754
end
5855

5956
@impl true
@@ -62,11 +59,11 @@ defmodule ExHLS.DemuxingEngine.CMAF do
6259
end
6360

6461
@impl true
65-
def pop_sample(demuxing_engine, track_id) do
66-
with qex when qex != nil <- demuxing_engine.tracks_to_samples[track_id],
67-
{{:value, sample}, popped_qex} <- Qex.pop(qex) do
68-
demuxing_engine = put_in(demuxing_engine.tracks_to_samples[track_id], popped_qex)
69-
{:ok, sample, demuxing_engine}
62+
def pop_frame(demuxing_engine, track_id) do
63+
with qex when qex != nil <- demuxing_engine.tracks_to_frames[track_id],
64+
{{:value, frame}, popped_qex} <- Qex.pop(qex) do
65+
demuxing_engine = put_in(demuxing_engine.tracks_to_frames[track_id], popped_qex)
66+
{:ok, frame, demuxing_engine}
7067
else
7168
nil -> {:error, :unknown_track, demuxing_engine}
7269
{:empty, _qex} -> {:error, :empty_track_data, demuxing_engine}

lib/ex_hls/demuxing_engine/mpeg_ts.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,20 @@ defmodule ExHLS.DemuxingEngine.MPEGTS do
6161
end
6262

6363
@impl true
64-
def pop_sample(%__MODULE__{} = demuxing_engine, track_id) do
64+
def pop_frame(%__MODULE__{} = demuxing_engine, track_id) do
6565
with {[packet], demuxer} <- Demuxer.take(demuxing_engine.demuxer, track_id) do
66-
sample = %ExHLS.Sample{
66+
frame = %ExHLS.Frame{
6767
payload: packet.data,
68-
pts_ms: packet.pts |> packet_ts_to_millis(),
69-
dts_ms: packet.dts |> packet_ts_to_millis(),
68+
pts: packet.pts |> packet_ts_to_millis(),
69+
dts: packet.dts |> packet_ts_to_millis(),
7070
track_id: track_id,
7171
metadata: %{
7272
discontinuity: packet.discontinuity,
7373
is_aligned: packet.is_aligned
7474
}
7575
}
7676

77-
{:ok, sample, %{demuxing_engine | demuxer: demuxer}}
77+
{:ok, frame, %{demuxing_engine | demuxer: demuxer}}
7878
else
7979
{[], demuxer} ->
8080
{:error, :empty_track_data, %{demuxing_engine | demuxer: demuxer}}

lib/ex_hls/sample.ex renamed to lib/ex_hls/frame.ex

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
defmodule ExHLS.Sample do
1+
defmodule ExHLS.Frame do
22
@moduledoc """
3-
A struct representing a media sample in the ExHLS demuxing engine.
3+
A struct representing a media frame in the ExHLS demuxing engine.
44
"""
5-
@enforce_keys [:payload, :pts_ms, :dts_ms, :track_id]
5+
@enforce_keys [:payload, :pts, :dts, :track_id]
66
defstruct @enforce_keys ++ [metadata: %{}]
77

88
@type t :: %__MODULE__{
99
payload: binary(),
10-
pts_ms: integer(),
11-
dts_ms: integer(),
10+
pts: integer(),
11+
dts: integer(),
1212
track_id: term(),
1313
metadata: map()
1414
}

mix.exs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ defmodule ExHLS.Mixfile do
4343
{:qex, "~> 0.5.1"},
4444
{:membrane_mp4_plugin, "~> 0.35.3"},
4545
{:membrane_h26x_plugin, "~> 0.10.2"},
46-
# {:mpeg_ts, github: "kim-company/kim_mpeg_ts"},
47-
{:mpeg_ts, github: "membraneframework-labs/kim_mpeg_ts", branch: "fix-dialyzer"},
46+
{:mpeg_ts, github: "kim-company/kim_mpeg_ts"},
4847
{:ex_doc, ">= 0.0.0", only: :dev, runtime: false},
4948
{:dialyxir, ">= 0.0.0", only: :dev, runtime: false},
5049
{:credo, ">= 0.0.0", only: :dev, runtime: false}

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"membrane_timestamp_queue": {:hex, :membrane_timestamp_queue, "0.2.2", "1c831b2273d018a6548654aa9f7fa7c4b683f71d96ffe164934ef55f9d11f693", [:mix], [{:heap, "~> 2.0", [hex: :heap, repo: "hexpm", optional: false]}, {:membrane_core, "~> 1.0", [hex: :membrane_core, repo: "hexpm", optional: false]}], "hexpm", "7c830e760baaced0988421671cd2c83c7cda8d1bd2b61fd05332711675d1204f"},
3333
"mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"},
3434
"mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"},
35-
"mpeg_ts": {:git, "https://github.com/membraneframework-labs/kim_mpeg_ts.git", "0a8658c3773db621907860050f89375798ea9ec1", [branch: "fix-dialyzer"]},
35+
"mpeg_ts": {:git, "https://github.com/kim-company/kim_mpeg_ts.git", "64e568eed6392a0faedb0f428a54d2927df16782", []},
3636
"nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"},
3737
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
3838
"nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"},

test/client_test.exs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ defmodule Client.Test do
77

88
@mpegts_url "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"
99
@fmp4_url "https://raw.githubusercontent.com/membraneframework-labs/ex_hls/refs/heads/plug-demuxing-engine-into-client/fixture/output.m3u8"
10-
describe "if client reads video and audio samples of the HLS" do
10+
describe "if client reads video and audio frames of the HLS" do
1111
test "(MPEGTS) stream" do
1212
client = Client.new(@mpegts_url, ExHLS.DemuxingEngine.MPEGTS)
1313

@@ -27,23 +27,23 @@ defmodule Client.Test do
2727
assert %RemoteStream{content_format: AAC, type: :bytestream} in tracks_info
2828
assert %RemoteStream{content_format: H264, type: :bytestream} in tracks_info
2929

30-
{video_sample, client} = client |> Client.read_video_sample()
30+
{video_frame, client} = client |> Client.read_video_frame()
3131

32-
assert %{pts_ms: 10033, dts_ms: 10000} = video_sample
33-
assert byte_size(video_sample.payload) == 1048
32+
assert %{pts: 10033, dts: 10000} = video_frame
33+
assert byte_size(video_frame.payload) == 1048
3434

3535
assert <<0, 0, 0, 1, 9, 240, 0, 0, 0, 1, 103, 100, 0, 31, 172, 217, 128, 80, 5, 187, 1, 16,
3636
0, 0, 3, 0, 16, 0, 0, 7, 128, 241, 131, 25, 160, 0, 0, 0,
37-
1>> <> _rest = video_sample.payload
37+
1>> <> _rest = video_frame.payload
3838

39-
{audio_sample, _client} = Client.read_audio_sample(client)
39+
{audio_frame, _client} = Client.read_audio_frame(client)
4040

41-
assert %{pts_ms: 10010, dts_ms: 10010} = audio_sample
42-
assert byte_size(audio_sample.payload) == 6154
41+
assert %{pts: 10010, dts: 10010} = audio_frame
42+
assert byte_size(audio_frame.payload) == 6154
4343

4444
assert <<255, 241, 80, 128, 4, 63, 252, 222, 4, 0, 0, 108, 105, 98, 102, 97, 97, 99, 32, 49,
4545
46, 50, 56, 0, 0, 66, 64, 147, 32, 4, 50, 0, 71, 255, 241, 80, 128, 10, 255, 252,
46-
33, 70, 254, 208, 221, 101, 200, 21, 97, 0>> <> _rest = audio_sample.payload
46+
33, 70, 254, 208, 221, 101, 200, 21, 97, 0>> <> _rest = audio_frame.payload
4747
end
4848

4949
test "(fMP4) stream" do
@@ -73,27 +73,27 @@ defmodule Client.Test do
7373
} = tracks_info |> Enum.find(&match?(%AAC{}, &1))
7474

7575
assert Client.get_variants(client) == %{}
76-
{video_sample, client} = Client.read_video_sample(client)
76+
{video_frame, client} = Client.read_video_frame(client)
7777

78-
assert %{pts_ms: 0, dts_ms: 0} = video_sample
79-
assert byte_size(video_sample.payload) == 775
78+
assert %{pts: 0, dts: 0} = video_frame
79+
assert byte_size(video_frame.payload) == 775
8080

8181
assert <<0, 0, 2, 171, 6, 5, 255, 255, 167, 220, 69, 233, 189, 230, 217, 72, 183, 150, 44,
8282
216, 32, 217, 35, 238, 239, 120, 50, 54, 52, 32, 45, 32, 99, 111, 114, 101, 32, 49,
83-
54, 52, 32, 114, 51, 49, 48, 56, 32, 51, 49, 101>> <> _rest = video_sample.payload
83+
54, 52, 32, 114, 51, 49, 48, 56, 32, 51, 49, 101>> <> _rest = video_frame.payload
8484

85-
{first_audio_sample, client} = Client.read_audio_sample(client)
85+
{first_audio_frame, client} = Client.read_audio_frame(client)
8686

87-
assert %{pts_ms: 0, dts_ms: 0} = first_audio_sample
87+
assert %{pts: 0, dts: 0} = first_audio_frame
8888

89-
assert first_audio_sample.payload ==
89+
assert first_audio_frame.payload ==
9090
<<220, 0, 76, 97, 118, 99, 54, 49, 46, 51, 46, 49, 48, 48, 0, 66, 32, 8, 193, 24,
9191
56>>
9292

93-
{second_audio_sample, _client} = Client.read_audio_sample(client)
93+
{second_audio_frame, _client} = Client.read_audio_frame(client)
9494

95-
assert %{pts_ms: 23, dts_ms: 23} = second_audio_sample
96-
assert second_audio_sample.payload == <<33, 16, 4, 96, 140, 28>>
95+
assert %{pts: 23, dts: 23} = second_audio_frame
96+
assert second_audio_frame.payload == <<33, 16, 4, 96, 140, 28>>
9797
end
9898
end
9999
end

test/test_helper.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
ExUnit.start(capture_log: true)
2+
# ExUnit.start()

0 commit comments

Comments
 (0)