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