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