| OLD | NEW |
| 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 Loading... |
| 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 ¤t_encode_job_->coded_buffer)) { | 583 ¤t_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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |