126 lines
3.7 KiB
C
126 lines
3.7 KiB
C
/**
|
|
* @file re_h264.h Interface to H.264 header parser
|
|
*
|
|
* Copyright (C) 2010 Creytiv.com
|
|
*/
|
|
|
|
|
|
/** NAL unit types */
|
|
enum h264_nalu {
|
|
H264_NALU_SLICE = 1,
|
|
H264_NALU_DPA = 2,
|
|
H264_NALU_DPB = 3,
|
|
H264_NALU_DPC = 4,
|
|
H264_NALU_IDR_SLICE = 5,
|
|
H264_NALU_SEI = 6,
|
|
H264_NALU_SPS = 7,
|
|
H264_NALU_PPS = 8,
|
|
H264_NALU_AUD = 9,
|
|
H264_NALU_END_SEQUENCE = 10,
|
|
H264_NALU_END_STREAM = 11,
|
|
H264_NALU_FILLER_DATA = 12,
|
|
H264_NALU_SPS_EXT = 13,
|
|
H264_NALU_AUX_SLICE = 19,
|
|
|
|
H264_NALU_STAP_A = 24,
|
|
H264_NALU_STAP_B = 25,
|
|
H264_NALU_MTAP16 = 26,
|
|
H264_NALU_MTAP24 = 27,
|
|
H264_NALU_FU_A = 28,
|
|
H264_NALU_FU_B = 29,
|
|
};
|
|
|
|
|
|
/**
|
|
* H.264 NAL Header
|
|
*/
|
|
struct h264_nal_header {
|
|
unsigned f:1; /**< Forbidden zero bit (must be 0) */
|
|
unsigned nri:2; /**< nal_ref_idc */
|
|
unsigned type:5; /**< NAL unit type */
|
|
};
|
|
|
|
|
|
int h264_nal_header_encode(struct mbuf *mb, const struct h264_nal_header *hdr);
|
|
int h264_nal_header_decode(struct h264_nal_header *hdr, struct mbuf *mb);
|
|
void h264_nal_header_decode_buf(struct h264_nal_header *hdr,
|
|
const uint8_t *buf);
|
|
const char *h264_nal_unit_name(enum h264_nalu nal_type);
|
|
|
|
|
|
/**
|
|
* H.264 Sequence Parameter Set (SPS)
|
|
*/
|
|
struct h264_sps {
|
|
uint8_t profile_idc;
|
|
uint8_t level_idc;
|
|
uint8_t seq_parameter_set_id; /* 0-31 */
|
|
uint8_t chroma_format_idc; /* 0-3 */
|
|
|
|
unsigned log2_max_frame_num;
|
|
unsigned pic_order_cnt_type;
|
|
|
|
unsigned max_num_ref_frames;
|
|
unsigned pic_width_in_mbs;
|
|
unsigned pic_height_in_map_units;
|
|
|
|
unsigned frame_crop_left_offset; /* pixels */
|
|
unsigned frame_crop_right_offset; /* pixels */
|
|
unsigned frame_crop_top_offset; /* pixels */
|
|
unsigned frame_crop_bottom_offset; /* pixels */
|
|
};
|
|
|
|
int h264_sps_decode(struct h264_sps *sps, const uint8_t *p, size_t len);
|
|
void h264_sps_resolution(const struct h264_sps *sps,
|
|
unsigned *width, unsigned *height);
|
|
const char *h264_sps_chroma_format_name(uint8_t chroma_format_idc);
|
|
|
|
|
|
typedef int (h264_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);
|
|
|
|
/** Fragmentation Unit header */
|
|
struct h264_fu {
|
|
unsigned s:1; /**< Start bit */
|
|
unsigned e:1; /**< End bit */
|
|
unsigned r:1; /**< The Reserved bit MUST be equal to 0 */
|
|
unsigned type:5; /**< The NAL unit payload type */
|
|
};
|
|
|
|
int h264_fu_hdr_encode(const struct h264_fu *fu, struct mbuf *mb);
|
|
int h264_fu_hdr_decode(struct h264_fu *fu, struct mbuf *mb);
|
|
|
|
const uint8_t *h264_find_startcode(const uint8_t *p, const uint8_t *end);
|
|
|
|
int h264_packetize(uint64_t rtp_ts, const uint8_t *buf, size_t len,
|
|
size_t pktsize, h264_packet_h *pkth, void *arg);
|
|
int h264_nal_send(bool first, bool last,
|
|
bool marker, uint32_t ihdr, uint64_t rtp_ts,
|
|
const uint8_t *buf, size_t size, size_t maxsz,
|
|
h264_packet_h *pkth, void *arg);
|
|
bool h264_is_keyframe(int type);
|
|
int h264_stap_encode(struct mbuf *mb, const uint8_t *frame,
|
|
size_t frame_sz);
|
|
int h264_stap_decode_annexb(struct mbuf *mb_frame, struct mbuf *mb_pkt);
|
|
int h264_stap_decode_annexb_long(struct mbuf *mb_frame, struct mbuf *mb_pkt);
|
|
|
|
|
|
/*
|
|
* Get bits wrapper
|
|
*/
|
|
|
|
struct getbit {
|
|
const uint8_t *buf;
|
|
size_t pos;
|
|
size_t end;
|
|
};
|
|
|
|
void getbit_init(struct getbit *gb, const uint8_t *buf, size_t size);
|
|
size_t getbit_get_left(const struct getbit *gb);
|
|
unsigned get_bit(struct getbit *gb);
|
|
int get_ue_golomb(struct getbit *gb, unsigned *valp);
|
|
unsigned get_bits(struct getbit *gb, unsigned n);
|
|
unsigned getbit_read_ns(struct getbit *gb, unsigned n);
|