11900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen/* 21900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** 3c9ea2114a26470e0f3b010392132b5394d358031Jeff Vander Stoep** Copyright 2016, The Android Open Source Project 41900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** 51900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** Licensed under the Apache License, Version 2.0 (the "License"); 61900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** you may not use this file except in compliance with the License. 71900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** You may obtain a copy of the License at 81900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** 91900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** http://www.apache.org/licenses/LICENSE-2.0 101900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** 111900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** Unless required by applicable law or agreed to in writing, software 121900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** distributed under the License is distributed on an "AS IS" BASIS, 131900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 141900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** See the License for the specific language governing permissions and 151900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen** limitations under the License. 161900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen*/ 171900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen 181900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <fcntl.h> 191900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <sys/prctl.h> 201900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <sys/wait.h> 211900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <binder/IPCThreadState.h> 221900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <binder/ProcessState.h> 231900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include <binder/IServiceManager.h> 24033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa#include <cutils/properties.h> 251900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen 2680959a7c89e310b74c7e3a68d7f80ceac7a1574dJorge Lucangeli Obes#include <string> 2780959a7c89e310b74c7e3a68d7f80ceac7a1574dJorge Lucangeli Obes 28fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes#include <android-base/logging.h> 29fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes 301900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen// from LOCAL_C_INCLUDES 311900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen#include "MediaCodecService.h" 32fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes#include "minijail.h" 331900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen 349c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <hidl/HidlTransportSupport.h> 3504563aafa0debc95d50951ca944abf37ef2777cePawin Vongmasa#include <omx/1.0/Omx.h> 3652257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa#include <omx/1.0/OmxStore.h> 37033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa 381900e77bac4276f247f80fd06d19316cac598f57Marco Nelissenusing namespace android; 391900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen 40fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes// Must match location in Android.mk. 4179234e4a1317167b23482024bf060080af04f257Jeff Vander Stoepstatic const char kSystemSeccompPolicyPath[] = 4279234e4a1317167b23482024bf060080af04f257Jeff Vander Stoep "/system/etc/seccomp_policy/mediacodec.policy"; 4379234e4a1317167b23482024bf060080af04f257Jeff Vander Stoepstatic const char kVendorSeccompPolicyPath[] = 4479234e4a1317167b23482024bf060080af04f257Jeff Vander Stoep "/vendor/etc/seccomp_policy/mediacodec.policy"; 45fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes 461900e77bac4276f247f80fd06d19316cac598f57Marco Nelissenint main(int argc __unused, char** argv) 471900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen{ 48fbfb8e8b9a7e6a2d351b28bfd8cdd3dacd10e975Jorge Lucangeli Obes LOG(INFO) << "mediacodecservice starting"; 496772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev bool treble = property_get_bool("persist.media.treble_omx", true); 506772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev if (treble) { 516772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev android::ProcessState::initWithDriver("/dev/vndbinder"); 526772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev } 536772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev 541900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen signal(SIGPIPE, SIG_IGN); 5579234e4a1317167b23482024bf060080af04f257Jeff Vander Stoep SetUpMinijail(kSystemSeccompPolicyPath, kVendorSeccompPolicyPath); 561900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen 571900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen strcpy(argv[0], "media.codec"); 589c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa 599c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa ::android::hardware::configureRpcThreadpool(64, false); 601900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen sp<ProcessState> proc(ProcessState::self()); 61033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa 626772cfb5ac55fca9a31ce6a91855f6e8d14e18beIliyan Malchev if (treble) { 63033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa using namespace ::android::hardware::media::omx::V1_0; 6452257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa sp<IOmxStore> omxStore = new implementation::OmxStore(); 6552257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa if (omxStore == nullptr) { 6652257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa LOG(ERROR) << "Cannot create IOmxStore HAL service."; 6752257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa } else if (omxStore->registerAsService() != OK) { 6852257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa LOG(ERROR) << "Cannot register IOmxStore HAL service."; 694271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa } 704271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa sp<IOmx> omx = new implementation::Omx(); 714271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa if (omx == nullptr) { 724271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa LOG(ERROR) << "Cannot create IOmx HAL service."; 734271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa } else if (omx->registerAsService() != OK) { 744271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa LOG(ERROR) << "Cannot register IOmx HAL service."; 75033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa } else { 764271c82efd7c59f6e75e09fa748769bad4cfeee2Pawin Vongmasa LOG(INFO) << "Treble OMX service created."; 77033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa } 789c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa } else { 799c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa MediaCodecService::instantiate(); 8052257b75115135821bba562ac35c0c6325a1e100Pawin Vongmasa LOG(INFO) << "Non-Treble OMX service created."; 81033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa } 82033975f9afa776fab47c027c0b3b80c438216d77Pawin Vongmasa 831900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen ProcessState::self()->startThreadPool(); 841900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen IPCThreadState::self()->joinThreadPool(); 851900e77bac4276f247f80fd06d19316cac598f57Marco Nelissen} 86