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