• 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 WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
12 #define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
13 
14 #include <vector>
15 
16 #include "webrtc/common_types.h"
17 #include "webrtc/common_video/interface/i420_video_frame.h"
18 #include "webrtc/modules/interface/module_common_types.h"
19 #include "webrtc/modules/video_coding/codecs/interface/video_error_codes.h"
20 #include "webrtc/typedefs.h"
21 #include "webrtc/video_encoder.h"
22 
23 namespace webrtc
24 {
25 
26 class RTPFragmentationHeader; // forward declaration
27 
28 // Note: if any pointers are added to this struct, it must be fitted
29 // with a copy-constructor. See below.
30 struct CodecSpecificInfoVP8 {
31   bool hasReceivedSLI;
32   uint8_t pictureIdSLI;
33   bool hasReceivedRPSI;
34   uint64_t pictureIdRPSI;
35   int16_t pictureId;  // Negative value to skip pictureId.
36   bool nonReference;
37   uint8_t simulcastIdx;
38   uint8_t temporalIdx;
39   bool layerSync;
40   int tl0PicIdx;  // Negative value to skip tl0PicIdx.
41   int8_t keyIdx;  // Negative value to skip keyIdx.
42 };
43 
44 struct CodecSpecificInfoGeneric {
45   uint8_t simulcast_idx;
46 };
47 
48 struct CodecSpecificInfoH264 {};
49 
50 union CodecSpecificInfoUnion {
51   CodecSpecificInfoGeneric generic;
52   CodecSpecificInfoVP8 VP8;
53   CodecSpecificInfoH264 H264;
54 };
55 
56 // Note: if any pointers are added to this struct or its sub-structs, it
57 // must be fitted with a copy-constructor. This is because it is copied
58 // in the copy-constructor of VCMEncodedFrame.
59 struct CodecSpecificInfo
60 {
61     VideoCodecType   codecType;
62     CodecSpecificInfoUnion codecSpecific;
63 };
64 
65 class DecodedImageCallback
66 {
67 public:
~DecodedImageCallback()68     virtual ~DecodedImageCallback() {};
69 
70     // Callback function which is called when an image has been decoded.
71     //
72     // Input:
73     //          - decodedImage         : The decoded image.
74     //
75     // Return value                    : 0 if OK, < 0 otherwise.
76     virtual int32_t Decoded(I420VideoFrame& decodedImage) = 0;
77 
ReceivedDecodedReferenceFrame(const uint64_t pictureId)78     virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {return -1;}
79 
ReceivedDecodedFrame(const uint64_t pictureId)80     virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId) {return -1;}
81 };
82 
83 class VideoDecoder
84 {
85 public:
~VideoDecoder()86     virtual ~VideoDecoder() {};
87 
88     // Initialize the decoder with the information from the VideoCodec.
89     //
90     // Input:
91     //          - inst              : Codec settings
92     //          - numberOfCores     : Number of cores available for the decoder
93     //
94     // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
95     virtual int32_t InitDecode(const VideoCodec* codecSettings, int32_t numberOfCores) = 0;
96 
97     // Decode encoded image (as a part of a video stream). The decoded image
98     // will be returned to the user through the decode complete callback.
99     //
100     // Input:
101     //          - inputImage        : Encoded image to be decoded
102     //          - missingFrames     : True if one or more frames have been lost
103     //                                since the previous decode call.
104     //          - fragmentation     : Specifies where the encoded frame can be
105     //                                split into separate fragments. The meaning
106     //                                of fragment is codec specific, but often
107     //                                means that each fragment is decodable by
108     //                                itself.
109     //          - codecSpecificInfo : Pointer to codec specific data
110     //          - renderTimeMs      : System time to render in milliseconds. Only
111     //                                used by decoders with internal rendering.
112     //
113     // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
114     virtual int32_t
115     Decode(const EncodedImage& inputImage,
116            bool missingFrames,
117            const RTPFragmentationHeader* fragmentation,
118            const CodecSpecificInfo* codecSpecificInfo = NULL,
119            int64_t renderTimeMs = -1) = 0;
120 
121     // Register an decode complete callback object.
122     //
123     // Input:
124     //          - callback         : Callback object which handles decoded images.
125     //
126     // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
127     virtual int32_t RegisterDecodeCompleteCallback(DecodedImageCallback* callback) = 0;
128 
129     // Free decoder memory.
130     //
131     // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
132     virtual int32_t Release() = 0;
133 
134     // Reset decoder state and prepare for a new call.
135     //
136     // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
137     virtual int32_t Reset() = 0;
138 
139     // Codec configuration data sent out-of-band, i.e. in SIP call setup
140     //
141     // Input/Output:
142     //          - buffer           : Buffer pointer to the configuration data
143     //          - size             : The size of the configuration data in
144     //                               bytes
145     //
146     // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
SetCodecConfigParameters(const uint8_t *,int32_t)147     virtual int32_t SetCodecConfigParameters(const uint8_t* /*buffer*/, int32_t /*size*/) { return WEBRTC_VIDEO_CODEC_ERROR; }
148 
149     // Create a copy of the codec and its internal state.
150     //
151     // Return value                : A copy of the instance if OK, NULL otherwise.
Copy()152     virtual VideoDecoder* Copy() { return NULL; }
153 };
154 
155 }  // namespace webrtc
156 
157 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
158