HTTPLiveStream::HTTPLiveStream(QString srcFile, uint16_t width, uint16_t height, uint32_t bitrate, uint32_t abitrate, uint16_t maxSegments, uint16_t segmentSize, uint32_t aobitrate, int32_t srate) : m_writing(false), m_streamid(-1), m_sourceFile(srcFile), m_sourceWidth(0), m_sourceHeight(0), m_segmentSize(segmentSize), m_maxSegments(maxSegments), m_segmentCount(0), m_startSegment(0), m_curSegment(0), m_height(height), m_width(width), m_bitrate(bitrate), m_audioBitrate(abitrate), m_audioOnlyBitrate(aobitrate), m_sampleRate(srate), m_created(MythDate::current()), m_lastModified(MythDate::current()), m_percentComplete(0), m_status(kHLSStatusUndefined) { if ((m_width == 0) && (m_height == 0)) m_width = 640; if (m_bitrate == 0) m_bitrate = 800000; if (m_audioBitrate == 0) m_audioBitrate = 64000; if (m_segmentSize == 0) m_segmentSize = 10; if (m_audioOnlyBitrate == 0) m_audioOnlyBitrate = 32000; m_sourceHost = gCoreContext->GetHostName(); QFileInfo finfo(m_sourceFile); m_outBase = finfo.fileName() + QString(".%1x%2_%3kV_%4kA").arg(m_width).arg(m_height) .arg(m_bitrate/1000).arg(m_audioBitrate/1000); SetOutputVars(); m_fullURL = m_httpPrefix + m_outBase + ".m3u8"; m_relativeURL = m_httpPrefixRel + m_outBase + ".m3u8"; StorageGroup sgroup("Streaming", gCoreContext->GetHostName()); m_outDir = sgroup.GetFirstDir(); QDir outDir(m_outDir); if (!outDir.exists() && !outDir.mkdir(m_outDir)) { LOG(VB_RECORD, LOG_ERR, "Unable to create HTTP Live Stream output " "directory, Live Stream will not be created"); return; } AddStream(); }
bool HTTPLiveStream::UpdateSizeInfo(uint16_t width, uint16_t height, uint16_t srcwidth, uint16_t srcheight) { if (m_streamid == -1) return false; QFileInfo finfo(m_sourceFile); QString newOutBase = finfo.fileName() + QString(".%1x%2_%3kV_%4kA").arg(width).arg(height) .arg(m_bitrate/1000).arg(m_audioBitrate/1000); QString newFullURL = m_httpPrefix + newOutBase + ".m3u8"; QString newRelativeURL; if (newFullURL.contains("/Content/GetFile")) newRelativeURL = "/Content/GetFile?StorageGroup=Streaming&FileName=" + newOutBase + ".m3u8"; else newRelativeURL = newOutBase + ".m3u8"; MSqlQuery query(MSqlQuery::InitCon()); query.prepare( "UPDATE livestream " "SET width = :WIDTH, height = :HEIGHT, " " sourcewidth = :SRCWIDTH, sourceheight = :SRCHEIGHT, " " fullurl = :FULLURL, relativeurl = :RELATIVEURL, " " outbase = :OUTBASE " "WHERE id = :STREAMID; "); query.bindValue(":WIDTH", width); query.bindValue(":HEIGHT", height); query.bindValue(":SRCWIDTH", srcwidth); query.bindValue(":SRCHEIGHT", srcheight); query.bindValue(":FULLURL", newFullURL); query.bindValue(":RELATIVEURL", newRelativeURL); query.bindValue(":OUTBASE", newOutBase); query.bindValue(":STREAMID", m_streamid); if (!query.exec()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Unable to update segment info for streamid %1") .arg(m_streamid)); return false; } m_width = width; m_height = height; m_sourceWidth = srcwidth; m_sourceHeight = srcheight; m_outBase = newOutBase; m_fullURL = newFullURL; m_relativeURL = newRelativeURL; SetOutputVars(); return true; }
bool HTTPLiveStream::LoadFromDB(void) { if (m_streamid == -1) return false; MSqlQuery query(MSqlQuery::InitCon()); query.prepare( "SELECT width, height, bitrate, audiobitrate, segmentsize, " " maxsegments, startsegment, currentsegment, segmentcount, " " percentcomplete, created, lastmodified, relativeurl, " " fullurl, status, statusmessage, sourcefile, sourcehost, " " sourcewidth, sourceheight, outdir, outbase, audioonlybitrate, " " samplerate " "FROM livestream " "WHERE id = :STREAMID; "); query.bindValue(":STREAMID", m_streamid); if (!query.exec() || !query.next()) { LOG(VB_GENERAL, LOG_ERR, LOC + QString("Unable to query DB info for stream %1") .arg(m_streamid)); return false; } m_width = query.value(0).toUInt(); m_height = query.value(1).toUInt(); m_bitrate = query.value(2).toUInt(); m_audioBitrate = query.value(3).toUInt(); m_segmentSize = query.value(4).toUInt(); m_maxSegments = query.value(5).toUInt(); m_startSegment = query.value(6).toUInt(); m_curSegment = query.value(7).toUInt(); m_segmentCount = query.value(8).toUInt(); m_percentComplete = query.value(9).toUInt(); m_created = MythDate::as_utc(query.value(10).toDateTime()); m_lastModified = MythDate::as_utc(query.value(11).toDateTime()); m_relativeURL = query.value(12).toString(); m_fullURL = query.value(13).toString(); m_status = (HTTPLiveStreamStatus)(query.value(14).toInt()); m_statusMessage = query.value(15).toString(); m_sourceFile = query.value(16).toString(); m_sourceHost = query.value(17).toString(); m_sourceWidth = query.value(18).toUInt(); m_sourceHeight = query.value(19).toUInt(); m_outDir = query.value(20).toString(); m_outBase = query.value(21).toString(); m_audioOnlyBitrate = query.value(22).toUInt(); m_sampleRate = query.value(23).toUInt(); SetOutputVars(); return true; }