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

Side by Side Diff: media/gpu/vaapi_video_encode_accelerator.cc

Issue 1996453003: RTC Video Encoder: Use capturer timestamp (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
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/gpu/vaapi_video_encode_accelerator.h" 5 #include "media/gpu/vaapi_video_encode_accelerator.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 target_data, buffer->shm->size(), &data_size)) { 548 target_data, buffer->shm->size(), &data_size)) {
549 NOTIFY_ERROR(kPlatformFailureError, "Failed downloading coded buffer"); 549 NOTIFY_ERROR(kPlatformFailureError, "Failed downloading coded buffer");
550 return; 550 return;
551 } 551 }
552 552
553 DVLOGF(3) << "Returning bitstream buffer " 553 DVLOGF(3) << "Returning bitstream buffer "
554 << (encode_job->keyframe ? "(keyframe)" : "") 554 << (encode_job->keyframe ? "(keyframe)" : "")
555 << " id: " << buffer->id << " size: " << data_size; 555 << " id: " << buffer->id << " size: " << data_size;
556 556
557 child_task_runner_->PostTask( 557 child_task_runner_->PostTask(
558 FROM_HERE, base::Bind(&Client::BitstreamBufferReady, client_, buffer->id, 558 FROM_HERE,
559 data_size, encode_job->keyframe)); 559 base::Bind(&Client::BitstreamBufferReady, client_, buffer->id, data_size,
560 encode_job->keyframe, encode_job->timestamp));
560 } 561 }
561 562
562 void VaapiVideoEncodeAccelerator::Encode( 563 void VaapiVideoEncodeAccelerator::Encode(
563 const scoped_refptr<media::VideoFrame>& frame, 564 const scoped_refptr<media::VideoFrame>& frame,
564 bool force_keyframe) { 565 bool force_keyframe) {
565 DVLOGF(3) << "Frame timestamp: " << frame->timestamp().InMilliseconds() 566 DVLOGF(3) << "Frame timestamp: " << frame->timestamp().InMilliseconds()
566 << " force_keyframe: " << force_keyframe; 567 << " force_keyframe: " << force_keyframe;
567 DCHECK(child_task_runner_->BelongsToCurrentThread()); 568 DCHECK(child_task_runner_->BelongsToCurrentThread());
568 569
569 encoder_thread_task_runner_->PostTask( 570 encoder_thread_task_runner_->PostTask(
570 FROM_HERE, base::Bind(&VaapiVideoEncodeAccelerator::EncodeTask, 571 FROM_HERE, base::Bind(&VaapiVideoEncodeAccelerator::EncodeTask,
571 base::Unretained(this), frame, force_keyframe)); 572 base::Unretained(this), frame, force_keyframe));
572 } 573 }
573 574
574 bool VaapiVideoEncodeAccelerator::PrepareNextJob() { 575 bool VaapiVideoEncodeAccelerator::PrepareNextJob(base::TimeDelta timestamp) {
575 if (available_va_surface_ids_.size() < kMinSurfacesToEncode) 576 if (available_va_surface_ids_.size() < kMinSurfacesToEncode)
576 return false; 577 return false;
577 578
578 DCHECK(!current_encode_job_); 579 DCHECK(!current_encode_job_);
579 current_encode_job_.reset(new EncodeJob()); 580 current_encode_job_.reset(new EncodeJob());
580 581
581 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_, 582 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_,
582 &current_encode_job_->coded_buffer)) { 583 &current_encode_job_->coded_buffer)) {
583 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); 584 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer");
584 return false; 585 return false;
585 } 586 }
586 587
588 current_encode_job_->timestamp = timestamp;
589
587 current_encode_job_->input_surface = new VASurface( 590 current_encode_job_->input_surface = new VASurface(
588 available_va_surface_ids_.back(), coded_size_, 591 available_va_surface_ids_.back(), coded_size_,
589 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); 592 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_);
590 available_va_surface_ids_.pop_back(); 593 available_va_surface_ids_.pop_back();
591 594
592 current_encode_job_->recon_surface = new VASurface( 595 current_encode_job_->recon_surface = new VASurface(
593 available_va_surface_ids_.back(), coded_size_, 596 available_va_surface_ids_.back(), coded_size_,
594 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); 597 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_);
595 available_va_surface_ids_.pop_back(); 598 available_va_surface_ids_.pop_back();
596 599
(...skipping 15 matching lines...) Expand all
612 make_linked_ptr(new InputFrameRef(frame, force_keyframe))); 615 make_linked_ptr(new InputFrameRef(frame, force_keyframe)));
613 EncodeFrameTask(); 616 EncodeFrameTask();
614 } 617 }
615 618
616 void VaapiVideoEncodeAccelerator::EncodeFrameTask() { 619 void VaapiVideoEncodeAccelerator::EncodeFrameTask() {
617 DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread()); 620 DCHECK(encoder_thread_task_runner_->BelongsToCurrentThread());
618 621
619 if (state_ != kEncoding || encoder_input_queue_.empty()) 622 if (state_ != kEncoding || encoder_input_queue_.empty())
620 return; 623 return;
621 624
622 if (!PrepareNextJob()) { 625 if (!PrepareNextJob(encoder_input_queue_.front()->frame->timestamp())) {
623 DVLOGF(4) << "Not ready for next frame yet"; 626 DVLOGF(4) << "Not ready for next frame yet";
624 return; 627 return;
625 } 628 }
626 629
627 linked_ptr<InputFrameRef> frame_ref = encoder_input_queue_.front(); 630 linked_ptr<InputFrameRef> frame_ref = encoder_input_queue_.front();
628 encoder_input_queue_.pop(); 631 encoder_input_queue_.pop();
629 632
630 if (!UploadFrame(frame_ref->frame)) { 633 if (!UploadFrame(frame_ref->frame)) {
631 NOTIFY_ERROR(kPlatformFailureError, "Failed uploading source frame to HW."); 634 NOTIFY_ERROR(kPlatformFailureError, "Failed uploading source frame to HW.");
632 return; 635 return;
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 client_ptr_factory_.reset(); 1055 client_ptr_factory_.reset();
1053 } 1056 }
1054 } 1057 }
1055 1058
1056 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob() 1059 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob()
1057 : coded_buffer(VA_INVALID_ID), keyframe(false) {} 1060 : coded_buffer(VA_INVALID_ID), keyframe(false) {}
1058 1061
1059 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() {} 1062 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() {}
1060 1063
1061 } // namespace media 1064 } // namespace media
OLDNEW
« no previous file with comments | « media/gpu/vaapi_video_encode_accelerator.h ('k') | media/gpu/video_encode_accelerator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698