10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/basictypes.h"
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h"
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace media {
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass VideoFrame;
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace media {
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace cast {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct EncodedFrame;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass SoftwareVideoEncoder {
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public:
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~SoftwareVideoEncoder() {}
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Initialize the encoder before Encode() can be called. This method
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // must be called on the thread that Encode() is called.
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void Initialize() = 0;
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Encode a raw image (as a part of a video stream).
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual bool Encode(const scoped_refptr<media::VideoFrame>& video_frame,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      EncodedFrame* encoded_image) = 0;
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Update the encoder with a new target bit rate.
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void UpdateRates(uint32 new_bitrate) = 0;
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set the next frame to be a key frame.
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void GenerateKeyFrame() = 0;
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set the last frame to reference.
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void LatestFrameIdToReference(uint32 frame_id) = 0;
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch};
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace cast
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace media
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // MEDIA_CAST_SENDER_SOFTWARE_VIDEO_ENCODER_H_
45