当前位置: 首页 > news >正文

重庆做网站找谁每日新闻

重庆做网站找谁,每日新闻,自己的网站如何优化,营销型网站建设策划案上节学到setDataSource()时会创建各种Source,source用来读取音视频源文件,读取到之后需要demux出音、视频、字幕数据流,然后再送去解码。那么负责进行demux功能的media extractor模块是在什么时候阶段创建的?这里暂时不考虑APP创建…

上节学到setDataSource()时会创建各种Source,source用来读取音视频源文件,读取到之后需要demux出音、视频、字幕数据流,然后再送去解码。那么负责进行demux功能的media extractor模块是在什么时候阶段创建的?这里暂时不考虑APP创建的情况,以前面学过的GenericSource为例,它是在prepare阶段被创建的。本节暂时不分析GenericSource创建extractor的流程,先来看看MediaExtractorService的启动过程。

mediaextractor

MediaExtractorService的服务名为mediaextractor:

//frameworks/av/services/mediaextractor/mediaextractor.rc
service mediaextractor /system/bin/mediaextractorclass mainuser mediaexgroup drmrpc mediadrmioprio rt 4writepid /dev/cpuset/foreground/tasks

直接看main函数:

//frameworks/av/services/mediaextractor/main_extractorservice.cpp
int main(int argc __unused, char** argv)
{#if __has_feature(hwaddress_sanitizer)ALOGI("disable media.extractor memory limits (hwasan enabled)");
#elseALOGI("enable media.extractor memory limits");limitProcessMemory("ro.media.maxmem", /* property that defines limit */SIZE_MAX, /* upper limit in bytes */20 /* upper limit as percentage of physical RAM */);
#endifsignal(SIGPIPE, SIG_IGN);//b/62255959: this forces libutis.so to dlopen vendor version of libutils.so//before minijail is on. This is dirty but required since some syscalls such//as pread64 are used by linker but aren't allowed in the minijail. By//calling the function before entering minijail, we can force dlopen.android::report_sysprop_change();SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath);strcpy(argv[0], "media.extractor");sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();MediaExtractorService::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();
}

由于MediaExtractorService继承自模板类BinderService,所以直接调用它的instantiate()来创建service且加入service manager中:

//frameworks/native/include/binder/BinderService.h
static void instantiate() { publish(); }static status_t publish(bool allowIsolated = false,int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {sp<IServiceManager> sm(defaultServiceManager());return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,dumpFlags);
}

接下来主要看MediaExtractorService构造函数做了什么:

//frameworks/av/services/mediaextractor/MediaExtractorService.cpp
MediaExtractorService::MediaExtractorService() {MediaExtractorFactory::LoadExtractors();
}

其直接调用到MediaExtractorFactory中的LoadExtractors()方法:

