MovieMonitor.cpp 6.99 KB
#include <QVBoxLayout>
#include <QScrollArea>
#include <QScrollBar>

#include "Convert.h"
#include "MovieMonitor.h"

#include <QDebug>

using namespace std;
using namespace cv;

MovieMonitor::MovieMonitor(QWidget *parent)
  : QWidget(parent)
{
  int windowWidth(480);

  m_histoMonitor = new HistoMonitor;
  m_segmentMonitor = new SegmentMonitor;
  m_speakersMonitor = new SpeakersMonitor;
  m_spkDiarMonitor = new SpkDiarMonitor;

  m_scrollArea = new QScrollArea;
  m_scrollArea->setWidget(m_segmentMonitor);
  m_scrollArea->setFixedSize(windowWidth, 150);

  m_segmentSlider = new QSlider(Qt::Horizontal);
  m_segmentSlider->setMinimum(windowWidth);
  m_segmentSlider->setMaximum(200000);
  m_segmentSlider->setValue(75000);

  QVBoxLayout *layout = new QVBoxLayout;
  layout->addWidget(m_histoMonitor);
  layout->addWidget(m_segmentSlider);
  layout->addWidget(m_scrollArea);
  layout->addWidget(m_speakersMonitor);
  layout->addWidget(m_spkDiarMonitor);
  setLayout(layout);

  m_histoMonitor->hide();
  m_segmentSlider->hide();
  m_scrollArea->hide();
  m_spkDiarMonitor->hide();

  connect(this, SIGNAL(grabSpokenFrame(qint64, const QString &, const QString &)), m_segmentMonitor, SLOT(processSpokenFrame(qint64, const QString &, const QString &)));
  connect(this, SIGNAL(grabShot(Segment *)), m_segmentMonitor, SLOT(processShot(Segment *)));
  connect(this, SIGNAL(segmentationGrabbed()), m_segmentMonitor, SLOT(segmentationRetrieved()));
  connect(this, SIGNAL(updatePosition(qint64)), m_segmentMonitor, SLOT(positionChanged(qint64)));
  connect(this, SIGNAL(updateDuration(qint64)), m_segmentMonitor, SLOT(updateDuration(qint64)));
  connect(m_segmentSlider, SIGNAL(valueChanged(int)), m_segmentMonitor, SLOT(setWidth(int)));
  connect(this, SIGNAL(speakersRetrieved(QList<QString>)), m_speakersMonitor, SLOT(speakersRetrieved(QList<QString>)));
  connect(this, SIGNAL(updatePosition(qint64)), m_speakersMonitor, SLOT(positionChanged(qint64)));
  connect(m_segmentMonitor, SIGNAL(playSegments(QList<QPair<qint64, qint64>>)), this, SLOT(playSegments(QList<QPair<qint64, qint64>>)));
  connect(m_segmentMonitor, SIGNAL(setSpeaker(qint64, qint64, const QString &, VideoFrame::SpeakerSource)), this, SLOT(setSpeaker(qint64, qint64, const QString &, VideoFrame::SpeakerSource)));
  connect(m_segmentMonitor, SIGNAL(resetSpeaker(qint64, qint64, qint64, qint64, bool, VideoFrame::SpeakerSource)), this, SLOT(resetSpeaker(qint64, qint64, qint64, qint64, bool, VideoFrame::SpeakerSource)));
  connect(this, SIGNAL(initDiarData(const arma::mat &, const arma::mat &, const arma::mat)), m_spkDiarMonitor, SLOT(setDiarData(const arma::mat &, const arma::mat &, const arma::mat)));
  connect(m_spkDiarMonitor, SIGNAL(playSub(QList<int>)), this, SLOT(playSub(QList<int>)));
  connect(this, SIGNAL(releasePosition(bool)), m_spkDiarMonitor, SLOT(releasePosition(bool)));
}

///////////
// slots //
///////////

void MovieMonitor::showHisto(bool dispHist)
{
  if (dispHist) {
    m_histoMonitor->show();
    connect(this, SIGNAL(processMat(const cv::Mat &)), m_histoMonitor, SLOT(processMat(const cv::Mat &)));
  }
  else {
    m_histoMonitor->hide();
    disconnect(this, SIGNAL(processMat(const cv::Mat &)), m_histoMonitor, SLOT(processMat(const cv::Mat &)));
  }
}

void MovieMonitor::processFrame(QVideoFrame frame)
{
  Mat bgrMat = Convert::fromYuvToBgrMat(frame);
  emit processMat(bgrMat);
}

