// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include <QThread>
#include "singlevideowidget.hpp"

static const QColor clearColor(0x2c, 0x2c, 0x2c);

SingleVideoWidget::SingleVideoWidget(const int id, QWidget *parent) : GenericVideoWidget(parent), inputId(id) {}

SingleVideoWidget::~SingleVideoWidget() {}

void SingleVideoWidget::render(std::shared_ptr<VideoStitch::Core::SourceOpenGLSurface> surf, mtime_t date) {
  {
    std::lock_guard<std::mutex> lock(textureMutex);
    textures[(int)surf->sourceId] = surf;
  }

  mtime_t sleep = date - ref_vs - (mtime_t)(clk.nsecsElapsed() / 1000);
  if (sleep < 0 || sleep > 200000) {
    // absurd durations indicates that we're not playing
    // reset the clock
    ref_vs = date;
    clk.restart();
  } else if (sleep > 10000) {       // don't bother sleeping for less than 10 ms
    QThread::usleep(sleep - 2000);  // keep a 2 ms margin just in case
  }
  emit gotFrame(date);
}

void SingleVideoWidget::paintGL() {
  glClearColor(clearColor.redF(), clearColor.greenF(), clearColor.blueF(), clearColor.alphaF());
  glClear(GL_COLOR_BUFFER_BIT);

  std::lock_guard<std::mutex> lock(textureMutex);
  if (textures[inputId] != nullptr) {
    paintFrame(textures[inputId]->texture, width() * devicePixelRatio(), height() * devicePixelRatio(), 0, 0);
  }
}