- 博客(545)
- 资源 (17)
- 收藏
- 关注
原创 [Android] 使用JNI 出现 signal 4 (SIGILL)时,确保每个函数都有 return 语句
出现这个问题,大部分情况下时 JNI 函数及其调用的 底层 C/C++ 函数缺少 return 语句。
2025-02-21 11:39:59
147
原创 [modern c++] shared_from_this() 会卡住
shared_from_this 要求对象在创建之初就是通过 make_shared 或者 std::shared_ptr 的构造来完成的,不能如下几种情况:1) heap new 出来且没使用 make_shared 或者 std::shared_ptr 新创建一个 shared_ptr 实例;2)不能是 unique_ptr 实例,即便是通过 release() 转换成 裸指针都不行,会导致奔溃和卡住,这一点很奇怪,感觉像bug,这里极其容易犯错;
2025-02-06 18:52:50
322
原创 [common c/c++] CMA(Contiguous Memory Allocator)
使用,但当驱动不用的时候,memory allocator(buddy system)可以分配给用户进程用作匿名内存或者页缓存。而当驱动需要使用时,就将进程占用的内存通过回收或者迁移的方式将之前占用的预留内存腾出来, 供驱动使用。CMA的全称是contiguous memory allocator, 其工作原理是:预留一段的内存给。
2025-01-06 11:42:21
133
原创 [modern c++] shared_from_this 可以多次使用,不用担心double free
那么多次使用 shared_from_this 也是创建了多个 shared_ptr, 是否会导致double free呢?,因为shared_from_this 的内部是 weak_ptr 实现,所以不会导致 double free。
2024-12-29 21:03:29
207
原创 [modern c++] 不要对一个对象创建多个 shared_ptr
shared_ptr 可以用来自动管理实例(内存) 的生命周期,但是如果对同一个实例(内存) 创建多个 shared_ptr 则可能引起 double free 的问题。
2024-12-29 21:00:03
262
原创 [GStreamer] gstbasesink 的 chain 函数
chain函数是上一个element到当前element的入口,chain函数处理完毕后,上一个函数的push_buffer 就得以返回。因此通常情况下 parent element 的核心逻辑都在 chain 函数里,再通过再 chain 函数里调用虚函数让 child element 的虚函数实现能够在 parent element 的 chain 函数里表现定制化的功能。
2024-12-07 16:57:48
201
原创 [GStreamer] multiqueue
gstreamer 提供了 multiqueue 用来同步多路数据。element 包含多个 queue,每个 queue 都可以自定义容量和阈值等一系列信息,通过这些信息,multiqueue 可以实现对每个 queue 的单独控制,这种控制包括但不限于 是否从上游拉数据,是否把数据推给下游 等等。在多媒体领域里,常常用在 demuxer 之后,用来确保送给 audio 和 video decoder 的数据不会存在过大的 pts 时间差,变相提供一种偏软的音画同步机制。
2024-11-27 10:20:23
237
原创 [Android] Graphic Buffer 的申请
MediaCodec 支持 texture mode,即MediaCodec解码video完毕后把 yuv 数据填入 GPU 共享出来的 graphic buffer 里面,app 会把 video 的 yuv数据 和 ui 的数据通过通过软件渲染组件(opengl等)发送给GPU 进行一并渲染。这样做的效率较低,但是稳定性较好。且性能取决于GPU的性能。
2024-11-08 21:02:25
1097
原创 [Android] android 里的共享内存
hidl_memory 是一种对共享内存的封装,可以用来让 framework 层和 HAL 层进行数据共享。:内存的类型,通常是 "ashmem" (匿名共享内存,常用) 或者 "mmap_fd"。:一个文件描述符fd,指向共享内存。
2024-11-07 11:05:59
247
原创 [Android] NDK 里 ANativeWindow 和 Surface 之间的关系
在MediaCodec里面可以看到 Configure 和 SetSurface 都是接收一个 sp<Surface> 入参的,而回归到 NDK 侧,则可以发现,传递给 AMediaCodec_Configure 和 AMediaCodec_SetSurface 的确是 ANativeWindow 指针,因此 ndk 里面必然进行了某种转换。由此可见, Surface 类是 ANativeWindow 的子类。
2024-08-06 16:59:18
387
原创 [Android] Surface SurfaceView SurfaceHolder 三者之间的关系
Surface 是绘制对象,SurfaceView是一个组件,SurfaceHolder是SurfaceView操作Surface的接口。虽然SurfaceView里面包含Surface,但是SurfaceView无法直接操作Surface,需要借由SurfaceHolder这个接口类来操作。
2024-07-26 14:06:33
347
原创 [FFmpeg] windows下安装带gpu加速的ffmpeg
目前只有 NIVIDIA 支持 ffmpeg 的 gpu加速(AMD貌似也陆续开始支持)。在下述网站中查找自己的显卡能够支持的编解码格式。
2024-07-05 17:38:19
1208
原创 [Qt] Qt for android, gradle-8.3-bin.zip (No such file or directory)
android 工程需要 gradle 作为打包工具,Qt for android 如果想要打包 apk 同样需要使用 gradle,但是 包括 Android studio 在内的诸多 Android IDE 工具都没有自带的 gradle 工具,可能是因为 gradle 的版本迭代较快,因此各个 IDE 均采用从服务器实时下载 gradle 的方式。
2024-07-01 15:13:41
1268
原创 [modern c++] copy elision
有两种对象构造方法,一是在指定内存上构造对象,另一个是先构造一个临时对象,然后把对象拷贝到指定内存上。
2024-07-01 11:22:23
162
原创 [Gstreamer] 消息处理handler的设置
Gstreamer 提供以 GstMessage 和 GstBus 为基础的消息传递机制,所有GstMessage 发送的时候都需要指定 GstBus 用来明确当前 message 将在哪条 Bus 上流转。所有的 GstMessage 最终都会进入一个handler,这个handler函数可以通过两种方式设置 gst_bus_set_sync_handler 和 gst_bus_add_watch。如果没有设置 handler 函数,那么GstMessage将永远不会被处理,从而造成内存泄漏。
2024-06-27 17:24:08
339
原创 [Gstreamer] gstbasesink 里的 jitter
这个值表示当前到达 gstbasesink chain 函数(push mode) 的 GstBuffer 的系统事件 与 这个 buffer 被期望到达的系统时间的差值。jitter 除了被用在配合处理 同步问题外,还被用来处理 qos 问题,比如 qos 的 throttle event type 就需要结合 jitter 的值来进行综合判断。,则表示 GstBuffer 到晚了,当前 GstBuffer 或多或少属于 late了,可能存在被 drop的可能,还需要根据 segment 来做综合判断。
2024-06-26 16:12:02
279
原创 [Gstreamer] gstbasesink 的 QOS 机制
gstreamer里很多element都提供 QOS 机制,src,filter 和 sink 都有。Sink element 的 QOS 机制由 gstbasesink 统一提供。
2024-06-26 09:54:05
307
原创 [modern c++][11] 非类型模板参数
我们再使用 std::get 的时候发现其模板并不是一个类型,而是一个整数值,用来标识从某个位置获取值,比如 std::pair 类型的数据 tmppair,那么就可以通过 std::get(tmppair)来获取key的值,通过 std::get(tmppair)来获取value的值。这就是非类型模板参数的一个用例。非类型模板参数允许我们使用值作为模板类型,这个值可以是整数,引用,指针等等。既然是使用值(左值/右值) 作为模板的某个参数,那么为什么不把这个值直接函数入参传递给函数呢?
2024-06-24 17:39:40
416
原创 [modern c++] 库列表
C++ library headers <algorithm> <iomanip> <list> <ostream> <streambuf> <bitset> <ios> <locale> <queue> <string> <complex> <iosfwd> <map> &l
2024-06-19 11:42:20
377
原创 [modern c++][17] 任意数据类型 any
c++17里引入了std::any类型,这个类型类似于union类型,但是比union功能多且能容纳所有类型(内置类型/自定义类型),同时提供 type 方法用于获取一个 type_info 实例,进而用于准确判断入参的准确类型。
2024-06-19 11:41:22
280
原创 [modern c++][11] 类型描述库 typeindex
头文件:#include typeindex库 包含两个类 std::type_info 和 std::type_index。
2024-06-19 11:28:37
321
原创 [modern c++] 类型萃取 type_traits
type_traits 又叫类型萃取,是一个在编译阶段用于进行类型判断/类型变更的库,在c++11中引入。因为其工作阶段是在编译阶段,因此被大量应用在模板编程中,同时也可以结合 constexpr 这种在编译阶段就进行计算的语句进行编译阶段的运算。
2024-06-19 11:15:22
358
原创 [Android] Binder 里的 Service 和 Interface 分别是什么
在使用 Binder 的时候,会使用到两个常量字符串,一个是 ServiceName ,一个是 InterfaceName,他们格式如下:ServiceName通常不携带 @1.0 这种类似于版本号的东西,InterfaceName会携带。
2024-06-14 19:29:25
395
原创 [modern c++] 如何在h/hpp头文件中定义一个常量,并限制其不被没有include本头文件的编译单元访问到
c++98 提出了匿名namesapce ,所有定义在匿名namespace中的变量都具备内部连接属性,所以可以把续要定义的值放在匿名namespace里,再把相关代码放入源文件里,这样做的缺点在于无法在h/hpp头文件中访问到这些变量,因此头文件无法获知源文件里的值。//1.hpp//错误//由于无法访问cpp中的符号,所以这里没法定义arr的尺寸。//1.cpp。
2024-06-11 16:40:54
363
原创 [modern c++] 使用shared_mutex , shared_lock完成读写锁,Need C++ 17
C++ 17开始,引入了两个新的同步组件, shared_mutex 和 shared_lock ,这两个组件的一个典型使用案例就是实现读写锁。
2024-06-04 10:16:55
441
原创 [Android] MediaCodec configure过程中的 profile 和 level
由于这些值定义在java层,因此流程进入mediacodec 的 native 端后,这些值将以整形的方式存在,所以如果希望获取到具体含义,那么可以通过 jni 来获取这些枚举值的实际意义。Android 的 MediaCodec 组件会在 configure 的过程中携带 profile 和 level 信息,比如。这些信息表明将要到来的stream的编码profile 和 level,因此底层在分配硬件解码器资源的时候是需要结合。分辨率,帧率,profile,level ,编码格式。
2024-05-30 11:23:30
504
原创 [GStreamer] gst_element_link 及 pad 在继承体系中如何存在
pad 是每个 element实例都有的,是 elemenet 之间沟通的代理人,没有 pad 的 element 没法于其他element交流。考虑到gstreamer存在继承体系,那么如果继承类element不在init函数里创建pad,那么在gst_element_link的时候是否可以使用父类element实例的pad呢?下面从源码来找答案。在gstutils.c找到的实现。直接调用同样在gstutils.c,入参为上有element和下游element。实现同样在。
2024-05-24 11:49:14
843
原创 [工程构建] 使用pkg-config协助工程搭建
上面提到的 --cflags 和 --libs 选项是如何获得结果中的信息呢?其实,pkg-config 工作的原理是每个库都要提供自己的 .pc文件,这个文件里描述了在使用这个库时需要用到的链接选项是什么,头文件路径又在哪里。比如。
2024-05-08 14:44:10
549
原创 [Android] 使用 android 自带的 hidl 共享内存接口,Ashmem
Android 提供了 一个共享内存服务 android::hidl::allocator::V1_0::IAllocator / android::hidl::memory::V1_0::IMemory, 通过这个接口可以向 android 直接请求共享内存。使用此方法可以更加方便和安全地在 android 系统中使用共享内存,而不需要使用 posix c 的共享内存模块。
2024-04-29 11:17:16
651
原创 [Android] 基于binder的共享内存
Android里的binder机制是基于共享内存实现的跨进程间通讯,其作为驱动程序为上层应用提供高效的IPC。Android同样提供了基于 binder 的实际内存管理和使用模块。通过这个模块可以按照binder的框架写法直接使用 raw 共享内存。这是 binder 机制的一种共享内存泛化使用,而不仅仅是使用共享内存实现IPC和RPC。
2024-04-28 12:06:56
336
2
原创 [common c++] 为何纯虚父类可以在子类的构造函数初始化列表进行实例化
纯虚类(抽象类) 是只至少拥有一个纯虚函数的类,这种类可以有成员变量,但是不能进行单独的实例化(new,局部变量,智能指针构造等等)。其根本原因是由于纯虚类提供了未实现的成员函数,所以编译器无法知道如何处理这种悬空的成员函数符号表,就好像一个dangling function pointer一样,没有指向任何 .text section。所以一旦授权实例化形成实例,那么就会出现类似于访问悬垂指针的情况。因此是禁止实例化的。
2024-04-23 14:28:03
374
1
TEST6.2.404.485.3.SXANDROID_TVAPP.0.0_Pre_Release.apk.1
2023-08-10
ffmpeg windows sdk 和 动态库
2020-10-17
ffmpeg windows sdk 和 动态库
2020-10-17
vcruntime140_1.dll
2020-05-18
Qt的ts文件转换成excel文件
2020-05-12
ts2excel.exe
2020-05-12
ts2excel.exe
2020-05-12
spring framework reference-4.3.10
2017-07-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人