|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 #if !defined(MPAPI_h_) |
|
7 #define MPAPI_h_ |
|
8 |
|
9 #include <stdint.h> |
|
10 |
|
11 namespace MPAPI { |
|
12 |
|
13 enum ColorFormat { |
|
14 I420, |
|
15 RGB565 |
|
16 }; |
|
17 |
|
18 /* |
|
19 * A callback for the plugin to use to request a buffer owned by gecko. This can |
|
20 * save us a copy or two down the line. |
|
21 */ |
|
22 class BufferCallback { |
|
23 public: |
|
24 virtual void *operator()(size_t aWidth, size_t aHeight, |
|
25 ColorFormat aColorFormat) = 0; |
|
26 }; |
|
27 |
|
28 struct VideoPlane { |
|
29 VideoPlane() : |
|
30 mData(0), |
|
31 mStride(0), |
|
32 mWidth(0), |
|
33 mHeight(0), |
|
34 mOffset(0), |
|
35 mSkip(0) |
|
36 {} |
|
37 |
|
38 void *mData; |
|
39 int32_t mStride; |
|
40 int32_t mWidth; |
|
41 int32_t mHeight; |
|
42 int32_t mOffset; |
|
43 int32_t mSkip; |
|
44 }; |
|
45 |
|
46 struct VideoFrame { |
|
47 int64_t mTimeUs; |
|
48 bool mKeyFrame; |
|
49 void *mData; |
|
50 size_t mSize; |
|
51 int32_t mStride; |
|
52 int32_t mSliceHeight; |
|
53 int32_t mRotation; |
|
54 VideoPlane Y; |
|
55 VideoPlane Cb; |
|
56 VideoPlane Cr; |
|
57 |
|
58 VideoFrame() : |
|
59 mTimeUs(0), |
|
60 mKeyFrame(false), |
|
61 mData(0), |
|
62 mSize(0), |
|
63 mStride(0), |
|
64 mSliceHeight(0), |
|
65 mRotation(0) |
|
66 {} |
|
67 |
|
68 void Set(int64_t aTimeUs, bool aKeyFrame, |
|
69 void *aData, size_t aSize, int32_t aStride, int32_t aSliceHeight, int32_t aRotation, |
|
70 void *aYData, int32_t aYStride, int32_t aYWidth, int32_t aYHeight, int32_t aYOffset, int32_t aYSkip, |
|
71 void *aCbData, int32_t aCbStride, int32_t aCbWidth, int32_t aCbHeight, int32_t aCbOffset, int32_t aCbSkip, |
|
72 void *aCrData, int32_t aCrStride, int32_t aCrWidth, int32_t aCrHeight, int32_t aCrOffset, int32_t aCrSkip) |
|
73 { |
|
74 mTimeUs = aTimeUs; |
|
75 mKeyFrame = aKeyFrame; |
|
76 mData = aData; |
|
77 mSize = aSize; |
|
78 mStride = aStride; |
|
79 mSliceHeight = aSliceHeight; |
|
80 mRotation = aRotation; |
|
81 Y.mData = aYData; |
|
82 Y.mStride = aYStride; |
|
83 Y.mWidth = aYWidth; |
|
84 Y.mHeight = aYHeight; |
|
85 Y.mOffset = aYOffset; |
|
86 Y.mSkip = aYSkip; |
|
87 Cb.mData = aCbData; |
|
88 Cb.mStride = aCbStride; |
|
89 Cb.mWidth = aCbWidth; |
|
90 Cb.mHeight = aCbHeight; |
|
91 Cb.mOffset = aCbOffset; |
|
92 Cb.mSkip = aCbSkip; |
|
93 Cr.mData = aCrData; |
|
94 Cr.mStride = aCrStride; |
|
95 Cr.mWidth = aCrWidth; |
|
96 Cr.mHeight = aCrHeight; |
|
97 Cr.mOffset = aCrOffset; |
|
98 Cr.mSkip = aCrSkip; |
|
99 } |
|
100 }; |
|
101 |
|
102 struct AudioFrame { |
|
103 int64_t mTimeUs; |
|
104 void *mData; // 16PCM interleaved |
|
105 size_t mSize; // Size of mData in bytes |
|
106 int32_t mAudioChannels; |
|
107 int32_t mAudioSampleRate; |
|
108 |
|
109 AudioFrame() : |
|
110 mTimeUs(0), |
|
111 mData(0), |
|
112 mSize(0), |
|
113 mAudioChannels(0), |
|
114 mAudioSampleRate(0) |
|
115 { |
|
116 } |
|
117 |
|
118 void Set(int64_t aTimeUs, |
|
119 void *aData, size_t aSize, |
|
120 int32_t aAudioChannels, int32_t aAudioSampleRate) |
|
121 { |
|
122 mTimeUs = aTimeUs; |
|
123 mData = aData; |
|
124 mSize = aSize; |
|
125 mAudioChannels = aAudioChannels; |
|
126 mAudioSampleRate = aAudioSampleRate; |
|
127 } |
|
128 }; |
|
129 |
|
130 struct Decoder; |
|
131 |
|
132 struct PluginHost { |
|
133 bool (*Read)(Decoder *aDecoder, char *aBuffer, int64_t aOffset, uint32_t aCount, uint32_t* aBytes); |
|
134 uint64_t (*GetLength)(Decoder *aDecoder); |
|
135 void (*SetMetaDataReadMode)(Decoder *aDecoder); |
|
136 void (*SetPlaybackReadMode)(Decoder *aDecoder); |
|
137 bool (*GetIntPref)(const char *aPref, int32_t *aResult); |
|
138 bool (*GetSystemInfoString)(const char *aKey, char *aResult, size_t aResultLen); |
|
139 }; |
|
140 |
|
141 struct Decoder { |
|
142 void *mResource; |
|
143 void *mPrivate; |
|
144 |
|
145 Decoder(); |
|
146 |
|
147 void (*GetDuration)(Decoder *aDecoder, int64_t *durationUs); |
|
148 void (*GetVideoParameters)(Decoder *aDecoder, int32_t *aWidth, int32_t *aHeight); |
|
149 void (*GetAudioParameters)(Decoder *aDecoder, int32_t *aNumChannels, int32_t *aSampleRate); |
|
150 bool (*HasVideo)(Decoder *aDecoder); |
|
151 bool (*HasAudio)(Decoder *aDecoder); |
|
152 bool (*ReadVideo)(Decoder *aDecoder, VideoFrame *aFrame, int64_t aSeekTimeUs, BufferCallback *aBufferCallback); |
|
153 bool (*ReadAudio)(Decoder *aDecoder, AudioFrame *aFrame, int64_t aSeekTimeUs); |
|
154 void (*DestroyDecoder)(Decoder *); |
|
155 }; |
|
156 |
|
157 struct Manifest { |
|
158 bool (*CanDecode)(const char *aMimeChars, size_t aMimeLen, const char* const**aCodecs); |
|
159 bool (*CreateDecoder)(PluginHost *aPluginHost, Decoder *aDecoder, |
|
160 const char *aMimeChars, size_t aMimeLen); |
|
161 }; |
|
162 |
|
163 } |
|
164 |
|
165 #endif |