CallbackDataSource.h revision d49dbd6b625cddb82f3f7bbeac62d48ef338ef0f
199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins/*
299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Copyright 2015 The Android Open Source Project
399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Licensed under the Apache License, Version 2.0 (the "License");
599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * you may not use this file except in compliance with the License.
699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * You may obtain a copy of the License at
799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *      http://www.apache.org/licenses/LICENSE-2.0
999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
1099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Unless required by applicable law or agreed to in writing, software
1199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * distributed under the License is distributed on an "AS IS" BASIS,
1299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * See the License for the specific language governing permissions and
1499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * limitations under the License.
1599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins */
1699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
1799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#ifndef ANDROID_CALLBACKDATASOURCE_H
1899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#define ANDROID_CALLBACKDATASOURCE_H
1999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/stagefright/DataSource.h>
2199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/stagefright/foundation/ADebug.h>
2299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsnamespace android {
2499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsclass IDataSource;
2699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsclass IMemory;
2799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins// A stagefright DataSource that wraps a binder IDataSource. It's a "Callback"
2999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins// DataSource because it calls back to the IDataSource for data.
3099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsclass CallbackDataSource : public DataSource {
3199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinspublic:
3240d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit CallbackDataSource(const sp<IDataSource>& iDataSource);
3399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual ~CallbackDataSource();
3499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
3599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    // DataSource implementation.
3699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual status_t initCheck() const;
3799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual ssize_t readAt(off64_t offset, void *data, size_t size);
3899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual status_t getSize(off64_t *size);
3910551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia    virtual uint32_t flags();
40fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen    virtual void close();
4169d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    virtual String8 toString() {
4269d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        return mName;
4369d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    }
442a5e49c984befa066e966cd9af2303a54976f163Wei Jia    virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL);
45d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung    virtual sp<IDataSource> getIDataSource() const;
4699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
4799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsprivate:
4899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    sp<IDataSource> mIDataSource;
4999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    sp<IMemory> mMemory;
50fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen    bool mIsClosed;
5169d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    String8 mName;
5299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
5399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    DISALLOW_EVIL_CONSTRUCTORS(CallbackDataSource);
5499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins};
5599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
56da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
57da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// A caching DataSource that wraps a CallbackDataSource. For reads smaller
58da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// than kCacheSize it will read up to kCacheSize ahead and cache it.
59da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// This reduces the number of binder round trips to the IDataSource and has a significant
60da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// impact on time taken for filetype sniffing and metadata extraction.
61da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinsclass TinyCacheSource : public DataSource {
62da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinspublic:
6340d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit TinyCacheSource(const sp<DataSource>& source);
64da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
65da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual status_t initCheck() const;
66da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual ssize_t readAt(off64_t offset, void* data, size_t size);
67da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual status_t getSize(off64_t* size);
68da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual uint32_t flags();
69fbe7fcfe818b6f68e352c7c450d4fe15a543b801Marco Nelissen    virtual void close() { mSource->close(); }
7069d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    virtual String8 toString() {
7169d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        return mName;
7269d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    }
732a5e49c984befa066e966cd9af2303a54976f163Wei Jia    virtual sp<DecryptHandle> DrmInitialization(const char *mime = NULL);
74d49dbd6b625cddb82f3f7bbeac62d48ef338ef0fAndy Hung    virtual sp<IDataSource> getIDataSource() const;
75da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
76da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinsprivate:
77da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // 2kb comes from experimenting with the time-to-first-frame from a MediaPlayer
78da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // with an in-memory MediaDataSource source on a Nexus 5. Beyond 2kb there was
79da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // no improvement.
80da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    enum {
81da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins        kCacheSize = 2048,
82da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    };
83da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
84da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    sp<DataSource> mSource;
85da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    uint8_t mCache[kCacheSize];
86da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    off64_t mCachedOffset;
87da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    size_t mCachedSize;
8869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    String8 mName;
89da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
90da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    DISALLOW_EVIL_CONSTRUCTORS(TinyCacheSource);
91da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins};
92da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
9399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}; // namespace android
9499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
9599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#endif // ANDROID_CALLBACKDATASOURCE_H
96