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 speex_dec_8k16b1_mode8;
extern media_process_unit silk_dec_8k16b1;
extern media_process_unit silk_dec_16k16b1;
extern media_process_unit silk_enc_16k16b1;
extern media_process_unit silk_enc_8k16b1;

extern media_process_unit aac_dec_8k16b1;
extern media_process_unit aac_dec_8k16b2;
extern media_process_unit aac_dec_16k16b1;
extern media_process_unit aac_dec_16k16b2;
extern media_process_unit aac_dec_22k16b1;
extern media_process_unit aac_dec_22k16b2;
extern media_process_unit aac_dec_24k16b1;
extern media_process_unit aac_dec_24k16b2;
extern media_process_unit aac_dec_32k16b1;
extern media_process_unit aac_dec_32k16b2;
extern media_process_unit aac_dec_44k16b1;
extern media_process_unit aac_dec_44k16b2;
extern media_process_unit aac_dec_48k16b1;
extern media_process_unit aac_dec_48k16b2;

extern media_process_unit aac_enc_8k16b1;
extern media_process_unit aac_enc_8k16b2;
extern media_process_unit aac_enc_16k16b1;
extern media_process_unit aac_enc_16k16b2;

extern media_process_unit aacplus_dec_8k16b1;
extern media_process_unit aacplus_dec_8k16b2;
extern media_process_unit aacplus_dec_11k16b1;
extern media_process_unit aacplus_dec_11k16b2;
extern media_process_unit aacplus_dec_16k16b1;
extern media_process_unit aacplus_dec_16k16b2;
extern media_process_unit aacplus_dec_22k16b1;
extern media_process_unit aacplus_dec_22k16b2;
extern media_process_unit aacplus_dec_24k16b1;
extern media_process_unit aacplus_dec_24k16b2;

extern media_process_unit opus_dec_8k16b1;
extern media_process_unit opus_dec_16k16b1;
extern media_process_unit opus_dec_24k16b1;
extern media_process_unit opus_dec_24k16b2;
extern media_process_unit opus_dec_32k16b1;
extern media_process_unit opus_dec_32k16b2;
extern media_process_unit opus_dec_48k16b1;
extern media_process_unit opus_dec_48k16b2;

extern media_process_unit x264_h264_enc;
extern media_process_unit ffmpeg_h264_dec;

#if defined(__ANDROID__)
void probe_omx_h264_dec();
extern media_process_unit omx_h264_dec;

void probe_java_h264_enc();
extern media_process_unit java_h264_enc;

#elif defined(__APPLE__)
void probe_apple_h264_dec();
extern media_process_unit apple_h264_dec;

void probe_apple_h264_enc();
media_process_unit apple_h264_enc;
#endif

static media_process_unit* mpu_table[] = {
    &ffmpeg_h264_dec,
#if defined(__ANDROID__)
    &omx_h264_dec,
    &java_h264_enc,
#elif defined(__APPLE__)
    &apple_h264_dec,
    &apple_h264_enc,
#endif
    &x264_h264_enc,

    &silk_dec_16k16b1,
    &silk_dec_8k16b1,
    &silk_enc_16k16b1,
    &silk_enc_8k16b1,

    &aac_dec_8k16b1,
    &aac_dec_8k16b2,
    &aac_dec_16k16b1,
    &aac_dec_16k16b2,
    &aac_dec_22k16b1,
    &aac_dec_22k16b2,
    &aac_dec_24k16b1,
    &aac_dec_24k16b2,
    &aac_dec_32k16b1,
    &aac_dec_32k16b2,
    &aac_dec_44k16b1,
    &aac_dec_44k16b2,
    &aac_dec_48k16b1,
    &aac_dec_48k16b2,

    &aac_enc_8k16b1,
    &aac_enc_8k16b2,
    &aac_enc_16k16b1,
    &aac_enc_16k16b2,

    &aacplus_dec_8k16b1,
    &aacplus_dec_8k16b2,
    &aacplus_dec_11k16b1,
    &aacplus_dec_11k16b2,
    &aacplus_dec_16k16b1,
    &aacplus_dec_16k16b2,
    &aacplus_dec_22k16b1,
    &aacplus_dec_22k16b2,
    &aacplus_dec_24k16b1,
    &aacplus_dec_24k16b2,

    &opus_dec_8k16b1,
    &opus_dec_16k16b1,
    &opus_dec_24k16b1,
    &opus_dec_24k16b2,
    &opus_dec_32k16b1,
    &opus_dec_32k16b2,
    &opus_dec_48k16b1,
    &opus_dec_48k16b2,

    &speex_dec_8k16b1_mode8,
    all_resampler
};

