blob: 3b8154ae6d5b3eeb031f5fc06d025596aed09959 [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 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" );
}
std::set<string> supportedCodings;
};
const StaticData STATIC_DATA;
}
///////////////////////////////////////////////////////////////////////////////
bool
findCoding( MP4FileHandle file, uint16_t trackIndex, MP4Atom*& coding )
{
coding = NULL;
MP4File& mp4 = *((MP4File*)file);
if( trackIndex == std::numeric_limits<uint16_t>::max() ) {
ostringstream xss;
xss << "invalid track-index: " << trackIndex;
throw new Exception( xss.str(), __FILE__, __LINE__, __FUNCTION__ );
}
ostringstream oss;
oss << "moov.trak[" << trackIndex << "].mdia.hdlr";
MP4Atom* hdlr = mp4.FindAtom( oss.str().c_str() );
if( !hdlr )
throw new Exception( "media handler not found", __FILE__, __LINE__, __FUNCTION__ );
MP4StringProperty* handlerType;
if( !hdlr->FindProperty( "hdlr.handlerType", (MP4Property**)&handlerType ))
throw new Exception( "media handler type-property not found", __FILE__, __LINE__, __FUNCTION__ );
const string video = "vide";
if( video != handlerType->GetValue() )
throw new Exception( "video-track required", __FILE__, __LINE__, __FUNCTION__ );
oss.str( "" );
oss.clear();
oss << "moov.trak[" << trackIndex << "].mdia.minf.stbl.stsd";
MP4Atom* stsd = mp4.FindAtom( oss.str().c_str() );
if( !stsd )
throw new Exception( "media handler type-property not found", __FILE__, __LINE__, __FUNCTION__ );
// 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