Skip to content

Commit d2507d3

Browse files
committed
Bug 1995393 - Vendor libwebrtc from 8e8480de52
Upstream commit: https://webrtc.googlesource.com/src/+/8e8480de52505e4a086010b4732ce1197bc17139 Calculate video encode PSNR (in supported codecs) the Y, U and V components, applications can do a weighted average. https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-psnrsum Depends on cisco/openh264#3824 (for OpenH264) https://chromium-review.googlesource.com/c/webm/libvpx/+/6167966 (libvpx) https://aomedia-review.googlesource.com/c/aom/+/196501 (libaom) This CL implements the codec changes, https://webrtc-review.googlesource.com/c/src/+/375021 is a follow-up to wire up getStats. BUG=webrtc:388070060 Change-Id: I7046158a7b6e4183a9ec939fcac94eee9d65530d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/368960 Reviewed-by: Erik Språng <sprangwebrtc.org> Commit-Queue: Philipp Hancke <phanckemeta.com> Reviewed-by: Harald Alvestrand <htawebrtc.org> Cr-Commit-Position: refs/heads/main{#45312} UltraBlame original commit: befe911a3f68a9dc904c9ae60f4e3d2262e5c1ea
1 parent aa78e95 commit d2507d3

29 files changed

+397
-91
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
2-
libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-22T20:59:28.116125+00:00.
2+
libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-22T21:02:26.587370+00:00.
33
# base of lastest vendoring
4-
b7bde5ab8a
4+
8e8480de52

