Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
Loading...
Searching...
No Matches
depacketizer.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Roc Streaming authors
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8
9//! @file roc_audio/depacketizer.h
10//! @brief Depacketizer.
11
12#ifndef ROC_AUDIO_DEPACKETIZER_H_
13#define ROC_AUDIO_DEPACKETIZER_H_
14
17#include "roc_audio/sample.h"
21#include "roc_packet/ireader.h"
22
23namespace roc {
24namespace audio {
25
26//! Depacketizer.
27//! @remarks
28//! Reads packets from a packet reader, decodes samples from packets using a
29//! decoder, and produces an audio stream.
31public:
32 //! Initialization.
33 //!
34 //! @b Parameters
35 //! - @p reader is used to read packets
36 //! - @p payload_decoder is used to extract samples from packets
37 //! - @p sample_spec describes output frames
38 //! - @p beep enables weird beeps instead of silence on packet loss
40 IFrameDecoder& payload_decoder,
41 const SampleSpec& sample_spec,
42 bool beep);
43
44 //! Was depacketizer constructed without errors?
45 bool is_valid() const;
46
47 //! Did depacketizer catch first packet?
48 bool is_started() const;
49
50 //! Read audio frame.
51 virtual bool read(Frame& frame);
52
53 //! Get next timestamp to be rendered.
54 //! @pre
55 //! is_started() should return true
57
58private:
59 struct FrameInfo {
60 // Number of samples decoded from packets into the frame.
61 size_t n_decoded_samples;
62
63 // Number of samples filled out in the frame.
64 size_t n_filled_samples;
65
66 // Number of packets dropped during frame construction.
67 size_t n_dropped_packets;
68
69 // This frame first sample timestamp.
70 core::nanoseconds_t capture_ts;
71
72 FrameInfo()
73 : n_decoded_samples(0)
74 , n_filled_samples(0)
75 , n_dropped_packets(0)
76 , capture_ts(0) {
77 }
78 };
79
80 void read_frame_(Frame& frame);
81
82 sample_t* read_samples_(sample_t* buff_ptr, sample_t* buff_end, FrameInfo& info);
83
84 sample_t* read_packet_samples_(sample_t* buff_ptr, sample_t* buff_end);
85 sample_t* read_missing_samples_(sample_t* buff_ptr, sample_t* buff_end);
86
87 void update_packet_(FrameInfo& info);
88 packet::PacketPtr read_packet_();
89
90 void set_frame_props_(Frame& frame, const FrameInfo& info);
91
92 void report_stats_();
93
94 packet::IReader& reader_;
95 IFrameDecoder& payload_decoder_;
96
97 const SampleSpec sample_spec_;
98
99 packet::PacketPtr packet_;
100
102 core::nanoseconds_t next_capture_ts_;
103 bool valid_capture_ts_;
104
105 packet::stream_timestamp_t zero_samples_;
106 packet::stream_timestamp_t missing_samples_;
107 packet::stream_timestamp_t packet_samples_;
108
109 core::RateLimiter rate_limiter_;
110
111 const bool beep_;
112
113 bool first_packet_;
114 bool valid_;
115};
116
117} // namespace audio
118} // namespace roc
119
120#endif // ROC_AUDIO_DEPACKETIZER_H_
bool is_started() const
Did depacketizer catch first packet?
Depacketizer(packet::IReader &reader, IFrameDecoder &payload_decoder, const SampleSpec &sample_spec, bool beep)
Initialization.
virtual bool read(Frame &frame)
Read audio frame.
bool is_valid() const
Was depacketizer constructed without errors?
packet::stream_timestamp_t next_timestamp() const
Get next timestamp to be rendered.
Audio frame.
Definition frame.h:25
Audio frame decoder interface.
Frame reader interface.
Sample specification. Describes sample rate and channels.
Definition sample_spec.h:30
Base class for non-copyable objects.
Definition noncopyable.h:23
Packet reader interface.
Definition ireader.h:23
Audio frame decoder interface.
Frame reader interface.
Packet reader interface.
float sample_t
Raw audio sample.
Definition sample.h:22
int64_t nanoseconds_t
Nanoseconds.
Definition time.h:58
uint32_t stream_timestamp_t
Packet stream timestamp.
Definition units.h:36
Root namespace.
Non-copyable object.
Rate limiter.
Audio sample.
Sample specifications.