OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 IvfFileWriter* encoded_frame_writer, | 127 IvfFileWriter* encoded_frame_writer, |
128 FrameWriter* decoded_frame_writer); | 128 FrameWriter* decoded_frame_writer); |
129 ~VideoProcessor(); | 129 ~VideoProcessor(); |
130 | 130 |
131 // Sets up callbacks and initializes the encoder and decoder. | 131 // Sets up callbacks and initializes the encoder and decoder. |
132 void Init(); | 132 void Init(); |
133 | 133 |
134 // Tears down callbacks and releases the encoder and decoder. | 134 // Tears down callbacks and releases the encoder and decoder. |
135 void Release(); | 135 void Release(); |
136 | 136 |
137 // Processes a single frame. The frames must be processed in order, and the | 137 // Reads a frame from the analysis frame reader and sends it to the encoder. |
138 // VideoProcessor must be initialized first. | 138 // When the encode callback is received, the encoded frame is sent to the |
139 void ProcessFrame(int frame_number); | 139 // decoder. The decoded frame is written to disk by the analysis frame writer. |
| 140 // Objective video quality metrics can thus be calculated after the fact. |
| 141 void ProcessFrame(); |
140 | 142 |
141 // Updates the encoder with target rates. Must be called at least once. | 143 // Updates the encoder with target rates. Must be called at least once. |
142 void SetRates(int bitrate_kbps, int framerate_fps); | 144 void SetRates(int bitrate_kbps, int framerate_fps); |
143 | 145 |
144 // Returns the number of dropped frames. | 146 // Returns the number of dropped frames. |
145 std::vector<int> NumberDroppedFramesPerRateUpdate() const; | 147 std::vector<int> NumberDroppedFramesPerRateUpdate() const; |
146 | 148 |
147 // Returns the number of spatial resizes. | 149 // Returns the number of spatial resizes. |
148 std::vector<int> NumberSpatialResizesPerRateUpdate() const; | 150 std::vector<int> NumberSpatialResizesPerRateUpdate() const; |
149 | 151 |
150 private: | 152 private: |
151 // Container that holds per-frame information that needs to be stored between | |
152 // calls to Encode and Decode, as well as the corresponding callbacks. It is | |
153 // not directly used for statistics -- for that, test::FrameStatistic is used. | |
154 // TODO(brandtr): Get rid of this struct and use the Stats class instead. | |
155 struct FrameInfo { | |
156 int64_t encode_start_ns = 0; | |
157 int64_t decode_start_ns = 0; | |
158 int decoded_width = 0; | |
159 int decoded_height = 0; | |
160 size_t manipulated_length = 0; | |
161 }; | |
162 | |
163 class VideoProcessorEncodeCompleteCallback | 153 class VideoProcessorEncodeCompleteCallback |
164 : public webrtc::EncodedImageCallback { | 154 : public webrtc::EncodedImageCallback { |
165 public: | 155 public: |
166 explicit VideoProcessorEncodeCompleteCallback( | 156 explicit VideoProcessorEncodeCompleteCallback( |
167 VideoProcessor* video_processor) | 157 VideoProcessor* video_processor) |
168 : video_processor_(video_processor), | 158 : video_processor_(video_processor), |
169 task_queue_(rtc::TaskQueue::Current()) {} | 159 task_queue_(rtc::TaskQueue::Current()) {} |
170 | 160 |
171 Result OnEncodedImage( | 161 Result OnEncodedImage( |
172 const webrtc::EncodedImage& encoded_image, | 162 const webrtc::EncodedImage& encoded_image, |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 FrameReader* const analysis_frame_reader_; | 266 FrameReader* const analysis_frame_reader_; |
277 FrameWriter* const analysis_frame_writer_; | 267 FrameWriter* const analysis_frame_writer_; |
278 | 268 |
279 // These (optional) file writers are used to persistently store the encoded | 269 // These (optional) file writers are used to persistently store the encoded |
280 // and decoded bitstreams. The purpose is to give the experimenter an option | 270 // and decoded bitstreams. The purpose is to give the experimenter an option |
281 // to subjectively evaluate the quality of the processing. Each frame writer | 271 // to subjectively evaluate the quality of the processing. Each frame writer |
282 // is enabled by being non-null. | 272 // is enabled by being non-null. |
283 IvfFileWriter* const encoded_frame_writer_; | 273 IvfFileWriter* const encoded_frame_writer_; |
284 FrameWriter* const decoded_frame_writer_; | 274 FrameWriter* const decoded_frame_writer_; |
285 | 275 |
286 // Frame metadata for all frames that have been added through a call to | 276 // Keep track of inputed/encoded/decoded frames, so we can detect frame drops. |
287 // ProcessFrames(). We need to store this metadata over the course of the | 277 int last_inputed_frame_num_ GUARDED_BY(sequence_checker_); |
288 // test run, to support pipelining HW codecs. | |
289 std::vector<FrameInfo> frame_infos_ GUARDED_BY(sequence_checker_); | |
290 int last_encoded_frame_num_ GUARDED_BY(sequence_checker_); | 278 int last_encoded_frame_num_ GUARDED_BY(sequence_checker_); |
291 int last_decoded_frame_num_ GUARDED_BY(sequence_checker_); | 279 int last_decoded_frame_num_ GUARDED_BY(sequence_checker_); |
292 | 280 |
293 // Store an RTP timestamp -> frame number map, since the timestamps are | 281 // Store an RTP timestamp -> frame number map, since the timestamps are |
294 // based off of the frame rate, which can change mid-test. | 282 // based off of the frame rate, which can change mid-test. |
295 std::map<uint32_t, int> rtp_timestamp_to_frame_num_ | 283 std::map<uint32_t, int> rtp_timestamp_to_frame_num_ |
296 GUARDED_BY(sequence_checker_); | 284 GUARDED_BY(sequence_checker_); |
297 | 285 |
298 // Keep track of if we have excluded the first key frame from packet loss. | 286 // Keep track of if we have excluded the first key frame from packet loss. |
299 bool first_key_frame_has_been_excluded_ GUARDED_BY(sequence_checker_); | 287 bool first_key_frame_has_been_excluded_ GUARDED_BY(sequence_checker_); |
(...skipping 10 matching lines...) Expand all Loading... |
310 | 298 |
311 rtc::SequencedTaskChecker sequence_checker_; | 299 rtc::SequencedTaskChecker sequence_checker_; |
312 | 300 |
313 RTC_DISALLOW_COPY_AND_ASSIGN(VideoProcessor); | 301 RTC_DISALLOW_COPY_AND_ASSIGN(VideoProcessor); |
314 }; | 302 }; |
315 | 303 |
316 } // namespace test | 304 } // namespace test |
317 } // namespace webrtc | 305 } // namespace webrtc |
318 | 306 |
319 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_H_ | 307 #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_H_ |
OLD | NEW |