Bug 1299072: P18. Use MediaResult with InitPromise. r=gerald

MozReview-Commit-ID: JiLgiyxvfNC

--HG--
extra : rebase_source : 4cc453a5fe7b1e4f4b865c31a24a5feed64df7e4
This commit is contained in:
Jean-Yves Avenard 2016-09-13 13:06:18 +10:00
Родитель ad3b418b6d
Коммит 70ed5282de
24 изменённых файлов: 56 добавлений и 62 удалений

Просмотреть файл

@ -218,7 +218,7 @@ BenchmarkPlayback::InitDecoder(TrackInfo&& aInfo)
[this, ref](TrackInfo::TrackType aTrackType) {
InputExhausted();
},
[this, ref](MediaDataDecoder::DecoderFailureReason aReason) {
[this, ref](MediaResult aError) {
MainThreadShutdown();
});
}

Просмотреть файл

@ -479,11 +479,11 @@ MediaFormatReader::EnsureDecoderInitialized(TrackType aTrack)
self->SetVideoDecodeThreshold();
self->ScheduleUpdate(aTrack);
},
[self, aTrack] (MediaDataDecoder::DecoderFailureReason aResult) {
[self, aTrack] (MediaResult aError) {
auto& decoder = self->GetDecoderData(aTrack);
decoder.mInitPromise.Complete();
decoder.ShutdownDecoder();
self->NotifyError(aTrack);
self->NotifyError(aTrack, aError);
}));
return false;
}

Просмотреть файл

@ -279,7 +279,7 @@ MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject*
taskQueue->AwaitShutdownAndIdle();
promise->MaybeResolve(result);
},
[promise, decoder, taskQueue] (MediaDataDecoder::DecoderFailureReason aResult) {
[promise, decoder, taskQueue] (MediaResult aError) {
decoder->Shutdown();
taskQueue->BeginShutdown();
taskQueue->AwaitShutdownAndIdle();

Просмотреть файл

@ -215,13 +215,8 @@ protected:
virtual ~MediaDataDecoder() {};
public:
enum class DecoderFailureReason : uint8_t {
INIT_ERROR,
CANCELED
};
typedef TrackInfo::TrackType TrackType;
typedef MozPromise<TrackType, DecoderFailureReason, /* IsExclusive = */ true> InitPromise;
typedef MozPromise<TrackType, MediaResult, /* IsExclusive = */ true> InitPromise;
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataDecoder)

Просмотреть файл

@ -61,14 +61,14 @@ OpusDataDecoder::Init()
uint8_t *p = mInfo.mCodecSpecificConfig->Elements();
if (length < sizeof(uint64_t)) {
OPUS_DEBUG("CodecSpecificConfig too short to read codecDelay!");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
int64_t codecDelay = BigEndian::readUint64(p);
length -= sizeof(uint64_t);
p += sizeof(uint64_t);
if (NS_FAILED(DecodeHeader(p, length))) {
OPUS_DEBUG("Error decoding header!");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
int r;
@ -84,7 +84,7 @@ OpusDataDecoder::Init()
if (codecDelay != FramesToUsecs(mOpusParser->mPreSkip,
mOpusParser->mRate).value()) {
NS_WARNING("Invalid Opus header: CodecDelay and pre-skip do not match!");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
if (mInfo.mRate != (uint32_t)mOpusParser->mRate) {
@ -95,7 +95,7 @@ OpusDataDecoder::Init()
}
return r == OPUS_OK ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__)
: InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
: InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
nsresult

Просмотреть файл

@ -78,22 +78,22 @@ TheoraDecoder::Init()
if (!XiphExtradataToHeaders(headers, headerLens,
mInfo.mCodecSpecificConfig->Elements(),
mInfo.mCodecSpecificConfig->Length())) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
for (size_t i = 0; i < headers.Length(); i++) {
if (NS_FAILED(DoDecodeHeader(headers[i], headerLens[i]))) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
}
if (mPacketCount != 3) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
mTheoraDecoderContext = th_decode_alloc(&mTheoraInfo, mTheoraSetupInfo);
if (mTheoraDecoderContext) {
return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
} else {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
}

Просмотреть файл

@ -80,7 +80,7 @@ VPXDecoder::Init()
config.w = config.h = 0; // set after decode
if (!dx || vpx_codec_dec_init(&mVPX, dx, &config, 0)) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
}

Просмотреть файл

@ -72,11 +72,11 @@ VorbisDataDecoder::Init()
if (!XiphExtradataToHeaders(headers, headerLens,
mInfo.mCodecSpecificConfig->Elements(),
mInfo.mCodecSpecificConfig->Length())) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
for (size_t i = 0; i < headers.Length(); i++) {
if (NS_FAILED(DecodeHeader(headers[i], headerLens[i]))) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
}
@ -84,12 +84,12 @@ VorbisDataDecoder::Init()
int r = vorbis_synthesis_init(&mVorbisDsp, &mVorbisInfo);
if (r) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
r = vorbis_block_init(&mVorbisDsp, &mVorbisBlock);
if (r) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
if (mInfo.mRate != (uint32_t)mVorbisDsp.vi->rate) {
@ -103,7 +103,7 @@ VorbisDataDecoder::Init()
AudioConfig::ChannelLayout layout(mVorbisDsp.vi->channels);
if (!layout.IsValid()) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);

Просмотреть файл

@ -196,7 +196,7 @@ GMPAudioDecoder::GMPInitDone(GMPAudioDecoderProxy* aGMP)
MOZ_ASSERT(IsOnGMPThread());
if (!aGMP) {
mInitPromise.RejectIfExists(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
if (mInitPromise.IsEmpty()) {
@ -217,7 +217,7 @@ GMPAudioDecoder::GMPInitDone(GMPAudioDecoderProxy* aGMP)
mAdapter);
if (NS_FAILED(rv)) {
aGMP->Close();
mInitPromise.Reject(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
@ -239,7 +239,7 @@ GMPAudioDecoder::Init()
InitTags(tags);
UniquePtr<GetGMPAudioDecoderCallback> callback(new GMPInitDoneCallback(this));
if (NS_FAILED(mMPS->GetGMPAudioDecoder(mCrashHelper, &tags, GetNodeId(), Move(callback)))) {
mInitPromise.Reject(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return promise;
@ -291,7 +291,7 @@ GMPAudioDecoder::Drain()
void
GMPAudioDecoder::Shutdown()
{
mInitPromise.RejectIfExists(MediaDataDecoder::DecoderFailureReason::CANCELED, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
if (!mGMP) {
return;
}

Просмотреть файл

@ -233,7 +233,7 @@ GMPVideoDecoder::GMPInitDone(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost)
MOZ_ASSERT(IsOnGMPThread());
if (!aGMP) {
mInitPromise.RejectIfExists(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
MOZ_ASSERT(aHost);
@ -262,7 +262,7 @@ GMPVideoDecoder::GMPInitDone(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost)
} else {
// Unrecognized mime type
aGMP->Close();
mInitPromise.Reject(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
codec.mWidth = mConfig.mImage.width;
@ -274,7 +274,7 @@ GMPVideoDecoder::GMPInitDone(GMPVideoDecoderProxy* aGMP, GMPVideoHost* aHost)
PR_GetNumberOfProcessors());
if (NS_FAILED(rv)) {
aGMP->Close();
mInitPromise.Reject(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
@ -308,7 +308,7 @@ GMPVideoDecoder::Init()
InitTags(tags);
UniquePtr<GetGMPVideoDecoderCallback> callback(new GMPInitDoneCallback(this));
if (NS_FAILED(mMPS->GetGMPVideoDecoder(mCrashHelper, &tags, GetNodeId(), Move(callback)))) {
mInitPromise.Reject(MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return promise;
@ -364,7 +364,7 @@ GMPVideoDecoder::Drain()
void
GMPVideoDecoder::Shutdown()
{
mInitPromise.RejectIfExists(MediaDataDecoder::DecoderFailureReason::CANCELED, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
// Note that this *may* be called from the proxy thread also.
if (!mGMP) {
return;

Просмотреть файл

@ -75,11 +75,11 @@ public:
mSurfaceTexture = AndroidSurfaceTexture::Create();
if (!mSurfaceTexture) {
NS_WARNING("Failed to create SurfaceTexture for video decode\n");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
if (NS_FAILED(InitDecoder(mSurfaceTexture->JavaSurface()))) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);
@ -260,7 +260,7 @@ MediaCodecDataDecoder::Init()
return NS_SUCCEEDED(rv) ?
InitPromise::CreateAndResolve(type, __func__) :
InitPromise::CreateAndReject(
MediaDataDecoder::DecoderFailureReason::INIT_ERROR, __func__);
NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
nsresult

Просмотреть файл

@ -196,7 +196,7 @@ public:
mSurfaceTexture = AndroidSurfaceTexture::Create();
if (!mSurfaceTexture) {
NS_WARNING("Failed to create SurfaceTexture for video decode\n");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
// Register native methods.
@ -208,7 +208,7 @@ public:
mJavaDecoder = CodecProxy::Create(mFormat, mSurfaceTexture->JavaSurface(), mJavaCallbacks);
if (mJavaDecoder == nullptr) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
mInputDurations.Clear();
@ -306,7 +306,7 @@ public:
mJavaDecoder = CodecProxy::Create(mFormat, nullptr, mJavaCallbacks);
if (mJavaDecoder == nullptr) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__);

Просмотреть файл

@ -57,7 +57,7 @@ AppleATDecoder::Init()
{
if (!mFormatID) {
NS_ERROR("Non recognised format");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackType::kAudioTrack, __func__);

Просмотреть файл

@ -71,7 +71,7 @@ AppleVTDecoder::Init()
return InitPromise::CreateAndResolve(TrackType::kVideoTrack, __func__);
}
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
void

Просмотреть файл

@ -33,7 +33,7 @@ FFmpegAudioDecoder<LIBAV_VER>::Init()
nsresult rv = InitDecoder();
return rv == NS_OK ? InitPromise::CreateAndResolve(TrackInfo::kAudioTrack, __func__)
: InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
: InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
void

Просмотреть файл

@ -121,7 +121,7 @@ RefPtr<MediaDataDecoder::InitPromise>
FFmpegVideoDecoder<LIBAV_VER>::Init()
{
if (NS_FAILED(InitDecoder())) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
return InitPromise::CreateAndResolve(TrackInfo::kVideoTrack, __func__);

Просмотреть файл

@ -57,7 +57,7 @@ GonkAudioDecoderManager::Init()
if (InitMediaCodecProxy()) {
return InitPromise::CreateAndResolve(TrackType::kAudioTrack, __func__);
} else {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
}

Просмотреть файл

@ -141,7 +141,7 @@ GonkDecoderManager::Shutdown()
mDecoder = nullptr;
}
mInitPromise.RejectIfExists(DecoderFailureReason::CANCELED, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
return NS_OK;
}

Просмотреть файл

@ -23,7 +23,6 @@ class GonkDecoderManager : public android::AHandler {
public:
typedef TrackInfo::TrackType TrackType;
typedef MediaDataDecoder::InitPromise InitPromise;
typedef MediaDataDecoder::DecoderFailureReason DecoderFailureReason;
virtual ~GonkDecoderManager() {}

Просмотреть файл

@ -130,25 +130,25 @@ GonkVideoDecoderManager::Init()
if (uint32_t(mConfig.mImage.width * mConfig.mImage.height) > maxWidth * maxHeight) {
GVDM_LOG("Video resolution exceeds hw codec capability");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
// Validate the container-reported frame and pictureRect sizes. This ensures
// that our video frame creation code doesn't overflow.
if (!IsValidVideoRegion(mConfig.mImage, mConfig.ImageRect(), mConfig.mDisplay)) {
GVDM_LOG("It is not a valid region");
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
mReaderTaskQueue = AbstractThread::GetCurrent()->AsTaskQueue();
MOZ_ASSERT(mReaderTaskQueue);
if (mDecodeLooper.get() != nullptr) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
if (!InitLoopers(MediaData::VIDEO_DATA)) {
return InitPromise::CreateAndReject(DecoderFailureReason::INIT_ERROR, __func__);
return InitPromise::CreateAndReject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
}
RefPtr<InitPromise> p = mInitPromise.Ensure(__func__);
@ -672,7 +672,7 @@ GonkVideoDecoderManager::codecReserved()
if (rv != OK) {
GVDM_LOG("Failed to configure codec!!!!");
mInitPromise.Reject(DecoderFailureReason::INIT_ERROR, __func__);
mInitPromise.Reject(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
return;
}
@ -683,7 +683,7 @@ void
GonkVideoDecoderManager::codecCanceled()
{
GVDM_LOG("codecCanceled");
mInitPromise.RejectIfExists(DecoderFailureReason::CANCELED, __func__);
mInitPromise.RejectIfExists(NS_ERROR_DOM_MEDIA_CANCELED, __func__);
}
// Called on GonkDecoderManager::mTaskLooper thread.

Просмотреть файл

@ -169,7 +169,7 @@ OmxDataDecoder::Init()
MOZ_ASSERT(self->mOmxState != OMX_StateIdle);
},
[self] () {
self->RejectInitPromise(DecoderFailureReason::INIT_ERROR, __func__);
self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
});
return p;
@ -551,13 +551,13 @@ OmxDataDecoder::ResolveInitPromise(const char* aMethodName)
}
void
OmxDataDecoder::RejectInitPromise(DecoderFailureReason aReason, const char* aMethodName)
OmxDataDecoder::RejectInitPromise(MediaResult aError, const char* aMethodName)
{
RefPtr<OmxDataDecoder> self = this;
nsCOMPtr<nsIRunnable> r =
NS_NewRunnableFunction([self, aReason, aMethodName] () {
NS_NewRunnableFunction([self, aError, aMethodName] () {
MOZ_ASSERT(self->mReaderTaskQueue->IsCurrentThreadIn());
self->mInitPromise.RejectIfExists(aReason, aMethodName);
self->mInitPromise.RejectIfExists(aError, aMethodName);
});
mReaderTaskQueue->Dispatch(r.forget());
}
@ -583,7 +583,7 @@ OmxDataDecoder::OmxStateRunner()
MOZ_ASSERT(self->mOmxState == OMX_StateIdle);
},
[self] () {
self->RejectInitPromise(DecoderFailureReason::INIT_ERROR, __func__);
self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
});
// Allocate input and output buffers.
@ -591,7 +591,7 @@ OmxDataDecoder::OmxStateRunner()
for(const auto id : types) {
if (NS_FAILED(AllocateBuffers(id))) {
LOG("Failed to allocate buffer on port %d", id);
RejectInitPromise(DecoderFailureReason::INIT_ERROR, __func__);
RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
break;
}
}
@ -606,7 +606,7 @@ OmxDataDecoder::OmxStateRunner()
self->ResolveInitPromise(__func__);
},
[self] () {
self->RejectInitPromise(DecoderFailureReason::INIT_ERROR, __func__);
self->RejectInitPromise(NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__);
});
} else if (mOmxState == OMX_StateExecuting) {
// Configure codec once it gets OMX_StateExecuting state.

Просмотреть файл

@ -87,7 +87,7 @@ protected:
void ResolveInitPromise(const char* aMethodName);
void RejectInitPromise(DecoderFailureReason aReason, const char* aMethodName);
void RejectInitPromise(MediaResult aError, const char* aMethodName);
void OmxStateRunner();

Просмотреть файл

@ -249,7 +249,7 @@ H264Converter::OnDecoderInitDone(const TrackType aTrackType)
}
void
H264Converter::OnDecoderInitFailed(MediaDataDecoder::DecoderFailureReason aReason)
H264Converter::OnDecoderInitFailed(MediaResult aError)
{
mInitPromiseRequest.Complete();
mCallback->Error(MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,

Просмотреть файл

@ -51,7 +51,7 @@ private:
void UpdateConfigFromExtraData(MediaByteBuffer* aExtraData);
void OnDecoderInitDone(const TrackType aTrackType);
void OnDecoderInitFailed(MediaDataDecoder::DecoderFailureReason aReason);
void OnDecoderInitFailed(MediaResult aError);
RefPtr<PlatformDecoderModule> mPDM;
VideoInfo mOriginalConfig;