From dae84f496492ccce1659b1becc928fc80e5e7509 Mon Sep 17 00:00:00 2001 From: randomdan Date: Sun, 15 Dec 2013 20:12:25 +0000 Subject: Add a simple muxer that just wraps around an ffmpeg process --- p2pvr/lib/muxer.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ p2pvr/lib/muxer.h | 20 ++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 p2pvr/lib/muxer.cpp create mode 100644 p2pvr/lib/muxer.h diff --git a/p2pvr/lib/muxer.cpp b/p2pvr/lib/muxer.cpp new file mode 100644 index 0000000..886806e --- /dev/null +++ b/p2pvr/lib/muxer.cpp @@ -0,0 +1,68 @@ +#include "muxer.h" +#include +#include +#include + +Muxer::Muxer(const P2PVR::RawDataClientPrx & t) : + target(t) +{ + std::vector cmd; + cmd.push_back("/usr/bin/ffmpeg"); + cmd.push_back("-f"); + cmd.push_back("mpegts"); + cmd.push_back("-i"); + cmd.push_back("-"); + cmd.push_back("-f"); + cmd.push_back("mpeg"); + cmd.push_back("-codec"); + cmd.push_back("copy"); + cmd.push_back("-"); + cmd.push_back(NULL); + popenrw(&cmd.front(), fds); +} + +Muxer::~Muxer() +{ + close(fds[0]); + ReadMuxerAndSend(); + close(fds[1]); +} + +bool +Muxer::NewData(const P2PVR::Data & data, const Ice::Current &) +{ + ReadMuxerAndSend(); + if (write(fds[0], &data.front(), data.size()) < 1) { + return true; + } + return ReadMuxerAndSend(); +} + +bool +Muxer::ReadMuxerAndSend() const +{ + while (true) { + pollfd fd = { fds[1], POLLIN, 0 }; + const timespec timeout = {0, 0}; + auto p = ppoll(&fd, 1, &timeout, NULL); + if (p < 0) { + // error + return true; + } + else if (p == 0) { + // all ok + return false; + } + else if (p > 0) { + P2PVR::Data buf(BUFSIZ); + auto len = read(fds[1], &buf.front(), buf.size()); + if (len < 0) { + // error + return true; + } + buf.resize(len); + target->NewData(buf); + } + } +} + diff --git a/p2pvr/lib/muxer.h b/p2pvr/lib/muxer.h new file mode 100644 index 0000000..5c8ef8e --- /dev/null +++ b/p2pvr/lib/muxer.h @@ -0,0 +1,20 @@ +#ifndef MUXER_H +#define MUXER_H + +#include + +class Muxer : public P2PVR::RawDataClient { + public: + Muxer(const P2PVR::RawDataClientPrx & target); + ~Muxer(); + + bool NewData(const P2PVR::Data &, const Ice::Current &); + + private: + bool ReadMuxerAndSend() const; + const P2PVR::RawDataClientPrx & target; + int fds[2]; +}; + +#endif + -- cgit v1.2.3