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}
71 lines
2.8 KiB
C++
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
|