blob: 8ea5725a1c480ca139b8af531b503d345f25e5ac [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.
43 kMaxEncodeStartTimeListSize = 50,
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
Niels Möllerbe682d42018-03-27 08:31:45 +020070 virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId);
Henrik Kjellander2557b862015-11-18 22:00:21 +010071 // Called when the current receive codec changes.
Niels Möllerbe682d42018-03-27 08:31:45 +020072 virtual void OnIncomingPayloadType(int payload_type);
73 virtual void OnDecoderImplementationName(const char* implementation_name);
Henrik Kjellander2557b862015-11-18 22:00:21 +010074
75 protected:
philipel9d3ab612015-12-21 04:12:39 -080076 virtual ~VCMReceiveCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010077};
78
philipel9d3ab612015-12-21 04:12:39 -080079// Callback class used for informing the user of the incoming bit rate and frame
80// rate.
Henrik Kjellander2557b862015-11-18 22:00:21 +010081class VCMReceiveStatisticsCallback {
82 public:
ilnik6d5b4d62017-08-30 03:32:14 -070083 virtual void OnCompleteFrame(bool is_keyframe,
84 size_t size_bytes,
85 VideoContentType content_type) = 0;
Niels Möllerdd41da62019-03-28 08:59:07 +010086
philipela45102f2017-02-22 05:30:39 -080087 virtual void OnFrameBufferTimingsUpdated(int decode_ms,
88 int max_decode_ms,
89 int current_delay_ms,
90 int target_delay_ms,
91 int jitter_buffer_ms,
92 int min_playout_delay_ms,
93 int render_delay_ms) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +010094
ilnik2edc6842017-07-06 03:06:50 -070095 virtual void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) = 0;
96
Henrik Kjellander2557b862015-11-18 22:00:21 +010097 protected:
philipel9d3ab612015-12-21 04:12:39 -080098 virtual ~VCMReceiveStatisticsCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010099};
100
philipel9d3ab612015-12-21 04:12:39 -0800101// Callback class used for telling the user about what frame type needed to
102// continue decoding.
Henrik Kjellander2557b862015-11-18 22:00:21 +0100103// Typically a key frame when the stream has been corrupted in some way.
104class VCMFrameTypeCallback {
105 public:
106 virtual int32_t RequestKeyFrame() = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +0100107
108 protected:
philipel9d3ab612015-12-21 04:12:39 -0800109 virtual ~VCMFrameTypeCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +0100110};
111
philipel9d3ab612015-12-21 04:12:39 -0800112// Callback class used for telling the user about which packet sequence numbers
113// are currently
Henrik Kjellander2557b862015-11-18 22:00:21 +0100114// missing and need to be resent.
philipel5ab4c6d2016-03-08 03:36:15 -0800115// TODO(philipel): Deprecate VCMPacketRequestCallback
116// and use NackSender instead.
Henrik Kjellander2557b862015-11-18 22:00:21 +0100117class VCMPacketRequestCallback {
118 public:
119 virtual int32_t ResendPackets(const uint16_t* sequenceNumbers,
philipel9d3ab612015-12-21 04:12:39 -0800120 uint16_t length) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +0100121
122 protected:
philipel9d3ab612015-12-21 04:12:39 -0800123 virtual ~VCMPacketRequestCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +0100124};
125
Henrik Kjellander2557b862015-11-18 22:00:21 +0100126} // namespace webrtc
127
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200128#endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_