/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <dcf/DrmDcfCommon.h> int64_t ntoh_int64(int64_t x) { return (((int64_t)(ntohl((int32_t)((x << 32) >> 32))) << 32) | (uint32_t)ntohl(((int32_t)(x >> 32)))); } /** * Class: Box */ Box::Box(const uint8_t* box):mLargeSize(0),mUserType(NULL) { if(!box) { return ; } const uint8_t* p = box; /* Get the size value */ mSize = ntohl(*(uint32_t *)p); p += sizeof(mSize); /* Get the type value */ mType = *((uint32_t *)p); p += sizeof(mType); if (1 == mSize) { mLargeSize = ntoh_int64(*(uint64_t *)p); p += sizeof(mLargeSize); } if (DCF_USER_TYPE == mType) { mUserType = new uint8_t[USER_TYPE_LEN]; memcpy(mUserType, p, USER_TYPE_LEN); p += USER_TYPE_LEN; } mBoxLength = p - box; } Box::Box(const Box& other) { mSize = other.mSize; mType = other.mType; mLargeSize = other.mLargeSize; mUserType = NULL; if(other.mUserType) { mUserType = new uint8_t[USER_TYPE_LEN]; memcpy(mUserType,other.mUserType,USER_TYPE_LEN); } } Box& Box::operator=(const Box& other) { if(this == &other) { return *this; } if(mUserType) { delete []mUserType; mUserType = NULL; } if(other.mUserType) { mUserType = new uint8_t[USER_TYPE_LEN]; memcpy(mUserType, other.mUserType, USER_TYPE_LEN); } return *this; } Box::~Box() { if(mUserType) { delete []mUserType; mUserType = NULL; } } uint64_t Box::getSize(void) const { if(1 == mSize) { return mLargeSize; } return mSize; } uint32_t Box::getType(void) const { return mType; } const uint8_t* Box::getUsertype(void) const { return mUserType; } uint32_t Box::getLen(void) const { return mBoxLength; } /** * Class: FullBox */ FullBox::FullBox(const uint8_t* fullBox) : Box(fullBox) { if(!fullBox) { return ; } const uint8_t* p = fullBox; p += Box::getLen(); mVersion = *p; p++; memcpy(mFlag, p,FLAG_LEN); p += FLAG_LEN; mFullBoxLength = p - fullBox; } uint8_t FullBox::getVersion(void) const { return mVersion; } const uint8_t* FullBox::getFlag(void) const { return mFlag; } uint32_t FullBox::getLen(void) const { return mFullBoxLength; } ///// class TextualHeader implementation TextualHeader::TextualHeader(const string& inData) { string::size_type loc1 = inData.find(":", 0); if (loc1 != string::npos) { name.assign(inData, 0, loc1); } string::size_type loc2 = inData.find(";", loc1 + 1); if (loc2 != string::npos) { value.assign(inData, loc1 + 1, loc2 - loc1 - 1); param.assign(inData, loc2 + 1, inData.length() - loc2 - 1); } else { value.assign(inData, loc1 + 1, inData.length() - loc1 - 1); } } string TextualHeader::getName() const { return name; } string TextualHeader::getValue() const { return value; } string TextualHeader::getParam() const { return param; }