58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
#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;
|
|||
|
|
}
|