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