#include "HxTrace.h" #include "HxVideoDevices.h" #include "HxVideoLiveStream.h" #include QMap streams; QMap contexts; void video_status_callback(QString url, ConnectionStatus status) { switch (status) { case ConnectionStatus::Idling: HxTrace::debug_write_line(url, "Idling"); break; case ConnectionStatus::Connected: HxTrace::debug_write_line(url, "Connected"); break; case ConnectionStatus::Connecting: HxTrace::debug_write_line(url, "Connecting"); break; case ConnectionStatus::Disconnected: HxTrace::debug_write_line(url, "Disconnected"); break; } QMapIterator array(contexts); while (array.hasNext()) { auto context = array.next().value(); if (context.rtspurl == url) { if (context.status_callback) context.status_callback(context.uuid, status); } } } void video_stream_callback(QString url, HxVideoFrame videoframe) { QMapIterator array(contexts); while (array.hasNext()) { auto context = array.next().value(); if (context.rtspurl == url) { if (context.stream_callback) context.stream_callback(context.uuid, videoframe.copy()); } } videoframe.free(); } QString HxVideoDevices::rtspurl(QString type, QString address, int port, int channel, int stream) { QString rtspurl = QString::Null(); auto value = type.toUpper(); if (value == "LION" || value == "HIK") rtspurl = QString("rtsp://admin:hik12345@%1:%2/h264/ch1/%3/av_stream").arg(address).arg(port).arg(stream == 0 ? "main" : "sub"); else if (value == "XM") rtspurl = QString("rtsp://%1:%2/user=admin&password=&channel=%3&stream=%4.sdp?real_stream").arg(address).arg(port).arg(channel+1).arg(stream); else if (value == "XIANGFEI") rtspurl = QString("rtsp://%1:%2/stander/livestream/0/%3").arg(address).arg(port).arg(stream); else if (value == "BSM") rtspurl = QString("rtsp://%1:%2/%3").arg(address).arg(port).arg(stream == 0 ? 11 : 12); else if (value == "AHV") rtspurl = QString("rtsp://%1:%2/dev/video%3").arg(address).arg(port).arg(channel); return rtspurl; } void HxVideoDevices::connect(QString rtspurl) { if (rtspurl.isNull()) return; if (streams.contains(rtspurl)) return; auto stream = new HxVideoLiveStream(0); stream->set_status_callback(video_status_callback); stream->set_stream_callback(video_stream_callback); stream->set_url(rtspurl); stream->set_uuid(rtspurl); stream->start(); streams.insert(rtspurl, stream); } void HxVideoDevices::connect(QString type, QString address, int port, int channel, int stream) { if(stream == -1) { HxVideoDevices::connect(HxVideoDevices::rtspurl(type, address, port, channel, 0)); HxVideoDevices::connect(HxVideoDevices::rtspurl(type, address, port, channel, 1)); } else HxVideoDevices::connect(HxVideoDevices::rtspurl(type, address, port, channel, stream)); } void HxVideoDevices::disconnect() { QMapIterator array(streams); while (array.hasNext()) { auto context = array.next(); auto stream = context.value(); stream->stop(); delete stream; stream = nullptr; } streams.clear(); } void HxVideoDevices::subscribe(HxVideoDeviceContext context) { if(!contexts.contains(context.uuid)) { contexts.insert(context.uuid, context); } } void HxVideoDevices::unsubscribe(HxVideoDeviceContext context) { if(contexts.contains(context.uuid)) { contexts.remove(context.uuid); } }