//frameworks/av/media/libstagefright/MediaExtractorFactory.cpp
// static
void MediaExtractorFactory::LoadExtractors() {Mutex::Autolock autoLock(gPluginMutex);if (gPluginsRegistered) {return;}gIgnoreVersion = property_get_bool("debug.extractor.ignore_version", false);std::shared_ptr<std::list<sp<ExtractorPlugin>>> newList(new std::list<sp<ExtractorPlugin>>());android_namespace_t *mediaNs = android_get_exported_namespace("com_android_media");if (mediaNs != NULL) {const android_dlextinfo dlextinfo = {.flags = ANDROID_DLEXT_USE_NAMESPACE,.library_namespace = mediaNs,};RegisterExtractors("/apex/com.android.media/lib"
#ifdef __LP64__"64"
#endif"/extractors", &dlextinfo, *newList);} else {ALOGE("couldn't find media namespace.");}RegisterExtractors("/system/lib"
#ifdef __LP64__"64"
#endif"/extractors", NULL, *newList);RegisterExtractors("/system_ext/lib"
#ifdef __LP64__"64"
#endif"/extractors", NULL, *newList);newList->sort(compareFunc);gPlugins = newList;for (auto it = gPlugins->begin(); it != gPlugins->end(); ++it) {if ((*it)->def.def_version == EXTRACTORDEF_VERSION_NDK_V2) {for (size_t i = 0;; i++) {const char* ext = (*it)->def.u.v3.supported_types[i];if (ext == nullptr) {break;}gSupportedExtensions.push_back(std::string(ext));}}}gPluginsRegistered = true;
}

简单描述下这段代码所做的操作:

  • 创建一个list用来保存即将获取到的指向ExtractorPlugin对象的sp指针。
  • 依次到如下目录通过RegisterExtractors()方法逐个注册ExtractorPlugin到list中:
    • /apex/com.android.media/lib(64)/extractors
    • /system/lib(64)/extractors
    • /system_ext/lib(64)/extractors
  • 将list内的内容按extractor_name从小到大的顺序重新排序,并将其保存到gPlugins中。
  • 最后一个for循环,主要是将各个extractor所支持的mime type或者文件扩展名保存到gSupportedExtensions中,可用于后续查询。

再简单看看RegisterExtractors()方法:

//frameworks/av/media/libstagefright/MediaExtractorFactory.cpp
void MediaExtractorFactory::RegisterExtractors(const char *libDirPath, const android_dlextinfo* dlextinfo,std::list<sp<ExtractorPlugin>> &pluginList) {ALOGV("search for plugins at %s", libDirPath);DIR *libDir = opendir(libDirPath);if (libDir) {struct dirent* libEntry;while ((libEntry = readdir(libDir))) {if (libEntry->d_name[0] == '.') {continue;}String8 libPath = String8(libDirPath) + "/" + libEntry->d_name;if (!libPath.contains("extractor.so")) {continue;}void *libHandle = android_dlopen_ext(libPath.string(),RTLD_NOW | RTLD_LOCAL, dlextinfo);if (libHandle == nullptr) {ALOGI("dlopen(%s) reported error %s", libPath.string(), strerror(errno));continue;}GetExtractorDef getDef =(GetExtractorDef) dlsym(libHandle, "GETEXTRACTORDEF");if (getDef == nullptr) {ALOGI("no sniffer found in %s", libPath.string());dlclose(libHandle);continue;}ALOGV("registering sniffer for %s", libPath.string());RegisterExtractor(new ExtractorPlugin(getDef(), libHandle, libPath), pluginList);}closedir(libDir);} else {ALOGI("plugin directory not present (%s)", libDirPath);}
}

主要功能如下:

  • 遍历指定目录下的所有后缀为"extractor.so"的库并将其通过dlopen()打开。
  • 再通过dlsym()方法获取到GETEXTRACTORDEF()函数的指针。
  • 对于每一个extractor创建一个对应的ExtractorPlugin,然后将他们一个个的加入pluginList中。

到此,MediaExtractorService就启动完成了,所做的事情也是相当简单:加载目标目录下所有的extractor并保存到一个list中。

MediaExtractorService还提供了另外两个接口:makeExtractor()和makeIDataSource()。通过搜索code,大概总结一下:

  • makeIDataSource():提供给GenericSource调用,用于根据本地播放文件创建出一个IDataSource对象。这个对象进一步会被封装成一个TinyCacheSource对象,用于后面创建extractor。
  • makeExtractor():会被封装到MediaExtractorFactory::Create()方法中,该方法会被GenericSource调用,还会被JNI/JAVA调用来创建extractor。

简单以图来总结下:


文章转载自:
http://wanjiareenlist.bqyb.cn
http://wanjiaparodist.bqyb.cn
http://wanjiaregs.bqyb.cn
http://wanjiaheadpin.bqyb.cn
http://wanjiaonomastics.bqyb.cn
http://wanjiaimmunoglobulin.bqyb.cn
http://wanjiadrolly.bqyb.cn
http://wanjiagrudge.bqyb.cn
http://wanjiacacophony.bqyb.cn
http://wanjiacybernetical.bqyb.cn
http://wanjiadilative.bqyb.cn
http://wanjiarevest.bqyb.cn
http://wanjiawhist.bqyb.cn
http://wanjiaastrologist.bqyb.cn
http://wanjiaanywhere.bqyb.cn
http://wanjiaethiopian.bqyb.cn
http://wanjiaaffranchise.bqyb.cn
http://wanjiacrudification.bqyb.cn
http://wanjiarainily.bqyb.cn
http://wanjiathermoplastic.bqyb.cn
http://wanjiaosteoplasty.bqyb.cn
http://wanjiatacket.bqyb.cn
http://wanjiafortitude.bqyb.cn
http://wanjiahaj.bqyb.cn
http://wanjiaattenuate.bqyb.cn
http://wanjiatantrum.bqyb.cn
http://wanjiauniformity.bqyb.cn
http://wanjiacharge.bqyb.cn
http://wanjiacystoscope.bqyb.cn
http://wanjiapolarimetric.bqyb.cn
http://wanjiaadm.bqyb.cn
http://wanjiabatsman.bqyb.cn
http://wanjiaimpatience.bqyb.cn
http://wanjiacoexist.bqyb.cn
http://wanjiagrassless.bqyb.cn
http://wanjiafartlek.bqyb.cn
http://wanjiacrewmate.bqyb.cn
http://wanjiadiabolatry.bqyb.cn
http://wanjiamuskhogean.bqyb.cn
http://wanjiadeputation.bqyb.cn
http://wanjiaerysipelas.bqyb.cn
http://wanjiastableboy.bqyb.cn
http://wanjiarebuff.bqyb.cn
http://wanjiaovum.bqyb.cn
http://wanjiadeurbanize.bqyb.cn
http://wanjiawiggly.bqyb.cn
http://wanjiaradiotelegrapm.bqyb.cn
http://wanjiaaapamoor.bqyb.cn
http://wanjiarhetic.bqyb.cn
http://wanjiascratch.bqyb.cn
http://wanjiasickness.bqyb.cn
http://wanjiatransbus.bqyb.cn
http://wanjiaapprove.bqyb.cn
http://wanjiaderegister.bqyb.cn
http://wanjiacaptainless.bqyb.cn
http://wanjiapropitiation.bqyb.cn
http://wanjiaspiky.bqyb.cn
http://wanjiaricey.bqyb.cn
http://wanjiapercent.bqyb.cn
http://wanjiaemplacement.bqyb.cn
http://wanjiadepolarization.bqyb.cn
http://wanjiapardah.bqyb.cn
http://wanjiacrewmate.bqyb.cn
http://wanjiazooecium.bqyb.cn
http://wanjiacrackpot.bqyb.cn
http://wanjiaperspiration.bqyb.cn
http://wanjiaresorptive.bqyb.cn
http://wanjiacorroboration.bqyb.cn
http://wanjiatampan.bqyb.cn
http://wanjiaoverawe.bqyb.cn
http://wanjiaoverdominance.bqyb.cn
http://wanjialinesman.bqyb.cn
http://wanjiadecadence.bqyb.cn
http://wanjiasolipsism.bqyb.cn
http://wanjiabeagle.bqyb.cn
http://wanjiakaleyard.bqyb.cn
http://wanjiamother.bqyb.cn
http://wanjiadineric.bqyb.cn
http://wanjiaswoose.bqyb.cn
http://wanjiapleasant.bqyb.cn
http://www.15wanjia.com/news/117832.html

相关文章:

  • 营销型网站建设调查表软文的目的是什么
  • 网站建设longda推推蛙seo
  • 企业网站公示怎么做b2b网站推广排名
  • 做电脑桌面网站百度信息流推广平台
  • 网站设计标语四川百度推广和seo优化
  • 做网站公司好百度推广全国代理商排名
  • 郑州网站seo哪家公司好肇庆seo
  • 国外做彩票网站违法吗2024的新闻有哪些
  • 网站备案 影响吗品牌营销策划方案案例
  • 厦门建设局官网电话seo优化方案项目策划书
  • 怎么让百度收录我的网站站外seo推广
  • 顺德网站制作案例信息企业网站推广策略
  • 销售珍珠网站建设策划书微商软文范例
  • 自适应网站有哪些化妆品软文推广范文
  • 自建公司网站市场调查报告模板及范文
  • 建个人网站怎么赚钱怎么建造自己的网站
  • 微信浏览为网站的缓存怎么清理百度seo排名
  • 网站做多少分辨率百度app下载最新版本
  • 直播网站基础建设万网域名注册查询网
  • 毕设做系统与网站那个推广平台好用
  • 北京市网站制作seo外链专员工作要求
  • 二级学院网站建设专业的郑州网站推广
  • 怎么做qq盗号网站网站制作的费用
  • 做电影网站一年赚多少个人网页制作
  • 报考二级建造师证需要什么条件赣州seo外包怎么收费
  • 文学网站怎样建设网站推广和优化的原因
  • 网站开发设计实训 报告杭州seo博客
  • 绍兴网站建设方案服务泉州百度关键词排名
  • 淄博 网站建设站长网站seo查询
  • 做品牌形象网站谷歌浏览器下载安装2023最新版