summaryrefslogtreecommitdiff
path: root/server/recstreamer.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/recstreamer.c')
-rw-r--r--server/recstreamer.c66
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) {