// 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 "EbmlBufferWriter.h"
#include "EbmlIDs.h"
#include "WebMElement.h"
#include <stdio.h>

#define kVorbisPrivateMaxSize  4000

void writeHeader(EbmlGlobal *glob)
{
    EbmlLoc start;
    Ebml_StartSubElement(glob, &start, EBML);
    Ebml_SerializeUnsigned(glob, EBMLVersion, 1);
    Ebml_SerializeUnsigned(glob, EBMLReadVersion, 1); //EBML Read Version
    Ebml_SerializeUnsigned(glob, EBMLMaxIDLength, 4); //EBML Max ID Length
    Ebml_SerializeUnsigned(glob, EBMLMaxSizeLength, 8); //EBML Max Size Length
    Ebml_SerializeString(glob, DocType, "webm"); //Doc Type
    Ebml_SerializeUnsigned(glob, DocTypeVersion, 2); //Doc Type Version
    Ebml_SerializeUnsigned(glob, DocTypeReadVersion, 2); //Doc Type Read Version
    Ebml_EndSubElement(glob, &start);
}

void writeSimpleBlock(EbmlGlobal *glob, unsigned char trackNumber, short timeCode,
                      int isKeyframe, unsigned char lacingFlag, int discardable,
                      unsigned char *data, unsigned long dataLength)
{
    Ebml_WriteID(glob, SimpleBlock);
    unsigned long blockLength = 4 + dataLength;
    blockLength |= 0x10000000; //TODO check length < 0x0FFFFFFFF
    Ebml_Serialize(glob, &blockLength, 4);
    trackNumber |= 0x80;  //TODO check track nubmer < 128
    Ebml_Write(glob, &trackNumber, 1);
    //Ebml_WriteSigned16(glob, timeCode,2); //this is 3 bytes
    Ebml_Serialize(glob, &timeCode, 2);
    unsigned char flags = 0x00 | (isKeyframe ? 0x80 : 0x00) | (lacingFlag << 1) | discardable;
    Ebml_Write(glob, &flags, 1);
    Ebml_Write(glob, data, dataLength);
}

static UInt64 generateTrackID(unsigned int trackNumber)
{
    UInt64 t = time(NULL) * trackNumber;
    UInt64 r = rand();
    r = r << 32;
    r +=  rand();
    UInt64 rval = t ^ r;
    return rval;
}

void writeVideoTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
                     char *codecId, unsigned int pixelWidth, unsigned int pixelHeight,
                     double frameRate)
{
    EbmlLoc start;
    Ebml_StartSubElement(glob, &start, TrackEntry);
    Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
    UInt64 trackID = generateTrackID(trackNumber);
    Ebml_SerializeUnsigned(glob, TrackUID, trackID);
    Ebml_SerializeString(glob, CodecName, "VP8");  //TODO shouldn't be fixed

    Ebml_SerializeUnsigned(glob, TrackType, 1); //video is always 1
    Ebml_SerializeString(glob, CodecID, codecId);
    {
        EbmlLoc videoStart;
        Ebml_StartSubElement(glob, &videoStart, Video);
        Ebml_SerializeUnsigned(glob, PixelWidth, pixelWidth);
        Ebml_SerializeUnsigned(glob, PixelHeight, pixelHeight);
        Ebml_SerializeFloat(glob, FrameRate, frameRate);
        Ebml_EndSubElement(glob, &videoStart); //Video
    }
    Ebml_EndSubElement(glob, &start); //Track Entry
}
void writeAudioTrack(EbmlGlobal *glob, unsigned int trackNumber, int flagLacing,
                     char *codecId, double samplingFrequency, unsigned int channels,
                     unsigned char *private, unsigned long privateSize)
{
    EbmlLoc start;
    Ebml_StartSubElement(glob, &start, TrackEntry);
    Ebml_SerializeUnsigned(glob, TrackNumber, trackNumber);
    UInt64 trackID = generateTrackID(trackNumber);
    Ebml_SerializeUnsigned(glob, TrackUID, trackID);
    Ebml_SerializeUnsigned(glob, TrackType, 2); //audio is always 2
    //I am using defaults for thesed required fields
    /*  Ebml_SerializeUnsigned(glob, FlagEnabled, 1);
        Ebml_SerializeUnsigned(glob, FlagDefault, 1);
        Ebml_SerializeUnsigned(glob, FlagForced, 1);
        Ebml_SerializeUnsigned(glob, FlagLacing, flagLacing);*/
    Ebml_SerializeString(glob, CodecID, codecId);
    Ebml_SerializeData(glob, CodecPrivate, private, privateSize);

    Ebml_SerializeString(glob, CodecName, "VORBIS");  //fixed for now
    {
        EbmlLoc AudioStart;
        Ebml_StartSubElement(glob, &AudioStart, Audio);
        Ebml_SerializeFloat(glob, SamplingFrequency, samplingFrequency);
        Ebml_SerializeUnsigned(glob, Channels, channels);
        Ebml_EndSubElement(glob, &AudioStart);
    }
    Ebml_EndSubElement(glob, &start);
}
void writeSegmentInformation(EbmlGlobal *ebml, EbmlLoc* startInfo, unsigned long timeCodeScale, double duration)
{
    Ebml_StartSubElement(ebml, startInfo, Info);
    Ebml_SerializeUnsigned(ebml, TimecodeScale, timeCodeScale);
    Ebml_SerializeFloat(ebml, Segment_Duration, duration * 1000.0); //Currently fixed to using milliseconds
    Ebml_SerializeString(ebml, 0x4D80, "QTmuxingAppLibWebM-0.0.1");
    Ebml_SerializeString(ebml, 0x5741, "QTwritingAppLibWebM-0.0.1");
    Ebml_EndSubElement(ebml, startInfo);
}

