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