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