void MovieMonitor::viewSegmentation(bool checked, bool annot)
{
  if (checked || annot) {
    m_segmentMonitor->setWidth(m_segmentSlider->value());
    m_segmentMonitor->setAnnotMode(annot);
    m_segmentSlider->show();
    m_scrollArea->show();
  }
  else {
    m_segmentMonitor->reset();
    m_scrollArea->hide();
    m_segmentSlider->hide();
  }
}

void MovieMonitor::viewSpeakers(bool checked)
{
  if (checked) 
    m_speakersMonitor->show();
  else
    m_speakersMonitor->hide();
}

void MovieMonitor::viewUtteranceTree(bool checked)
{
  if (checked) {
    connect(this, SIGNAL(getCurrentPattern(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getCurrentPattern(const QList<QPair<int, qreal>> &)));
    connect(this, SIGNAL(getPatternFirstShot(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getPatternFirstShot(const QList<QPair<int, qreal>> &)));
    connect(this, SIGNAL(getPatternSecondShot(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getPatternSecondShot(const QList<QPair<int, qreal>> &)));
    connect(this, SIGNAL(currentSubtitle(int)), m_spkDiarMonitor, SLOT(currentSubtitle(int)));
    m_spkDiarMonitor->show();
  }
  else {
    disconnect(this, SIGNAL(getCurrentPattern(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getCurrentPattern(const QList<QPair<int, qreal>> &)));
    disconnect(this, SIGNAL(getPatternFirstShot(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getPatternFirstShot(const QList<QPair<int, qreal>> &)));
    disconnect(this, SIGNAL(getPatternSecondShot(const QList<QPair<int, qreal>> &)), m_spkDiarMonitor, SLOT(getPatternSecondShot(const QList<QPair<int, qreal>> &)));
    disconnect(this, SIGNAL(currentSubtitle(int)), m_spkDiarMonitor, SLOT(currentSubtitle(int)));
    m_spkDiarMonitor->hide();
  }
}

void MovieMonitor::setDiarData(const arma::mat &E, const arma::mat &Sigma, const arma::mat &W)
{
  emit initDiarData(E, Sigma, W);
}

void MovieMonitor::grabCurrentPattern(const QList<QPair<int, qreal>> &subFeatures)
{
  emit getCurrentPattern(subFeatures);
}

void MovieMonitor::grabPatternFirstShot(const QList<QPair<int, qreal>> &subFeatures)
{
  emit getPatternFirstShot(subFeatures);
}

void MovieMonitor::grabPatternSecondShot(const QList<QPair<int, qreal>> &subFeatures)
{
  emit getPatternSecondShot(subFeatures);
}

void MovieMonitor::getShot(Segment *shot)
{
  emit grabShot(shot);
}

void MovieMonitor::segmentationRetrieved()
{
  emit segmentationGrabbed();
}

void MovieMonitor::speakersGrabbed(QList<QString> speakers)
{
  emit speakersRetrieved(speakers);
} 

void MovieMonitor::getSpokenFrame(qint64 position, const QString &text, const QString &speaker)
{
  emit grabSpokenFrame(position, text, speaker);
}

void MovieMonitor::positionChanged(qint64 position)
{
  m_scrollArea->horizontalScrollBar()->setValue(position *  m_segmentMonitor->getRatio() - m_scrollArea->width() / 2);
  emit updatePosition(position);
}

void MovieMonitor::playSegments(QList<QPair<qint64, qint64>> utterances)
{
  emit playbackSegments(utterances);
}

void MovieMonitor::durationChanged(qint64 duration)
{
  emit updateDuration(duration);
}

void MovieMonitor::setSpeaker(qint64 start, qint64 end, const QString &speaker, VideoFrame::SpeakerSource source)
{
  emit newSpeaker(start, end, speaker, source);
}

void MovieMonitor::resetSpeaker(qint64 prevStart, qint64 prevEnd, qint64 start, qint64 end, bool resetSub, VideoFrame::SpeakerSource source)
{
  emit renewSpeaker(prevStart, prevEnd, start, end, resetSub, source);
}

void MovieMonitor::playSub(QList<int> utter)
{
  emit playSubtitle(utter);
}

void MovieMonitor::currSubtitle(int subIdx)
{
  emit currentSubtitle(subIdx);
}

void MovieMonitor::releasePos(bool released)
{
  emit releasePosition(released);
}