/*
void Mkv_InitializeSegment(Ebml& ebml_out, EbmlLoc& ebmlLoc)
{
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0x18538067);
}

void Mkv_InitializeSeek(Ebml& ebml_out, EbmlLoc& ebmlLoc)
{
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0x114d9b74);
}
void Mkv_WriteSeekInformation(Ebml& ebml_out, SeekStruct& seekInformation)
{
    EbmlLoc ebmlLoc;
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0x4dbb);
    Ebml_SerializeString(ebml_out, 0x53ab, seekInformation.SeekID);
    Ebml_SerializeUnsigned(ebml_out, 0x53ac, seekInformation.SeekPosition);
    Ebml_EndSubElement(ebml_out, ebmlLoc);
}

void Mkv_WriteSegmentInformation(Ebml& ebml_out, SegmentInformationStruct& segmentInformation)
{
    Ebml_SerializeUnsigned(ebml_out, 0x73a4, segmentInformation.segmentUID);
    if (segmentInformation.filename != 0)
        Ebml_SerializeString(ebml_out, 0x7384, segmentInformation.filename);
    Ebml_SerializeUnsigned(ebml_out, 0x2AD7B1, segmentInformation.TimecodeScale);
    Ebml_SerializeUnsigned(ebml_out, 0x4489, segmentInformation.Duration);
    //TODO date
    Ebml_SerializeWString(ebml_out, 0x4D80, L"MKVMUX");
    Ebml_SerializeWString(ebml_out, 0x5741, segmentInformation.WritingApp);
}

void Mkv_InitializeTrack(Ebml& ebml_out, EbmlLoc& ebmlLoc)
{
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0x1654AE6B);
}

static void Mkv_WriteGenericTrackData(Ebml& ebml_out, TrackStruct& track)
{
    Ebml_SerializeUnsigned(ebml_out, 0xD7, track.TrackNumber);
    Ebml_SerializeUnsigned(ebml_out, 0x73C5, track.TrackUID);
    Ebml_SerializeUnsigned(ebml_out, 0x83, track.TrackType);
    Ebml_SerializeUnsigned(ebml_out, 0xB9, track.FlagEnabled ? 1 :0);
    Ebml_SerializeUnsigned(ebml_out, 0x88, track.FlagDefault ? 1 :0);
    Ebml_SerializeUnsigned(ebml_out, 0x55AA, track.FlagForced ? 1 :0);
    if (track.Language != 0)
        Ebml_SerializeString(ebml_out, 0x22B59C, track.Language);
    if (track.CodecID != 0)
        Ebml_SerializeString(ebml_out, 0x86, track.CodecID);
    if (track.CodecPrivate != 0)
        Ebml_SerializeData(ebml_out, 0x63A2, track.CodecPrivate, track.CodecPrivateLength);
    if (track.CodecName != 0)
        Ebml_SerializeWString(ebml_out, 0x258688, track.CodecName);
}

void Mkv_WriteVideoTrack(Ebml& ebml_out, TrackStruct & track, VideoTrackStruct& video)
{
    EbmlLoc trackHeadLoc, videoHeadLoc;
    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);  //start Track
    Mkv_WriteGenericTrackData(ebml_out, track);
    Ebml_StartSubElement(ebml_out, videoHeadLoc, 0xE0);  //start Video
    Ebml_SerializeUnsigned(ebml_out, 0x9A, video.FlagInterlaced ? 1 :0);
    Ebml_SerializeUnsigned(ebml_out, 0xB0, video.PixelWidth);
    Ebml_SerializeUnsigned(ebml_out, 0xBA, video.PixelHeight);
    Ebml_SerializeUnsigned(ebml_out, 0x54B0, video.PixelDisplayWidth);
    Ebml_SerializeUnsigned(ebml_out, 0x54BA, video.PixelDisplayHeight);
    Ebml_SerializeUnsigned(ebml_out, 0x54B2, video.displayUnit);
    Ebml_SerializeFloat(ebml_out, 0x2383E3, video.FrameRate);
    Ebml_EndSubElement(ebml_out, videoHeadLoc);
    Ebml_EndSubElement(ebml_out, trackHeadLoc);

}

void Mkv_WriteAudioTrack(Ebml& ebml_out, TrackStruct & track, AudioTrackStruct& video)
{
    EbmlLoc trackHeadLoc, audioHeadLoc;
    Ebml_StartSubElement(ebml_out, trackHeadLoc, 0xAE);
    Mkv_WriteGenericTrackData(ebml_out, track);
    Ebml_StartSubElement(ebml_out, audioHeadLoc, 0xE0);  //start Audio
    Ebml_SerializeFloat(ebml_out, 0xB5, video.SamplingFrequency);
    Ebml_SerializeUnsigned(ebml_out, 0x9F, video.Channels);
    Ebml_SerializeUnsigned(ebml_out, 0x6264, video.BitDepth);
    Ebml_EndSubElement(ebml_out, audioHeadLoc); // end audio
    Ebml_EndSubElement(ebml_out, trackHeadLoc);
}

void Mkv_WriteEbmlClusterHead(Ebml& ebml_out,  EbmlLoc& ebmlLoc, ClusterHeadStruct & clusterHead)
{
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0x1F43B675);
    Ebml_SerializeUnsigned(ebml_out, 0x6264, clusterHead.TimeCode);
}

void Mkv_WriteSimpleBlockHead(Ebml& ebml_out,  EbmlLoc& ebmlLoc, SimpleBlockStruct& block)
{
    Ebml_StartSubElement(ebml_out, ebmlLoc, 0xA3);
    Ebml_Write1UInt(ebml_out, block.TrackNumber);
    Ebml_WriteSigned16(ebml_out,block.TimeCode);
    unsigned char flags = 0x00 | (block.iskey ? 0x80:0x00) | (block.lacing << 1) | block.discardable;
    Ebml_Write1UInt(ebml_out, flags);  //TODO this may be the wrong function
    Ebml_Serialize(ebml_out, block.data, block.dataLength);
    Ebml_EndSubElement(ebml_out,ebmlLoc);
}
*/
