1343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih/* 2343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Copyright (C) 2014 The Android Open Source Project 3343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * 4343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Licensed under the Apache License, Version 2.0 (the "License"); 5343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * you may not use this file except in compliance with the License. 6343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * You may obtain a copy of the License at 7343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * 8343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * http://www.apache.org/licenses/LICENSE-2.0 9343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * 10343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * Unless required by applicable law or agreed to in writing, software 11343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * distributed under the License is distributed on an "AS IS" BASIS, 12343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * See the License for the specific language governing permissions and 14343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih * limitations under the License. 15343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih */ 16343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 17343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#ifndef WEBMELEMENT_H_ 18343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#define WEBMELEMENT_H_ 19343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 20343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <media/stagefright/MediaBuffer.h> 21343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <media/stagefright/foundation/ABase.h> 22343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <media/stagefright/foundation/ABuffer.h> 23343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#include <utils/List.h> 24343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 25343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihnamespace android { 26343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 27d637d296bb0954756d3d231633fad73fadd70316Lajos Molnarclass MetaData; 28d637d296bb0954756d3d231633fad73fadd70316Lajos Molnar 29343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmElement : public LightRefBase<WebmElement> { 30343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const uint64_t mId, mSize; 31343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 32343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmElement(uint64_t id, uint64_t size); 33343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih virtual ~WebmElement(); 34343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 35343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih virtual int serializePayloadSize(uint8_t *buf); 36343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih virtual void serializePayload(uint8_t *buf)=0; 37343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t totalSize(); 38343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t serializeInto(uint8_t *buf); 39343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint8_t *serialize(uint64_t& size); 40343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int write(int fd, uint64_t& size); 41343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 42343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> EbmlHeader( 43343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int ver = 1, 44343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int readVer = 1, 45343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int maxIdLen = 4, 46343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int maxSizeLen = 8, 47343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int docVer = 2, 48343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int docReadVer = 2); 49343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 50343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> SegmentInfo(uint64_t scale = 1000000, double dur = 0); 51343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 52343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> AudioTrackEntry( 53343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int chans, 54343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih double rate, 55343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const sp<ABuffer> &buf, 56343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int bps = 0, 57343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t uid = 0, 58343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih bool lacing = false, 59343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const char *lang = "und"); 60343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 61343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> VideoTrackEntry( 6270b22a024d75bce04575c16ed49fc7991c8544a6Vignesh Venkatasubramanian const char *codec, 63343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t width, 64343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t height, 65d637d296bb0954756d3d231633fad73fadd70316Lajos Molnar const sp<MetaData> &md, 66343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t uid = 0, 67343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih bool lacing = false, 68343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const char *lang = "und"); 69343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 70343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> SeekEntry(uint64_t id, uint64_t off); 71343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> CuePointEntry(uint64_t time, int track, uint64_t off); 72343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih static sp<WebmElement> SimpleBlock( 73343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int trackNum, 74343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int16_t timecode, 75343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih bool key, 76343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const uint8_t *data, 77343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih uint64_t dataSize); 78343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 79343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 80343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmUnsigned : public WebmElement { 81343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmUnsigned(uint64_t id, uint64_t value); 82343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const uint64_t mValue; 83343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 84343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 85343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 86343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmFloat : public WebmElement { 87343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const double mValue; 88343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmFloat(uint64_t id, float value); 89343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmFloat(uint64_t id, double value); 90343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 91343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 92343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 93343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmBinary : public WebmElement { 94343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const sp<ABuffer> mRef; 95343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmBinary(uint64_t id, const sp<ABuffer> &ref); 96343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 97343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 98343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 99343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmString : public WebmElement { 100343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const char *const mStr; 101343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmString(uint64_t id, const char *str); 102343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 103343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 104343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 105343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmSimpleBlock : public WebmElement { 106343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const int mTrackNum; 107343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const int16_t mRelTimecode; 108343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const bool mKey; 109343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const sp<ABuffer> mRef; 110343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 111343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmSimpleBlock(int trackNum, int16_t timecode, bool key, const sp<ABuffer>& orig); 112343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 113343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 114343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 115343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct EbmlVoid : public WebmElement { 116343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const uint64_t mSizeWidth; 11740d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh explicit EbmlVoid(uint64_t totalSize); 118343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int serializePayloadSize(uint8_t *buf); 119343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 120343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 121343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 122343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shihstruct WebmMaster : public WebmElement { 123343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih const List<sp<WebmElement> > mChildren; 12440d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh explicit WebmMaster(uint64_t id); 125343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih WebmMaster(uint64_t id, const List<sp<WebmElement> > &children); 126343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih int serializePayloadSize(uint8_t *buf); 127343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih void serializePayload(uint8_t *buf); 128343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih}; 129343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih 130343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih} /* namespace android */ 131343947abc8b7c126f966fd32a0b18bff6c2cecd1Robert Shih#endif /* WEBMELEMENT_H_ */ 132