mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-29 15:06:09 +00:00
93 lines
3 KiB
C++
93 lines
3 KiB
C++
/** \file atom_ohdr.cpp
|
|
|
|
\author Danijel Kopcinovic (danijel.kopcinovic@adnecto.net)
|
|
*/
|
|
|
|
#include "mp4common.h"
|
|
|
|
/*! \brief Patch class for read/write operations when string is 0-length.
|
|
|
|
We want to use string property, but mpeg4ip doesn't support ohdr way of
|
|
encoding of string (in ohdr atom we first have 3 lengths of 3 strings and
|
|
then their string values, and it cannot be simulated with any of the
|
|
current mpeg4ip string property parameters), so we have to write our own
|
|
Read() and Write() routines.
|
|
*/
|
|
class OhdrMP4StringProperty: public MP4StringProperty {
|
|
public:
|
|
/*! \brief Constructor.
|
|
|
|
\param name name of the property.
|
|
\param useCountedFormat counted format flag.
|
|
\param useUnicode unicode flag.
|
|
*/
|
|
OhdrMP4StringProperty(char* name, bool useCountedFormat = false,
|
|
bool useUnicode = false): MP4StringProperty(name, useCountedFormat,
|
|
useUnicode) {
|
|
}
|
|
|
|
/*! \brief Read property from file.
|
|
|
|
\param pFile input, file handle.
|
|
\param index input, index to read.
|
|
*/
|
|
void Read(MP4File* pFile, u_int32_t index = 0) {
|
|
MP4Free(m_values[index]);
|
|
m_values[index] = (char*)MP4Calloc(m_fixedLength + 1);
|
|
(void)pFile->ReadBytes((u_int8_t*)m_values[index], m_fixedLength);
|
|
}
|
|
|
|
/*! \brief Write property to file.
|
|
|
|
\param pFile input, file handle.
|
|
\param index input, index to write.
|
|
*/
|
|
void Write(MP4File* pFile, u_int32_t index = 0) {
|
|
pFile->WriteBytes((u_int8_t*)m_values[index], m_fixedLength);
|
|
}
|
|
};
|
|
|
|
/*! \brief OMA DRM headers atom.
|
|
|
|
Contained in OMA DRM key management atom. It must contain content identifier.
|
|
*/
|
|
/*! \brief Constructor.
|
|
*/
|
|
MP4OhdrAtom::MP4OhdrAtom(): MP4Atom("ohdr") {
|
|
AddVersionAndFlags();
|
|
|
|
AddProperty(new MP4Integer8Property("EncryptionMethod"));
|
|
AddProperty(new MP4Integer8Property("EncryptionPadding"));
|
|
AddProperty(new MP4Integer64Property("PlaintextLength"));
|
|
AddProperty(new MP4Integer16Property("ContentIDLength"));
|
|
AddProperty(new MP4Integer16Property("RightsIssuerURLLength"));
|
|
AddProperty(new MP4Integer16Property("TextualHeadersLength"));
|
|
AddProperty(new OhdrMP4StringProperty("ContentID"));
|
|
AddProperty(new OhdrMP4StringProperty("RightsIssuerURL"));
|
|
AddProperty(new MP4BytesProperty("TextualHeaders"));
|
|
}
|
|
|
|
MP4OhdrAtom::~MP4OhdrAtom() {
|
|
}
|
|
|
|
/*! \brief Read atom.
|
|
*/
|
|
void MP4OhdrAtom::Read() {
|
|
ReadProperties(0, 8);
|
|
MP4Property* lProperty;
|
|
MP4Property* property;
|
|
lProperty = GetProperty(5);
|
|
property = GetProperty(8);
|
|
((OhdrMP4StringProperty*)property)->SetFixedLength(
|
|
((MP4Integer16Property*)lProperty)->GetValue());
|
|
lProperty = GetProperty(6);
|
|
property = GetProperty(9);
|
|
((OhdrMP4StringProperty*)property)->SetFixedLength(
|
|
((MP4Integer16Property*)lProperty)->GetValue());
|
|
lProperty = GetProperty(7);
|
|
property = GetProperty(10);
|
|
((MP4BytesProperty*)property)->SetFixedSize(
|
|
((MP4Integer16Property*)lProperty)->GetValue());
|
|
ReadProperties(8, 3);
|
|
}
|