120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "OMXClient"
19f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung
20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__
21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif
23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
259c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa#include <cutils/properties.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h>
2823858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen#include <media/IMediaCodecService.h>
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h>
30e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
31ac7d4125516299b8a3e6f2b25822a692bdd96311Pawin Vongmasa#include <media/IOMX.h>
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33ac7d4125516299b8a3e6f2b25822a692bdd96311Pawin Vongmasa#include <media/omx/1.0/WOmx.h>
3494e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
37408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() {
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
409f3f8dd774753c5ed2dfabde65d440182bfaa02eElliott Hughesstatus_t OMXClient::connect() {
41cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    return connect("default", nullptr);
429f3f8dd774753c5ed2dfabde65d440182bfaa02eElliott Hughes}
439f3f8dd774753c5ed2dfabde65d440182bfaa02eElliott Hughes
449c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasastatus_t OMXClient::connect(bool* trebleFlag) {
45d4e9ca49a3863beeb0027f51e2331e4c5ec2402bPawin Vongmasa    if (property_get_bool("persist.media.treble_omx", true)) {
469c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        if (trebleFlag != nullptr) {
479c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa            *trebleFlag = true;
489c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        }
499c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        return connectTreble();
509c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    }
519c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    if (trebleFlag != nullptr) {
529c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa        *trebleFlag = false;
539c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    }
549c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    return connectLegacy();
559c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa}
569c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa
57cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasastatus_t OMXClient::connect(const char* name, bool* trebleFlag) {
58cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    if (property_get_bool("persist.media.treble_omx", true)) {
59cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa        if (trebleFlag != nullptr) {
60cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa            *trebleFlag = true;
61cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa        }
62cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa        return connectTreble(name);
63cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    }
64cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    if (trebleFlag != nullptr) {
65cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa        *trebleFlag = false;
66cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    }
67cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    return connectLegacy();
68cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa}
69cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa
709c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasastatus_t OMXClient::connectLegacy() {
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IServiceManager> sm = defaultServiceManager();
7223858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    sp<IBinder> codecbinder = sm->getService(String16("media.codec"));
7323858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    sp<IMediaCodecService> codecservice = interface_cast<IMediaCodecService>(codecbinder);
7423858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen
7523858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    if (codecservice.get() == NULL) {
7623858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        ALOGE("Cannot obtain IMediaCodecService");
7723858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        return NO_INIT;
7823858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    }
7923858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen
80d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    mOMX = codecservice->getOMX();
81d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    if (mOMX.get() == NULL) {
8223858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        ALOGE("Cannot obtain mediacodec IOMX");
8323858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen        return NO_INIT;
8423858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen    }
8523858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
89cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasastatus_t OMXClient::connectTreble(const char* name) {
9094e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    using namespace ::android::hardware::media::omx::V1_0;
91cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    if (name == nullptr) {
92cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa        name = "default";
93cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    }
94cbdeea977b79c41910b004cffcb80d81265853e8Pawin Vongmasa    sp<IOmx> tOmx = IOmx::getService(name);
9594e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    if (tOmx.get() == nullptr) {
9694e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa        ALOGE("Cannot obtain Treble IOmx.");
9794e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa        return NO_INIT;
9894e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    }
9994e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    if (!tOmx->isRemote()) {
10094e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa        ALOGE("Treble IOmx is in passthrough mode.");
10194e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa        return NO_INIT;
10294e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    }
10394e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    mOMX = new utils::LWOmx(tOmx);
1049c47c97ecac581d66b6febafd156618247e86742Pawin Vongmasa    ALOGI("Treble IOmx obtained");
10594e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa    return OK;
10694e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa}
10794e36c5607ec15e4c9a1dff56ca23d4001b932b3Pawin Vongmasa
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() {
109d59b97223424a3974d2ac31cff998d02eecf2eedChong Zhang    mOMX.clear();
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
113