diff options
Diffstat (limited to 'src/qtff/coding.cpp')
-rw-r--r-- | src/qtff/coding.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/qtff/coding.cpp b/src/qtff/coding.cpp new file mode 100644 index 0000000..697d8f4 --- /dev/null +++ b/src/qtff/coding.cpp @@ -0,0 +1,95 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// 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 MP4v2. +// +// The Initial Developer of the Original Code is Kona Blend. +// Portions created by Kona Blend are Copyright (C) 2008. +// All Rights Reserved. +// +// Contributors: +// Kona Blend, kona8lend@@gmail.com +// +/////////////////////////////////////////////////////////////////////////////// + +#include "impl.h" + +namespace mp4v2 { namespace impl { namespace qtff { + +/////////////////////////////////////////////////////////////////////////////// + +namespace { + class StaticData + { + public: + StaticData() + { + supportedCodings.insert( "avc1" ); + supportedCodings.insert( "mp4v" ); + } + + set<string> supportedCodings; + }; + + const StaticData STATIC_DATA; +} + +/////////////////////////////////////////////////////////////////////////////// + +bool +findCoding( MP4FileHandle file, uint16_t trackIndex, MP4Atom*& coding ) +{ + coding = NULL; + MP4File& mp4 = *((MP4File*)file); + + if( trackIndex == numeric_limits<uint16_t>::max() ) { + ostringstream xss; + xss << "invalid track-index: " << trackIndex; + throw new MP4Exception( xss ); + } + + ostringstream oss; + oss << "moov.trak[" << trackIndex << "].mdia.hdlr"; + MP4Atom* hdlr = mp4.FindAtom( oss.str().c_str() ); + if( !hdlr ) + throw new MP4Exception( "media handler not found" ); + + MP4StringProperty* handlerType; + if( !hdlr->FindProperty( "hdlr.handlerType", (MP4Property**)&handlerType )) + throw new MP4Exception( "media handler type-property not found" ); + + const string video = "vide"; + if( video != handlerType->GetValue() ) + throw new MP4Exception( "video-track required" ); + + oss.str( "" ); + oss.clear(); + oss << "moov.trak[" << trackIndex << "].mdia.minf.stbl.stsd"; + MP4Atom* stsd = mp4.FindAtom( oss.str().c_str() ); + if( !stsd ) + throw new MP4Exception( "media handler type-property not found" ); + + // find first atom which is a supported coding + const uint32_t atomc = stsd->GetNumberOfChildAtoms(); + for( uint32_t i = 0; i < atomc; i++ ) { + MP4Atom* atom = stsd->GetChildAtom( i ); + if( STATIC_DATA.supportedCodings.find( atom->GetType() ) == STATIC_DATA.supportedCodings.end() ) + continue; + coding = atom; + } + + return coding == NULL; +} + +/////////////////////////////////////////////////////////////////////////////// + +}}} // namespace mp4v2::impl::qtff |