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

Side by Side Diff: media/cast/sender/h264_vt_encoder.cc

Issue 863083002: [cast] Add optional VideoEncoder method to flush frames. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 10 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 | « media/cast/sender/h264_vt_encoder.h ('k') | media/cast/sender/video_encoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "media/cast/sender/h264_vt_encoder.h" 5 #include "media/cast/sender/h264_vt_encoder.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/big_endian.h" 10 #include "base/big_endian.h"
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 video_config.max_frame_rate); 328 video_config.max_frame_rate);
329 SetSessionProperty( 329 SetSessionProperty(
330 videotoolbox_glue_->kVTCompressionPropertyKey_ColorPrimaries(), 330 videotoolbox_glue_->kVTCompressionPropertyKey_ColorPrimaries(),
331 kCVImageBufferColorPrimaries_ITU_R_709_2); 331 kCVImageBufferColorPrimaries_ITU_R_709_2);
332 SetSessionProperty( 332 SetSessionProperty(
333 videotoolbox_glue_->kVTCompressionPropertyKey_TransferFunction(), 333 videotoolbox_glue_->kVTCompressionPropertyKey_TransferFunction(),
334 kCVImageBufferTransferFunction_ITU_R_709_2); 334 kCVImageBufferTransferFunction_ITU_R_709_2);
335 SetSessionProperty( 335 SetSessionProperty(
336 videotoolbox_glue_->kVTCompressionPropertyKey_YCbCrMatrix(), 336 videotoolbox_glue_->kVTCompressionPropertyKey_YCbCrMatrix(),
337 kCVImageBufferYCbCrMatrix_ITU_R_709_2); 337 kCVImageBufferYCbCrMatrix_ITU_R_709_2);
338 if (video_config.max_number_of_video_buffers_used > 0) {
339 SetSessionProperty(
340 videotoolbox_glue_->kVTCompressionPropertyKey_MaxFrameDelayCount(),
341 video_config.max_number_of_video_buffers_used);
342 }
338 } 343 }
339 344
340 void H264VideoToolboxEncoder::Teardown() { 345 void H264VideoToolboxEncoder::Teardown() {
341 DCHECK(thread_checker_.CalledOnValidThread()); 346 DCHECK(thread_checker_.CalledOnValidThread());
342 347
343 // If the compression session exists, invalidate it. This blocks until all 348 // If the compression session exists, invalidate it. This blocks until all
344 // pending output callbacks have returned and any internal threads have 349 // pending output callbacks have returned and any internal threads have
345 // joined, ensuring no output callback ever sees a dangling encoder pointer. 350 // joined, ensuring no output callback ever sees a dangling encoder pointer.
346 if (compression_session_) { 351 if (compression_session_) {
347 videotoolbox_glue_->VTCompressionSessionInvalidate(compression_session_); 352 videotoolbox_glue_->VTCompressionSessionInvalidate(compression_session_);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 scoped_ptr<VideoFrameFactory> 428 scoped_ptr<VideoFrameFactory>
424 H264VideoToolboxEncoder::CreateVideoFrameFactory() { 429 H264VideoToolboxEncoder::CreateVideoFrameFactory() {
425 base::ScopedCFTypeRef<CVPixelBufferPoolRef> pool( 430 base::ScopedCFTypeRef<CVPixelBufferPoolRef> pool(
426 videotoolbox_glue_->VTCompressionSessionGetPixelBufferPool( 431 videotoolbox_glue_->VTCompressionSessionGetPixelBufferPool(
427 compression_session_), 432 compression_session_),
428 base::scoped_policy::RETAIN); 433 base::scoped_policy::RETAIN);
429 return scoped_ptr<VideoFrameFactory>( 434 return scoped_ptr<VideoFrameFactory>(
430 new VideoFrameFactoryCVPixelBufferPoolImpl(pool)); 435 new VideoFrameFactoryCVPixelBufferPoolImpl(pool));
431 } 436 }
432 437
438 void H264VideoToolboxEncoder::EmitFrames() {
439 DCHECK(thread_checker_.CalledOnValidThread());
440
441 if (!compression_session_) {
442 DLOG(ERROR) << " compression session is null";
443 return;
444 }
445
446 OSStatus status = videotoolbox_glue_->VTCompressionSessionCompleteFrames(
447 compression_session_, CoreMediaGlue::CMTime{0, 0, 0, 0});
448 if (status != noErr) {
449 DLOG(ERROR) << " VTCompressionSessionCompleteFrames failed: " << status;
450 }
451 }
452
433 bool H264VideoToolboxEncoder::SetSessionProperty(CFStringRef key, 453 bool H264VideoToolboxEncoder::SetSessionProperty(CFStringRef key,
434 int32_t value) { 454 int32_t value) {
435 base::ScopedCFTypeRef<CFNumberRef> cfvalue( 455 base::ScopedCFTypeRef<CFNumberRef> cfvalue(
436 CFNumberCreate(nullptr, kCFNumberSInt32Type, &value)); 456 CFNumberCreate(nullptr, kCFNumberSInt32Type, &value));
437 return videotoolbox_glue_->VTSessionSetProperty(compression_session_, key, 457 return videotoolbox_glue_->VTSessionSetProperty(compression_session_, key,
438 cfvalue) == noErr; 458 cfvalue) == noErr;
439 } 459 }
440 460
441 bool H264VideoToolboxEncoder::SetSessionProperty(CFStringRef key, bool value) { 461 bool H264VideoToolboxEncoder::SetSessionProperty(CFStringRef key, bool value) {
442 CFBooleanRef cfvalue = (value) ? kCFBooleanTrue : kCFBooleanFalse; 462 CFBooleanRef cfvalue = (value) ? kCFBooleanTrue : kCFBooleanFalse;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 CopySampleBufferToAnnexBBuffer(sbuf, &encoded_frame->data, keyframe); 525 CopySampleBufferToAnnexBBuffer(sbuf, &encoded_frame->data, keyframe);
506 526
507 encoder->cast_environment_->PostTask( 527 encoder->cast_environment_->PostTask(
508 CastEnvironment::MAIN, FROM_HERE, 528 CastEnvironment::MAIN, FROM_HERE,
509 base::Bind(request->frame_encoded_callback, 529 base::Bind(request->frame_encoded_callback,
510 base::Passed(&encoded_frame))); 530 base::Passed(&encoded_frame)));
511 } 531 }
512 532
513 } // namespace cast 533 } // namespace cast
514 } // namespace media 534 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/sender/h264_vt_encoder.h ('k') | media/cast/sender/video_encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698