diff options
Diffstat (limited to 'chromium/media/cast/video_sender/external_video_encoder.h')
-rw-r--r-- | chromium/media/cast/video_sender/external_video_encoder.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/media/cast/video_sender/external_video_encoder.h b/chromium/media/cast/video_sender/external_video_encoder.h new file mode 100644 index 00000000000..29fe0c5fcdb --- /dev/null +++ b/chromium/media/cast/video_sender/external_video_encoder.h @@ -0,0 +1,86 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ +#define MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ + +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "media/cast/cast_config.h" +#include "media/cast/cast_environment.h" +#include "media/cast/video_sender/video_encoder.h" +#include "media/video/video_encode_accelerator.h" + +namespace media { +class VideoFrame; +} + +namespace media { +namespace cast { + +class LocalVideoEncodeAcceleratorClient; + +// This object is called external from the main cast thread and internally from +// the video encoder thread. +class ExternalVideoEncoder : public VideoEncoder { + public: + ExternalVideoEncoder( + scoped_refptr<CastEnvironment> cast_environment, + const VideoSenderConfig& video_config, + const CreateVideoEncodeAcceleratorCallback& create_vea_cb, + const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb); + + virtual ~ExternalVideoEncoder(); + + // Called from the main cast thread. This function post the encode task to the + // video encoder thread; + // The video_frame must be valid until the closure callback is called. + // The closure callback is called from the video encoder thread as soon as + // the encoder is done with the frame; it does not mean that the encoded frame + // has been sent out. + // Once the encoded frame is ready the frame_encoded_callback is called. + virtual bool EncodeVideoFrame( + const scoped_refptr<media::VideoFrame>& video_frame, + const base::TimeTicks& capture_time, + const FrameEncodedCallback& frame_encoded_callback) OVERRIDE; + + // The following functions are called from the main cast thread. + virtual void SetBitRate(int new_bit_rate) OVERRIDE; + virtual void GenerateKeyFrame() OVERRIDE; + virtual void LatestFrameIdToReference(uint32 frame_id) OVERRIDE; + + // Called when a VEA is created. + void OnCreateVideoEncodeAccelerator( + const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, + scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner, + scoped_ptr<media::VideoEncodeAccelerator> vea); + + protected: + void EncoderInitialized(); + void EncoderError(); + + private: + friend class LocalVideoEncodeAcceleratorClient; + + VideoSenderConfig video_config_; + scoped_refptr<CastEnvironment> cast_environment_; + + bool encoder_active_; + bool key_frame_requested_; + + scoped_refptr<LocalVideoEncodeAcceleratorClient> video_accelerator_client_; + scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner_; + + // Weak pointer factory for posting back LocalVideoEncodeAcceleratorClient + // notifications to ExternalVideoEncoder. + // NOTE: Weak pointers must be invalidated before all other member variables. + base::WeakPtrFactory<ExternalVideoEncoder> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoder); +}; + +} // namespace cast +} // namespace media + +#endif // MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_ |