Skip to content
Snippets Groups Projects
Commit d661761c authored by John Lin's avatar John Lin Committed by Richard Pospesel
Browse files

Bug 1832832 - protect encoder accesses in Java callbacks. r=media-playback-reviewers,alwu a=pascalc

parent e8d02fc5
No related merge requests found
...@@ -494,7 +494,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleInput( ...@@ -494,7 +494,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleInput(
template <typename ConfigType> template <typename ConfigType>
void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleOutput( void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleOutput(
java::Sample::Param aSample, java::SampleBuffer::Param aBuffer) { java::Sample::Param aSample, java::SampleBuffer::Param aBuffer) {
mEncoder->ProcessOutput(std::move(aSample), std::move(aBuffer)); MutexAutoLock lock(mMutex);
if (mEncoder) {
mEncoder->ProcessOutput(std::move(aSample), std::move(aBuffer));
}
} }
template <typename ConfigType> template <typename ConfigType>
...@@ -504,7 +507,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport:: ...@@ -504,7 +507,10 @@ void AndroidDataEncoder<ConfigType>::CallbacksSupport::
template <typename ConfigType> template <typename ConfigType>
void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleError( void AndroidDataEncoder<ConfigType>::CallbacksSupport::HandleError(
const MediaResult& aError) { const MediaResult& aError) {
mEncoder->Error(aError); MutexAutoLock lock(mMutex);
if (mEncoder) {
mEncoder->Error(aError);
}
} }
// Force compiler to generate code. // Force compiler to generate code.
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "mozilla/Maybe.h" #include "mozilla/Maybe.h"
#include "mozilla/Monitor.h" #include "mozilla/Monitor.h"
#include "mozilla/Mutex.h"
namespace mozilla { namespace mozilla {
...@@ -36,7 +37,15 @@ class AndroidDataEncoder final : public MediaDataEncoder { ...@@ -36,7 +37,15 @@ class AndroidDataEncoder final : public MediaDataEncoder {
class CallbacksSupport final : public JavaCallbacksSupport { class CallbacksSupport final : public JavaCallbacksSupport {
public: public:
explicit CallbacksSupport(AndroidDataEncoder* aEncoder) explicit CallbacksSupport(AndroidDataEncoder* aEncoder)
: mEncoder(aEncoder) {} : mMutex("AndroidDataEncoder::CallbacksSupport") {
MutexAutoLock lock(mMutex);
mEncoder = aEncoder;
}
~CallbacksSupport() {
MutexAutoLock lock(mMutex);
mEncoder = nullptr;
}
void HandleInput(int64_t aTimestamp, bool aProcessed) override; void HandleInput(int64_t aTimestamp, bool aProcessed) override;
void HandleOutput(java::Sample::Param aSample, void HandleOutput(java::Sample::Param aSample,
...@@ -46,7 +55,8 @@ class AndroidDataEncoder final : public MediaDataEncoder { ...@@ -46,7 +55,8 @@ class AndroidDataEncoder final : public MediaDataEncoder {
void HandleError(const MediaResult& aError) override; void HandleError(const MediaResult& aError) override;
private: private:
AndroidDataEncoder* mEncoder; Mutex mMutex;
AndroidDataEncoder* mEncoder MOZ_GUARDED_BY(mMutex);
}; };
friend class CallbacksSupport; friend class CallbacksSupport;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment