///////////////////////////////////////////////////////////////////////////////
//
//  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
