45 lines
2.7 KiB
JavaScript
45 lines
2.7 KiB
JavaScript
// Exercise the actual downlink decoder loop with a decoder that consumes one
|
|||
|
|
// encoded frame per invocation, including coalesced frames and invalid progress.
|
||
|
|
const fs=require('node:fs'), path=require('node:path');
|
||
|
|
const src=fs.readFileSync(path.join(__dirname,'../components/volc_conv_ai/src/transports/high_quality/src/volc_rtc.c'),'utf8');
|
||
|
|
const fn=src.slice(src.indexOf('static int __rtc_decode_opus('),src.indexOf('\nstatic int __rtc_rx_decoder_reset('));
|
||
|
|
if(!fn.startsWith('static int __rtc_decode_opus(')||!fn.trimEnd().endsWith('}'))throw new Error('decoder function extraction failed');
|
||
|
|
process.stdout.write(`
|
||
|
|
#include <assert.h>
|
||
|
|
#include <stdint.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
#include <stdio.h>
|
||
|
|
#include <string.h>
|
||
|
|
#define ESP_AUDIO_ERR_OK 0
|
||
|
|
#define VOLC_AUDIO_DATA_TYPE_PCM 2
|
||
|
|
#define LOGE(...) ((void)0)
|
||
|
|
typedef struct {void *opus_decoder;uint8_t decoded_pcm[3840];unsigned rx_errors;} rtc_impl_t;
|
||
|
|
typedef struct {struct {struct {int data_type;} audio;} info;} volc_data_info_t;
|
||
|
|
typedef struct {uint8_t *buffer;uint32_t len,consumed;} esp_audio_dec_in_raw_t;
|
||
|
|
typedef struct {uint8_t *buffer;uint32_t len,decoded_size;} esp_audio_dec_out_frame_t;
|
||
|
|
typedef struct {int unused;} esp_audio_dec_info_t;
|
||
|
|
static int mode,calls,sends;static uint8_t output[16384];static unsigned output_size;
|
||
|
|
static int __rtc_rx_current(rtc_impl_t *rtc,unsigned generation){(void)rtc;return generation==1;}
|
||
|
|
static int esp_opus_dec_decode(void *decoder,esp_audio_dec_in_raw_t *in,esp_audio_dec_out_frame_t *out,esp_audio_dec_info_t *info){
|
||
|
|
calls++;
|
||
|
|
if(mode==1)return -1;
|
||
|
|
if(mode==2){in->consumed=0;return 0;}
|
||
|
|
if(mode==3){in->consumed=in->len+1;return 0;}
|
||
|
|
if(mode==4){in->consumed=1;out->decoded_size=out->len+1;return 0;}
|
||
|
|
in->consumed=1;out->decoded_size=640;memset(out->buffer,in->buffer[0],640);return 0;
|
||
|
|
}
|
||
|
|
static void __send_data_2_user(rtc_impl_t *rtc,void *data,unsigned size,volc_data_info_t *info){
|
||
|
|
assert(info->info.audio.data_type==VOLC_AUDIO_DATA_TYPE_PCM);assert(output_size+size<=sizeof(output));memcpy(output+output_size,data,size);output_size+=size;sends++;
|
||
|
|
}
|
||
|
|
${fn}
|
||
|
|
int main(void){
|
||
|
|
for(unsigned n=1;n<=12;n++){rtc_impl_t rtc={0};volc_data_info_t info={0};uint8_t packet[12];for(unsigned i=0;i<n;i++)packet[i]=i;
|
||
|
|
mode=calls=sends=output_size=0;assert(__rtc_decode_opus(&rtc,packet,n,&info,1)==640*(int)n);assert(calls==(int)n && sends==(int)n && rtc.rx_errors==0);
|
||
|
|
for(unsigned i=0;i<n;i++)for(unsigned j=0;j<640;j++)assert(output[i*640+j]==i);
|
||
|
|
}
|
||
|
|
for(mode=1;mode<=4;mode++){rtc_impl_t rtc={0};volc_data_info_t info={0};uint8_t packet[3]={1,2,3};calls=sends=output_size=0;
|
||
|
|
assert(__rtc_decode_opus(&rtc,packet,3,&info,1)==0);assert(calls==1 && sends==0 && rtc.rx_errors==1);}
|
||
|
|
puts("RTC downlink decoder frame consumption and bounds: PASS");
|
||
|
|
}
|
||
|
|
`);
|