首页 > 其他分享 >Android CCodec Codec2 (十五)C2DmaBufAllocator

Android CCodec Codec2 (十五)C2DmaBufAllocator

时间:2024-09-28 09:51:26浏览次数:11  
标签:dma CCodec C2DmaBufAllocator data fd heap Android include buf

Codec2框架采用了全新的Buffer分配机制C2Allocator,这一篇文章我们一起来瞧瞧C2DmaBufAllocator是如何工作的。

1、C2Allocator

C2Allocator声明在C2Buffer.h中,它定义了如下接口:

  • getName:返回Allocator独一无二的名称;
  • getId:返回Allocator独一无二的id;
  • getTraits:返回Allocator的特征;
  • newLinearAllocation:使用给定的capacity和usage分配一个1D的Allocation;
  • priorLinearAllocation:使用一个native handle创建一个1D的Allocation;
  • newGraphicAllocation:使用给定的width,height,format和usage分配一个2D的Allocation;
  • priorGraphicAllocation:使用一个native handle创建一个2D的Allocation;

在这里插入图片描述

可以发现几个创建Allocation的方法并不是纯虚函数,这是为什么呢?在头文件中有一串注释,翻译过来是这样:理论上Allocator可以同时支持1D和2D Allocation的分配,但是实际上,一个Allocator只会支持1D和2D中的一个。也就是说,C2Allocator接口的实现者会专注1D或2D的其中一个,不被支持的方法可以不用实现。

2、DMA

DMA(Direct Memory Access,直接内存访问)可以简单理解为是一种共享内存机制,具体的概念和工作原理有兴趣的同学可自行搜索,这一节我们简单看下如何分配出DmaBuf。

以下这段代码是笔者从C2DmaBufAllocator.cpp和BufferAllocator.cpp摘录拼凑出来的,编译之后可以成功运行:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/dma-heap.h>
#include <string.h>

int main() {
    // 1
    int dma_heap_fd = open("/dev/dma_heap/system", O_RDONLY | O_CLOEXEC);
    if (dma_heap_fd < 0) {
        perror("open");
        exit(1);
    }
    // 2
    struct dma_heap_allocation_data heap_data = {
        .len = 4096,                        // 设置所需的缓冲区长度
        .fd_flags = O_RDWR | O_CLOEXEC,     // 设置缓冲区的文件描述符标志
    };

    if (ioctl(dma_heap_fd, DMA_HEAP_IOCTL_ALLOC, &heap_data) < 0) {
        perror("ioctl");
        close(dma_heap_fd);
        exit(1);
    }

    int dma_buf_fd = heap_data.fd;
    // 3
    void *dma_buf = mmap(NULL, heap_data.len, PROT_READ | PROT_WRITE, MAP_SHARED, dma_buf_fd, 0);
    if (dma_buf == MAP_FAILED) {
        perror("mmap");
        close(dma_buf_fd);
        close(dma_heap_fd);
        exit(1);
    }
    // 4
    memset(dma_buf, 0xAA, heap_data.len);

    for (int i = 0; i < heap_data.len; i++) {
        printf("0x%02x ", ((unsigned char *)dma_buf)[i]);
    }
    // 5
    munmap(dma_buf, heap_data.len);
    close(dma_buf_fd);
    close(dma_heap_fd);
}

分配使用DmaBuf有如下步骤:

  1. 打开DMA Heap设备/dev/dma_heap/system;
  2. 使用ioctl分配DMA缓冲区,返回的fd存在dma_heap_allocation_data中;
  3. 得到DMA缓冲区的文件描述符后,可以使用mmap将其映射到用户空间;
  4. 可以直接通过映射出来的dma_buf指针来访问DMA缓冲区;
  5. 使用完缓冲区之后要清理资源。

3、C2DmaBufAllocator

先来看C2DmaBufAllocator的创建过程:

4、C2LinearAllocation

5、C2DmaBufAllocation

关注公众号《青山渺渺》订阅合集阅读完整内容

请添加图片描述

标签:dma,CCodec,C2DmaBufAllocator,data,fd,heap,Android,include,buf
From: https://blog.csdn.net/qq_41828351/article/details/142610676

