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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 PacketManipulator* packet_manipulator, | 53 PacketManipulator* packet_manipulator, |
54 const TestConfig& config, | 54 const TestConfig& config, |
55 Stats* stats) | 55 Stats* stats) |
56 : encoder_(encoder), | 56 : encoder_(encoder), |
57 decoder_(decoder), | 57 decoder_(decoder), |
58 frame_reader_(frame_reader), | 58 frame_reader_(frame_reader), |
59 frame_writer_(frame_writer), | 59 frame_writer_(frame_writer), |
60 packet_manipulator_(packet_manipulator), | 60 packet_manipulator_(packet_manipulator), |
61 config_(config), | 61 config_(config), |
62 stats_(stats), | 62 stats_(stats), |
63 encode_callback_(nullptr), | |
64 decode_callback_(nullptr), | |
65 last_successful_frame_buffer_(nullptr), | |
66 first_key_frame_has_been_excluded_(false), | 63 first_key_frame_has_been_excluded_(false), |
67 last_frame_missing_(false), | 64 last_frame_missing_(false), |
68 initialized_(false), | 65 initialized_(false), |
69 encoded_frame_size_(0), | 66 encoded_frame_size_(0), |
70 encoded_frame_type_(kVideoFrameKey), | 67 encoded_frame_type_(kVideoFrameKey), |
71 prev_time_stamp_(0), | 68 prev_time_stamp_(0), |
72 num_dropped_frames_(0), | 69 num_dropped_frames_(0), |
73 num_spatial_resizes_(0), | 70 num_spatial_resizes_(0), |
74 last_encoder_frame_width_(0), | 71 last_encoder_frame_width_(0), |
75 last_encoder_frame_height_(0), | 72 last_encoder_frame_height_(0), |
(...skipping 14 matching lines...) Expand all Loading... |
90 RTC_DCHECK(packet_manipulator); | 87 RTC_DCHECK(packet_manipulator); |
91 RTC_DCHECK(stats); | 88 RTC_DCHECK(stats); |
92 } | 89 } |
93 | 90 |
94 bool VideoProcessorImpl::Init() { | 91 bool VideoProcessorImpl::Init() { |
95 // Calculate a factor used for bit rate calculations: | 92 // Calculate a factor used for bit rate calculations: |
96 bit_rate_factor_ = config_.codec_settings->maxFramerate * 0.001 * 8; // bits | 93 bit_rate_factor_ = config_.codec_settings->maxFramerate * 0.001 * 8; // bits |
97 | 94 |
98 // Initialize data structures used by the encoder/decoder APIs | 95 // Initialize data structures used by the encoder/decoder APIs |
99 size_t frame_length_in_bytes = frame_reader_->FrameLength(); | 96 size_t frame_length_in_bytes = frame_reader_->FrameLength(); |
100 last_successful_frame_buffer_ = new uint8_t[frame_length_in_bytes]; | 97 last_successful_frame_buffer_.reset(new uint8_t[frame_length_in_bytes]); |
101 // Set fixed properties common for all frames. | 98 // Set fixed properties common for all frames. |
102 // To keep track of spatial resize actions by encoder. | 99 // To keep track of spatial resize actions by encoder. |
103 last_encoder_frame_width_ = config_.codec_settings->width; | 100 last_encoder_frame_width_ = config_.codec_settings->width; |
104 last_encoder_frame_height_ = config_.codec_settings->height; | 101 last_encoder_frame_height_ = config_.codec_settings->height; |
105 | 102 |
106 // Setup required callbacks for the encoder/decoder: | 103 // Setup required callbacks for the encoder/decoder: |
107 encode_callback_ = new VideoProcessorEncodeCompleteCallback(this); | 104 encode_callback_.reset(new VideoProcessorEncodeCompleteCallback(this)); |
108 decode_callback_ = new VideoProcessorDecodeCompleteCallback(this); | 105 decode_callback_.reset(new VideoProcessorDecodeCompleteCallback(this)); |
109 int32_t register_result = | 106 RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(encode_callback_.get()), |
110 encoder_->RegisterEncodeCompleteCallback(encode_callback_); | 107 WEBRTC_VIDEO_CODEC_OK) |
111 if (register_result != WEBRTC_VIDEO_CODEC_OK) { | 108 << "Failed to register encode complete callback"; |
112 fprintf(stderr, | 109 RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(decode_callback_.get()), |
113 "Failed to register encode complete callback, return code: " | 110 WEBRTC_VIDEO_CODEC_OK) |
114 "%d\n", | 111 << "Failed to register decode complete callback"; |
115 register_result); | 112 |
116 return false; | |
117 } | |
118 register_result = decoder_->RegisterDecodeCompleteCallback(decode_callback_); | |
119 if (register_result != WEBRTC_VIDEO_CODEC_OK) { | |
120 fprintf(stderr, | |
121 "Failed to register decode complete callback, return code: " | |
122 "%d\n", | |
123 register_result); | |
124 return false; | |
125 } | |
126 // Init the encoder and decoder | 113 // Init the encoder and decoder |
127 uint32_t nbr_of_cores = 1; | 114 uint32_t nbr_of_cores = 1; |
128 if (!config_.use_single_core) { | 115 if (!config_.use_single_core) { |
129 nbr_of_cores = CpuInfo::DetectNumberOfCores(); | 116 nbr_of_cores = CpuInfo::DetectNumberOfCores(); |
130 } | 117 } |
131 int32_t init_result = | 118 RTC_CHECK_EQ( |
132 encoder_->InitEncode(config_.codec_settings, nbr_of_cores, | 119 encoder_->InitEncode(config_.codec_settings, nbr_of_cores, |
133 config_.networking_config.max_payload_size_in_bytes); | 120 config_.networking_config.max_payload_size_in_bytes), |
134 if (init_result != WEBRTC_VIDEO_CODEC_OK) { | 121 WEBRTC_VIDEO_CODEC_OK) |
135 fprintf(stderr, "Failed to initialize VideoEncoder, return code: %d\n", | 122 << "Failed to initialize VideoEncoder"; |
136 init_result); | 123 |
137 return false; | 124 RTC_CHECK_EQ(decoder_->InitDecode(config_.codec_settings, nbr_of_cores), |
138 } | 125 WEBRTC_VIDEO_CODEC_OK) |
139 init_result = decoder_->InitDecode(config_.codec_settings, nbr_of_cores); | 126 << "Failed to initialize VideoDecoder"; |
140 if (init_result != WEBRTC_VIDEO_CODEC_OK) { | |
141 fprintf(stderr, "Failed to initialize VideoDecoder, return code: %d\n", | |
142 init_result); | |
143 return false; | |
144 } | |
145 | 127 |
146 if (config_.verbose) { | 128 if (config_.verbose) { |
147 printf("Video Processor:\n"); | 129 printf("Video Processor:\n"); |
148 printf(" #CPU cores used : %d\n", nbr_of_cores); | 130 printf(" #CPU cores used : %d\n", nbr_of_cores); |
149 printf(" Total # of frames: %d\n", frame_reader_->NumberOfFrames()); | 131 printf(" Total # of frames: %d\n", frame_reader_->NumberOfFrames()); |
150 printf(" Codec settings:\n"); | 132 printf(" Codec settings:\n"); |
151 printf(" Start bitrate : %d kbps\n", | 133 printf(" Start bitrate : %d kbps\n", |
152 config_.codec_settings->startBitrate); | 134 config_.codec_settings->startBitrate); |
153 printf(" Width : %d\n", config_.codec_settings->width); | 135 printf(" Width : %d\n", config_.codec_settings->width); |
154 printf(" Height : %d\n", config_.codec_settings->height); | 136 printf(" Height : %d\n", config_.codec_settings->height); |
(...skipping 16 matching lines...) Expand all Loading... |
171 } else if (config_.codec_settings->codecType == kVideoCodecVP9) { | 153 } else if (config_.codec_settings->codecType == kVideoCodecVP9) { |
172 printf(" Resilience : %d\n", | 154 printf(" Resilience : %d\n", |
173 config_.codec_settings->VP9()->resilience); | 155 config_.codec_settings->VP9()->resilience); |
174 } | 156 } |
175 } | 157 } |
176 initialized_ = true; | 158 initialized_ = true; |
177 return true; | 159 return true; |
178 } | 160 } |
179 | 161 |
180 VideoProcessorImpl::~VideoProcessorImpl() { | 162 VideoProcessorImpl::~VideoProcessorImpl() { |
181 delete[] last_successful_frame_buffer_; | 163 encoder_->RegisterEncodeCompleteCallback(nullptr); |
182 encoder_->RegisterEncodeCompleteCallback(NULL); | 164 decoder_->RegisterDecodeCompleteCallback(nullptr); |
183 delete encode_callback_; | |
184 decoder_->RegisterDecodeCompleteCallback(NULL); | |
185 delete decode_callback_; | |
186 } | 165 } |
187 | 166 |
188 void VideoProcessorImpl::SetRates(int bit_rate, int frame_rate) { | 167 void VideoProcessorImpl::SetRates(int bit_rate, int frame_rate) { |
189 int set_rates_result = encoder_->SetRateAllocation( | 168 int set_rates_result = encoder_->SetRateAllocation( |
190 bitrate_allocator_->GetAllocation(bit_rate * 1000, frame_rate), | 169 bitrate_allocator_->GetAllocation(bit_rate * 1000, frame_rate), |
191 frame_rate); | 170 frame_rate); |
192 RTC_CHECK_GE(set_rates_result, 0); | 171 RTC_CHECK_GE(set_rates_result, 0) << "Failed to update encoder with new rate " |
193 if (set_rates_result < 0) { | 172 << bit_rate; |
194 fprintf(stderr, | |
195 "Failed to update encoder with new rate %d, " | |
196 "return code: %d\n", | |
197 bit_rate, set_rates_result); | |
198 } | |
199 num_dropped_frames_ = 0; | 173 num_dropped_frames_ = 0; |
200 num_spatial_resizes_ = 0; | 174 num_spatial_resizes_ = 0; |
201 } | 175 } |
202 | 176 |
203 size_t VideoProcessorImpl::EncodedFrameSize() { | 177 size_t VideoProcessorImpl::EncodedFrameSize() { |
204 return encoded_frame_size_; | 178 return encoded_frame_size_; |
205 } | 179 } |
206 | 180 |
207 FrameType VideoProcessorImpl::EncodedFrameType() { | 181 FrameType VideoProcessorImpl::EncodedFrameType() { |
208 return encoded_frame_type_; | 182 return encoded_frame_type_; |
209 } | 183 } |
210 | 184 |
211 int VideoProcessorImpl::NumberDroppedFrames() { | 185 int VideoProcessorImpl::NumberDroppedFrames() { |
212 return num_dropped_frames_; | 186 return num_dropped_frames_; |
213 } | 187 } |
214 | 188 |
215 int VideoProcessorImpl::NumberSpatialResizes() { | 189 int VideoProcessorImpl::NumberSpatialResizes() { |
216 return num_spatial_resizes_; | 190 return num_spatial_resizes_; |
217 } | 191 } |
218 | 192 |
219 bool VideoProcessorImpl::ProcessFrame(int frame_number) { | 193 bool VideoProcessorImpl::ProcessFrame(int frame_number) { |
220 RTC_DCHECK_GE(frame_number, 0); | 194 RTC_DCHECK_GE(frame_number, 0); |
221 if (!initialized_) { | 195 RTC_CHECK(initialized_) << "Attempting to use uninitialized VideoProcessor"; |
222 fprintf(stderr, "Attempting to use uninitialized VideoProcessor!\n"); | 196 |
223 return false; | |
224 } | |
225 // |prev_time_stamp_| is used for getting number of dropped frames. | 197 // |prev_time_stamp_| is used for getting number of dropped frames. |
226 if (frame_number == 0) { | 198 if (frame_number == 0) { |
227 prev_time_stamp_ = -1; | 199 prev_time_stamp_ = -1; |
228 } | 200 } |
229 rtc::scoped_refptr<VideoFrameBuffer> buffer(frame_reader_->ReadFrame()); | 201 rtc::scoped_refptr<VideoFrameBuffer> buffer(frame_reader_->ReadFrame()); |
230 if (buffer) { | 202 if (buffer) { |
231 // Use the frame number as "timestamp" to identify frames | 203 // Use the frame number as "timestamp" to identify frames |
232 VideoFrame source_frame(buffer, frame_number, 0, webrtc::kVideoRotation_0); | 204 VideoFrame source_frame(buffer, frame_number, 0, webrtc::kVideoRotation_0); |
233 | 205 |
234 // Ensure we have a new statistics data object we can fill: | 206 // Ensure we have a new statistics data object we can fill: |
235 FrameStatistic& stat = stats_->NewFrame(frame_number); | 207 FrameStatistic& stat = stats_->NewFrame(frame_number); |
236 | 208 |
237 encode_start_ns_ = rtc::TimeNanos(); | 209 encode_start_ns_ = rtc::TimeNanos(); |
238 | 210 |
239 // Decide if we're going to force a keyframe: | 211 // Decide if we're going to force a keyframe: |
240 std::vector<FrameType> frame_types(1, kVideoFrameDelta); | 212 std::vector<FrameType> frame_types(1, kVideoFrameDelta); |
241 if (config_.keyframe_interval > 0 && | 213 if (config_.keyframe_interval > 0 && |
242 frame_number % config_.keyframe_interval == 0) { | 214 frame_number % config_.keyframe_interval == 0) { |
243 frame_types[0] = kVideoFrameKey; | 215 frame_types[0] = kVideoFrameKey; |
244 } | 216 } |
245 | 217 |
246 // For dropped frames, we regard them as zero size encoded frames. | 218 // For dropped frames, we regard them as zero size encoded frames. |
247 encoded_frame_size_ = 0; | 219 encoded_frame_size_ = 0; |
248 encoded_frame_type_ = kVideoFrameDelta; | 220 encoded_frame_type_ = kVideoFrameDelta; |
249 | 221 |
250 int32_t encode_result = encoder_->Encode(source_frame, NULL, &frame_types); | 222 int32_t encode_result = |
| 223 encoder_->Encode(source_frame, nullptr, &frame_types); |
251 | 224 |
252 if (encode_result != WEBRTC_VIDEO_CODEC_OK) { | 225 if (encode_result != WEBRTC_VIDEO_CODEC_OK) { |
253 fprintf(stderr, "Failed to encode frame %d, return code: %d\n", | 226 fprintf(stderr, "Failed to encode frame %d, return code: %d\n", |
254 frame_number, encode_result); | 227 frame_number, encode_result); |
255 } | 228 } |
256 stat.encode_return_code = encode_result; | 229 stat.encode_return_code = encode_result; |
257 return true; | 230 return true; |
258 } else { | 231 } else { |
259 return false; // we've reached the last frame | 232 return false; // we've reached the last frame |
260 } | 233 } |
261 } | 234 } |
262 | 235 |
263 void VideoProcessorImpl::FrameEncoded( | 236 void VideoProcessorImpl::FrameEncoded( |
264 webrtc::VideoCodecType codec, | 237 webrtc::VideoCodecType codec, |
265 const EncodedImage& encoded_image, | 238 const EncodedImage& encoded_image, |
266 const webrtc::RTPFragmentationHeader* fragmentation) { | 239 const webrtc::RTPFragmentationHeader* fragmentation) { |
267 // Timestamp is frame number, so this gives us #dropped frames. | 240 // Timestamp is frame number, so this gives us #dropped frames. |
268 int num_dropped_from_prev_encode = | 241 int num_dropped_from_prev_encode = |
269 encoded_image._timeStamp - prev_time_stamp_ - 1; | 242 encoded_image._timeStamp - prev_time_stamp_ - 1; |
270 num_dropped_frames_ += num_dropped_from_prev_encode; | 243 num_dropped_frames_ += num_dropped_from_prev_encode; |
271 prev_time_stamp_ = encoded_image._timeStamp; | 244 prev_time_stamp_ = encoded_image._timeStamp; |
272 if (num_dropped_from_prev_encode > 0) { | 245 if (num_dropped_from_prev_encode > 0) { |
273 // For dropped frames, we write out the last decoded frame to avoid getting | 246 // For dropped frames, we write out the last decoded frame to avoid getting |
274 // out of sync for the computation of PSNR and SSIM. | 247 // out of sync for the computation of PSNR and SSIM. |
275 for (int i = 0; i < num_dropped_from_prev_encode; i++) { | 248 for (int i = 0; i < num_dropped_from_prev_encode; i++) { |
276 frame_writer_->WriteFrame(last_successful_frame_buffer_); | 249 frame_writer_->WriteFrame(last_successful_frame_buffer_.get()); |
277 } | 250 } |
278 } | 251 } |
279 // Frame is not dropped, so update the encoded frame size | 252 // Frame is not dropped, so update the encoded frame size |
280 // (encoder callback is only called for non-zero length frames). | 253 // (encoder callback is only called for non-zero length frames). |
281 encoded_frame_size_ = encoded_image._length; | 254 encoded_frame_size_ = encoded_image._length; |
282 | 255 |
283 encoded_frame_type_ = encoded_image._frameType; | 256 encoded_frame_type_ = encoded_image._frameType; |
284 | 257 |
285 int64_t encode_stop_ns = rtc::TimeNanos(); | 258 int64_t encode_stop_ns = rtc::TimeNanos(); |
286 int frame_number = encoded_image._timeStamp; | 259 int frame_number = encoded_image._timeStamp; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 stat.packets_dropped = | 303 stat.packets_dropped = |
331 packet_manipulator_->ManipulatePackets(&copied_image); | 304 packet_manipulator_->ManipulatePackets(&copied_image); |
332 } | 305 } |
333 | 306 |
334 // Keep track of if frames are lost due to packet loss so we can tell | 307 // Keep track of if frames are lost due to packet loss so we can tell |
335 // this to the encoder (this is handled by the RTP logic in the full stack) | 308 // this to the encoder (this is handled by the RTP logic in the full stack) |
336 decode_start_ns_ = rtc::TimeNanos(); | 309 decode_start_ns_ = rtc::TimeNanos(); |
337 // TODO(kjellander): Pass fragmentation header to the decoder when | 310 // TODO(kjellander): Pass fragmentation header to the decoder when |
338 // CL 172001 has been submitted and PacketManipulator supports this. | 311 // CL 172001 has been submitted and PacketManipulator supports this. |
339 int32_t decode_result = | 312 int32_t decode_result = |
340 decoder_->Decode(copied_image, last_frame_missing_, NULL); | 313 decoder_->Decode(copied_image, last_frame_missing_, nullptr); |
341 stat.decode_return_code = decode_result; | 314 stat.decode_return_code = decode_result; |
342 if (decode_result != WEBRTC_VIDEO_CODEC_OK) { | 315 if (decode_result != WEBRTC_VIDEO_CODEC_OK) { |
343 // Write the last successful frame the output file to avoid getting it out | 316 // Write the last successful frame the output file to avoid getting it out |
344 // of sync with the source file for SSIM and PSNR comparisons: | 317 // of sync with the source file for SSIM and PSNR comparisons: |
345 frame_writer_->WriteFrame(last_successful_frame_buffer_); | 318 frame_writer_->WriteFrame(last_successful_frame_buffer_.get()); |
346 } | 319 } |
347 // save status for losses so we can inform the decoder for the next frame: | 320 // save status for losses so we can inform the decoder for the next frame: |
348 last_frame_missing_ = copied_image._length == 0; | 321 last_frame_missing_ = copied_image._length == 0; |
349 } | 322 } |
350 | 323 |
351 void VideoProcessorImpl::FrameDecoded(const VideoFrame& image) { | 324 void VideoProcessorImpl::FrameDecoded(const VideoFrame& image) { |
352 int64_t decode_stop_ns = rtc::TimeNanos(); | 325 int64_t decode_stop_ns = rtc::TimeNanos(); |
353 int frame_number = image.timestamp(); | 326 int frame_number = image.timestamp(); |
354 // Report stats | 327 // Report stats |
355 FrameStatistic& stat = stats_->stats_[frame_number]; | 328 FrameStatistic& stat = stats_->stats_[frame_number]; |
(...skipping 19 matching lines...) Expand all Loading... |
375 // Should be the same aspect ratio, no cropping needed. | 348 // Should be the same aspect ratio, no cropping needed. |
376 up_image->ScaleFrom(*image.video_frame_buffer()); | 349 up_image->ScaleFrom(*image.video_frame_buffer()); |
377 | 350 |
378 // TODO(mikhal): Extracting the buffer for now - need to update test. | 351 // TODO(mikhal): Extracting the buffer for now - need to update test. |
379 size_t length = | 352 size_t length = |
380 CalcBufferSize(kI420, up_image->width(), up_image->height()); | 353 CalcBufferSize(kI420, up_image->width(), up_image->height()); |
381 std::unique_ptr<uint8_t[]> image_buffer(new uint8_t[length]); | 354 std::unique_ptr<uint8_t[]> image_buffer(new uint8_t[length]); |
382 int extracted_length = ExtractBuffer(up_image, length, image_buffer.get()); | 355 int extracted_length = ExtractBuffer(up_image, length, image_buffer.get()); |
383 RTC_DCHECK_GT(extracted_length, 0); | 356 RTC_DCHECK_GT(extracted_length, 0); |
384 // Update our copy of the last successful frame: | 357 // Update our copy of the last successful frame: |
385 memcpy(last_successful_frame_buffer_, image_buffer.get(), extracted_length); | 358 memcpy(last_successful_frame_buffer_.get(), image_buffer.get(), |
| 359 extracted_length); |
386 bool write_success = frame_writer_->WriteFrame(image_buffer.get()); | 360 bool write_success = frame_writer_->WriteFrame(image_buffer.get()); |
387 RTC_DCHECK(write_success); | 361 RTC_DCHECK(write_success); |
388 if (!write_success) { | 362 if (!write_success) { |
389 fprintf(stderr, "Failed to write frame %d to disk!", frame_number); | 363 fprintf(stderr, "Failed to write frame %d to disk!", frame_number); |
390 } | 364 } |
391 } else { // No resize. | 365 } else { // No resize. |
392 // Update our copy of the last successful frame: | 366 // Update our copy of the last successful frame: |
393 // TODO(mikhal): Add as a member function, so won't be allocated per frame. | 367 // TODO(mikhal): Add as a member function, so won't be allocated per frame. |
394 size_t length = CalcBufferSize(kI420, image.width(), image.height()); | 368 size_t length = CalcBufferSize(kI420, image.width(), image.height()); |
395 std::unique_ptr<uint8_t[]> image_buffer(new uint8_t[length]); | 369 std::unique_ptr<uint8_t[]> image_buffer(new uint8_t[length]); |
396 int extracted_length = ExtractBuffer(image, length, image_buffer.get()); | 370 int extracted_length = ExtractBuffer(image, length, image_buffer.get()); |
397 RTC_DCHECK_GT(extracted_length, 0); | 371 RTC_DCHECK_GT(extracted_length, 0); |
398 memcpy(last_successful_frame_buffer_, image_buffer.get(), extracted_length); | 372 memcpy(last_successful_frame_buffer_.get(), image_buffer.get(), |
| 373 extracted_length); |
399 | 374 |
400 bool write_success = frame_writer_->WriteFrame(image_buffer.get()); | 375 bool write_success = frame_writer_->WriteFrame(image_buffer.get()); |
401 RTC_DCHECK(write_success); | 376 RTC_DCHECK(write_success); |
402 if (!write_success) { | 377 if (!write_success) { |
403 fprintf(stderr, "Failed to write frame %d to disk!", frame_number); | 378 fprintf(stderr, "Failed to write frame %d to disk!", frame_number); |
404 } | 379 } |
405 } | 380 } |
406 } | 381 } |
407 | 382 |
408 int VideoProcessorImpl::GetElapsedTimeMicroseconds(int64_t start, | 383 int VideoProcessorImpl::GetElapsedTimeMicroseconds(int64_t start, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 } | 415 } |
441 int32_t VideoProcessorImpl::VideoProcessorDecodeCompleteCallback::Decoded( | 416 int32_t VideoProcessorImpl::VideoProcessorDecodeCompleteCallback::Decoded( |
442 VideoFrame& image) { | 417 VideoFrame& image) { |
443 // Forward to parent class. | 418 // Forward to parent class. |
444 video_processor_->FrameDecoded(image); | 419 video_processor_->FrameDecoded(image); |
445 return 0; | 420 return 0; |
446 } | 421 } |
447 | 422 |
448 } // namespace test | 423 } // namespace test |
449 } // namespace webrtc | 424 } // namespace webrtc |
OLD | NEW |