/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOENCODER_H_ #define DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOENCODER_H_ #include "FFmpegDataEncoder.h" #include "FFmpegLibWrapper.h" #include "PlatformEncoderModule.h" #include "SimpleMap.h" // This must be the last header included #include "FFmpegLibs.h" namespace mozilla { template class FFmpegVideoEncoder : public FFmpegDataEncoder {}; template <> class FFmpegVideoEncoder : public FFmpegDataEncoder { using PtsMap = SimpleMap; public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FFmpegVideoEncoder, final); FFmpegVideoEncoder(const FFmpegLibWrapper* aLib, AVCodecID aCodecID, const RefPtr& aTaskQueue, const EncoderConfig& aConfig); RefPtr Init() override; nsCString GetDescriptionName() const override; protected: virtual ~FFmpegVideoEncoder() = default; // Methods only called on mTaskQueue. virtual MediaResult InitEncoder() override; #if LIBAVCODEC_VERSION_MAJOR >= 58 Result EncodeInputWithModernAPIs( RefPtr aSample) override; #endif virtual Result, MediaResult> ToMediaRawData( AVPacket* aPacket) override; Result, MediaResult> GetExtraData( AVPacket* aPacket) override; void ForceEnablingFFmpegDebugLogs(); struct SVCSettings { nsTArray mTemporalLayerIds; // A key-value pair for av_opt_set. std::pair mSettingKeyValue; }; bool SvcEnabled() const; Maybe GetSVCSettings(); struct H264Settings { int mProfile; int mLevel; // A list of key-value pairs for av_opt_set. nsTArray> mSettingKeyValuePairs; }; H264Settings GetH264Settings(const H264Specific& aH264Specific); struct SVCInfo { explicit SVCInfo(nsTArray&& aTemporalLayerIds) : mTemporalLayerIds(std::move(aTemporalLayerIds)), mCurrentIndex(0) {} const nsTArray mTemporalLayerIds; size_t mCurrentIndex; void UpdateTemporalLayerId(); void ResetTemporalLayerId(); uint8_t CurrentTemporalLayerId(); }; Maybe mSVCInfo{}; // Some codecs use the input frames pts for rate control. We'd rather only use // the duration. Synthetize fake pts based on integrating over the duration of // input frames. int64_t mFakePts = 0; int64_t mCurrentFramePts = 0; PtsMap mPtsMap; }; } // namespace mozilla #endif // DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGVIDEOENCODER_H_