wechatDataBackup/pkg/silk/csilk/Decoder_Api.c
2024-08-26 22:56:29 +08:00

81 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SKP_Silk_SDK_API.h"
#define MAX_INPUT_FRAMES 5
typedef struct silk_handle{
SKP_SILK_SDK_DecControlStruct dec_ctrl;
SKP_uint8 *dec_state;
} * silk_handle_t;
struct silk_handle *silk_decoder_init(void)
{
silk_handle_t handle = calloc(1, sizeof(struct silk_handle));
if (NULL == handle)
return NULL;
handle->dec_ctrl.API_sampleRate = 24000;
handle->dec_ctrl.framesPerPacket = 1;
SKP_int32 dec_size;
SKP_Silk_SDK_Get_Decoder_Size(&dec_size);
handle->dec_state = calloc(1, dec_size);
if (NULL == handle->dec_state) {
free(handle);
return NULL;
}
SKP_Silk_SDK_InitDecoder(handle->dec_state);
return handle;
}
void silk_decoder_deinit(struct silk_handle *h) {
silk_handle_t handle = (silk_handle_t)h;
if (handle) {
if (handle->dec_state) {
free(handle->dec_state);
handle->dec_state = NULL;
}
free(handle);
}
}
int silk_decoder_process(struct silk_handle *h, unsigned char *frame, int frame_size, unsigned char *output_payload, int output_len)
{
silk_handle_t handle = (silk_handle_t)h;
SKP_int16 *out_ptr = (SKP_int16 *)output_payload;
SKP_int16 len = 0, total_len = 0;
SKP_int32 frame_count = 0;
do {
SKP_Silk_SDK_Decode(handle->dec_state, &handle->dec_ctrl, 0, frame, frame_size, out_ptr, &len);
frame_count++;
out_ptr += len;
total_len += len;
if (frame_count > MAX_INPUT_FRAMES) {
printf("frame_count > MAX_INPUT_FRAMES frame_count %d, total_len %d\n", frame_count, total_len);
out_ptr = (SKP_int16 *)output_payload;
total_len = 0;
frame_count = 0;
}
} while (handle->dec_ctrl.moreInternalDecoderFrames);
return total_len * 2;
}
int silk_decoder_set_sample_rate(struct silk_handle *h, int rate)
{
silk_handle_t handle = (silk_handle_t)h;
if (handle) {
handle->dec_ctrl.API_sampleRate = rate;
}
return 0;
}