implemented a footage viewer

Essentially a minor derivation of a viewer type that can automatically view
footage from the project (i.e. not in a sequence).
This commit is contained in:
itsmattkc
2019-12-30 20:17:48 +11:00
parent 55ea4a8177
commit 0db13a96ab
34 changed files with 439 additions and 152 deletions
+2
View File
@@ -16,6 +16,8 @@
set(OLIVE_SOURCES
${OLIVE_SOURCES}
widget/viewer/footageviewer.h
widget/viewer/footageviewer.cpp
widget/viewer/viewer.h
widget/viewer/viewer.cpp
widget/viewer/viewerglwidget.h
+60
View File
@@ -0,0 +1,60 @@
#include "footageviewer.h"
#include "project/project.h"
FootageViewerWidget::FootageViewerWidget(QWidget *parent) :
ViewerWidget(parent),
footage_(nullptr)
{
video_node_ = new VideoInput();
audio_node_ = new AudioInput();
viewer_node_ = new ViewerOutput();
NodeParam::ConnectEdge(video_node_->output(), viewer_node_->texture_input());
NodeParam::ConnectEdge(audio_node_->output(), viewer_node_->samples_input());
NodeParam::ConnectEdge(video_node_->output(), viewer_node_->length_input());
}
void FootageViewerWidget::SetFootage(Footage *footage)
{
if (footage_) {
DisconnectViewerNode();
}
footage_ = footage;
if (footage_) {
VideoStreamPtr video_stream = nullptr;
AudioStreamPtr audio_stream = nullptr;
foreach (StreamPtr s, footage->streams()) {
if (!audio_stream && s->type() == Stream::kAudio) {
audio_stream = std::static_pointer_cast<AudioStream>(s);
}
if (!video_stream
&& (s->type() == Stream::kVideo || s->type() == Stream::kImage)) {
video_stream = std::static_pointer_cast<VideoStream>(s);
}
if (audio_stream && video_stream) {
break;
}
}
if (video_stream) {
video_node_->SetFootage(video_stream);
viewer_node_->set_video_params(VideoParams(video_stream->width(), video_stream->height(), video_stream->frame_rate().flipped()));
}
if (audio_stream) {
audio_node_->SetFootage(audio_stream);
qDebug() << "Audio stream channel layout:" << audio_stream->channel_layout();
viewer_node_->set_audio_params(AudioParams(audio_stream->sample_rate(), audio_stream->channel_layout()));
}
ConnectViewerNode(viewer_node_, footage->project()->color_manager());
video_renderer_->InvalidateCache(0, viewer_node_->Length());
audio_renderer_->InvalidateCache(0, viewer_node_->Length());
}
}
+28
View File
@@ -0,0 +1,28 @@
#ifndef FOOTAGEVIEWERWIDGET_H
#define FOOTAGEVIEWERWIDGET_H
#include "node/input/media/audio/audio.h"
#include "node/input/media/video/video.h"
#include "node/output/viewer/viewer.h"
#include "viewer.h"
class FootageViewerWidget : public ViewerWidget
{
Q_OBJECT
public:
FootageViewerWidget(QWidget* parent = nullptr);
void SetFootage(Footage* footage);
private:
Footage* footage_;
VideoInput* video_node_;
AudioInput* audio_node_;
ViewerOutput* viewer_node_;
};
#endif // FOOTAGEVIEWERWIDGET_H
+14 -8
View File
@@ -133,7 +133,7 @@ bool ViewerWidget::IsPlaying() const
return playback_timer_.isActive();
}
void ViewerWidget::ConnectViewerNode(ViewerOutput *node)
void ViewerWidget::ConnectViewerNode(ViewerOutput *node, ColorManager* color_manager)
{
if (viewer_node_ != nullptr) {
SetTimebase(0);
@@ -153,6 +153,9 @@ void ViewerWidget::ConnectViewerNode(ViewerOutput *node)
// Set texture to new texture (or null if no viewer node is available)
UpdateTextureFromNode(GetTime());
video_renderer_->SetViewerNode(viewer_node_);
audio_renderer_->SetViewerNode(viewer_node_);
if (viewer_node_ != nullptr) {
SetTimebase(viewer_node_->video_params().time_base());
@@ -163,14 +166,17 @@ void ViewerWidget::ConnectViewerNode(ViewerOutput *node)
SizeChangedSlot(viewer_node_->video_params().width(), viewer_node_->video_params().height());
LengthChangedSlot(viewer_node_->Length());
gl_widget_->ConnectColorManager(static_cast<Sequence*>(viewer_node_->parent())->project()->color_manager());
if (color_manager) {
gl_widget_->ConnectColorManager(color_manager);
} else if (viewer_node_->parent()) {
gl_widget_->ConnectColorManager(static_cast<Sequence*>(viewer_node_->parent())->project()->color_manager());
} else {
qWarning() << "Failed to find a suitable color manager for the connected viewer node";
}
video_renderer_->SetParameters(VideoRenderingParams(viewer_node_->video_params(), PixelFormat::PIX_FMT_RGBA16F, RenderMode::kOffline, 2));
audio_renderer_->SetParameters(AudioRenderingParams(viewer_node_->audio_params(), SAMPLE_FMT_FLT));
}
video_renderer_->SetViewerNode(viewer_node_);
video_renderer_->SetParameters(VideoRenderingParams(viewer_node_->video_params(), PixelFormat::PIX_FMT_RGBA16F, RenderMode::kOffline, 2));
audio_renderer_->SetViewerNode(viewer_node_);
audio_renderer_->SetParameters(AudioRenderingParams(viewer_node_->audio_params(), SAMPLE_FMT_FLT));
}
void ViewerWidget::DisconnectViewerNode()
+4 -4
View File
@@ -63,7 +63,7 @@ public:
bool IsPlaying() const;
void ConnectViewerNode(ViewerOutput* node);
void ConnectViewerNode(ViewerOutput* node, ColorManager *color_manager = nullptr);
void DisconnectViewerNode();
@@ -136,6 +136,9 @@ signals:
protected:
virtual void resizeEvent(QResizeEvent *event) override;
OpenGLBackend* video_renderer_;
AudioBackend* audio_renderer_;
private:
void UpdateTimeInternal(int64_t i);
@@ -145,9 +148,6 @@ private:
void PushScrubbedAudio();
OpenGLBackend* video_renderer_;
AudioBackend* audio_renderer_;
ViewerSizer* sizer_;
ViewerGLWidget* gl_widget_;
+6
View File
@@ -147,6 +147,12 @@ void ViewerGLWidget::paintGL()
void ViewerGLWidget::RefreshColorPipeline()
{
if (!color_manager_) {
color_service_ = nullptr;
pipeline_ = nullptr;
return;
}
QStringList displays = color_manager_->ListAvailableDisplays();
if (!displays.contains(ocio_display_)) {
ocio_display_ = color_manager_->GetDefaultDisplay();