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