void tst_QVarLengthArray::removeLast() { { QVarLengthArray<char, 2> v; v.append(0); v.append(1); QCOMPARE(v.size(), 2); v.append(2); v.append(3); QCOMPARE(v.size(), 4); v.removeLast(); QCOMPARE(v.size(), 3); v.removeLast(); QCOMPARE(v.size(), 2); } { QVarLengthArray<QString, 2> v; v.append("0"); v.append("1"); QCOMPARE(v.size(), 2); v.append("2"); v.append("3"); QCOMPARE(v.size(), 4); v.removeLast(); QCOMPARE(v.size(), 3); v.removeLast(); QCOMPARE(v.size(), 2); } }
void tst_QVarLengthArray::count() { // tests size(), count() and length(), since they're the same thing { const QVarLengthArray<int> list; QCOMPARE(list.length(), 0); QCOMPARE(list.count(), 0); QCOMPARE(list.size(), 0); } { QVarLengthArray<int> list; list.append(0); QCOMPARE(list.length(), 1); QCOMPARE(list.count(), 1); QCOMPARE(list.size(), 1); } { QVarLengthArray<int> list; list.append(0); list.append(1); QCOMPARE(list.length(), 2); QCOMPARE(list.count(), 2); QCOMPARE(list.size(), 2); } { QVarLengthArray<int> list; list.append(0); list.append(0); list.append(0); QCOMPARE(list.length(), 3); QCOMPARE(list.count(), 3); QCOMPARE(list.size(), 3); } // test removals too { QVarLengthArray<int> list; list.append(0); list.append(0); list.append(0); QCOMPARE(list.length(), 3); QCOMPARE(list.count(), 3); QCOMPARE(list.size(), 3); list.removeLast(); QCOMPARE(list.length(), 2); QCOMPARE(list.count(), 2); QCOMPARE(list.size(), 2); list.removeLast(); QCOMPARE(list.length(), 1); QCOMPARE(list.count(), 1); QCOMPARE(list.size(), 1); list.removeLast(); QCOMPARE(list.length(), 0); QCOMPARE(list.count(), 0); QCOMPARE(list.size(), 0); } }
void tst_QVarLengthArray::last() { // append some items, make sure it stays sane QVarLengthArray<int> list; list.append(27); QCOMPARE(list.last(), 27); list.append(4); QCOMPARE(list.last(), 4); list.append(1987); QCOMPARE(list.last(), 1987); QCOMPARE(list.length(), 3); // remove some, make sure it stays sane list.removeLast(); QCOMPARE(list.last(), 4); QCOMPARE(list.length(), 2); list.removeLast(); QCOMPARE(list.last(), 27); QCOMPARE(list.length(), 1); }
int DirectShowPlayerService::findStreamTypes(IBaseFilter *source) const { QVarLengthArray<IBaseFilter *, 16> filters; source->AddRef(); filters.append(source); int streamTypes = 0; while (!filters.isEmpty()) { IEnumPins *pins = 0; IBaseFilter *filter = filters[filters.size() - 1]; filters.removeLast(); if (SUCCEEDED(filter->EnumPins(&pins))) { for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { PIN_DIRECTION direction; if (pin->QueryDirection(&direction) == S_OK && direction == PINDIR_OUTPUT) { AM_MEDIA_TYPE connectionType; if (SUCCEEDED(pin->ConnectionMediaType(&connectionType))) { IPin *peer = 0; if (connectionType.majortype == MEDIATYPE_Audio) { streamTypes |= AudioStream; } else if (connectionType.majortype == MEDIATYPE_Video) { streamTypes |= VideoStream; } else if (SUCCEEDED(pin->ConnectedTo(&peer))) { PIN_INFO peerInfo; if (SUCCEEDED(peer->QueryPinInfo(&peerInfo))) filters.append(peerInfo.pFilter); peer->Release(); } } else { streamTypes |= findStreamType(pin); } } } } filter->Release(); } return streamTypes; }
void DirectShowPlayerService::doRender(QMutexLocker *locker) { m_pendingTasks |= m_executedTasks & (Play | Pause); if (IMediaControl *control = com_cast<IMediaControl>(m_graph, IID_IMediaControl)) { control->Stop(); control->Release(); } if (m_pendingTasks & SetAudioOutput) { m_graph->AddFilter(m_audioOutput, L"AudioOutput"); m_pendingTasks ^= SetAudioOutput; m_executedTasks |= SetAudioOutput; } if (m_pendingTasks & SetVideoOutput) { m_graph->AddFilter(m_videoOutput, L"VideoOutput"); m_pendingTasks ^= SetVideoOutput; m_executedTasks |= SetVideoOutput; } IFilterGraph2 *graph = m_graph; graph->AddRef(); QVarLengthArray<IBaseFilter *, 16> filters; m_source->AddRef(); filters.append(m_source); bool rendered = false; HRESULT renderHr = S_OK; while (!filters.isEmpty()) { IEnumPins *pins = 0; IBaseFilter *filter = filters[filters.size() - 1]; filters.removeLast(); if (!(m_pendingTasks & ReleaseFilters) && SUCCEEDED(filter->EnumPins(&pins))) { int outputs = 0; for (IPin *pin = 0; pins->Next(1, &pin, 0) == S_OK; pin->Release()) { PIN_DIRECTION direction; if (pin->QueryDirection(&direction) == S_OK && direction == PINDIR_OUTPUT) { ++outputs; IPin *peer = 0; if (pin->ConnectedTo(&peer) == S_OK) { PIN_INFO peerInfo; if (SUCCEEDED(peer->QueryPinInfo(&peerInfo))) filters.append(peerInfo.pFilter); peer->Release(); } else { locker->unlock(); HRESULT hr; if (SUCCEEDED(hr = graph->RenderEx( pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0))) { rendered = true; } else if (renderHr == S_OK || renderHr == VFW_E_NO_DECOMPRESSOR){ renderHr = hr; } locker->relock(); } } } pins->Release(); if (outputs == 0) rendered = true; } filter->Release(); } if (m_audioOutput && !isConnected(m_audioOutput, PINDIR_INPUT)) { graph->RemoveFilter(m_audioOutput); m_executedTasks &= ~SetAudioOutput; } if (m_videoOutput && !isConnected(m_videoOutput, PINDIR_INPUT)) { graph->RemoveFilter(m_videoOutput); m_executedTasks &= ~SetVideoOutput; } graph->Release(); if (!(m_pendingTasks & ReleaseFilters)) { if (rendered) { if (!(m_executedTasks & FinalizeLoad)) m_pendingTasks |= FinalizeLoad; } else { m_pendingTasks = 0; m_graphStatus = InvalidMedia; if (!m_audioOutput && !m_videoOutput) { m_error = QMediaPlayer::ResourceError; m_errorString = QString(); } else { switch (renderHr) { case VFW_E_UNSUPPORTED_AUDIO: case VFW_E_UNSUPPORTED_VIDEO: case VFW_E_UNSUPPORTED_STREAM: m_error = QMediaPlayer::FormatError; m_errorString = QString(); break; default: m_error = QMediaPlayer::ResourceError; m_errorString = QString(); qWarning("DirectShowPlayerService::doRender: Unresolved error code %x", uint(renderHr)); } } QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); } m_executedTasks |= Render; } m_loop->wake(); }