|
10 | 10 |
|
11 | 11 | #include "test_helpers/control_writer.h"
|
12 | 12 | #include "test_helpers/frame_reader.h"
|
| 13 | +#include "test_helpers/packet_sender.h" |
13 | 14 | #include "test_helpers/packet_writer.h"
|
14 | 15 |
|
15 | 16 | #include "roc_address/interface.h"
|
|
21 | 22 | #include "roc_pipeline/receiver_source.h"
|
22 | 23 | #include "roc_rtp/format_map.h"
|
23 | 24 |
|
| 25 | +#include "roc_fec/composer.h" |
| 26 | +#include "roc_fec/headers.h" |
| 27 | +#include "roc_fec/writer.h" |
| 28 | + |
24 | 29 | namespace roc {
|
25 | 30 | namespace pipeline {
|
26 | 31 |
|
@@ -57,6 +62,11 @@ packet::PacketFactory packet_factory(arena);
|
57 | 62 |
|
58 | 63 | rtp::FormatMap format_map(arena);
|
59 | 64 |
|
| 65 | +fec::Composer<fec::LDPC_Source_PayloadID, fec::Source, fec::Footer> |
| 66 | + ldpc_source_composer(&rtp_composer); |
| 67 | +fec::Composer<fec::LDPC_Repair_PayloadID, fec::Repair, fec::Header> |
| 68 | + ldpc_repair_composer(NULL); |
| 69 | + |
60 | 70 | ReceiverSlot* create_slot(ReceiverSource& source) {
|
61 | 71 | ReceiverSlot* slot = source.create_slot();
|
62 | 72 | CHECK(slot);
|
@@ -1744,6 +1754,93 @@ IGNORE_TEST(receiver_source, timestamp_mapping_remixing) {
|
1744 | 1754 | CHECK(first_ts);
|
1745 | 1755 | }
|
1746 | 1756 |
|
| 1757 | +packet::PacketPtr fill_one_packet(size_t sn, |
| 1758 | + size_t fec_payload_size = 193, |
| 1759 | + packet::IComposer* composer = NULL) { |
| 1760 | + CHECK(fec_payload_size > sizeof(rtp::Header)); |
| 1761 | + const size_t rtp_payload_size = fec_payload_size - sizeof(rtp::Header); |
| 1762 | + |
| 1763 | + packet::PacketPtr pp = packet_factory.new_packet(); |
| 1764 | + CHECK(pp); |
| 1765 | + |
| 1766 | + core::Slice<uint8_t> bp = byte_buffer_factory.new_buffer(); |
| 1767 | + CHECK(bp); |
| 1768 | + |
| 1769 | + if (!composer) { |
| 1770 | + composer = &ldpc_source_composer; |
| 1771 | + } |
| 1772 | + CHECK(composer->prepare(*pp, bp, rtp_payload_size)); |
| 1773 | + |
| 1774 | + pp->set_data(bp); |
| 1775 | + |
| 1776 | + UNSIGNED_LONGS_EQUAL(rtp_payload_size, pp->rtp()->payload.size()); |
| 1777 | + UNSIGNED_LONGS_EQUAL(fec_payload_size, pp->fec()->payload.size()); |
| 1778 | + |
| 1779 | + pp->add_flags(packet::Packet::FlagAudio); |
| 1780 | + |
| 1781 | + pp->rtp()->source = 555; |
| 1782 | + pp->rtp()->payload_type = rtp::PayloadType_L16_Stereo; |
| 1783 | + pp->rtp()->seqnum = packet::seqnum_t(sn); |
| 1784 | + pp->rtp()->stream_timestamp = packet::stream_timestamp_t(sn * 10); |
| 1785 | + |
| 1786 | + for (size_t i = 0; i < rtp_payload_size; i++) { |
| 1787 | + pp->rtp()->payload.data()[i] = uint8_t(sn + i); |
| 1788 | + } |
| 1789 | + |
| 1790 | + return pp; |
| 1791 | +} |
| 1792 | + |
| 1793 | +TEST(receiver_source, packet_buffer) { |
| 1794 | + packet::PacketPtr source_packets[20]; |
| 1795 | + |
| 1796 | + enum { Rate = SampleRate, Chans = Chans_Stereo, MaxPackets = 10 }; |
| 1797 | + |
| 1798 | + init(Rate, Chans, Rate, Chans); |
| 1799 | + |
| 1800 | + ReceiverConfig config = make_config(); |
| 1801 | + config.default_session.prebuf_len = 0; |
| 1802 | + ReceiverSource receiver(config, format_map, packet_factory, byte_buffer_factory, |
| 1803 | + sample_buffer_factory, arena); |
| 1804 | + CHECK(receiver.is_valid()); |
| 1805 | + |
| 1806 | + ReceiverSlot* slot = create_slot(receiver); |
| 1807 | + CHECK(slot); |
| 1808 | + |
| 1809 | + packet::IWriter* endpoint1_writer = |
| 1810 | + create_endpoint(slot, address::Iface_AudioSource, proto1); |
| 1811 | + CHECK(endpoint1_writer); |
| 1812 | + |
| 1813 | + fec::WriterConfig writerConfig; |
| 1814 | + fec::CodecConfig codecConfig; |
| 1815 | + codecConfig.scheme = packet::FEC_LDPC_Staircase; |
| 1816 | + |
| 1817 | + // setup encoder |
| 1818 | + core::ScopedPtr<fec::IBlockEncoder> encoder( |
| 1819 | + fec::CodecMap::instance().new_encoder(codecConfig, byte_buffer_factory, arena), |
| 1820 | + arena); |
| 1821 | + CHECK(encoder); |
| 1822 | + |
| 1823 | + // setup fec writer |
| 1824 | + fec::Writer fec_writer(writerConfig, packet::FEC_LDPC_Staircase, *encoder, |
| 1825 | + *endpoint1_writer, ldpc_source_composer, ldpc_repair_composer, |
| 1826 | + packet_factory, byte_buffer_factory, arena); |
| 1827 | + CHECK(fec_writer.is_valid()); |
| 1828 | + |
| 1829 | + test::PacketWriter packet_writer(arena, fec_writer, ldpc_source_composer, format_map, |
| 1830 | + packet_factory, byte_buffer_factory, PayloadType_Ch2, |
| 1831 | + src1, dst1); |
| 1832 | + |
| 1833 | + // setup reader |
| 1834 | + test::FrameReader frame_reader(receiver, sample_buffer_factory); |
| 1835 | + |
| 1836 | + packet_writer.write_packets(writerConfig.n_source_packets, SamplesPerPacket, |
| 1837 | + output_sample_spec); |
| 1838 | + |
| 1839 | + receiver.refresh(frame_reader.refresh_ts()); |
| 1840 | + frame_reader.read_zero_samples(SamplesPerFrame, output_sample_spec); |
| 1841 | + UNSIGNED_LONGS_EQUAL(0, receiver.num_sessions()); |
| 1842 | +} |
| 1843 | + |
1747 | 1844 | TEST(receiver_source, metrics_sessions) {
|
1748 | 1845 | enum { Rate = SampleRate, Chans = Chans_Stereo, MaxSess = 10 };
|
1749 | 1846 |
|
|
0 commit comments