silk mpu

#include "mpu.h"
#include "mbuf.h"
#include "media_buffer.h"
#include "my_errno.h"
#include "mem.h"
#include "silk.h"
#include "interface/SKP_Silk_SDK_API.h"

struct silk_codec {
    void* obj;
    SKP_SILK_SDK_DecControlStruct control;
    uint64_t seq[2], pts;

    audio_format* fmt_out;
    intptr_t mbuf_handle;
    uint32_t bytes;
};

static void* silk_open(fourcc** in, fourcc** out)
{
    SKP_int32 size;
    SKP_int n = SKP_Silk_SDK_Get_Decoder_Size(&size);
    if (n != 0) {
        errno = EFAULT;
        return NULL;
    }

    struct silk_codec* codec = (struct silk_codec *) my_malloc(size + sizeof(struct silk_codec));
    if (codec == NULL) {
        errno = ENOMEM;
        return NULL;
    }
    codec->obj = (void *) (codec + 1);

    n = SKP_Silk_SDK_InitDecoder(codec->obj);
    if (n != 0) {
        my_free(codec);
        errno = EFAULT;
        return NULL;
    }

    codec->seq[0] = codec->seq[1] = codec->pts = 0;
    codec->fmt_out = to_audio_format(out);
    codec->control.API_sampleRate = codec->fmt_out->pcm->samrate;
    fraction frac = pcm_bytes_from_ms(codec->fmt_out->pcm, 1);
    codec->bytes = silk_mpf * frac.num / frac.den;
    codec->mbuf_handle = mbuf_hget(sizeof(media_buffer) + codec->bytes, 8, 1);
    return codec;
}

static struct my_buffer* pcm_buffer_alloc(struct my_buffer* mbuf,
                                          uint32_t ms, media_buffer* stream, struct silk_codec* codec)
{
    if (mbuf == NULL) {
        if (__builtin_expect(codec->mbuf_handle == -1, 0)) {
            uint32_t bytes = sizeof(media_buffer) + codec->bytes;
            codec->mbuf_handle = mbuf_hget(bytes, 8, 1);
            if (codec->mbuf_handle == -1) {
                mbuf = mbuf_alloc_2(bytes);
            }
        } else {
            mbuf = mbuf_alloc_1(codec->mbuf_handle);
        }

        if (mbuf == NULL) {
            return NULL;
        }
        mbuf->length = codec->bytes;
        mbuf->ptr[1] = mbuf->ptr[0] + sizeof(media_buffer);
    }

    media_buffer* media = (media_buffer *) mbuf->ptr[0];
    memset(media->vp, 0, sizeof(media->vp));
    media->frametype = 0;
    media->angle = 0;
    media->fragment[0] = 0;
    media->fragment[1] = 1;
    media->pptr_cc = &codec->fmt_out->cc;
    media->pts = stream->pts + ms;
    media->iden = stream->iden;
    media->seq = codec->seq[0]++;
    media->vp[0].ptr = mbuf->ptr[1];
    media->vp[0].stride = (uint32_t) mbuf->length;
    media->vp[0].height = 1;
    return mbuf;
}

static uint32_t silk_muted(struct my_buffer* mbuf, uint32_t bytes)
{
    uintptr_t nb = mbuf->length;
    mbuf->length = bytes;
    uint32_t muted = silk_frame_muted(mbuf);
    mbuf->length = nb;
    return muted;
}

