diff options
-rw-r--r-- | src/DabMultiplexer.cpp | 14 | ||||
-rw-r--r-- | src/DabMultiplexer.h | 4 | ||||
-rw-r--r-- | src/fig/FIG.h | 15 | ||||
-rw-r--r-- | src/fig/FIGCarousel.cpp | 35 | ||||
-rw-r--r-- | src/fig/FIGCarousel.h | 2 |
5 files changed, 46 insertions, 24 deletions
diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp index 89c32c2..a44f8b2 100644 --- a/src/DabMultiplexer.cpp +++ b/src/DabMultiplexer.cpp @@ -86,11 +86,11 @@ DabMultiplexer::DabMultiplexer( sync(0x49C5F8), currentFrame(0), insertFIG(0), - rotateFIB(0) + rotateFIB(0), + ensemble(boost::make_shared<dabEnsemble>()), + fig_carousel(ensemble) { prepare_watermark(); - - ensemble = boost::make_shared<dabEnsemble>(); } void DabMultiplexer::prepare_watermark() @@ -631,7 +631,13 @@ void DabMultiplexer::mux_frame(std::vector<boost::shared_ptr<DabOutput> >& outpu unsigned char figSize = 0; // FIB 0 Insertion - switch (insertFIG) { + bool new_fib0_carousel = m_pt.get("general.new_fib0_carousel", false); + if (new_fib0_carousel) { + fig_carousel.fib0(&etiFrame[index], 30, currentFrame % 4); + } + // Skip creating a block for the else because + // I don't want to reindent the whole switch block + else switch (insertFIG) { case 0: case 4: diff --git a/src/DabMultiplexer.h b/src/DabMultiplexer.h index 27cc063..44e9bdb 100644 --- a/src/DabMultiplexer.h +++ b/src/DabMultiplexer.h @@ -35,6 +35,7 @@ #include "dabOutput/edi/TagPacket.h" #include "dabOutput/edi/AFPacket.h" #include "dabOutput/edi/PFT.h" +#include "fig/FIGCarousel.h" #include "crc.h" #include "utils.h" #include "UdpSocket.h" @@ -136,6 +137,9 @@ class DabMultiplexer { // The AF Packet will be protected with reed-solomon and split in fragments PFT edi_pft; #endif // HAVE_OUTPUT_EDI + + /* New FIG Carousel */ + FIGCarousel fig_carousel; }; // DAB Mode diff --git a/src/fig/FIG.h b/src/fig/FIG.h index 915e5f3..318b788 100644 --- a/src/fig/FIG.h +++ b/src/fig/FIG.h @@ -30,11 +30,16 @@ #include <boost/shared_ptr.hpp> #include "MuxElements.h" -struct FIGRuntimeInformation { - unsigned long currentFrame; - boost::shared_ptr<dabEnsemble> ensemble; - bool factumAnalyzer; - +class FIGRuntimeInformation { + public: + FIGRuntimeInformation(boost::shared_ptr<dabEnsemble> e) : + currentFrame(0), + ensemble(e), + factumAnalyzer(false) {} + + unsigned long currentFrame; + boost::shared_ptr<dabEnsemble> ensemble; + bool factumAnalyzer; }; // Recommended FIG rates according to ETSI TR 101 496-2 Table 3.6.1 diff --git a/src/fig/FIGCarousel.cpp b/src/fig/FIGCarousel.cpp index 2634a32..0e3742c 100644 --- a/src/fig/FIGCarousel.cpp +++ b/src/fig/FIGCarousel.cpp @@ -32,11 +32,15 @@ /**************** FIGCarouselElement ****************/ void FIGCarouselElement::reduce_deadline() { +#error "Wrong: deadline should decrement identically for all FIGs" deadline -= rate_increment_ms(fig->repetition_rate()); + std::cerr << "FIG " << fig->name() << + " deadline: " << deadline << std::endl; + if (deadline < 0) { std::cerr << "FIG " << fig->name() << - "has negative scheduling deadline" << std::endl; + " has negative scheduling deadline" << std::endl; } } @@ -44,16 +48,13 @@ void FIGCarouselElement::reduce_deadline() /**************** FIGCarousel *****************/ FIGCarousel::FIGCarousel(boost::shared_ptr<dabEnsemble> ensemble) : + m_rti(ensemble), m_fig0_0(&m_rti), m_fig0_1(&m_rti), m_fig0_2(&m_rti), m_fig0_3(&m_rti), m_fig0_17(&m_rti) { - m_rti.ensemble = ensemble; - m_rti.currentFrame = 0; - m_rti.factumAnalyzer = false; - m_figs_available[std::make_pair(0, 0)] = &m_fig0_0; m_figs_available[std::make_pair(0, 1)] = &m_fig0_1; m_figs_available[std::make_pair(0, 2)] = &m_fig0_2; @@ -94,9 +95,11 @@ void FIGCarousel::allocate_fig_to_fib(int figtype, int extension, int fib) } } -void FIGCarousel::fib0(int framephase) { +size_t FIGCarousel::fib0(uint8_t *buf, size_t bufsize, int framephase) { std::list<FIGCarouselElement> figs = m_fibs[0]; + std::cerr << "fib0(framephase=" << framephase << ")" << std::endl; + std::vector<FIGCarouselElement> sorted_figs; /* Decrement all deadlines according to the desired repetition rate */ @@ -114,10 +117,7 @@ void FIGCarousel::fib0(int framephase) { }); /* Data structure to carry FIB */ - const size_t fib_size = 30; - uint8_t fib_data[fib_size]; - uint8_t *fib_data_current = fib_data; - size_t available_size = fib_size; + size_t available_size = bufsize; /* Take special care for FIG0/0 */ auto fig0_0 = find_if(sorted_figs.begin(), sorted_figs.end(), @@ -126,14 +126,15 @@ void FIGCarousel::fib0(int framephase) { }); if (fig0_0 != sorted_figs.end()) { + std::cerr << "Special FIG 0/0" << std::endl; sorted_figs.erase(fig0_0); if (framephase == 0) { // TODO check for all TM - size_t written = fig0_0->fig->fill(fib_data_current, available_size); + size_t written = fig0_0->fig->fill(buf, available_size); if (written > 0) { available_size -= written; - fib_data_current += written; + buf += written; } else { throw std::runtime_error("Failed to write FIG0/0"); @@ -141,17 +142,23 @@ void FIGCarousel::fib0(int framephase) { } } + for (auto& fig : sorted_figs) { + std::cerr << " FIG:" << fig.fig->name() << std::endl; + } + /* Fill the FIB with the FIGs, taking the earliest deadline first */ while (available_size > 0 and not sorted_figs.empty()) { auto fig_el = sorted_figs.begin(); - size_t written = fig_el->fig->fill(fib_data_current, available_size); + size_t written = fig_el->fig->fill(buf, available_size); if (written > 0) { available_size -= written; - fib_data_current += written; + buf += written; } sorted_figs.erase(fig_el); } + + return bufsize - available_size; } diff --git a/src/fig/FIGCarousel.h b/src/fig/FIGCarousel.h index c8a250e..e823bef 100644 --- a/src/fig/FIGCarousel.h +++ b/src/fig/FIGCarousel.h @@ -51,7 +51,7 @@ class FIGCarousel { void allocate_fig_to_fib(int figtype, int extension, int fib); - void fib0(int framephase); + size_t fib0(uint8_t *buf, size_t bufsize, int framephase); private: FIGRuntimeInformation m_rti; |