CallbackDataSource.h revision da7e453e1d1c77959822cf9602ddfed1c50be445
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:
3299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    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);
3999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
4099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsprivate:
4199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    sp<IDataSource> mIDataSource;
4299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    sp<IMemory> mMemory;
4399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
4499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    DISALLOW_EVIL_CONSTRUCTORS(CallbackDataSource);
4599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins};
4699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
47da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
48da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// A caching DataSource that wraps a CallbackDataSource. For reads smaller
49da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// than kCacheSize it will read up to kCacheSize ahead and cache it.
50da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// This reduces the number of binder round trips to the IDataSource and has a significant
51da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins// impact on time taken for filetype sniffing and metadata extraction.
52da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinsclass TinyCacheSource : public DataSource {
53da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinspublic:
54da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    TinyCacheSource(const sp<DataSource>& source);
55da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
56da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual status_t initCheck() const;
57da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual ssize_t readAt(off64_t offset, void* data, size_t size);
58da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual status_t getSize(off64_t* size);
59da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    virtual uint32_t flags();
60da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
61da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkinsprivate:
62da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // 2kb comes from experimenting with the time-to-first-frame from a MediaPlayer
63da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // with an in-memory MediaDataSource source on a Nexus 5. Beyond 2kb there was
64da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    // no improvement.
65da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    enum {
66da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins        kCacheSize = 2048,
67da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    };
68da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
69da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    sp<DataSource> mSource;
70da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    uint8_t mCache[kCacheSize];
71da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    off64_t mCachedOffset;
72da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    size_t mCachedSize;
73da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
74da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins    DISALLOW_EVIL_CONSTRUCTORS(TinyCacheSource);
75da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins};
76da7e453e1d1c77959822cf9602ddfed1c50be445Chris Watkins
7799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}; // namespace android
7899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
7999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#endif // ANDROID_CALLBACKDATASOURCE_H
80