static int32_t conceal_lost(media_buffer* stream, struct silk_codec* codec, struct list_head* head)
{
    int32_t nr = (int32_t) (stream->seq - codec->seq[1]);
    if (codec->seq[1] == 0 || __builtin_expect(nr <= 0 || nr > 24, 1)) {
        return 0;
    }

    SKP_int16 nr_samples;
    uint64_t pts = stream->pts;
    stream->pts = codec->pts;
    uint32_t ms = 0, bytes = 0;

    for (int32_t i = 0; i < nr; ++i) {
        struct my_buffer* buffer = pcm_buffer_alloc(NULL, ms, stream, codec);
        if (buffer == NULL) {
            break;
        }

        SKP_Silk_SDK_Decode(codec->obj, &codec->control, 1,
                            NULL, 0, (SKP_int16 *) buffer->ptr[1], &nr_samples);
        my_assert(nr_samples * 2 == buffer->length);
        bytes += buffer->length;
        list_add_tail(&buffer->head, head);
        ms += silk_mpf;
    }

    stream->pts = pts;
    return bytes;
}

static int32_t silk_write(void* handle, struct my_buffer* mbuf, struct list_head* head, int32_t* delay)
{
    (void) delay;
    if (__builtin_expect(mbuf == NULL, 0)) {
        return 0;
    }

    struct silk_codec* codec = (struct silk_codec *) handle;
    media_buffer* stream = (media_buffer *) mbuf->ptr[0];
    uint32_t ms = 0;
    SKP_int16 nr_samples;
    int32_t bytes = conceal_lost(stream, codec, head);

    while (mbuf->length > 0) {
        struct my_buffer* buffer = NULL;
        uint32_t muted = silk_muted(mbuf, silk_frame_leading);

        uint16_t len = silk_read_frame_bytes(mbuf->ptr[1]);
        mbuf->ptr[1] += silk_frame_leading;
        if (muted) {
            buffer = codec->fmt_out->ops->muted_frame_get(codec->fmt_out, silk_mpf);
            if (__builtin_expect(buffer != NULL, 1)) {
                my_assert(buffer->length == codec->bytes);
                bytes += buffer->length;

                buffer = pcm_buffer_alloc(buffer, ms, stream, codec);
                list_add_tail(&buffer->head, head);
            }
        } else {
            buffer = pcm_buffer_alloc(buffer, ms, stream, codec);
            if (__builtin_expect(buffer != NULL, 1)) {
                SKP_Silk_SDK_Decode(codec->obj, &codec->control, 0,
                                    (const SKP_uint8 *) mbuf->ptr[1], (const SKP_int) len,
                                    (SKP_int16 *) buffer->ptr[1], &nr_samples);
                bytes += nr_samples * 2;
                list_add_tail(&buffer->head, head);
            }
        }

        mbuf->ptr[1] += len;
        mbuf->length -= (len + silk_frame_leading);
        ms += silk_mpf;
    }

    codec->seq[1] = stream->seq + 1;
    codec->pts = stream->pts + ms;
    my_assert(mbuf->length == 0);
    mbuf->mop->free(mbuf);
    return bytes;
}

static void silk_close(void* handle)
{
    struct silk_codec* codec = (struct silk_codec *) handle;
    if (codec->mbuf_handle != -1) {
        mbuf_reap(codec->mbuf_handle);
    }
    my_free(codec);
}

static mpu_operation silk_ops = {
    silk_open,
    silk_write,
    silk_close
};

media_process_unit silk_dec_16k16b1 = {
    &silk_16k16b1.cc,
    &pcm_16k16b1.cc,
    &silk_ops,
    1,
    mpu_decoder,
    "silk_dec_16k16b1"
};

media_process_unit silk_dec_8k16b1 = {
    &silk_8k16b1.cc,
    &pcm_8k16b1.cc,
    &silk_ops,
    1,
    mpu_decoder,
    "silk_dec_8k16b1"
};
时间: 2025-01-12 00:48:58

silk mpu的相关文章

mpu

#include "mpu.h" #include "mem.h" #include "my_errno.h" #include "resampler.h" #include "media_buffer.h" #define same_ptr (void *) (1) static mpu_item* same_link(fourcc** ccptr); extern media_process_unit

Silk解码 开发日志

