aboutsummaryrefslogtreecommitdiff
path: root/src/qtff/coding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qtff/coding.cpp')
-rw-r--r--src/qtff/coding.cpp95
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