自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

我的博客

我的博客

  • 博客(48)
  • 资源 (3)
  • 收藏
  • 关注

原创 gst_pad_query_default以及gst_pad_event_default

1、GST_QUERY_SCHEDULING,条件forward = GST_PAD_IS_PROXY_SCHEDULING (pad);也就是获取当前pad的内部linked的pad,这里可以看到是调用pad的GST_PAD_ITERINTLINKFUNC。2、GST_QUERY_ALLOCATION,条件GST_PAD_IS_PROXY_ALLOCATION (pad);那么内部流动就会出现问题了?那我们再看下默认函数gst_pad_iterate_internal_links_default。

2025-05-30 11:06:25 233

原创 gstreamer之gst_element_add_pad/gst_element_remove_pad

(1)会被保存在element->srcpads 或者element->sinkpads (2)会去check for active pads,也就是如果pad是非active,但是当前elemnt是如下state,则需要激活pad。

2025-04-03 10:53:04 203

原创 gstreamer之playbin切流(音轨、视频轨、字幕轨)剖析

(channels = group->audio_channels)),重点变量,channels是一个数组,存储的是inputselector的sinkpad。group->combiner[PLAYBIN_STREAM_AUDIO].has_active_pad),combiner(也就是inputselector)是有“active-pad”。(5)if ((combiner = gst_pad_get_parent (sinkpad))),通过sinkpad获取inpuselector元素实例。

2025-03-31 09:51:02 593

原创 MP4在线解析工具

MP4Box.js - JavaScript MP4 Reader/Fragmenter

2025-03-24 19:35:52 137

原创 AV1 Codec ISO Media File Format Binding 规范,定义了如何在基于 ISO BMFF(ISO Base Media File Format) 的容器(如 MP4)

网站:w​​​​​​​AV1 Codec ISO Media File Format Binding

2025-03-24 19:32:54 112

原创 gstreamer基本知识点总结

没有独立的总线,其内部元素的消息会直接传递到。子管道内部元素的消息会发送到子管道的总线,

2025-03-24 11:43:10 371

原创 gstreamer之GstBaseSink源码剖析

如果是PULL模式,gst_base_sink_pad_activate_pull中调用gst_base_sink_default_activate_pull启动gst_base_sink_loop线程循环处理数据。(2)gst_base_sink_do_preroll ,如果需要need_preroll,怎会调用preroll处理数据。5.qos处理gst_base_sink_perform_qos (qos_enabled 开关)补充说明:gst_base_sink_default_event。

2025-03-19 15:53:55 829

原创 gstreamer之GstTask源码剖析

通过@gst_task_new创建任务,会在独立线程循环调用@GstTaskFunction,实现数据处理。 通过gst_task_start/gst_task_pause/gst_task_stop/gst_task_set_state等方法管控任务task。其中gst_task_set_state->gst_task_set_state_unlocked,然后会调用start_task启动任务。如下代码也就是在线程池中执行 gst_task_func函数。也就是gsttask机制

2025-03-19 14:09:55 262

原创 gstreamer之GstVideoDecoder源码剖析

gst_video_decoder_have_frame,其中关键流程会调用gst_video_decoder_decode_frame继而调用到decoder_class->handle_frame,完成解码。set_format调用在gst_video_decoder_sink_event_default->gst_video_decoder_setcaps。其中gst_video_decoder_add_to_frame会将数据push到priv->output_adapter中。

2025-03-17 19:26:48 862

原创 gstreamer之typefind源码剖析

a)关键流程gst_type_find_get_extension,获取uri后缀结尾,如.mp3,然后调用gst_type_find_helper_get_range_full去识别数据格式found_caps。一样流程gst_type_find_get_extension->gst_type_find_helper_for_data_with_extension识别到caps,然后切换到MODE_NORMAL阶段。三者没有本质区别,最终都是通过gst_type_find_register注册。

2025-03-07 11:50:52 599

原创 Source插件之GstBaseSrc/GstPushSrc源码剖析

