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