blob: b213dfb50970ee4ecf1c6ea31dccbcb584597221 [file] [log] [blame]
/*
* 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