1d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung/* 2d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * Copyright 2016, The Android Open Source Project 3d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * 4d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * Licensed under the Apache License, Version 2.0 (the "License"); 5d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * you may not use this file except in compliance with the License. 6d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * You may obtain a copy of the License at 7d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * 8d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * http://www.apache.org/licenses/LICENSE-2.0 9d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * 10d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * Unless required by applicable law or agreed to in writing, software 11d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * distributed under the License is distributed on an "AS IS" BASIS, 12d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * See the License for the specific language governing permissions and 14d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung * limitations under the License. 15d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung */ 16d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 17d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#ifndef REMOTE_DATA_SOURCE_H_ 18d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#define REMOTE_DATA_SOURCE_H_ 19d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 20d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#include <binder/IMemory.h> 21d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#include <binder/MemoryDealer.h> 22d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#include <media/IDataSource.h> 23d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#include <media/stagefright/DataSource.h> 24d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 25d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hungnamespace android { 26d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 27d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung// Originally in MediaExtractor.cpp 28d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hungclass RemoteDataSource : public BnDataSource { 29d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hungpublic: 30d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung static sp<IDataSource> wrap(const sp<DataSource> &source) { 31d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (source.get() == nullptr) { 32d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return nullptr; 33d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 34d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (source->getIDataSource().get() != nullptr) { 35d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return source->getIDataSource(); 36d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 37d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return new RemoteDataSource(source); 38d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 39d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 40d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual ~RemoteDataSource() { 41d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung close(); 42d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 43d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual sp<IMemory> getIMemory() { 44d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mMemory; 45d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 46d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual ssize_t readAt(off64_t offset, size_t size) { 47d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung ALOGV("readAt(%lld, %zu)", (long long)offset, size); 48d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (size > kBufferSize) { 49d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung size = kBufferSize; 50d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 51d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mSource->readAt(offset, mMemory->pointer(), size); 52d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 53d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual status_t getSize(off64_t *size) { 54d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mSource->getSize(size); 55d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 56d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual void close() { 57009ff0dd59732f0c389d172edb26942c35422e3aDongwon Kang // Protect strong pointer assignments. This also can be called from the binder 58009ff0dd59732f0c389d172edb26942c35422e3aDongwon Kang // clean-up procedure which is running on a separate thread. 59009ff0dd59732f0c389d172edb26942c35422e3aDongwon Kang Mutex::Autolock lock(mCloseLock); 60d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung mSource = nullptr; 61d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung mMemory = nullptr; 62d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 63d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual uint32_t getFlags() { 64d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mSource->flags(); 65d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 66d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual String8 toString() { 67d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mName; 68d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 69d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung virtual sp<DecryptHandle> DrmInitialization(const char *mime) { 70d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung return mSource->DrmInitialization(mime); 71d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 72d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 73d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hungprivate: 74d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung enum { 75d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung kBufferSize = 64 * 1024, 76d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung }; 77d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 78d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung sp<IMemory> mMemory; 79d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung sp<DataSource> mSource; 80d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung String8 mName; 81009ff0dd59732f0c389d172edb26942c35422e3aDongwon Kang Mutex mCloseLock; 82d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 83d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung explicit RemoteDataSource(const sp<DataSource> &source) { 84d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung mSource = source; 85d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung sp<MemoryDealer> memoryDealer = new MemoryDealer(kBufferSize, "RemoteDataSource"); 86d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung mMemory = memoryDealer->allocate(kBufferSize); 87d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung if (mMemory.get() == nullptr) { 88d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung ALOGE("Failed to allocate memory!"); 89d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 90d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung mName = String8::format("RemoteDataSource(%s)", mSource->toString().string()); 91d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung } 92d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 93d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung DISALLOW_EVIL_CONSTRUCTORS(RemoteDataSource); 94d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung}; 95d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 96d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung} // namespace android 97d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung 98d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung#endif // REMOTE_DATA_SOURCE_H_ 99