• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #ifndef MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_
6 #define MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_
7 
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/sender/video_encoder.h"
13 #include "media/video/video_encode_accelerator.h"
14 
15 namespace media {
16 class VideoFrame;
17 }
18 
19 namespace media {
20 namespace cast {
21 
22 class LocalVideoEncodeAcceleratorClient;
23 
24 // This object is called external from the main cast thread and internally from
25 // the video encoder thread.
26 class ExternalVideoEncoder : public VideoEncoder {
27  public:
28   ExternalVideoEncoder(
29       scoped_refptr<CastEnvironment> cast_environment,
30       const VideoSenderConfig& video_config,
31       const CastInitializationCallback& initialization_cb,
32       const CreateVideoEncodeAcceleratorCallback& create_vea_cb,
33       const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb);
34 
35   virtual ~ExternalVideoEncoder();
36 
37   // Called from the main cast thread. This function post the encode task to the
38   // video encoder thread;
39   // The video_frame must be valid until the closure callback is called.
40   // The closure callback is called from the video encoder thread as soon as
41   // the encoder is done with the frame; it does not mean that the encoded frame
42   // has been sent out.
43   // Once the encoded frame is ready the frame_encoded_callback is called.
44   virtual bool EncodeVideoFrame(
45       const scoped_refptr<media::VideoFrame>& video_frame,
46       const base::TimeTicks& capture_time,
47       const FrameEncodedCallback& frame_encoded_callback) OVERRIDE;
48 
49   // The following functions are called from the main cast thread.
50   virtual void SetBitRate(int new_bit_rate) OVERRIDE;
51   virtual void GenerateKeyFrame() OVERRIDE;
52   virtual void LatestFrameIdToReference(uint32 frame_id) OVERRIDE;
53 
54   // Called when video_accelerator_client_ has finished creating the VEA and
55   // is ready for use.
56   void OnCreateVideoEncodeAccelerator(
57       scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner);
58 
59  protected:
60   // If |success| is true then encoder is initialized successfully.
61   // Otherwise encoder initialization failed.
62   void EncoderInitialized(bool success);
63   void EncoderError();
64 
65  private:
66   friend class LocalVideoEncodeAcceleratorClient;
67 
68   VideoSenderConfig video_config_;
69   scoped_refptr<CastEnvironment> cast_environment_;
70 
71   bool encoder_active_;
72   bool key_frame_requested_;
73 
74   scoped_refptr<LocalVideoEncodeAcceleratorClient> video_accelerator_client_;
75   scoped_refptr<base::SingleThreadTaskRunner> encoder_task_runner_;
76 
77   CastInitializationCallback initialization_cb_;
78 
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_;
83 
84   DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoder);
85 };
86 
87 }  // namespace cast
88 }  // namespace media
89 
90 #endif  // MEDIA_CAST_SENDER_EXTERNAL_VIDEO_ENCODER_H_
91