Ejemplo n.º 1
0
HRESULT CLAVSplitterTrayIcon::ProcessMenuCommand(HMENU hMenu, int cmd)
{
  CheckPointer(m_pFilter, E_FAIL);
  DbgLog((LOG_TRACE, 10, L"Menu Command %d", cmd));
  if (cmd >= STREAM_CMD_OFFSET && cmd < m_NumStreams + STREAM_CMD_OFFSET) {
    IAMStreamSelect *pStreamSelect = nullptr;
    if (SUCCEEDED(m_pFilter->QueryInterface(&pStreamSelect))) {
      pStreamSelect->Enable(cmd - STREAM_CMD_OFFSET, AMSTREAMSELECTENABLE_ENABLE);
      SafeRelease(&pStreamSelect);
    }
  } else if (cmd > CHAPTER_CMD_OFFSET && cmd <= m_NumChapters + CHAPTER_CMD_OFFSET) {
    IAMExtendedSeeking *pExSeeking = nullptr;
    if (SUCCEEDED(m_pFilter->QueryInterface(IID_IAMExtendedSeeking, (void **)&pExSeeking))) {
      double markerTime;
      if (FAILED(pExSeeking->GetMarkerTime(cmd - CHAPTER_CMD_OFFSET, &markerTime)))
        goto failchapterseek;

      REFERENCE_TIME rtMarkerTime = (REFERENCE_TIME)(markerTime * 10000000.0);

      // Try to get the graph to seek on, its much safer than directly trying to seek on LAV
      FILTER_INFO info;
      if (FAILED(m_pFilter->QueryFilterInfo(&info)) || !info.pGraph)
        goto failchapterseek;

      IMediaSeeking *pSeeking = nullptr;
      if (SUCCEEDED(info.pGraph->QueryInterface(&pSeeking))) {
        pSeeking->SetPositions(&rtMarkerTime, AM_SEEKING_AbsolutePositioning, nullptr, AM_SEEKING_NoPositioning);
        SafeRelease(&pSeeking);
      }
      SafeRelease(&info.pGraph);

failchapterseek:
      SafeRelease(&pExSeeking);
    }
  } else if (cmd == STREAM_CMD_OFFSET - 1) {
    OpenPropPage();
  } else {
    return E_UNEXPECTED;
  }
  return S_OK;
}
Ejemplo n.º 2
0
bool MiniPlayer::prepare(LPCTSTR filename)
{
	if(fail()) return false;

	HRESULT hr = _mediaCtrl->Stop();

	IBaseFilter *pFileSrc = NULL;
	
	hr = _filterGraph->FindFilterByName(L"Media File", &pFileSrc);
	if(hr == S_OK)
	{
		hr = _filterGraph->RemoveFilter(pFileSrc);
		IF_REL(pFileSrc);
	}

	hr = _filterGraph->AddSourceFilter(filename, L"Media File", &pFileSrc);
	IF_CHK(hr, _T("Unable to add Source Filter for file: %s"), filename);

	IPin *pFileOutputPin = NULL;

	hr = findPin(pFileSrc, PINDIR_OUTPUT, &pFileOutputPin);
	IF_CHK(hr, "Unable to find output pin of File Source Filter.");

	hr = _filterGraph->Connect(pFileOutputPin, _splitterInputPin);
	IF_CHK(hr, "Unable to connect File Source Output Pin & Splitter Input Pin");

	IPin *pSplitterVideoOutputPin = NULL;
	IPin *pSplitterAudioOutputPin = NULL;
	IPin *pVideoDecoderOutputPin = NULL;
	IPin *pAudioDecoderOutputPin = NULL;

	//listAllPins(_splitter);
	hr = findPin(_splitter, PINDIR_OUTPUT, MEDIATYPE_Video, &pSplitterVideoOutputPin);
	if(hr == S_OK)
	{
		hr = _filterGraph->Connect(pSplitterVideoOutputPin, _videoDecoderInputPin);
	}

	hr = findPin(_splitter, PINDIR_OUTPUT, MEDIATYPE_Audio, &pSplitterAudioOutputPin);
	if(hr == S_OK)
	{
		hr = _filterGraph->Connect(pSplitterAudioOutputPin, _audioDecoderInputPin);
	}

	//listAllPins(_videoDecoder);
	hr = findPin(_videoDecoder, PINDIR_OUTPUT, &pVideoDecoderOutputPin);
	if(hr == S_OK)
	{
		hr = _filterGraph->Render(pVideoDecoderOutputPin);
	}

	//listAllPins(_audioDecoder);
	hr = findPin(_audioDecoder, PINDIR_OUTPUT, &pAudioDecoderOutputPin);
	if(hr == S_OK)
	{
		hr = _filterGraph->Render(pAudioDecoderOutputPin);
	}

	IID IID_ITrackInfo;
	IIDFromString(L"{03E98D51-DDE7-43aa-B70C-42EF84A3A23D}", &IID_ITrackInfo);
	ITrackInfo *pTrackInfo;
	hr = _splitter->QueryInterface(IID_ITrackInfo, (void **)&pTrackInfo);

	IAMStreamSelect *pAudioSel;
	hr = _splitter->QueryInterface(IID_IAMStreamSelect, (void **)&pAudioSel);

	hr = pAudioSel->Enable(2, AMSTREAMSELECTENABLE_ENABLE);

	ctrace("Track Info:\n");
	ctrace("  Track Count: %d\n", pTrackInfo->GetTrackCount());
	for(UINT i = 0; i < pTrackInfo->GetTrackCount(); i++)
	{
		TrackElement elem;
		TrackExtendedInfoVideo videoInfo;
		TrackExtendedInfoAudio audioInfo;
		pTrackInfo->GetTrackInfo(i, &elem);
		ctrace("\t [%d] ", i);
		switch(elem.Type)
		{
		case TypeVideo:
			pTrackInfo->GetTrackExtendedInfo(i, &videoInfo);
			ctrace("Video %dx%d", videoInfo.PixelWidth, videoInfo.PixelHeight);
			break;
		case TypeAudio:
			pTrackInfo->GetTrackExtendedInfo(i, &audioInfo);
			ctrace("Audio %d Channels", audioInfo.Channels);
			break;
		case TypeSubtitle:
			ctrace("Subtitle ");
			break;
		}
		ctrace("\n");
	}

	_fail = false;
	return true;

Cleanup:

	return (_fail = true);
}