third_party/libwebrtc/api/video/encoded_image.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ class RTC_EXPORT EncodedImageBuffer : public EncodedImageBufferInterface {
7878

7979
class RTC_EXPORT EncodedImage {
8080
public:
81+
82+
struct Psnr {
83+
double y = 0.0;
84+
double u = 0.0;
85+
double v = 0.0;
86+
};
87+
8188
EncodedImage();
8289
EncodedImage(EncodedImage&&);
8390
EncodedImage(const EncodedImage&);
@@ -260,6 +267,9 @@ class RTC_EXPORT EncodedImage {
260267
EncodedImage::Timing video_timing() const { return timing_; }
261268
EncodedImage::Timing* video_timing_mutable() { return &timing_; }
262269

270+
std::optional<Psnr> psnr() const { return psnr_; }
271+
void set_psnr(std::optional<Psnr> psnr) { psnr_ = psnr; }
272+
263273
private:
264274
size_t capacity() const { return encoded_data_ ? encoded_data_->size() : 0; }
265275

@@ -296,6 +306,9 @@ class RTC_EXPORT EncodedImage {
296306

297307
std::optional<CorruptionDetectionFilterSettings>
298308
corruption_detection_filter_settings_;
309+
310+
311+
std::optional<Psnr> psnr_;
299312
};
300313

301314
}

third_party/libwebrtc/call/BUILD.gn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,7 @@ rtc_library("video_send_stream_api") {
409409
"../api/adaptation:resource_adaptation_api",
410410
"../api/crypto:options",
411411
"../api/units:data_rate",
412+
"../api/video:encoded_image",
412413
"../api/video:video_frame",
413414
"../api/video:video_rtp_headers",
414415
"../api/video:video_stream_encoder",
@@ -648,7 +649,6 @@ if (rtc_include_tests) {
648649
"../system_wrappers:metrics",
649650
"../test:encoder_settings",
650651
"../test:fake_video_codecs",
651-
"../test:field_trial",
652652
"../test:fileutils",
653653
"../test:frame_generator_capturer",
654654
"../test:test_common",
@@ -659,6 +659,7 @@ if (rtc_include_tests) {
659659
"../test/network:simulated_network",
660660
"../video/config:encoder_config",
661661
"//third_party/abseil-cpp/absl/flags:flag",
662+
"//third_party/abseil-cpp/absl/strings",
662663
"//third_party/abseil-cpp/absl/strings:string_view",
663664
]
664665
}

third_party/libwebrtc/call/video_send_stream.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "api/rtp_sender_setparameters_callback.h"
2828
#include "api/scoped_refptr.h"
2929
#include "api/units/data_rate.h"
30+
#include "api/video/encoded_image.h"
3031
#include "api/video/video_content_type.h"
3132
#include "api/video/video_frame.h"
3233
#include "api/video/video_source_interface.h"
@@ -94,6 +95,8 @@ class VideoSendStream {
9495
double encode_frame_rate = 0.0;
9596
int frames_encoded = 0;
9697
std::optional<uint64_t> qp_sum;
98+
EncodedImage::Psnr psnr_sum;
99+
uint64_t psnr_measurements = 0;
97100
uint64_t total_encode_time_ms = 0;
98101
uint64_t total_encoded_bytes_target = 0;
99102
uint32_t huge_frames_sent = 0;

third_party/libwebrtc/experiments/field_trials.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ def bug_url(self) -> str:
197197
FieldTrial('WebRTC-VP9-SvcForSimulcast',
198198
347737882,
199199
date(2024, 10, 1)),
200+
FieldTrial('WebRTC-Video-CalculatePsnr',
201+
388070060,
202+
date(2026, 1, 1)),
200203
FieldTrial('WebRTC-Video-EnableRetransmitAllLayers',
201204
42225262,
202205
date(2024, 4, 1)),

third_party/libwebrtc/media/BUILD.gn

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ rtc_source_set("media_channel") {
352352
"../api/units:data_rate",
353353
"../api/units:time_delta",
354354
"../api/units:timestamp",
355+
"../api/video:encoded_image",
355356
"../api/video:recordable_encoded_frame",
356357
"../api/video:video_frame",
357358
"../api/video:video_rtp_headers",
@@ -371,6 +372,7 @@ rtc_source_set("media_channel") {
371372
"../rtc_base/network:sent_packet",
372373
"../video/config:encoder_config",
373374
"//third_party/abseil-cpp/absl/functional:any_invocable",
375+
"//third_party/abseil-cpp/absl/strings",
374376
"//third_party/abseil-cpp/absl/strings:string_view",
375377
]
376378
}
@@ -760,8 +762,8 @@ if (rtc_build_dcsctp) {
760762
"../api:rtc_error",
761763
"../api:sequence_checker",
762764
"../api/environment",
765+
"../api/task_queue",
763766
"../api/task_queue:pending_task_safety_flag",
764-
"../api/task_queue:task_queue",
765767
"../api/transport:datagram_transport_interface",
766768
"../net/dcsctp/public:factory",
767769
"../net/dcsctp/public:socket",
@@ -770,6 +772,7 @@ if (rtc_build_dcsctp) {
770772
"../net/dcsctp/timer:task_queue_timeout",
771773
"../p2p:dtls_transport_internal",
772774
"../p2p:packet_transport_internal",
775+
"../rtc_base:async_packet_socket",
773776
"../rtc_base:checks",
774777
"../rtc_base:copy_on_write_buffer",
775778
"../rtc_base:event_tracer",
@@ -781,9 +784,9 @@ if (rtc_build_dcsctp) {
781784
"../rtc_base:threading",
782785
"../rtc_base/containers:flat_map",
783786
"../rtc_base/network:received_packet",
784-
"../rtc_base/third_party/sigslot:sigslot",
787+
"../rtc_base/third_party/sigslot",
785788
"../system_wrappers",
786-
"//third_party/abseil-cpp/absl/strings:strings",
789+
"//third_party/abseil-cpp/absl/strings",
787790
]
788791
}
789792
}

third_party/libwebrtc/media/base/media_channel.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "api/units/data_rate.h"
4444
#include "api/units/time_delta.h"
4545
#include "api/units/timestamp.h"
46+
#include "api/video/encoded_image.h"
4647
#include "api/video/recordable_encoded_frame.h"
4748
#include "api/video/video_content_type.h"
4849
#include "api/video/video_sink_interface.h"
@@ -593,8 +594,12 @@ struct VideoSenderInfo : public MediaSenderInfo {
593594

594595
uint64_t total_encoded_bytes_target = 0;
595596
bool has_entered_low_resolution = false;
597+
596598
std::optional<uint64_t> qp_sum;
597599
VideoContentType content_type = VideoContentType::UNSPECIFIED;
600+
601+
webrtc::EncodedImage::Psnr psnr_sum;
602+
uint32_t psnr_measurements = 0;
598603
uint32_t frames_sent = 0;
599604

600605
uint32_t huge_frames_sent = 0;

third_party/libwebrtc/media/engine/webrtc_video_engine.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2537,6 +2537,8 @@ WebRtcVideoSendChannel::WebRtcVideoSendStream::GetPerLayerVideoSenderInfos(
25372537
info.report_block_datas.push_back(*stream_stats.report_block_data);
25382538
}
25392539
info.qp_sum = stream_stats.qp_sum;
2540+
info.psnr_sum = stream_stats.psnr_sum;
2541+
info.psnr_measurements = stream_stats.psnr_measurements;
25402542
info.total_encode_time_ms = stream_stats.total_encode_time_ms;
25412543
info.total_encoded_bytes_target = stream_stats.total_encoded_bytes_target;
25422544
info.huge_frames_sent = stream_stats.huge_frames_sent;
@@ -2589,6 +2591,12 @@ WebRtcVideoSendChannel::WebRtcVideoSendStream::GetAggregatedVideoSenderInfo(
25892591
}
25902592
info.qp_sum = *info.qp_sum + *infos[i].qp_sum;
25912593
}
2594+
if (infos[i].psnr_measurements > 0) {
2595+
info.psnr_measurements += infos[i].psnr_measurements;
2596+
info.psnr_sum.y += infos[i].psnr_sum.y;
2597+
info.psnr_sum.u += infos[i].psnr_sum.u;
2598+
info.psnr_sum.v += infos[i].psnr_sum.v;
2599+
}
25922600
info.frames_encoded += infos[i].frames_encoded;
25932601
info.frames_sent += infos[i].frames_sent;
25942602
info.total_encode_time_ms += infos[i].total_encode_time_ms;

third_party/libwebrtc/modules/video_coding/BUILD.gn

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,18 @@ if (rtc_use_h264 && rtc_system_openh264) {
388388
}
389389
}
390390

391+
rtc_library("frame_sampler") {
392+
visibility = [ "*" ]
393+
sources = [
394+
"utility/frame_sampler.cc",
395+
"utility/frame_sampler.h",
396+
]
397+
deps = [
398+
"..:module_api_public",
399+
"../../api/video:video_frame",
400+
]
401+
}
402+
391403
rtc_library("video_coding_utility") {
392404
visibility = [ "*" ]
393405
sources = [
@@ -488,6 +500,7 @@ rtc_library("webrtc_h264") {
488500
defines = []
489501
deps = [
490502
":codec_globals_headers",
503+
":frame_sampler",
491504
":video_codec_interface",
492505
":video_coding_utility",
493506
"../../api:scoped_refptr",
@@ -514,6 +527,7 @@ rtc_library("webrtc_h264") {
514527
"../../rtc_base:timeutils",
515528
"../../rtc_base/system:rtc_export",
516529
"../../system_wrappers:metrics",
530+
"../rtp_rtcp:rtp_rtcp_format",
517531
"svc:scalability_structures",
518532
"svc:scalable_video_controller",
519533
"//third_party/abseil-cpp/absl/base:nullability",
@@ -556,6 +570,9 @@ rtc_library("mock_libvpx_interface") {
556570
":webrtc_libvpx_interface",
557571
"../../test:test_support",
558572
]
573+
if (rtc_build_libvpx) {
574+
deps += [ rtc_libvpx_dir ]
575+
}
559576
}
560577

561578
# This target includes the internal SW codec.
@@ -572,6 +589,7 @@ rtc_library("webrtc_vp8") {
572589

573590
deps = [
574591
":codec_globals_headers",
592+
":frame_sampler",
575593
":video_codec_interface",
576594
":video_coding_utility",
577595
":webrtc_libvpx_interface",
@@ -605,6 +623,7 @@ rtc_library("webrtc_vp8") {
605623
"../../rtc_base/experiments:field_trial_parser",
606624
"../../rtc_base/experiments:rate_control_settings",
607625
"../../system_wrappers:metrics",
626+
"../rtp_rtcp:rtp_rtcp_format",
608627
"svc:scalability_mode_util",
609628
"//third_party/abseil-cpp/absl/algorithm:container",
610629
"//third_party/abseil-cpp/absl/base:nullability",
@@ -698,6 +717,7 @@ rtc_library("webrtc_vp9") {
698717

699718
deps = [
700719
":codec_globals_headers",
720+
":frame_sampler",
701721
":video_codec_interface",
702722
":video_coding_utility",
703723
":webrtc_libvpx_interface",
@@ -759,7 +779,7 @@ if (rtc_include_tests) {
759779

760780
deps = [
761781
"../../api/video_codecs:video_codecs_api",
762-
"../../modules/utility:utility",
782+
"../../modules/utility",
763783
"../../rtc_base:checks",
764784
"../../sdk/android:internal_jni",
765785
"../../sdk/android:native_api_base",
@@ -866,7 +886,7 @@ if (rtc_include_tests) {
866886
"../../api:videocodec_test_stats_api",
867887
"../../api/environment",
868888
"../../api/environment:environment_factory",
869-
"../../api/numerics:numerics",
889+
"../../api/numerics",
870890
"../../api/task_queue",
871891
"../../api/task_queue:default_task_queue_factory",
872892
"../../api/test/metrics:global_metrics_logger_and_exporter",
@@ -1206,6 +1226,7 @@ if (rtc_include_tests) {
12061226
"utility/corruption_detection_settings_generator_unittest.cc",
12071227
"utility/decoded_frames_history_unittest.cc",
12081228
"utility/frame_dropper_unittest.cc",
1229+
"utility/frame_sampler_unittest.cc",
12091230
"utility/framerate_controller_deprecated_unittest.cc",
12101231
"utility/ivf_file_reader_unittest.cc",
12111232
"utility/ivf_file_writer_unittest.cc",
@@ -1230,6 +1251,7 @@ if (rtc_include_tests) {
12301251
":encoded_frame",
12311252
":frame_dependencies_calculator",
12321253
":frame_helpers",
1254+
":frame_sampler",
12331255
":h264_sprop_parameter_sets",
12341256
":h26x_packet_buffer",
12351257
":nack_requester",
@@ -1326,8 +1348,8 @@ if (rtc_include_tests) {
13261348
"../../test:test_support",
13271349
"../../test:video_test_common",
13281350
"../../test:video_test_support",
1329-
"../../test/time_controller:time_controller",
1330-
"../../third_party/libyuv:libyuv",
1351+
"../../test/time_controller",
1352+
"../../third_party/libyuv",
13311353
"../../video/config:encoder_config",
13321354
"../rtp_rtcp",
13331355
"../rtp_rtcp:rtp_rtcp_format",

third_party/libwebrtc/modules/video_coding/codecs/av1/BUILD.gn

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ rtc_library("av1_svc_config") {
3131
rtc_library("dav1d_decoder") {
3232
visibility = [ "*" ]
3333
poisonous = [ "software_video_codecs" ]
34-
public = [ "dav1d_decoder.h" ]
35-
sources = [ "dav1d_decoder.cc" ]
34+
sources = [
35+
"dav1d_decoder.cc",
36+
"dav1d_decoder.h",
37+
]
3638

3739
deps = [
3840
"../..:video_codec_interface",
@@ -52,10 +54,14 @@ rtc_library("dav1d_decoder") {
5254
rtc_library("libaom_av1_encoder") {
5355
visibility = [ "*" ]
5456
poisonous = [ "software_video_codecs" ]
55-
public = [ "libaom_av1_encoder.h" ]
56-
sources = [ "libaom_av1_encoder.cc" ]
57+
sources = [
58+
"libaom_av1_encoder.cc",
59+
"libaom_av1_encoder.h",
60+
]
5761
deps = [
5862
"../..:video_codec_interface",
63+
"../..:video_coding_utility",
64+
"../../:frame_sampler",
5965
"../../../../api:field_trials_view",
6066
"../../../../api:scoped_refptr",
6167
"../../../../api/environment",
@@ -114,7 +120,6 @@ if (rtc_include_tests) {
114120
"../../../../api/video_codecs:video_codecs_api",
115121
"../../../../rtc_base:checks",
116122
"../../../../test:create_test_field_trials",
117-
"../../../../test:explicit_key_value_config",
118123
"../../../../test:test_support",
119124
]
120125

@@ -133,7 +138,6 @@ if (rtc_include_tests) {
133138
"../../../../api/units:time_delta",
134139
"../../../../modules/rtp_rtcp:rtp_rtcp_format",
135140
"../../../../test:fileutils",
136-
"../../../../test:scoped_key_value_config",
137141
"../../../../test:video_test_support",
138142
"../../svc:scalability_mode_util",
139143
"../../svc:scalability_structures",

0 commit comments

Comments
 (0)