Android MultiMedia框架——OMX服务启动
Android MultiMedia框架——OMXPlugin
Android MultiMedia框架——MediaCodec编码(上)
Android MultiMedia框架——MediaCodec编码(下)
基于Android9.0 源码分析
hw/android.hardware.media.omx@1.0-service和audioserver进程类似,也是通过init进程加载rc文件的方式,启动service
rc配置文件:frameworks/av/services/mediacodec/android.hardware.media.omx@1.0-service.rc
service vendor.media.omx /vendor/bin/hw/android.hardware.media.omx@1.0-service
class main
user mediacodec
group camera drmrpc mediadrm
ioprio rt 4
writepid /dev/cpuset/foreground/tasks
OMX服务流程图如下:
看一下其内部实现
main_codecservice.cpp
int main(int argc __unused, char** argv)
{
strcpy(argv[0], "media.codec");
signal(SIGPIPE, SIG_IGN);
SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath);
android::ProcessState::initWithDriver("/dev/vndbinder");
android::ProcessState::self()->startThreadPool();
::android::hardware::configureRpcThreadpool(64, false);
// 定制编解码器服务
void *registrantLib = dlopen(
"libmedia_codecserviceregistrant.so",
RTLD_NOW | RTLD_LOCAL);
if (registrantLib) {
RegisterCodecServicesFunc registerCodecServices =
reinterpret_cast<RegisterCodecServicesFunc>(
dlsym(registrantLib, "RegisterCodecServices"));
if (registerCodecServices) {
registerCodecServices();
} else {
LOG(WARNING) << "Cannot register additional services "
"-- corrupted library.";
}
} else {
// Default codec services
using namespace ::android::hardware::media::omx::V1_0;
sp<IOmxStore> omxStore = new implementation::OmxStore();
if (omxStore == nullptr) {
LOG(ERROR) << "Cannot create IOmxStore HAL service.";
} else if (omxStore->registerAsService() != OK) {
LOG(ERROR) << "Cannot register IOmxStore HAL service.";
}
sp<IOmx> omx = new implementation::Omx();
if (omx == nullptr) {
LOG(ERROR) << "Cannot create IOmx HAL service.";
} else if (omx->registerAsService() != OK) {
LOG(ERROR) << "Cannot register IOmx HAL service.";
} else {
LOG(INFO) << "IOmx HAL service created.";
}
}
::android::hardware::joinRpcThreadpool();
}
- strcpy 修改进程名为media.codec;
修改后的进程信息为:
mediacodec 910 1 1 19:08:07 ? 00:00:00 media.codec hw/android.hardware.media.omx@1.0-service - 加载libmedia_codecserviceregistrant.so,判断是否有定制编解码器服务;
- 默认codec services,创建OmxStore,Omx, 分别注册服务;
OmxStore 初始化
查看OMXStore初始化方法
OmxStore::OmxStore(
const char* owner,
const char* const* searchDirs,
const char* mainXmlName,
const char* performanceXmlName,
const char* profilingResultsXmlPath) {
MediaCodecsXmlParser <