/*
 *  Copyright (c) 2012 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_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_EXTERNAL_RENDER_H_
#define WEBRTC_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_EXTERNAL_RENDER_H_

#include "webrtc/system_wrappers/interface/tick_util.h"
#include "webrtc/video_engine/include/vie_render.h"

namespace webrtc {

// A render filter which passes frames directly to an external renderer. This
// is different from plugging the external renderer directly into the sending
// side since this will only run on frames that actually get sent and not on
// frames that only get captured.
class ExternalRendererEffectFilter : public webrtc::ViEEffectFilter {
 public:
  explicit ExternalRendererEffectFilter(webrtc::ExternalRenderer* renderer)
      : width_(0), height_(0), renderer_(renderer) {}
  virtual ~ExternalRendererEffectFilter() {}
  virtual int Transform(int size,
                        unsigned char* frame_buffer,
                        int64_t ntp_time_ms,
                        unsigned int timestamp,
                        unsigned int width,
                        unsigned int height) {
    if (width != width_ || height_ != height) {
      renderer_->FrameSizeChange(width, height, 1);
      width_ = width;
      height_ = height;
    }
    return renderer_->DeliverFrame(frame_buffer,
                                   size,
                                   ntp_time_ms,
                                   timestamp,
                                   webrtc::TickTime::MillisecondTimestamp(),
                                   NULL);
  }

 private:
  unsigned int width_;
  unsigned int height_;
  webrtc::ExternalRenderer* renderer_;
};

}  // namespace webrtc

#endif  // WEBRTC_VIDEO_ENGINE_TEST_LIBVIETEST_INCLUDE_VIE_EXTERNAL_RENDER_H_
