Emil Vardar 346cf7c4e5 Add support for frame pair corruption score calculation.
With this changes users can calculate the corruption score on two frames e.g. in test scenarios where one has access to the input and output file.

Bug: webrtc:358039777
Change-Id: Id864010115aa040284ec09b42d0279ccb45960b9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364161
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Fanny Linderborg <linderborg@webrtc.org>
Commit-Queue: Emil Vardar (xWF) <vardar@google.com>
Cr-Commit-Position: refs/heads/main@{#43222}
2024-10-11 09:28:56 +00:00

71 lines
2.8 KiB
C++

/*
* Copyright 2024 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.
*/
#include "video/corruption_detection/utils.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "api/video/i420_buffer.h"
#include "api/video/video_codec_type.h"
#include "api/video/video_frame_buffer.h"
namespace webrtc {
namespace {
constexpr char kPayloadNameVp8[] = "VP8";
constexpr char kPayloadNameVp9[] = "VP9";
constexpr char kPayloadNameAv1[] = "AV1";
constexpr char kPayloadNameH264[] = "H264";
constexpr char kPayloadNameH265[] = "H265";
constexpr char kPayloadNameGeneric[] = "Generic";
} // namespace
// Returns the `VideoCodecType` corresponding to the given `codec_name`.
// The `codec_name` does not need to "exactly" match the namings
// `kPayloadNameXXX`. For example, "VP8", "vp8" and "libvxp_vp8" are all
// valid, and will return the `kVideoCodecVP8`.
// I.e. it does the best to match a codec name to a `VideoCodecType`.
VideoCodecType GetVideoCodecType(absl::string_view codec_name) {
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameVp8))
return kVideoCodecVP8;
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameVp9))
return kVideoCodecVP9;
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameAv1))
return kVideoCodecAV1;
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameH264))
return kVideoCodecH264;
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameH265))
return kVideoCodecH265;
if (absl::StrContainsIgnoreCase(codec_name, kPayloadNameGeneric))
return kVideoCodecGeneric;
RTC_FATAL() << "Codec name " << codec_name << " is not supported.";
}
// Creates a new buffer and copies the pixel data. While the copying is done,
// the type of the buffer is changed from `I420BufferInterface` to `I420Buffer`.
// Observe also that the padding bytes are removed.
scoped_refptr<I420Buffer> GetAsI420Buffer(
const scoped_refptr<I420BufferInterface> i420_buffer_interface) {
// Note: `I420Buffer::Copy` removes padding bytes.
// I.e. if the input is to the left the output will be as to the right.
// +------+--+ +------+
// | | | | |
// | Y |P | --> | Y |
// | | | | |
// +------+--+ +------+
scoped_refptr<I420Buffer> frame_as_i420_buffer =
I420Buffer::Copy(*i420_buffer_interface);
RTC_DCHECK_EQ(frame_as_i420_buffer->StrideY(), frame_as_i420_buffer->width());
return frame_as_i420_buffer;
}
} // namespace webrtc