2025-03-09 23:45:43 +09:00

81 lines
2.3 KiB
C

/**
* @file re_av1.h AV1 Open Bitstream Unit (OBU)
*
* Copyright (C) 2010 - 2022 Alfred E. Heggestad
*/
/* OBU (Open Bitstream Units) */
/** Defines the OBU type */
enum obu_type {
AV1_OBU_SEQUENCE_HEADER = 1,
AV1_OBU_TEMPORAL_DELIMITER = 2,
AV1_OBU_FRAME_HEADER = 3,
AV1_OBU_TILE_GROUP = 4,
AV1_OBU_METADATA = 5,
AV1_OBU_FRAME = 6,
AV1_OBU_REDUNDANT_FRAME_HEADER = 7,
AV1_OBU_TILE_LIST = 8,
AV1_OBU_PADDING = 15,
};
/**
* AV1 OBU Header
*
* 0 1 2 3 4 5 6 7
* +-+-+-+-+-+-+-+-+
* |F| type |X|S|-| (REQUIRED)
* +-+-+-+-+-+-+-+-+
*/
struct av1_obu_hdr {
enum obu_type type; /**< OBU type */
bool x; /**< Extension flag */
bool s; /**< Has size field */
size_t size; /**< Payload size */
};
int av1_leb128_encode(struct mbuf *mb, uint64_t value);
int av1_leb128_decode(struct mbuf *mb, uint64_t *value);
int av1_obu_encode(struct mbuf *mb, uint8_t type, bool has_size,
size_t len, const uint8_t *payload);
int av1_obu_decode(struct av1_obu_hdr *hdr, struct mbuf *mb);
int av1_obu_print(struct re_printf *pf, const struct av1_obu_hdr *hdr);
unsigned av1_obu_count(const uint8_t *buf, size_t size);
unsigned av1_obu_count_rtp(const uint8_t *buf, size_t size);
const char *av1_obu_name(enum obu_type type);
bool obu_allowed_rtp(enum obu_type type);
/*
* Packetizer
*/
typedef int (av1_packet_h)(bool marker, uint64_t rtp_ts,
const uint8_t *hdr, size_t hdr_len,
const uint8_t *pld, size_t pld_len,
void *arg);
int av1_packetize_high(bool *newp, bool marker, uint64_t rtp_ts,
const uint8_t *buf, size_t len, size_t maxlen,
av1_packet_h *pkth, void *arg);
int av1_packetize_one_w(bool *newp, bool marker, uint64_t rtp_ts,
const uint8_t *buf, size_t len, size_t maxlen,
av1_packet_h *pkth, void *arg);
enum {
AV1_AGGR_HDR_SIZE = 1,
};
/** AV1 Aggregation Header */
struct av1_aggr_hdr {
unsigned z:1; /**< Continuation of OBU fragment from prev packet */
unsigned y:1; /**< Last OBU element will continue in next packe */
unsigned w:2; /**< Number of OBU elements in the packet */
unsigned n:1; /**< First packet of a coded video sequence */
};
int av1_aggr_hdr_decode(struct av1_aggr_hdr *hdr, struct mbuf *mb);