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 { VideoPlaneVideoPlane29 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 VideoFrameVideoFrame58 VideoFrame() : 59 mTimeUs(0), 60 mKeyFrame(false), 61 mData(0), 62 mSize(0), 63 mStride(0), 64 mSliceHeight(0), 65 mRotation(0) 66 {} 67 SetVideoFrame68 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 AudioFrameAudioFrame109 AudioFrame() : 110 mTimeUs(0), 111 mData(0), 112 mSize(0), 113 mAudioChannels(0), 114 mAudioSampleRate(0) 115 { 116 } 117 SetAudioFrame118 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 166