- 博客(57)
- 收藏
- 关注
原创 ffmpeg硬件编码
使用FFmpeg进行硬件编码可以显著提高视频编码的性能,尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件(如Intel QSV、NVIDIA NVENC、AMD AMF等)来加速编码过程。硬件编码的基本流程与软件编码类似,但需要额外设置硬件设备上下文和硬件帧上下文。:从 YUV 文件读取数据,拷贝到硬件帧,编码并写入输出文件。:初始化 Intel QSV 硬件设备上下文和硬件帧上下文。:将帧数据发送到编码器,接收编码后的数据包。:绑定硬件帧上下文,设置编码参数。:配置硬件帧的格式、分辨率等。
2025-01-13 17:59:01
811
原创 FFmpeg硬件解码
使用FFmpeg进行硬件解码时,通常需要结合FFmpeg的API和硬件加速API(如CUDA、VAAPI、DXVA2等)。以下是一个简单的C++代码示例,展示如何使用FFmpeg进行硬件解码。这个示例使用了CUDA作为硬件加速的后端。
2025-01-13 14:03:52
491
原创 Qt重写webrtc的demo peerconnection
其中h264在cmake中要加上-DWEBRTC_USE_H264,编译时的参数为。需要打开webrtc选项。
2025-01-09 18:59:27
484
原创 boost::iterator_adaptor
是 Boost 库中的一个工具,用于创建新的迭代器类型,这些迭代器类型基于已有的迭代器进行封装,并提供了额外的功能或修改了原有的行为。它允许开发者通过继承的方式,轻松地扩展迭代器的功能,而不需要从头开始实现一个完整的迭代器接口。
2024-12-27 11:57:50
285
原创 std::is_trivial
是 C++ 标准库中的一个类型特征(type trait),用于检测一个类型是否是一个“平凡”(trivial)类型。可以帮助开发者在编写模板代码或进行类型检查时,更好地理解和处理不同类型的特性。例如,当决定是否进行某些优化或特殊处理时,了解一个类型是否平凡可能非常重要。此外,平凡类型还必须满足其所有非静态数据成员也都是平凡类型的条件。如果一个类型满足上述所有条件,那么。没有任何自定义的构造函数、析构函数或复制操作,因此它是一个平凡类型,输出将是。自定义了构造函数和析构函数,因此它不是平凡类型,输出将是。
2024-12-27 11:29:35
287
原创 webrtc获取IceCandidate流程
foundation:用于唯一标识候选者的基础信息,通常是基于候选者的类型、IP地址、协议和replay协议计算出的字符串。component:标识候选者所属的传输组件。对于RTP流,通常使用1;对于RTCP流,通常使用2。protocol:候选者使用的传输协议,通常是UDP,但也可以是TCP(尽管在WebRTC中UDP更为常见)。priority:候选者的优先级,用于在选择最佳候选对时进行比较。优先级的计算公式考虑了候选类型优先级、本地优先级和组件ID。address:候选者的IP地址。port。
2024-12-24 16:11:34
1259
原创 folly库关于std::map封装的便携性操作
,并返回与键相关联的值,如果键不存在,则返回提供的默认值。类型不满足某个条件时禁用这个函数模板。但是,由于您的条件表达式是基于。语句来定义类型别名可以提高代码的可读性和维护性。的(这是不正确的,如上所述),并且您没有为。语句定义的别名),这会导致编译错误。提供一个类型别名(通常是一个。参数,这是很好的做法。该函数接受一个映射()、以及一个默认值(
2024-12-20 14:22:50
229
原创 folly库Indestructible源码分析
的,且其类型拥有静态存储期,这种情况下它实际上不会在程序结束时销毁,但其析构函数仍然会在程序结束时被调用,只是不会释放内存)。然而,对于某些关键资源或配置数据,我们可能希望它们在程序整个运行期间都保持有效,且不希望它们的析构函数被调用,因为析构操作可能涉及释放资源、写入文件或执行其他清理工作,这些在程序正常退出时可能是不必要的或有害的。,它被设计用于实现一种特殊的单例模式——Meyers单例,但在此基础上,它确保了对象在程序整个生命周期内都不会被销毁,并且对象被内联存储(即存储在栈上,而非堆上)。
2024-12-19 19:12:24
467
原创 folly库高性能futex源码探究
Futex(快速用户空间互斥量)是一个32位的无符号整型原子变量,它允许对该值执行futex()系统调用。它以模板化的方式设计,使其能够与确定性调度测试(DeterministicSchedule)正确交互。cpp源码这段代码定义了一个名为Futex的模板结构体,它是对Linux futex系统调用的封装。Futex(快速用户空间互斥量)是一种高效的同步机制,允许进程或线程在用户空间中等待特定的条件变量,而无需频繁地陷入内核空间。Futex结构体基于构建,确保了对其内部值的原子操作。Futex。
2024-12-19 18:54:11
1052
原创 folly之FunctionRef源码探究
这段代码定义了一个名为的模板类,用于存储和调用任何可调用对象(如函数、lambda表达式、函数对象等)的引用。类设计得非常灵活,可以适配多种不同类型的可调用对象,同时避免了不必要的对象拷贝和动态内存分配。
2024-12-19 16:30:59
447
原创 kthread_run
是一个在 Linux 内核中用于创建和启动内核线程的函数。这个函数封装了创建线程所需的一系列步骤,使得内核模块的开发者能够更加方便地创建和管理内核线程。
2024-12-13 11:40:52
330
原创 folly库dynamic源码解析
通常,你可以尝试像使用它们所代表的类型那样来使用这些对象(尽管在某些情况下,与原始类型相比,其接口可能稍显不完整),如果以非法方式使用,它会抛出TypeError。这是一个运行时动态类型值,它能够存储来自一个特定预定类型集(如整数、布尔值、数组等)的类型。特别是,它可以作为完整的JSON对象的便捷内存表示形式。
2024-12-11 15:56:45
523
原创 folly库ConstexprMath
其实使用用了递归手法,b < a?直到判断出哪个数值最小,同理可得出constexpr_max。其中folly::constexpr_min源码为。
2024-12-11 14:17:30
188
原创 folly库DiscriminatedPtr源码解析
是一个模板类,它允许存储指向多个可能类型之一的对象的指针,或者它可以是空的。这种类型的指针被称为判别式指针,因为它能够区分并安全地访问它所指向的对象的类型。以下是对。
2024-12-11 14:12:00
881
原创 folly库Conv类型转换源码解析
的衰减值不同,这个函数模板将不会被实例化,从而避免了不安全的类型转换尝试。这种技术在泛型编程中非常有用,特别是在处理模板元编程和类型推导时。,来实现类型安全的类型转换(或更准确地说,是类型转换的封装)。处理后)是相同类型的情况下,提供一个类型安全的、保持值类别的转换/转发机制。的模板函数,它使用了 C++11 中的模板元编程技术,特别是。这个转换会进入到这个函数。这段代码定义了一个名为。
2024-12-10 17:53:56
357
原创 folly之侵入式链表
侵入式链表(Intrusive Linked List)是一种数据结构,它的节点不是通过包含链表节点的对象来实现的(像非侵入式链表那样),而是通过在节点对象中直接包含指向其他节点的指针来实现的。这意味着链表节点对象本身需要被修改以包含指向链表其他部分的指针。这部分代码展示了一个模板参数的用法,该参数用于指定一个成员指针,这个成员指针指向。
2024-12-10 17:29:31
485
原创 folly库CachelinePadded解决伪共享
伪共享(false sharing)是并行编程中常见的性能问题,发生在两个或多个线程访问位于同一缓存行(cache line)内的不同数据项时,即使这些线程只修改它们自己的数据,也会导致缓存行失效和不必要的缓存-主存传输。为了避免这种情况,可以通过添加填充来确保每个线程访问的数据项位于不同的缓存行中。,并添加足够的填充(padding),以确保该类型在 Folly 库所使用的范围内不会受到伪共享(false sharing)的影响。描述了一个模板类或结构体的设计目的,这个设计旨在存储一个类型。
2024-12-06 11:41:07
218
原创 std::is_literal_type
是 C++11 引入的一个类型特征(type trait),用于在编译时检查一个类型是否为字面量类型(literal type)。字面量类型是指那些可以在编译时常量表达式中使用的类型。这通常意味着类型具有一些特定的属性,比如它的所有非静态数据成员都是字面量类型,且它的构造函数、析构函数以及拷贝赋值运算符(如果有的话)都是。需要注意的是,即使一个类型满足字面量类型的所有要求,但如果它的成员或基类的析构函数不是。变量是在编译时就确定其值的变量,这要求变量的类型能够在编译时构造和销毁。是一个字面量类型,因此。
2024-12-05 16:43:47
184
原创 std::declval
是 C++11 引入的一个工具,它用于在编译期创建一个指定类型的引用,主要用于模板元编程和类型推导中,尤其是当你无法(或不想)创建一个实际的对象实例时。允许你“假装”有一个该类型的对象,从而能够调用其成员函数、访问其成员变量等,但这仅仅是在编译期进行的类型检查,并不会实际生成代码去访问这些成员。
2024-12-05 11:22:22
267
原创 std::reverse_iterator
是 C++ 标准库中的一个迭代器适配器(iterator adapter),它允许你以反向顺序遍历容器或序列。这个适配器通过封装一个基础迭代器(通常是正向迭代器)并提供反向的递增(++)和递减(--)操作来实现这一功能。当你递增一个时,它实际上是在递减其封装的基础迭代器,反之亦然。通常用于需要反向遍历容器的场景,比如从后向前打印容器中的元素。
2024-12-04 19:36:22
209
原创 std::is_class
是 C++ 标准库中的一个类型特征(type trait),用于在编译时检查一个类型是否为类类型(class type)。类类型包括普通的类(class)、结构体(struct)以及联合体(union)。此外,如果某个类型是通过。声明定义的别名,并且该别名指向一个类类型,那么。都是类类型(或结构体、联合体),所以它们的。的别名,不是类类型,所以它的。也会将其视为类类型。
2024-12-04 19:30:49
281
原创 std::decay
是 C++ 标准库中的一个模板结构,用于推导一个类型的“衰减”版本。这里的“衰减”指的是移除类型的一些特定属性,比如引用、顶层 const 限定符(即不是作为数组或指针类型的一部分的 const),以及将数组和函数类型转换为对应的指针类型。可以帮助程序员编写更通用的模板代码,因为它提供了一种方式来获取一个类型的“基本”或“最简化”版本,这个版本不受引用、const 等修饰符的影响。被用来获取原始类型的“衰减”版本,并且通过。一起使用,用于类型操作和查询。来验证转换是否正确。
2024-12-04 17:50:28
256
原创 __builtin_clzll
如果你需要在非 GCC 编译器上使用类似的功能,你可能需要查找该编译器提供的等效内置函数或编写自己的实现。的二进制表示中从最高有效位(most significant bit, MSB)到最低有效位(least significant bit, LSB)方向,连续零的个数。这个函数在处理位操作和性能优化时非常有用,尤其是在需要快速确定一个数的最高有效位位置,或者进行某些类型的位模式匹配时。为 0,则根据 GCC 的文档,返回值是 64(因为对于 64 位数来说,所有位都是零)。
2024-12-04 16:06:58
438
原创 folly库中AtomicBitSet
在多线程编程中,原子操作是指那些在执行过程中不会被线程调度机制打断的操作,即这些操作一旦开始,就会一直运行到完成,中间不会被其他线程的操作所干扰。的值是由编译器和标准库根据目标硬件平台定义的,因此,在不同的硬件和编译器环境下,这个值可能会有所不同。是一个在C和C++编程中使用的宏定义,特别是在处理多线程编程和原子操作时。类型,通常对应于64位整数)的原子操作是否可以不使用锁来实现。的值来决定是否使用特定的原子操作或数据结构。,那么使用无锁的原子操作可能会提高程序的性能。开发者在编写多线程程序时,可以根据。
2024-12-04 15:25:36
162
原创 std::is_arithmetic
是 C++ 标准库中的一个类型特征(type trait),它用于在编译时检查一个类型是否为算术类型。算术类型包括整型(如。通常与其他类型特征或模板元编程技术一起使用,以在编译时根据类型属性做出决策。结合使用,以根据类型是否为算术类型来启用或禁用函数模板的重载。的静态常量布尔成员,用于指示模板参数是否为算术类型。下面是一个简单的例子,展示了如何使用。, 以及它们的无符号版本和布尔类型。是一个模板结构体,它有一个名为。类型是否为算术类型。是算术类型,因此它们的。不是算术类型,所以它的。
2024-11-28 16:27:24
316
原创 offsetof
定义:offsetof是一个编译时宏,用于计算从结构体开始到其成员变量之间的字节偏移量。语法type:结构体的类型名。member:该结构体中的一个成员名称。返回值:类型为size_t,表示结构体成员相对于结构体起始地址的偏移量。
2024-11-28 14:51:23
502
原创 std::max_align_t
是 C++ 标准库中的一个类型定义,它表示所有标准基本类型(包括内置类型和通过标准库定义的类型)中对齐要求(alignment requirement)最大的类型。对齐要求是指数据类型在内存中存储时,其起始地址必须是某个特定值的倍数,这个值就是该类型的对齐要求。这个值通常是所有标准类型中对齐要求最大的值,但也可能受到编译器和平台的影响。的对齐要求可以帮助你确定结构体的总对齐要求,从而确保结构体的实例在内存中正确对齐。:在与某些硬件接口交互时,可能需要确保数据按照特定的对齐方式存储。的对齐要求,可以使用。
2024-11-28 14:30:02
496
原创 std::allocator
如果你需要自定义内存分配策略,你可以通过继承并重写其方法来实现。然后,你可以将这个自定义分配器传递给容器类,以便容器使用你的分配策略来管理其内存。
2024-11-27 19:48:01
336
原创 std::aligned_storage
是 C++ 标准库中的一个模板类,它提供了一种方式来存储任意类型的对象,同时确保这个存储空间是适当地对齐的,以满足该类型对象的要求。这个类主要用于实现通用编程技术,如类型擦除、多态容器等,在这些场景中,你可能需要在编译时不知道具体类型的情况下分配内存。
2024-11-27 17:40:12
354
原创 socketpair
socketpair是一个在Unix系统上用于创建一对相互连接的套接字的系统调用,它允许两个进程通过这对套接字进行双向的数据交换。
2024-11-26 15:30:16
495
原创 std::type_index
是 C++11 标准库中的一个类模板,它提供了一种方式来获取类型的唯一标识符。这个标识符是基于类型的对象生成的,而是 C++ RTTI(运行时类型识别)机制的一部分。通过封装的指针,并提供一个更轻量级的比较和哈希操作接口,使得类型信息可以更方便地用于标准库容器和算法中。
2024-11-22 10:33:55
344
原创 C++11重写C++17 std::size std::empty std::data
【代码】C++11重写C++17 std::size std::empty std::data。
2024-11-20 15:40:26
100
原创 folly库高性能PackedSyncPtr探究
其实这个库主要使用了PicoSpinLock原子自旋锁来保存数据,前16位保存引用技术,后48位保存指针地址,其实这个只能在64位系统运行,可以从这个函数可以看出来。基本上锁操作都是从PicoSpinLock。
2024-11-14 16:43:47
161
原创 folly库PicoSpinLock探究
这里的汇编代码主要用于在多线程环境下原子地设置一个位(bit),并返回操作前的状态(是否成功设置了位,即是否之前该位为0)。关键字告诉编译器不要优化这段代码,即使看起来它不会对程序的输出产生任何影响,也要保留这段代码,因为汇编代码可能会对程序的外部行为(如硬件状态)产生影响。综上所述,这段代码的目的是在多处理器环境下原子地测试并设置一个位,并返回操作是否成功(通过检查是否产生了进位)。表示一个写回(write-back)的通用寄存器,用于存储汇编指令的结果(这里是。,可能表示要设置的位的位置),
2024-11-14 14:33:55
301
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人