diff --git a/lib/include/chiaki/takion.h b/lib/include/chiaki/takion.h index 727a2b4..6a24f75 100644 --- a/lib/include/chiaki/takion.h +++ b/lib/include/chiaki/takion.h @@ -52,7 +52,7 @@ typedef struct chiaki_takion_av_packet_t ChiakiSeqNum16 unit_index; uint16_t units_in_frame_total; // source + units_in_frame_fec uint16_t units_in_frame_fec; - uint32_t codec; + uint8_t codec; uint16_t word_at_0x18; uint8_t adaptive_stream_index; uint8_t byte_at_0x2c; @@ -224,7 +224,9 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_feedback_state(ChiakiTakion *ta */ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_send_feedback_history(ChiakiTakion *takion, ChiakiSeqNum16 seq_num, uint8_t *payload, size_t payload_size); -CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_av_packet_parse(ChiakiTakionAVPacket *packet, uint8_t base_type, uint8_t *buf, size_t buf_size); +CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_v9_av_packet_parse(ChiakiTakionAVPacket *packet, uint8_t base_type, uint8_t *buf, size_t buf_size); + +CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_v7_av_packet_format_header(uint8_t *buf, size_t buf_size, size_t *header_size_out, ChiakiTakionAVPacket *packet); #ifdef __cplusplus } diff --git a/lib/src/takion.c b/lib/src/takion.c index 93c9ce1..9daf054 100644 --- a/lib/src/takion.c +++ b/lib/src/takion.c @@ -1138,7 +1138,7 @@ static void takion_handle_packet_av(ChiakiTakion *takion, uint8_t base_type, uin assert(base_type == TAKION_PACKET_TYPE_VIDEO || base_type == TAKION_PACKET_TYPE_AUDIO); ChiakiTakionAVPacket packet; - ChiakiErrorCode err = chiaki_takion_av_packet_parse(&packet, base_type, buf, buf_size); + ChiakiErrorCode err = chiaki_takion_v9_av_packet_parse(&packet, base_type, buf, buf_size); if(err != CHIAKI_ERR_SUCCESS) { if(err == CHIAKI_ERR_BUF_TOO_SMALL) @@ -1155,10 +1155,10 @@ static void takion_handle_packet_av(ChiakiTakion *takion, uint8_t base_type, uin } } -#define AV_HEADER_SIZE_VIDEO 0x17 -#define AV_HEADER_SIZE_AUDIO 0x12 +#define CHIAKI_TAKION_V9_AV_HEADER_SIZE_VIDEO 0x17 +#define CHIAKI_TAKION_V9_AV_HEADER_SIZE_AUDIO 0x12 -CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_av_packet_parse(ChiakiTakionAVPacket *packet, uint8_t base_type, uint8_t *buf, size_t buf_size) +CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_v9_av_packet_parse(ChiakiTakionAVPacket *packet, uint8_t base_type, uint8_t *buf, size_t buf_size) { memset(packet, 0, sizeof(ChiakiTakionAVPacket)); if(base_type != TAKION_PACKET_TYPE_VIDEO && base_type != TAKION_PACKET_TYPE_AUDIO) @@ -1173,7 +1173,7 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_av_packet_parse(ChiakiTakionAVPacket uint8_t *av = buf+1; size_t av_size = buf_size-1; - size_t av_header_size = packet->is_video ? AV_HEADER_SIZE_VIDEO : AV_HEADER_SIZE_AUDIO; + size_t av_header_size = packet->is_video ? CHIAKI_TAKION_V9_AV_HEADER_SIZE_VIDEO : CHIAKI_TAKION_V9_AV_HEADER_SIZE_AUDIO; if(av_size < av_header_size + 1) return CHIAKI_ERR_BUF_TOO_SMALL; @@ -1231,3 +1231,54 @@ CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_av_packet_parse(ChiakiTakionAVPacket return CHIAKI_ERR_SUCCESS; } + +#define CHIAKI_TAKION_V7_AV_HEADER_SIZE_BASE 0x11 +#define CHIAKI_TAKION_V7_AV_HEADER_SIZE_VIDEO_ADD 0x3 +#define CHIAKI_TAKION_V7_AV_HEADER_SIZE_NALU_INFO_STRUCTS_ADD 0x3 + +CHIAKI_EXPORT ChiakiErrorCode chiaki_takion_v7_av_packet_format_header(uint8_t *buf, size_t buf_size, size_t *header_size_out, ChiakiTakionAVPacket *packet) +{ + size_t header_size = CHIAKI_TAKION_V7_AV_HEADER_SIZE_BASE; + if(packet->is_video) + header_size += CHIAKI_TAKION_V7_AV_HEADER_SIZE_VIDEO_ADD; + if(packet->uses_nalu_info_structs) + header_size += CHIAKI_TAKION_V7_AV_HEADER_SIZE_NALU_INFO_STRUCTS_ADD; + *header_size_out = header_size; + + if(header_size > buf_size) + return CHIAKI_ERR_BUF_TOO_SMALL; + + buf[0] = packet->is_video ? TAKION_PACKET_TYPE_VIDEO : TAKION_PACKET_TYPE_AUDIO; + if(packet->uses_nalu_info_structs) + buf[0] |= 0x10; + + *(uint16_t *)(buf + 1) = htons(packet->packet_index); + *(uint16_t *)(buf + 3) = htons(packet->frame_index); + + *(uint32_t *)(buf + 5) = htonl( + (packet->units_in_frame_fec & 0x3ff) + | (((packet->units_in_frame_total - 1) & 0x7ff) << 0xa) + | ((packet->unit_index & 0xffff) << 0x15)); + + buf[9] = packet->codec & 0xff; + + *(uint32_t *)(buf + 0xa) = 0; // unknown + + *(uint32_t *)(buf + 0xe) = packet->key_pos; + + uint8_t *cur = buf + 0x12; + if(packet->is_video) + { + *(uint16_t *)cur = htons(packet->word_at_0x18); + cur[3] = packet->adaptive_stream_index << 5; + cur += 3; + } + + if(packet->uses_nalu_info_structs) + { + *(uint16_t *)cur = 0; // unknown + cur[3] = 0; // unknown + } + + return CHIAKI_ERR_BUF_TOO_SMALL; +} \ No newline at end of file