1 /* 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 11 #ifndef MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 12 #define MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 13 14 #include "api/field_trials_view.h" 15 #include "api/video/video_frame.h" 16 #include "api/video_codecs/video_decoder.h" 17 #include "modules/rtp_rtcp/source/rtp_video_header.h" 18 #include "modules/video_coding/include/video_coding_defines.h" 19 20 namespace webrtc { 21 22 class Clock; 23 class EncodedImageCallback; 24 class VideoDecoder; 25 class VideoEncoder; 26 struct CodecSpecificInfo; 27 28 class VideoCodingModule { 29 public: 30 // DEPRECATED. 31 static VideoCodingModule* Create( 32 Clock* clock, 33 const FieldTrialsView* field_trials = nullptr); 34 35 virtual ~VideoCodingModule() = default; 36 37 /* 38 * Receiver 39 */ 40 41 // Register possible receive codecs, can be called multiple times for 42 // different codecs. 43 // The module will automatically switch between registered codecs depending on 44 // the 45 // payload type of incoming frames. The actual decoder will be created when 46 // needed. 47 // 48 // Input: 49 // - payload_type : RTP payload type 50 // - settings : Settings for the decoder to be registered. 51 // 52 virtual void RegisterReceiveCodec(uint8_t payload_type, 53 const VideoDecoder::Settings& settings) = 0; 54 55 // Register an external decoder object. 56 // 57 // Input: 58 // - externalDecoder : Decoder object to be used for decoding frames. 59 // - payloadType : The payload type which this decoder is bound to. 60 virtual void RegisterExternalDecoder(VideoDecoder* externalDecoder, 61 uint8_t payloadType) = 0; 62 63 // Register a receive callback. Will be called whenever there is a new frame 64 // ready 65 // for rendering. 66 // 67 // Input: 68 // - receiveCallback : The callback object to be used by the 69 // module when a 70 // frame is ready for rendering. 71 // De-register with a NULL pointer. 72 // 73 // Return value : VCM_OK, on success. 74 // < 0, on error. 75 virtual int32_t RegisterReceiveCallback( 76 VCMReceiveCallback* receiveCallback) = 0; 77 78 // Register a frame type request callback. This callback will be called when 79 // the 80 // module needs to request specific frame types from the send side. 81 // 82 // Input: 83 // - frameTypeCallback : The callback object to be used by the 84 // module when 85 // requesting a specific type of frame from 86 // the send side. 87 // De-register with a NULL pointer. 88 // 89 // Return value : VCM_OK, on success. 90 // < 0, on error. 91 virtual int32_t RegisterFrameTypeCallback( 92 VCMFrameTypeCallback* frameTypeCallback) = 0; 93 94 // Registers a callback which is called whenever the receive side of the VCM 95 // encounters holes in the packet sequence and needs packets to be 96 // retransmitted. 97 // 98 // Input: 99 // - callback : The callback to be registered in the VCM. 100 // 101 // Return value : VCM_OK, on success. 102 // <0, on error. 103 virtual int32_t RegisterPacketRequestCallback( 104 VCMPacketRequestCallback* callback) = 0; 105 106 // Waits for the next frame in the jitter buffer to become complete 107 // (waits no longer than maxWaitTimeMs), then passes it to the decoder for 108 // decoding. 109 // Should be called as often as possible to get the most out of the decoder. 110 // 111 // Return value : VCM_OK, on success. 112 // < 0, on error. 113 virtual int32_t Decode(uint16_t maxWaitTimeMs = 200) = 0; 114 115 // Insert a parsed packet into the receiver side of the module. Will be placed 116 // in the 117 // jitter buffer waiting for the frame to become complete. Returns as soon as 118 // the packet 119 // has been placed in the jitter buffer. 120 // 121 // Input: 122 // - incomingPayload : Payload of the packet. 123 // - payloadLength : Length of the payload. 124 // - rtp_header : The parsed RTP header. 125 // - video_header : The relevant extensions and payload header. 126 // 127 // Return value : VCM_OK, on success. 128 // < 0, on error. 129 virtual int32_t IncomingPacket(const uint8_t* incomingPayload, 130 size_t payloadLength, 131 const RTPHeader& rtp_header, 132 const RTPVideoHeader& video_header) = 0; 133 134 // Sets the maximum number of sequence numbers that we are allowed to NACK 135 // and the oldest sequence number that we will consider to NACK. If a 136 // sequence number older than `max_packet_age_to_nack` is missing 137 // a key frame will be requested. A key frame will also be requested if the 138 // time of incomplete or non-continuous frames in the jitter buffer is above 139 // `max_incomplete_time_ms`. 140 virtual void SetNackSettings(size_t max_nack_list_size, 141 int max_packet_age_to_nack, 142 int max_incomplete_time_ms) = 0; 143 144 // Runs delayed tasks. Expected to be called periodically. 145 virtual void Process() = 0; 146 }; 147 148 } // namespace webrtc 149 150 #endif // MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_ 151