120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 163de157dd8f9cd45bf9b0406268f5830887105ae1Chong Zhang//#define LOG_NDEBUG 0 172a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen#define LOG_TAG "DataSourceBase" 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 192a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissen#include <media/DataSourceBase.h> 20607612858f3afad1ade51a098aafa2a41523b5f7Dongwon Kang#include <media/stagefright/foundation/ByteUtils.h> 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MediaErrors.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 262a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt16(off64_t offset, uint16_t *x) { 27693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *x = 0; 28693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 29693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber uint8_t byte[2]; 3034769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber if (readAt(offset, byte, 2) != 2) { 31693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return false; 32693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber } 33693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 34693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber *x = (byte[0] << 8) | byte[1]; 35693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 36693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber return true; 37693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber} 38693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber 392a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt24(off64_t offset, uint32_t *x) { 40ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen *x = 0; 41ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen 42ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen uint8_t byte[3]; 43ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen if (readAt(offset, byte, 3) != 3) { 44ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen return false; 45ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen } 46ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen 47ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen *x = (byte[0] << 16) | (byte[1] << 8) | byte[2]; 48ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen 49ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen return true; 50ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen} 51ec77122351b4e78c1fe5b60a208f76baf8c67591Marco Nelissen 522a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt32(off64_t offset, uint32_t *x) { 5305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen *x = 0; 5405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 5505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen uint32_t tmp; 5605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen if (readAt(offset, &tmp, 4) != 4) { 5705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen return false; 5805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen } 5905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 6005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen *x = ntohl(tmp); 6105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 6205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen return true; 6305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen} 6405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 652a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt64(off64_t offset, uint64_t *x) { 6605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen *x = 0; 6705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 6805f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen uint64_t tmp; 6905f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen if (readAt(offset, &tmp, 8) != 8) { 7005f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen return false; 7105f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen } 7205f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 7305f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen *x = ntoh64(tmp); 7405f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 7505f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen return true; 7605f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen} 7705f625c46b992ab66b8d1527a366fe2746b4e3c7Marco Nelissen 782a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt16Var(off64_t offset, uint16_t *x, size_t size) { 79b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 2) { 80b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return getUInt16(offset, x); 81b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 82b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 1) { 83b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang uint8_t tmp; 84b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (readAt(offset, &tmp, 1) == 1) { 85b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang *x = tmp; 86b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return true; 87b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 88b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 89b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return false; 90b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang} 91b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang 922a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt32Var(off64_t offset, uint32_t *x, size_t size) { 93b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 4) { 94b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return getUInt32(offset, x); 95b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 96b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 2) { 97b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang uint16_t tmp; 98b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (getUInt16(offset, &tmp)) { 99b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang *x = tmp; 100b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return true; 101b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 102b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 103b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return false; 104b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang} 105b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang 1062a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenbool DataSourceBase::getUInt64Var(off64_t offset, uint64_t *x, size_t size) { 107b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 8) { 108b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return getUInt64(offset, x); 109b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 110b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (size == 4) { 111b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang uint32_t tmp; 112b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang if (getUInt32(offset, &tmp)) { 113b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang *x = tmp; 114b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return true; 115b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 116b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang } 117b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang return false; 118b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang} 119b51ca280e6aaace44ec1d80837439b825c6fce82Chong Zhang 1202a243f08193fe9ff1afe018e9953f01c44ced9deMarco Nelissenstatus_t DataSourceBase::getSize(off64_t *size) { 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *size = 0; 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return ERROR_UNSUPPORTED; 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 126b486b52b2b67961073677d583a02269cbdc9a3fcDongwon Kangbool DataSourceBase::getUri(char *uriString __unused, size_t bufferSize __unused) { 127b486b52b2b67961073677d583a02269cbdc9a3fcDongwon Kang return false; 1286511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber} 1296511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 131