1 /* -*- c-basic-offset: 8; default-tab-width: 8; -*- */
4 Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <boost/lexical_cast.hpp>
23 #include "lib/ffmpeg_content.h"
24 #include "lib/playlist.h"
25 #include "ffmpeg_content_dialog.h"
27 #include "audio_mapping_view.h"
32 using boost::shared_ptr;
33 using boost::lexical_cast;
34 using boost::dynamic_pointer_cast;
36 FFmpegContentDialog::FFmpegContentDialog (wxWindow* parent, shared_ptr<FFmpegContent> content)
37 : wxDialog (parent, wxID_ANY, _("Video"))
40 wxFlexGridSizer* grid = new wxFlexGridSizer (3, 6, 6);
41 grid->AddGrowableCol (1, 1);
43 add_label_to_sizer (grid, this, _("Audio stream"));
44 _audio_stream = new wxChoice (this, wxID_ANY);
45 grid->Add (_audio_stream, 1, wxEXPAND | wxALL, 6);
46 _audio_description = new wxStaticText (this, wxID_ANY, wxT (""));
47 grid->Add (_audio_description, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, 8);
49 add_label_to_sizer (grid, this, _("Subtitle stream"));
50 _subtitle_stream = new wxChoice (this, wxID_ANY);
51 grid->Add (_subtitle_stream, 1, wxEXPAND | wxALL, 6);
54 _audio_stream->Clear ();
55 vector<shared_ptr<FFmpegAudioStream> > a = content->audio_streams ();
56 for (vector<shared_ptr<FFmpegAudioStream> >::iterator i = a.begin(); i != a.end(); ++i) {
57 _audio_stream->Append (std_to_wx ((*i)->name), new wxStringClientData (std_to_wx (lexical_cast<string> ((*i)->id))));
60 if (content->audio_stream()) {
61 checked_set (_audio_stream, lexical_cast<string> (content->audio_stream()->id));
64 _subtitle_stream->Clear ();
65 vector<shared_ptr<FFmpegSubtitleStream> > s = content->subtitle_streams ();
67 _subtitle_stream->Enable (false);
69 for (vector<shared_ptr<FFmpegSubtitleStream> >::iterator i = s.begin(); i != s.end(); ++i) {
70 _subtitle_stream->Append (std_to_wx ((*i)->name), new wxStringClientData (std_to_wx (lexical_cast<string> ((*i)->id))));
73 if (content->subtitle_stream()) {
74 checked_set (_subtitle_stream, lexical_cast<string> (content->subtitle_stream()->id));
76 _subtitle_stream->SetSelection (wxNOT_FOUND);
79 wxBoxSizer* overall_sizer = new wxBoxSizer (wxVERTICAL);
81 overall_sizer->Add (grid, 1, wxEXPAND | wxALL, 6);
83 _audio_mapping = new AudioMappingView (this);
84 _audio_mapping->set_mapping (content->audio_mapping ());
85 overall_sizer->Add (_audio_mapping, 1, wxEXPAND | wxALL, 6);
87 wxSizer* buttons = CreateSeparatedButtonSizer (wxOK);
89 overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
92 SetSizer (overall_sizer);
93 overall_sizer->Layout ();
94 overall_sizer->SetSizeHints (this);
96 _audio_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FFmpegContentDialog::audio_stream_changed), 0, this);
97 _subtitle_stream->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FFmpegContentDialog::subtitle_stream_changed), 0, this);
98 _audio_mapping->Changed.connect (bind (&FFmpegContentDialog::audio_mapping_changed, this, _1));
102 FFmpegContentDialog::audio_stream_changed (wxCommandEvent &)
104 shared_ptr<FFmpegContent> c = _content.lock ();
109 vector<shared_ptr<FFmpegAudioStream> > a = c->audio_streams ();
110 vector<shared_ptr<FFmpegAudioStream> >::iterator i = a.begin ();
111 string const s = string_client_data (_audio_stream->GetClientObject (_audio_stream->GetSelection ()));
112 while (i != a.end() && lexical_cast<string> ((*i)->id) != s) {
117 c->set_audio_stream (*i);
120 if (!c->audio_stream ()) {
121 _audio_description->SetLabel (wxT (""));
124 if (c->audio_channels() == 1) {
127 s << c->audio_channels() << wxT (" ") << _("channels");
129 s << wxT (", ") << c->content_audio_frame_rate() << _("Hz");
130 _audio_description->SetLabel (s);
137 FFmpegContentDialog::subtitle_stream_changed (wxCommandEvent &)
139 shared_ptr<FFmpegContent> c = _content.lock ();
144 vector<shared_ptr<FFmpegSubtitleStream> > a = c->subtitle_streams ();
145 vector<shared_ptr<FFmpegSubtitleStream> >::iterator i = a.begin ();
146 string const s = string_client_data (_subtitle_stream->GetClientObject (_subtitle_stream->GetSelection ()));
147 while (i != a.end() && lexical_cast<string> ((*i)->id) != s) {
152 c->set_subtitle_stream (*i);
157 FFmpegContentDialog::audio_mapping_changed (AudioMapping m)
159 shared_ptr<FFmpegContent> content = _content.lock ();
161 if (!content || !content->audio_stream()) {
165 content->audio_stream()->mapping = m;