#include "ogg_demux.h" static uint32_t le32(const uint8_t* p) { return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24); } int ogg_parse_page(const uint8_t* buf, int buf_len, ogg_page_t* page) { if (buf_len < 27) return -1; /* 校验 "OggS" */ if (buf[0] != 'O' || buf[1] != 'g' || buf[2] != 'g' || buf[3] != 'S') return -2; /* 拷贝页头 */ for (int i = 0; i < 27; ++i) page->header[i] = buf[i]; page->seg_count = buf[26]; if (buf_len < 27 + page->seg_count) return -3; /* 读取 segment table */ for (int i = 0; i < page->seg_count; ++i) page->seg_table[i] = buf[27 + i]; /* 计算 body 大小 */ uint32_t body_size = 0; for (int i = 0; i < page->seg_count; ++i) body_size += page->seg_table[i]; page->body_size = body_size; if (buf_len < 27 + page->seg_count + body_size) return -4; return (int)body_size; } int ogg_extract_packet(const uint8_t* body, const ogg_page_t* page, uint8_t* packet, int packet_buf_size) { /* 极简版:假设一个页里只有一个完整 packet(常见于 OpusHead / OpusTags) */ uint32_t total = page->body_size; if (total > (uint32_t)packet_buf_size) return -1; for (uint32_t i = 0; i < total; ++i) packet[i] = body[i]; return (int)total; }