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
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef JavaCallbacksSupport_h_
6 #define JavaCallbacksSupport_h_
7 
8 #include "MediaResult.h"
9 #include "MediaCodec.h"
10 #include "mozilla/java/CodecProxyNatives.h"
11 #include "mozilla/java/SampleBufferWrappers.h"
12 #include "mozilla/java/SampleWrappers.h"
13 
14 namespace mozilla {
15 
16 class JavaCallbacksSupport
17     : public java::CodecProxy::NativeCallbacks::Natives<JavaCallbacksSupport> {
18  public:
19   typedef java::CodecProxy::NativeCallbacks::Natives<JavaCallbacksSupport> Base;
20   using Base::AttachNative;
21   using Base::DisposeNative;
22   using Base::GetNative;
23 
JavaCallbacksSupport()24   JavaCallbacksSupport() : mCanceled(false) {}
25 
~JavaCallbacksSupport()26   virtual ~JavaCallbacksSupport() {}
27 
28   virtual void HandleInput(int64_t aTimestamp, bool aProcessed) = 0;
29 
OnInputStatus(jlong aTimestamp,bool aProcessed)30   void OnInputStatus(jlong aTimestamp, bool aProcessed) {
31     if (!mCanceled) {
32       HandleInput(aTimestamp, aProcessed);
33     }
34   }
35 
36   virtual void HandleOutput(java::Sample::Param aSample,
37                             java::SampleBuffer::Param aBuffer) = 0;
38 
OnOutput(jni::Object::Param aSample,jni::Object::Param aBuffer)39   void OnOutput(jni::Object::Param aSample, jni::Object::Param aBuffer) {
40     if (!mCanceled) {
41       HandleOutput(java::Sample::Ref::From(aSample),
42                    java::SampleBuffer::Ref::From(aBuffer));
43     }
44   }
45 
HandleOutputFormatChanged(java::sdk::MediaFormat::Param aFormat)46   virtual void HandleOutputFormatChanged(
47       java::sdk::MediaFormat::Param aFormat){};
48 
OnOutputFormatChanged(jni::Object::Param aFormat)49   void OnOutputFormatChanged(jni::Object::Param aFormat) {
50     if (!mCanceled) {
51       HandleOutputFormatChanged(java::sdk::MediaFormat::Ref::From(aFormat));
52     }
53   }
54 
55   virtual void HandleError(const MediaResult& aError) = 0;
56 
OnError(bool aIsFatal)57   void OnError(bool aIsFatal) {
58     if (!mCanceled) {
59       HandleError(aIsFatal
60                       ? MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__)
61                       : MediaResult(NS_ERROR_DOM_MEDIA_DECODE_ERR, __func__));
62     }
63   }
64 
Cancel()65   void Cancel() { mCanceled = true; }
66 
67  private:
68   Atomic<bool> mCanceled;
69 };
70 
71 }  // namespace mozilla
72 
73 #endif
74