blob: 0f5e4ac1ef332b589a93fe19792a1717e0246935 [file] [log] [blame]
/*
* 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;
}