1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/video_frame.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "media/cast/cast_config.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "media/cast/cast_environment.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace media { 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace cast { 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// All these functions are called from the main cast thread. 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VideoEncoder { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef base::Callback<void(scoped_ptr<EncodedFrame>)> 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FrameEncodedCallback; 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~VideoEncoder() {} 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The video_frame must be valid until the closure callback is called. 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The closure callback is called from the video encoder thread as soon as 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the encoder is done with the frame; it does not mean that the encoded frame 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // has been sent out. 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Once the encoded frame is ready the frame_encoded_callback is called. 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool EncodeVideoFrame( 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<media::VideoFrame>& video_frame, 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::TimeTicks& capture_time, 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const FrameEncodedCallback& frame_encoded_callback) = 0; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Inform the encoder about the new target bit rate. 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetBitRate(int new_bit_rate) = 0; 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Inform the encoder to encode the next frame as a key frame. 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GenerateKeyFrame() = 0; 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Inform the encoder to only reference frames older or equal to frame_id; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void LatestFrameIdToReference(uint32 frame_id) = 0; 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace cast 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace media 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // MEDIA_CAST_SENDER_VIDEO_ENCODER_H_ 52