// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS.  All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.



#include "EbmlIDs.h"
#include "EbmlBufferWriter.h"
#include "WebMElement.h"

#include <stdio.h>
int main(int argc, char *argv[])
{
    //init the datatype we're using for ebml output
    unsigned char data[8192];
    EbmlGlobal ebml;
    ebml.buf = data;
    ebml.offset = 0;
    ebml.length = 8192;

    writeHeader(&ebml);
    {
        EbmlLoc startSegment;
        Ebml_StartSubElement(&ebml, &startSegment, Segment); //segment
        {
            //segment info
            EbmlLoc startInfo;
            Ebml_StartSubElement(&ebml, &startInfo, Info);
            Ebml_SerializeString(&ebml, 0x4D80, "muxingAppLibMkv");
            Ebml_SerializeString(&ebml, 0x5741, "writingAppLibMkv");
            Ebml_EndSubElement(&ebml, &startInfo);
        }

        {
            EbmlLoc trackStart;
            Ebml_StartSubElement(&ebml, &trackStart, Tracks);
            writeVideoTrack(&ebml, 1, 1, "V_MS/VFW/FOURCC", 320, 240, 29.97);
            //writeAudioTrack(&ebml,2,1, "A_VORBIS", 32000, 1, NULL, 0);
            Ebml_EndSubElement(&ebml, &trackStart);
        }

        {
            EbmlLoc clusterStart;
            Ebml_StartSubElement(&ebml, &clusterStart, Cluster); //cluster
            Ebml_SerializeUnsigned(&ebml, Timecode, 0);

            unsigned char someData[4] = {1, 2, 3, 4};
            writeSimpleBlock(&ebml, 1, 0, 1, 0, 0, someData, 4);
            Ebml_EndSubElement(&ebml, &clusterStart);
        }    //end cluster
        Ebml_EndSubElement(&ebml, &startSegment);
    }

    //dump ebml stuff to the file
    FILE *file_out = fopen("test.mkv", "wb");
    size_t bytesWritten = fwrite(data, 1, ebml.offset, file_out);
    fclose(file_out);
    return 0;
}