Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1936)

Unified Diff: content/renderer/media_recorder/video_track_recorder.h

Issue 2793303003: Refactor VideoTrackRecorder into smaller classes (Closed)
Patch Set: Rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media_recorder/video_track_recorder.h
diff --git a/content/renderer/media_recorder/video_track_recorder.h b/content/renderer/media_recorder/video_track_recorder.h
index 542c3b78a1d739f974449b38f124602805139fdc..53a871f32512a7e4a4a23462fa26e568ac1c6fcc 100644
--- a/content/renderer/media_recorder/video_track_recorder.h
+++ b/content/renderer/media_recorder/video_track_recorder.h
@@ -16,8 +16,18 @@
#include "content/public/renderer/media_stream_video_sink.h"
#include "media/muxers/webm_muxer.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+namespace base {
+class Thread;
+} // namespace base
+
+namespace cc {
+class PaintCanvas;
+} // namespace cc
namespace media {
+class SkCanvasVideoRenderer;
class VideoFrame;
} // namespace media
@@ -46,7 +56,6 @@ class CONTENT_EXPORT VideoTrackRecorder
#endif
LAST
};
- class Encoder;
using OnEncodedVideoCB =
base::Callback<void(const media::WebmMuxer::VideoParameters& params,
@@ -56,6 +65,89 @@ class CONTENT_EXPORT VideoTrackRecorder
bool is_key_frame)>;
using OnErrorCB = base::Closure;
+ // Base class to describe a generic Encoder, encapsulating all actual encoder
+ // (re)configurations, encoding and delivery of received frames. This class is
+ // ref-counted to allow the MediaStreamVideoTrack to hold a reference to it
+ // (via the callback that MediaStreamVideoSink passes along) and to jump back
+ // and forth to an internal encoder thread. Moreover, this class:
+ // - is created on its parent's thread (usually the main Render thread), that
+ // is, |main_task_runner_|.
+ // - receives VideoFrames on |origin_task_runner_| and runs OnEncodedVideoCB
+ // on that thread as well. This task runner is cached on first frame arrival,
+ // and is supposed to be the render IO thread (but this is not enforced);
+ // - uses an internal |encoding_task_runner_| for actual encoder interactions,
+ // namely configuration, encoding (which might take some time) and
+ // destruction. This task runner can be passed on the creation. If nothing is
+ // passed, a new encoding thread is created and used.
+ class Encoder : public base::RefCountedThreadSafe<Encoder> {
+ public:
+ Encoder(const OnEncodedVideoCB& on_encoded_video_callback,
+ int32_t bits_per_second,
+ scoped_refptr<base::SingleThreadTaskRunner> encoding_task_runner =
+ nullptr);
+
+ // Start encoding |frame|, returning via |on_encoded_video_callback_|. This
+ // call will also trigger an encode configuration upon first frame arrival
+ // or parameter change, and an EncodeOnEncodingTaskRunner() to actually
+ // encode the frame. If the |frame|'s data is not directly available (e.g.
+ // it's a texture) then RetrieveFrameOnMainThread() is called, and if even
+ // that fails, black frames are sent instead.
+ void StartFrameEncode(const scoped_refptr<media::VideoFrame>& frame,
+ base::TimeTicks capture_timestamp);
+ void RetrieveFrameOnMainThread(
+ const scoped_refptr<media::VideoFrame>& video_frame,
+ base::TimeTicks capture_timestamp);
+
+ static void OnFrameEncodeCompleted(
+ const VideoTrackRecorder::OnEncodedVideoCB& on_encoded_video_cb,
+ const media::WebmMuxer::VideoParameters& params,
+ std::unique_ptr<std::string> data,
+ std::unique_ptr<std::string> alpha_data,
+ base::TimeTicks capture_timestamp,
+ bool keyframe);
+
+ void SetPaused(bool paused);
+ virtual bool CanEncodeAlphaChannel();
+
+ protected:
+ friend class base::RefCountedThreadSafe<Encoder>;
+ virtual ~Encoder();
+
+ virtual void EncodeOnEncodingTaskRunner(
+ scoped_refptr<media::VideoFrame> frame,
+ base::TimeTicks capture_timestamp) = 0;
+
+ // Used to shutdown properly on the same thread we were created.
+ const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
+
+ // Task runner where frames to encode and reply callbacks must happen.
+ scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_;
+
+ // Task runner where encoding interactions happen.
+ scoped_refptr<base::SingleThreadTaskRunner> encoding_task_runner_;
+
+ // Optional thread for encoding. Active for the lifetime of VpxEncoder.
+ std::unique_ptr<base::Thread> encoding_thread_;
+
+ // While |paused_|, frames are not encoded. Used only from
+ // |encoding_thread_|.
+ bool paused_;
+
+ // This callback should be exercised on IO thread.
+ const OnEncodedVideoCB on_encoded_video_callback_;
+
+ // Target bitrate for video encoding. If 0, a standard bitrate is used.
+ const int32_t bits_per_second_;
+
+ // Used to retrieve incoming opaque VideoFrames (i.e. VideoFrames backed by
+ // textures). Created on-demand on |main_task_runner_|.
+ std::unique_ptr<media::SkCanvasVideoRenderer> video_renderer_;
+ SkBitmap bitmap_;
+ std::unique_ptr<cc::PaintCanvas> canvas_;
+
+ DISALLOW_COPY_AND_ASSIGN(Encoder);
+ };
+
static CodecId GetPreferredCodecId();
VideoTrackRecorder(CodecId codec,
@@ -80,9 +172,6 @@ class CONTENT_EXPORT VideoTrackRecorder
base::TimeTicks capture_time);
void OnError();
- // TODO(emircan): Remove after refactor, see http://crbug.com/700433.
- bool CanEncodeAlphaChannelForTesting();
-
// Used to check that we are destroyed on the same thread we were created.
base::ThreadChecker main_render_thread_checker_;
« no previous file with comments | « content/renderer/media_recorder/vea_encoder.cc ('k') | content/renderer/media_recorder/video_track_recorder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698