GMPVideoEncoder.h (3095B)
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 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef mozilla_GMPVideoEncoder_h_ 8 #define mozilla_GMPVideoEncoder_h_ 9 10 #include "GMPVideoEncoderProxy.h" 11 #include "PlatformEncoderModule.h" 12 #include "TimeUnits.h" 13 #include "mozIGeckoMediaPluginService.h" 14 #include "mozilla/StaticString.h" 15 #include "nsRefPtrHashtable.h" 16 17 class GMPVideoHost; 18 19 namespace mozilla { 20 21 class GMPVideoEncoder final : public MediaDataEncoder, 22 public GMPVideoEncoderCallbackProxy { 23 public: 24 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPVideoEncoder, final); 25 26 explicit GMPVideoEncoder(const EncoderConfig& aConfig) : mConfig(aConfig) { 27 MOZ_ASSERT(mConfig.mSize.width > 0 && mConfig.mSize.height > 0); 28 } 29 30 RefPtr<InitPromise> Init() override; 31 RefPtr<EncodePromise> Encode(const MediaData* aSample) override; 32 RefPtr<EncodePromise> Encode(nsTArray<RefPtr<MediaData>>&& aSamples) override; 33 RefPtr<ReconfigurationPromise> Reconfigure( 34 const RefPtr<const EncoderConfigurationChangeList>& aConfigurationChanges) 35 override; 36 RefPtr<EncodePromise> Drain() override; 37 RefPtr<ShutdownPromise> Shutdown() override; 38 RefPtr<GenericPromise> SetBitrate(uint32_t aBitsPerSec) override; 39 40 void Encoded(GMPVideoEncodedFrame* aEncodedFrame, 41 const nsTArray<uint8_t>& aCodecSpecificInfo) override; 42 void Dropped(uint64_t aTimestamp) override; 43 void Error(GMPErr aError) override; 44 void Terminated() override; 45 46 nsCString GetDescriptionName() const override { 47 return "GMP Video Encoder"_ns; 48 } 49 50 private: 51 class InitDoneCallback final : public GetGMPVideoEncoderCallback { 52 public: 53 explicit InitDoneCallback(GMPVideoEncoder* aEncoder) : mEncoder(aEncoder) {} 54 55 void Done(GMPVideoEncoderProxy* aGMP, GMPVideoHost* aHost) override { 56 mEncoder->InitComplete(aGMP, aHost); 57 } 58 59 private: 60 RefPtr<GMPVideoEncoder> mEncoder; 61 }; 62 63 virtual ~GMPVideoEncoder() = default; 64 void InitComplete(GMPVideoEncoderProxy* aGMP, GMPVideoHost* aHost); 65 66 bool IsInitialized() const { return mGMP && mHost; } 67 68 void Teardown(const MediaResult& aResult, StaticString aCallSite); 69 70 void EncodeNextSample(nsTArray<RefPtr<MediaData>>&& aInputs, 71 MediaDataEncoder::EncodedData&& aOutputs); 72 73 const EncoderConfig mConfig; 74 nsCOMPtr<mozIGeckoMediaPluginService> mMPS; 75 GMPVideoEncoderProxy* mGMP = nullptr; 76 GMPVideoHost* mHost = nullptr; 77 MozPromiseHolder<InitPromise> mInitPromise; 78 MozPromiseHolder<EncodePromise> mDrainPromise; 79 80 using PendingEncodePromises = 81 nsRefPtrHashtable<nsUint64HashKey, EncodePromise::Private>; 82 PendingEncodePromises mPendingEncodes; 83 84 MozPromiseHolder<EncodePromise> mEncodeBatchPromise; 85 MozPromiseRequestHolder<EncodePromise> mEncodeBatchRequest; 86 }; 87 88 } // namespace mozilla 89 90 #endif // mozilla_GMPVideoEncoder_h_