/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WEBMELEMENT_H_
#define WEBMELEMENT_H_

#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/foundation/ABase.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <utils/List.h>

namespace android {

struct WebmElement : public LightRefBase<WebmElement> {
    const uint64_t mId, mSize;

    WebmElement(uint64_t id, uint64_t size);
    virtual ~WebmElement();

    virtual int serializePayloadSize(uint8_t *buf);
    virtual void serializePayload(uint8_t *buf)=0;
    uint64_t totalSize();
    uint64_t serializeInto(uint8_t *buf);
    uint8_t *serialize(uint64_t& size);
    int write(int fd, uint64_t& size);

    static sp<WebmElement> EbmlHeader(
            int ver = 1,
            int readVer = 1,
            int maxIdLen = 4,
            int maxSizeLen = 8,
            int docVer = 2,
            int docReadVer = 2);

    static sp<WebmElement> SegmentInfo(uint64_t scale = 1000000, double dur = 0);

    static sp<WebmElement> AudioTrackEntry(
            int chans,
            double rate,
            const sp<ABuffer> &buf,
            int bps = 0,
            uint64_t uid = 0,
            bool lacing = false,
            const char *lang = "und");

    static sp<WebmElement> VideoTrackEntry(
            uint64_t width,
            uint64_t height,
            uint64_t uid = 0,
            bool lacing = false,
            const char *lang = "und");

    static sp<WebmElement> SeekEntry(uint64_t id, uint64_t off);
    static sp<WebmElement> CuePointEntry(uint64_t time, int track, uint64_t off);
    static sp<WebmElement> SimpleBlock(
            int trackNum,
            int16_t timecode,
            bool key,
            const uint8_t *data,
            uint64_t dataSize);
};

struct WebmUnsigned : public WebmElement {
    WebmUnsigned(uint64_t id, uint64_t value);
    const uint64_t mValue;
    void serializePayload(uint8_t *buf);
};

struct WebmFloat : public WebmElement {
    const double mValue;
    WebmFloat(uint64_t id, float value);
    WebmFloat(uint64_t id, double value);
    void serializePayload(uint8_t *buf);
};

struct WebmBinary : public WebmElement {
    const sp<ABuffer> mRef;
    WebmBinary(uint64_t id, const sp<ABuffer> &ref);
    void serializePayload(uint8_t *buf);
};

struct WebmString : public WebmElement {
    const char *const mStr;
    WebmString(uint64_t id, const char *str);
    void serializePayload(uint8_t *buf);
};

struct WebmSimpleBlock : public WebmElement {
    const int mTrackNum;
    const int16_t mRelTimecode;
    const bool mKey;
    const sp<ABuffer> mRef;

    WebmSimpleBlock(int trackNum, int16_t timecode, bool key, const sp<ABuffer>& orig);
    void serializePayload(uint8_t *buf);
};

struct EbmlVoid : public WebmElement {
    const uint64_t mSizeWidth;
    explicit EbmlVoid(uint64_t totalSize);
    int serializePayloadSize(uint8_t *buf);
    void serializePayload(uint8_t *buf);
};

struct WebmMaster : public WebmElement {
    const List<sp<WebmElement> > mChildren;
    explicit WebmMaster(uint64_t id);
    WebmMaster(uint64_t id, const List<sp<WebmElement> > &children);
    int serializePayloadSize(uint8_t *buf);
    void serializePayload(uint8_t *buf);
};

} /* namespace android */
#endif /* WEBMELEMENT_H_ */
