Skip to content

Commit

Permalink
Merge pull request #2 from membraneframework-labs/handle_alignment_in…
Browse files Browse the repository at this point in the history
…dicator

Add handling of `alignment_indicator`
  • Loading branch information
dmorn committed Oct 25, 2023
2 parents 7874e3d + 683bc8c commit 3c1ad37
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 19 deletions.
21 changes: 11 additions & 10 deletions lib/mpeg/ts/packet.ex
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,17 @@ defmodule MPEG.TS.Packet do
pusi = parse_flag(payload_unit_start_indicator),
scrambling = parse_scrambling_control(transport_scrambling_control),
{:ok, adaptation, data} <- parse_payload(optional_fields, adaptation_field_id, pid_class) do
packet = %__MODULE__{
pusi: pusi,
pid: pid,
payload: data,
scrambling: scrambling,
continuity_counter: continuity_counter,
discontinuity_indicator: Map.get(adaptation, :discontinuity_indicator, false),
random_access_indicator: Map.get(adaptation, :random_access_indicator, false),
pcr: Map.get(adaptation, :pcr, nil)
}
packet =
%__MODULE__{
pusi: pusi,
pid: pid,
payload: data,
scrambling: scrambling,
continuity_counter: continuity_counter,
discontinuity_indicator: Map.get(adaptation, :discontinuity_indicator, false),
random_access_indicator: Map.get(adaptation, :random_access_indicator, false),
pcr: Map.get(adaptation, :pcr, nil)
}

{:ok, packet}
else
Expand Down
34 changes: 28 additions & 6 deletions lib/mpeg/ts/partial_pes.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ defmodule MPEG.TS.PartialPES do
data: binary(),
stream_id: pos_integer(),
pts: pos_integer(),
dts: pos_integer()
dts: pos_integer(),
is_aligned: boolean()
}
defstruct [:data, :stream_id, :pts, :dts]
defstruct [:data, :stream_id, :pts, :dts, :is_aligned]

require Logger

Expand All @@ -36,13 +37,15 @@ defmodule MPEG.TS.PartialPES do
# Packet length is ignored as the field is also allowed to be zero in case
# the payload is a video elementary stream. If the PES packet length is set
# to zero, the PES packet can be of any length.

with {:ok, optional, payload} <- parse_optional(optional_fields, has_header?(stream_id)) do
{:ok,
%__MODULE__{
data: payload,
stream_id: stream_id,
dts: Map.get(optional, :dts),
pts: Map.get(optional, :pts)
pts: Map.get(optional, :pts),
is_aligned: Map.get(optional, :is_aligned, false)
}}
end
end
Expand All @@ -64,7 +67,7 @@ defmodule MPEG.TS.PartialPES do
0b10::2,
_scrambling_control::2,
_priority::1,
_data_alignment_indicator::1,
data_alignment_indicator::1,
_copyright::1,
_original_or_copy::1,
pts_dts_indicator::2,
Expand All @@ -82,15 +85,34 @@ defmodule MPEG.TS.PartialPES do
) do
pts_dts_indicator = parse_pts_dts_indicator(pts_dts_indicator)

with {:ok, pts_dts, _rest} <- parse_pts_dts_field(optional_fields, pts_dts_indicator) do
{:ok, pts_dts, rest}
with {:ok, optionals_map, _rest} <- parse_pts_dts_field(optional_fields, pts_dts_indicator),
{:ok, optionals_map} =
parse_data_alignment_indicator(data_alignment_indicator, optionals_map) do
{:ok, optionals_map, rest}
end
end

defp parse_optional(_data, _has_header) do
{:error, :invalid_optional_field}
end

defp parse_data_alignment_indicator(alignment_indicator, optionals_map) do
alignment_indicator_flag =
case alignment_indicator do
0b0 -> false
0b1 -> true
end

optionals_map =
Map.put(
optionals_map,
:is_aligned,
alignment_indicator_flag
)

{:ok, optionals_map}
end

defp parse_pts_dts_indicator(0b11), do: :pts_and_dts
defp parse_pts_dts_indicator(0b01), do: :forbidden
defp parse_pts_dts_indicator(0b10), do: :only_pts
Expand Down
4 changes: 2 additions & 2 deletions lib/mpeg/ts/pes.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
defmodule MPEG.TS.PES do
@derive {Inspect, only: [:stream_id, :pts, :dts]}
defstruct [:data, :stream_id, :pts, :dts]
@derive {Inspect, only: [:stream_id, :pts, :dts, :is_aligned]}
defstruct [:data, :stream_id, :pts, :dts, :is_aligned]
end
4 changes: 3 additions & 1 deletion lib/mpeg/ts/stream_queue.ex
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ defmodule MPEG.TS.StreamQueue do
data: data,
stream_id: leader.stream_id,
pts: leader.pts,
dts: leader.dts
dts: leader.dts,
# the information about alignment should be available in the first `PartialPES`
is_aligned: leader.is_aligned
}
else
nil
Expand Down

0 comments on commit 3c1ad37

Please sign in to comment.