コード例 #1
0
ファイル: PptvMedia.cpp プロジェクト: huangyt/MyProjects
 void PptvMedia::set_response(
     MediaBase::response_type const & resp)
 {
     resp_ = resp;
     // it is safe to get user stat object now
     ppbox::demux::DemuxModule & demux = util::daemon::use_module<ppbox::demux::DemuxModule>(get_io_service());
     owner_ = demux.find(MediaBase::url_); // 需要原始的URL
     if (owner_) {
         owner_type_ = ot_demuxer;
         ppbox::peer::PeerSource & peer = 
             const_cast<ppbox::peer::PeerSource &>(static_cast<ppbox::peer::PeerSource const &>(demuxer().source().source()));
         peer.pptv_media(*this);
         demuxer().on<ppbox::demux::StatusChangeEvent>(boost::bind(&PptvMedia::on_event, this, _1));
         return;
     }
     ppbox::merge::MergeModule & merge = util::daemon::use_module<ppbox::merge::MergeModule>(get_io_service());
     owner_ = merge.find(MediaBase::url_); // 需要原始的URL
     if (owner_) {
         owner_type_ = ot_merger;
         ppbox::peer::PeerSource & peer = 
             const_cast<ppbox::peer::PeerSource &>(static_cast<ppbox::peer::PeerSource const &>(merger().source().source()));
         peer.pptv_media(*this);
         //merger().on<ppbox::demux::StatusChangeEvent>(boost::bind(&PptvMedia::on_event, this, _1));
         return;
     }
 }
コード例 #2
0
ファイル: PptvMedia.cpp プロジェクト: huangyt/MyProjects
 PptvMedia::~PptvMedia()
 {
     switch (owner_type_) {
         case ot_demuxer:
             demuxer().un<ppbox::demux::StatusChangeEvent>(boost::bind(&PptvMedia::on_event, this, _1));
             break;
         default:
             break;
     }
     fetch_->detach();
 }
コード例 #3
0
ファイル: PptvMedia.cpp プロジェクト: huangyt/MyProjects
 void PptvMedia::on_event(
     util::event::Event const & e)
 {
     if (ppbox::demux::StatusChangeEvent const * event = e.as<ppbox::demux::StatusChangeEvent>()) {
         if (event->stat.state() == ppbox::demux::DemuxStatistic::opened) {
             ppbox::peer::PeerSource const & source_ = (ppbox::peer::PeerSource const &)demuxer().source().source();
             dac_.submit(ppbox::dac::DacPlayOpenInfo(*this, source_, event->stat));
             if (!event->stat.last_error())
                 async_open2();
         } else if (event->stat.state() == ppbox::demux::DemuxStatistic::stopped) {
             dac_.submit(ppbox::dac::DacPlayCloseInfo(*this, event->stat, demuxer().source()));
         }
     }
 }
コード例 #4
0
bool CreateDemuxVideoPin(IBaseFilter *demuxFilter, MediaType &mt,
		long width, long height, long long frameTime,
		VideoFormat format)
{
	CComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
	if (!demuxer) {
		Warning(L"CreateDemuxVideoPin: Failed to get "
		        L"IMpeg2Demultiplexer from filter");
		return false;
	}

	CComPtr<IPin> pin;
	HRESULT       hr;

	VIDEOINFOHEADER *vih           = mt.AllocFormat<VIDEOINFOHEADER>();
	vih->bmiHeader.biSize          = sizeof(vih->bmiHeader);
	vih->bmiHeader.biWidth         = width;
	vih->bmiHeader.biHeight        = height;
	vih->bmiHeader.biCompression   = VideoFormatToFourCC(format);
	vih->rcSource.right            = height;
	vih->rcSource.bottom           = width;
	vih->AvgTimePerFrame           = frameTime;

	if (!vih->bmiHeader.biCompression) {
		Warning(L"CreateDemuxVideoPin: Invalid video format");
		return false;
	}

	mt->majortype            = MEDIATYPE_Video;
	mt->subtype              = VideoFormatToSubType(format);
	mt->formattype           = FORMAT_VideoInfo;
	mt->bTemporalCompression = true;

	hr = demuxer->CreateOutputPin(mt, DEMUX_VIDEO_PIN, &pin);
	if (FAILED(hr)) {
		WarningHR(L"CreateDemuxVideoPin: Failed to create video pin "
		          L"on demuxer", hr);
		return false;
	}

	return true;
}
コード例 #5
0
bool CreateDemuxAudioPin(IBaseFilter *demuxFilter, MediaType &mt,
		DWORD samplesPerSec, WORD bitsPerSample, WORD channels,
		AudioFormat format)
{
	CComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
	if (!demuxer) {
		Warning(L"CreateDemuxAudioPin: Failed to get "
		        L"IMpeg2Demultiplexer from filter");
		return false;
	}

	CComPtr<IPin> pin;
	HRESULT       hr;

	WAVEFORMATEX *wfex   = mt.AllocFormat<WAVEFORMATEX>();
	wfex->wFormatTag     = AudioFormatToFormatTag(format);
	wfex->nChannels      = channels;
	wfex->nSamplesPerSec = samplesPerSec;
	wfex->wBitsPerSample = bitsPerSample;

	if (!wfex->wFormatTag) {
		Warning(L"CreateDemuxAudioPin: Invalid audio format");
		return false;
	}

	mt->majortype            = MEDIATYPE_Audio;
	mt->subtype              = AudioFormatToSubType(format);
	mt->formattype           = FORMAT_WaveFormatEx;
	mt->bTemporalCompression = true;

	hr = demuxer->CreateOutputPin(mt, DEMUX_AUDIO_PIN, &pin);
	if (FAILED(hr)) {
		WarningHR(L"CreateDemuxAudioPin: Failed to create audio pin "
		          L"on demuxer", hr);
		return false;
	}

	return true;
}