blob: 24ffe393f6eef668f4a0f1465bc21a3943c3eb04 [file] [log] [blame]
Henrik Kjellander2557b862015-11-18 22:00:21 +01001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
12#define MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
Henrik Kjellander2557b862015-11-18 22:00:21 +010013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stddef.h>
15#include <stdint.h>
philipel5ab4c6d2016-03-08 03:36:15 -080016
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "absl/types/optional.h"
18#include "api/video/video_content_type.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "api/video/video_frame.h"
Yves Gerey3e707812018-11-28 16:47:49 +010020#include "api/video/video_timing.h"
Henrik Kjellander2557b862015-11-18 22:00:21 +010021
22namespace webrtc {
23
24// Error codes
philipel9d3ab612015-12-21 04:12:39 -080025#define VCM_FRAME_NOT_READY 3
philipel9d3ab612015-12-21 04:12:39 -080026#define VCM_MISSING_CALLBACK 1
27#define VCM_OK 0
28#define VCM_GENERAL_ERROR -1
philipel9d3ab612015-12-21 04:12:39 -080029#define VCM_PARAMETER_ERROR -4
philipel9d3ab612015-12-21 04:12:39 -080030#define VCM_CODEC_ERROR -6
31#define VCM_UNINITIALIZED -7
Henrik Kjellander2557b862015-11-18 22:00:21 +010032#define VCM_NO_CODEC_REGISTERED -8
33#define VCM_JITTER_BUFFER_ERROR -9
philipel9d3ab612015-12-21 04:12:39 -080034#define VCM_OLD_PACKET_ERROR -10
Henrik Kjellander2557b862015-11-18 22:00:21 +010035
ilnik04f4d122017-06-19 07:18:55 -070036enum {
ilnik04f4d122017-06-19 07:18:55 -070037 // Timing frames settings. Timing frames are sent every
38 // |kDefaultTimingFramesDelayMs|, or if the frame is at least
39 // |kDefaultOutliserFrameSizePercent| in size of average frame.
40 kDefaultTimingFramesDelayMs = 200,
Ilya Nikolaevskiy82c07ea2018-11-06 12:54:30 +010041 kDefaultOutlierFrameSizePercent = 500,
Ilya Nikolaevskiyd79314f2017-10-23 10:45:37 +020042 // Maximum number of frames for what we store encode start timing information.
Ilya Nikolaevskiy1ced8892019-04-24 12:41:16 +020043 kMaxEncodeStartTimeListSize = 150,
ilnik04f4d122017-06-19 07:18:55 -070044};
Henrik Kjellander2557b862015-11-18 22:00:21 +010045
46enum VCMVideoProtection {
47 kProtectionNone,
48 kProtectionNack,
49 kProtectionFEC,
50 kProtectionNackFEC,
51};
52
53enum VCMTemporalDecimation {
54 kBitrateOverUseDecimation,
55};
56
57struct VCMFrameCount {
58 uint32_t numKeyFrames;
59 uint32_t numDeltaFrames;
60};
61
philipel9d3ab612015-12-21 04:12:39 -080062// Callback class used for passing decoded frames which are ready to be
63// rendered.
Henrik Kjellander2557b862015-11-18 22:00:21 +010064class VCMReceiveCallback {
65 public:
sakalcc452e12017-02-09 04:53:45 -080066 virtual int32_t FrameToRender(VideoFrame& videoFrame, // NOLINT
Danil Chapovalov0040b662018-06-18 10:48:16 +020067 absl::optional<uint8_t> qp,
ilnik6d5b4d62017-08-30 03:32:14 -070068 VideoContentType content_type) = 0;
ilnikfc0acc42017-05-08 02:59:38 -070069
Henrik Kjellander2557b862015-11-18 22:00:21 +010070 // Called when the current receive codec changes.
Niels Möllerbe682d42018-03-27 08:31:45 +020071 virtual void OnIncomingPayloadType(int payload_type);
72 virtual void OnDecoderImplementationName(const char* implementation_name);
Henrik Kjellander2557b862015-11-18 22:00:21 +010073
74 protected:
philipel9d3ab612015-12-21 04:12:39 -080075 virtual ~VCMReceiveCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010076};
77
philipel9d3ab612015-12-21 04:12:39 -080078// Callback class used for informing the user of the incoming bit rate and frame
79// rate.
Henrik Kjellander2557b862015-11-18 22:00:21 +010080class VCMReceiveStatisticsCallback {
81 public:
ilnik6d5b4d62017-08-30 03:32:14 -070082 virtual void OnCompleteFrame(bool is_keyframe,
83 size_t size_bytes,
84 VideoContentType content_type) = 0;
Niels Möllerdd41da62019-03-28 08:59:07 +010085
philipela45102f2017-02-22 05:30:39 -080086 virtual void OnFrameBufferTimingsUpdated(int decode_ms,
87 int max_decode_ms,
88 int current_delay_ms,
89 int target_delay_ms,
90 int jitter_buffer_ms,
91 int min_playout_delay_ms,
92 int render_delay_ms) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +010093
ilnik2edc6842017-07-06 03:06:50 -070094 virtual void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) = 0;
95
Henrik Kjellander2557b862015-11-18 22:00:21 +010096 protected:
philipel9d3ab612015-12-21 04:12:39 -080097 virtual ~VCMReceiveStatisticsCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010098};
99
philipel9d3ab612015-12-21 04:12:39 -0800100// Callback class used for telling the user about what frame type needed to
101// continue decoding.
Henrik Kjellander2557b862015-11-18 22:00:21 +0100102// Typically a key frame when the stream has been corrupted in some way.
103class VCMFrameTypeCallback {
104 public:
105 virtual int32_t RequestKeyFrame() = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +0100106
107 protected:
philipel9d3ab612015-12-21 04:12:39 -0800108 virtual ~VCMFrameTypeCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +0100109};
110
philipel9d3ab612015-12-21 04:12:39 -0800111// Callback class used for telling the user about which packet sequence numbers
112// are currently
Henrik Kjellander2557b862015-11-18 22:00:21 +0100113// missing and need to be resent.
philipel5ab4c6d2016-03-08 03:36:15 -0800114// TODO(philipel): Deprecate VCMPacketRequestCallback
115// and use NackSender instead.
Henrik Kjellander2557b862015-11-18 22:00:21 +0100116class VCMPacketRequestCallback {
117 public:
118 virtual int32_t ResendPackets(const uint16_t* sequenceNumbers,
philipel9d3ab612015-12-21 04:12:39 -0800119 uint16_t length) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +0100120
121 protected:
philipel9d3ab612015-12-21 04:12:39 -0800122 virtual ~VCMPacketRequestCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +0100123};
124
Henrik Kjellander2557b862015-11-18 22:00:21 +0100125} // namespace webrtc
126
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200127#endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_