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, | |
561 base::TimeDelta::FromMicroseconds(encode_job->timestamp))); | |
560 } | 562 } |
561 | 563 |
562 void VaapiVideoEncodeAccelerator::Encode( | 564 void VaapiVideoEncodeAccelerator::Encode( |
563 const scoped_refptr<media::VideoFrame>& frame, | 565 const scoped_refptr<media::VideoFrame>& frame, |
564 bool force_keyframe) { | 566 bool force_keyframe) { |
565 DVLOGF(3) << "Frame timestamp: " << frame->timestamp().InMilliseconds() | 567 DVLOGF(3) << "Frame timestamp: " << frame->timestamp().InMilliseconds() |
566 << " force_keyframe: " << force_keyframe; | 568 << " force_keyframe: " << force_keyframe; |
567 DCHECK(child_task_runner_->BelongsToCurrentThread()); | 569 DCHECK(child_task_runner_->BelongsToCurrentThread()); |
568 | 570 |
569 encoder_thread_task_runner_->PostTask( | 571 encoder_thread_task_runner_->PostTask( |
570 FROM_HERE, base::Bind(&VaapiVideoEncodeAccelerator::EncodeTask, | 572 FROM_HERE, base::Bind(&VaapiVideoEncodeAccelerator::EncodeTask, |
571 base::Unretained(this), frame, force_keyframe)); | 573 base::Unretained(this), frame, force_keyframe)); |
572 } | 574 } |
573 | 575 |
574 bool VaapiVideoEncodeAccelerator::PrepareNextJob() { | 576 bool VaapiVideoEncodeAccelerator::PrepareNextJob() { |
575 if (available_va_surface_ids_.size() < kMinSurfacesToEncode) | 577 if (available_va_surface_ids_.size() < kMinSurfacesToEncode) |
576 return false; | 578 return false; |
577 | 579 |
578 DCHECK(!current_encode_job_); | 580 DCHECK(!current_encode_job_); |
579 current_encode_job_.reset(new EncodeJob()); | 581 current_encode_job_.reset(new EncodeJob()); |
580 | 582 |
581 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_, | 583 if (!vaapi_wrapper_->CreateCodedBuffer(output_buffer_byte_size_, |
582 ¤t_encode_job_->coded_buffer)) { | 584 ¤t_encode_job_->coded_buffer)) { |
583 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); | 585 NOTIFY_ERROR(kPlatformFailureError, "Failed creating coded buffer"); |
584 return false; | 586 return false; |
585 } | 587 } |
586 | 588 |
589 current_encode_job_->timestamp = | |
590 encoder_input_queue_.front()->frame->InMicroseconds(); | |
Pawel Osciak
2016/05/26 07:39:23
I would prefer not accessing encoder_input_queue_
shenghao
2016/05/26 10:38:20
Done.
| |
591 | |
587 current_encode_job_->input_surface = new VASurface( | 592 current_encode_job_->input_surface = new VASurface( |
588 available_va_surface_ids_.back(), coded_size_, | 593 available_va_surface_ids_.back(), coded_size_, |
589 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); | 594 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); |
590 available_va_surface_ids_.pop_back(); | 595 available_va_surface_ids_.pop_back(); |
591 | 596 |
592 current_encode_job_->recon_surface = new VASurface( | 597 current_encode_job_->recon_surface = new VASurface( |
593 available_va_surface_ids_.back(), coded_size_, | 598 available_va_surface_ids_.back(), coded_size_, |
594 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); | 599 vaapi_wrapper_->va_surface_format(), va_surface_release_cb_); |
595 available_va_surface_ids_.pop_back(); | 600 available_va_surface_ids_.pop_back(); |
596 | 601 |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1052 client_ptr_factory_.reset(); | 1057 client_ptr_factory_.reset(); |
1053 } | 1058 } |
1054 } | 1059 } |
1055 | 1060 |
1056 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob() | 1061 VaapiVideoEncodeAccelerator::EncodeJob::EncodeJob() |
1057 : coded_buffer(VA_INVALID_ID), keyframe(false) {} | 1062 : coded_buffer(VA_INVALID_ID), keyframe(false) {} |
1058 | 1063 |
1059 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() {} | 1064 VaapiVideoEncodeAccelerator::EncodeJob::~EncodeJob() {} |
1060 | 1065 |
1061 } // namespace media | 1066 } // namespace media |
OLD | NEW |