
The most important change is to prevent a potential buffer overflow in NackList(). It cannot happen if the |size| argument passed to NackList() is consistent with the |max_nack_list_size| argument passed to SetNackSettings(), and there is an assertion to check that. But it is good to defend against this in the release build because assert() is compiled away in the release build. Remove the unused |master| parameter to the VCMReceiver constructor. Remove the unused State() getter method and the corresponding state_ member. Remove the declarations for the nonexistent GenerateReceiverId() method and the receiver_id_counter_ member. Remove the unneeded data_buffer_ member of TestVCMReceiver. It was assigned to packet.dataPtr and then immediately overwritten by stream_generator_->GetPacket() or stream_generator_->PopPacket(). R=stefan@webrtc.org BUG=none TEST=none Review URL: https://webrtc-codereview.appspot.com/51119004 Cr-Commit-Position: refs/heads/master@{#9318}
89 lines
3.0 KiB
C++
89 lines
3.0 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
|
|
#define WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
|
|
|
|
#include "webrtc/modules/video_coding/main/source/jitter_buffer.h"
|
|
#include "webrtc/modules/video_coding/main/source/packet.h"
|
|
#include "webrtc/modules/video_coding/main/source/timing.h"
|
|
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
|
#include "webrtc/modules/video_coding/main/interface/video_coding.h"
|
|
#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class Clock;
|
|
class VCMEncodedFrame;
|
|
|
|
enum VCMNackStatus {
|
|
kNackOk,
|
|
kNackKeyFrameRequest
|
|
};
|
|
|
|
class VCMReceiver {
|
|
public:
|
|
VCMReceiver(VCMTiming* timing,
|
|
Clock* clock,
|
|
EventFactory* event_factory);
|
|
~VCMReceiver();
|
|
|
|
void Reset();
|
|
void UpdateRtt(int64_t rtt);
|
|
int32_t InsertPacket(const VCMPacket& packet,
|
|
uint16_t frame_width,
|
|
uint16_t frame_height);
|
|
VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
|
|
int64_t& next_render_time_ms,
|
|
bool render_timing = true);
|
|
void ReleaseFrame(VCMEncodedFrame* frame);
|
|
void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
|
|
uint32_t DiscardedPackets() const;
|
|
|
|
// NACK.
|
|
void SetNackMode(VCMNackMode nackMode,
|
|
int64_t low_rtt_nack_threshold_ms,
|
|
int64_t high_rtt_nack_threshold_ms);
|
|
void SetNackSettings(size_t max_nack_list_size,
|
|
int max_packet_age_to_nack,
|
|
int max_incomplete_time_ms);
|
|
VCMNackMode NackMode() const;
|
|
VCMNackStatus NackList(uint16_t* nackList, uint16_t size,
|
|
uint16_t* nack_list_length);
|
|
|
|
// Receiver video delay.
|
|
int SetMinReceiverDelay(int desired_delay_ms);
|
|
|
|
// Decoding with errors.
|
|
void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
|
|
VCMDecodeErrorMode DecodeErrorMode() const;
|
|
|
|
// Returns size in time (milliseconds) of complete continuous frames in the
|
|
// jitter buffer. The render time is estimated based on the render delay at
|
|
// the time this function is called.
|
|
int RenderBufferSizeMs();
|
|
|
|
void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
|
|
|
|
void TriggerDecoderShutdown();
|
|
|
|
private:
|
|
CriticalSectionWrapper* crit_sect_;
|
|
Clock* const clock_;
|
|
VCMJitterBuffer jitter_buffer_;
|
|
VCMTiming* timing_;
|
|
rtc::scoped_ptr<EventWrapper> render_wait_event_;
|
|
int max_video_delay_ms_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // WEBRTC_MODULES_VIDEO_CODING_MAIN_SOURCE_RECEIVER_H_
|