@UnstableApi
public final class NalUnitUtil


Utility methods for handling H.264/AVC and H.265/HEVC NAL units.

Summary

Nested types

public final class NalUnitUtil.H265SpsData

Holds data parsed from a H.265 sequence parameter set NAL unit.

public final class NalUnitUtil.PpsData

Holds data parsed from a picture parameter set NAL unit.

public final class NalUnitUtil.SpsData

Holds data parsed from a H.264 sequence parameter set NAL unit.

Constants

static final float[]

Aspect ratios indexed by aspect_ratio_idc, in H.264 and H.265 SPSs.

static final int

Value for aspect_ratio_idc indicating an extended aspect ratio, in H.264 and H.265 SPSs.

static final byte[]

Four initial bytes that must prefix NAL units for decoding.

static final int

Access unit delimiter.

static final int

Coded slice of an IDR picture.

static final int

Coded slice of a non-IDR picture.

static final int

Coded slice data partition A.

static final int

Picture parameter set.

static final int

Prefix NAL unit.

static final int

Supplemental enhancement information.

static final int

Sequence parameter set.

Public methods

static void
clearPrefixFlags(boolean[] prefixFlags)

Clears prefix flags, as used by findNalUnit.

static void

Discards data from the buffer up to the first SPS, where data.position() is interpreted as the length of the buffer.

static int
findNalUnit(
    byte[] data,
    int startOffset,
    int endOffset,
    boolean[] prefixFlags
)

Finds the first NAL unit in data.

static int
getH265NalUnitType(byte[] data, int offset)

Returns the type of the H.265 NAL unit in data that starts at offset.

static int
getNalUnitType(byte[] data, int offset)

Returns the type of the NAL unit in data that starts at offset.

static boolean
isNalUnitSei(@Nullable String mimeType, byte nalUnitHeaderFirstByte)

Returns whether the NAL unit with the specified header contains supplemental enhancement information.

static NalUnitUtil.H265SpsData
parseH265SpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.

static NalUnitUtil.H265SpsData
parseH265SpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.

static NalUnitUtil.PpsData
parsePpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.2.

static NalUnitUtil.PpsData
parsePpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.2.

static NalUnitUtil.SpsData
parseSpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.

static NalUnitUtil.SpsData
parseSpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.

static int
unescapeStream(byte[] data, int limit)

Unescapes data up to the specified limit, replacing occurrences of [0, 0, 3] with [0, 0].

Constants

ASPECT_RATIO_IDC_VALUES

public static final float[] ASPECT_RATIO_IDC_VALUES

Aspect ratios indexed by aspect_ratio_idc, in H.264 and H.265 SPSs.

EXTENDED_SAR

public static final int EXTENDED_SAR = 255

Value for aspect_ratio_idc indicating an extended aspect ratio, in H.264 and H.265 SPSs.

NAL_START_CODE

public static final byte[] NAL_START_CODE

Four initial bytes that must prefix NAL units for decoding.

NAL_UNIT_TYPE_AUD

public static final int NAL_UNIT_TYPE_AUD = 9

Access unit delimiter.

NAL_UNIT_TYPE_IDR

public static final int NAL_UNIT_TYPE_IDR = 5

Coded slice of an IDR picture.

NAL_UNIT_TYPE_NON_IDR

public static final int NAL_UNIT_TYPE_NON_IDR = 1

Coded slice of a non-IDR picture.

NAL_UNIT_TYPE_PARTITION_A

public static final int NAL_UNIT_TYPE_PARTITION_A = 2

Coded slice data partition A.

NAL_UNIT_TYPE_PPS

public static final int NAL_UNIT_TYPE_PPS = 8

Picture parameter set.

NAL_UNIT_TYPE_PREFIX

public static final int NAL_UNIT_TYPE_PREFIX = 14

Prefix NAL unit.

NAL_UNIT_TYPE_SEI

public static final int NAL_UNIT_TYPE_SEI = 6

Supplemental enhancement information.

NAL_UNIT_TYPE_SPS

public static final int NAL_UNIT_TYPE_SPS = 7

Sequence parameter set.

Public methods

clearPrefixFlags

public static void clearPrefixFlags(boolean[] prefixFlags)

Clears prefix flags, as used by findNalUnit.

Parameters
boolean[] prefixFlags

The flags to clear.

discardToSps

public static void discardToSps(ByteBuffer data)

Discards data from the buffer up to the first SPS, where data.position() is interpreted as the length of the buffer.

When the method returns, data.position() will contain the new length of the buffer. If the buffer is not empty it is guaranteed to start with an SPS.

Parameters
ByteBuffer data

Buffer containing start code delimited NAL units.