相关文章

  • Android 热点分享二维码功能简单介绍
    Android热点分享二维码文章目录Android热点分享二维码一、前言二、热点二维码1、热点分享的字符串2、代码中热点字符串拼接和设置示例3、一个图片示例三、其他1、Android热点分享二维码小结2、Android11设置默认热点名称和热点密码、密码长度一、前言比较新......
  • MapBox Android版开发 6 关于Logo
    MapBoxAndroid版开发6关于LogoLogo的显示查看源码及思路(Logo)第一步第二步隐藏Logo示例查看源码及思路(Info)第一步第二步隐藏Logo和Info示例看到有网友留言问如何移除Logo,今天看了下V9源码,发现MapBox提供了禁用Logo的功能。先简单说下思路部分源码,最后是示例。L......
  • Android拨号流程
    Android拨号流程是一个涉及多个组件和层级的复杂过程,从用户点击拨号按钮开始,直到电话被拨出并显示在通话界面上。以下是Android拨号流程的主要步骤:1.用户交互阶段用户通过Dialer应用(如Phone应用)的拨号界面输入电话号码,并点击拨号按钮。这一操作会触发DialpadFragment中的onClick事......
  • Android APK打渠道包实施方案
    最近刚好在做Android打渠道包相关的需求,记录下心得笔记,希望给有需要的朋友一个参考。首先,我们来理解下概念:1、母包(就是原始的安卓包)2、渠道标识(自定义的各个渠道标识,例如:baidu,xiaomi,uc等等)3、渠道包(在母包中打入了渠道标识之后,生成的新安卓包)其实就这3个东西,那么我们有了母包......
  • Android 监听蓝牙耳机状态
    在Android中监听蓝牙耳机的状态,尤其是连接状态、播放控制按钮(如播放/暂停、上一曲、下一曲)等交互,通常涉及到几个关键步骤和组件。下面是一个概括指南,帮助你实现这个功能:1.获取蓝牙适配器并检查权限首先,确保应用具有访问蓝牙的权限。在AndroidManifest.xml中添加以下权限:<uses-per......
  • Android热更新实践:Tinker接入指南
    Android热更新实践:Tinker接入指南在Android开发中,热更新是一种非常有用的技术,它允许开发者在不发布新版本的情况下修复bug或更新应用内容。Tinker是腾讯开源的Android热更新框架,它提供了一套完整的热更新解决方案。本文将详细介绍如何将Tinker集成到你的Android项目中。1.准备工作......
  • Android平台RTMP推送模块的设计意义
    为什么要做RTMP推送RTMP是一种广泛使用的流媒体传输协议,它允许视频和音频数据在互联网上实时、高效地传输。实现RTMP推送功能,主要是为了满足以下需求:实时性要求:RTMP协议具有低延迟的特点,适合用于需要实时交互的场景,如直播、视频会议等。通过RTMP推送,观众可以几乎实时地观看到主播的......
  • uniapp - 详解安卓App打包后使用uni.chooseLocation地址列表一直加载转圈问题,Android
    前言网上的教程都无法解决问题,本文提供强力解决方案。在uni-app安卓App平台端开发中,详解uniApp打包成Android安卓后用chooseLocation打开地图选择位置空白卡住不动问题,选择地址列表什么也没有且一直处于加载状态(永远不会加载出来卡住了),另外点击搜索框后也无法搜索地点......
  • Android 10.0 Launcher3禁止改变density等系统密度导致布局变化hotseat靠右边显示功能
    1.前言在10.0的系统rom定制化开发中,在进行launcher3的定制化功能中,在有些项目修改系统密度density的值,以后导致launcher3的布局变乱,hotseat布局成一行竖屏显示看的很不美观,接下来就看如何分析解析禁止density改变导致布局变动的功能分析2.Launcher3禁止改变density等系统密......
  • Android应用程序启动与资源加载
    Android系统中的应用程序启动与资源加载详解在Android系统中,AMS(ActivityManagerService)扮演着核心角色,负责管理应用程序的生命周期和进程调度,包括启动应用进程等关键操作。下面将详细解析AMS启动应用进程时涉及的第一个线程、代码和资源的加载过程,以及R.id.xx的加载机制......