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; } }
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(); }
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())); } } }
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; }
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; }