/* * 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 GetAsI420Buffer( const scoped_refptr 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 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