- 博客(187)
- 资源 (5)
- 收藏
- 关注
原创 Android MediaCodec(二)SimpleDecoder
从这一章开始,我们会基于同步SimplePlayer改造出一个简单的异步播放器(AsyncSimplePlayer),通过一步步的代码实现,我们能够更清晰地学习NuPlayer的实现方式。我们将从简单的框架实现入手,根据需求逐步分析并完善我们的AsyncSimplePlayer。在本节中,我们会先简要介绍播放器所需的模块及其作用,然后开始实现简单解码器模块。
2025-01-16 22:39:02
557
原创 Android MediaCodec(一)简介
MediaCodec是Android系统为上层应用提供的硬件编解码类,它封装了ACodec和CCodec,隐藏了底层组件的实现细节,向上层应用提供了统一且易用的硬件编解码接口。由于MediaCodec是为上层应用提供的接口,因此我们不会对其内部实现进行深入探讨,本篇文章将先简单介绍MediaCodec的异步消息处理机制、缓冲区管理以及API的使用这三部分内容,然后通过SimplePlayer了解MediaCodec的同步模式用法,为异步模式的播放器实现打下基础。
2025-01-16 22:36:13
921
原创 linux系统编程(七)管道和FIFO
成功的pipe调用会在数组filedes中返回两个打开的文件描述符,读取端为filedes[0],写入端为filedes[1]。我们可以使用read/write系统调用在管道上执行IO。管道上的read调用会读取的数据量为请求的字节数与管道中当前存在的字计数两者之间较小的那个。在单个进程中管道的用途不多,一般来说是使用管道让两个进程进行通信。为了让两个进程通过管道进行连接,调用完pipe调用之后可以调用fork。fork之后一般会让其中一个进程立即关闭管道的写入段文件描述符,另一端关闭读取的文件描述符。
2024-12-29 21:01:02
819
原创 Android Codec2 CCodec (三六)组件控制
这一篇我们对组件的控制过程(flush、resume、stop和release)做简单分析。
2024-12-24 22:01:56
956
原创 linux系统编程(六)
一个进程可以包含多个线程,同一程序中的所有线程会独立执行相同的程序,共享同一份全局内存区域(初始化数据段、未初始化数据段、堆)。线程可以很好地解决上面的问题要注意,虽然线程之间不会共享栈数据,但是线程栈都是驻留在同一虚拟地址空间的,所以可以通过指针共享对方栈中的数据。在多线程程序中,每个线程都有自己的errno。在linux平台上,编译调用了pthread api的程序时需要设置 -pthread。新线程会调用带有参数arg的函数start开始执行。
2024-12-23 23:03:45
808
原创 linux系统编程(五)
信号是事件发生时对进程的通知机制,针对每个信号都定义了一个唯一的整数,这些整数定义在signal.h中。第一个参数表示需要修改的信号,第二个参数handler是修改后的处置函数,返回值是之前的信号处置函数。我们可以使用kill来发送信号如果无进程与指定pid匹配,kill调用失败,errno设置为ESRCH。raise是对自身发送信号,相当于调用kill(getpid(), sig)。多个信号可以使用一个称之为信号集的数据结构来标识,该数据类型为sigset_t。
2024-12-22 14:43:09
884
原创 linux系统编程(四)
调用read和write系统调用操作时不会对磁盘直接发起访问,而是仅仅在用户空间缓冲区与内核缓冲区高速缓存之间复制数据。write调用会立刻返回,后续某个时刻内核才会将缓冲区内的数据刷新至磁盘。如果在此期间有另一个进程试图读取该文件的这几个字节,将从内核缓冲区读取,而不是从文件读取。对于read而言,内核从磁盘读取数据会存到内核缓冲区中,read会从缓冲区读取数据。linux内核对高速缓冲区的大小没有固定上限,且会尽可能多地分配高速缓存页。
2024-12-21 09:57:56
615
原创 linux系统编程(三)
每个进程都有自己的进程id,我们可以通过getpid拿到当前进程的id。每个进程也会有一个创建它的父进程,我们可以通过getppid拿到父进程的进程id。进程号的上限默认是32767,但是可以通过/proc/sys/kernel/pid_max 文件来进行调整。如果子进程的父进程终止,子进程就会变成孤儿,init进程会收养该子进程,子进程后续对getppid()的调用将返回进程号1。
2024-12-18 21:50:19
772
原创 Android Codec2 CCodec (三四)组件处理与数据输出 - Ⅱ
上篇文章CCodecBufferChannel::onWorkDone刚讲一半就扯到extraBuffer了,这一篇我们接着讲完onWorkDone的剩余部分。
2024-12-17 21:17:27
1379
原创 Android Codec2 CCodec (三三)组件处理与数据输出 - Ⅰ
本节主要对数据的输出过程做简单梳理,组件的处理过程可以参考SimpleC2Component和C2SoftHevcDec这两章内容,本节不做展开。
2024-12-12 23:15:57
1592
原创 linux系统编程(二)
fcntl用于控制文件描述符,该系统调用有很多功能,功能用cmd来控制,fcntl后面的参数根据cmd来填充。我们在判断F_GETFL,要用如果只是获取读写权限可以用。
2024-12-09 22:38:03
751
原创 Android Codec2 CCodec (三一)组件的创建与配置
接下来的几篇文章,我们将对组件的创建、配置、启动、数据写入、数据处理、数据渲染、flush、release过程做完整的流程分析。本篇我们将一起阅读组件的创建与配置过程。
2024-12-09 22:07:57
790
原创 Android Codec2 CCodec (三十)C2SoftHevcDec - Ⅱ
在这一篇文章中,我们将以C2SoftHevcDec为例,了解Codec2组件应该如何实现SimpleC2Component提供的接口,看完这一节我们应该对如何实现Codec2组件有清晰的思路。
2024-12-09 22:05:50
787
原创 linux系统编程(一)
linux 常用类型:clock_t 整形/浮点dev_t 运算类型之一,设备号mode_t 整形off_t 有符号整形 long intpid_t 有符号整形ptrdiff_t 有符号整形sigset_t 整形/结构类型size_t 无符号整形 long unsigned intsocklen_t 至少32位整形ssize_t 有符号整形 long inttime_t 整形或浮点数。
2024-12-08 16:42:43
814
原创 常用Vim操作
vimrc配置ctags -R *生成tags文件set numberset ts=4set sw=4set autoindentset cindentset tag=~/tmp/log/help/tags自动补全:ctrl+n:自动补全输入:a:从当前文字后插入i:从当前文字前插入s: 删除当前字符,从当前字符插入回退u:撤销恢复撤销:ctrl+r删除:[n]dd:删除n行[n]dw:从光标开始删除n个词d$: 删除光标之后的内容,但是不删除行号
2024-12-08 15:55:12
567
原创 Android Codec2 CCodec (二九)C2SoftHevcDec - Ⅰ
在上一篇文章中,我们了解了SimpleC2Component提供的接口的含义。这一节,我们将以C2SoftHevcDec为例,探讨Codec2组件的参数应该如何定义。
2024-12-06 21:58:21
443
原创 Android Codec2 CCodec (二八)SimpleC2Component
在 Android Codec2(九)组件实现分析 一文中, 我们了解了Codec2组件的实现框架,接下来这一章我们将深入探讨组件的实现细节。
2024-12-04 22:34:37
1672
原创 Android CCodec Codec2 (二七)PipelineWatcher
本节内容会对input buffer的追踪过程进行解析, 追踪分为上层(CCodecBufferChannel->PipelineWatcher)与组件层(Component->InputBufferManager)两部分。
2024-11-25 21:58:55
1250
原创 Android CCodec Codec2 (二五)OutputBuffers
在这一篇文章中,我们将一起探讨CCodec的输出端口管理类OutputBuffers。与之前学习的InputBuffers截然不同,OutputBuffers并不涉及buffer的分配工作,所以它有一套新的buffer管理方法,另外OutputBuffers还提供了reorder(重排序)功能。
2024-11-21 22:56:45
1283
原创 Android CCodec Codec2 (二四)C2GraphicBlock
在这一篇文章中,我们将了解C2GraphicBlock、C2BufferQueueBlockPoolData与C2GraphicView的实现。
2024-11-21 22:54:11
1276
原创 Android CCodec Codec2 (二三)C2BufferQueueBlockPool - Ⅱ
上一篇文章对一些前置内容进行了介绍,这篇文章我们将继续阅读C2BufferQueueBlockPool的buffer分配相关内容。
2024-11-19 22:51:25
800
原创 Android CCodec Codec2 (二二)C2BufferQueueBlockPool - Ⅰ
我们在前面两篇文章中认识了C2PooledBlockPool以及C2LinearBlock,要注意的是C2PooledBlockPool除了可以被用于生产C2LinearBlock(1D)外,也可以用于生产C2GraphicBlock(2D)。在这一篇文章中,我们将对C2BlockPool的另一个子类C2BufferQueueBlockPool展开了解,它是专门用于生产C2GraphicBlock的。同样都可以生产C2GraphicBlock,它们又有什么区别呢?
2024-11-17 21:23:11
1052
原创 Android CCodec Codec2 (二一)InputBuffers
CCodec使用CCodecBuffers来对输入/输出端口上的buffer进行管理,这一篇文章我们将一起了解InputBuffers,也就是输入端口的buffer管理方法。
2024-11-15 22:10:55
1819
原创 Android CCodec Codec2 (二十)C2Buffer与Codec2Buffer
在阅读Codec2框架代码时,我们可能会发现好几个名称中都带有“buffer”的类,如MediaCodecBuffer、ABuffer、CCodecBuffers、Codec2Buffer以及C2Buffer。它们分别是什么?各自承担着什么功能?它们之间有何联系?本文将围绕这三个问题展开了解。
2024-11-07 22:13:22
1877
原创 Android CCodec Codec2 (十九)C2LinearBlock
在上一篇文章的结尾,我们看到fetchLinearBlock方法最终创建了一个C2LinearBlock对象。这一节,我们将深入了解C2LinearBlock是什么,它的作用是什么,以及它是如何被创建的。
2024-11-04 21:51:49
1022
原创 Android CCodec Codec2 (十八)C2PooledBlockPool
在这篇文章中,我们首先将了解C2BlockPool是什么,随后会探讨C2BlockPool与buffer pool以及C2Allocator之间的关系。最后,我们将深入了解C2BlockPool的一个子类—C2PooledBlockPool的具体实现方式,以及它是如何分配buffers的。
2024-10-27 20:07:21
1678
原创 Android Codec2 CCodec(十七)bufferpool
Codec2框架通过引入bufferpool,实现了全新的buffer分配与传递机制。在本文中,我们将一起了解bufferpool框架的实现。
2024-10-19 23:08:33
1749
原创 Android Codec2 CCodec(十六)C2AllocatorGralloc
这一篇文章我们一起来瞧瞧2D(Graphic) buffer分配器C2AllocatorGralloc是如何工作的。
2024-10-07 22:25:18
1165
原创 Android CCodec Codec2 (十五)C2DmaBufAllocator
Codec2框架采用了全新的Buffer分配机制C2Allocator,这一篇文章我们一起来瞧瞧C2DmaBufAllocator是如何工作的。
2024-09-28 09:23:59
1474
原创 Android CCodec Codec2 (十四)CCodecBufferChannel - Ⅱ
上一篇文章我们一起了解了Codec2 Data Process过程中的Delay,buffer count计算方法和C2AllocatorStore,这一篇文章我们接着分析CCodecBufferChannel的start方法。
2024-09-22 20:02:30
1520
原创 Android CCodec Codec2 (十三)CCodecBufferChannel - Ⅰ
CCodecBufferChannel是整个Codec2框架最复杂的部分,涉及到input buffer分配,input/output buffer的处理,内部封装了一些全新的机制,比如reorder、pipeline control等。本篇内容主要对CCodecBufferChannel的start流程进行了解,涉及到的C2BlockPool、C2Allocator、InputBuffers、OutputBuffers本篇不做展开。
2024-09-13 23:11:04
1495
原创 Android CCodec Codec2 (十二)CCodecConfig
Codec2组件的运行参数都存储在Interface中,这些参数由厂商预先设定,并力求达到最优(best effort),因此非必要情况下不建议进行修改。在CCodec中,我们很少看到对组件参数的修改,这与ACodec对组件配置的过程形成了明显的对比。CCodecConfig在Codec2框架中主要起着参数存储的作用,参数来自于两部分:从组件实例读取的厂商预定义的参数和上层应用配置下来的参数。CCodecConfig还有另外一个重要功能:向上层提供参数反射,实现非标准参数的设定,这部分我们不做了解。
2024-09-11 23:34:54
821
原创 Android CCodec Codec2 (十一)CCodec
CCodec继承于CodecBase,向下封装了Codec2Client,向上提供接口给MediaCodec调用。CCodec包含CCodecBufferChannel和CCodecConfig两大子模块,相较ACodec而言,CCodec的职责划分与消息处理逻辑做了很大改动。本节将简单剖析CCodec中的部分设计思路,为后续的数据处理流程分析做准备。
2024-09-08 22:09:35
1115
原创 Android CCodec Codec2 (十)Codec2Client
Codec2Client隐藏了Codec2 HAL的调用细节,并在HAL接口的基础上重新做了抽象和封装然后提供给sfPlugin使用,在这一篇文章中我们将对Codec2Client的设计结构进行简单分析。
2024-09-08 22:08:07
1367
3
原创 Ubuntu 20.04安装bootchart
到google上搜索说是Ubuntu 18.04之后bootchart被换成了systemd-bootchart,这个可以成功安装,但是无法导出PNG。最后就可以愉快地导出PNG了。
2024-09-06 18:01:58
689
原创 Android CCodec Codec2 (九)组件实现分析
在上一篇文章中,我们详细梳理了HIDL层组件的创建过程。在这一篇文章中,我们将以C2SoftMpeg2Dec为例简单了解SW C2Component的实现架构。
2024-09-05 23:08:25
1204
原创 Android Codec2 CCodec(八)SW组件创建过程分析
在这一篇文章中,我们将先了解SW ComponentStore HIDL层的Codec2组件创建过程,然后了解组件实现架构。
2024-09-02 23:33:14
1089
OpenCV车牌识别新手入门级讲解,含详细注释
2019-04-24
融入局部信息的直觉模糊C均值聚类方法的C++实现
2019-03-11
FCM模糊C均值的C++实现
2019-03-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人