Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
Toggle main menu visibility
Loading...
Searching...
No Matches
parser.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2017 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_fec/parser.h
10
//! @brief FECFRAME packet parser.
11
12
#ifndef ROC_FEC_PARSER_H_
13
#define ROC_FEC_PARSER_H_
14
15
#include "
roc_core/log.h
"
16
#include "
roc_core/noncopyable.h
"
17
#include "
roc_fec/headers.h
"
18
#include "
roc_packet/iparser.h
"
19
20
namespace
roc
{
21
namespace
fec
{
22
23
//! FECFRAME packet parser.
24
template
<
class
PayloadID, PayloadID_Type Type, PayloadID_Pos Pos>
25
class
Parser
:
public
packet::IParser
,
public
core::NonCopyable
<> {
26
public
:
27
//! Initialization.
28
//! @remarks
29
//! Parses FECFRAME header or footer and passes the rest to @p inner_parser
30
//! if it's not null.
31
explicit
Parser
(
packet::IParser
* inner_parser)
32
: inner_parser_(inner_parser) {
33
}
34
35
//! Parse packet from buffer.
36
virtual
bool
parse
(
packet::Packet
&
packet
,
const
core::Slice<uint8_t>
& buffer) {
37
if
(buffer.
size
() <
sizeof
(PayloadID)) {
38
roc_log
(
LogDebug
,
"fec parser: bad packet, size < %d (payload id)"
,
39
(
int
)
sizeof
(PayloadID));
40
return
false
;
41
}
42
43
const
PayloadID* payload_id;
44
if
(Pos ==
Header
) {
45
payload_id = (
const
PayloadID*)buffer.
data
();
46
}
else
{
47
payload_id =
48
(
const
PayloadID*)(buffer.
data
() + buffer.
size
() -
sizeof
(PayloadID));
49
}
50
51
if
(Type ==
Repair
) {
52
packet
.add_flags(
packet::Packet::FlagRepair
);
53
}
54
55
packet
.add_flags(
packet::Packet::FlagFEC
);
56
57
packet::FEC
&
fec
= *
packet
.fec();
58
59
fec
.fec_scheme = PayloadID::fec_scheme();
60
fec
.encoding_symbol_id = payload_id->esi();
61
fec
.source_block_number = (
packet::blknum_t
)payload_id->sbn();
62
fec
.source_block_length = payload_id->k();
63
fec
.block_length = payload_id->n();
64
65
if
(Pos ==
Header
) {
66
fec
.payload = buffer.
subslice
(
sizeof
(PayloadID), buffer.
size
());
67
}
else
{
68
fec
.payload = buffer.
subslice
(0, buffer.
size
() -
sizeof
(PayloadID));
69
}
70
71
if
(inner_parser_) {
72
return
inner_parser_->parse(
packet
,
fec
.payload);
73
}
74
75
return
true
;
76
}
77
78
private
:
79
packet::IParser
* inner_parser_;
80
};
81
82
}
// namespace fec
83
}
// namespace roc
84
85
#endif
// ROC_FEC_PARSER_H_
roc::core::NonCopyable
Base class for non-copyable objects.
Definition
noncopyable.h:23
roc::core::Slice
Slice.
Definition
slice.h:55
roc::core::Slice::subslice
Slice subslice(size_t from, size_t to) const
Construct a slice pointing to a part of this slice.
Definition
slice.h:162
roc::core::Slice::data
T * data() const
Get slice data.
Definition
slice.h:93
roc::core::Slice::size
size_t size() const
Get number of elements in slice.
Definition
slice.h:109
roc::fec::Parser::parse
virtual bool parse(packet::Packet &packet, const core::Slice< uint8_t > &buffer)
Parse packet from buffer.
Definition
parser.h:36
roc::fec::Parser::Parser
Parser(packet::IParser *inner_parser)
Initialization.
Definition
parser.h:31
roc::packet::IParser
Packet parser interface.
Definition
iparser.h:22
roc::packet::Packet
Packet.
Definition
packet.h:39
roc::packet::Packet::FlagRepair
@ FlagRepair
Packet contains repair FEC symbols.
Definition
packet.h:51
roc::packet::Packet::FlagFEC
@ FlagFEC
Packet contains FEC header.
Definition
packet.h:48
iparser.h
Packet parser interface.
log.h
Logging.
roc_log
#define roc_log(level,...)
Print message to log.
Definition
log.h:31
roc::fec
FEC support.
roc::fec::Header
@ Header
PayloadID comes before payload.
Definition
headers.h:32
roc::fec::Repair
@ Repair
Source packet header of footer.
Definition
headers.h:27
roc::packet
Network packets and packet processing.
roc::packet::blknum_t
uint16_t blknum_t
FEC packet block number.
Definition
units.h:130
roc
Root namespace.
roc::LogDebug
@ LogDebug
Regular debug message.
Definition
log.h:48
noncopyable.h
Non-copyable object.
headers.h
FECFRAME headers.
roc::packet::FEC
FECFRAME packet.
Definition
fec.h:35
roc_fec
parser.h
Generated by
1.17.0