/*
 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
#define WEBRTC_MEDIA_BASE_VIDEOFRAMEFACTORY_H_

#include <memory>

#include "webrtc/media/base/videoframe.h"

namespace cricket {

struct CapturedFrame;
class VideoFrame;

// Creates cricket::VideoFrames, or a subclass of cricket::VideoFrame
// depending on the subclass of VideoFrameFactory.
class VideoFrameFactory {
 public:
  VideoFrameFactory() : apply_rotation_(false) {}
  virtual ~VideoFrameFactory() {}

  // The returned frame aliases the aliased_frame if the input color
  // space allows for aliasing, otherwise a color conversion will
  // occur. Returns NULL if conversion fails.

  // The returned frame will be a center crop of |input_frame| with
  // size |cropped_width| x |cropped_height|.
  virtual VideoFrame* CreateAliasedFrame(const CapturedFrame* input_frame,
                                         int cropped_width,
                                         int cropped_height) const = 0;

  // The returned frame will be a center crop of |input_frame| with size
  // |cropped_width| x |cropped_height|, scaled to |output_width| x
  // |output_height|.
  virtual VideoFrame* CreateAliasedFrame(const CapturedFrame* input_frame,
                                         int cropped_input_width,
                                         int cropped_input_height,
                                         int output_width,
                                         int output_height) const;

  void SetApplyRotation(bool enable) { apply_rotation_ = enable; }

 protected:
  bool apply_rotation_;

 private:
  // An internal frame buffer to avoid reallocations. It is mutable because it
  // does not affect behaviour, only performance.
  mutable std::unique_ptr<VideoFrame> output_frame_;
};

}  // namespace cricket

#endif  // WEBRTC_MEDIA_BASE_VIDEOFRAMEFACTORY_H_
