Move video-related MediaTransport interfaces to their own file and target
Bug: webrtc:9719 Change-Id: I2cf4a8520ce5c07c76ab0310cf7ab0ab285d9e0c Reviewed-on: https://webrtc-review.googlesource.com/c/122504 Reviewed-by: Peter Slatala <psla@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#26702}
This commit is contained in:
@ -133,6 +133,7 @@ rtc_static_library("libjingle_peerconnection_api") {
|
||||
"transport:bitrate_settings",
|
||||
"transport:network_control",
|
||||
"transport/media:audio_interfaces",
|
||||
"transport/media:video_interfaces",
|
||||
"units:data_rate",
|
||||
"video:encoded_image",
|
||||
"video:video_frame",
|
||||
|
||||
@ -30,38 +30,6 @@ MediaTransportSettings& MediaTransportSettings::operator=(
|
||||
MediaTransportSettings::~MediaTransportSettings() = default;
|
||||
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame() = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::~MediaTransportEncodedVideoFrame() = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
int64_t frame_id,
|
||||
std::vector<int64_t> referenced_frame_ids,
|
||||
int payload_type,
|
||||
const webrtc::EncodedImage& encoded_image)
|
||||
: payload_type_(payload_type),
|
||||
encoded_image_(encoded_image),
|
||||
frame_id_(frame_id),
|
||||
referenced_frame_ids_(std::move(referenced_frame_ids)) {}
|
||||
|
||||
MediaTransportEncodedVideoFrame& MediaTransportEncodedVideoFrame::operator=(
|
||||
const MediaTransportEncodedVideoFrame&) = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame& MediaTransportEncodedVideoFrame::operator=(
|
||||
MediaTransportEncodedVideoFrame&&) = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
const MediaTransportEncodedVideoFrame& o)
|
||||
: MediaTransportEncodedVideoFrame() {
|
||||
*this = o;
|
||||
}
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
MediaTransportEncodedVideoFrame&& o)
|
||||
: MediaTransportEncodedVideoFrame() {
|
||||
*this = std::move(o);
|
||||
}
|
||||
|
||||
SendDataParams::SendDataParams() = default;
|
||||
SendDataParams::SendDataParams(const SendDataParams&) = default;
|
||||
|
||||
|
||||
@ -21,14 +21,13 @@
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/array_view.h"
|
||||
#include "api/rtc_error.h"
|
||||
#include "api/transport/media/audio_transport.h"
|
||||
#include "api/transport/media/video_transport.h"
|
||||
#include "api/units/data_rate.h"
|
||||
#include "api/video/encoded_image.h"
|
||||
#include "rtc_base/copy_on_write_buffer.h"
|
||||
#include "rtc_base/network_route.h"
|
||||
|
||||
@ -88,80 +87,6 @@ class MediaTransportNetworkChangeCallback {
|
||||
const rtc::NetworkRoute& new_network_route) = 0;
|
||||
};
|
||||
|
||||
// Represents encoded video frame, along with the codec information.
|
||||
class MediaTransportEncodedVideoFrame final {
|
||||
public:
|
||||
MediaTransportEncodedVideoFrame(int64_t frame_id,
|
||||
std::vector<int64_t> referenced_frame_ids,
|
||||
int payload_type,
|
||||
const webrtc::EncodedImage& encoded_image);
|
||||
~MediaTransportEncodedVideoFrame();
|
||||
MediaTransportEncodedVideoFrame(const MediaTransportEncodedVideoFrame&);
|
||||
MediaTransportEncodedVideoFrame& operator=(
|
||||
const MediaTransportEncodedVideoFrame& other);
|
||||
MediaTransportEncodedVideoFrame& operator=(
|
||||
MediaTransportEncodedVideoFrame&& other);
|
||||
MediaTransportEncodedVideoFrame(MediaTransportEncodedVideoFrame&&);
|
||||
|
||||
int payload_type() const { return payload_type_; }
|
||||
const webrtc::EncodedImage& encoded_image() const { return encoded_image_; }
|
||||
|
||||
int64_t frame_id() const { return frame_id_; }
|
||||
const std::vector<int64_t>& referenced_frame_ids() const {
|
||||
return referenced_frame_ids_;
|
||||
}
|
||||
|
||||
// Hack to workaround lack of ownership of the EncodedImage buffer. If we
|
||||
// don't already own the underlying data, make a copy.
|
||||
void Retain() { encoded_image_.Retain(); }
|
||||
|
||||
private:
|
||||
MediaTransportEncodedVideoFrame();
|
||||
|
||||
int payload_type_;
|
||||
|
||||
// The buffer is not always owned by the encoded image. On the sender it means
|
||||
// that it will need to make a copy using the Retain() method, if it wants to
|
||||
// deliver it asynchronously.
|
||||
webrtc::EncodedImage encoded_image_;
|
||||
|
||||
// Frame id uniquely identifies a frame in a stream. It needs to be unique in
|
||||
// a given time window (i.e. technically unique identifier for the lifetime of
|
||||
// the connection is not needed, but you need to guarantee that remote side
|
||||
// got rid of the previous frame_id if you plan to reuse it).
|
||||
//
|
||||
// It is required by a remote jitter buffer, and is the same as
|
||||
// EncodedFrame::id::picture_id.
|
||||
//
|
||||
// This data must be opaque to the media transport, and media transport should
|
||||
// itself not make any assumptions about what it is and its uniqueness.
|
||||
int64_t frame_id_;
|
||||
|
||||
// A single frame might depend on other frames. This is set of identifiers on
|
||||
// which the current frame depends.
|
||||
std::vector<int64_t> referenced_frame_ids_;
|
||||
};
|
||||
|
||||
// Interface for receiving encoded video frames from MediaTransportInterface
|
||||
// implementations.
|
||||
class MediaTransportVideoSinkInterface {
|
||||
public:
|
||||
virtual ~MediaTransportVideoSinkInterface() = default;
|
||||
|
||||
// Called when new encoded video frame is received.
|
||||
virtual void OnData(uint64_t channel_id,
|
||||
MediaTransportEncodedVideoFrame frame) = 0;
|
||||
};
|
||||
|
||||
// Interface for video sender to be notified of received key frame request.
|
||||
class MediaTransportKeyFrameRequestCallback {
|
||||
public:
|
||||
virtual ~MediaTransportKeyFrameRequestCallback() = default;
|
||||
|
||||
// Called when a key frame request is received on the transport.
|
||||
virtual void OnKeyFrameRequested(uint64_t channel_id) = 0;
|
||||
};
|
||||
|
||||
// State of the media transport. Media transport begins in the pending state.
|
||||
// It transitions to writable when it is ready to send media. It may transition
|
||||
// back to pending if the connection is blocked. It may transition to closed at
|
||||
|
||||
@ -18,3 +18,14 @@ rtc_source_set("audio_interfaces") {
|
||||
"../..:array_view",
|
||||
]
|
||||
}
|
||||
|
||||
rtc_source_set("video_interfaces") {
|
||||
visibility = [ "*" ]
|
||||
sources = [
|
||||
"video_transport.cc",
|
||||
"video_transport.h",
|
||||
]
|
||||
deps = [
|
||||
"../../video:encoded_image",
|
||||
]
|
||||
}
|
||||
|
||||
56
api/transport/media/video_transport.cc
Normal file
56
api/transport/media/video_transport.cc
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2019 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.
|
||||
*/
|
||||
|
||||
// This is EXPERIMENTAL interface for media transport.
|
||||
//
|
||||
// The goal is to refactor WebRTC code so that audio and video frames
|
||||
// are sent / received through the media transport interface. This will
|
||||
// enable different media transport implementations, including QUIC-based
|
||||
// media transport.
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "api/transport/media/video_transport.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame() = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::~MediaTransportEncodedVideoFrame() = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
int64_t frame_id,
|
||||
std::vector<int64_t> referenced_frame_ids,
|
||||
int payload_type,
|
||||
const webrtc::EncodedImage& encoded_image)
|
||||
: payload_type_(payload_type),
|
||||
encoded_image_(encoded_image),
|
||||
frame_id_(frame_id),
|
||||
referenced_frame_ids_(std::move(referenced_frame_ids)) {}
|
||||
|
||||
MediaTransportEncodedVideoFrame& MediaTransportEncodedVideoFrame::operator=(
|
||||
const MediaTransportEncodedVideoFrame&) = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame& MediaTransportEncodedVideoFrame::operator=(
|
||||
MediaTransportEncodedVideoFrame&&) = default;
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
const MediaTransportEncodedVideoFrame& o)
|
||||
: MediaTransportEncodedVideoFrame() {
|
||||
*this = o;
|
||||
}
|
||||
|
||||
MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame(
|
||||
MediaTransportEncodedVideoFrame&& o)
|
||||
: MediaTransportEncodedVideoFrame() {
|
||||
*this = std::move(o);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
101
api/transport/media/video_transport.h
Normal file
101
api/transport/media/video_transport.h
Normal file
@ -0,0 +1,101 @@
|
||||
/* Copyright 2019 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.
|
||||
*/
|
||||
|
||||
// This is EXPERIMENTAL interface for media transport.
|
||||
//
|
||||
// The goal is to refactor WebRTC code so that audio and video frames
|
||||
// are sent / received through the media transport interface. This will
|
||||
// enable different media transport implementations, including QUIC-based
|
||||
// media transport.
|
||||
|
||||
#ifndef API_TRANSPORT_MEDIA_VIDEO_TRANSPORT_H_
|
||||
#define API_TRANSPORT_MEDIA_VIDEO_TRANSPORT_H_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "api/video/encoded_image.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Represents encoded video frame, along with the codec information.
|
||||
class MediaTransportEncodedVideoFrame final {
|
||||
public:
|
||||
MediaTransportEncodedVideoFrame(int64_t frame_id,
|
||||
std::vector<int64_t> referenced_frame_ids,
|
||||
int payload_type,
|
||||
const webrtc::EncodedImage& encoded_image);
|
||||
~MediaTransportEncodedVideoFrame();
|
||||
MediaTransportEncodedVideoFrame(const MediaTransportEncodedVideoFrame&);
|
||||
MediaTransportEncodedVideoFrame& operator=(
|
||||
const MediaTransportEncodedVideoFrame& other);
|
||||
MediaTransportEncodedVideoFrame& operator=(
|
||||
MediaTransportEncodedVideoFrame&& other);
|
||||
MediaTransportEncodedVideoFrame(MediaTransportEncodedVideoFrame&&);
|
||||
|
||||
int payload_type() const { return payload_type_; }
|
||||
const webrtc::EncodedImage& encoded_image() const { return encoded_image_; }
|
||||
|
||||
int64_t frame_id() const { return frame_id_; }
|
||||
const std::vector<int64_t>& referenced_frame_ids() const {
|
||||
return referenced_frame_ids_;
|
||||
}
|
||||
|
||||
// Hack to workaround lack of ownership of the EncodedImage buffer. If we
|
||||
// don't already own the underlying data, make a copy.
|
||||
void Retain() { encoded_image_.Retain(); }
|
||||
|
||||
private:
|
||||
MediaTransportEncodedVideoFrame();
|
||||
|
||||
int payload_type_;
|
||||
|
||||
// The buffer is not always owned by the encoded image. On the sender it means
|
||||
// that it will need to make a copy using the Retain() method, if it wants to
|
||||
// deliver it asynchronously.
|
||||
webrtc::EncodedImage encoded_image_;
|
||||
|
||||
// Frame id uniquely identifies a frame in a stream. It needs to be unique in
|
||||
// a given time window (i.e. technically unique identifier for the lifetime of
|
||||
// the connection is not needed, but you need to guarantee that remote side
|
||||
// got rid of the previous frame_id if you plan to reuse it).
|
||||
//
|
||||
// It is required by a remote jitter buffer, and is the same as
|
||||
// EncodedFrame::id::picture_id.
|
||||
//
|
||||
// This data must be opaque to the media transport, and media transport should
|
||||
// itself not make any assumptions about what it is and its uniqueness.
|
||||
int64_t frame_id_;
|
||||
|
||||
// A single frame might depend on other frames. This is set of identifiers on
|
||||
// which the current frame depends.
|
||||
std::vector<int64_t> referenced_frame_ids_;
|
||||
};
|
||||
|
||||
// Interface for receiving encoded video frames from MediaTransportInterface
|
||||
// implementations.
|
||||
class MediaTransportVideoSinkInterface {
|
||||
public:
|
||||
virtual ~MediaTransportVideoSinkInterface() = default;
|
||||
|
||||
// Called when new encoded video frame is received.
|
||||
virtual void OnData(uint64_t channel_id,
|
||||
MediaTransportEncodedVideoFrame frame) = 0;
|
||||
};
|
||||
|
||||
// Interface for video sender to be notified of received key frame request.
|
||||
class MediaTransportKeyFrameRequestCallback {
|
||||
public:
|
||||
virtual ~MediaTransportKeyFrameRequestCallback() = default;
|
||||
|
||||
// Called when a key frame request is received on the transport.
|
||||
virtual void OnKeyFrameRequested(uint64_t channel_id) = 0;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
#endif // API_TRANSPORT_MEDIA_VIDEO_TRANSPORT_H_
|
||||
Reference in New Issue
Block a user