Line data Source code
1 : /*
2 : * Copyright (C) 2004-2026 Savoir-faire Linux Inc.
3 : *
4 : * This program is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 3 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 : */
17 :
18 : #pragma once
19 :
20 : #ifdef HAVE_CONFIG_H
21 : #include "config.h"
22 : #endif
23 :
24 : #include "media/media_codec.h"
25 : #include "jami.h"
26 :
27 : namespace jami {
28 :
29 : class MediaAttribute
30 : {
31 : public:
32 793 : MediaAttribute(MediaType type = MediaType::MEDIA_NONE,
33 : bool muted = false,
34 : bool secure = true,
35 : bool enabled = false,
36 : std::string_view source = {},
37 : std::string_view label = {},
38 : bool hold = false)
39 793 : : type_(type)
40 793 : , muted_(muted)
41 793 : , secure_(secure)
42 793 : , enabled_(enabled)
43 1586 : , sourceUri_(source)
44 1586 : , label_(label)
45 793 : , hold_(hold)
46 793 : {}
47 :
48 : MediaAttribute(const libjami::MediaMap& mediaMap, bool secure);
49 :
50 : static std::vector<MediaAttribute> buildMediaAttributesList(const std::vector<libjami::MediaMap>& mediaList,
51 : bool secure);
52 :
53 : static MediaType stringToMediaType(const std::string& mediaType);
54 :
55 : static std::pair<bool, MediaType> getMediaType(const libjami::MediaMap& map);
56 :
57 : static std::pair<bool, bool> getBoolValue(const libjami::MediaMap& mediaMap, const std::string& key);
58 :
59 : static std::pair<bool, std::string> getStringValue(const libjami::MediaMap& mediaMap, const std::string& key);
60 :
61 : // Return true if at least one media has a matching type.
62 : static bool hasMediaType(const std::vector<MediaAttribute>& mediaList, MediaType type);
63 :
64 : // Return a string of a boolean
65 : static char const* boolToString(bool val);
66 :
67 : // Return a string of the media type
68 : static char const* mediaTypeToString(MediaType type);
69 :
70 : // Convert MediaAttribute to MediaMap
71 : static libjami::MediaMap toMediaMap(const MediaAttribute& mediaAttr);
72 :
73 : // Serialize a vector of MediaAttribute to a vector of MediaMap
74 : static std::vector<libjami::MediaMap> mediaAttributesToMediaMaps(const std::vector<MediaAttribute>& mediaAttrList);
75 :
76 : std::string toString(bool full = false) const;
77 :
78 : MediaType type_ {MediaType::MEDIA_NONE};
79 : bool muted_ {false};
80 : bool secure_ {true};
81 : bool enabled_ {false};
82 : std::string sourceUri_ {};
83 : std::string label_ {};
84 : bool hold_ {false};
85 :
86 : // NOTE: the hold and mute attributes are related but not
87 : // tightly coupled. A hold/resume operation should always
88 : // trigger a new re-invite to notify the change in media
89 : // direction. For instance, on an active call, the hold action
90 : // would change the media direction attribute from "sendrecv"
91 : // to "sendonly". A new SDP with the new media direction will
92 : // be generated and sent to the peer in the re-invite.
93 : // In contrast, the mute attribute is a local attribute, and
94 : // describes the presence (or absence) of the media signal in
95 : // the stream. In other words, the mute action can be performed
96 : // with or without a media direction change (no re-invite).
97 : // For instance, muting the audio can be done by disabling the
98 : // audio input (capture) of the encoding session, resulting in
99 : // sending RTP packets without actual audio (silence).
100 :
101 : bool hasValidVideo();
102 : };
103 : } // namespace jami
|