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_GENERIC_DECODER_H_ 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_ 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/interface/module_common_types.h" 15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h" 16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/encoded_frame.h" 17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/timestamp_map.h" 18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/source/timing.h" 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMReceiveCallback; 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgenum { kDecoderFrameMemoryLength = 10 }; 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VCMFrameInformation 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 29dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int64_t renderTimeMs; 30dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int64_t decodeStartTimeMs; 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void* userData; 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMDecodedFrameCallback : public DecodedImageCallback 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 371bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org VCMDecodedFrameCallback(VCMTiming& timing, Clock* clock); 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~VCMDecodedFrameCallback(); 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback); 40d893b3fbd858898bd280f94a74854a86a6b91888wuchengli@chromium.org VCMReceiveCallback* UserReceiveCallback(); 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 42dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org virtual int32_t Decoded(I420VideoFrame& decodedImage); 43dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId); 44dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org uint64_t LastReceivedPictureID() const; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t Map(uint32_t timestamp, VCMFrameInformation* frameInfo); 49dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t Pop(uint32_t timestamp); 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate: 523b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org // Protect |_receiveCallback| and |_timestampMap|. 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org CriticalSectionWrapper* _critSect; 541bb2146351979b6610107419b2a9c86cca2692a3stefan@webrtc.org Clock* _clock; 553b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org VCMReceiveCallback* _receiveCallback; // Guarded by |_critSect|. 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMTiming& _timing; 573b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org VCMTimestampMap _timestampMap; // Guarded by |_critSect|. 58dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org uint64_t _lastReceivedPictureID; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VCMGenericDecoder 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org friend class VCMCodecDataBase; 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 668edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org VCMGenericDecoder(VideoDecoder& decoder, bool isExternal = false); 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ~VCMGenericDecoder(); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /** 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Initialize the decoder with the information from the VideoCodec 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 72dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t InitDecode(const VideoCodec* settings, 73e2e033adc5f58b3ffe6c3c7e67b245ee66e1a607mikhal@webrtc.org int32_t numberOfCores); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /** 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Decode to a raw I420 frame, 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * inputVideoBuffer reference to encoded video frame 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 80dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t Decode(const VCMEncodedFrame& inputFrame, int64_t nowMs); 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /** 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Free the decoder memory 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 85dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t Release(); 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /** 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Reset the decoder state, prepare for a new call 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 90dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t Reset(); 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /** 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Codec configuration data sent out-of-band, i.e. in SIP call setup 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * buffer pointer to the configuration data 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * size the size of the configuration data in bytes 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 98dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t SetCodecConfigParameters(const uint8_t* /*buffer*/, 99dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t /*size*/); 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1013b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org /** 1023b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org * Set decode callback. Deregistering while decoding is illegal. 1033b35ec630eb4064c4e0333fa975e0607161f5814fischman@webrtc.org */ 104dba5f4541529da6ce75cc634834a9197e610731bpbos@webrtc.org int32_t RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback); 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool External() const; 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1088edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.orgprivate: 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMDecodedFrameCallback* _callback; 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength]; 1118edcccef11eabb0dd98a061c9d640b2b7743609estefan@webrtc.org uint32_t _nextFrameInfoIdx; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoDecoder& _decoder; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VideoCodecType _codecType; 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _isExternal; 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org bool _keyFrameDecoded; 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1183b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_ 121