diff options
Diffstat (limited to 'server/recstreamer.c')
-rw-r--r-- | server/recstreamer.c | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/server/recstreamer.c b/server/recstreamer.c index 73af53b..8a5a7ad 100644 --- a/server/recstreamer.c +++ b/server/recstreamer.c @@ -12,13 +12,14 @@ using namespace Streamdev; // --- cStreamdevRecStreamer ------------------------------------------------- -cStreamdevRecStreamer::cStreamdevRecStreamer(cRecording *Rec, const cServerConnection *Connection): +cStreamdevRecStreamer::cStreamdevRecStreamer(cRecording *Rec, const cServerConnection *Connection, std::string pos): cStreamdevStreamer("streamdev-recstreaming", Connection), m_RecPlayer(Rec), m_From(0L) { Dprintf("New rec streamer\n"); m_To = (int64_t) m_RecPlayer.getLengthBytes() - 1; + m_Pos = pos; } cStreamdevRecStreamer::~cStreamdevRecStreamer() @@ -52,6 +53,69 @@ int64_t cStreamdevRecStreamer::SetRange(int64_t &From, int64_t &To) return m_To - m_From + 1; } +int32_t cStreamdevRecStreamer::getIFrameBeforeFrame(int32_t frame) +{ + uint32_t iframe, len; + uint64_t pos; + m_RecPlayer.getNextIFrame(frame + 1, 0, &pos, &iframe, &len); + Dprintf("pos: frame %i -> start at iFrame %i\n", frame, iframe); + return iframe; +} + +int64_t cStreamdevRecStreamer::GetFromByPos() +{ + if (m_Pos.empty()) return 0; + + std::string pos = m_Pos; + + // cut prefix (if any) + if (pos.find('_') != std::string::npos) { + pos = pos.substr(pos.find('_') + 1); + } + + // resume file + if (pos == "resume") { + int frame = getIFrameBeforeFrame(m_RecPlayer.frameFromResume()); + Dprintf("pos: frame from resume: %i\n", frame); + return m_RecPlayer.positionFromFrameNumber(frame); + } + + // mark + if (pos.find("mark.") == 0) { + int index = atoi(pos.substr(5).c_str()); + int frame = getIFrameBeforeFrame(m_RecPlayer.frameFromMark(index)); + Dprintf("pos: mark %i - frame %i\n", index, frame); + return m_RecPlayer.positionFromFrameNumber(frame); + } + + // time + if (pos.find("time.") == 0) { + int seconds = atoi(pos.substr(5).c_str()); + int frame = getIFrameBeforeFrame(m_RecPlayer.frameFromSeconds(seconds)); + Dprintf("pos: %i seconds - frame %i\n", seconds, frame); + return m_RecPlayer.positionFromFrameNumber(frame); + } + + // frame number + if (pos.find("frame.") == 0) { + int frame = getIFrameBeforeFrame(atoi(pos.substr(6).c_str())); + Dprintf("pos: frame %i\n", frame); + return m_RecPlayer.positionFromFrameNumber(frame); + } + + // default: byte index or percent + // as "%" is the url escape character, interpret <100 as percent + // if (pos.find("%") != std::string::npos) { + // int percent = atoi(pos.substr(0, pos.find("%")).c_str()); + int64_t number = atol(pos.c_str()); + if (number < 100) { + Dprintf("pos: %lld percent\n", (long long)number); + int64_t offset = m_RecPlayer.getLengthBytes() * number / 100; + return offset; + } + return number; +} + uchar* cStreamdevRecStreamer::GetFromReceiver(int &Count) { if (m_From <= m_To) { |