1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #ifndef WebrtcMediaCodecVP8VideoCodec_h__ 6 #define WebrtcMediaCodecVP8VideoCodec_h__ 7 8 #include <jni.h> 9 10 #include "mozilla/Mutex.h" 11 #include "nsThreadUtils.h" 12 #include "nsAutoPtr.h" 13 14 #include "MediaConduitInterface.h" 15 #include "AudioConduit.h" 16 #include "VideoConduit.h" 17 #include "GeneratedJNIWrappers.h" 18 19 #include "webrtc/modules/video_coding/include/video_codec_interface.h" 20 21 namespace mozilla { 22 23 struct EncodedFrame { 24 uint32_t width_; 25 uint32_t height_; 26 uint32_t timeStamp_; 27 uint64_t decode_timestamp_; 28 }; 29 30 class WebrtcAndroidMediaCodec; 31 32 class WebrtcMediaCodecVP8VideoEncoder : public WebrtcVideoEncoder { 33 public: 34 WebrtcMediaCodecVP8VideoEncoder(); 35 36 virtual ~WebrtcMediaCodecVP8VideoEncoder() override; 37 38 // Implement VideoEncoder interface. PluginID()39 virtual uint64_t PluginID() const override { return 0; } 40 41 virtual int32_t InitEncode(const webrtc::VideoCodec* codecSettings, 42 int32_t numberOfCores, 43 size_t maxPayloadSize) override; 44 45 virtual int32_t Encode( 46 const webrtc::VideoFrame& inputImage, 47 const webrtc::CodecSpecificInfo* codecSpecificInfo, 48 const std::vector<webrtc::FrameType>* frame_types) override; 49 50 virtual int32_t RegisterEncodeCompleteCallback( 51 webrtc::EncodedImageCallback* callback) override; 52 53 virtual int32_t Release() override; 54 55 virtual int32_t SetChannelParameters(uint32_t packetLoss, 56 int64_t rtt) override; 57 58 virtual int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override; 59 60 private: 61 int32_t VerifyAndAllocate(const uint32_t minimumSize); 62 bool ResetInputBuffers(); 63 bool ResetOutputBuffers(); 64 65 size_t mMaxPayloadSize; 66 webrtc::EncodedImage mEncodedImage; 67 webrtc::EncodedImageCallback* mCallback; 68 uint32_t mFrameWidth; 69 uint32_t mFrameHeight; 70 71 WebrtcAndroidMediaCodec* mMediaCodecEncoder; 72 73 jobjectArray mInputBuffers; 74 jobjectArray mOutputBuffers; 75 }; 76 77 class WebrtcMediaCodecVP8VideoRemoteEncoder : public WebrtcVideoEncoder { 78 public: WebrtcMediaCodecVP8VideoRemoteEncoder()79 WebrtcMediaCodecVP8VideoRemoteEncoder() 80 : mConvertBuf(nullptr), mConvertBufsize(0), mCallback(nullptr) {} 81 82 ~WebrtcMediaCodecVP8VideoRemoteEncoder() override; 83 84 // Implement VideoEncoder interface. PluginID()85 uint64_t PluginID() const override { return 0; } 86 87 int32_t InitEncode(const webrtc::VideoCodec* codecSettings, 88 int32_t numberOfCores, size_t maxPayloadSize) override; 89 90 int32_t Encode(const webrtc::VideoFrame& inputImage, 91 const webrtc::CodecSpecificInfo* codecSpecificInfo, 92 const std::vector<webrtc::FrameType>* frame_types) override; 93 94 int32_t RegisterEncodeCompleteCallback( 95 webrtc::EncodedImageCallback* callback) override; 96 97 int32_t Release() override; 98 SetChannelParameters(uint32_t packetLoss,int64_t rtt)99 int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override { 100 return 0; 101 } 102 103 int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override; 104 105 private: 106 java::CodecProxy::GlobalRef mJavaEncoder; 107 java::CodecProxy::NativeCallbacks::GlobalRef mJavaCallbacks; 108 uint8_t* mConvertBuf; 109 uint8_t mConvertBufsize; 110 webrtc::EncodedImageCallback* mCallback; 111 }; 112 113 class WebrtcMediaCodecVP8VideoDecoder : public WebrtcVideoDecoder { 114 public: 115 WebrtcMediaCodecVP8VideoDecoder(); 116 117 virtual ~WebrtcMediaCodecVP8VideoDecoder() override; 118 119 // Implement VideoDecoder interface. PluginID()120 virtual uint64_t PluginID() const override { return 0; } 121 122 virtual int32_t InitDecode(const webrtc::VideoCodec* codecSettings, 123 int32_t numberOfCores) override; 124 125 virtual int32_t Decode( 126 const webrtc::EncodedImage& inputImage, bool missingFrames, 127 const webrtc::RTPFragmentationHeader* fragmentation, 128 const webrtc::CodecSpecificInfo* codecSpecificInfo = NULL, 129 int64_t renderTimeMs = -1) override; 130 131 virtual int32_t RegisterDecodeCompleteCallback( 132 webrtc::DecodedImageCallback* callback) override; 133 134 virtual int32_t Release() override; 135 136 private: 137 void DecodeFrame(EncodedFrame* frame); 138 void RunCallback(); 139 bool ResetInputBuffers(); 140 bool ResetOutputBuffers(); 141 142 webrtc::DecodedImageCallback* mCallback; 143 144 uint32_t mFrameWidth; 145 uint32_t mFrameHeight; 146 147 WebrtcAndroidMediaCodec* mMediaCodecDecoder; 148 jobjectArray mInputBuffers; 149 jobjectArray mOutputBuffers; 150 }; 151 152 } // namespace mozilla 153 154 #endif // WebrtcMediaCodecVP8VideoCodec_h__ 155