1e0e9324cSopenharmony_ci/*
2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License.
5e0e9324cSopenharmony_ci * You may obtain a copy of the License at
6e0e9324cSopenharmony_ci *
7e0e9324cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0e9324cSopenharmony_ci *
9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and
13e0e9324cSopenharmony_ci * limitations under the License.
14e0e9324cSopenharmony_ci */
15e0e9324cSopenharmony_ci
16e0e9324cSopenharmony_ci#ifndef OHOS_SHARING_WFD_MESSAGE_H
17e0e9324cSopenharmony_ci#define OHOS_SHARING_WFD_MESSAGE_H
18e0e9324cSopenharmony_ci
19e0e9324cSopenharmony_ci#include <sstream>
20e0e9324cSopenharmony_ci#include "protocol/rtsp/include/rtsp_request.h"
21e0e9324cSopenharmony_ci#include "protocol/rtsp/include/rtsp_response.h"
22e0e9324cSopenharmony_ci#include "wfd_session_def.h"
23e0e9324cSopenharmony_ci
24e0e9324cSopenharmony_cinamespace OHOS {
25e0e9324cSopenharmony_cinamespace Sharing {
26e0e9324cSopenharmony_ci
27e0e9324cSopenharmony_cistruct WfdVideoFormatsInfo {
28e0e9324cSopenharmony_ci    uint16_t native = 0;
29e0e9324cSopenharmony_ci    uint16_t preferredDisplayMode = 0;
30e0e9324cSopenharmony_ci    uint16_t profile = 0;
31e0e9324cSopenharmony_ci    uint16_t level = 0;
32e0e9324cSopenharmony_ci    uint32_t ceaMask = 0;
33e0e9324cSopenharmony_ci    uint32_t veaMask = 0;
34e0e9324cSopenharmony_ci    uint32_t hhMask = 0;
35e0e9324cSopenharmony_ci    uint16_t latency = 0;
36e0e9324cSopenharmony_ci    uint16_t minSlice = 0;
37e0e9324cSopenharmony_ci    uint16_t sliceEncParam = 0;
38e0e9324cSopenharmony_ci    uint16_t frameRateCtlSupport = 0;
39e0e9324cSopenharmony_ci};
40e0e9324cSopenharmony_ci
41e0e9324cSopenharmony_cistruct WfdAudioCodec {
42e0e9324cSopenharmony_ci    CodecId codecId;
43e0e9324cSopenharmony_ci    AudioFormat format;
44e0e9324cSopenharmony_ci};
45e0e9324cSopenharmony_ci
46e0e9324cSopenharmony_ci// WfdRtspM1Request
47e0e9324cSopenharmony_ciclass WfdRtspM1Request : public RtspRequestOptions {
48e0e9324cSopenharmony_cipublic:
49e0e9324cSopenharmony_ci    explicit WfdRtspM1Request(int32_t cseq) : RtspRequestOptions(cseq, "*") { SetRequire(RTSP_METHOD_WFD); }
50e0e9324cSopenharmony_ci};
51e0e9324cSopenharmony_ci
52e0e9324cSopenharmony_ciclass WfdRtspM1Response : public RtspResponseOptions {
53e0e9324cSopenharmony_cipublic:
54e0e9324cSopenharmony_ci    WfdRtspM1Response(int32_t cseq, int32_t status);
55e0e9324cSopenharmony_ci};
56e0e9324cSopenharmony_ci
57e0e9324cSopenharmony_ciclass WfdRtspM2Request : public RtspRequestOptions {
58e0e9324cSopenharmony_cipublic:
59e0e9324cSopenharmony_ci    explicit WfdRtspM2Request(int32_t cseq) : RtspRequestOptions(cseq, "*") { SetRequire(RTSP_METHOD_WFD); }
60e0e9324cSopenharmony_ci};
61e0e9324cSopenharmony_ci
62e0e9324cSopenharmony_ci// WfdRtspM2Response
63e0e9324cSopenharmony_ciclass WfdRtspM2Response : public RtspResponseOptions {
64e0e9324cSopenharmony_cipublic:
65e0e9324cSopenharmony_ci    WfdRtspM2Response(int32_t cseq, int32_t status) : RtspResponseOptions(cseq, status)
66e0e9324cSopenharmony_ci    {
67e0e9324cSopenharmony_ci        std::stringstream ss;
68e0e9324cSopenharmony_ci        ss << RTSP_METHOD_WFD << "," << RTSP_SP << RTSP_METHOD_SETUP << "," << RTSP_SP << RTSP_METHOD_TEARDOWN << ","
69e0e9324cSopenharmony_ci           << RTSP_SP << RTSP_METHOD_PLAY << "," << RTSP_SP << RTSP_METHOD_PAUSE << "," << RTSP_SP
70e0e9324cSopenharmony_ci           << RTSP_METHOD_GET_PARAMETER << "," << RTSP_SP << RTSP_METHOD_SET_PARAMETER;
71e0e9324cSopenharmony_ci        SetPublicItems(ss.str());
72e0e9324cSopenharmony_ci    }
73e0e9324cSopenharmony_ci};
74e0e9324cSopenharmony_ci
75e0e9324cSopenharmony_ci// WfdRtspM3Request
76e0e9324cSopenharmony_ciclass WfdRtspM3Request : public RtspRequestParameter {
77e0e9324cSopenharmony_cipublic:
78e0e9324cSopenharmony_ci    WfdRtspM3Request(int32_t cseq, const std::string &url) : RtspRequestParameter(RTSP_METHOD_GET_PARAMETER, cseq, url)
79e0e9324cSopenharmony_ci    {
80e0e9324cSopenharmony_ci        AddBodyItem(WFD_PARAM_CONTENT_PROTECTION);
81e0e9324cSopenharmony_ci        AddBodyItem(WFD_PARAM_VIDEO_FORMATS);
82e0e9324cSopenharmony_ci        AddBodyItem(WFD_PARAM_AUDIO_CODECS);
83e0e9324cSopenharmony_ci        AddBodyItem(WFD_PARAM_RTP_PORTS);
84e0e9324cSopenharmony_ci    }
85e0e9324cSopenharmony_ci};
86e0e9324cSopenharmony_ci
87e0e9324cSopenharmony_ciclass WfdRtspM3Response : public RtspResponse {
88e0e9324cSopenharmony_cipublic:
89e0e9324cSopenharmony_ci    WfdRtspM3Response() = default;
90e0e9324cSopenharmony_ci    ~WfdRtspM3Response() override = default;
91e0e9324cSopenharmony_ci    WfdRtspM3Response(int32_t cseq, int32_t status) : RtspResponse(cseq, status) {}
92e0e9324cSopenharmony_ci
93e0e9324cSopenharmony_ci    void SetClientRtpPorts(int32_t port);
94e0e9324cSopenharmony_ci    void SetUibcCapability(const std::string &value = "none");
95e0e9324cSopenharmony_ci    void SetAudioCodecs(AudioFormat format = AUDIO_48000_16_2);
96e0e9324cSopenharmony_ci    void SetCoupledSink(const std::string &value = "00  none");
97e0e9324cSopenharmony_ci    void SetContentProtection(const std::string &value = "none");
98e0e9324cSopenharmony_ci    void SetVideoFormats(VideoFormat format = VIDEO_1920X1080_30);
99e0e9324cSopenharmony_ci    void SetStandbyResumeCapability(const std::string &value = "none");
100e0e9324cSopenharmony_ci    void SetCustomParam(const std::string &key, const std::string &value = "none");
101e0e9324cSopenharmony_ci
102e0e9324cSopenharmony_ci    int32_t GetClientRtpPorts();
103e0e9324cSopenharmony_ci    std::string GetUibcCapability();
104e0e9324cSopenharmony_ci    AudioFormat GetAudioCodecs(WfdAudioCodec &codec);
105e0e9324cSopenharmony_ci    std::string GetCoupledSink();
106e0e9324cSopenharmony_ci    std::string GetContentProtection();
107e0e9324cSopenharmony_ci    VideoFormat GetVideoFormats();
108e0e9324cSopenharmony_ci    std::string GetStandbyResumeCapability();
109e0e9324cSopenharmony_ci    std::string GetCustomParam(const std::string &key);
110e0e9324cSopenharmony_ci    VideoFormat GetVideoFormatsByCea(int index);
111e0e9324cSopenharmony_ci    std::string Stringify() override;
112e0e9324cSopenharmony_ci
113e0e9324cSopenharmony_ci    RtspError Parse(const std::string &response) override;
114e0e9324cSopenharmony_ci    WfdVideoFormatsInfo GetWfdVideoFormatsInfo() { return vWfdVideoFormatsInfo_[0]; }
115e0e9324cSopenharmony_ci
116e0e9324cSopenharmony_ciprivate:
117e0e9324cSopenharmony_ci    std::list<std::pair<std::string, std::string>> params_;
118e0e9324cSopenharmony_ci    std::vector<WfdVideoFormatsInfo> vWfdVideoFormatsInfo_;
119e0e9324cSopenharmony_ci};
120e0e9324cSopenharmony_ci
121e0e9324cSopenharmony_ciclass WfdRtspM4Request : public RtspRequestParameter {
122e0e9324cSopenharmony_cipublic:
123e0e9324cSopenharmony_ci    WfdRtspM4Request() = default;
124e0e9324cSopenharmony_ci    ~WfdRtspM4Request() override = default;
125e0e9324cSopenharmony_ci    WfdRtspM4Request(int32_t cseq, const std::string &url) : RtspRequestParameter(RTSP_METHOD_SET_PARAMETER, cseq, url)
126e0e9324cSopenharmony_ci    {
127e0e9324cSopenharmony_ci    }
128e0e9324cSopenharmony_ci
129e0e9324cSopenharmony_ci    void SetClientRtpPorts(int32_t port);
130e0e9324cSopenharmony_ci    void SetAudioCodecs(WfdAudioCodec &codec);
131e0e9324cSopenharmony_ci    void SetPresentationUrl(const std::string &ip);
132e0e9324cSopenharmony_ci    void SetVideoFormats(const WfdVideoFormatsInfo &wfdVideoFormatsInfo, VideoFormat format = VIDEO_1920X1080_30);
133e0e9324cSopenharmony_ci
134e0e9324cSopenharmony_ci    int32_t GetRtpPort();
135e0e9324cSopenharmony_ci
136e0e9324cSopenharmony_ci    std::string GetPresentationUrl();
137e0e9324cSopenharmony_ci    std::string GetParameterValue(const std::string &param);
138e0e9324cSopenharmony_ci
139e0e9324cSopenharmony_ci    RtspError Parse(const std::string &request) override;
140e0e9324cSopenharmony_ci
141e0e9324cSopenharmony_ciprivate:
142e0e9324cSopenharmony_ci    std::list<std::pair<std::string, std::string>> params_;
143e0e9324cSopenharmony_ci};
144e0e9324cSopenharmony_ci
145e0e9324cSopenharmony_ciusing WfdRtspM4Response = RtspResponse;
146e0e9324cSopenharmony_ci
147e0e9324cSopenharmony_ci// WfdRtspM5Request
148e0e9324cSopenharmony_ciclass WfdRtspM5Request : public RtspRequestParameter {
149e0e9324cSopenharmony_cipublic:
150e0e9324cSopenharmony_ci    WfdRtspM5Request() = default;
151e0e9324cSopenharmony_ci    explicit WfdRtspM5Request(int32_t cseq) : RtspRequestParameter(RTSP_METHOD_SET_PARAMETER,
152e0e9324cSopenharmony_ci        cseq, WFD_RTSP_URL_DEFAULT) {}
153e0e9324cSopenharmony_ci
154e0e9324cSopenharmony_ci    void SetTriggerMethod(const std::string &method);
155e0e9324cSopenharmony_ci    std::string GetTriggerMethod();
156e0e9324cSopenharmony_ci};
157e0e9324cSopenharmony_ci
158e0e9324cSopenharmony_ciusing WfdRtspM5Response = RtspResponse;
159e0e9324cSopenharmony_ciusing WfdRtspM6Request = RtspRequestSetup;
160e0e9324cSopenharmony_ci
161e0e9324cSopenharmony_ci// WfdRtspM6Response
162e0e9324cSopenharmony_ciclass WfdRtspM6Response : public RtspResponse {
163e0e9324cSopenharmony_cipublic:
164e0e9324cSopenharmony_ci    WfdRtspM6Response() = default;
165e0e9324cSopenharmony_ci    WfdRtspM6Response(int32_t cseq, int32_t status, std::string sessionID, int32_t timeOut) : RtspResponse(cseq, status)
166e0e9324cSopenharmony_ci    {
167e0e9324cSopenharmony_ci        SetSession(sessionID);
168e0e9324cSopenharmony_ci        SetTimeout(timeOut);
169e0e9324cSopenharmony_ci    }
170e0e9324cSopenharmony_ci    std::string StringifyEx();
171e0e9324cSopenharmony_ci    int32_t GetClientPort();
172e0e9324cSopenharmony_ci    int32_t GetServerPort();
173e0e9324cSopenharmony_ci    void SetClientPort(int port);
174e0e9324cSopenharmony_ci    void SetServerPort(int port);
175e0e9324cSopenharmony_ci
176e0e9324cSopenharmony_ciprivate:
177e0e9324cSopenharmony_ci    int32_t clientPort_ = 0;
178e0e9324cSopenharmony_ci    int32_t serverPort_ = 0;
179e0e9324cSopenharmony_ci};
180e0e9324cSopenharmony_ci
181e0e9324cSopenharmony_ciusing WfdRtspM7Request = RtspRequestPlay;
182e0e9324cSopenharmony_ciusing WfdRtspM8Request = RtspRequestTeardown;
183e0e9324cSopenharmony_ci
184e0e9324cSopenharmony_ciclass WfdRtspIDRRequest : public RtspRequestParameter {
185e0e9324cSopenharmony_cipublic:
186e0e9324cSopenharmony_ci    WfdRtspIDRRequest() = default;
187e0e9324cSopenharmony_ci    explicit WfdRtspIDRRequest(int32_t cseq, const std::string &url)
188e0e9324cSopenharmony_ci        : RtspRequestParameter(RTSP_METHOD_SET_PARAMETER, cseq, url)
189e0e9324cSopenharmony_ci    {
190e0e9324cSopenharmony_ci        AddBodyItem(WFD_PARAM_IDR_REQUEST);
191e0e9324cSopenharmony_ci    }
192e0e9324cSopenharmony_ci};
193e0e9324cSopenharmony_ci
194e0e9324cSopenharmony_ci// WfdRtspM7Response
195e0e9324cSopenharmony_ciclass WfdRtspM7Response : public RtspResponse {
196e0e9324cSopenharmony_cipublic:
197e0e9324cSopenharmony_ci    WfdRtspM7Response() = default;
198e0e9324cSopenharmony_ci    WfdRtspM7Response(int32_t cseq, int32_t status, std::string sessionID) : RtspResponse(cseq, status)
199e0e9324cSopenharmony_ci    {
200e0e9324cSopenharmony_ci        SetSession(sessionID);
201e0e9324cSopenharmony_ci    }
202e0e9324cSopenharmony_ci    std::string StringifyEx();
203e0e9324cSopenharmony_ci};
204e0e9324cSopenharmony_ci
205e0e9324cSopenharmony_ciusing WfdRtspM8Response = RtspResponse;
206e0e9324cSopenharmony_ci
207e0e9324cSopenharmony_ciclass WfdRtspM16Request : public RtspRequestParameter {
208e0e9324cSopenharmony_cipublic:
209e0e9324cSopenharmony_ci    WfdRtspM16Request(int32_t cseq, const std::string &url, std::string sessionID)
210e0e9324cSopenharmony_ci        : RtspRequestParameter(RTSP_METHOD_GET_PARAMETER, cseq, url)
211e0e9324cSopenharmony_ci    {
212e0e9324cSopenharmony_ci        SetSession(sessionID);
213e0e9324cSopenharmony_ci    }
214e0e9324cSopenharmony_ci};
215e0e9324cSopenharmony_ci
216e0e9324cSopenharmony_ciusing WfdRtspM16Response = RtspResponse;
217e0e9324cSopenharmony_ci
218e0e9324cSopenharmony_ci} // namespace Sharing
219e0e9324cSopenharmony_ci} // namespace OHOS
220e0e9324cSopenharmony_ci#endif
221