Index: webrtc/modules/video_coding/generic_decoder.h |
diff --git a/webrtc/modules/video_coding/generic_decoder.h b/webrtc/modules/video_coding/generic_decoder.h |
index 48e25196e93d74b3618792c64d70a8239b2c5231..891ec893ff2cd98e8337152ecbc64d355a04c2ff 100644 |
--- a/webrtc/modules/video_coding/generic_decoder.h |
+++ b/webrtc/modules/video_coding/generic_decoder.h |
@@ -11,9 +11,11 @@ |
#ifndef WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_ |
#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_ |
+#include "webrtc/base/criticalsection.h" |
+#include "webrtc/base/thread_checker.h" |
#include "webrtc/modules/include/module_common_types.h" |
-#include "webrtc/modules/video_coding/include/video_codec_interface.h" |
#include "webrtc/modules/video_coding/encoded_frame.h" |
+#include "webrtc/modules/video_coding/include/video_codec_interface.h" |
#include "webrtc/modules/video_coding/timestamp_map.h" |
#include "webrtc/modules/video_coding/timing.h" |
@@ -33,32 +35,38 @@ struct VCMFrameInformation { |
class VCMDecodedFrameCallback : public DecodedImageCallback { |
public: |
VCMDecodedFrameCallback(VCMTiming* timing, Clock* clock); |
- virtual ~VCMDecodedFrameCallback(); |
- void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback); |
- VCMReceiveCallback* UserReceiveCallback(); |
+ ~VCMDecodedFrameCallback() override; |
+ void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback); |
+ VCMReceiveCallback* UserReceiveCallback(); |
- int32_t Decoded(VideoFrame& decodedImage) override; |
- int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) override; |
- void Decoded(VideoFrame& decodedImage, |
- rtc::Optional<int32_t> decode_time_ms, |
- rtc::Optional<uint8_t> qp) override; |
- int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) override; |
- int32_t ReceivedDecodedFrame(const uint64_t pictureId) override; |
+ int32_t Decoded(VideoFrame& decodedImage) override; |
+ int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) override; |
+ void Decoded(VideoFrame& decodedImage, |
+ rtc::Optional<int32_t> decode_time_ms, |
+ rtc::Optional<uint8_t> qp) override; |
+ int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) override; |
+ int32_t ReceivedDecodedFrame(const uint64_t pictureId) override; |
- uint64_t LastReceivedPictureID() const; |
- void OnDecoderImplementationName(const char* implementation_name); |
+ uint64_t LastReceivedPictureID() const; |
+ void OnDecoderImplementationName(const char* implementation_name); |
- void Map(uint32_t timestamp, VCMFrameInformation* frameInfo); |
- int32_t Pop(uint32_t timestamp); |
+ void Map(uint32_t timestamp, VCMFrameInformation* frameInfo); |
+ int32_t Pop(uint32_t timestamp); |
private: |
- // Protect |_receiveCallback| and |_timestampMap|. |
- CriticalSectionWrapper* _critSect; |
- Clock* _clock; |
- VCMReceiveCallback* _receiveCallback GUARDED_BY(_critSect); |
- VCMTiming* _timing; |
- VCMTimestampMap _timestampMap GUARDED_BY(_critSect); |
- uint64_t _lastReceivedPictureID; |
+ rtc::ThreadChecker construction_thread_; |
+ // Protect |_timestampMap|. |
+ Clock* const _clock; |
+ // This callback must be set before the decoder thread starts running |
+ // and must only be unset when external threads (e.g decoder thread) |
+ // have been stopped. Due to that, the variable should regarded as const |
+ // while there are more than one threads involved, it must be set |
+ // from the same thread, and therfore a lock is not required to access it. |
+ VCMReceiveCallback* _receiveCallback = nullptr; |
+ VCMTiming* _timing; |
+ rtc::CriticalSection lock_; |
+ VCMTimestampMap _timestampMap GUARDED_BY(lock_); |
+ uint64_t _lastReceivedPictureID; |
}; |
class VCMGenericDecoder { |