自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

梦的灰色边沿...

无厘头的疯子

  • 博客(149)
  • 资源 (1)
  • 问答 (4)
  • 收藏
  • 关注

原创 C++中volatile的具体含义和可能的坑

提醒编译器不要对该变量相关的代码进行优化,避免出现意外的负面作用;对类似的表达式不进行编译层面的指令重排。编译指令重排也是一种编译器优化手段,这条严格来说也是第一条的变种。int g = 0;a < n;a++) {i++;//func对应的汇编a < n;a++) {j++;//func1 对应的汇编a < n;a++) {g++;//func2对应的汇编上面的代码中可以看到对于普通变量的++直接被编译器在编译期间就分析出来结果,直接赋值了,for循环直接被干掉了。

2024-01-22 00:52:43 1068

原创 H264之NALU结构详解

NAL层即网络抽象层(Network Abstraction Layer),是为了方便在网络上传输的一种抽象层。一般网络上传输的数据包有大小限制,而AVC的帧大小远远大于网络传输的字节大小限制。因此要对AVC的数据流进行拆包,将一帧数据拆分为多个包传输。和NAL层相对是VAL层,即视频编码层(Video Coding Layer)NALU就是经过分组后的一个一个数据包。每个NALU由一个1字节的NALU头部和一个包含控制信息或编码视频数据的字节流组成。NALU头部包含了NALU的类型以及其重要性的信息。

2023-12-10 08:08:41 305

原创 C++ libcxxabi中dynamic_cast 实现

C++中,用于有虚函数的继承链中父类型到子类型的安全转换。class A{public:class B{如何识别当前类的类型,这依赖于RTTI。C++中包含虚函数的对象都有一个虚函数表,一般情况下都在首地址(多继承和虚继承会有多个)有一个指向该虚函数表的虚函数表指针。基类偏移;typeinfo;如果有虚函数的话会有虚析构函数指针,一般情况下有两个;虚函数指针,如果是虚继承对应的虚函数指针可能是一个thunk function。

2023-11-26 22:35:56 371

原创 【crash】 cxa_pure_virtual 崩溃分析与原理

怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。怀疑到这一点,我这边开始找资料(类似的问题印象中标准中是不管的,那大概率在ABI中定义的,那我们去看ABI的定义)。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。当类被析构时,基类的析构稍微比较耗时时,第二个线程尝试访问当前类的一个被重写的纯虚函数,由于此时的虚函数表中的纯虚函数已经被修改为。

2023-11-23 00:37:40 434

原创 Folly库实现阅读——FBString

FBString是facebook内部使用的基础库的string组件,为了达到更好的性能采用了多种存储策略,优化不同场景的性能。FBString完全兼容,同时支持jemalloc更快的分配内存,减少磁盘碎片,加快并发情况下的速度和性能。实现细节三种存储策略;与100%兼容。COW 存储时对于引用计数线程安全。对 Jemalloc 友好。如果检测到使用jemalloc,那么将使用jemalloc的一些非标准扩展接口来提高性能。

2023-09-24 22:41:10 241

原创 图像处理之频域滤波DFT

傅里叶变换可以将任何满足相应数学条件的信号转换为不同系数的简单正弦和余弦函数的和。图像信号也是一种信号,只不过是二维离散信号,通过傅里叶变换对图像进行变换可以图像存空域转换为频域进行更多的处理。本文主要简要描述傅里叶变换以及其在图像处理中的简单应用,并进行一些简单的实验来描述其相关性质。

2023-09-16 21:57:34 635

原创 FLV封装格式

FLV流媒体格式是sorenson公司开发的一种视频格式,全称为Flash Video。它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。由于其视频文件体积轻、封装播放简单等优点,使得其非常合适在网络上传输,目前主流的视频网站无一例外支持FLV流媒体格式进行视频播放。

2023-09-09 11:46:17 160

原创 Jpeg文件格式详解

JPEG(Joint Picture Expert Group)编解码标准是由国际标准化组织(ISO)和CCITT联合制定的静态图象有损压缩编码标准(标准也定义了无损压缩内容但是大多数系统都不支持)。JPEG是一种编解码标准不是一种文件格式,其对应的文件格式有JIF,JPEG/JFIF,JPEG/EXIF等。

2023-09-03 16:50:46 1612

原创 FFmpeg5.0源码阅读——FFmpeg大体框架(以GIF转码为示例)

前一段时间熟悉了下FFmpeg主流程源码实现,对FFmpeg的整体框架有了个大概的认识,因此在此做一个笔记,希望以比较容易理解的文字描述FFmpeg本身的结构,加深对FFmpeg的框架进行梳理加深理解,如果文章中有纰漏或者错误欢迎指出。本文描述了FFmpeg编解码框架的工程结构,基本构成以及大体的调用流程。因为FFmpeg的滤镜是相对独立的一个模块,因此在此不会进行描述。

2023-08-26 17:09:39 1578

原创 FFmpeg5.0源码阅读——URLContext和URLProtocol

本文描述FFmpeg中URLContext和URLProtocal的实现。

2023-08-26 12:50:10 667

原创 C++对象模型实验(clang虚函数表结构)

本科期间有对比过msvc,gcc,clang的内存布局,距今已经6-7年了,当时还是使用的c++11。时间过得比较久了,这部分内容特别是内存对齐似乎C++17发生了一些变化,因此再实践下C++类模型。本文描述了C++不同类型的实际内存模型实现,主要关注虚函数表的具体内存布局。虽然clang,msvc都提供了对应的命令让我们直接查看类对象的内存布局,但是我们自己解析一下理解更深一点儿。

2023-08-20 22:33:20 371 1

原创 FFmpeg5.0源码阅读——VideoToobox硬件解码

本文描述了FFmpeg中。

2023-08-19 17:20:16 1770

原创 FFmpeg5.0源码阅读——av_interleaved_write_frame

本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数。

2023-07-30 20:33:23 1292

原创 FFmpeg5.0源码阅读—— avcodec_send_frame && avcodec_receive_packet

本文主要描述了FFmpeg中用于编码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。

2023-07-23 21:34:32 734

原创 【crash】浮点除0堆损坏

然后就去看代码排查调用链中可能导致堆损坏的地方(因为开发机无法复现,因此只能通过分析+日志来排查),在排查代码过程中发现了几处可能越界的操作以及除0。IEEE754规定了浮点除0运算的结果为+INF或者-INF,但是C++标准明确规定了该行为未定义的,使用可能会导致UB。实际测试过程中发现只有低版本的机器浮点除0是不支持的,而新机器无论是windows还是Mac浮点除0编译器只会报warning但是结果是INF不会出错。,比较反常,因此排查了该值的计算来源发现是有double除0。比较小只有20个元素)。

2023-07-14 23:32:34 182

原创 FFmpeg5.0源码阅读—— avcodec_send_packet&&avcodec_receive_frame

本文主要描述了FFmpeg中用于解码的接口的具体调用流程,详细描述了该接口被调用时所作的具体工作。

2023-07-09 21:43:02 889

原创 裁剪opencv库到2Mb

本文描述了如何对opencv进行裁剪已达到最小化,不限于使用模块编译,去除第三方库依赖,改变编译选项,限制导出符号等。

2023-07-08 22:00:44 1010

原创 FFmpeg5.0源码阅读—— av_read_frame

本文主要描述了FFmpeg中用于打开编解码器接口。

2023-07-08 21:12:50 1093

原创 简单的Elf解析器实现

之前虽然了解过ELF文件的具体格式,但是对改文件的理解还是存在一些不足,因此本文尝试写了一个简单的ELF解析器对ELF文件进行解析并输出Header,Program Header Table和Section Header Table。

2023-07-04 00:05:22 382

原创 FFmpeg5.0源码阅读—— avcodec_open2

本文主要描述了FFmpeg中用于打开编解码器接口。

2023-07-02 22:40:38 1073

原创 FFmpeg5.0源码阅读——avformat_find_stream_info

在使用FFmpeg库时通常使用。

2023-06-24 19:23:59 956

原创 FFmpeg5.0源码阅读——avformat_open_input

本文主要描述了FFmpeg中用于打开文件接口。

2023-06-24 17:21:42 1208

原创 Windows和Linux动态注入

  摘要:最近对动态注入有一些兴趣因此搜索了些资料,简单整理了下相关的技术实现。本文只能够带你理解何如注入以及大概如何实现,对注入的方法描述的并不详细。  关键字:dll注入,hook,提权  读者须知:读者需要对Windows和Linux dll加载的基本流程比较熟悉。  注入就是将自己的代码注入到目标进程中强制目标进程执行,而动态注入就是将动态库强制加载进目标进程的进程空间从而对目标进程进行修改。动态注入有利有弊,可以用于反病毒、反外挂也可以用于投毒或者制作外挂。1 DLL注入  DLL是wi

2023-06-23 22:35:12 1287

原创 动态库的入口——VCRT(DLL)和CRT(SO)

为了更加深入的理解动态库的加载初始化过程,本文根据VCRT和Linux-CRT的代码实现详细描述了windows和linux平台下对应动态库加载时会进行哪些工作。本文重点关注全局变量的初始化时机,以及是否有其他额外的操作。

2023-06-23 00:25:11 720

原创 C++ 反汇编简要

C/C++都需要经过编译器变成对应的机器码,通常编译器对程序员是个黑盒子。有些时候我们可能会纠结编译器会不会进行RVO,EBO等优化,以及一些在我们看起来应该正常的代码因为一些UB的行为被C++编译器优化成了不可预期的代码。这时候如果我们了解具体代码是如何编译成对应的二进制机器码对我们查具体的问题非常有益。另一种场景,在开发软件时,线上环境能够复现的问题,我们本地可能是无法复现的。这就需要我们根据线上的堆栈分析具体的原因。

2023-06-19 22:17:28 2408

原创 FFmpeg5.0源码阅读——mov文件格式解析

之前在[Mp4格式详解](https://blog.csdn.net/GrayOnDream/article/details/127815260)中详细描述了Mp4文件格式的具体布局方式。为了更加深入理解mp4文件格式,本文记录了ffmpeg中解封装mp4文件的基本实现。

2023-05-28 22:39:01 1511

原创 C++源码剖析——unordered_map和unordered_set

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-08 21:19:17 572 1

原创 C++源码剖析——set,multiset,map和multimap

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-08 18:06:21 485

原创 C++源码剖析——序列容器适配器(stack,queue,priority_queue)

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-02 22:34:23 173

原创 C++源码剖析——list

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-02 19:56:27 307

原创 C++源码剖析——forward_list

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-02 16:19:02 358

原创 C++源码剖析——deque

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-04-02 14:53:31 634

原创 C++源码剖析——iterator

本文描述了llvm中libcxx的```iterator```的实现。

2023-03-26 17:20:04 578 1

原创 C++源码剖析——vector和array

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-03-26 12:48:41 402

原创 C++源码剖析——string和string_view

之前看过侯老师的《STL源码剖析》但是那已经是多年以前的,现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。

2023-03-21 00:10:36 820

原创 C++源码剖析——allocator和allocator_traits

allocator是STL中对一个堆内存分配器,是对内存申请工作的一个封装,将内存的申请和成员的构造抽象开来方便控制。基本上,C++标准库中的容器的默认分配器都是allocator。在C++中分配器是通过模板参数的方式指定给对应的容器,默认就是allocator,用户自己也可以实现自己的内存管理类,对堆的内存进行有效的管理也可以将对应的分配器指定给容器使用(前提是接口保持一致)。

2023-03-19 16:27:16 885

原创 FFmpeg5.0源码阅读——AVPacket

AVPacket是FFmpeg中存储压缩数据的结构体,一般从媒体文件中解封装出来的数据或者编码器编码得到的压缩数据都存储在AVPacket中,且一个AVPacket只存储一帧压缩的视频数据或者一段压缩的音频数据。AVPacket的数据通常是通过管理的因此申请释放要是用对应的API。另外,并不是abi稳定的,如果有新增的字段会在结构体定义的尾部添加,因此在使用时三思。//管理data域的AVBufferRef(引用计数),如果为NULL,表明数据并不是通过引用计数管理的 int64_t pts;

2023-02-15 23:22:15 584

原创 FFmpeg5.0源码阅读——AVFrame

FFmpeg中解码的裸数据都是通过AVFrame存储的,因此理解AVFrame的具体实现对于使用FFmpeg有比较大的帮助。AVFrame是一个复合的结构体,他可以存储音频数据或者视频数据。但是因为音频和视频数据的参数不兼容比如宽高和采样率等,AVFrame中会保留两者参数的定义,以至于结构体略显臃肿(同时包含了音频和视频的参数定义)。FFmpeg解码一个视频时,会先通过解封装器对视频解封装得到编码的流数据AVPacket,再将该流数据送给解码器进行解码,解码出来的裸数据就会存储在AVFrame中返回。

2023-02-14 23:27:05 928

原创 FFmpeg5.0源码阅读——内存池AVBufferPool

AVBuffer声明在文件中,而相关的操作函数定义在中。先简单看下AVBufferdata:buffer中的数据指针;size:数据的大小,即data中数据的大小;refcount:引用计数,无需多说,当引用计数为0时销毁对应的内存。该变量的操作是原子的,ffmpeg内部针对不同的编译期和平台实现了一套源自变量,具体就深入了,理解意思就行;free:释放内存的函数指针,如果不指定的话会使用默认的函数指针释放内存;opaque。

2023-02-08 23:49:25 459

原创 封装格式之MP4

MP4文件格式即ISO/IEC 14496-14:2003,是冲QuickTime文件格式发展而来,是ISO/IEC 14496-12:2004(ISO Base Media File format)的一个具体实例。MP4的实现有两个版本:第一个版本是ISO/IEC 14496-1:2001(MPEG-4 Part 1 (Systems), First edition),发布于2001年;

2022-11-12 00:02:05 1808

数据结构中线性表,队列和栈

包含了数据结构中的线性表,队列和栈的具体代码,如有错误可以联系我,我可以进行修改。

2017-01-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除