Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: media/cast/video_receiver/video_receiver.h

Issue 225023010: [Cast] Refactor/clean-up VideoReceiver to match AudioReceiver as closely as possible. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_ 5 #ifndef MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_
6 #define MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_ 6 #define MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h" 12 #include "base/memory/weak_ptr.h"
13 #include "base/threading/non_thread_safe.h" 13 #include "base/threading/non_thread_safe.h"
14 #include "base/time/tick_clock.h" 14 #include "base/time/tick_clock.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "media/cast/cast_config.h" 16 #include "media/cast/cast_config.h"
17 #include "media/cast/cast_environment.h" 17 #include "media/cast/cast_environment.h"
18 #include "media/cast/cast_receiver.h" 18 #include "media/cast/cast_receiver.h"
19 #include "media/cast/framer/framer.h"
19 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" 20 #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h"
20 #include "media/cast/rtcp/rtcp.h" 21 #include "media/cast/rtcp/rtcp.h"
21 #include "media/cast/rtp_receiver/rtp_receiver.h" 22 #include "media/cast/rtp_receiver/rtp_receiver.h"
22 #include "media/cast/rtp_receiver/rtp_receiver_defines.h" 23 #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
23 #include "media/cast/transport/utility/transport_encryption_handler.h" 24 #include "media/cast/transport/utility/transport_encryption_handler.h"
24 25
25 namespace media { 26 namespace media {
27
28 class VideoFrame;
29
26 namespace cast { 30 namespace cast {
27 31
28 class Framer;
29 class LocalRtpVideoFeedback;
30 class PeerVideoReceiver;
31 class Rtcp;
32 class RtpReceiverStatistics;
33 class VideoDecoder; 32 class VideoDecoder;
34 33
35 // Callback used by the video receiver to inform the audio receiver of the new 34 // VideoReceiver receives packets out-of-order while clients make requests for
36 // delay used to compute the playout and render times. 35 // complete frames in-order. (A frame consists of one or more packets.)
37 typedef base::Callback<void(base::TimeDelta)> SetTargetDelayCallback; 36 //
38 37 // VideoReceiver also includes logic for computing the playout time for each
39 // Should only be called from the Main cast thread. 38 // frame, accounting for a constant targeted playout delay. The purpose of the
40 class VideoReceiver : public base::NonThreadSafe, 39 // playout delay is to provide a fixed window of time between the capture event
41 public base::SupportsWeakPtr<VideoReceiver>, 40 // on the sender and the playout on the receiver. This is important because
42 public RtpReceiver { 41 // each step of the pipeline (i.e., encode frame, then transmit/retransmit from
42 // the sender, then receive and re-order packets on the receiver, then decode
43 // frame) can vary in duration and is typically very hard to predict.
44 // Heuristics will determine when the targeted playout delay is insufficient in
45 // the current environment; and the receiver can then increase the playout
46 // delay, notifying the sender, to account for the extra variance.
47 // TODO(miu): Make the last sentence true. http://crbug.com/360111
48 //
49 // Two types of frames can be requested: 1) A frame of decoded video data; or 2)
50 // a frame of still-encoded video data, to be passed into an external video
51 // decoder. Each request for a frame includes a callback which VideoReceiver
52 // guarantees will be called at some point in the future. Clients should
53 // generally limit the number of outstanding requests (perhaps to just one or
54 // two). When VideoReceiver is destroyed, any outstanding requests will be
55 // immediately invoked with a NULL frame.
56 //
57 // This class is not thread safe. Should only be called from the Main cast
58 // thread.
59 class VideoReceiver : public RtpReceiver,
60 public RtpPayloadFeedback,
61 public base::NonThreadSafe,
62 public base::SupportsWeakPtr<VideoReceiver> {
43 public: 63 public:
44 VideoReceiver(scoped_refptr<CastEnvironment> cast_environment, 64 VideoReceiver(scoped_refptr<CastEnvironment> cast_environment,
45 const VideoReceiverConfig& video_config, 65 const VideoReceiverConfig& video_config,
46 transport::PacedPacketSender* const packet_sender, 66 transport::PacedPacketSender* const packet_sender);
47 const SetTargetDelayCallback& target_delay_cb);
48 67
49 virtual ~VideoReceiver(); 68 virtual ~VideoReceiver();
50 69
51 // Request a raw frame. Will return frame via callback when available. 70 // Request a decoded video frame.
71 //
72 // The given |callback| is guaranteed to be run at some point in the future,
73 // even if to respond with NULL at shutdown time.
52 void GetRawVideoFrame(const VideoFrameDecodedCallback& callback); 74 void GetRawVideoFrame(const VideoFrameDecodedCallback& callback);
53 75
54 // Request an encoded frame. Will return frame via callback when available. 76 // Request an encoded video frame.
77 //
78 // The given |callback| is guaranteed to be run at some point in the future,
79 // even if to respond with NULL at shutdown time.
55 void GetEncodedVideoFrame(const VideoFrameEncodedCallback& callback); 80 void GetEncodedVideoFrame(const VideoFrameEncodedCallback& callback);
56 81
57 // Insert a RTP packet to the video receiver. 82 // Deliver another packet, possibly a duplicate, and possibly out-of-order.
58 void IncomingPacket(scoped_ptr<Packet> packet); 83 void IncomingPacket(scoped_ptr<Packet> packet);
59 84
85 protected:
86 friend class VideoReceiverTest; // Invoked OnReceivedPayloadData().
87
60 virtual void OnReceivedPayloadData(const uint8* payload_data, 88 virtual void OnReceivedPayloadData(const uint8* payload_data,
61 size_t payload_size, 89 size_t payload_size,
62 const RtpCastHeader& rtp_header) OVERRIDE; 90 const RtpCastHeader& rtp_header) OVERRIDE;
63 91
64 protected: 92 // RtpPayloadFeedback implementation.
65 void DecodeVideoFrameThread( 93 virtual void CastFeedback(const RtcpCastMessage& cast_message) OVERRIDE;
66 scoped_ptr<transport::EncodedVideoFrame> encoded_frame,
67 const base::TimeTicks render_time,
68 const VideoFrameDecodedCallback& frame_decoded_callback);
69 94
70 private: 95 private:
71 friend class LocalRtpVideoFeedback; 96 // Processes ready-to-consume packets from |framer_|, decrypting each packet's
97 // payload data, and then running the enqueued callbacks in order (one for
98 // each packet). This method may post a delayed task to re-invoke itself in
99 // the future to wait for missing/incomplete frames.
100 void EmitAvailableEncodedFrames();
72 101
73 void CastFeedback(const RtcpCastMessage& cast_message); 102 // Clears the |is_waiting_for_consecutive_frame_| flag and invokes
103 // EmitAvailableEncodedFrames().
104 void EmitAvailableEncodedFramesAfterWaiting();
74 105
75 void DecodeVideoFrame(const VideoFrameDecodedCallback& callback, 106 // Feeds an EncodedVideoFrame into |video_decoder_|. GetRawVideoFrame() uses
76 scoped_ptr<transport::EncodedVideoFrame> encoded_frame, 107 // this as a callback for GetEncodedVideoFrame().
77 const base::TimeTicks& render_time); 108 void DecodeEncodedVideoFrame(
109 const VideoFrameDecodedCallback& callback,
110 scoped_ptr<transport::EncodedVideoFrame> encoded_frame,
111 const base::TimeTicks& playout_time);
78 112
79 bool DecryptVideoFrame(scoped_ptr<transport::EncodedVideoFrame>* video_frame); 113 // Return the playout time based on the current time and rtp timestamp.
80 114 base::TimeTicks GetPlayoutTime(base::TimeTicks now, uint32 rtp_timestamp);
81 bool PullEncodedVideoFrame(
82 bool next_frame,
83 scoped_ptr<transport::EncodedVideoFrame>* encoded_frame,
84 base::TimeTicks* render_time);
85
86 void PlayoutTimeout();
87
88 // Returns Render time based on current time and the rtp timestamp.
89 base::TimeTicks GetRenderTime(base::TimeTicks now, uint32 rtp_timestamp);
90 115
91 void InitializeTimers(); 116 void InitializeTimers();
92 117
93 // Schedule timing for the next cast message. 118 // Schedule timing for the next cast message.
94 void ScheduleNextCastMessage(); 119 void ScheduleNextCastMessage();
95 120
96 // Schedule timing for the next RTCP report. 121 // Schedule timing for the next RTCP report.
97 void ScheduleNextRtcpReport(); 122 void ScheduleNextRtcpReport();
98 123
99 // Actually send the next cast message. 124 // Actually send the next cast message.
100 void SendNextCastMessage(); 125 void SendNextCastMessage();
101 126
102 // Actually send the next RTCP report. 127 // Actually send the next RTCP report.
103 void SendNextRtcpReport(); 128 void SendNextRtcpReport();
104 129
105 // Update the target delay based on past information. Will also update the 130 // Receives a VideoFrame from |video_decoder_|, logs the event, and passes the
106 // rtcp module and the audio receiver. 131 // data on by running the given |callback|. This method is static to ensure
107 void UpdateTargetDelay(); 132 // it can be called after a VideoReceiver instance is destroyed.
133 // DecodeEncodedVideoFrame() uses this as a callback for
134 // VideoDecoder::DecodeFrame().
135 static void EmitRawVideoFrame(
136 const scoped_refptr<CastEnvironment>& cast_environment,
137 const VideoFrameDecodedCallback& callback,
138 uint32 frame_id,
139 uint32 rtp_timestamp,
140 const base::TimeTicks& playout_time,
141 const scoped_refptr<VideoFrame>& video_frame,
142 bool is_continuous);
108 143
109 scoped_ptr<VideoDecoder> video_decoder_; 144 const scoped_refptr<CastEnvironment> cast_environment_;
110 scoped_refptr<CastEnvironment> cast_environment_;
111 145
112 // Subscribes to raw events. 146 // Subscribes to raw events.
113 // Processes raw audio events to be sent over to the cast sender via RTCP. 147 // Processes raw audio events to be sent over to the cast sender via RTCP.
114 ReceiverRtcpEventSubscriber event_subscriber_; 148 ReceiverRtcpEventSubscriber event_subscriber_;
115 149
116 scoped_ptr<Framer> framer_;
117 const transport::VideoCodec codec_; 150 const transport::VideoCodec codec_;
118 base::TimeDelta target_delay_delta_; 151 const base::TimeDelta target_delay_delta_;
119 base::TimeDelta frame_delay_; 152 const base::TimeDelta expected_frame_duration_;
120 scoped_ptr<LocalRtpVideoFeedback> incoming_payload_feedback_; 153 Framer framer_;
121 scoped_ptr<Rtcp> rtcp_; 154 scoped_ptr<VideoDecoder> video_decoder_;
155 Rtcp rtcp_;
122 base::TimeDelta time_offset_; // Sender-receiver offset estimation. 156 base::TimeDelta time_offset_; // Sender-receiver offset estimation.
123 int time_offset_counter_; 157 int time_offset_counter_;
124 transport::TransportEncryptionHandler decryptor_;
125 std::list<VideoFrameEncodedCallback> queued_encoded_callbacks_;
126 bool time_incoming_packet_updated_; 158 bool time_incoming_packet_updated_;
127 base::TimeTicks time_incoming_packet_; 159 base::TimeTicks time_incoming_packet_;
128 uint32 incoming_rtp_timestamp_; 160 uint32 incoming_rtp_timestamp_;
129 base::TimeTicks last_render_time_; 161 transport::TransportEncryptionHandler decryptor_;
130 SetTargetDelayCallback target_delay_cb_; 162
163 // Outstanding callbacks to run to deliver on client requests for frames.
164 std::list<VideoFrameEncodedCallback> frame_request_queue_;
165
166 // True while there's an outstanding task to re-invoke
167 // EmitAvailableEncodedFrames().
168 bool is_waiting_for_consecutive_frame_;
131 169
132 // This mapping allows us to log kVideoAckSent as a frame event. In addition 170 // This mapping allows us to log kVideoAckSent as a frame event. In addition
133 // it allows the event to be transmitted via RTCP. 171 // it allows the event to be transmitted via RTCP.
134 RtpTimestamp frame_id_to_rtp_timestamp_[256]; 172 RtpTimestamp frame_id_to_rtp_timestamp_[256];
135 173
136 // NOTE: Weak pointers must be invalidated before all other member variables. 174 // NOTE: Weak pointers must be invalidated before all other member variables.
137 base::WeakPtrFactory<VideoReceiver> weak_factory_; 175 base::WeakPtrFactory<VideoReceiver> weak_factory_;
138 176
139 DISALLOW_COPY_AND_ASSIGN(VideoReceiver); 177 DISALLOW_COPY_AND_ASSIGN(VideoReceiver);
140 }; 178 };
141 179
142 } // namespace cast 180 } // namespace cast
143 } // namespace media 181 } // namespace media
144 182
145 #endif // MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_ 183 #endif // MEDIA_CAST_VIDEO_RECEIVER_VIDEO_RECEIVER_H_
OLDNEW
« no previous file with comments | « media/cast/video_receiver/video_decoder_unittest.cc ('k') | media/cast/video_receiver/video_receiver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698