LibQuicR
Loading...
Searching...
No Matches
subscribe_track_handler.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) 2024 Cisco Systems
2// SPDX-License-Identifier: BSD-2-Clause
3
4#pragma once
5
6#include <quicr/detail/base_track_handler.h>
7#include <quicr/detail/messages.h>
8#include <quicr/detail/stream_buffer.h>
9#include <quicr/metrics.h>
10
11namespace quicr {
12
21 class SubscribeTrackHandler : public BaseTrackHandler
22 {
23 public:
27 enum class Error : uint8_t
28 {
29 kOk = 0,
33 };
34
50
55 {
56 const messages::SubscriberPriority priority;
57 const messages::GroupOrder group_order;
58 const messages::Parameters parameters;
59 const messages::GroupId joining_start;
60 const bool absolute;
61 };
62
63 protected:
71 SubscribeTrackHandler(const FullTrackName& full_track_name,
72 messages::SubscriberPriority priority,
73 messages::GroupOrder group_order,
74 messages::FilterType filter_type,
75 const std::optional<JoiningFetch>& joining_fetch = std::nullopt,
76 bool publisher_initiated = false)
77 : BaseTrackHandler(full_track_name)
78 , priority_(priority)
79 , group_order_(group_order)
80 , filter_type_(filter_type)
81 , joining_fetch_(publisher_initiated ? std::nullopt : joining_fetch)
82 , publisher_initiated_(publisher_initiated)
83 {
84 }
85
86 public:
95 static std::shared_ptr<SubscribeTrackHandler> Create(
96 const FullTrackName& full_track_name,
97 messages::SubscriberPriority priority,
98 messages::GroupOrder group_order = messages::GroupOrder::kAscending,
99 messages::FilterType filter_type = messages::FilterType::kLargestObject)
100 {
101 return std::shared_ptr<SubscribeTrackHandler>(
102 new SubscribeTrackHandler(full_track_name, priority, group_order, filter_type));
103 }
104
110 constexpr Status GetStatus() const noexcept { return status_; }
111
117 void SetPriority(uint8_t priority) noexcept { priority_ = priority; }
118
124 constexpr messages::SubscriberPriority GetPriority() const noexcept { return priority_; }
125
131
132 constexpr messages::GroupOrder GetGroupOrder() const noexcept { return group_order_; }
133
139
140 constexpr messages::FilterType GetFilterType() const noexcept { return filter_type_; }
141
142 constexpr std::optional<messages::Location> GetLatestLocation() const noexcept { return latest_location_; }
143
144 constexpr void SetLatestLocation(messages::Location new_location) noexcept { latest_location_ = new_location; }
145
149 std::optional<JoiningFetch> GetJoiningFetch() const noexcept { return joining_fetch_; }
150
157 void SetTrackAlias(uint64_t track_alias) { track_alias_ = track_alias; }
158
166 std::optional<uint64_t> GetTrackAlias() const noexcept { return track_alias_; }
167
174 void SetReceivedTrackAlias(uint64_t track_alias) { received_track_alias_ = track_alias; }
175
183 std::optional<uint64_t> GetReceivedTrackAlias() const noexcept { return received_track_alias_; }
184
189 void Pause() noexcept;
190
195 void Resume() noexcept;
196
200 void RequestNewGroup() noexcept;
201
202 std::chrono::milliseconds GetDeliveryTimeout() const noexcept { return delivery_timeout_; }
203
204 void SetDeliveryTimeout(std::chrono::milliseconds timeout) noexcept { delivery_timeout_ = timeout; }
205
206 // --------------------------------------------------------------------------
207 // Public Virtual API callback event methods
208 // --------------------------------------------------------------------------
212
223 virtual void ObjectReceived([[maybe_unused]] const ObjectHeaders& object_headers,
224 [[maybe_unused]] BytesSpan data);
225
235 virtual void StreamDataRecv(bool is_start,
236 uint64_t stream_id,
237 std::shared_ptr<const std::vector<uint8_t>> data);
238
246 virtual void DgramDataRecv(std::shared_ptr<const std::vector<uint8_t>> data);
247
258 virtual void PartialObjectReceived([[maybe_unused]] const ObjectHeaders& object_headers,
259 [[maybe_unused]] BytesSpan data)
260 {
261 }
262
270 virtual void StatusChanged([[maybe_unused]] Status status) {}
271
281 virtual void MetricsSampled([[maybe_unused]] const SubscribeTrackMetrics& metrics) {}
282
284
289 bool IsPublisherInitiated() const noexcept { return publisher_initiated_; }
290
298
299 protected:
304 void SetStatus(Status status) noexcept
305 {
306 status_ = status;
307 StatusChanged(status);
308 }
309
310 StreamBuffer<uint8_t> stream_buffer_;
311
312 uint64_t next_object_id_{ 0 };
313 uint64_t current_group_id_{ 0 };
314 bool sent_first_object_{ false };
315
316 private:
318 messages::SubscriberPriority priority_;
319 messages::GroupOrder group_order_;
320 messages::FilterType filter_type_;
321 uint64_t current_stream_id_{ 0 };
322 std::optional<messages::Location> latest_location_;
323 std::optional<JoiningFetch> joining_fetch_;
324 std::optional<uint64_t> track_alias_;
325 std::optional<uint64_t> received_track_alias_;
326 std::chrono::milliseconds delivery_timeout_{ 0 };
327
328 bool publisher_initiated_{ false };
329
330 friend class Transport;
331 friend class Client;
332 friend class Server;
333 };
334
335} // namespace moq
Error
Receive status codes.
Definition subscribe_track_handler.h:28
@ kNoData
Definition subscribe_track_handler.h:32
@ kNotSubscribed
Definition subscribe_track_handler.h:31
@ kNotAuthorized
Definition subscribe_track_handler.h:30
@ kOk
Definition subscribe_track_handler.h:29
std::optional< JoiningFetch > GetJoiningFetch() const noexcept
Get joining fetch info, if any.
Definition subscribe_track_handler.h:149
std::optional< uint64_t > GetReceivedTrackAlias() const noexcept
Get the received track alias.
Definition subscribe_track_handler.h:183
virtual void DgramDataRecv(std::shared_ptr< const std::vector< uint8_t > > data)
Notification of received datagram data.
StreamBuffer< uint8_t > stream_buffer_
Definition subscribe_track_handler.h:310
constexpr std::optional< messages::Location > GetLatestLocation() const noexcept
Definition subscribe_track_handler.h:142
void SetStatus(Status status) noexcept
Set the subscribe status.
Definition subscribe_track_handler.h:304
uint64_t next_object_id_
Definition subscribe_track_handler.h:312
virtual void MetricsSampled(const SubscribeTrackMetrics &metrics)
Notification callback to provide sampled metrics.
Definition subscribe_track_handler.h:281
bool sent_first_object_
Definition subscribe_track_handler.h:314
friend class Transport
Definition subscribe_track_handler.h:330
constexpr Status GetStatus() const noexcept
Get the status of the subscribe.
Definition subscribe_track_handler.h:110
void SetDeliveryTimeout(std::chrono::milliseconds timeout) noexcept
Definition subscribe_track_handler.h:204
std::chrono::milliseconds GetDeliveryTimeout() const noexcept
Definition subscribe_track_handler.h:202
friend class Client
Definition subscribe_track_handler.h:331
SubscribeTrackMetrics subscribe_track_metrics_
Subscribe metrics for the track.
Definition subscribe_track_handler.h:297
virtual void StreamDataRecv(bool is_start, uint64_t stream_id, std::shared_ptr< const std::vector< uint8_t > > data)
Notification of received stream data slice.
constexpr messages::FilterType GetFilterType() const noexcept
Get subscription filter type.
Definition subscribe_track_handler.h:140
void Resume() noexcept
Resume receiving data.
std::optional< uint64_t > GetTrackAlias() const noexcept
Get the track alias.
Definition subscribe_track_handler.h:166
void SetTrackAlias(uint64_t track_alias)
Set the track alias.
Definition subscribe_track_handler.h:157
constexpr messages::SubscriberPriority GetPriority() const noexcept
Get subscription priority.
Definition subscribe_track_handler.h:124
bool IsPublisherInitiated() const noexcept
Check if the subscribe is publisher initiated or not.
Definition subscribe_track_handler.h:289
void RequestNewGroup() noexcept
Generate a new group request for this subscription.
Status
Status codes for the subscribe track.
Definition subscribe_track_handler.h:39
@ kNewGroupRequested
Definition subscribe_track_handler.h:48
@ kSendingUnsubscribe
In this state, callbacks will not be called,.
Definition subscribe_track_handler.h:46
@ kNotConnected
Definition subscribe_track_handler.h:41
@ kPaused
Definition subscribe_track_handler.h:47
@ kPendingResponse
Definition subscribe_track_handler.h:45
@ kNotSubscribed
Definition subscribe_track_handler.h:44
@ kError
Definition subscribe_track_handler.h:42
virtual void PartialObjectReceived(const ObjectHeaders &object_headers, BytesSpan data)
Notification of a partial object received data object.
Definition subscribe_track_handler.h:258
virtual void ObjectReceived(const ObjectHeaders &object_headers, BytesSpan data)
Notification of received [full] data object.
uint64_t current_group_id_
Definition subscribe_track_handler.h:313
static std::shared_ptr< SubscribeTrackHandler > Create(const FullTrackName &full_track_name, messages::SubscriberPriority priority, messages::GroupOrder group_order=messages::GroupOrder::kAscending, messages::FilterType filter_type=messages::FilterType::kLargestObject)
Create shared Subscribe track handler.
Definition subscribe_track_handler.h:95
void SetPriority(uint8_t priority) noexcept
Set the priority of received data.
Definition subscribe_track_handler.h:117
friend class Server
Definition subscribe_track_handler.h:332
virtual void StatusChanged(Status status)
Notification of subscribe status.
Definition subscribe_track_handler.h:270
constexpr messages::GroupOrder GetGroupOrder() const noexcept
Get subscription group order.
Definition subscribe_track_handler.h:132
void SetReceivedTrackAlias(uint64_t track_alias)
Set the received track alias.
Definition subscribe_track_handler.h:174
constexpr void SetLatestLocation(messages::Location new_location) noexcept
Definition subscribe_track_handler.h:144
void Pause() noexcept
Pause receiving data.
SubscribeTrackHandler(const FullTrackName &full_track_name, messages::SubscriberPriority priority, messages::GroupOrder group_order, messages::FilterType filter_type, const std::optional< JoiningFetch > &joining_fetch=std::nullopt, bool publisher_initiated=false)
Subscribe track handler constructor.
Definition subscribe_track_handler.h:71
Definition transport.h:28
std::span< const Byte > BytesSpan
Definition common.h:21
Full track name struct.
Definition track_name.h:260
Object headers struct.
Definition object.h:32
Attributes to use when subscribing with a Joining Fetch.
Definition subscribe_track_handler.h:55
const bool absolute
Definition subscribe_track_handler.h:60
const messages::Parameters parameters
Definition subscribe_track_handler.h:58
const messages::GroupOrder group_order
Definition subscribe_track_handler.h:57
const messages::GroupId joining_start
Definition subscribe_track_handler.h:59
const messages::SubscriberPriority priority
Definition subscribe_track_handler.h:56
Definition metrics.h:31