blob: 9e97ce03aa288f0225168869f7284ab025e4339d [file] [log] [blame]
/*
* Copyright (c) 2012 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 MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
#define MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
#include <stddef.h>
#include <stdint.h>
#include <optional>
#include "api/units/time_delta.h"
#include "api/video/video_content_type.h"
#include "api/video/video_frame.h"
#include "api/video/video_frame_type.h"
#include "api/video/video_timing.h"
#include "api/video_codecs/video_decoder.h"
#include "rtc_base/checks.h"
namespace webrtc {
// Error codes
#define VCM_FRAME_NOT_READY 3
#define VCM_MISSING_CALLBACK 1
#define VCM_OK 0
#define VCM_GENERAL_ERROR -1
#define VCM_PARAMETER_ERROR -4
#define VCM_NO_CODEC_REGISTERED -8
#define VCM_JITTER_BUFFER_ERROR -9
enum {
// Timing frames settings. Timing frames are sent every
// `kDefaultTimingFramesDelayMs`, or if the frame is at least
// `kDefaultOutlierFrameSizePercent` in size of average frame.
kDefaultTimingFramesDelayMs = 200,
kDefaultOutlierFrameSizePercent = 500,
// Maximum number of frames for what we store encode start timing information.
kMaxEncodeStartTimeListSize = 150,
};
enum VCMVideoProtection {
kProtectionNack,
kProtectionNackFEC,
};
// Callback class used for passing decoded frames which are ready to be
// rendered.
class VCMReceiveCallback {
public:
struct FrameToRender {
VideoFrame& video_frame;
std::optional<uint8_t> qp;
TimeDelta decode_time;
VideoContentType content_type;
VideoFrameType frame_type;
std::optional<double> corruption_score;
};
// TODO: bugs.webrtc.org/358039777 - Delete this function.
virtual int32_t FrameToRender(VideoFrame& /* videoFrame */, // NOLINT
std::optional<uint8_t> /* qp */,
TimeDelta /* decode_time */,
VideoContentType /* content_type */,
VideoFrameType /* frame_type */) {
RTC_CHECK_NOTREACHED();
return 0;
}
// TODO: bugs.webrtc.org/358039777 - Make this pure virtual.
virtual int32_t OnFrameToRender(const struct FrameToRender& arguments) {
return FrameToRender(arguments.video_frame, arguments.qp,
arguments.decode_time, arguments.content_type,
arguments.frame_type);
}
virtual void OnDroppedFrames(uint32_t frames_dropped);
// Called when the current receive codec changes.
virtual void OnIncomingPayloadType(int payload_type);
virtual void OnDecoderInfoChanged(
const VideoDecoder::DecoderInfo& decoder_info);
protected:
virtual ~VCMReceiveCallback() {}
};
// Callback class used for telling the user about what frame type needed to
// continue decoding.
// Typically a key frame when the stream has been corrupted in some way.
class VCMFrameTypeCallback {
public:
virtual int32_t RequestKeyFrame() = 0;
protected:
virtual ~VCMFrameTypeCallback() {}
};
// Callback class used for telling the user about which packet sequence numbers
// are currently
// missing and need to be resent.
// TODO(philipel): Deprecate VCMPacketRequestCallback
// and use NackSender instead.
class VCMPacketRequestCallback {
public:
virtual int32_t ResendPackets(const uint16_t* sequenceNumbers,
uint16_t length) = 0;
protected:
virtual ~VCMPacketRequestCallback() {}
};
} // namespace webrtc
#endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_