然后调用gst_pad_activate_mode(srcpad),然后调用GST_PAD_ACTIVATEMODEFUNC(GST_PAD_ACTIVATEMODEFUNC),也就调用到了basesrc中。init中我们看到注册了gst_pad_set_activatemode_function (pad, gst_base_src_activate_mode)函数。其实是必须要调用gst_base_src_start,但是首先可以看到查询函数gst_base_src_default_query。

2025-03-05 17:33:36 815

原创 gstreamer之gst_pad_link/gst_element_link源码剖析

(1)如果GST_PAD_PEER (srcpad)/GST_PAD_PEER (sinkpad)已经存在了,则GST_PAD_LINK_WAS_LINKED,说明pad already linked.a)GST_PAD_LINK_CHECK_CAPS是默认值,通过gst_pad_query_caps查询srcpad和sinkpad的caps。(2)prepare pad link实现函数gst_pad_link_prepare。相关的回调函数类型。2.函数gst_pad_link_prepare。

2025-03-03 14:17:23 868

原创 playbin之Source插件加载流程源码剖析

(6)那我们继续看下gst_element_make_from_uri中的关键步骤 possibilities = get_element_factories_from_uri_protocol (type, protocol)->gst_registry_feature_filter。(2)possibilities = get_element_factories_from_uri_protocol (type, protocol),从注册表中搜索可匹配上的source的lists。

2025-03-03 11:01:28 430

原创 playbin之autoplug_factories源码剖析

也就是同过gst_element_factory_list_get_elements从registry中获取type是GST_ELEMENT_FACTORY_TYPE_DECODABLE,GST_ELEMENT_FACTORY_TYPE_AUDIOVIDEO_SINKS,优先级高于GST_RANK_MARGINAL的factory。1.gst_play_bin_update_elements_list函数,创建可用的factories列表playbin->elements(

2025-02-28 17:43:55 514

原创 gstreamer之playbin源码剖析

gstreamer playbin decodebin uridecodebin

2025-02-26 16:02:18 576

原创 gstreamer插件注册流程剖析

这里会创建plugin对象,然后调用gst_plugin_register_func,从而调用到plugin_init,也就是插件中实现的plugin_init,从而调用到GST_ELEMENT_REGISTER。宏GST_PLUGIN_DEFINE定义了两个函数,解析出来如下,这个函数会在gst_init流程中执行,然后注册对应的插件,后面详细解析该流程。看下gst_registry_get就获取一个静态全局变量_gst_registry_default,用来保存插件的注册信息。

2025-02-25 21:27:28 860

原创 安卓native层抓trace

方法可以参考(simpleperf record -t $PID --duration 30 -o /data/perf.data --call-graph dwarf)(注意浏览器,可用 Microsoft Edge版本 131.0.2903.99 (正式版本) (64 位))#define ATRACE_TAG ATRACE_TAG_ALWAYS //要指定tag。

2024-12-21 17:03:14 345

原创 Native层skia创建gpu surface渲染方法

skia native gpu

2024-12-21 16:53:43 223

原创 VLC搭建简单流媒体服务器(RTSP/HTTP/RTP)

(待补充)

2024-07-31 09:14:12 533

原创 pthread在自己创建的线程中执行pthread_jion并不会死锁

函数pthread_join()函数挂起调用线程的执行,直到目标线程之三结束为止,除非目标线程已经终止。实际上这种情况他会直接返回并不会一直阻塞!!!

2024-06-15 11:19:45 305

原创 gstreamer根据GstDebugCategory设置打印等级

【代码】gstreamer根据GstDebugCategory设置打印等级。

2024-06-03 16:52:38 150

原创 安卓动态库加载

查找which的依赖库。

2024-05-30 17:52:21 539

原创 文件句柄fd赋值

将一个那文件句柄赋值另一个变量需要使用dup():细节待补充。。。

2024-03-27 21:27:59 164

原创 playbin获取节目duration流程分析

playsink没有实现duration的查询,但是其内部的sink,如audiosink继承了gstbasesink。第二种直接使用gst_pad_peer_query查询。b)迭代器获取srcpad。第一种适用于pull模式。a)迭代器获取sink。继续分析下上面的细节。

2024-03-26 21:06:26 332

原创 如何判断对象指针已经释放-指针的引用

