Skip to content

Commit

Permalink
Move VideoStreamEncoderInterface to api/.
Browse files Browse the repository at this point in the history
Bug: webrtc:8830
Change-Id: I17908b4ef6a043acf22e2110b9672012d5fa7fc0
Reviewed-on: https://webrtc-review.googlesource.com/74481
Reviewed-by: Karl Wiberg <[email protected]>
Reviewed-by: Rasmus Brandt <[email protected]>
Reviewed-by: Sebastian Jansson <[email protected]>
Reviewed-by: Stefan Holmer <[email protected]>
Commit-Queue: Niels Moller <[email protected]>
Cr-Commit-Position: refs/heads/master@{#23334}
  • Loading branch information
Niels Möller authored and Commit Bot committed May 21, 2018
1 parent 65ec0fc commit 0327c2d
Show file tree
Hide file tree
Showing 24 changed files with 218 additions and 108 deletions.
3 changes: 1 addition & 2 deletions api/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,6 @@ rtc_static_library("libjingle_peerconnection_api") {
"turncustomizer.h",
"umametrics.cc",
"umametrics.h",
"videosourceinterface.cc",
"videosourceinterface.h",
"videosourceproxy.h",
]

Expand Down Expand Up @@ -227,6 +225,7 @@ rtc_source_set("video_frame_api") {
visibility = [ "*" ]
sources = [
"videosinkinterface.h",
"videosourceinterface.h",
]

public_deps = [ # no-presubmit-check TODO(webrtc:8603)
Expand Down
2 changes: 1 addition & 1 deletion api/mediastreaminterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
// relying on them; they were previously transitively included by
// mediachannel.h, which is no longer a dependency of this file.
#include "api/video/video_sink_interface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "modules/audio_processing/include/audio_processing_statistics.h"
#include "rtc_base/ratetracker.h"
#include "rtc_base/refcount.h"
Expand Down
18 changes: 18 additions & 0 deletions api/video/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@ rtc_source_set("video_frame") {
"video_frame_buffer.h",
"video_rotation.h",
"video_sink_interface.h",
"video_source_interface.cc",
"video_source_interface.h",
"video_timing.cc",
"video_timing.h",
]

deps = [
"..:optional",
"../../rtc_base:checks",
"../../rtc_base:rtc_base_approved",
]
Expand Down Expand Up @@ -99,3 +102,18 @@ rtc_source_set("video_stream_decoder_create") {
"../../video:video_stream_decoder_impl",
]
}

rtc_source_set("video_stream_encoder") {
visibility = [ "*" ]
sources = [
"video_stream_encoder_interface.h",
]

deps = [
":video_frame",

# For rtpparameters.h
"..:libjingle_peerconnection_api",
"../video_codecs:video_codecs_api",
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree.
*/

#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"

namespace rtc {

Expand Down
61 changes: 61 additions & 0 deletions api/video/video_source_interface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Copyright (c) 2016 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 API_VIDEO_VIDEO_SOURCE_INTERFACE_H_
#define API_VIDEO_VIDEO_SOURCE_INTERFACE_H_

#include <limits>

#include "api/optional.h"
#include "api/video/video_sink_interface.h"

namespace rtc {

// VideoSinkWants is used for notifying the source of properties a video frame
// should have when it is delivered to a certain sink.
struct VideoSinkWants {
VideoSinkWants();
VideoSinkWants(const VideoSinkWants&);
~VideoSinkWants();
// Tells the source whether the sink wants frames with rotation applied.
// By default, any rotation must be applied by the sink.
bool rotation_applied = false;

// Tells the source that the sink only wants black frames.
bool black_frames = false;

// Tells the source the maximum number of pixels the sink wants.
int max_pixel_count = std::numeric_limits<int>::max();
// Tells the source the desired number of pixels the sinks wants. This will
// typically be used when stepping the resolution up again when conditions
// have improved after an earlier downgrade. The source should select the
// closest resolution to this pixel count, but if max_pixel_count is set, it
// still sets the absolute upper bound.
rtc::Optional<int> target_pixel_count;
// Tells the source the maximum framerate the sink wants.
int max_framerate_fps = std::numeric_limits<int>::max();
};

template <typename VideoFrameT>
class VideoSourceInterface {
public:
virtual void AddOrUpdateSink(VideoSinkInterface<VideoFrameT>* sink,
const VideoSinkWants& wants) = 0;
// RemoveSink must guarantee that at the time the method returns,
// there is no current and no future calls to VideoSinkInterface::OnFrame.
virtual void RemoveSink(VideoSinkInterface<VideoFrameT>* sink) = 0;

protected:
// Non-public, since one shouldn't own sources via this interface.
virtual ~VideoSourceInterface() {}
};

} // namespace rtc
#endif // API_VIDEO_VIDEO_SOURCE_INTERFACE_H_
107 changes: 107 additions & 0 deletions api/video/video_stream_encoder_interface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* Copyright (c) 2018 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 API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_
#define API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_

#include <vector>

#include "api/rtpparameters.h" // For DegradationPreference.
#include "api/video/video_sink_interface.h"
#include "api/video/video_source_interface.h"
#include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/video_encoder_config.h"

namespace webrtc {

// TODO(nisse): Move full declaration to api/.
class VideoBitrateAllocationObserver;

// This interface represents a class responsible for creating and driving the
// encoder(s) for a single video stream. It is also responsible for adaptation
// decisions related to video quality, requesting reduced frame rate or
// resolution from the VideoSource when needed.
// TODO(bugs.webrtc.org/8830): This interface is under development. Changes
// under consideration include:
//
// 1. Taking out responsibility for adaptation decisions, instead only reporting
// per-frame measurements to the decision maker.
//
// 2. Moving responsibility for simulcast and for software fallback into this
// class.
class VideoStreamEncoderInterface : public rtc::VideoSinkInterface<VideoFrame> {
public:
// Interface for receiving encoded video frames and notifications about
// configuration changes.
class EncoderSink : public EncodedImageCallback {
public:
virtual void OnEncoderConfigurationChanged(
std::vector<VideoStream> streams,
int min_transmit_bitrate_bps) = 0;
};

virtual ~VideoStreamEncoderInterface() = default;

// Sets the source that will provide video frames to the VideoStreamEncoder's
// OnFrame method. |degradation_preference| control whether or not resolution
// or frame rate may be reduced. The VideoStreamEncoder registers itself with
// |source|, and signals adaptation decisions to the source in the form of
// VideoSinkWants.
// TODO(nisse): When adaptation logic is extracted from this class,
// it no longer needs to know the source.
virtual void SetSource(
rtc::VideoSourceInterface<VideoFrame>* source,
const DegradationPreference& degradation_preference) = 0;

// Sets the |sink| that gets the encoded frames. |rotation_applied| means
// that the source must support rotation. Only set |rotation_applied| if the
// remote side does not support the rotation extension.
virtual void SetSink(EncoderSink* sink, bool rotation_applied) = 0;

// Sets an initial bitrate, later overriden by OnBitrateUpdated. Mainly
// affects the resolution of the initial key frame: If incoming frames are
// larger than reasonable for the start bitrate, and scaling is enabled,
// VideoStreamEncoder asks the source to scale down and drops a few initial
// frames.
// TODO(nisse): This is a poor interface, and mixes bandwidth estimation and
// codec configuration in an undesired way. For the actual send bandwidth, we
// should always be somewhat conservative, but we may nevertheless want to let
// the application configure a more optimistic quality for the initial
// resolution. Should be replaced by a construction time setting.
virtual void SetStartBitrate(int start_bitrate_bps) = 0;

// Request a key frame. Used for signalling from the remote receiver.
virtual void SendKeyFrame() = 0;

// Set the currently estimated network properties. A |bitrate_bps|
// of zero pauses the encoder.
virtual void OnBitrateUpdated(uint32_t bitrate_bps,
uint8_t fraction_lost,
int64_t round_trip_time_ms) = 0;

// Register observer for the bitrate allocation between the temporal
// and spatial layers.
virtual void SetBitrateAllocationObserver(
VideoBitrateAllocationObserver* bitrate_observer) = 0;

// Creates and configures an encoder with the given |config|. The
// |max_data_payload_length| is used to support single NAL unit
// packetization for H.264.
virtual void ConfigureEncoder(VideoEncoderConfig config,
size_t max_data_payload_length) = 0;

// Permanently stop encoding. After this method has returned, it is
// guaranteed that no encoded frames will be delivered to the sink.
virtual void Stop() = 0;
};

} // namespace webrtc

#endif // API_VIDEO_VIDEO_STREAM_ENCODER_INTERFACE_H_
48 changes: 3 additions & 45 deletions api/videosourceinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,50 +11,8 @@
#ifndef API_VIDEOSOURCEINTERFACE_H_
#define API_VIDEOSOURCEINTERFACE_H_

#include <limits>
// TODO(nisse): Place holder for moved file. Delete after applications are
// updated.
#include "api/video/video_source_interface.h"

#include "api/optional.h"
#include "api/video/video_sink_interface.h"

namespace rtc {

// VideoSinkWants is used for notifying the source of properties a video frame
// should have when it is delivered to a certain sink.
struct VideoSinkWants {
VideoSinkWants();
VideoSinkWants(const VideoSinkWants&);
~VideoSinkWants();
// Tells the source whether the sink wants frames with rotation applied.
// By default, any rotation must be applied by the sink.
bool rotation_applied = false;

// Tells the source that the sink only wants black frames.
bool black_frames = false;

// Tells the source the maximum number of pixels the sink wants.
int max_pixel_count = std::numeric_limits<int>::max();
// Tells the source the desired number of pixels the sinks wants. This will
// typically be used when stepping the resolution up again when conditions
// have improved after an earlier downgrade. The source should select the
// closest resolution to this pixel count, but if max_pixel_count is set, it
// still sets the absolute upper bound.
rtc::Optional<int> target_pixel_count;
// Tells the source the maximum framerate the sink wants.
int max_framerate_fps = std::numeric_limits<int>::max();
};

template <typename VideoFrameT>
class VideoSourceInterface {
public:
virtual void AddOrUpdateSink(VideoSinkInterface<VideoFrameT>* sink,
const VideoSinkWants& wants) = 0;
// RemoveSink must guarantee that at the time the method returns,
// there is no current and no future calls to VideoSinkInterface::OnFrame.
virtual void RemoveSink(VideoSinkInterface<VideoFrameT>* sink) = 0;

protected:
virtual ~VideoSourceInterface() {}
};

} // namespace rtc
#endif // API_VIDEOSOURCEINTERFACE_H_
4 changes: 2 additions & 2 deletions call/video_send_stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
#include <vector>

#include "api/call/transport.h"
#include "api/rtpparameters.h"
#include "api/rtp_headers.h"
#include "api/rtpparameters.h"
#include "api/video/video_sink_interface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "api/video_codecs/video_encoder_config.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "call/rtp_config.h"
Expand Down
6 changes: 3 additions & 3 deletions media/base/mediachannel.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@
#include "api/rtpparameters.h"
#include "api/rtpreceiverinterface.h"
#include "api/video/video_content_type.h"
#include "api/video/video_timing.h"
#include "api/video/video_sink_interface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "api/video/video_timing.h"
#include "api/video_codecs/video_encoder_config.h"
#include "media/base/codec.h"
#include "media/base/mediaconfig.h"
#include "media/base/mediaconstants.h"
Expand All @@ -42,7 +43,6 @@
#include "rtc_base/socket.h"
#include "rtc_base/stringencode.h"


namespace rtc {
class Timing;
}
Expand Down
2 changes: 1 addition & 1 deletion media/base/videocapturer.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
#include <string>
#include <vector>

#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "media/base/videoadapter.h"
#include "media/base/videobroadcaster.h"
#include "media/base/videocommon.h"
Expand Down
2 changes: 1 addition & 1 deletion media/base/videosourcebase.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include <vector>

#include "api/video/video_frame.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "rtc_base/thread_checker.h"

namespace rtc {
Expand Down
4 changes: 2 additions & 2 deletions media/engine/webrtcvideoengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@
#include "api/call/transport.h"
#include "api/optional.h"
#include "api/video/video_frame.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video/video_sink_interface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "api/video_codecs/sdp_video_format.h"
#include "call/call.h"
#include "call/flexfec_receive_stream.h"
#include "call/video_receive_stream.h"
Expand Down
1 change: 1 addition & 0 deletions pc/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,7 @@ if (rtc_include_tests) {
"../api:libjingle_peerconnection_api",
"../api:libjingle_peerconnection_test_api",
"../api:rtc_stats_api",
"../api/video:video_frame",
"../api/video_codecs:builtin_video_decoder_factory",
"../api/video_codecs:builtin_video_encoder_factory",
"../call:call_interfaces",
Expand Down
2 changes: 1 addition & 1 deletion pc/channel.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#include "api/jsep.h"
#include "api/rtpreceiverinterface.h"
#include "api/video/video_sink_interface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "call/rtp_packet_sink_interface.h"
#include "media/base/mediachannel.h"
#include "media/base/mediaengine.h"
Expand Down
2 changes: 1 addition & 1 deletion pc/test/fakeperiodicvideosource.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#include <memory>

#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "media/base/fakeframesource.h"
#include "media/base/videobroadcaster.h"
#include "rtc_base/ptr_util.h"
Expand Down
2 changes: 1 addition & 1 deletion pc/test/fakevideotracksource.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#define PC_TEST_FAKEVIDEOTRACKSOURCE_H_

#include "api/mediastreaminterface.h"
#include "api/videosourceinterface.h"
#include "api/video/video_source_interface.h"
#include "pc/videotracksource.h"

namespace webrtc {
Expand Down
Loading

0 comments on commit 0327c2d

Please sign in to comment.