---
sidebar:
  hidden: true
title: roboto.experimental.video.av1
---
Minimal AV1 low-overhead bitstream inspection.

AV1 has no Annex B framing: a message payload is one temporal unit — a sequence of OBUs (open bitstream units), each with a 1-2 byte header and a LEB128-coded size (AV1 Bitstream Specification section 5.2). This module walks the OBUs and parses only the fixed leading bits of the frame header needed for keyframe detection; the decoder reads everything else from the in-band sequence header.

## Module Contents

### Obu

```python
class roboto.experimental.video.av1.Obu
```

`from roboto.experimental.video.av1 import Obu`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/video/av1.py#L37-L44)

One OBU split out of a low-overhead AV1 temporal unit.

**Attributes**

- **Obu.payload** (`bytes`): The OBU's payload bytes (header and size field excluded).
- **Obu.type** (`int`): `obu_type` from the OBU header.

### ObuType

```python
class roboto.experimental.video.av1.ObuType
```

`from roboto.experimental.video.av1 import ObuType`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/video/av1.py#L23-L33)

Bases: `enum.IntEnum`

AV1 OBU types (AV1 Bitstream Specification section 5.3.2) relevant here.

OBU headers can carry any 4-bit type value, so [`Obu.type`](/reference/python-sdk/roboto/experimental/video/av1#roboto.experimental.video.av1.Obu.type) is a plain `int`; compare against these members for the types that matter.

**Attributes**

- **ObuType.FRAME** = `6`
- **ObuType.FRAME_HEADER** = `3`
- **ObuType.SEQUENCE_HEADER** = `1`
- **ObuType.TEMPORAL_DELIMITER** = `2`

### find_obus()

```python
def roboto.experimental.video.av1.find_obus(data: bytes) -> list[Obu]
```

`from roboto.experimental.video.av1 import find_obus`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/video/av1.py#L60-L97)

Split a low-overhead AV1 temporal unit into its OBUs.

Walking stops (returning the OBUs found so far) at the first malformed header, truncated size field, or size that overruns the payload. An OBU without a size field extends to the end of the data, as the spec allows for the last OBU of a temporal unit.

**Parameters**

- **data** (`bytes`): One temporal unit's bytes in the low-overhead bitstream format.

**Returns**

- `list[Obu]`: The unit's OBUs in bitstream order, payloads copied.

### is_keyframe()

```python
def roboto.experimental.video.av1.is_keyframe(data: bytes) -> bool
```

`from roboto.experimental.video.av1 import is_keyframe`

[Source](https://github.com/roboto-ai/roboto-python-sdk/blob/main/src/roboto/experimental/video/av1.py#L100-L129)

Whether the AV1 temporal unit contains a KEY_FRAME (clean decoder entry point).

The first frame (or frame-header) OBU's leading bits are checked: `show_existing_frame` must be 0 and `frame_type` KEY_FRAME. When the unit's own sequence header declares `reduced_still_picture_header`, the frame is a keyframe by definition (that mode only encodes intra frames).

**Parameters**

- **data** (`bytes`): One temporal unit's bytes in the low-overhead bitstream format.

**Returns**

- `bool`: True when the unit contains a keyframe.