本人用的是SILK_SDK_SRC_v1.0.9进行开发.开发过程是曲折的,结果自然也是丰盛的. SDK是从github下载的,由于这个已被整合到一个Android项目,但是文件目录结构尚完整. 所以本人就尝试直接编译整个项目,结果无法编译过去,个人认为是NDK版本不对.后来又看到有 Makefile文件,尝试用make来编译,发现不大理想,首先要生成一堆make用到的文件,这方面不 大熟悉.后来看见有一个Silk_SDK.sln文件,干脆就从这个文件入手,用vs2013打开这文件,先编 译Si

omap_hwmod: rtc: doesn‘t have mpu register target

[    0.069442] WARNING: CPU: 0 PID: 1 at arch/arm/mach-omap2/omap_hwmod.c:2574 _init+0x4c8/0x520()[    0.069455] omap_hwmod: rtc: doesn't have mpu register target base[    0.069463] Modules linked in:[    0.069485] CPU: 0 PID: 1 Comm: swapper Not tai

MCU 与 MPU的区别

1. 概念 MCU  微控制器 MPU  微处理器 2. 区别 1)MPU通常代表一个CPU,而MCU则强调把CPU.存储器和外围电路集成在一个芯片中 2)早期,MCU被称为单片机,指把计算机集成一个芯片内 3)MCU也常被称为片上系统(SoC),含义是在一个芯片上设计了整个系统 3. 当前主流的嵌入式CPU 1)ARM,功耗低 2)MIPS,CISCO公司大多用于做高端路由器 3)PowerPC,主要应用于工控领域

小程序语音红包中遇到的 语音识别silk转wav格式 如何在线转 或者mp3转wav格式

公司在开发一个小程序语音红包,现在遇到的问题就是通过微信的小程序文档接口拿到的录音文件要么是silk格式的,要么是mp3格式的 但是呢,如果要调用百度的语音接口,又必须是wav格式的.也就是说通过微信小程序接口拿到的两种格式,都无法直接调用百度的语音识别接口. 必需想办法来转换成wav格式的.百度上搜了各种解决方案,有些是需要安装软件的,但是无法实现自动转,比如我给一个这个silk的url地址,能否直接返回wav格式的给我. 正在摸索中...还没解决...看看大家有没有什么好的方法? 我,秋峰,

微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用

说说最近在开发微信小程序语音识别遇到的问题吧 最先使用微信小程序录音控件可以拿到silk格式,后来微信官方又支持mp3格式了 但是我们拿到这些格式以后,都还不能直接使用,做语音识别,因为目前百度的语音识别格式不支持mp3格式的 百度php语音识别接口 http://yuyin.baidu.com/docs/asr/188 但是有支持wav格式的,于是又要想办法怎么把mp3格式转为wav格式 在百度搜了一大圈 最后知道说要使用一个ffmpeg组件 于是继续搜资料 看看Linux服务器如何安装ffm

MPU/SoC/Application Processor

移动端点击事件全攻略,有你知道与不知道的各种坑

看标题的时候你可能会想,点击事件有什么好说的,还写一篇攻略?哈哈,如果你这么想,只能说明你too young to simple. 接触过移动端开发的同学可能都会面临点击事件的第一个问题:click事件的300ms延迟响应.不能立即响应给体验造成了很大的困扰,因此解决这个问题就成为了必然. 这个问题的解决方案就是: zepto.js的tap事件.tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery.

采用DDS(数字频率合成法)设计信号发生器

§2.1设计指导思想 用大规模CPLD设计多功能信号发生器,要求能够输出方波.锯齿波.三角波.正弦波. 具体是用VHDL硬件描述语言编写多功能信号发生器程序,经过编译.仿真,再下载到CPLD器件上,再经数模转换器输出各类波形. 1.CPLD(COMPLEX Programmable Logic Device,复杂可编程逻辑器件)属于最具有代表性的IC芯片之一.CPLD基本上是由多个SPLD(SIMPLE PLD)在单片上的集成,集成度高,可以实现比较复杂的电路或系统.CPLD的优点是其结构的规则