X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Fvideo_panel.cc;h=a5d197c2a15324e81b32e557ed8d45ad0a889931;hb=cf8bbea2de38c4e9ac140f55b27311b7b6dcd814;hp=ca1fd1ce8702c3d78154f1cd35ccdeb4eef75e4b;hpb=1e1e5b454c72d818c9fe142296d489c7983a5849;p=dcpomatic.git diff --git a/src/wx/video_panel.cc b/src/wx/video_panel.cc index ca1fd1ce8..a5d197c2a 100644 --- a/src/wx/video_panel.cc +++ b/src/wx/video_panel.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2013 Carl Hetherington + Copyright (C) 2012-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,18 +18,19 @@ */ #include -#include "lib/ratio.h" #include "lib/filter.h" #include "lib/ffmpeg_content.h" #include "lib/colour_conversion.h" #include "lib/config.h" #include "lib/util.h" +#include "lib/ratio.h" +#include "lib/frame_rate_change.h" #include "filter_dialog.h" #include "video_panel.h" #include "wx_util.h" -#include "film_editor.h" #include "content_colour_conversion_dialog.h" #include "content_widget.h" +#include "content_panel.h" using std::vector; using std::string; @@ -41,8 +42,30 @@ using boost::dynamic_pointer_cast; using boost::bind; using boost::optional; -VideoPanel::VideoPanel (FilmEditor* e) - : FilmEditorPanel (e, _("Video")) +static VideoContentScale +index_to_scale (int n) +{ + vector scales = VideoContentScale::all (); + assert (n >= 0); + assert (n < int (scales.size ())); + return scales[n]; +} + +static int +scale_to_index (VideoContentScale scale) +{ + vector scales = VideoContentScale::all (); + for (size_t i = 0; i < scales.size(); ++i) { + if (scales[i] == scale) { + return i; + } + } + + assert (false); +} + +VideoPanel::VideoPanel (ContentPanel* p) + : ContentSubPanel (p, _("Video")) { wxGridBagSizer* grid = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); _sizer->Add (grid, 0, wxALL, 8); @@ -50,12 +73,20 @@ VideoPanel::VideoPanel (FilmEditor* e) int r = 0; add_label_to_grid_bag_sizer (grid, this, _("Type"), true, wxGBPosition (r, 0)); - _frame_type = new wxChoice (this, wxID_ANY); - grid->Add (_frame_type, wxGBPosition (r, 1)); + _frame_type = new ContentChoice ( + this, + new wxChoice (this, wxID_ANY), + VideoContentProperty::VIDEO_FRAME_TYPE, + boost::mem_fn (&VideoContent::video_frame_type), + boost::mem_fn (&VideoContent::set_video_frame_type), + &caster, + &caster + ); + _frame_type->add (grid, wxGBPosition (r, 1)); ++r; add_label_to_grid_bag_sizer (grid, this, _("Left crop"), true, wxGBPosition (r, 0)); - _left_crop = new ContentWidget ( + _left_crop = new ContentSpinCtrl ( this, new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1)), VideoContentProperty::VIDEO_CROP, @@ -66,7 +97,7 @@ VideoPanel::VideoPanel (FilmEditor* e) ++r; add_label_to_grid_bag_sizer (grid, this, _("Right crop"), true, wxGBPosition (r, 0)); - _right_crop = new ContentWidget ( + _right_crop = new ContentSpinCtrl ( this, new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1)), VideoContentProperty::VIDEO_CROP, @@ -77,7 +108,7 @@ VideoPanel::VideoPanel (FilmEditor* e) ++r; add_label_to_grid_bag_sizer (grid, this, _("Top crop"), true, wxGBPosition (r, 0)); - _top_crop = new ContentWidget ( + _top_crop = new ContentSpinCtrl ( this, new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1)), VideoContentProperty::VIDEO_CROP, @@ -88,7 +119,7 @@ VideoPanel::VideoPanel (FilmEditor* e) ++r; add_label_to_grid_bag_sizer (grid, this, _("Bottom crop"), true, wxGBPosition (r, 0)); - _bottom_crop = new ContentWidget ( + _bottom_crop = new ContentSpinCtrl ( this, new wxSpinCtrl (this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (64, -1)), VideoContentProperty::VIDEO_CROP, @@ -99,8 +130,16 @@ VideoPanel::VideoPanel (FilmEditor* e) ++r; add_label_to_grid_bag_sizer (grid, this, _("Scale to"), true, wxGBPosition (r, 0)); - _ratio = new wxChoice (this, wxID_ANY); - grid->Add (_ratio, wxGBPosition (r, 1)); + _scale = new ContentChoice ( + this, + new wxChoice (this, wxID_ANY), + VideoContentProperty::VIDEO_SCALE, + boost::mem_fn (&VideoContent::scale), + boost::mem_fn (&VideoContent::set_scale), + &index_to_scale, + &scale_to_index + ); + _scale->add (grid, wxGBPosition (r, 1)); ++r; { @@ -149,18 +188,19 @@ VideoPanel::VideoPanel (FilmEditor* e) _right_crop->wrapped()->SetRange (0, 1024); _bottom_crop->wrapped()->SetRange (0, 1024); - vector ratios = Ratio::all (); - _ratio->Clear (); - for (vector::iterator i = ratios.begin(); i != ratios.end(); ++i) { - _ratio->Append (std_to_wx ((*i)->nickname ())); + vector scales = VideoContentScale::all (); + _scale->wrapped()->Clear (); + for (vector::iterator i = scales.begin(); i != scales.end(); ++i) { + _scale->wrapped()->Append (std_to_wx (i->name ())); } - _ratio->Append (_("No stretch")); - _frame_type->Append (_("2D")); - _frame_type->Append (_("3D left/right")); + _frame_type->wrapped()->Append (_("2D")); + _frame_type->wrapped()->Append (_("3D left/right")); + _frame_type->wrapped()->Append (_("3D top/bottom")); + _frame_type->wrapped()->Append (_("3D alternate")); + _frame_type->wrapped()->Append (_("3D left only")); + _frame_type->wrapped()->Append (_("3D right only")); - _frame_type->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&VideoPanel::frame_type_changed, this)); - _ratio->Bind (wxEVT_COMMAND_CHOICE_SELECTED, boost::bind (&VideoPanel::ratio_changed, this)); _filters_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&VideoPanel::edit_filters_clicked, this)); _colour_conversion_button->Bind (wxEVT_COMMAND_BUTTON_CLICKED, boost::bind (&VideoPanel::edit_colour_conversion_clicked, this)); } @@ -171,6 +211,7 @@ VideoPanel::film_changed (Film::Property property) switch (property) { case Film::CONTAINER: case Film::VIDEO_FRAME_RATE: + case Film::RESOLUTION: setup_description (); break; default: @@ -181,7 +222,7 @@ VideoPanel::film_changed (Film::Property property) void VideoPanel::film_content_changed (int property) { - VideoContentList vc = _editor->selected_video_content (); + VideoContentList vc = _parent->selected_video (); shared_ptr vcs; shared_ptr fcs; if (!vc.empty ()) { @@ -190,28 +231,10 @@ VideoPanel::film_content_changed (int property) } if (property == VideoContentProperty::VIDEO_FRAME_TYPE) { - checked_set (_frame_type, vcs ? vcs->video_frame_type () : VIDEO_FRAME_TYPE_2D); setup_description (); } else if (property == VideoContentProperty::VIDEO_CROP) { setup_description (); - } else if (property == VideoContentProperty::VIDEO_RATIO) { - if (vcs) { - int n = 0; - vector ratios = Ratio::all (); - vector::iterator i = ratios.begin (); - while (i != ratios.end() && *i != vcs->ratio()) { - ++i; - ++n; - } - - if (i == ratios.end()) { - checked_set (_ratio, ratios.size ()); - } else { - checked_set (_ratio, n); - } - } else { - checked_set (_ratio, -1); - } + } else if (property == VideoContentProperty::VIDEO_SCALE) { setup_description (); } else if (property == VideoContentProperty::VIDEO_FRAME_RATE) { setup_description (); @@ -221,12 +244,11 @@ VideoPanel::film_content_changed (int property) _colour_conversion->SetLabel (preset ? std_to_wx (cc[preset.get()].name) : _("Custom")); } else if (property == FFmpegContentProperty::FILTERS) { if (fcs) { - pair p = Filter::ffmpeg_strings (fcs->filters ()); - if (p.first.empty () && p.second.empty ()) { + string const p = Filter::ffmpeg_string (fcs->filters ()); + if (p.empty ()) { _filters->SetLabel (_("None")); } else { - string const b = p.first + " " + p.second; - _filters->SetLabel (std_to_wx (b)); + _filters->SetLabel (std_to_wx (p)); } } } @@ -236,7 +258,7 @@ VideoPanel::film_content_changed (int property) void VideoPanel::edit_filters_clicked () { - FFmpegContentList c = _editor->selected_ffmpeg_content (); + FFmpegContentList c = _parent->selected_ffmpeg (); if (c.size() != 1) { return; } @@ -250,7 +272,7 @@ VideoPanel::edit_filters_clicked () void VideoPanel::setup_description () { - FFmpegContentList vc = _editor->selected_ffmpeg_content (); + VideoContentList vc = _parent->selected_video (); if (vc.empty ()) { _description->SetLabel (""); return; @@ -259,7 +281,7 @@ VideoPanel::setup_description () return; } - shared_ptr vcs = vc.front (); + shared_ptr vcs = vc.front (); wxString d; @@ -276,8 +298,8 @@ VideoPanel::setup_description () } Crop const crop = vcs->crop (); - if ((crop.left || crop.right || crop.top || crop.bottom) && vcs->video_size() != libdcp::Size (0, 0)) { - libdcp::Size cropped = vcs->video_size_after_crop (); + if ((crop.left || crop.right || crop.top || crop.bottom) && vcs->video_size() != dcp::Size (0, 0)) { + dcp::Size cropped = vcs->video_size_after_crop (); d << wxString::Format ( _("Cropped to %dx%d (%.2f:1)\n"), cropped.width, cropped.height, @@ -286,19 +308,17 @@ VideoPanel::setup_description () ++lines; } - Ratio const * ratio = vcs->ratio (); - libdcp::Size container_size = fit_ratio_within (_editor->film()->container()->ratio (), _editor->film()->full_frame ()); - float const ratio_value = ratio ? ratio->ratio() : vcs->video_size_after_crop().ratio (); + dcp::Size const container_size = _parent->film()->frame_size (); + dcp::Size const scaled = vcs->scale().size (vcs, container_size, container_size, 1); - /* We have a specified ratio to scale to */ - libdcp::Size const scaled = fit_ratio_within (ratio_value, container_size); - - d << wxString::Format ( - _("Scaled to %dx%d (%.2f:1)\n"), - scaled.width, scaled.height, - scaled.ratio () - ); - ++lines; + if (scaled != vcs->video_size_after_crop ()) { + d << wxString::Format ( + _("Scaled to %dx%d (%.2f:1)\n"), + scaled.width, scaled.height, + scaled.ratio () + ); + ++lines; + } if (scaled != container_size) { d << wxString::Format ( @@ -311,8 +331,8 @@ VideoPanel::setup_description () d << wxString::Format (_("Content frame rate %.4f\n"), vcs->video_frame_rate ()); ++lines; - FrameRateConversion frc (vcs->video_frame_rate(), _editor->film()->video_frame_rate ()); - d << frc.description << "\n"; + FrameRateChange frc (vcs->video_frame_rate(), _parent->film()->video_frame_rate ()); + d << std_to_wx (frc.description ()) << "\n"; ++lines; for (int i = lines; i < 6; ++i) { @@ -323,43 +343,10 @@ VideoPanel::setup_description () _sizer->Layout (); } - -void -VideoPanel::ratio_changed () -{ - if (!_editor->film ()) { - return; - } - - VideoContentList vc = _editor->selected_video_content (); - if (vc.size() != 1) { - return; - } - - int const n = _ratio->GetSelection (); - if (n >= 0) { - vector ratios = Ratio::all (); - if (n < int (ratios.size ())) { - vc.front()->set_ratio (ratios[n]); - } else { - vc.front()->set_ratio (0); - } - } -} - -void -VideoPanel::frame_type_changed () -{ - VideoContentList vc = _editor->selected_video_content (); - if (vc.size() == 1) { - vc.front()->set_video_frame_type (static_cast (_frame_type->GetSelection ())); - } -} - void VideoPanel::edit_colour_conversion_clicked () { - VideoContentList vc = _editor->selected_video_content (); + VideoContentList vc = _parent->selected_video (); if (vc.size() != 1) { return; } @@ -376,23 +363,22 @@ VideoPanel::edit_colour_conversion_clicked () void VideoPanel::content_selection_changed () { - VideoContentList sel = _editor->selected_video_content (); - bool const single = sel.size() == 1; - - _left_crop->set_content (sel); - _right_crop->set_content (sel); - _top_crop->set_content (sel); - _bottom_crop->set_content (sel); - - /* Things that are only allowed with single selections */ - _frame_type->Enable (single); - _ratio->Enable (single); - _filters_button->Enable (single); + VideoContentList video_sel = _parent->selected_video (); + FFmpegContentList ffmpeg_sel = _parent->selected_ffmpeg (); + + bool const single = video_sel.size() == 1; + + _left_crop->set_content (video_sel); + _right_crop->set_content (video_sel); + _top_crop->set_content (video_sel); + _bottom_crop->set_content (video_sel); + _frame_type->set_content (video_sel); + _scale->set_content (video_sel); + + _filters_button->Enable (single && !ffmpeg_sel.empty ()); _colour_conversion_button->Enable (single); - film_content_changed (VideoContentProperty::VIDEO_FRAME_TYPE); film_content_changed (VideoContentProperty::VIDEO_CROP); - film_content_changed (VideoContentProperty::VIDEO_RATIO); film_content_changed (VideoContentProperty::VIDEO_FRAME_RATE); film_content_changed (VideoContentProperty::COLOUR_CONVERSION); film_content_changed (FFmpegContentProperty::FILTERS);