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