1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <vector>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/common_types.h"
17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/common_video/interface/i420_video_frame.h"
18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h"
19a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_error_codes.h"
20a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/typedefs.h"
211c655450cf12d21bfa5b2ff277f337335149186apbos@webrtc.org#include "webrtc/video_encoder.h"
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RTPFragmentationHeader; // forward declaration
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Note: if any pointers are added to this struct, it must be fitted
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// with a copy-constructor. See below.
30e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.orgstruct CodecSpecificInfoVP8 {
31e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  bool hasReceivedSLI;
32e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  uint8_t pictureIdSLI;
33e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  bool hasReceivedRPSI;
34e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  uint64_t pictureIdRPSI;
35e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  int16_t pictureId;  // Negative value to skip pictureId.
36e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  bool nonReference;
37e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  uint8_t simulcastIdx;
38e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  uint8_t temporalIdx;
39e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  bool layerSync;
40e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  int tl0PicIdx;  // Negative value to skip tl0PicIdx.
41e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  int8_t keyIdx;  // Negative value to skip keyIdx.
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44618a0ec1d2c17d485b7ce51cbfd282e6bae8e019pbos@webrtc.orgstruct CodecSpecificInfoGeneric {
45618a0ec1d2c17d485b7ce51cbfd282e6bae8e019pbos@webrtc.org  uint8_t simulcast_idx;
46618a0ec1d2c17d485b7ce51cbfd282e6bae8e019pbos@webrtc.org};
47618a0ec1d2c17d485b7ce51cbfd282e6bae8e019pbos@webrtc.org
48e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.orgstruct CodecSpecificInfoH264 {};
49e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org
50e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.orgunion CodecSpecificInfoUnion {
51e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  CodecSpecificInfoGeneric generic;
52e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  CodecSpecificInfoVP8 VP8;
53e75b34844a4e9998475ab557001ce0cfa1fe458fstefan@webrtc.org  CodecSpecificInfoH264 H264;
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Note: if any pointers are added to this struct or its sub-structs, it
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// must be fitted with a copy-constructor. This is because it is copied
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// in the copy-constructor of VCMEncodedFrame.
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct CodecSpecificInfo
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCodecType   codecType;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CodecSpecificInfoUnion codecSpecific;
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass DecodedImageCallback
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~DecodedImageCallback() {};
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Callback function which is called when an image has been decoded.
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Input:
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - decodedImage         : The decoded image.
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                    : 0 if OK, < 0 otherwise.
7648c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t Decoded(I420VideoFrame& decodedImage) = 0;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
7848c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {return -1;}
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
8048c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId) {return -1;}
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoDecoder
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual ~VideoDecoder() {};
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Initialize the decoder with the information from the VideoCodec.
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Input:
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - inst              : Codec settings
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - numberOfCores     : Number of cores available for the decoder
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
9548c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t InitDecode(const VideoCodec* codecSettings, int32_t numberOfCores) = 0;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Decode encoded image (as a part of a video stream). The decoded image
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // will be returned to the user through the decode complete callback.
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Input:
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - inputImage        : Encoded image to be decoded
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - missingFrames     : True if one or more frames have been lost
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                since the previous decode call.
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - fragmentation     : Specifies where the encoded frame can be
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                split into separate fragments. The meaning
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                of fragment is codec specific, but often
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                means that each fragment is decodable by
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                itself.
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - codecSpecificInfo : Pointer to codec specific data
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - renderTimeMs      : System time to render in milliseconds. Only
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                                used by decoders with internal rendering.
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
11448c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    Decode(const EncodedImage& inputImage,
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           bool missingFrames,
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           const RTPFragmentationHeader* fragmentation,
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org           const CodecSpecificInfo* codecSpecificInfo = NULL,
11948c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org           int64_t renderTimeMs = -1) = 0;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Register an decode complete callback object.
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Input:
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - callback         : Callback object which handles decoded images.
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
12748c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t RegisterDecodeCompleteCallback(DecodedImageCallback* callback) = 0;
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Free decoder memory.
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
13248c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t Release() = 0;
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Reset decoder state and prepare for a new call.
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
13748c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t Reset() = 0;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Codec configuration data sent out-of-band, i.e. in SIP call setup
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Input/Output:
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - buffer           : Buffer pointer to the configuration data
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //          - size             : The size of the configuration data in
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //                               bytes
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
14748c4b75e8d0d02294460e357ddb3a07ce295b964pbos@webrtc.org    virtual int32_t SetCodecConfigParameters(const uint8_t* /*buffer*/, int32_t /*size*/) { return WEBRTC_VIDEO_CODEC_ERROR; }
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Create a copy of the codec and its internal state.
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    //
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Return value                : A copy of the instance if OK, NULL otherwise.
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    virtual VideoDecoder* Copy() { return NULL; }
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1553b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H
158