blob: b7857343a1a02d3d65ff0b1655dde06c7e7ab2ac [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
Henrik Kjellander2557b862015-11-18 22:00:21 +010030#define VCM_NO_CODEC_REGISTERED -8
31#define VCM_JITTER_BUFFER_ERROR -9
Henrik Kjellander2557b862015-11-18 22:00:21 +010032
ilnik04f4d122017-06-19 07:18:55 -070033enum {
ilnik04f4d122017-06-19 07:18:55 -070034 // Timing frames settings. Timing frames are sent every
35 // |kDefaultTimingFramesDelayMs|, or if the frame is at least
36 // |kDefaultOutliserFrameSizePercent| in size of average frame.
37 kDefaultTimingFramesDelayMs = 200,
Ilya Nikolaevskiy82c07ea2018-11-06 12:54:30 +010038 kDefaultOutlierFrameSizePercent = 500,
Ilya Nikolaevskiyd79314f2017-10-23 10:45:37 +020039 // Maximum number of frames for what we store encode start timing information.
Ilya Nikolaevskiy1ced8892019-04-24 12:41:16 +020040 kMaxEncodeStartTimeListSize = 150,
ilnik04f4d122017-06-19 07:18:55 -070041};
Henrik Kjellander2557b862015-11-18 22:00:21 +010042
43enum VCMVideoProtection {
44 kProtectionNone,
45 kProtectionNack,
46 kProtectionFEC,
47 kProtectionNackFEC,
48};
49
philipel9d3ab612015-12-21 04:12:39 -080050// Callback class used for passing decoded frames which are ready to be
51// rendered.
Henrik Kjellander2557b862015-11-18 22:00:21 +010052class VCMReceiveCallback {
53 public:
sakalcc452e12017-02-09 04:53:45 -080054 virtual int32_t FrameToRender(VideoFrame& videoFrame, // NOLINT
Danil Chapovalov0040b662018-06-18 10:48:16 +020055 absl::optional<uint8_t> qp,
ilnik6d5b4d62017-08-30 03:32:14 -070056 VideoContentType content_type) = 0;
ilnikfc0acc42017-05-08 02:59:38 -070057
Henrik Kjellander2557b862015-11-18 22:00:21 +010058 // Called when the current receive codec changes.
Niels Möllerbe682d42018-03-27 08:31:45 +020059 virtual void OnIncomingPayloadType(int payload_type);
60 virtual void OnDecoderImplementationName(const char* implementation_name);
Henrik Kjellander2557b862015-11-18 22:00:21 +010061
62 protected:
philipel9d3ab612015-12-21 04:12:39 -080063 virtual ~VCMReceiveCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010064};
65
philipel9d3ab612015-12-21 04:12:39 -080066// Callback class used for informing the user of the incoming bit rate and frame
67// rate.
Henrik Kjellander2557b862015-11-18 22:00:21 +010068class VCMReceiveStatisticsCallback {
69 public:
ilnik6d5b4d62017-08-30 03:32:14 -070070 virtual void OnCompleteFrame(bool is_keyframe,
71 size_t size_bytes,
72 VideoContentType content_type) = 0;
Niels Möllerdd41da62019-03-28 08:59:07 +010073
philipela45102f2017-02-22 05:30:39 -080074 virtual void OnFrameBufferTimingsUpdated(int decode_ms,
75 int max_decode_ms,
76 int current_delay_ms,
77 int target_delay_ms,
78 int jitter_buffer_ms,
79 int min_playout_delay_ms,
80 int render_delay_ms) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +010081
ilnik2edc6842017-07-06 03:06:50 -070082 virtual void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) = 0;
83
Henrik Kjellander2557b862015-11-18 22:00:21 +010084 protected:
philipel9d3ab612015-12-21 04:12:39 -080085 virtual ~VCMReceiveStatisticsCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010086};
87
philipel9d3ab612015-12-21 04:12:39 -080088// Callback class used for telling the user about what frame type needed to
89// continue decoding.
Henrik Kjellander2557b862015-11-18 22:00:21 +010090// Typically a key frame when the stream has been corrupted in some way.
91class VCMFrameTypeCallback {
92 public:
93 virtual int32_t RequestKeyFrame() = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +010094
95 protected:
philipel9d3ab612015-12-21 04:12:39 -080096 virtual ~VCMFrameTypeCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +010097};
98
philipel9d3ab612015-12-21 04:12:39 -080099// Callback class used for telling the user about which packet sequence numbers
100// are currently
Henrik Kjellander2557b862015-11-18 22:00:21 +0100101// missing and need to be resent.
philipel5ab4c6d2016-03-08 03:36:15 -0800102// TODO(philipel): Deprecate VCMPacketRequestCallback
103// and use NackSender instead.
Henrik Kjellander2557b862015-11-18 22:00:21 +0100104class VCMPacketRequestCallback {
105 public:
106 virtual int32_t ResendPackets(const uint16_t* sequenceNumbers,
philipel9d3ab612015-12-21 04:12:39 -0800107 uint16_t length) = 0;
Henrik Kjellander2557b862015-11-18 22:00:21 +0100108
109 protected:
philipel9d3ab612015-12-21 04:12:39 -0800110 virtual ~VCMPacketRequestCallback() {}
Henrik Kjellander2557b862015-11-18 22:00:21 +0100111};
112
Henrik Kjellander2557b862015-11-18 22:00:21 +0100113} // namespace webrtc
114
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200115#endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_