Files

45 lines
2.7 KiB
JavaScript
Raw Permalink Normal View History

// 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");
}
`);