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

Side by Side Diff: webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.mm

Issue 2226383002: Fix regression for h264 VideoToolbox entering background. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 GetScaledBufferOnEncode(frame.video_frame_buffer())); 300 GetScaledBufferOnEncode(frame.video_frame_buffer()));
301 301
302 if (input_image->width() != width_ || input_image->height() != height_) { 302 if (input_image->width() != width_ || input_image->height() != height_) {
303 width_ = input_image->width(); 303 width_ = input_image->width();
304 height_ = input_image->height(); 304 height_ = input_image->height();
305 int ret = ResetCompressionSession(); 305 int ret = ResetCompressionSession();
306 if (ret < 0) 306 if (ret < 0)
307 return ret; 307 return ret;
308 } 308 }
309 309
310 // Get a pixel buffer from the pool and copy frame data over.
311 CVPixelBufferPoolRef pixel_buffer_pool =
312 VTCompressionSessionGetPixelBufferPool(compression_session_);
313 #if defined(WEBRTC_IOS)
314 if (!pixel_buffer_pool) {
315 // Kind of a hack. On backgrounding, the compression session seems to get
316 // invalidated, which causes this pool call to fail when the application
317 // is foregrounded and frames are being sent for encoding again.
318 // Resetting the session when this happens fixes the issue.
319 // In addition we request a keyframe so video can recover quickly.
320 ResetCompressionSession();
321 pixel_buffer_pool =
322 VTCompressionSessionGetPixelBufferPool(compression_session_);
323 is_keyframe_required = true;
324 LOG(LS_INFO) << "Resetting compression session due to invalid pool.";
325 }
326 #endif
327
310 CVPixelBufferRef pixel_buffer = 328 CVPixelBufferRef pixel_buffer =
311 static_cast<CVPixelBufferRef>(input_image->native_handle()); 329 static_cast<CVPixelBufferRef>(input_image->native_handle());
312 if (pixel_buffer) { 330 if (pixel_buffer) {
313 CVBufferRetain(pixel_buffer); 331 CVBufferRetain(pixel_buffer);
332 pixel_buffer_pool = nullptr;
314 } else { 333 } else {
315 // Get a pixel buffer from the pool and copy frame data over.
316 CVPixelBufferPoolRef pixel_buffer_pool =
317 VTCompressionSessionGetPixelBufferPool(compression_session_);
318 #if defined(WEBRTC_IOS)
319 if (!pixel_buffer_pool) {
320 // Kind of a hack. On backgrounding, the compression session seems to get
321 // invalidated, which causes this pool call to fail when the application
322 // is foregrounded and frames are being sent for encoding again.
323 // Resetting the session when this happens fixes the issue.
324 // In addition we request a keyframe so video can recover quickly.
325 ResetCompressionSession();
326 pixel_buffer_pool =
327 VTCompressionSessionGetPixelBufferPool(compression_session_);
328 is_keyframe_required = true;
329 }
330 #endif
331 if (!pixel_buffer_pool) { 334 if (!pixel_buffer_pool) {
332 LOG(LS_ERROR) << "Failed to get pixel buffer pool."; 335 LOG(LS_ERROR) << "Failed to get pixel buffer pool.";
333 return WEBRTC_VIDEO_CODEC_ERROR; 336 return WEBRTC_VIDEO_CODEC_ERROR;
334 } 337 }
335 CVReturn ret = CVPixelBufferPoolCreatePixelBuffer( 338 CVReturn ret = CVPixelBufferPoolCreatePixelBuffer(
336 nullptr, pixel_buffer_pool, &pixel_buffer); 339 nullptr, pixel_buffer_pool, &pixel_buffer);
337 if (ret != kCVReturnSuccess) { 340 if (ret != kCVReturnSuccess) {
338 LOG(LS_ERROR) << "Failed to create pixel buffer: " << ret; 341 LOG(LS_ERROR) << "Failed to create pixel buffer: " << ret;
339 // We probably want to drop frames here, since failure probably means 342 // We probably want to drop frames here, since failure probably means
340 // that the pool is empty. 343 // that the pool is empty.
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 if (result != 0) { 644 if (result != 0) {
642 LOG(LS_ERROR) << "Encode callback failed: " << result; 645 LOG(LS_ERROR) << "Encode callback failed: " << result;
643 return; 646 return;
644 } 647 }
645 bitrate_adjuster_.Update(frame._size); 648 bitrate_adjuster_.Update(frame._size);
646 } 649 }
647 650
648 } // namespace webrtc 651 } // namespace webrtc
649 652
650 #endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) 653 #endif // defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698