1)指针的引用作为函数参数,当实参指针被设置NULL,函数内部可以使用NULL来判断。1)将一个指针赋值给另一个指针,也就是智能指针作为函数参数时候,引用计数会增加。当调用shared_ptr.reset()时候,并不会导致形参被设置NULL。1.使用智能指针shared_ptr。

2024-03-26 20:17:18 482

原创 gstreamer ffmpeg avlog日志重定位到安卓log

【代码】gstreamer ffmpeg avlog日志重定位到安卓log。

2024-03-15 17:58:41 192

原创 tunnel模式audiotrack每笔数据需要送入同步头

这个header包含一个起始码,pts(nano sec),和数据的size。再写入audio数据前先写入这个header data。需要在音频写入audiotrack的时候在头部插入一个16 byte的avsync header。

2024-02-27 18:05:54 384

原创 获取JPEG文件中的EXIF信息旋转角度

【代码】获取JPEG文件中的EXIF信息旋转角度。

2023-12-28 17:41:29 841

原创 安卓快速模块编译

dninja + 目标。

2023-11-22 15:53:45 267 1

原创 libtool使用-Wl,-Bstatic失败

如上代码通过修改-Wl,-Bstatic -ljpeg实现静态依赖libjpeg,但是编译之后仍然是依赖动态库libjpeg.so,打印命令也是正常的。-Wl,-Bstatic -ljpeg为一个指令,也是就没有将-ljpeg是为Wl后面的参数,导致问题。libtool: link:的可以看到。-Bstatic,ljpeg 或者。发现问题了,link没有正常识别。对Wl的使用不太规范。

2023-10-16 12:36:41 255 1

原创 安卓通过Parcel传递Surface到native层(Mediaplayer.java)

因为parcel中默认添加了一个name字段,因为这里是第一次读取这个parcel,设置false后是surfaceShim.readFromParcel会去取这个name字段,不影响后读取surface字段。可以获取到graphicBufferProducer 了。使用MediaPlayer中的。备注:这里要设置false。

2023-09-19 17:45:21 217

原创 c++、c基础

1.文件句柄复制/赋值需要使用dup()/dup2(),不能直接使用“=”。

2023-09-18 14:04:40 74 1

原创 This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open 问题

android.injected.studio.version.check=false”这行代码加进去,修改“gradle.properties”文件。

2023-09-07 20:03:34 170 1

原创 android 接调用skia库绘图

【代码】android 接调用skia库绘图。

2023-07-26 10:15:03 609 1

原创 安卓预置apk/so权限

权限添加:/system/etc/permissions/privapp-permissions-platform.xml。权限添加:/vendor/etc/permissions $ privapp-permissions-vendor.xml。so白名单:/system/etc # public.libraries.txt。预置:/system $ priv-app。预置:/vendor $ priv-app。

2023-06-27 11:16:28 371 1

原创 把gstreamer插件androidmedia的3个java编译成jar

【代码】把gstreamer插件androidmedia的3个java编译成jar。

2023-06-26 21:04:53 197 1

原创 gradlew makejar报错Android Gradle plugin requires Java 11 to run

错误:修改方法:修改后,仍报错修改后,仍报错3、项目根目录下:文件(gradle.properties)添加代码:修改后可以。

2023-06-25 11:42:56 390

原创 安卓高版本c/c++调用java,通过JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例

c/c++调用java;JNI_CreateJavaVM/JNI_GetCreatedJavaVMs创建虚拟机实例;libnativehelper;JNI_CreateJavaVM运行挂载libart

2023-06-21 10:09:30 2044 2

原创 elf 分析工具 readelf/nm/objdump

elf 分析工具 readelf/nm/objdump

2023-06-14 11:10:32 460

原创 ld链接器基本命令

通过-Wl,--exclude-libs,libssl.a -Wl,--exclude-libs,libcrypto.a 设置链接器命令

2023-06-14 10:54:07 800

传感器的原理与应用研究

传感器的原理与应用研究

2014-05-27

视频中运动目标跟踪简介

视频中运动目标跟踪简介

2012-10-30

空空如也

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

TA关注的人

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