| /* | |
| * Copyright 2026 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #ifndef PC_TEST_FULL_CODEC_MATRIX_H_ | |
| #define PC_TEST_FULL_CODEC_MATRIX_H_ | |
| #include <vector> | |
| #include "api/payload_type.h" | |
| #include "api/video_codecs/sdp_video_format.h" | |
| #include "media/base/codec.h" | |
| namespace webrtc { | |
| namespace test { | |
| // The codec list that an endpoint with hardware codecs has in practice. It | |
| // uses up most of the 61 dynamic payload types (35-63 and 96-127), which | |
| // leaves applications that add codecs of their own by munging the SDP with | |
| // very little room. The formats are the ones that | |
| // pc/peer_connection_stability_integrationtest.cc records for a tip of tree | |
| // build. Endpoints with hardware H.265 have more formats still, but H.265 is | |
| // only compiled in when rtc_use_h265 is set, so it is left out here. | |
| // See https://issues.webrtc.org/360058654 for what happens when the payload | |
| // types run out. | |
| // | |
| // The first format is VP8 and the last one is AV1 profile 1, which lets tests | |
| // pick a format that is negotiated early and one that is negotiated late | |
| // without spelling the parameters out again. | |
| inline std::vector<SdpVideoFormat> HardwareVideoFormats() { | |
| return { | |
| SdpVideoFormat("VP8"), | |
| SdpVideoFormat("VP9", {{"profile-id", "0"}}), | |
| SdpVideoFormat("VP9", {{"profile-id", "1"}}), | |
| SdpVideoFormat("VP9", {{"profile-id", "2"}}), | |
| SdpVideoFormat("VP9", {{"profile-id", "3"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "1"}, | |
| {"profile-level-id", "42001f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "0"}, | |
| {"profile-level-id", "42001f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "1"}, | |
| {"profile-level-id", "42e01f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "0"}, | |
| {"profile-level-id", "42e01f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "1"}, | |
| {"profile-level-id", "4d001f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "0"}, | |
| {"profile-level-id", "4d001f"}}), | |
| SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"}, | |
| {"packetization-mode", "1"}, | |
| {"profile-level-id", "f4001f"}}), | |
| SdpVideoFormat("AV1", {{"level-idx", "5"}, {"profile", "0"}}), | |
| SdpVideoFormat("AV1", {{"level-idx", "5"}, {"profile", "1"}}), | |
| }; | |
| } | |
| // The video formats above, each of them followed by an RTX codec of its own. | |
| // The payload types are handed out in the order in which the payload type | |
| // picker hands them out, so that the list looks like the one of an endpoint | |
| // that has negotiated once already. | |
| inline std::vector<Codec> HardwareVideoCodecs() { | |
| int next_payload_type = 35; | |
| auto payload_type = [&next_payload_type] { | |
| if (next_payload_type == 64) { | |
| next_payload_type = 96; | |
| } | |
| return PayloadType(next_payload_type++); | |
| }; | |
| std::vector<Codec> codecs; | |
| for (const SdpVideoFormat& format : HardwareVideoFormats()) { | |
| Codec codec = CreateVideoCodec(payload_type(), format); | |
| codecs.push_back(codec); | |
| codecs.push_back(CreateVideoRtxCodec(payload_type(), codec.id.value())); | |
| } | |
| return codecs; | |
| } | |
| } // namespace test | |
| } // namespace webrtc | |
| #endif // PC_TEST_FULL_CODEC_MATRIX_H_ |