Both of these implementations are added as observers by VideoReceiveStream, which is also an observer. Instead, VideoReceiveStream now forward the necessary information when the stats are updated as is already done for |frame_buffer_|. Fewer observers registered, simplifies the code a little bit, reduces synchronization when registering/unregistering observers and reduces the set of existing implementations. (I'm changing call_stats.* a little bit, so this is a by-the-way change) Bug: none Change-Id: I2d40b80a60e5ca632293c5118ac3b1a35d48ea40 Reviewed-on: https://webrtc-review.googlesource.com/64524 Reviewed-by: Magnus Flodman <mflodman@webrtc.org> Commit-Queue: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#22594}
103 lines
3.5 KiB
C++
103 lines
3.5 KiB
C++
/*
|
|
* Copyright (c) 2012 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 VIDEO_VIDEO_STREAM_DECODER_H_
|
|
#define VIDEO_VIDEO_STREAM_DECODER_H_
|
|
|
|
#include <list>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "api/videosinkinterface.h"
|
|
#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
|
|
#include "modules/video_coding/include/video_coding_defines.h"
|
|
#include "rtc_base/criticalsection.h"
|
|
#include "rtc_base/platform_thread.h"
|
|
#include "rtc_base/scoped_ref_ptr.h"
|
|
#include "typedefs.h" // NOLINT(build/include)
|
|
|
|
namespace webrtc {
|
|
|
|
class CallStatsObserver;
|
|
class ChannelStatsObserver;
|
|
class EncodedImageCallback;
|
|
class ReceiveStatisticsProxy;
|
|
class VideoRenderCallback;
|
|
|
|
namespace vcm {
|
|
class VideoReceiver;
|
|
} // namespace vcm
|
|
|
|
enum StreamType {
|
|
kViEStreamTypeNormal = 0, // Normal media stream
|
|
kViEStreamTypeRtx = 1 // Retransmission media stream
|
|
};
|
|
|
|
class VideoStreamDecoder : public VCMReceiveCallback,
|
|
public VCMReceiveStatisticsCallback {
|
|
public:
|
|
friend class ChannelStatsObserver;
|
|
|
|
VideoStreamDecoder(
|
|
vcm::VideoReceiver* video_receiver,
|
|
VCMFrameTypeCallback* vcm_frame_type_callback,
|
|
VCMPacketRequestCallback* vcm_packet_request_callback,
|
|
bool enable_nack,
|
|
bool enable_fec,
|
|
ReceiveStatisticsProxy* receive_statistics_proxy,
|
|
rtc::VideoSinkInterface<VideoFrame>* incoming_video_stream);
|
|
~VideoStreamDecoder();
|
|
|
|
// Implements VCMReceiveCallback.
|
|
int32_t FrameToRender(VideoFrame& video_frame,
|
|
rtc::Optional<uint8_t> qp,
|
|
VideoContentType content_type) override;
|
|
int32_t ReceivedDecodedReferenceFrame(const uint64_t picture_id) override;
|
|
void OnIncomingPayloadType(int payload_type) override;
|
|
void OnDecoderImplementationName(const char* implementation_name) override;
|
|
|
|
// Implements VCMReceiveStatisticsCallback.
|
|
void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override;
|
|
void OnDiscardedPacketsUpdated(int discarded_packets) override;
|
|
void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
|
|
void OnCompleteFrame(bool is_keyframe,
|
|
size_t size_bytes,
|
|
VideoContentType content_type) override;
|
|
void OnFrameBufferTimingsUpdated(int decode_ms,
|
|
int max_decode_ms,
|
|
int current_delay_ms,
|
|
int target_delay_ms,
|
|
int jitter_buffer_ms,
|
|
int min_playout_delay_ms,
|
|
int render_delay_ms) override;
|
|
|
|
void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) override;
|
|
|
|
void RegisterReceiveStatisticsProxy(
|
|
ReceiveStatisticsProxy* receive_statistics_proxy);
|
|
|
|
// Called by VideoReceiveStream when stats are updated.
|
|
void UpdateRtt(int64_t max_rtt_ms);
|
|
|
|
private:
|
|
// Used for all registered callbacks except rendering.
|
|
rtc::CriticalSection crit_;
|
|
|
|
vcm::VideoReceiver* const video_receiver_;
|
|
|
|
ReceiveStatisticsProxy* const receive_stats_callback_;
|
|
rtc::VideoSinkInterface<VideoFrame>* const incoming_video_stream_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // VIDEO_VIDEO_STREAM_DECODER_H_
|