diff options
Diffstat (limited to 'media/gmp-clearkey/0.1/VideoDecoder.h')
-rw-r--r-- | media/gmp-clearkey/0.1/VideoDecoder.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/media/gmp-clearkey/0.1/VideoDecoder.h b/media/gmp-clearkey/0.1/VideoDecoder.h new file mode 100644 index 000000000..cf021efd7 --- /dev/null +++ b/media/gmp-clearkey/0.1/VideoDecoder.h @@ -0,0 +1,110 @@ +/* + * Copyright 2013, Mozilla Foundation and contributors + * + * 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 __VideoDecoder_h__ +#define __VideoDecoder_h__ + +#include <atomic> + +#include "gmp-task-utils.h" +#include "gmp-video-decode.h" +#include "gmp-video-host.h" +#include "WMFH264Decoder.h" + +#include "mfobjects.h" + +class VideoDecoder : public GMPVideoDecoder + , public RefCounted +{ +public: + VideoDecoder(GMPVideoHost *aHostAPI); + + virtual void InitDecode(const GMPVideoCodec& aCodecSettings, + const uint8_t* aCodecSpecific, + uint32_t aCodecSpecificLength, + GMPVideoDecoderCallback* aCallback, + int32_t aCoreCount) override; + + virtual void Decode(GMPVideoEncodedFrame* aInputFrame, + bool aMissingFrames, + const uint8_t* aCodecSpecific, + uint32_t aCodecSpecificLength, + int64_t aRenderTimeMs = -1); + + virtual void Reset() override; + + virtual void Drain() override; + + virtual void DecodingComplete() override; + + bool HasShutdown() { return mHasShutdown; } + +private: + + virtual ~VideoDecoder(); + + void EnsureWorker(); + + void DrainTask(); + + struct DecodeData { + DecodeData() + : mTimestamp(0) + , mDuration(0) + , mIsKeyframe(false) + {} + std::vector<uint8_t> mBuffer; + uint64_t mTimestamp; + uint64_t mDuration; + bool mIsKeyframe; + CryptoMetaData mCrypto; + }; + + void DecodeTask(DecodeData* aData); + + void ResetCompleteTask(); + + void ReturnOutput(IMFSample* aSample, + int32_t aWidth, + int32_t aHeight, + int32_t aStride); + + HRESULT SampleToVideoFrame(IMFSample* aSample, + int32_t aWidth, + int32_t aHeight, + int32_t aStride, + GMPVideoi420Frame* aVideoFrame); + + void MaybeRunOnMainThread(GMPTask* aTask); + + GMPVideoHost *mHostAPI; // host-owned, invalid at DecodingComplete + GMPVideoDecoderCallback* mCallback; // host-owned, invalid at DecodingComplete + GMPThread* mWorkerThread; + GMPMutex* mMutex; + wmf::AutoPtr<wmf::WMFH264Decoder> mDecoder; + + std::vector<uint8_t> mExtraData; + std::vector<uint8_t> mAnnexB; + + int32_t mNumInputTasks; + bool mSentExtraData; + + std::atomic<bool> mIsFlushing; + + bool mHasShutdown; +}; + +#endif // __VideoDecoder_h__ |