Add a FrameToRender argument struct as input to FrameToRender

This is to make it easier to add new arguments to the method in the
future. We will remove the already existing method accordingly to WebRTCs deprecation rules.

Bug: webrtc:358039777
Change-Id: Id0706de5216fbd0182cac80ebfccfc4a6a055ee8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364642
Commit-Queue: Fanny Linderborg <linderborg@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Auto-Submit: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43181}
This commit is contained in:
Fanny Linderborg 2024-10-07 11:06:54 +02:00 committed by WebRTC LUCI CQ
parent 6976a1e4ee
commit 01f91c81f7
8 changed files with 84 additions and 7 deletions

View File

@ -288,7 +288,9 @@ rtc_library("video_codec_interface") {
]
deps = [
":codec_globals_headers",
"../../api/units:time_delta",
"../../api/video:video_frame",
"../../api/video:video_frame_type",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:scalability_mode",
"../../api/video_codecs:video_codecs_api",

View File

@ -220,9 +220,11 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
decodedImage.set_timestamp_us(
frame_info->render_time ? frame_info->render_time->us() : -1);
_receiveCallback->FrameToRender(decodedImage, qp, decode_time,
frame_info->content_type,
frame_info->frame_type);
_receiveCallback->FrameToRender({.video_frame = decodedImage,
.qp = qp,
.decode_time = decode_time,
.content_type = frame_info->content_type,
.frame_type = frame_info->frame_type});
}
void VCMDecodedFrameCallback::OnDecoderInfoChanged(

View File

@ -17,6 +17,10 @@
#include "api/array_view.h"
#include "api/rtp_packet_infos.h"
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video_codecs/video_decoder.h"
#include "common_video/test/utilities.h"
#include "modules/video_coding/timing/timing.h"
@ -37,7 +41,15 @@ class ReceiveCallback : public VCMReceiveCallback {
TimeDelta decode_time,
VideoContentType content_type,
VideoFrameType frame_type) override {
frames_.push_back(frame);
return FrameToRender({.video_frame = frame,
.qp = qp,
.decode_time = decode_time,
.content_type = content_type,
.frame_type = frame_type});
}
int32_t FrameToRender(const struct FrameToRender& arguments) override {
frames_.push_back(arguments.video_frame);
return 0;
}

View File

@ -16,8 +16,10 @@
#include <optional>
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video/video_timing.h"
#include "api/video_codecs/video_decoder.h"
@ -51,11 +53,25 @@ enum VCMVideoProtection {
// rendered.
class VCMReceiveCallback {
public:
struct FrameToRender {
VideoFrame& video_frame;
std::optional<uint8_t> qp;
TimeDelta decode_time;
VideoContentType content_type;
VideoFrameType frame_type;
};
// TODO: bugs.webrtc.org/358039777 - Delete this function.
[[deprecated("Use FrameToRender(FrameToRender) instead.")]]
virtual int32_t FrameToRender(VideoFrame& videoFrame, // NOLINT
std::optional<uint8_t> qp,
TimeDelta decode_time,
VideoContentType content_type,
VideoFrameType frame_type) = 0;
// TODO: bugs.webrtc.org/358039777 - Make this pure virtual.
virtual int32_t FrameToRender(const struct FrameToRender& arguments) {
return 0;
}
virtual void OnDroppedFrames(uint32_t frames_dropped);

View File

@ -10,12 +10,18 @@
#include "modules/video_coding/video_receiver2.h"
#include <cstdint>
#include <memory>
#include <optional>
#include <utility>
#include "api/test/mock_video_decoder.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "api/video/encoded_frame.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "common_video/test/utilities.h"
#include "modules/video_coding/decoder_database.h"
#include "modules/video_coding/timing/timing.h"
@ -43,6 +49,10 @@ class MockVCMReceiveCallback : public VCMReceiveCallback {
VideoContentType,
VideoFrameType),
(override));
MOCK_METHOD(int32_t,
FrameToRender,
(const struct FrameToRender&),
(override));
MOCK_METHOD(void, OnIncomingPayloadType, (int), (override));
MOCK_METHOD(void,
OnDecoderInfoChanged,

View File

@ -8,12 +8,20 @@
* be found in the AUTHORS file in the root of the source tree.
*/
#include <cstdint>
#include <optional>
#include "api/test/mock_video_decoder.h"
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/include/video_coding.h"
#include "modules/video_coding/timing/timing.h"
#include "modules/video_coding/video_coding_impl.h"
#include "system_wrappers/include/clock.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/scoped_key_value_config.h"
@ -46,6 +54,10 @@ class MockVCMReceiveCallback : public VCMReceiveCallback {
VideoContentType,
VideoFrameType),
(override));
MOCK_METHOD(int32_t,
FrameToRender,
(const struct FrameToRender&),
(override));
MOCK_METHOD(void, OnIncomingPayloadType, (int), (override));
MOCK_METHOD(void,
OnDecoderInfoChanged,

View File

@ -10,6 +10,13 @@
#include "video/video_stream_decoder2.h"
#include <cstdint>
#include <optional>
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/video_coding/video_receiver2.h"
#include "rtc_base/checks.h"
@ -48,9 +55,18 @@ int32_t VideoStreamDecoder::FrameToRender(VideoFrame& video_frame,
TimeDelta decode_time,
VideoContentType content_type,
VideoFrameType frame_type) {
receive_stats_callback_->OnDecodedFrame(video_frame, qp, decode_time,
content_type, frame_type);
incoming_video_stream_->OnFrame(video_frame);
return FrameToRender({.video_frame = video_frame,
.qp = qp,
.decode_time = decode_time,
.content_type = content_type,
.frame_type = frame_type});
}
int32_t VideoStreamDecoder::FrameToRender(
const struct FrameToRender& arguments) {
receive_stats_callback_->OnDecodedFrame(
arguments.video_frame, arguments.qp, arguments.decode_time,
arguments.content_type, arguments.frame_type);
incoming_video_stream_->OnFrame(arguments.video_frame);
return 0;
}

View File

@ -11,12 +11,18 @@
#ifndef VIDEO_VIDEO_STREAM_DECODER2_H_
#define VIDEO_VIDEO_STREAM_DECODER2_H_
#include <cstdint>
#include <list>
#include <map>
#include <memory>
#include <optional>
#include <vector>
#include "api/scoped_refptr.h"
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video/video_sink_interface.h"
#include "api/video_codecs/video_decoder.h"
#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
@ -45,6 +51,7 @@ class VideoStreamDecoder : public VCMReceiveCallback {
TimeDelta decode_time,
VideoContentType content_type,
VideoFrameType frame_type) override;
int32_t FrameToRender(const struct FrameToRender& arguments) override;
void OnDroppedFrames(uint32_t frames_dropped) override;
void OnIncomingPayloadType(int payload_type) override;
void OnDecoderInfoChanged(