TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) { setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); SkData* data = m_generator->refEncodedData(); EXPECT_EQ(nullptr, data); // LocalFrame can now be decoded completely. setFrameStatus(ImageFrame::FrameComplete); addNewData(); // addNewData is calling m_generator->setData with allDataReceived == false, which means that // refEncodedData should return null. data = m_generator->refEncodedData(); EXPECT_EQ(nullptr, data); OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread")); thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())))); thread.clear(); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); addNewData(true); data = m_generator->refEncodedData(); ASSERT_TRUE(data); // To prevent data writting, SkData::unique() should be false. ASSERT_TRUE(!data->unique()); // Thread will also ref and unref the data. thread = adoptPtr(Platform::current()->createThread("RefEncodedDataThread")); thread->taskRunner()->postTask(BLINK_FROM_HERE, new Task(threadSafeBind(&decodeThreadWithRefEncodedMain, AllowCrossThreadAccess(m_generator.get())))); thread.clear(); EXPECT_EQ(4, m_decodeRequestCount); data->unref(); // m_generator is holding the only reference to SkData now. ASSERT_TRUE(data->unique()); data = m_generator->refEncodedData(); ASSERT_TRUE(data && !data->unique()); // Delete generator, and SkData should have the only reference. m_generator = nullptr; ASSERT_TRUE(data->unique()); data->unref(); }
/*********************************************************** * DESCRIPTION: overload function. * AUTHOR: Chensi * DATA: 2012-2-23 ***********************************************************/ void QGenieTray_Communication_Verify::uiCommand(const QString &objname) { qDebug() << "QGenieTray_Communication_Verify::uiCommand() " << objname; // QString strData = QString("act,") + objname; int nPos = mCacheList.count(); int nRet = addNewData(objname, SENDER); if(nRet == -1) { return; } QString tmp = mCacheList[nPos].toString(); if(mLocalSock == NULL) { return; } if(mLocalSock->state()==QLocalSocket::ConnectedState) { QDataStream out(mLocalSock); out.setVersion(QDataStream::Qt_4_6); out << tmp; } }
TEST_F(ImageFrameGeneratorTest, incompleteDecode) { setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); addNewData(); m_generator->decodeAndScale(0, imageInfo(), buffer, 100 * 4); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); }
TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesComplete) { setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(1, m_frameBufferRequestCount); EXPECT_EQ(0, m_decodersDestroyed); setFrameStatus(ImageFrame::FrameComplete); addNewData(); m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(2, m_frameBufferRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(3, m_frameBufferRequestCount); }
TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) { setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(1, m_decodeRequestCount); EXPECT_EQ(0, m_decodersDestroyed); // LocalFrame can now be decoded completely. setFrameStatus(ImageFrame::FrameComplete); addNewData(); OwnPtr<WebThread> thread = adoptPtr(Platform::current()->createThread("DecodeThread")); thread->postTask(FROM_HERE, new Task(threadSafeBind(&decodeThreadMain, AllowCrossThreadAccess(m_generator.get())))); thread.clear(); EXPECT_EQ(2, m_decodeRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(3, m_decodeRequestCount); }
TEST_F(ImageFrameGeneratorTest, incompleteDecodeBecomesCompleteMultiThreaded) { setFrameStatus(ImageFrame::FramePartial); char buffer[100 * 100 * 4]; m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(1, m_frameBufferRequestCount); EXPECT_EQ(0, m_decodersDestroyed); // LocalFrame can now be decoded completely. setFrameStatus(ImageFrame::FrameComplete); addNewData(); OwnPtr<base::Thread> thread = adoptPtr(new base::Thread("DecodeThread")); thread->Start(); thread->message_loop()->PostTask(FROM_HERE, base::Bind(&decodeThreadMain, m_generator.get())); thread.clear(); EXPECT_EQ(2, m_frameBufferRequestCount); EXPECT_EQ(1, m_decodersDestroyed); // Decoder created again. m_generator->decodeAndScale(imageInfo(), 0, buffer, 100 * 4); EXPECT_EQ(3, m_frameBufferRequestCount); }