blob: a3c39ae18b25b15581e76dcc8264b55af57da58a [file]
/*
* Copyright 2025 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.
*/
#ifndef VIDEO_CORRUPTION_DETECTION_EVALUATION_WEBRTC_PICTURE_PAIR_PROVIDER_H_
#define VIDEO_CORRUPTION_DETECTION_EVALUATION_WEBRTC_PICTURE_PAIR_PROVIDER_H_
#include <cstdint>
#include <memory>
#include <optional>
#include "api/environment/environment.h"
#include "api/sequence_checker.h"
#include "api/units/data_rate.h"
#include "api/video/encoded_image.h"
#include "api/video/video_codec_type.h"
#include "api/video/video_frame.h"
#include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_decoder.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "rtc_base/system/no_unique_address.h"
#include "rtc_base/thread_annotations.h"
#include "test/testsupport/frame_reader.h"
#include "video/corruption_detection/evaluation/picture_pair_provider.h"
#include "video/corruption_detection/evaluation/test_clip.h"
namespace webrtc {
// Provides a picture pair where one of the pairs is the original raw frame and
// the other pair is the corresponding compressed frame that has gone through an
// encoding/decoding pipeline as implemented in this class. The compressed frame
// is obtained through the standard VideoEncoder and VideoDecoder instances.
//
// This particular class is meant to only be used with the built-in software
// encoders/decoders which are all synchronous implementations. Hence, only
// works for synchronous encoders/decoders. If the class is to be expanded to
// include asynchronous encoders/decoders, see the guidance in the .cc file.
class WebRtcEncoderDecoderPicturePairProvider : public PicturePairProvider,
public EncodedImageCallback,
public DecodedImageCallback {
public:
WebRtcEncoderDecoderPicturePairProvider(
VideoCodecType type,
std::unique_ptr<VideoEncoderFactory> encoder_factory,
std::unique_ptr<VideoDecoderFactory> decoder_factory);
~WebRtcEncoderDecoderPicturePairProvider() override;
bool Configure(const TestClip& clip, DataRate bitrate) override;
std::optional<OriginalCompressedPicturePair> GetNextPicturePair() override;
private:
bool ConfigureEncoderSettings(const TestClip& clip, DataRate bitrate);
bool InitializeEncoder();
void SetEncoderRate(const TestClip& clip, DataRate bitrate);
bool InitializeDecoder();
bool InitializeFrameGenerator(const TestClip& clip);
// Callback methods
// Overridden from EncodedImageCallback.
Result OnEncodedImage(const EncodedImage& encoded_image,
const CodecSpecificInfo*) override;
void OnFrameDropped(uint32_t rtp_timestamp,
int spatial_id,
bool is_end_of_temporal_unit) override;
// Overridden from DecodedImageCallback.
int32_t Decoded(VideoFrame& decoded_image) override;
// Variables
const Environment env_;
const VideoCodecType type_;
// Because of how `BuiltinVideoEncoderFactory` is constructed, this class
// needs to take ownership of the encoder factory.
const std::unique_ptr<VideoEncoderFactory> encoder_factory_;
const std::unique_ptr<VideoEncoder> encoder_;
const std::unique_ptr<VideoDecoder> decoder_;
RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_;
std::optional<EncodedImage> encoded_image_ RTC_GUARDED_BY(sequence_checker_);
std::optional<VideoFrame> decoded_image_ RTC_GUARDED_BY(sequence_checker_);
std::optional<uint8_t> qp_ RTC_GUARDED_BY(sequence_checker_);
bool is_initialized_ = false;
VideoCodec codec_config_;
bool is_keyframe_ RTC_GUARDED_BY(sequence_checker_) = true;
uint32_t rtp_timestamp_ RTC_GUARDED_BY(sequence_checker_) = 0;
uint32_t rtp_timestamp_interval_ RTC_GUARDED_BY(sequence_checker_) = 0;
std::unique_ptr<test::FrameReader> frame_generator_;
};
} // namespace webrtc
#endif // VIDEO_CORRUPTION_DETECTION_EVALUATION_WEBRTC_PICTURE_PAIR_PROVIDER_H_