blob: 30a1946cf93d3dcb6c1518d8bb66a7738cc0ea12 [file] [log] [blame]
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is MPEG4IP.
*
* The Initial Developer of the Original Code is Cisco Systems Inc.
* Portions created by Cisco Systems Inc. are
* Copyright (C) Cisco Systems Inc. 2001. All Rights Reserved.
*
* Contributor(s):
* Dave Mackie dmackie@cisco.com
*/
#include "src/impl.h"
namespace mp4v2 {
namespace impl {
///////////////////////////////////////////////////////////////////////////////
/*
* This is used for the 4 bit sample size below. We need the sampleCount
* to be correct for the number of samples, but the table size needs to
* be correct to read and write it.
*/
class MP4HalfSizeTableProperty : public MP4TableProperty
{
public:
MP4HalfSizeTableProperty(MP4Atom& parentAtom, const char *name, MP4IntegerProperty *pCountProperty) :
MP4TableProperty(parentAtom, name, pCountProperty) {};
// The count is half the actual size
uint32_t GetCount() {
return (m_pCountProperty->GetValue() + 1)/ 2;
};
void SetCount(uint32_t count) {
m_pCountProperty->SetValue(count * 2);
};
private:
MP4HalfSizeTableProperty();
MP4HalfSizeTableProperty ( const MP4HalfSizeTableProperty &src );
MP4HalfSizeTableProperty &operator= ( const MP4HalfSizeTableProperty &src );
};
MP4Stz2Atom::MP4Stz2Atom(MP4File &file)
: MP4Atom(file, "stz2")
{
AddVersionAndFlags(); /* 0, 1 */
AddReserved(*this, "reserved", 3); /* 2 */
AddProperty( /* 3 */
new MP4Integer8Property(*this, "fieldSize"));
MP4Integer32Property* pCount =
new MP4Integer32Property(*this, "sampleCount");
AddProperty(pCount); /* 4 */
}
void MP4Stz2Atom::Read()
{
ReadProperties(0, 4);
uint8_t fieldSize =
((MP4Integer8Property *)m_pProperties[3])->GetValue();
// uint32_t sampleCount = 0;
MP4Integer32Property* pCount =
(MP4Integer32Property *)m_pProperties[4];
MP4TableProperty *pTable;
if (fieldSize != 4) {
pTable = new MP4TableProperty(*this, "entries", pCount);
} else {
// 4 bit field size uses a special table.
pTable = new MP4HalfSizeTableProperty(*this, "entries", pCount);
}
AddProperty(pTable);
if (fieldSize == 16) {
pTable->AddProperty( /* 5/0 */
new MP4Integer16Property(*this, "entrySize"));
} else {
pTable->AddProperty( /* 5/0 */
new MP4Integer8Property(*this, "entrySize"));
}
ReadProperties(4);
Skip(); // to end of atom
}
///////////////////////////////////////////////////////////////////////////////
}
} // namespace mp4v2::impl