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