findNalUnit

public static int findNalUnit(
    byte[] data,
    int startOffset,
    int endOffset,
    boolean[] prefixFlags
)

Finds the first NAL unit in data.

If prefixFlags is null then the first three bytes of a NAL unit must be entirely contained within the part of the array being searched in order for it to be found.

When prefixFlags is non-null, this method supports finding NAL units whose first four bytes span data arrays passed to successive calls. To use this feature, pass the same prefixFlags parameter to successive calls. State maintained in this parameter enables the detection of such NAL units. Note that when using this feature, the return value may be 3, 2 or 1 less than startOffset, to indicate a NAL unit starting 3, 2 or 1 bytes before the first byte in the current array.

Parameters
byte[] data

The data to search.

int startOffset

The offset (inclusive) in the data to start the search.

int endOffset

The offset (exclusive) in the data to end the search.

boolean[] prefixFlags

A boolean array whose first three elements are used to store the state required to detect NAL units where the NAL unit prefix spans array boundaries. The array must be at least 3 elements long.

Returns
int

The offset of the NAL unit, or endOffset if a NAL unit was not found.

getH265NalUnitType

public static int getH265NalUnitType(byte[] data, int offset)

Returns the type of the H.265 NAL unit in data that starts at offset.

Parameters
byte[] data

The data to search.

int offset

The start offset of a NAL unit. Must lie between -3 (inclusive) and data.length - 3 (exclusive).

Returns
int

The type of the unit.

getNalUnitType

public static int getNalUnitType(byte[] data, int offset)

Returns the type of the NAL unit in data that starts at offset.

Parameters
byte[] data

The data to search.

int offset

The start offset of a NAL unit. Must lie between -3 (inclusive) and data.length - 3 (exclusive).

Returns
int

The type of the unit.

isNalUnitSei

public static boolean isNalUnitSei(@Nullable String mimeType, byte nalUnitHeaderFirstByte)

Returns whether the NAL unit with the specified header contains supplemental enhancement information.

Parameters
@Nullable String mimeType

The sample MIME type, or null if unknown.

byte nalUnitHeaderFirstByte

The first byte of nal_unit().

Returns
boolean

Whether the NAL unit with the specified header is an SEI NAL unit. False is returned if the MimeType is null.

parseH265SpsNalUnit

public static NalUnitUtil.H265SpsData parseH265SpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.

Parameters
byte[] nalData

A buffer containing escaped SPS data.

int nalOffset

The offset of the NAL unit header in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.H265SpsData

A parsed representation of the SPS data.

parseH265SpsNalUnitPayload

public static NalUnitUtil.H265SpsData parseH265SpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) subsection 7.3.2.2.1.

Parameters
byte[] nalData

A buffer containing escaped SPS data.

int nalOffset

The offset of the NAL unit payload in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.H265SpsData

A parsed representation of the SPS data.

parsePpsNalUnit

public static NalUnitUtil.PpsData parsePpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.2.

Parameters
byte[] nalData

A buffer containing escaped PPS data.

int nalOffset

The offset of the NAL unit header in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.PpsData

A parsed representation of the PPS data.

parsePpsNalUnitPayload

public static NalUnitUtil.PpsData parsePpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.2.

Parameters
byte[] nalData

A buffer containing escaped PPS data.

int nalOffset

The offset of the NAL unit payload in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.PpsData

A parsed representation of the PPS data.

parseSpsNalUnit

public static NalUnitUtil.SpsData parseSpsNalUnit(byte[] nalData, int nalOffset, int nalLimit)

Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.

Parameters
byte[] nalData

A buffer containing escaped SPS data.

int nalOffset

The offset of the NAL unit header in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.SpsData

A parsed representation of the SPS data.

parseSpsNalUnitPayload

public static NalUnitUtil.SpsData parseSpsNalUnitPayload(byte[] nalData, int nalOffset, int nalLimit)

Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) subsection 7.3.2.1.1.

Parameters
byte[] nalData

A buffer containing escaped SPS data.

int nalOffset

The offset of the NAL unit payload in nalData.

int nalLimit

The limit of the NAL unit in nalData.

Returns
NalUnitUtil.SpsData

A parsed representation of the SPS data.

unescapeStream

public static int unescapeStream(byte[] data, int limit)

Unescapes data up to the specified limit, replacing occurrences of [0, 0, 3] with [0, 0]. The unescaped data is returned in-place, with the return value indicating its length.

Executions of this method are mutually exclusive, so it should not be called with very large buffers.

Parameters
byte[] data

The data to unescape.

int limit

The limit (exclusive) of the data to unescape.

Returns
int

The length of the unescaped data.