Index: media/cast/sender/external_video_encoder.cc |
diff --git a/media/cast/sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc |
index d09dcfe24710458c3e9a65689dd74c227e83e881..c5685e5005a7ed6466429f5abef9206577b5f9cc 100644 |
--- a/media/cast/sender/external_video_encoder.cc |
+++ b/media/cast/sender/external_video_encoder.cc |
@@ -63,10 +63,12 @@ class ExternalVideoEncoder::VEAClientImpl |
const scoped_refptr<base::SingleThreadTaskRunner>& encoder_task_runner, |
scoped_ptr<media::VideoEncodeAccelerator> vea, |
int max_frame_rate, |
+ const StatusChangeCallback& status_change_cb, |
const CreateVideoEncodeMemoryCallback& create_video_encode_memory_cb) |
: cast_environment_(cast_environment), |
task_runner_(encoder_task_runner), |
max_frame_rate_(max_frame_rate), |
+ status_change_cb_(status_change_cb), |
create_video_encode_memory_cb_(create_video_encode_memory_cb), |
video_encode_accelerator_(vea.Pass()), |
encoder_active_(false), |
@@ -80,8 +82,7 @@ class ExternalVideoEncoder::VEAClientImpl |
void Initialize(const gfx::Size& frame_size, |
VideoCodecProfile codec_profile, |
- int start_bit_rate, |
- const CastInitializationCallback& initialization_cb) { |
+ int start_bit_rate) { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
DCHECK(!frame_size.IsEmpty()); |
@@ -95,14 +96,12 @@ class ExternalVideoEncoder::VEAClientImpl |
UMA_HISTOGRAM_BOOLEAN("Cast.Sender.VideoEncodeAcceleratorInitializeSuccess", |
encoder_active_); |
- if (!initialization_cb.is_null()) { |
- cast_environment_->PostTask( |
- CastEnvironment::MAIN, |
- FROM_HERE, |
- base::Bind(initialization_cb, |
- encoder_active_ ? STATUS_VIDEO_INITIALIZED : |
- STATUS_HW_VIDEO_ENCODER_NOT_SUPPORTED)); |
- } |
+ cast_environment_->PostTask( |
+ CastEnvironment::MAIN, |
+ FROM_HERE, |
+ base::Bind(status_change_cb_, |
+ encoder_active_ ? STATUS_INITIALIZED : |
+ STATUS_CODEC_INIT_FAILED)); |
} |
void SetBitRate(int bit_rate) { |
@@ -134,11 +133,17 @@ class ExternalVideoEncoder::VEAClientImpl |
protected: |
void NotifyError(VideoEncodeAccelerator::Error error) override { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
- VLOG(1) << "ExternalVideoEncoder NotifyError: " << error; |
+ |
+ DCHECK(error != VideoEncodeAccelerator::kInvalidArgumentError && |
+ error != VideoEncodeAccelerator::kIllegalStateError); |
encoder_active_ = false; |
- // TODO(miu): Plumbing is required to bubble this up to the CastSession and |
- // beyond. |
+ |
+ cast_environment_->PostTask( |
+ CastEnvironment::MAIN, |
+ FROM_HERE, |
+ base::Bind(status_change_cb_, STATUS_CODEC_RUNTIME_ERROR)); |
+ |
// TODO(miu): Force-flush all |in_progress_frame_encodes_| immediately so |
// pending frames do not become stuck, freezing VideoSender. |
} |
@@ -281,6 +286,7 @@ class ExternalVideoEncoder::VEAClientImpl |
const scoped_refptr<CastEnvironment> cast_environment_; |
const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
const int max_frame_rate_; |
+ const StatusChangeCallback status_change_cb_; // Must be run on MAIN thread. |
const CreateVideoEncodeMemoryCallback create_video_encode_memory_cb_; |
scoped_ptr<media::VideoEncodeAccelerator> video_encode_accelerator_; |
bool encoder_active_; |
@@ -301,7 +307,7 @@ ExternalVideoEncoder::ExternalVideoEncoder( |
const scoped_refptr<CastEnvironment>& cast_environment, |
const VideoSenderConfig& video_config, |
const gfx::Size& frame_size, |
- const CastInitializationCallback& initialization_cb, |
+ const StatusChangeCallback& status_change_cb, |
const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
const CreateVideoEncodeMemoryCallback& create_video_encode_memory_cb) |
: cast_environment_(cast_environment), |
@@ -312,6 +318,7 @@ ExternalVideoEncoder::ExternalVideoEncoder( |
DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
DCHECK_GT(video_config.max_frame_rate, 0); |
DCHECK(!frame_size.IsEmpty()); |
+ DCHECK(!status_change_cb.is_null()); |
DCHECK(!create_vea_cb.is_null()); |
DCHECK(!create_video_encode_memory_cb_.is_null()); |
DCHECK_GT(bit_rate_, 0); |
@@ -331,7 +338,7 @@ ExternalVideoEncoder::ExternalVideoEncoder( |
cast_environment_->PostTask( |
CastEnvironment::MAIN, |
FROM_HERE, |
- base::Bind(initialization_cb, STATUS_HW_VIDEO_ENCODER_NOT_SUPPORTED)); |
+ base::Bind(status_change_cb, STATUS_UNSUPPORTED_CODEC)); |
return; |
} |
@@ -341,7 +348,7 @@ ExternalVideoEncoder::ExternalVideoEncoder( |
frame_size, |
codec_profile, |
video_config.max_frame_rate, |
- initialization_cb)); |
+ status_change_cb)); |
} |
ExternalVideoEncoder::~ExternalVideoEncoder() { |
@@ -397,7 +404,7 @@ void ExternalVideoEncoder::OnCreateVideoEncodeAccelerator( |
const gfx::Size& frame_size, |
VideoCodecProfile codec_profile, |
int max_frame_rate, |
- const CastInitializationCallback& initialization_cb, |
+ const StatusChangeCallback& status_change_cb, |
scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner, |
scoped_ptr<media::VideoEncodeAccelerator> vea) { |
DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
@@ -406,12 +413,10 @@ void ExternalVideoEncoder::OnCreateVideoEncodeAccelerator( |
// system does not support or lacks the resources to provide GPU-accelerated |
// video encoding. |
if (!encoder_task_runner || !vea) { |
- if (!initialization_cb.is_null()) { |
- cast_environment_->PostTask( |
- CastEnvironment::MAIN, |
- FROM_HERE, |
- base::Bind(initialization_cb, STATUS_INVALID_VIDEO_CONFIGURATION)); |
- } |
+ cast_environment_->PostTask( |
+ CastEnvironment::MAIN, |
+ FROM_HERE, |
+ base::Bind(status_change_cb, STATUS_CODEC_INIT_FAILED)); |
return; |
} |
@@ -420,14 +425,14 @@ void ExternalVideoEncoder::OnCreateVideoEncodeAccelerator( |
encoder_task_runner, |
vea.Pass(), |
max_frame_rate, |
+ status_change_cb, |
create_video_encode_memory_cb_); |
client_->task_runner()->PostTask(FROM_HERE, |
base::Bind(&VEAClientImpl::Initialize, |
client_, |
frame_size, |
codec_profile, |
- bit_rate_, |
- initialization_cb)); |
+ bit_rate_)); |
} |
} // namespace cast |