diff options
-rw-r--r-- | p2pvr/dvb/bindDataHandler.cpp | 12 | ||||
-rw-r--r-- | p2pvr/dvb/bindDataHandler.h | 19 | ||||
-rw-r--r-- | p2pvr/dvb/unittests/Jamfile.jam | 16 | ||||
-rw-r--r-- | p2pvr/dvb/unittests/createBroadcast.cpp | 136 |
4 files changed, 183 insertions, 0 deletions
diff --git a/p2pvr/dvb/bindDataHandler.cpp b/p2pvr/dvb/bindDataHandler.cpp new file mode 100644 index 0000000..cb4fd69 --- /dev/null +++ b/p2pvr/dvb/bindDataHandler.cpp @@ -0,0 +1,12 @@ +#include "bindDataHandler.h" + +BindDataHandler::BindDataHandler(const Callback & cb) : + callBack(cb) +{ +} + +bool BindDataHandler::NewData(const P2PVR::Data & data, const Ice::Current &) +{ + return callBack(data); +} + diff --git a/p2pvr/dvb/bindDataHandler.h b/p2pvr/dvb/bindDataHandler.h new file mode 100644 index 0000000..3805d7f --- /dev/null +++ b/p2pvr/dvb/bindDataHandler.h @@ -0,0 +1,19 @@ +#ifndef BINDDATAHANDLER_H +#define BINDDATAHANDLER_H + +#include <boost/function.hpp> +#include <dvb.h> + +class BindDataHandler : public P2PVR::RawDataClient { + public: + typedef boost::function<bool(const P2PVR::Data &)> Callback; + BindDataHandler(const Callback & cb); + + bool NewData(const P2PVR::Data & data, const Ice::Current &) override; + + private: + const Callback callBack; +}; + +#endif + diff --git a/p2pvr/dvb/unittests/Jamfile.jam b/p2pvr/dvb/unittests/Jamfile.jam index 6e8cfbf..699cfcd 100644 --- a/p2pvr/dvb/unittests/Jamfile.jam +++ b/p2pvr/dvb/unittests/Jamfile.jam @@ -21,3 +21,19 @@ exe createSamples : <define>ROOT=\"$(me)\" ; +exe createBroadcast : + createBroadcast.cpp + : + <define>BOOST_TEST_DYN_LINK + <library>..//p2pvrdvb + <library>../../lib//p2pvrlib + <library>../../ice//p2pvrice + <library>IceUtil + <library>Ice + <library>boost_system + <library>boost_filesystem + <library>../..//boost_utf + <library>../..//p2ut + <define>ROOT=\"$(me)\" + ; + diff --git a/p2pvr/dvb/unittests/createBroadcast.cpp b/p2pvr/dvb/unittests/createBroadcast.cpp new file mode 100644 index 0000000..c65c9ad --- /dev/null +++ b/p2pvr/dvb/unittests/createBroadcast.cpp @@ -0,0 +1,136 @@ +#define BOOST_TEST_MODULE CreateSamples +#include <testOptionsSource.h> +#include <boost/test/unit_test.hpp> +#include <boost/filesystem/operations.hpp> +#include <boost/function.hpp> +#include <boost/bind.hpp> +#include <boost/tuple/tuple.hpp> +#include <Ice/ObjectAdapter.h> +#include <Ice/Service.h> +#include <scopeObject.h> +#include <linux/dvb/frontend.h> +#include "serviceStreamerCore.h" +#include "bindDataHandler.h" + +#define XSTR(s) STR(s) +#define STR(s) #s +const boost::filesystem::path root(XSTR(ROOT)); + +Ice::StringSeq params { + "--Ice.ThreadPool.Client.Size=5", + "--Ice.ThreadPool.Client.SizeMax=10", + "--Ice.ThreadPool.Server.Size=5", + "--Ice.ThreadPool.Server.SizeMax=10" + }; + +class Core { + public: + Core() : + ic(Ice::initialize(params)), + adapter(ic->createObjectAdapterWithEndpoints("Adp", "tcp -p 12003")) + { + TestOptionsSource::LoadTestOptions({ }); + adapter->activate(); + + devs = P2PVR::DevicesPrx::checkedCast(ic->stringToProxy("Devices:tcp -h defiant -p 10000")); + BOOST_REQUIRE(devs); + devs->ice_ping(); + } + + ~Core() + { + ic->destroy(); + } + + P2PVR::DevicesPrx devs; + Ice::CommunicatorPtr ic; + Ice::ObjectAdapterPtr adapter; + +}; + +class Sampler { + public: + Sampler(int sid, P2PVR::DevicesPrx d, Ice::ObjectAdapterPtr a) : + patp(a, new BindDataHandler(boost::bind(&Sampler::Handle, this, _1, boost::ref(pat)))), + pmtp(a, new BindDataHandler(boost::bind(&Sampler::Handle, this, _1, boost::ref(pmt)))), + vidp(a, new BindDataHandler(boost::bind(&Sampler::Handle, this, _1, boost::ref(vid)))), + ss(sid, patp, pmtp, vidp, d, a) + { + } + + TemporaryIceAdapterObject<P2PVR::RawDataClient> patp; + TemporaryIceAdapterObject<P2PVR::RawDataClient> pmtp; + TemporaryIceAdapterObject<P2PVR::RawDataClient> vidp; + ServiceStreamerCore ss; + + typedef std::list<P2PVR::Data> Sampled; + Sampled pat, pmt, vid; + + bool Handle(const P2PVR::Data & data, Sampled & rec) + { + rec.push_back(data); + return false; + } + + void Start(DVBSI::DeliveryPtr transport) { ss.Start(transport); } + void Stop() { ss.Stop(); } + + void Save(Ice::CommunicatorPtr ic) + { + Save(ic, pat, "pat.dat"); + Save(ic, pmt, "pmt.dat"); + Save(ic, vid, "vid.dat"); + } + + private: + void Save(Ice::CommunicatorPtr ic, const Sampled & s, const boost::filesystem::path & fileName) + { + auto out = Ice::createOutputStream(ic); + out->write(s); + Ice::ByteSeq buf; + out->finished(buf); + BOOST_MESSAGE(root); + auto outFile = fopen((root / fileName).string().c_str(), "w"); + BOOST_REQUIRE(outFile); + BOOST_REQUIRE_EQUAL(1, fwrite(&buf.front(), buf.size(), 1, outFile)); + BOOST_REQUIRE_EQUAL(0, fclose(outFile)); + } + +}; + +BOOST_FIXTURE_TEST_SUITE( X, Core ) + +BOOST_AUTO_TEST_CASE( broadcast_sample ) +{ + DVBSI::TerrestrialDeliveryPtr transport = new DVBSI::TerrestrialDelivery { + 4170, 682000000, 0, true, true, true, 3, 0, 2, 1, 0, 1, true + }; + BOOST_REQUIRE_EQUAL(transport->Frequency, 682000000); + BOOST_REQUIRE_EQUAL(transport->TransmissionMode, 1); + + BOOST_CHECKPOINT("Acquire device"); + P2PVR::TunerPrx tuner = devs->GetTunerSpecific(transport); + BOOST_REQUIRE(tuner); + tuner->ice_ping(); + + BOOST_CHECKPOINT("Create sampler"); + Sampler sampler(4170, devs, adapter); + + BOOST_CHECKPOINT("Start stream"); + sampler.Start(transport); + + sleep(10); + + BOOST_CHECKPOINT("Stop stream"); + sampler.Stop(); + + BOOST_MESSAGE("PAT packets: " << sampler.pat.size()); + BOOST_MESSAGE("PMT packets: " << sampler.pmt.size()); + BOOST_MESSAGE("Vid packets: " << sampler.vid.size()); + + BOOST_CHECKPOINT("Save samples"); + sampler.Save(ic); +} + +BOOST_AUTO_TEST_SUITE_END(); + |