1/*
2 *  Copyright (c) 2013 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_VIDEO_VIDEO_RECEIVE_STREAM_H_
12#define WEBRTC_VIDEO_VIDEO_RECEIVE_STREAM_H_
13
14#include <vector>
15
16#include "webrtc/base/scoped_ptr.h"
17#include "webrtc/call.h"
18#include "webrtc/call/transport_adapter.h"
19#include "webrtc/common_video/include/incoming_video_stream.h"
20#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
21#include "webrtc/modules/video_render/video_render_defines.h"
22#include "webrtc/system_wrappers/include/clock.h"
23#include "webrtc/video/encoded_frame_callback_adapter.h"
24#include "webrtc/video/receive_statistics_proxy.h"
25#include "webrtc/video/vie_channel.h"
26#include "webrtc/video/vie_encoder.h"
27#include "webrtc/video_encoder.h"
28#include "webrtc/video_receive_stream.h"
29
30namespace webrtc {
31
32class CallStats;
33class CongestionController;
34class VoiceEngine;
35
36namespace internal {
37
38class VideoReceiveStream : public webrtc::VideoReceiveStream,
39                           public I420FrameCallback,
40                           public VideoRenderCallback,
41                           public EncodedImageCallback {
42 public:
43  VideoReceiveStream(int num_cpu_cores,
44                     CongestionController* congestion_controller,
45                     const VideoReceiveStream::Config& config,
46                     webrtc::VoiceEngine* voice_engine,
47                     ProcessThread* process_thread,
48                     CallStats* call_stats);
49  ~VideoReceiveStream() override;
50
51  // webrtc::ReceiveStream implementation.
52  void Start() override;
53  void Stop() override;
54  void SignalNetworkState(NetworkState state) override;
55  bool DeliverRtcp(const uint8_t* packet, size_t length) override;
56  bool DeliverRtp(const uint8_t* packet,
57                  size_t length,
58                  const PacketTime& packet_time) override;
59
60  // webrtc::VideoReceiveStream implementation.
61  webrtc::VideoReceiveStream::Stats GetStats() const override;
62
63  // Overrides I420FrameCallback.
64  void FrameCallback(VideoFrame* video_frame) override;
65
66  // Overrides VideoRenderCallback.
67  int RenderFrame(const uint32_t /*stream_id*/,
68                  const VideoFrame& video_frame) override;
69
70  // Overrides EncodedImageCallback.
71  int32_t Encoded(const EncodedImage& encoded_image,
72                  const CodecSpecificInfo* codec_specific_info,
73                  const RTPFragmentationHeader* fragmentation) override;
74
75  const Config& config() const { return config_; }
76
77  void SetSyncChannel(VoiceEngine* voice_engine, int audio_channel_id);
78
79 private:
80  TransportAdapter transport_adapter_;
81  EncodedFrameCallbackAdapter encoded_frame_proxy_;
82  const VideoReceiveStream::Config config_;
83  Clock* const clock_;
84
85  CongestionController* const congestion_controller_;
86  CallStats* const call_stats_;
87
88  rtc::scoped_ptr<IncomingVideoStream> incoming_video_stream_;
89  rtc::scoped_ptr<ReceiveStatisticsProxy> stats_proxy_;
90  rtc::scoped_ptr<ViEChannel> vie_channel_;
91};
92}  // namespace internal
93}  // namespace webrtc
94
95#endif  // WEBRTC_VIDEO_VIDEO_RECEIVE_STREAM_H_
96