+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2010-2013 Adam Williams <broadcast at earthling dot net>
- *
- * 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "asset.h"
-#include "bcsignals.h"
-#include "clip.h"
-#include "guicast.h"
-#include "file.h"
-#include "filesystem.h"
-#include "formattools.h"
-#include "language.h"
-#include "libdv.h"
-#include "libmjpeg.h"
-#include "maxchannels.h"
-#include "mwindow.h"
-#include "preferences.h"
-#include "theme.h"
-#include "videodevice.inc"
-#include <string.h>
-#include <unistd.h>
-#include <ctype.h>
-
-
-FormatTools::FormatTools(MWindow *mwindow,
- BC_WindowBase *window,
- Asset *asset)
-{
- this->mwindow = mwindow;
- this->window = window;
- this->asset = asset;
- this->plugindb = mwindow->plugindb;
-
- aparams_button = 0;
- vparams_button = 0;
- aparams_thread = 0;
- vparams_thread = 0;
- channels_tumbler = 0;
- audio_switch = 0;
- video_switch = 0;
- path_textbox = 0;
- path_button = 0;
- format_title = 0;
- format_button = 0;
- format_text = 0;
- audio_title = 0;
- audio_switch = 0;
- video_title = 0;
- video_switch = 0;
- channels_title = 0;
- channels_button = 0;
- multiple_files = 0;
- file_entries = 0;
- w = window->get_w();
-
- recording = 0;
- use_brender = 0;
- do_audio = 0;
- do_video = 0;
- prompt_audio = 0;
- prompt_audio_channels = 0;
- prompt_video = 0;
- prompt_video_compression = 0;
- strategy = 0;
- locked_compressor = 0;
- video_driver = 0;
-}
-
-FormatTools::~FormatTools()
-{
-SET_TRACE
- delete path_button;
-SET_TRACE
- delete path_textbox;
-SET_TRACE
- delete format_button;
-SET_TRACE
-
- if(aparams_button) delete aparams_button;
-SET_TRACE
- if(vparams_button) delete vparams_button;
-SET_TRACE
- if(aparams_thread) delete aparams_thread;
-SET_TRACE
- if(vparams_thread) delete vparams_thread;
-SET_TRACE
- if(channels_tumbler) delete channels_tumbler;
-SET_TRACE
- if(file_entries)
- {
- file_entries->remove_all_objects();
- delete file_entries;
- }
-}
-
-void FormatTools::create_objects(int &init_x,
- int &init_y,
- int do_audio, // Include support for audio
- int do_video, // Include support for video
- int prompt_audio, // Include checkbox for audio
- int prompt_video,
- int prompt_audio_channels,
- int prompt_video_compression,
- char *locked_compressor,
- int recording,
- int *strategy,
- int brender)
-{
- int x = init_x;
- int y = init_y;
-
- this->locked_compressor = locked_compressor;
- this->recording = recording;
- this->use_brender = brender;
- this->do_audio = do_audio;
- this->do_video = do_video;
- this->prompt_audio = prompt_audio;
- this->prompt_audio_channels = prompt_audio_channels;
- this->prompt_video = prompt_video;
- this->prompt_video_compression = prompt_video_compression;
- this->strategy = strategy;
-
-
- file_entries = new ArrayList<BC_ListBoxItem*>;
- FileSystem fs;
- char string[BCTEXTLEN];
-// Load current directory
- fs.update(getcwd(string, BCTEXTLEN));
- for(int i = 0; i < fs.total_files(); i++)
- {
- file_entries->append(
- new BC_ListBoxItem(
- fs.get_entry(i)->get_name()));
- }
-
-//printf("FormatTools::create_objects 1\n");
-
-// Modify strategy depending on render farm
- if(strategy)
- {
- if(mwindow->preferences->use_renderfarm)
- {
- if(*strategy == FILE_PER_LABEL)
- *strategy = FILE_PER_LABEL_FARM;
- else
- if(*strategy == SINGLE_PASS)
- *strategy = SINGLE_PASS_FARM;
- }
- else
- {
- if(*strategy == FILE_PER_LABEL_FARM)
- *strategy = FILE_PER_LABEL;
- else
- if(*strategy == SINGLE_PASS_FARM)
- *strategy = SINGLE_PASS;
- }
- }
-
- if(!recording)
- {
- window->add_subwindow(path_textbox = new FormatPathText(x, y, this));
- x += path_textbox->get_w() + 5;
- window->add_subwindow(path_button = new BrowseButton(
- mwindow,
- window,
- path_textbox,
- x,
- y,
- asset->path,
- _("Output to file"),
- _("Select a file to write to:"),
- 0));
-
-// Set w for user.
- w = MAX(w, 305);
-// w = x + path_button->get_w() + 5;
- x -= path_textbox->get_w() + 5;
- y += 35;
- }
- else
- {
-// w = x + 305;
- w = 305;
- }
-
- window->add_subwindow(format_title = new BC_Title(x, y, _("File Format:")));
- x += 90;
- window->add_subwindow(format_text = new BC_TextBox(x, y, 180, 1,
- File::formattostr(asset->format)));
- x += format_text->get_w();
-//printf("FormatTools::create_objects %d %p\n", __LINE__, window);
- window->add_subwindow(format_button = new FormatFormat(x, y, this));
- format_button->create_objects();
- x += format_button->get_w() + 5;
- window->add_subwindow(ffmpeg_type = new FFMpegType(x, y, 50, 1, asset->fformat));
- x += ffmpeg_type->get_w();
- window->add_subwindow(format_ffmpeg = new FormatFFMPEG(x, y, this));
- format_ffmpeg->create_objects();
-
- x = init_x;
- y += format_button->get_h() + 10;
- if(do_audio)
- {
- window->add_subwindow(audio_title = new BC_Title(x, y, _("Audio:"), LARGEFONT, RED));
- x += 80;
- window->add_subwindow(aparams_button = new FormatAParams(mwindow, this, x, y));
- x += aparams_button->get_w() + 10;
- if(prompt_audio)
- {
- window->add_subwindow(audio_switch = new FormatAudio(x, y, this, asset->audio_data));
- }
- x = init_x;
- y += aparams_button->get_h() + 10;
-
-// Audio channels only used for recording.
-// if(prompt_audio_channels)
-// {
-// window->add_subwindow(channels_title = new BC_Title(x, y, _("Number of audio channels to record:")));
-// x += 260;
-// window->add_subwindow(channels_button = new FormatChannels(x, y, this));
-// x += channels_button->get_w() + 5;
-// window->add_subwindow(channels_tumbler = new BC_ITumbler(channels_button, 1, MAXCHANNELS, x, y));
-// y += channels_button->get_h() + 20;
-// x = init_x;
-// }
-
-//printf("FormatTools::create_objects 6\n");
- aparams_thread = new FormatAThread(this);
- }
-
-//printf("FormatTools::create_objects 7\n");
- if(do_video)
- {
-
-//printf("FormatTools::create_objects 8\n");
- window->add_subwindow(video_title = new BC_Title(x, y, _("Video:"), LARGEFONT, RED));
- x += 80;
- if(prompt_video_compression)
- {
- window->add_subwindow(vparams_button = new FormatVParams(mwindow, this, x, y));
- x += vparams_button->get_w() + 10;
- }
-
-//printf("FormatTools::create_objects 9\n");
- if(prompt_video)
- {
- window->add_subwindow(video_switch = new FormatVideo(x, y, this, asset->video_data));
- y += video_switch->get_h();
- }
- else
- {
- y += vparams_button->get_h();
- }
-
-//printf("FormatTools::create_objects 10\n");
- y += 10;
- vparams_thread = new FormatVThread(this);
- }
-
-//printf("FormatTools::create_objects 11\n");
-
- x = init_x;
- if(strategy)
- {
- window->add_subwindow(multiple_files = new FormatMultiple(mwindow, x, y, strategy));
- y += multiple_files->get_h() + 10;
- }
-
-//printf("FormatTools::create_objects 12\n");
-
- init_y = y;
- update_format();
-}
-
-void FormatTools::update_driver(int driver)
-{
- this->video_driver = driver;
-
- locked_compressor = 0;
- switch(driver)
- {
- case CAPTURE_DVB:
- case VIDEO4LINUX2MPEG:
-// Just give the user information about how the stream is going to be
-// stored but don't change the asset.
-// Want to be able to revert to user settings.
- if(asset->format != FILE_MPEG)
- {
- format_text->update(_("MPEG stream"));
- asset->format = FILE_MPEG;
- }
- audio_switch->update(1);
- video_switch->update(1);
- break;
-
- case CAPTURE_IEC61883:
- case CAPTURE_FIREWIRE:
- case CAPTURE_LML:
- case CAPTURE_BUZ:
- case VIDEO4LINUX2JPEG:
- case CAPTURE_JPEG_WEBCAM:
- asset->format = FILE_FFMPEG;
- format_text->update(File::formattostr(asset->format));
-
- switch(driver) {
- case CAPTURE_IEC61883:
- case CAPTURE_FIREWIRE:
- locked_compressor = (char*)CODEC_TAG_DVSD;
- break;
-
- case CAPTURE_BUZ:
- case CAPTURE_LML:
- case VIDEO4LINUX2JPEG:
- locked_compressor = (char*)CODEC_TAG_MJPEG;
- break;
-
- case CAPTURE_JPEG_WEBCAM:
- locked_compressor = (char*)CODEC_TAG_JPEG;
- break;
- }
- if( locked_compressor )
- strcpy(asset->vcodec, locked_compressor);
-
- audio_switch->update(asset->audio_data);
- video_switch->update(asset->video_data);
- break;
-
- default:
- format_text->update(File::formattostr(asset->format));
- audio_switch->update(asset->audio_data);
- video_switch->update(asset->video_data);
- break;
- }
- close_format_windows();
- update_format();
-}
-
-void FormatTools::update_format()
-{
- if( do_audio && prompt_audio && audio_switch ) {
- audio_switch->update(asset->audio_data);
- if( !asset->audio_data )
- audio_switch->disable();
- else
- audio_switch->enable();
- }
- if( do_video && prompt_video && video_switch ) {
- video_switch->update(asset->video_data);
- if( !asset->video_data )
- video_switch->disable();
- else
- video_switch->enable();
- }
- if( asset->format == FILE_FFMPEG ) {
- ffmpeg_type->show();
- format_ffmpeg->show();
- }
- else {
- ffmpeg_type->hide();
- format_ffmpeg->hide();
- }
-}
-
-int FormatTools::handle_event()
-{
- return 0;
-}
-
-Asset* FormatTools::get_asset()
-{
- return asset;
-}
-
-void FormatTools::update_extension()
-{
- const char *extension = File::get_tag(asset->format);
-// split multiple extensions
- ArrayList<const char*> extensions;
- int len = !extension ? -1 : strlen(extension);
- const char *extension_ptr = extension;
- for(int i = 0; i <= len; i++)
- {
- if(extension[i] == '/' || extension[i] == 0)
- {
- extensions.append(extension_ptr);
- extension_ptr = extension + i + 1;
- }
- }
-
- if(extensions.size())
- {
- char *ptr = strrchr(asset->path, '.');
- if(!ptr)
- {
- ptr = asset->path + strlen(asset->path);
- *ptr = '.';
- }
- ptr++;
-
-
-// test for equivalent extension
- int need_extension = 1;
- //int extension_len = 0;
- for(int i = 0; i < extensions.size() && need_extension; i++)
- {
- char *ptr1 = ptr;
- extension_ptr = extensions.get(i);
-// test an extension
- need_extension = 0;
- while(*ptr1 != 0 && *extension_ptr != 0 && *extension_ptr != '/')
- {
- if(tolower(*ptr1) != tolower(*extension_ptr))
- {
- need_extension = 1;
- break;
- }
- ptr1++;
- extension_ptr++;
- }
-
- if(*ptr1 == 0 &&
- *extension_ptr != 0 &&
- *extension_ptr != '/')
- need_extension = 1;
- }
-
-//printf("FormatTools::update_extension %d %d\n", __LINE__, need_extension);
-// copy extension
- if(need_extension)
- {
- char *ptr1 = ptr;
- extension_ptr = asset->format != FILE_FFMPEG ?
- extensions.get(0) : asset->fformat;
- while(*extension_ptr != 0 && *extension_ptr != '/')
- *ptr1++ = *extension_ptr++;
- *ptr1 = 0;
- }
-
- int character1 = ptr - asset->path;
- int character2 = strlen(asset->path);
-// *(asset->path + character2) = 0;
- if(path_textbox)
- {
- path_textbox->update(asset->path);
- path_textbox->set_selection(character1, character2, character2);
- }
- }
-}
-
-void FormatTools::update(Asset *asset, int *strategy)
-{
- this->asset = asset;
- this->strategy = strategy;
-
- if(path_textbox)
- path_textbox->update(asset->path);
- format_text->update(File::formattostr(plugindb, asset->format));
- if(do_audio && prompt_audio && audio_switch)
- audio_switch->update(asset->audio_data);
- if(do_video && prompt_video && video_switch)
- video_switch->update(asset->video_data);
- if(strategy)
- {
- multiple_files->update(strategy);
- }
- close_format_windows();
-}
-
-void FormatTools::close_format_windows()
-{
-// This is done in ~file
- if(aparams_thread && aparams_thread->running())
- {
- aparams_thread->file->close_window();
- aparams_thread->join();
- }
- if(vparams_thread && vparams_thread->running())
- {
- vparams_thread->file->close_window();
- vparams_thread->join();
- }
-}
-
-int FormatTools::get_w()
-{
- return w;
-}
-
-void FormatTools::set_w(int w)
-{
- this->w = w;
-}
-
-void FormatTools::reposition_window(int &init_x, int &init_y)
-{
- int x = init_x;
- int y = init_y;
-
- if(path_textbox)
- {
- path_textbox->reposition_window(x, y);
- x += path_textbox->get_w() + 5;
- path_button->reposition_window(x, y);
- x -= path_textbox->get_w() + 5;
- y += 35;
- }
-
- format_title->reposition_window(x, y);
- x += 90;
- format_text->reposition_window(x, y);
- x += format_text->get_w();
- format_button->reposition_window(x, y);
-
- x = init_x;
- y += format_button->get_h() + 10;
-
- if(do_audio)
- {
- audio_title->reposition_window(x, y);
- x += 80;
- aparams_button->reposition_window(x, y);
- x += aparams_button->get_w() + 10;
- if(prompt_audio) audio_switch->reposition_window(x, y);
-
- x = init_x;
- y += aparams_button->get_h() + 20;
- if(prompt_audio_channels)
- {
- channels_title->reposition_window(x, y);
- x += 260;
- channels_button->reposition_window(x, y);
- x += channels_button->get_w() + 5;
- channels_tumbler->reposition_window(x, y);
- y += channels_button->get_h() + 20;
- x = init_x;
- }
- }
-
-
- if(do_video)
- {
- video_title->reposition_window(x, y);
- x += 80;
- if(prompt_video_compression)
- {
- vparams_button->reposition_window(x, y);
- x += vparams_button->get_w() + 10;
- }
-
- if(prompt_video)
- {
- video_switch->reposition_window(x, y);
- y += video_switch->get_h();
- }
- else
- {
- y += vparams_button->get_h();
- }
-
- y += 10;
- x = init_x;
- }
-
- if(strategy)
- {
- multiple_files->reposition_window(x, y);
- y += multiple_files->get_h() + 10;
- }
-
- init_y = y;
-}
-
-
-int FormatTools::set_audio_options()
-{
-// if(video_driver == CAPTURE_DVB)
-// {
-// return 0;
-// }
-
- if(!aparams_thread->running())
- {
- aparams_thread->start();
- }
- else
- {
- aparams_thread->file->raise_window();
- }
- return 0;
-}
-
-int FormatTools::set_video_options()
-{
-// if(video_driver == CAPTURE_DVB)
-// {
-// return 0;
-// }
-
- if(!vparams_thread->running())
- {
- vparams_thread->start();
- }
- else
- {
- vparams_thread->file->raise_window();
- }
-
- return 0;
-}
-
-
-
-
-
-FormatAParams::FormatAParams(MWindow *mwindow, FormatTools *format, int x, int y)
- : BC_Button(x, y, mwindow->theme->get_image_set("wrench"))
-{
- this->format = format;
- set_tooltip(_("Configure audio compression"));
-}
-
-FormatAParams::~FormatAParams()
-{
-}
-
-int FormatAParams::handle_event()
-{
- format->set_audio_options();
- return 1;
-}
-
-
-
-
-
-FormatVParams::FormatVParams(MWindow *mwindow, FormatTools *format, int x, int y)
- : BC_Button(x, y, mwindow->theme->get_image_set("wrench"))
-{
- this->format = format;
- set_tooltip(_("Configure video compression"));
-}
-
-FormatVParams::~FormatVParams()
-{
-}
-
-int FormatVParams::handle_event()
-{
- format->set_video_options();
- return 1;
-}
-
-
-
-
-
-FormatAThread::FormatAThread(FormatTools *format)
- : Thread(1, 0, 0)
-{
- this->format = format;
- file = new File;
- joined = 1;
-}
-
-FormatAThread::~FormatAThread()
-{
- join();
- delete file;
- file = 0;
-}
-
-void FormatAThread::start()
-{
- join();
- joined = 0;
- Thread::start();
-}
-
-
-void FormatAThread::run()
-{
- file->get_options(format, 1, 0);
-}
-
-
-
-
-FormatVThread::FormatVThread(FormatTools *format)
- : Thread(1, 0, 0)
-{
- this->format = format;
- file = new File;
- joined = 1;
-}
-
-FormatVThread::~FormatVThread()
-{
- join();
- delete file;
- file = 0;
-}
-
-void FormatVThread::start()
-{
- join();
- joined = 0;
- Thread::start();
-}
-
-void FormatVThread::run()
-{
- file->get_options(format, 0, 1);
-}
-
-
-
-
-
-FormatPathText::FormatPathText(int x, int y, FormatTools *format)
- : BC_TextBox(x,
- y,
- format->w -
- format->mwindow->theme->get_image_set("wrench")[0]->get_w() -
- x - 10,
- 1,
- format->asset->path)
-{
- this->format = format;
-}
-
-FormatPathText::~FormatPathText()
-{
-}
-int FormatPathText::handle_event()
-{
-// Suggestions
- calculate_suggestions(format->file_entries);
-
-
-
- strcpy(format->asset->path, get_text());
- format->handle_event();
-
- return 1;
-}
-
-
-
-
-FormatAudio::FormatAudio(int x, int y, FormatTools *format, int default_)
- : BC_CheckBox(x,
- y,
- default_,
- (char*)(format->recording ? _("Record audio tracks") : _("Render audio tracks")))
-{
- this->format = format;
-}
-
-FormatAudio::~FormatAudio() {}
-int FormatAudio::handle_event()
-{
- format->asset->audio_data = get_value();
- return 1;
-}
-
-
-FormatVideo::FormatVideo(int x, int y, FormatTools *format, int default_)
- : BC_CheckBox(x,
- y,
- default_,
- (char*)(format->recording ? _("Record video tracks") : _("Render video tracks")))
-{
-this->format = format;
-}
-
-FormatVideo::~FormatVideo() {}
-int FormatVideo::handle_event()
-{
- format->asset->video_data = get_value();
- return 1;
-}
-
-
-
-
-FormatFormat::FormatFormat(int x, int y, FormatTools *format)
- : FormatPopup(format->plugindb, x, y, format->use_brender)
-{
- this->format = format;
-}
-
-FormatFormat::~FormatFormat()
-{
-}
-
-int FormatFormat::handle_event()
-{
- BC_ListBoxItem *selection = get_selection(0, 0);
- if( selection ) {
- int new_format = File::strtoformat(format->plugindb, get_selection(0, 0)->get_text());
-// if(new_format != format->asset->format)
- {
- Asset *asset = format->asset;
- asset->format = new_format;
- asset->audio_data = File::supports_audio(asset->format);
- asset->video_data = File::supports_video(asset->format);
- format->format_text->update(selection->get_text());
- format->update_extension();
- format->close_format_windows();
- format->update_format();
- }
- }
- return 1;
-}
-
-
-FormatFFMPEG::FormatFFMPEG(int x, int y, FormatTools *format)
- : FFMPEGPopup(format->plugindb, x, y)
-{
- this->format = format;
-}
-
-FormatFFMPEG::~FormatFFMPEG()
-{
-}
-
-int FormatFFMPEG::load_defaults(const char *path, const char *type,
- char *codec, char *codec_options, int len)
-{
- char default_file[BCTEXTLEN];
- FFMPEG::set_option_path(default_file, "%s/%s.dfl", path, type);
- FILE *fp = fopen(default_file,"r");
- if( !fp ) return 1;
- fgets(codec, BCSTRLEN, fp);
- char *cp = codec;
- while( *cp && *cp!='\n' ) ++cp;
- *cp = 0;
- while( len > 0 && fgets(codec_options, len, fp) ) {
- int n = strlen(codec_options);
- codec_options += n; len -= n;
- }
- fclose(fp);
- FFMPEG::set_option_path(default_file, "%s/%s", path, codec);
- return FFMPEG::load_options(default_file, codec_options, len);
-}
-
-int FormatFFMPEG::handle_event()
-{
- BC_ListBoxItem *selection = get_selection(0, 0);
- if( selection ) {
- char *text = get_selection(0, 0)->get_text();
- format->ffmpeg_type->update(text);
- Asset *asset = format->asset;
- strcpy(asset->fformat, text);
- strcpy(asset->ff_audio_options, "");
- strcpy(asset->ff_video_options, "");
- asset->audio_data = !load_defaults("audio", text, asset->acodec,
- asset->ff_audio_options, sizeof(asset->ff_audio_options));
- asset->video_data = !load_defaults("video", text, asset->vcodec,
- asset->ff_video_options, sizeof(asset->ff_video_options));
- format->update_extension();
- format->close_format_windows();
- format->update_format();
- }
- return 1;
-}
-
-
-
-
-FormatChannels::FormatChannels(int x, int y, FormatTools *format)
- : BC_TextBox(x, y, 100, 1, format->asset->channels)
-{
- this->format = format;
-}
-
-FormatChannels::~FormatChannels()
-{
-}
-
-int FormatChannels::handle_event()
-{
- format->asset->channels = atol(get_text());
- return 1;
-}
-
-
-FormatToTracks::FormatToTracks(int x, int y, int *output)
- : BC_CheckBox(x, y, *output, _("Overwrite project with output"))
-{
- this->output = output;
-}
-
-FormatToTracks::~FormatToTracks()
-{
-}
-
-int FormatToTracks::handle_event()
-{
- *output = get_value();
- return 1;
-}
-
-
-FormatMultiple::FormatMultiple(MWindow *mwindow, int x, int y, int *output)
- : BC_CheckBox(x,
- y,
- (*output == FILE_PER_LABEL) || (*output == FILE_PER_LABEL_FARM),
- _("Create new file at each label"))
-{
- this->output = output;
- this->mwindow = mwindow;
-}
-
-FormatMultiple::~FormatMultiple()
-{
-}
-
-int FormatMultiple::handle_event()
-{
- if(get_value())
- {
- if(mwindow->preferences->use_renderfarm)
- *output = FILE_PER_LABEL_FARM;
- else
- *output = FILE_PER_LABEL;
- }
- else
- {
- if(mwindow->preferences->use_renderfarm)
- *output = SINGLE_PASS_FARM;
- else
- *output = SINGLE_PASS;
- }
- return 1;
-}
-
-void FormatMultiple::update(int *output)
-{
- this->output = output;
- if(*output == FILE_PER_LABEL_FARM ||
- *output ==FILE_PER_LABEL)
- set_value(1);
- else
- set_value(0);
-}
-
-