- 博客(41)
- 收藏
- 关注
原创 帧间预测——减少时间冗余
主要总结以下5点:宏块的划分。为了能够更准确的找到预测块,我们可以将 16 x 16 的宏块继续划分成更小的子块来做运动搜索。因为图像有的地方静止的背景画面或者平坦的区域可以直接选用最大的块来搜索预测块;而有的地方细节很多,图像中的物体运动方向也各不相同,可能就需要划分成更小的块来做运动搜索。这样每一个块都拥有自己独立的运动矢量,并且得到的预测块更接近于编码块,从而有利于提高压缩效率。参考帧和运动矢量。在 RTC 场景中我们一般选择单参考,并且一般选择当前编码图像的前一帧作为参考帧。
2025-11-05 15:44:54
1222
原创 帧内预测——减少空间冗余
这里有一个需要注意的地方,就是帧内预测的本质是通过已经编码了的像素值去预测待编码的像素值的;但是已经编码的像素值变成码流了,不再是一个个像素了,怎么去预测待编码的像素?其实已经编码了的像素是会重建成重建像素,用来做之后待编码块的参考像素。也就是说,可以认为是。
2025-11-03 17:55:00
659
原创 H264的码流结构
视频编码的码流结构其实就是指视频经过编码之后得到的二进制数据是怎么组织的,换句话说,就是编码后的码流我们怎么将一帧帧编码后的图像数据分离出来,以及在二进制码流数据中,哪一块数据是一帧图像,哪一块数据是另外一帧图像。 在 H264 中,帧类型主要分为 3 大类,分别是 I 帧、P 帧和 B 帧。帧内预测不需要参考已编码帧,对已编码帧是没有依赖的,并可以自行完成编码和解码。而帧间预测是需要参考已编码帧的,并对已编码帧具有依赖性。帧间预测需要参考已经编码好了的帧内编码帧或者帧间编码帧。并且,帧间编码
2025-10-30 18:02:42
651
原创 视频编码原理
以上就是视频编码的推理过程。总结一下就是,为了能够在最后熵编码的时候压缩率更高,我们希望送到熵编码(以行程编码为例)的“像素串”,是一串含有很多 0,并且最好连续为 0 的“像素串”。为了达到这个目标,我们先通过帧内预测或者帧间预测去除空间冗余和时间冗余,从而得到一个像素值相比编码块小很多的残差块。之后我们再通过 DCT 变换将低频和高频信息分离开来得到变换块,然后再对变换块的系数做量化。
2025-10-29 17:43:51
814
原创 图像的缩放算法
只要视频的原始分辨率和播放窗口的大小不一致,就需要通过缩放处理来使得视频画面适应窗口的大小。比如说,电影分辨率是 1080P,播放器的窗口大小是 720P,则需要将电影画面从 1080P 缩小到 720P 再播放。如果点击全屏播放,播放窗口变成了 4K,则需要将电影画面做放大处理,即放大到 4K 之后再播放。下面是几种常见的在视频开发过程中图像缩放的情形:情形 1:播放窗口与原始图像分辨率不匹配的时候需要缩放。
2025-10-27 11:46:04
1307
原创 图像处理基础
像素是图像的基本单元,一个个像素就组成了图像。可以认为像素就是图像中的一个点。在下面这张图中,可以看到一个个方块组成图像,可以认为这一个个方块就是像素。可以理解成:像素就是一个带有颜色的小块。 图像(或视频)的分辨率是指图像的大小或尺寸。一般用像素个数来表示图像的尺寸。比如说一张 1920x1080 的图像,前者 1920 指的是该图像的宽度方向上有 1920 个像素点,而后者 1080 指的是图像的高度方
2025-10-24 17:10:26
870
原创 Linux驱动开发(2)进一步理解驱动
CPU只能访问虚拟地址,而CPU需要向寄存器地址写入数据的时候不能直接写入,必须得到寄存器物理地址在Linux系统中对应的虚拟地址。writeb、 writew 和 writel分别对应 8bit、 16bit 和 32bit 写操作,参数 value 是要写入的数值, addr 是要写入的地址。使用 ioremap 函数将寄存器的物理地址映射到虚拟地址后,可以直接通过指针访问这些地址,但是 Linux 内核不建议这么做,而是。描述的信息,可以知道接下来要操作的设备类型(字符设备还是块设备),还会。
2025-09-10 15:53:30
1382
原创 Linux驱动开发(1)概念、环境与代码框架
树莓派是ARM架构的开发板。在烧录好系统之后(树莓派的系统烧录是将系统烧录进sd卡),配置无线网络(用于和开发的计算机进行通信)。下一步,通信成功之后,就要在自己的计算机(以下简称PC)上进行开发。
2025-09-07 22:20:00
608
原创 计组(3)函数调用
把这个程序编译之后,objdump 出来。在main函数中,与不调用函数相比,区别主要是把指令换成了函数调用的指令。call 指令后面跟着的,仍然是跳转后的程序地址。在add函数中,add 函数编译之后,代码先执行了一条 push 指令和一条 mov 指令;在函数执行结束的时候,又执行了一条 pop 和一条 ret 指令。这四条指令的执行,其实就是在进行压栈和出栈操作。
2025-09-02 11:25:29
719
原创 计组(2)CPU与指令
对于多条指令,除了简单地通过 PC 寄存器自增的方式顺序执行外,条件码寄存器会记录下当前执行指令的条件判断状态,然后通过跳转指令读取对应的条件码,修改 PC 寄存器内的下一条指令的地址,最终实现 if…else 以及 for/while 这样的程序控制流程。
2025-09-02 11:24:32
1072
原创 异常和中断
在这四种异常里,中断异常的信号来自系统外部,而不是在程序自己执行的过程中,所以我们称之为“异步”类型的异常。而陷阱、故障以及中止类型的异常,是在程序执行的过程中发生的,所以我们称之为“同步“类型的异常。在处理异常的过程当中,无论是异步的中断,还是同步的陷阱和故障,我们都是采用同一套处理流程,也就是“保存现场、异常代码查询、异常处理程序调用而中止类型的异常,其实是在故障类型异常的一种特殊情况。当故障发生,但是我们发现没有异常处理程序能够处理这种异常的情况下。
2025-09-02 11:17:05
855
原创 计组(8)CPU的优化——流水线设计
流水线技术和其他技术一样,都讲究一个“折衷”。一个合理的流水线深度,会提升我们 CPU 执行计算机指令的吞吐率。我们一般用 IPC来衡量 CPU 执行指令的效率。IPC其实就是CPI的倒数。因为数据的依赖关系和指令先后执行的顺序问题,很多时候,流水线不得不“阻塞”在特定的指令上。即使后续别的指令,并不依赖正在执行的指令和阻塞的指令,也不能继续执行。而乱序执行,则是在指令执行的阶段通过一个类似线程池的保留站,让系统自己去动态调度先执行哪些指令。这个动态调度巧妙地解决了流水线阻塞的问题。
2025-09-01 14:29:43
1750
原创 计组(7)CPU的指令+运算数据通路
通过引入了时序电路,我们终于可以把数据“存储”下来了。我们通过反馈电路,创建了时钟信号,然后再利用这个时钟信号和门电路组合,实现了“状态记忆”的功能。电路的输出信号不单单取决于当前的输入信号,还要取决于输出信号之前的状态。最常见的这个电路就是我们的 D 触发器,它也是我们实际在 CPU 内实现存储功能的寄存器的实现方式。这也是现代计算机体系结构中的“冯·诺伊曼”机的一个关键,就是程序需要可以“存储”,而不是靠固定的线路连接或者手工拨动开关,来实现计算机的可存储和可编程的功能。
2025-08-29 12:16:35
1129
原创 计组(6)电路与计算机运算实现
仍然用乘数去乘以被乘数,然后把结果加到刚才的结果上。反复重复这一步骤,直到不能再左移和右移位置。这样,乘数和被乘数就像两列相向而驶的列车,仅仅需要简单的加法器、一个可以左移一位的电路和一个右移一位的电路,就能完成整个乘法。结构示意如下:详细计算过程如下:这个计算方式虽然节约电路了,但是也有一个很大的缺点,那就是。
2025-08-27 16:38:51
818
原创 计组(1) 性能与硬件瓶颈
通过这个定义公式可以看出,响应时间越短,性能的数值就越大。比较典型的手机跑分软件,就是把多个预设好的程序在手机上运行,然后根据运行需要的时间,算出一个分数来给出手机的性能评估。而在业界,各大 CPU 和服务器厂商组织了一个叫作 SPEC(Standard Performance Evaluation Corporation)的第三方机构,专门用来指定各种“跑分”的规则。可以看到,无论是简单地通过提升主频,还是增加更多的 CPU 核心数量,通过并行来提升性能,都会遇到相应的瓶颈。
2025-08-22 17:06:30
899
原创 线程池以及日志、线程总结
主线程在main函数中构建一个线程池,初始化(Init)后开始工作(Start)此时线程池中每个线程都已经工作起来了,只是任务队列中任务为空,所有线程处于休眠状态通过线程同步中的条件变量实现,即当主线程向任务队列中添加任务后,唤醒一个在休眠中的线程,让其执行任务,执行完后再进入休眠状态。
2025-02-10 23:48:01
719
原创 线程概念、操作
main线程需要对new线程进行回收,所以我们期望main线程最后退出。做到这一点是通过join函数做到的。如果new线程退出了,main线程还没退出,且main线程没有join,那么此时new线程会进入类似僵尸进程的状态。
2025-01-29 00:28:28
1454
原创 共享内存和信号量
共享内存是为了进程之间通信服务的。进程间的通信的核心是要让两个不同的进程看到同一份资源。之前的匿名管道通过父子进程继承的关系,让父子进程看到同一份资源,进而进行通信;命名管道则是通过唯一的路径让两个不相关的进程看到同一份文件,进而通过该文件进行通信。
2024-12-08 22:25:59
979
原创 命名管道及代码
匿名管道是基于fork,即父子进程之间的继承关系的;而如果俩个毫无关系的进程之间需要进行通信的话,就需要用到命名文件。如何保证两个毫不相关的进程,打开同一个文件?通过文件路径的唯一性确定。原理类似于匿名管道;只是在磁盘中会有文件,该文件大小是0,即进程在通信时不会向磁盘进行刷新。删除命名管道:unlink myfifo;
2024-12-02 19:05:25
426
原创 进程通信与匿名管道、进程池
有一些任务,需要进程之间的协作完成;典型的,我们在命令行输入如下指令,其中管道就是实现进程之间的通信的方式之一:mytest进程是一直循环;下面是查看进程信息的代码。其中管道的左右是两个进程,光靠某一个进程都无法实现目的,而管道实现了进程之间的通信达到了任务要求。进程的独立性:进程必须具有独立性,那么进程在通信时就不能将进程的全部信息交给另一个进程。进程的独立性让进程间通信的成本会高一些。
2024-11-28 10:39:11
862
原创 重定向与缓冲区理解
dup2的作用是将oldfd的内容拷贝到newfd上,使得两处的文件描述符都指向oldfd指向的内容。扩展:dup2会引发文件关闭的问题。当oldfd与newfd都指向同一个打开的文件struct file,那么本来newfd指向的文件struct file会不会关闭?这个其实是通过引用计数实现的。也就是在每个struct file中都会有一个引用计数,表明了有几个指针指向该文件,当newfd指向的struct file发现,newfd不再指向自己,那么其引用计数就会减一,当减到0时该文件就会关闭。
2024-11-04 13:01:10
1155
原创 文件系统理解
被打开的文件相关的重要知识有,重定向,缓冲区,一切皆文件等等。对被打开的文件进行操作都是内存级别的。然而,我们并不是打开所有的文件,甚至打开的文件占比都是很小的;文件在被打开之前,都是在磁盘上进行保存。文件在磁盘上保存时需要有一定的规律,方便用户进行随时读取(随时打开,随时换出内存)。
2024-11-01 10:18:00
1109
原创 文件深入理解
这意味着,当我们在磁盘上创建一个空文件时,尽管它的内容是空的,但它依然占据着磁盘空间,因为它的属性(文件名、创建时间、大小、权限......)存储是占据空间的。我们所有对文件的操作,就可以分为a、对属性的操作;b、对内容的操作。
2024-10-23 21:49:46
1124
原创 简易shell编写
⑤更新环境变量时,需要全局变量的原因是因为putenv或setenv函数并不会复制传入的字符串,而是直接使用指针指向的内存地址。如果使用局部变量,局部变量的生命周期在函数结束后就会结束,导致环境变量指向的内存地址无效,进而可能引发未定义的行为或者程序崩溃。④分割字符串的函数strtok()②sprintf函数的使用。③更新环境变量的操作。
2024-10-20 21:19:44
258
原创 进程的控制(创建、终止、等待,程序替换)
进程=内核的相关管理数据结构(task_struct + mm_struct+页表) + 代码和数据。进程创建时,先创建内核数据结构,再将代码和数据加载到内存中。:即使是父子进程,其中代码是共享的,数据在进行修改时发生写时拷贝;并且子进程有自己的内核管理数据结构。更不要说两个不相关的进程了。除了“./程序名”的方式之外(该方式是让bash进程自己创建子进程)可以自己使用fork()函数创建。fork函数返回值:子进程返回0;父进程返回子进程的pid。
2024-10-20 16:20:09
1018
原创 优先级、命令行参数、环境变量、地址空间、O(1)调度算法
优先级是指定进程获取某种资源(这种资源就是CPU)的先后顺序。优先级的本质是task_struct进程控制块的一个内部字段: int prio;默认的优先级数字是80,通过nice值进行调整。Linux中优先级数字越小,优先级越高。
2024-10-14 17:38:09
1122
原创 进程相关概念
输入设备:键盘、鼠标、摄像头、磁盘、网卡......输出设备:显示器、声卡、磁盘、网卡......中央处理器(CPU):运算器+存储器;存储器:内存。数据信号表示数据在体系结构中的流动方向,尽管在流动的过程中会进行数据加工,但从一个设备到另一个设备本质上还是一种拷贝。现有的CPU运算速度极快,所以设备间的拷贝效率决定了计算机的基本效率。存储金字塔表达的含义就是,离CPU越近的存储结构,数据拷贝的效率越高,但同时意味着成本越高。
2024-10-13 17:52:47
799
原创 C++继承
继承允许在保持原有类特性的基础上进行扩展。以前的函数是一种代码的复用,而继承是类设计层次的复用。以 person 与 student 类为例,person是student的基类(父类),而student则是派生类(子类)具体的定义如下:访问限定符是在类中对成员的修饰,和继承关系限定符一起决定了最终的继承方式:总结:a、基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。b、
2024-05-29 14:02:00
956
1
原创 String总结
注:这里初始化列表中用new动态开辟一个大小和s相同的空间。strlen计算的是到\0为止的长度,所以要+1(string容器的末尾默认要有\0)。一般的string的size不会把\0算进去;在扩容时,reserve(n)时真正开的空间也是n+1.传统写法和现代写法:现代写法相较于传统写法,区别在于在一些函数的写法上是通过复用一些已经写好的函数实现的。
2024-04-22 12:50:04
1384
原创 yum和vim工具
①正常/普通/命令模式(Normal mode):控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode(插入模式)下,或者到 last line mode(底行模式)下。②插入模式(Insert mode):只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。不过有一点要特别注意,就是进入vim之后,是处于[正常模式],要切换到[插入模式]才能够输入文 字。③[插入模式]切换至[正常模式]:按一下「ESC」键转到[正常模式]
2024-03-07 19:48:33
984
原创 Linux权限
假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask(不是简单的相减)--对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符,或者运行起来一个应用程序)由以上的目录权限可得出,只要用户具有目录的写权限, 用户就可以删除目录中的文件, 而不论这个用户是否有这个文件的写权限.③可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
2024-03-06 11:17:56
896
原创 Linux系统指令
①cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。(2)任何目录下,都会默认有两个隐藏目录 . 和.. ,其中 . 表示当前路径,..表示上一级路径,. 存在的意义是方便找到当前目录下的一个文件(可执行文件),.. 存在的意义是方便进行路径的回退。
2024-03-05 21:05:28
909
原创 C/C++内存管理
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申 请空间失败时会抛异常,malloc会返回NULL。④delete[]的原理:在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理;对于内置类型区别不大。申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],注意:匹配起来使用。
2024-02-27 10:47:50
879
原创 C++类和对象(3)
static的用法主要体现在两个方面:面向过程中的static和面向对象中的static。面向过程的static主要包括静态全局变量、静态局部变量和静态函数。面向对象的static主要包括静态成员变量、静态成员函数。
2024-02-24 17:15:11
872
原创 C++类和对象(2)
超级详细的 C++ const 全面总结-优快云博客1、 const 修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const 修饰的类型为 T 的变量 val,它是不可变的。2、指针使用 const:①如果 const 的位置在的后面,表示指针本身是常量,但是指针指向的变量的值是可以改变的。简单来说,假如指针 p 指向了 变量 a,那么 p 就只能指向 a,不能再指向其他变量了,但是 a 不是常量,a 的值是可以改变的int a = 10;int b = 20;p = &b;
2024-02-23 16:09:07
869
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