Files
P4-USB-transfer/main/NS4168/ogg_demux.c
T
zhengxinandCursor 851e347cf5 初始提交卡包 USB 工程
纳入固件源码、屏幕组件、nand_xfer 工具和文档。忽略本机构建产物、sdkconfig,以及含本机路径的依赖锁。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 21:54:50 +08:00

58 lines
1.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}