| Index: media/cast/video_sender/video_encoder_impl.cc
|
| diff --git a/media/cast/video_sender/video_encoder_impl.cc b/media/cast/video_sender/video_encoder_impl.cc
|
| index 88e49cecf8c31e26e6a0c53a662931342c09b06f..b852b97ef368c6389a352e53deaef5c64cb6d613 100644
|
| --- a/media/cast/video_sender/video_encoder_impl.cc
|
| +++ b/media/cast/video_sender/video_encoder_impl.cc
|
| @@ -5,6 +5,8 @@
|
| #include "media/cast/video_sender/video_encoder.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/callback.h"
|
| #include "base/logging.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "media/base/video_frame.h"
|
| @@ -14,13 +16,67 @@
|
| namespace media {
|
| namespace cast {
|
|
|
| +namespace {
|
| +
|
| +typedef base::Callback<void(Vp8Encoder*)> PassEncoderCallback;
|
| +
|
| void LogFrameEncodedEvent(const base::TimeTicks& now,
|
| - CastEnvironment* const cast_environment,
|
| + scoped_refptr<CastEnvironment> cast_environment,
|
| const base::TimeTicks& capture_time) {
|
| + DCHECK(cast_environment->CurrentlyOn(CastEnvironment::MAIN));
|
| cast_environment->Logging()->InsertFrameEvent(now, kVideoFrameEncoded,
|
| GetVideoRtpTimestamp(capture_time), kFrameIdUnknown);
|
| }
|
|
|
| +void InitializeVp8EncoderOnEncoderThread(
|
| + const scoped_refptr<CastEnvironment>& environment,
|
| + Vp8Encoder* vp8_encoder) {
|
| + DCHECK(environment->CurrentlyOn(CastEnvironment::VIDEO_ENCODER));
|
| + vp8_encoder->Initialize();
|
| +}
|
| +
|
| +void EncodeVideoFrameOnEncoderThread(
|
| + scoped_refptr<CastEnvironment> environment,
|
| + Vp8Encoder* vp8_encoder,
|
| + const scoped_refptr<media::VideoFrame>& video_frame,
|
| + const base::TimeTicks& capture_time,
|
| + const VideoEncoderImpl::CodecDynamicConfig& dynamic_config,
|
| + const VideoEncoderImpl::FrameEncodedCallback& frame_encoded_callback) {
|
| + DCHECK(environment->CurrentlyOn(CastEnvironment::VIDEO_ENCODER));
|
| + if (dynamic_config.key_frame_requested) {
|
| + vp8_encoder->GenerateKeyFrame();
|
| + }
|
| + vp8_encoder->LatestFrameIdToReference(
|
| + dynamic_config.latest_frame_id_to_reference);
|
| + vp8_encoder->UpdateRates(dynamic_config.bit_rate);
|
| +
|
| + scoped_ptr<transport::EncodedVideoFrame> encoded_frame(
|
| + new transport::EncodedVideoFrame());
|
| + bool retval = vp8_encoder->Encode(video_frame, encoded_frame.get());
|
| +
|
| + base::TimeTicks now = environment->Clock()->NowTicks();
|
| + environment->PostTask(
|
| + CastEnvironment::MAIN, FROM_HERE,
|
| + base::Bind(LogFrameEncodedEvent, now, environment, capture_time));
|
| +
|
| + if (!retval) {
|
| + VLOG(1) << "Encoding failed";
|
| + return;
|
| + }
|
| + if (encoded_frame->data.size() <= 0) {
|
| + VLOG(1) << "Encoding resulted in an empty frame";
|
| + return;
|
| + }
|
| + environment->PostTask(
|
| + CastEnvironment::MAIN, FROM_HERE,
|
| + base::Bind(
|
| + frame_encoded_callback,
|
| + base::Passed(&encoded_frame),
|
| + capture_time));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| VideoEncoderImpl::VideoEncoderImpl(
|
| scoped_refptr<CastEnvironment> cast_environment,
|
| const VideoSenderConfig& video_config,
|
| @@ -31,6 +87,12 @@ VideoEncoderImpl::VideoEncoderImpl(
|
| skip_count_(0) {
|
| if (video_config.codec == transport::kVp8) {
|
| vp8_encoder_.reset(new Vp8Encoder(video_config, max_unacked_frames));
|
| + cast_environment_->PostTask(
|
| + CastEnvironment::VIDEO_ENCODER, FROM_HERE,
|
| + base::Bind(
|
| + &InitializeVp8EncoderOnEncoderThread,
|
| + cast_environment,
|
| + vp8_encoder_.get()));
|
| } else {
|
| DCHECK(false) << "Invalid config"; // Codec not supported.
|
| }
|
| @@ -40,7 +102,14 @@ VideoEncoderImpl::VideoEncoderImpl(
|
| dynamic_config_.bit_rate = video_config.start_bitrate;
|
| }
|
|
|
| -VideoEncoderImpl::~VideoEncoderImpl() {}
|
| +VideoEncoderImpl::~VideoEncoderImpl() {
|
| + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN));
|
| + if (vp8_encoder_) {
|
| + cast_environment_->PostTask(
|
| + CastEnvironment::VIDEO_ENCODER, FROM_HERE,
|
| + base::Bind(&base::DeletePointer<Vp8Encoder>, vp8_encoder_.release()));
|
| + }
|
| +}
|
|
|
| bool VideoEncoderImpl::EncodeVideoFrame(
|
| const scoped_refptr<media::VideoFrame>& video_frame,
|
| @@ -60,48 +129,18 @@ bool VideoEncoderImpl::EncodeVideoFrame(
|
| cast_environment_->Logging()->InsertFrameEvent(now, kVideoFrameSentToEncoder,
|
| GetVideoRtpTimestamp(capture_time), kFrameIdUnknown);
|
| cast_environment_->PostTask(CastEnvironment::VIDEO_ENCODER, FROM_HERE,
|
| - base::Bind(&VideoEncoderImpl::EncodeVideoFrameEncoderThread,
|
| - base::Unretained(this), video_frame, capture_time,
|
| - dynamic_config_, frame_encoded_callback));
|
| + base::Bind(&EncodeVideoFrameOnEncoderThread,
|
| + cast_environment_,
|
| + vp8_encoder_.get(),
|
| + video_frame,
|
| + capture_time,
|
| + dynamic_config_,
|
| + frame_encoded_callback));
|
|
|
| dynamic_config_.key_frame_requested = false;
|
| return true;
|
| }
|
|
|
| -void VideoEncoderImpl::EncodeVideoFrameEncoderThread(
|
| - const scoped_refptr<media::VideoFrame>& video_frame,
|
| - const base::TimeTicks& capture_time,
|
| - const CodecDynamicConfig& dynamic_config,
|
| - const FrameEncodedCallback& frame_encoded_callback) {
|
| - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::VIDEO_ENCODER));
|
| - if (dynamic_config.key_frame_requested) {
|
| - vp8_encoder_->GenerateKeyFrame();
|
| - }
|
| - vp8_encoder_->LatestFrameIdToReference(
|
| - dynamic_config.latest_frame_id_to_reference);
|
| - vp8_encoder_->UpdateRates(dynamic_config.bit_rate);
|
| -
|
| - scoped_ptr<transport::EncodedVideoFrame> encoded_frame(
|
| - new transport::EncodedVideoFrame());
|
| - bool retval = vp8_encoder_->Encode(video_frame, encoded_frame.get());
|
| -
|
| - base::TimeTicks now = cast_environment_->Clock()->NowTicks();
|
| - cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
|
| - base::Bind(LogFrameEncodedEvent, now, cast_environment_, capture_time));
|
| -
|
| - if (!retval) {
|
| - VLOG(1) << "Encoding failed";
|
| - return;
|
| - }
|
| - if (encoded_frame->data.size() <= 0) {
|
| - VLOG(1) << "Encoding resulted in an empty frame";
|
| - return;
|
| - }
|
| - cast_environment_->PostTask(CastEnvironment::MAIN, FROM_HERE,
|
| - base::Bind(frame_encoded_callback,
|
| - base::Passed(&encoded_frame), capture_time));
|
| -}
|
| -
|
| // Inform the encoder about the new target bit rate.
|
| void VideoEncoderImpl::SetBitRate(int new_bit_rate) {
|
| dynamic_config_.bit_rate = new_bit_rate;
|
|
|