1e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber/* 2e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 4e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * you may not use this file except in compliance with the License. 6e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * You may obtain a copy of the License at 7e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 8e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * 10e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * Unless required by applicable law or agreed to in writing, software 11e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * See the License for the specific language governing permissions and 14e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber * limitations under the License. 15e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber */ 16e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 17e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#ifndef CACHING_DATASOURCE_H_ 18e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 19e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#define CACHING_DATASOURCE_H_ 20e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 21e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/DataSource.h> 22e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <media/stagefright/MediaErrors.h> 23e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#include <utils/threads.h> 24e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 25e46b7be812d68e49710b34048662cbf18e2a6550Andreas Hubernamespace android { 26e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 27e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberclass CachingDataSource : public DataSource { 28e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberpublic: 29be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber CachingDataSource( 30be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber const sp<DataSource> &source, size_t pageSize, int numPages); 31e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 329a12baf929ea803915d7ab626b200ffefb4fbac7Andreas Huber virtual status_t initCheck() const; 33e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 349a12baf929ea803915d7ab626b200ffefb4fbac7Andreas Huber virtual ssize_t readAt(off_t offset, void *data, size_t size); 35e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 368cc1b2a32c434b237fa95dc9f81261887fdb1cf4Andreas Huber virtual status_t getSize(off_t *size); 378cc1b2a32c434b237fa95dc9f81261887fdb1cf4Andreas Huber 38b9e63830c69231c53dc23a5e29f5b58a1d9d3668Andreas Huber virtual uint32_t flags(); 39b9e63830c69231c53dc23a5e29f5b58a1d9d3668Andreas Huber 40be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huberprotected: 41be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber virtual ~CachingDataSource(); 42be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber 43e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huberprivate: 44e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber struct Page { 45e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Page *mPrev, *mNext; 46e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber off_t mOffset; 47e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber size_t mLength; 48e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void *mData; 49e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber }; 50e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 51be06d26cdc70070654f1eedcd08c1c68cd587ad6Andreas Huber sp<DataSource> mSource; 52e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber void *mData; 53e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber size_t mPageSize; 54e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Page *mFirst, *mLast; 55e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 56e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Page *allocate_page(); 57e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 58e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber Mutex mLock; 59e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 60e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CachingDataSource(const CachingDataSource &); 61e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber CachingDataSource &operator=(const CachingDataSource &); 62e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber}; 63e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 64e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber} // namespace android 65e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber 66e46b7be812d68e49710b34048662cbf18e2a6550Andreas Huber#endif // CACHING_DATASOURCE_H_ 67