// Directs the media processing task to add the flow graph to its // set of managed flow graphs. The flow graph must be in the // MpFlowGraphBase::STOPPED state when this method is invoked. // Returns OS_INVALID_ARGUMENT if the flow graph is not in the STOPPED state. // Otherwise returns OS_SUCCESS to indicate that the flow graph will be added // to the set of managed flow graphs at the start of the next frame // processing interval. OsStatus MpMediaTask::manageFlowGraph(MpFlowGraphBase& rFlowGraph) { MpMediaTaskMsg msg(MpMediaTaskMsg::MANAGE, &rFlowGraph); OsStatus res; if (rFlowGraph.getState() != MpFlowGraphBase::STOPPED) { // PRINTF("MpMediaTask::manageFlowGraph: error!\n", 0,0,0,0,0,0); return OS_INVALID_ARGUMENT; } res = postMessage(msg, OsTime::NO_WAIT); assert(res == OS_SUCCESS); return OS_SUCCESS; }
void testStartAndStop() { MpFlowGraphBase* pFlowGraph = 0; OsStatus res; pFlowGraph = new MpFlowGraphBase(80, 8000); CPPUNIT_ASSERT(!pFlowGraph->isStarted()); // verify the flow graph is not STARTED CPPUNIT_ASSERT(MpFlowGraphBase::STOPPED == pFlowGraph->getState()); res = pFlowGraph->start(); // now start it CPPUNIT_ASSERT(res == OS_SUCCESS); res = pFlowGraph->processNextFrame(); CPPUNIT_ASSERT((res == OS_SUCCESS) && pFlowGraph->isStarted()); CPPUNIT_ASSERT(MpFlowGraphBase::STARTED == pFlowGraph->getState()); res = pFlowGraph->stop(); // now stop it again CPPUNIT_ASSERT(res == OS_SUCCESS); res = pFlowGraph->processNextFrame(); CPPUNIT_ASSERT((res == OS_SUCCESS) && !pFlowGraph->isStarted()); CPPUNIT_ASSERT(MpFlowGraphBase::STOPPED == pFlowGraph->getState()); delete pFlowGraph; }
// Directs the media processing task to add the flow graph to its // set of managed flow graphs. The flow graph must be in the // MpFlowGraphBase::STOPPED state when this method is invoked. // Returns OS_INVALID_ARGUMENT if the flow graph is not in the STOPPED state. // Otherwise returns OS_SUCCESS to indicate that the flow graph will be added // to the set of managed flow graphs at the start of the next frame // processing interval. OsStatus MpMediaTask::manageFlowGraph(MpFlowGraphBase& rFlowGraph) { OsEvent event; MpMediaTaskMsg msg(MpMediaTaskMsg::MANAGE, &rFlowGraph, &event); OsStatus res; if (rFlowGraph.getState() != MpFlowGraphBase::STOPPED) { // PRINTF("MpMediaTask::manageFlowGraph: error!\n", 0,0,0,0,0,0); return OS_INVALID_ARGUMENT; } res = postMessage(msg, OsTime::NO_WAIT_TIME); assert(res == OS_SUCCESS); // wait until flowgraph is managed event.wait(); return OS_SUCCESS; }
void testCreators() { MpFlowGraphBase* pFlowGraph = 0; MpTestResource* pResource1 = 0; MpTestResource* pResource2 = 0; OsStatus res; // verify that we can create and delete MpFlowGraphBase objects pFlowGraph = new MpFlowGraphBase(80, 8000); // verify that the initial state information is sensible CPPUNIT_ASSERT(pFlowGraph->getState() == MpFlowGraphBase::STOPPED); CPPUNIT_ASSERT(pFlowGraph->numLinks() == 0); CPPUNIT_ASSERT(pFlowGraph->numFramesProcessed() == 0); CPPUNIT_ASSERT(pFlowGraph->numResources() == 0); CPPUNIT_ASSERT(!pFlowGraph->isStarted()); delete pFlowGraph; // when we have a flow graph that contains resources and links, // verify that destroying the flow graph also gets rid of the resources // and links. pFlowGraph = new MpFlowGraphBase(80, 8000); pResource1 = new MpTestResource("test1", 1, 1, 1, 1); pResource2 = new MpTestResource("test2", 1, 1, 1, 1); res = pFlowGraph->addResource(*pResource1); CPPUNIT_ASSERT(res == OS_SUCCESS); res = pFlowGraph->addResource(*pResource2); CPPUNIT_ASSERT(res == OS_SUCCESS); res = pFlowGraph->addLink(*pResource1, 0, *pResource2, 0); CPPUNIT_ASSERT(res == OS_SUCCESS); delete pFlowGraph; }
void testManagedAndUnmanagedFlowGraph() { MpFlowGraphBase* pFlowGraph = 0; MpMediaTask* pMediaTask = 0; OsStatus res; // Test 1: Create an empty flow graph and manage it pMediaTask = MpMediaTask::getMediaTask(10); pFlowGraph = new MpFlowGraphBase(30, 30); res = pMediaTask->manageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run // NOTE: original delay of 20 was tempermental, I increased // this to 100 to reduce the chance of this happening to // hopefully 0% - DLH OsTask::delay(100); CPPUNIT_ASSERT_EQUAL(1, pMediaTask->numManagedFlowGraphs()); // Test 2: Invoke manageFlowGraph() with the same flow graph // (will increment the numHandledMsgErrs() count for that // frame processing interval but should otherwise have no // effect) res = pMediaTask->manageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run OsTask::delay(20); CPPUNIT_ASSERT_EQUAL(1, pMediaTask->numManagedFlowGraphs()); CPPUNIT_ASSERT_EQUAL(1, pMediaTask->numHandledMsgErrs()); // Test 3: Unmanage the flow graph res = pMediaTask->unmanageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run OsTask::delay(20); CPPUNIT_ASSERT_EQUAL(0, pMediaTask->numManagedFlowGraphs()); // Test 4: Unmanage a flow graph which is not currently managed // (will increment the numHandledMsgErrs() count for that // frame processing interval but should otherwise have no // effect) res = pMediaTask->unmanageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run OsTask::delay(20); CPPUNIT_ASSERT_EQUAL(0, pMediaTask->numManagedFlowGraphs()); CPPUNIT_ASSERT_EQUAL(1, pMediaTask->numHandledMsgErrs()); // Test 5: Attempt to manage a flow graph that is not in the // MpFlowGraphBase::STOPPED state res = pFlowGraph->start(); // send the flow graph a start CPPUNIT_ASSERT(res == OS_SUCCESS); // command and a signal to res = pFlowGraph->processNextFrame(); // process its messages CPPUNIT_ASSERT(res == OS_SUCCESS); res = pMediaTask->manageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_INVALID_ARGUMENT); res = pFlowGraph->stop(); // send the flow graph a stop CPPUNIT_ASSERT(res == OS_SUCCESS); // command and a signal to res = pFlowGraph->processNextFrame(); // process its messages CPPUNIT_ASSERT(res == OS_SUCCESS); // Test 6: Unmanage a flow graph that is "started" res = pMediaTask->manageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = pMediaTask->startFlowGraph(*pFlowGraph); // start the flow graph CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run OsTask::delay(20); res = pMediaTask->unmanageFlowGraph(*pFlowGraph); CPPUNIT_ASSERT(res == OS_SUCCESS); res = MpMediaTask::signalFrameStart(); // send a signal to the task CPPUNIT_ASSERT(res == OS_SUCCESS); // and give it a chance to run OsTask::delay(20); // verify that the flow graph has been stopped and is unmanaged CPPUNIT_ASSERT(pFlowGraph->getState() == MpFlowGraphBase::STOPPED); CPPUNIT_ASSERT_EQUAL(0, pMediaTask->numManagedFlowGraphs()); CPPUNIT_ASSERT_EQUAL(0, pMediaTask->numStartedFlowGraphs()); delete pFlowGraph; }