///////////////////////////////////////////////////////////////////////////////
//
//  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 EXCEPTION(xss.str());
    }

    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");

    MP4StringProperty* handlerType;
    if( !hdlr->FindProperty( "hdlr.handlerType", (MP4Property**)&handlerType ))
        throw new EXCEPTION("media handler type-property not found");

    const string video = "vide";
    if( video != handlerType->GetValue() )
        throw new EXCEPTION("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 EXCEPTION("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
