1 /* 2 * Copyright (c) 2016 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 11 #ifndef API_VIDEO_VIDEO_SOURCE_INTERFACE_H_ 12 #define API_VIDEO_VIDEO_SOURCE_INTERFACE_H_ 13 14 #include <limits> 15 16 #include "absl/types/optional.h" 17 #include "api/video/video_sink_interface.h" 18 #include "rtc_base/system/rtc_export.h" 19 20 namespace rtc { 21 22 // VideoSinkWants is used for notifying the source of properties a video frame 23 // should have when it is delivered to a certain sink. 24 struct RTC_EXPORT VideoSinkWants { 25 VideoSinkWants(); 26 VideoSinkWants(const VideoSinkWants&); 27 ~VideoSinkWants(); 28 // Tells the source whether the sink wants frames with rotation applied. 29 // By default, any rotation must be applied by the sink. 30 bool rotation_applied = false; 31 32 // Tells the source that the sink only wants black frames. 33 bool black_frames = false; 34 35 // Tells the source the maximum number of pixels the sink wants. 36 int max_pixel_count = std::numeric_limits<int>::max(); 37 // Tells the source the desired number of pixels the sinks wants. This will 38 // typically be used when stepping the resolution up again when conditions 39 // have improved after an earlier downgrade. The source should select the 40 // closest resolution to this pixel count, but if max_pixel_count is set, it 41 // still sets the absolute upper bound. 42 absl::optional<int> target_pixel_count; 43 // Tells the source the maximum framerate the sink wants. 44 int max_framerate_fps = std::numeric_limits<int>::max(); 45 46 // Tells the source that the sink wants width and height of the video frames 47 // to be divisible by |resolution_alignment|. 48 // For example: With I420, this value would be a multiple of 2. 49 // Note that this field is unrelated to any horizontal or vertical stride 50 // requirements the encoder has on the incoming video frame buffers. 51 int resolution_alignment = 1; 52 }; 53 54 template <typename VideoFrameT> 55 class VideoSourceInterface { 56 public: 57 virtual ~VideoSourceInterface() = default; 58 59 virtual void AddOrUpdateSink(VideoSinkInterface<VideoFrameT>* sink, 60 const VideoSinkWants& wants) = 0; 61 // RemoveSink must guarantee that at the time the method returns, 62 // there is no current and no future calls to VideoSinkInterface::OnFrame. 63 virtual void RemoveSink(VideoSinkInterface<VideoFrameT>* sink) = 0; 64 }; 65 66 } // namespace rtc 67 #endif // API_VIDEO_VIDEO_SOURCE_INTERFACE_H_ 68