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
3 // found in the LICENSE file.
5 #ifndef MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_
6 #define MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/weak_ptr.h"
10 #include "media/cast/cast_config.h"
11 #include "media/cast/cast_environment.h"
12 #include "media/cast/video_sender/video_encoder.h"
13 #include "media/video/video_encode_accelerator.h"
22 class LocalVideoEncodeAcceleratorClient
;
24 // This object is called external from the main cast thread and internally from
25 // the video encoder thread.
26 class ExternalVideoEncoder
: public VideoEncoder
{
29 scoped_refptr
<CastEnvironment
> cast_environment
,
30 const VideoSenderConfig
& video_config
,
31 const CreateVideoEncodeAcceleratorCallback
& create_vea_cb
,
32 const CreateVideoEncodeMemoryCallback
& create_video_encode_mem_cb
);
34 virtual ~ExternalVideoEncoder();
36 // Called from the main cast thread. This function post the encode task to the
37 // video encoder thread;
38 // The video_frame must be valid until the closure callback is called.
39 // The closure callback is called from the video encoder thread as soon as
40 // the encoder is done with the frame; it does not mean that the encoded frame
42 // Once the encoded frame is ready the frame_encoded_callback is called.
43 virtual bool EncodeVideoFrame(
44 const scoped_refptr
<media::VideoFrame
>& video_frame
,
45 const base::TimeTicks
& capture_time
,
46 const FrameEncodedCallback
& frame_encoded_callback
) OVERRIDE
;
48 // The following functions are called from the main cast thread.
49 virtual void SetBitRate(int new_bit_rate
) OVERRIDE
;
50 virtual void SkipNextFrame(bool skip_next_frame
) OVERRIDE
;
51 virtual void GenerateKeyFrame() OVERRIDE
;
52 virtual void LatestFrameIdToReference(uint32 frame_id
) OVERRIDE
;
53 virtual int NumberOfSkippedFrames() const OVERRIDE
;
55 // Called when a VEA is created.
56 void OnCreateVideoEncodeAccelerator(
57 const CreateVideoEncodeMemoryCallback
& create_video_encode_mem_cb
,
58 scoped_refptr
<base::SingleThreadTaskRunner
> encoder_task_runner
,
59 scoped_ptr
<media::VideoEncodeAccelerator
> vea
);
62 void EncoderInitialized();
66 friend class LocalVideoEncodeAcceleratorClient
;
68 const VideoSenderConfig video_config_
;
69 scoped_refptr
<CastEnvironment
> cast_environment_
;
72 bool key_frame_requested_
;
73 bool skip_next_frame_
;
76 scoped_refptr
<LocalVideoEncodeAcceleratorClient
> video_accelerator_client_
;
77 scoped_refptr
<base::SingleThreadTaskRunner
> encoder_task_runner_
;
79 // Weak pointer factory for posting back LocalVideoEncodeAcceleratorClient
80 // notifications to ExternalVideoEncoder.
81 // NOTE: Weak pointers must be invalidated before all other member variables.
82 base::WeakPtrFactory
<ExternalVideoEncoder
> weak_factory_
;
84 DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoder
);
90 #endif // MEDIA_CAST_VIDEO_SENDER_EXTERNAL_VIDEO_ENCODER_H_