struct dijstra_node {
    struct list_head entry;
    media_process_unit* unit;
    struct dijstra_node* prev;
    fourcc** fmt;
    uint32_t point;
};

static struct dijstra_node* shortest(struct dijstra_node* from, struct list_head* head, fourcc** left)
{
    struct dijstra_node* selected = NULL;
    for (struct list_head* ent = head->next; ent != head; ent = ent->next) {
        struct dijstra_node* item = list_entry(ent, struct dijstra_node, entry);

        if (media_same(left, item->unit->infmt)) {
            if (from == NULL) {
                item->point = item->unit->point;
                item->fmt = dynamic_output(left, item->unit->outfmt);
            } else {
                uint32_t point = from->point + item->unit->point;
                if (point < item->point) {
                    item->fmt = dynamic_output(left, item->unit->outfmt);
                    item->point = point;
                    item->prev = from;
                }
            }
        }

        if (selected == NULL || selected->point > item->point) {
            selected = item;
        }
    }

    if (selected != NULL) {
        list_del(&selected->entry);
    }
    return selected;
}

static void* same_open(fourcc** in, fourcc** out)
{
    my_assert(in == out);
    return same_ptr;
}

static int32_t same_write(void* any, struct my_buffer* mbuf, struct list_head* headp, int32_t* delay)
{
    (void) delay;
    my_assert(any == same_ptr);
    if (__builtin_expect(mbuf == NULL, 0)) {
        return 0;
    }
    list_add_tail(&mbuf->head, headp);

    int32_t n = 1;
    media_buffer* media = (media_buffer *) mbuf->ptr[0];
    if (audio_type == media_type(*media->pptr_cc)) {
        n = (int32_t) media->vp[0].stride;
    }
    return n;
}

static void same_close(void* any)
{
    my_assert(any == same_ptr);
}

static void same_unit_init(media_process_unit* unit, fourcc** ccptr)
{
    static mpu_operation same_ops = {
        same_open,
        same_write,
        same_close
    };
    unit->infmt = unit->outfmt = ccptr;
    unit->ops = &same_ops;
    unit->name = "same";
}

static mpu_item* collect_node(struct dijstra_node* last, intptr_t need_same)
{
    LIST_HEAD(head);

    int nr = 0;
    struct dijstra_node* cur = last;
    while (cur != NULL) {
        ++nr;
        cur = cur->prev;
    }

    if (need_same != 0) {
        need_same = sizeof(mpu_item) + sizeof(media_process_unit);
    }

    mpu_item* link = (mpu_item *) my_malloc(sizeof(mpu_item) * nr + need_same);
    if (link == NULL) {
        errno = ENOMEM;
        return NULL;
    }

    if (need_same != 0) {
        media_process_unit* unit = (media_process_unit *) (link + nr + 1);
        same_unit_init(unit, last->unit->outfmt);
        link[nr].unit = unit;
        link[nr].handle = NULL;
        list_add(&link[nr].entry, &head);
    }

    for (int i = nr - 1; i >= 0; --i) {
        list_add(&link[i].entry, &head);
        link[i].unit = last->unit;
        link[i].handle = NULL;
        link[i].infmt = link[i].unit->infmt;
        link[i].outfmt = link[i].unit->outfmt;
        last = last->prev;
    }

    list_del(&head);
    return link;
}

