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