/////////////////////////////////////////////////////////////////////////////// // // 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 "libutil/impl.h" namespace mp4v2 { namespace util { using namespace mp4v2::impl; /////////////////////////////////////////////////////////////////////////////// // search atom recursively for any 64-bit characteristics. // nlargsize indicates number of atoms which use largesize extension. // nversion1 indicates number of atoms which use version==1 extension. // nspecial indicates number of special 64-bit atoms; // eg: stbl may container one of { stco || co64 } for chunkoffsets. void searchFor64bit( MP4Atom& atom, FileSummaryInfo& info ) { const uint32_t max = atom.GetNumberOfChildAtoms(); for( uint32_t i = 0; i < max; i++ ) { MP4Atom& child = *atom.GetChildAtom( i ); if( child.GetLargesizeMode() ) info.nlargesize++; MP4Integer8Property* version; if( child.FindProperty( "version", (MP4Property**)&version ) && version->GetValue() == 1 ) info.nversion1++; if( !strcmp( child.GetType(), "co64" )) info.nspecial++; searchFor64bit( child, info ); } } /////////////////////////////////////////////////////////////////////////////// bool fileFetchSummaryInfo( MP4FileHandle file, FileSummaryInfo& info ) { if( file == MP4_INVALID_FILE_HANDLE ) return true; MP4File& mp4 = *((MP4File*)file); MP4Atom* root = mp4.FindAtom( "" ); if( !root ) return true; MP4FtypAtom* ftyp = (MP4FtypAtom*)root->FindAtom( "ftyp" ); if( !ftyp ) return true; info.major_brand = ftyp->majorBrand.GetValue(); info.minor_version = ftyp->minorVersion.GetValue(); const uint32_t cbmax = ftyp->compatibleBrands.GetCount(); for( uint32_t i = 0; i < cbmax; i++ ) { string s = ftyp->compatibleBrands.GetValue( i ); // remove spaces so brand set is presentable string stripped; const string::size_type max = s.length(); for( string::size_type pos = 0; pos < max; pos++ ) { if( s[pos] != ' ' ) stripped += s[pos]; } if( stripped.empty() ) continue; info.compatible_brands.insert( stripped ); } info.nlargesize = 0; info.nversion1 = 0; info.nspecial = 0; searchFor64bit( *root, info ); return false; } /////////////////////////////////////////////////////////////////////////////// }} // namespace mp4v2::util