| Index: webrtc/modules/video_coding/generic_decoder.cc
|
| diff --git a/webrtc/modules/video_coding/generic_decoder.cc b/webrtc/modules/video_coding/generic_decoder.cc
|
| index 34500c69e2a39f9b69b0e2488318ce75ee0e370f..2121ab63067acdafe71e7f1cb7ceaf90c3b1196d 100644
|
| --- a/webrtc/modules/video_coding/generic_decoder.cc
|
| +++ b/webrtc/modules/video_coding/generic_decoder.cc
|
| @@ -20,25 +20,26 @@ namespace webrtc {
|
|
|
| VCMDecodedFrameCallback::VCMDecodedFrameCallback(VCMTiming* timing,
|
| Clock* clock)
|
| - : _critSect(CriticalSectionWrapper::CreateCriticalSection()),
|
| - _clock(clock),
|
| - _receiveCallback(NULL),
|
| + : _clock(clock),
|
| _timing(timing),
|
| _timestampMap(kDecoderFrameMemoryLength),
|
| _lastReceivedPictureID(0) {}
|
|
|
| VCMDecodedFrameCallback::~VCMDecodedFrameCallback() {
|
| - delete _critSect;
|
| }
|
|
|
| void VCMDecodedFrameCallback::SetUserReceiveCallback(
|
| VCMReceiveCallback* receiveCallback) {
|
| - CriticalSectionScoped cs(_critSect);
|
| + RTC_DCHECK(construction_thread_.CalledOnValidThread());
|
| + RTC_DCHECK((!_receiveCallback && receiveCallback) ||
|
| + (_receiveCallback && !receiveCallback));
|
| _receiveCallback = receiveCallback;
|
| }
|
|
|
| VCMReceiveCallback* VCMDecodedFrameCallback::UserReceiveCallback() {
|
| - CriticalSectionScoped cs(_critSect);
|
| + // Called on the decode thread via VCMCodecDataBase::GetDecoder.
|
| + // The callback must always have been set before this happens.
|
| + RTC_DCHECK(_receiveCallback);
|
| return _receiveCallback;
|
| }
|
|
|
| @@ -58,16 +59,15 @@ int32_t VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
|
| void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
|
| rtc::Optional<int32_t> decode_time_ms,
|
| rtc::Optional<uint8_t> qp) {
|
| + RTC_DCHECK(_receiveCallback) << "Callback must not be null at this point";
|
| TRACE_EVENT_INSTANT1("webrtc", "VCMDecodedFrameCallback::Decoded",
|
| "timestamp", decodedImage.timestamp());
|
| // TODO(holmer): We should improve this so that we can handle multiple
|
| // callbacks from one call to Decode().
|
| VCMFrameInformation* frameInfo;
|
| - VCMReceiveCallback* callback;
|
| {
|
| - CriticalSectionScoped cs(_critSect);
|
| + rtc::CritScope cs(&lock_);
|
| frameInfo = _timestampMap.Pop(decodedImage.timestamp());
|
| - callback = _receiveCallback;
|
| }
|
|
|
| if (frameInfo == NULL) {
|
| @@ -87,22 +87,12 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
|
| decodedImage.set_timestamp_us(
|
| frameInfo->renderTimeMs * rtc::kNumMicrosecsPerMillisec);
|
| decodedImage.set_rotation(frameInfo->rotation);
|
| - // TODO(sakal): Investigate why callback is NULL sometimes and replace if
|
| - // statement with a DCHECK.
|
| - if (callback) {
|
| - callback->FrameToRender(decodedImage, qp);
|
| - } else {
|
| - LOG(LS_WARNING) << "No callback, dropping frame.";
|
| - }
|
| + _receiveCallback->FrameToRender(decodedImage, qp);
|
| }
|
|
|
| int32_t VCMDecodedFrameCallback::ReceivedDecodedReferenceFrame(
|
| const uint64_t pictureId) {
|
| - CriticalSectionScoped cs(_critSect);
|
| - if (_receiveCallback != NULL) {
|
| - return _receiveCallback->ReceivedDecodedReferenceFrame(pictureId);
|
| - }
|
| - return -1;
|
| + return _receiveCallback->ReceivedDecodedReferenceFrame(pictureId);
|
| }
|
|
|
| int32_t VCMDecodedFrameCallback::ReceivedDecodedFrame(
|
| @@ -117,19 +107,17 @@ uint64_t VCMDecodedFrameCallback::LastReceivedPictureID() const {
|
|
|
| void VCMDecodedFrameCallback::OnDecoderImplementationName(
|
| const char* implementation_name) {
|
| - CriticalSectionScoped cs(_critSect);
|
| - if (_receiveCallback)
|
| - _receiveCallback->OnDecoderImplementationName(implementation_name);
|
| + _receiveCallback->OnDecoderImplementationName(implementation_name);
|
| }
|
|
|
| void VCMDecodedFrameCallback::Map(uint32_t timestamp,
|
| VCMFrameInformation* frameInfo) {
|
| - CriticalSectionScoped cs(_critSect);
|
| + rtc::CritScope cs(&lock_);
|
| _timestampMap.Add(timestamp, frameInfo);
|
| }
|
|
|
| int32_t VCMDecodedFrameCallback::Pop(uint32_t timestamp) {
|
| - CriticalSectionScoped cs(_critSect);
|
| + rtc::CritScope cs(&lock_);
|
| if (_timestampMap.Pop(timestamp) == NULL) {
|
| return VCM_GENERAL_ERROR;
|
| }
|
|
|