mpu_item* alloc_mpu_link(fourcc** in, fourcc** out, intptr_t need_same)
{
    if (media_same(in, out)) {
        my_assert(need_same != 0);
        return same_link(in);
    }

    uint32_t exclude = 0;
    if (media_type_raw(in)) {
        exclude |= mpu_decoder;
    }

    if (media_type_raw(out)) {
        exclude |= mpu_encoder;
    }

    LIST_HEAD(head);
    fourcc** cur = in;

    struct dijstra_node nodes[elements(mpu_table)];
    for (int i = 0; i < elements(nodes); ++i) {
        INIT_LIST_HEAD(&nodes[i].entry);
        nodes[i].unit = mpu_table[i];
        if ((nodes[i].unit->role & exclude) ||
            (nodes[i].unit->infmt[0]->type != in[0]->type))
        {
            continue;
        }

#if defined(__ANDROID__)
        if (nodes[i].unit == &omx_h264_dec) {
            probe_omx_h264_dec();
        } else if (nodes[i].unit == &java_h264_enc) {
            probe_java_h264_enc();
        }
#elif defined(__APPLE__)
        if (nodes[i].unit == &apple_h264_dec) {
            probe_apple_h264_dec();
        } else if (nodes[i].unit == &apple_h264_enc) {
            probe_apple_h264_enc();
        }
#endif
        if (nodes[i].unit->ops == NULL) {
            continue;
        }
        nodes[i].prev = NULL;
        nodes[i].fmt = nodes[i].unit->outfmt;
        nodes[i].point = ((uint32_t) -1);
        list_add_tail(&nodes[i].entry, &head);
    }
    struct dijstra_node* pitem = NULL;

    do {
        pitem = shortest(pitem, &head, cur);
        if (pitem == NULL) {
            break;
        }

        if (media_same(pitem->fmt, out)) {
            return collect_node(pitem, need_same);
        }
        cur = pitem->fmt;
    } while (!list_empty(&head) && pitem->point != (uint32_t) (-1));

    errno = ESRCH;
    return NULL;
}

void free_mpu_link(mpu_item* link)
{
    my_free(link);
}

static mpu_item* same_link(fourcc** ccptr)
{
    mpu_item* link = (mpu_item *) my_malloc(sizeof(mpu_item) + sizeof(media_process_unit));
    if (link == NULL) {
        errno = ENOMEM;
        return NULL;
    }

    media_process_unit* unit = (media_process_unit *) (link + 1);
    same_unit_init(unit, ccptr);
    link->unit = unit;
    link->handle = NULL;
    INIT_LIST_HEAD(&link->entry);
    return link;
}
时间: 2024-08-18 12:02:57

mpu的相关文章

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* o

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,主要应用于工控领域

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的优点是其结构的规则

ASIC,DSP,MCU,ARM,FPGA 等网上牛人的一些理解

MPU是微机中的中央处理器(CPU)称为微处理器(MPU) MCU又称单片微型计算机(Single Chip Microcomputer)或者单片机,是指随着大规模集成电路的出现及其发展,将计算机的CPU.RAM.ROM.定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制. DSP是一种独特的CPU,是以数字信号来处理大量信息的器件.其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器(MPU),它的强大数据处理能力和高运行速度,是最值得

嵌入式系统编程和调试技巧

嵌入式系统的开发,软件的运行稳定可靠是非常重要的.在芯片中,软件是没有质量的,但软件的质量可以决定一颗芯片的成败.芯片设计中,性能能否满足设计要求,除了硬件设计.软硬件配合的设计技巧,对于软件来说,编程的一些技术和技巧同样重要. 本文讲述我在芯片固件开发过程中使用的一些编程调试技巧.针对在嵌入式系统开发中常见的问题,如实时系统下的同步问题,动态内存分配的内存泄漏问题,如何在编程阶段预防BUG出现,调试阶段如何及时发现问题和定位问题.总结下经验,目的是开发一个稳定运行的固件,提高开发效率,提高运行

网络设备-华为-交换机堆叠终结配置篇

先说下需求,其实在目前接触的企业组网已经中大型IDC运营商的case中,不少客户对冗余方案的初期定位和需求都是相当高要求的.中间的竞争对手不少有过时的(mstp+vrrp)技术方案.最先进的虚拟化方案等等.. 所以这里我也简单聊聊我在过去遇到的常见案例中的比较典型的几例: 这样吧,我直接晒点逻辑拓扑结构: PS:结构图部分和谐过,只截取其中一部分. 下图为某家国有企业的投标方案,(已中标),网络架构由我组织全程实施,现在想想多少有点激动. 设备参数我只能透露一些: 防火墙checkpoint 交