blob: 80c42ef04a5f4028cb72b09790cb8494384a39b7 [file] [log] [blame]
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +00001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10#include "webrtc/test/encoder_settings.h"
11
perkj26105b42016-09-29 22:39:10 -070012#include <algorithm>
13#include <string>
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000014
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000015#include "webrtc/test/fake_decoder.h"
16#include "webrtc/video_decoder.h"
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000017
18namespace webrtc {
19namespace test {
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000020
perkj26105b42016-09-29 22:39:10 -070021const size_t DefaultVideoStreamFactory::kMaxNumberOfStreams;
22const int DefaultVideoStreamFactory::kMaxBitratePerStream[] = {150000, 450000,
23 1500000};
24const int DefaultVideoStreamFactory::kDefaultMinBitratePerStream[] = {
25 50000, 200000, 700000};
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000026
perkj26105b42016-09-29 22:39:10 -070027// static
28std::vector<VideoStream> CreateVideoStreams(
29 int width,
30 int height,
31 const webrtc::VideoEncoderConfig& encoder_config) {
32 RTC_DCHECK(encoder_config.number_of_streams <=
33 DefaultVideoStreamFactory::kMaxNumberOfStreams);
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000034
perkj26105b42016-09-29 22:39:10 -070035 std::vector<VideoStream> stream_settings(encoder_config.number_of_streams);
36 int bitrate_left_bps = encoder_config.max_bitrate_bps;
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000037
perkj26105b42016-09-29 22:39:10 -070038 for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
39 stream_settings[i].width =
40 (i + 1) * width / encoder_config.number_of_streams;
41 stream_settings[i].height =
42 (i + 1) * height / encoder_config.number_of_streams;
43 stream_settings[i].max_framerate = 30;
44 stream_settings[i].min_bitrate_bps =
45 DefaultVideoStreamFactory::kDefaultMinBitratePerStream[i];
46 stream_settings[i].target_bitrate_bps = stream_settings[i].max_bitrate_bps =
47 std::min(bitrate_left_bps,
48 DefaultVideoStreamFactory::kMaxBitratePerStream[i]);
49 stream_settings[i].max_qp = 56;
50 bitrate_left_bps -= stream_settings[i].target_bitrate_bps;
51 }
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000052
perkj26105b42016-09-29 22:39:10 -070053 stream_settings[encoder_config.number_of_streams - 1].max_bitrate_bps +=
54 bitrate_left_bps;
55
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +000056 return stream_settings;
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000057}
58
perkj26105b42016-09-29 22:39:10 -070059DefaultVideoStreamFactory::DefaultVideoStreamFactory() {}
60
61std::vector<VideoStream> DefaultVideoStreamFactory::CreateEncoderStreams(
62 int width,
63 int height,
64 const webrtc::VideoEncoderConfig& encoder_config) {
65 return CreateVideoStreams(width, height, encoder_config);
66}
67
68void FillEncoderConfiguration(size_t num_streams,
69 VideoEncoderConfig* configuration) {
70 RTC_DCHECK_LE(num_streams, DefaultVideoStreamFactory::kMaxNumberOfStreams);
71
72 configuration->number_of_streams = num_streams;
73 configuration->video_stream_factory =
74 new rtc::RefCountedObject<DefaultVideoStreamFactory>();
75 configuration->max_bitrate_bps = 0;
76 for (size_t i = 0; i < num_streams; ++i) {
77 configuration->max_bitrate_bps +=
78 DefaultVideoStreamFactory::kMaxBitratePerStream[i];
79 }
80}
81
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000082VideoReceiveStream::Decoder CreateMatchingDecoder(
pbos@webrtc.org6ae48c62014-06-06 10:49:19 +000083 const VideoSendStream::Config::EncoderSettings& encoder_settings) {
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000084 VideoReceiveStream::Decoder decoder;
85 decoder.payload_type = encoder_settings.payload_type;
86 decoder.payload_name = encoder_settings.payload_name;
hbosbab934b2016-01-27 01:36:03 -080087 if (encoder_settings.payload_name == "H264") {
88 decoder.decoder = VideoDecoder::Create(VideoDecoder::kH264);
89 } else if (encoder_settings.payload_name == "VP8") {
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000090 decoder.decoder = VideoDecoder::Create(VideoDecoder::kVp8);
stefan@webrtc.org7c29e8c2014-11-04 19:41:15 +000091 } else if (encoder_settings.payload_name == "VP9") {
92 decoder.decoder = VideoDecoder::Create(VideoDecoder::kVp9);
stefan@webrtc.orgb9f54532014-07-04 12:42:07 +000093 } else {
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000094 decoder.decoder = new FakeDecoder();
stefan@webrtc.orgb9f54532014-07-04 12:42:07 +000095 }
pbos@webrtc.org776e6f22014-10-29 15:28:39 +000096 return decoder;
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000097}
pbos@webrtc.orgf577ae92014-03-19 08:43:57 +000098} // namespace test
99} // namespace webrtc