FFmpegDataEncoder.h (4448B)
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 DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGDATAENCODER_H_ 8 #define DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGDATAENCODER_H_ 9 10 #include "FFmpegLibWrapper.h" 11 #include "PlatformEncoderModule.h" 12 #include "SimpleMap.h" 13 #include "mozilla/ThreadSafety.h" 14 15 // This must be the last header included 16 #include "FFmpegLibs.h" 17 18 namespace mozilla { 19 20 template <int V> 21 AVCodecID GetFFmpegEncoderCodecId(CodecType aCodec); 22 23 template <> 24 AVCodecID GetFFmpegEncoderCodecId<LIBAV_VER>(CodecType aCodec); 25 26 template <int V> 27 class FFmpegDataEncoder : public MediaDataEncoder {}; 28 29 template <> 30 class FFmpegDataEncoder<LIBAV_VER> : public MediaDataEncoder { 31 using DurationMap = SimpleMap<int64_t, int64_t, ThreadSafePolicy>; 32 33 public: 34 static AVCodec* FindSoftwareEncoder(const FFmpegLibWrapper* aLib, 35 AVCodecID aCodecId); 36 #ifdef MOZ_USE_HWDECODE 37 static AVCodec* FindHardwareEncoder(const FFmpegLibWrapper* aLib, 38 AVCodecID aCodecId); 39 #endif 40 41 FFmpegDataEncoder(const FFmpegLibWrapper* aLib, AVCodecID aCodecID, 42 const RefPtr<TaskQueue>& aTaskQueue, 43 const EncoderConfig& aConfig); 44 45 /* MediaDataEncoder Methods */ 46 // All methods run on the task queue, except for GetDescriptionName. 47 RefPtr<InitPromise> Init() override = 0; // Implemented in the sub-classes. 48 RefPtr<EncodePromise> Encode(const MediaData* aSample) override; 49 RefPtr<EncodePromise> Encode(nsTArray<RefPtr<MediaData>>&& aSamples) override; 50 RefPtr<ReconfigurationPromise> Reconfigure( 51 const RefPtr<const EncoderConfigurationChangeList>& aConfigurationChanges) 52 override; 53 RefPtr<EncodePromise> Drain() override; 54 RefPtr<ShutdownPromise> Shutdown() override; 55 RefPtr<GenericPromise> SetBitrate(uint32_t aBitRate) override; 56 57 protected: 58 Result<AVCodecContext*, MediaResult> AllocateCodecContext(bool aHardware); 59 60 // This method copies data from an AVPacket into a newly created MediaRawData. 61 // It should serve as the initial step in implementing ToMediaRawData. 62 static Result<RefPtr<MediaRawData>, MediaResult> CreateMediaRawData( 63 AVPacket* aPacket); 64 65 // Methods only called on mTaskQueue. 66 RefPtr<EncodePromise> ProcessEncode(nsTArray<RefPtr<MediaData>>&& aSamples); 67 RefPtr<ReconfigurationPromise> ProcessReconfigure( 68 const RefPtr<const EncoderConfigurationChangeList>& 69 aConfigurationChanges); 70 RefPtr<EncodePromise> ProcessDrain(); 71 RefPtr<ShutdownPromise> ProcessShutdown(); 72 // Initialize the audio or video-specific members of an encoder instance. 73 virtual MediaResult InitEncoder() = 0; 74 75 void SetContextBitrate(); 76 77 void ShutdownInternal(); 78 int OpenCodecContext(const AVCodec* aCodec, AVDictionary** aOptions) 79 MOZ_EXCLUDES(sMutex); 80 void ReleaseCodecContext() MOZ_EXCLUDES(sMutex); 81 bool PrepareFrame(); 82 void DestroyFrame(); 83 #if LIBAVCODEC_VERSION_MAJOR >= 58 84 virtual Result<EncodedData, MediaResult> EncodeInputWithModernAPIs( 85 RefPtr<const MediaData> aSample) = 0; 86 Result<EncodedData, MediaResult> EncodeWithModernAPIs(); 87 virtual Result<EncodedData, MediaResult> DrainWithModernAPIs(); 88 #endif 89 // Convert an AVPacket to a MediaRawData. This can return nullptr if a packet 90 // has been processed by the encoder, but is not to be returned to the caller, 91 // because DTX is enabled. 92 virtual Result<RefPtr<MediaRawData>, MediaResult> ToMediaRawData( 93 AVPacket* aPacket) = 0; 94 virtual Result<already_AddRefed<MediaByteBuffer>, MediaResult> GetExtraData( 95 AVPacket* aPacket) = 0; 96 97 // This refers to a static FFmpegLibWrapper, so raw pointer is adequate. 98 const FFmpegLibWrapper* mLib; 99 const AVCodecID mCodecID; 100 const RefPtr<TaskQueue> mTaskQueue; 101 102 // set in constructor, modified when parameters change 103 EncoderConfig mConfig; 104 105 // mTaskQueue only. 106 nsCString mCodecName; 107 AVCodecContext* mCodecContext; 108 AVFrame* mFrame; 109 DurationMap mDurationMap; 110 111 // Provide critical-section for open/close mCodecContext. 112 static StaticMutex sMutex; 113 const bool mVideoCodec; 114 }; 115 116 } // namespace mozilla 117 118 #endif /* DOM_MEDIA_PLATFORMS_FFMPEG_FFMPEGDATAENCODER_H_ */