• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef WEBMELEMENT_H_
18 #define WEBMELEMENT_H_
19 
20 #include <media/stagefright/MediaBuffer.h>
21 #include <media/stagefright/foundation/ABase.h>
22 #include <media/stagefright/foundation/ABuffer.h>
23 #include <utils/List.h>
24 
25 namespace android {
26 
27 class MetaData;
28 
29 struct WebmElement : public LightRefBase<WebmElement> {
30     const uint64_t mId, mSize;
31 
32     WebmElement(uint64_t id, uint64_t size);
33     virtual ~WebmElement();
34 
35     virtual int serializePayloadSize(uint8_t *buf);
36     virtual void serializePayload(uint8_t *buf)=0;
37     uint64_t totalSize();
38     uint64_t serializeInto(uint8_t *buf);
39     uint8_t *serialize(uint64_t& size);
40     int write(int fd, uint64_t& size);
41 
42     static sp<WebmElement> EbmlHeader(
43             int ver = 1,
44             int readVer = 1,
45             int maxIdLen = 4,
46             int maxSizeLen = 8,
47             int docVer = 2,
48             int docReadVer = 2);
49 
50     static sp<WebmElement> SegmentInfo(uint64_t scale = 1000000, double dur = 0);
51 
52     static sp<WebmElement> AudioTrackEntry(
53             int chans,
54             double rate,
55             const sp<ABuffer> &buf,
56             int bps = 0,
57             uint64_t uid = 0,
58             bool lacing = false,
59             const char *lang = "und");
60 
61     static sp<WebmElement> VideoTrackEntry(
62             const char *codec,
63             uint64_t width,
64             uint64_t height,
65             const sp<MetaData> &md,
66             uint64_t uid = 0,
67             bool lacing = false,
68             const char *lang = "und");
69 
70     static sp<WebmElement> SeekEntry(uint64_t id, uint64_t off);
71     static sp<WebmElement> CuePointEntry(uint64_t time, int track, uint64_t off);
72     static sp<WebmElement> SimpleBlock(
73             int trackNum,
74             int16_t timecode,
75             bool key,
76             const uint8_t *data,
77             uint64_t dataSize);
78 };
79 
80 struct WebmUnsigned : public WebmElement {
81     WebmUnsigned(uint64_t id, uint64_t value);
82     const uint64_t mValue;
83     void serializePayload(uint8_t *buf);
84 };
85 
86 struct WebmFloat : public WebmElement {
87     const double mValue;
88     WebmFloat(uint64_t id, float value);
89     WebmFloat(uint64_t id, double value);
90     void serializePayload(uint8_t *buf);
91 };
92 
93 struct WebmBinary : public WebmElement {
94     const sp<ABuffer> mRef;
95     WebmBinary(uint64_t id, const sp<ABuffer> &ref);
96     void serializePayload(uint8_t *buf);
97 };
98 
99 struct WebmString : public WebmElement {
100     const char *const mStr;
101     WebmString(uint64_t id, const char *str);
102     void serializePayload(uint8_t *buf);
103 };
104 
105 struct WebmSimpleBlock : public WebmElement {
106     const int mTrackNum;
107     const int16_t mRelTimecode;
108     const bool mKey;
109     const sp<ABuffer> mRef;
110 
111     WebmSimpleBlock(int trackNum, int16_t timecode, bool key, const sp<ABuffer>& orig);
112     void serializePayload(uint8_t *buf);
113 };
114 
115 struct EbmlVoid : public WebmElement {
116     const uint64_t mSizeWidth;
117     explicit EbmlVoid(uint64_t totalSize);
118     int serializePayloadSize(uint8_t *buf);
119     void serializePayload(uint8_t *buf);
120 };
121 
122 struct WebmMaster : public WebmElement {
123     const List<sp<WebmElement> > mChildren;
124     explicit WebmMaster(uint64_t id);
125     WebmMaster(uint64_t id, const List<sp<WebmElement> > &children);
126     int serializePayloadSize(uint8_t *buf);
127     void serializePayload(uint8_t *buf);
128 };
129 
130 } /* namespace android */
131 #endif /* WEBMELEMENT_H_ */
132