Bug 1378666. P1 - store VideoFrameContainer in AndroidMediaReader.
So it won't need to call mDecoder->GetVideoFrameContainer().
MozReview-Commit-ID: Wc0Q8Gq8Mx
--- a/dom/media/android/AndroidMediaDecoder.cpp
+++ b/dom/media/android/AndroidMediaDecoder.cpp
@@ -16,14 +16,15 @@ AndroidMediaDecoder::AndroidMediaDecoder
, mType(aType)
{
}
MediaDecoderStateMachine* AndroidMediaDecoder::CreateStateMachine()
{
MediaDecoderReaderInit init(this);
init.mResource = mResource;
+ init.mVideoFrameContainer = GetVideoFrameContainer();
mReader = new AndroidMediaReader(mType, init);
return new MediaDecoderStateMachine(this, mReader);
}
} // namespace mozilla
--- a/dom/media/android/AndroidMediaReader.cpp
+++ b/dom/media/android/AndroidMediaReader.cpp
@@ -28,17 +28,18 @@ typedef mozilla::layers::PlanarYCbCrImag
AndroidMediaReader::AndroidMediaReader(const MediaContainerType& aContainerType,
const MediaDecoderReaderInit& aInit) :
MediaDecoderReader(aInit),
mType(aContainerType),
mPlugin(nullptr),
mHasAudio(false),
mHasVideo(false),
mVideoSeekTimeUs(-1),
- mAudioSeekTimeUs(-1)
+ mAudioSeekTimeUs(-1),
+ mVideoFrameContainer(aInit.mVideoFrameContainer)
{
}
nsresult AndroidMediaReader::ReadMetadata(MediaInfo* aInfo,
MetadataTags** aTags)
{
MOZ_ASSERT(OnTaskQueue());
@@ -69,19 +70,18 @@ nsresult AndroidMediaReader::ReadMetadat
return NS_ERROR_FAILURE;
}
// Video track's frame sizes will not overflow. Activate the video track.
mHasVideo = true;
mInfo.mVideo.mDisplay = displaySize;
mPicture = pictureRect;
mInitialFrame = frameSize;
- VideoFrameContainer* container = mDecoder->GetVideoFrameContainer();
- if (container) {
- container->ClearCurrentFrame(IntSize(displaySize.width, displaySize.height));
+ if (mVideoFrameContainer) {
+ mVideoFrameContainer->ClearCurrentFrame(IntSize(displaySize.width, displaySize.height));
}
}
if (mPlugin->HasAudio(mPlugin)) {
int32_t numChannels, sampleRate;
mPlugin->GetAudioParameters(mPlugin, &numChannels, &sampleRate);
mHasAudio = true;
mInfo.mAudio.mChannels = numChannels;
@@ -97,16 +97,17 @@ RefPtr<ShutdownPromise>
AndroidMediaReader::Shutdown()
{
ResetDecode();
if (mPlugin) {
GetAndroidMediaPluginHost()->DestroyDecoder(mPlugin);
mPlugin = nullptr;
}
+ mVideoFrameContainer = nullptr;
return MediaDecoderReader::Shutdown();
}
// Resets all state related to decoding, emptying all buffers etc.
nsresult AndroidMediaReader::ResetDecode(TrackSet aTracks)
{
if (mLastVideoFrame) {
mLastVideoFrame = nullptr;
--- a/dom/media/android/AndroidMediaReader.h
+++ b/dom/media/android/AndroidMediaReader.h
@@ -13,16 +13,17 @@
#include "mozilla/Attributes.h"
#include "mozilla/layers/SharedRGBImage.h"
#include "MPAPI.h"
namespace mozilla {
class AbstractMediaDecoder;
+class VideoFrameContainer;
namespace layers {
class ImageContainer;
}
class AndroidMediaReader : public MediaDecoderReader
{
MediaContainerType mType;
@@ -31,16 +32,18 @@ class AndroidMediaReader : public MediaD
bool mHasVideo;
nsIntRect mPicture;
nsIntSize mInitialFrame;
int64_t mVideoSeekTimeUs;
int64_t mAudioSeekTimeUs;
RefPtr<VideoData> mLastVideoFrame;
MozPromiseHolder<MediaDecoderReader::SeekPromise> mSeekPromise;
MozPromiseRequestHolder<MediaDecoderReader::VideoDataPromise> mSeekRequest;
+ RefPtr<VideoFrameContainer> mVideoFrameContainer;
+
public:
AndroidMediaReader(const MediaContainerType& aContainerType,
const MediaDecoderReaderInit& aInit);
nsresult ResetDecode(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
TrackInfo::kVideoTrack)) override;
bool DecodeAudioData() override;