void GMPVideoDecoder::Decoded(GMPVideoi420Frame* aDecodedFrame) { GMPUniquePtr<GMPVideoi420Frame> decodedFrame(aDecodedFrame); MOZ_ASSERT(IsOnGMPThread()); VideoData::YCbCrBuffer b; for (int i = 0; i < kGMPNumOfPlanes; ++i) { b.mPlanes[i].mData = decodedFrame->Buffer(GMPPlaneType(i)); b.mPlanes[i].mStride = decodedFrame->Stride(GMPPlaneType(i)); if (i == kGMPYPlane) { b.mPlanes[i].mWidth = decodedFrame->Width(); b.mPlanes[i].mHeight = decodedFrame->Height(); } else { b.mPlanes[i].mWidth = (decodedFrame->Width() + 1) / 2; b.mPlanes[i].mHeight = (decodedFrame->Height() + 1) / 2; } b.mPlanes[i].mOffset = 0; b.mPlanes[i].mSkip = 0; } gfx::IntRect pictureRegion( 0, 0, decodedFrame->Width(), decodedFrame->Height()); RefPtr<VideoData> v = VideoData::CreateAndCopyData( mConfig, mImageContainer, mLastStreamOffset, media::TimeUnit::FromMicroseconds(decodedFrame->Timestamp()), media::TimeUnit::FromMicroseconds(decodedFrame->Duration()), b, false, media::TimeUnit::FromMicroseconds(-1), pictureRegion); RefPtr<GMPVideoDecoder> self = this; if (v) { mDecodedData.AppendElement(std::move(v)); } else { mDecodedData.Clear(); mDecodePromise.RejectIfExists( MediaResult(NS_ERROR_OUT_OF_MEMORY, RESULT_DETAIL("CallBack::CreateAndCopyData")), __func__); } }
void VideoCallbackAdapter::Decoded(GMPVideoi420Frame* aDecodedFrame) { GMPUniquePtr<GMPVideoi420Frame> decodedFrame(aDecodedFrame); MOZ_ASSERT(IsOnGMPThread()); VideoData::YCbCrBuffer b; for (int i = 0; i < kGMPNumOfPlanes; ++i) { b.mPlanes[i].mData = decodedFrame->Buffer(GMPPlaneType(i)); b.mPlanes[i].mStride = decodedFrame->Stride(GMPPlaneType(i)); if (i == kGMPYPlane) { b.mPlanes[i].mWidth = decodedFrame->Width(); b.mPlanes[i].mHeight = decodedFrame->Height(); } else { b.mPlanes[i].mWidth = (decodedFrame->Width() + 1) / 2; b.mPlanes[i].mHeight = (decodedFrame->Height() + 1) / 2; } b.mPlanes[i].mOffset = 0; b.mPlanes[i].mSkip = 0; } gfx::IntRect pictureRegion(0, 0, decodedFrame->Width(), decodedFrame->Height()); RefPtr<VideoData> v = VideoData::CreateAndCopyData(mVideoInfo, mImageContainer, mLastStreamOffset, decodedFrame->Timestamp(), decodedFrame->Duration(), b, false, -1, pictureRegion); if (v) { mCallback->Output(v); } else { mCallback->Error(MediaResult(NS_ERROR_OUT_OF_MEMORY, __func__)); } }