nested clips, big rework and cleanup, sams new icons, leaks and tweaks
[goodguy/history.git] / cinelerra-5.1 / cinelerra / dvdcreate.C
index 6a870a72d980e036b6bffae8ae2b6afa1559b391..1014baf5e2368312a739e01b0d5bac51aedcbc76 100644 (file)
@@ -16,6 +16,7 @@
 #include "mwindowgui.h"
 #include "plugin.h"
 #include "pluginset.h"
+#include "preferences.h"
 #include "rescale.h"
 #include "track.h"
 #include "tracks.h"
@@ -183,10 +184,18 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
        fprintf(fp,"\n");
        const char *exec_path = File::get_cinlib_path();
        fprintf(fp,"PATH=$PATH:%s\n",exec_path);
-       if( !use_ffmpeg ) {
-               fprintf(fp,"mplex -f 8 -o $1/dvd.mpg $1/dvd.m2v $1/dvd.ac3\n");
-               fprintf(fp,"\n");
+       if( mwindow->preferences->use_renderfarm ||
+           (use_label_chapters && edl->labels ) ) {
+               if( !use_ffmpeg ) {
+                       fprintf(fp, "cat > $1/dvd.m2v $1/dvd.m2v0*\n");
+                       fprintf(fp, "mplex -M -f 8 -o $1/dvd.mpg $1/dvd.m2v $1/dvd.ac3\n");
+               }
+               else
+                       fprintf(fp, "ffmpeg -f concat -safe 0 -i <(for f in \"$1/dvd.mpg0\"*; do "
+                                       "echo \"file '$f'\"; done) -c copy -y $1/dvd.mpg\n");
        }
+       else
+               fprintf(fp, "mplex -f 8 -o $1/dvd.mpg $1/dvd.m2v $1/dvd.ac3\n");
        fprintf(fp,"rm -rf $1/iso\n");
        fprintf(fp,"mkdir -p $1/iso\n");
        fprintf(fp,"\n");
@@ -241,24 +250,13 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
        fprintf(fp,"\n");
        fclose(fp);
 
-       if( use_wide_audio ) {
-               session->audio_channels = session->audio_tracks = DVD_WIDE_CHANNELS;
-               session->achannel_positions[0] = 90;
-               session->achannel_positions[1] = 150;
-               session->achannel_positions[2] = 30;
-               session->achannel_positions[3] = 210;
-               session->achannel_positions[4] = 330;
-               session->achannel_positions[5] = 270;
-               if( edl->tracks->recordable_audio_tracks() == DVD_WIDE_CHANNELS )
-                       mwindow->remap_audio(MWindow::AUDIO_1_TO_1);
-       }
-       else {
-               session->audio_channels = session->audio_tracks = DVD_CHANNELS;
-               session->achannel_positions[0] = 180;
-               session->achannel_positions[1] = 0;
-               if( edl->tracks->recordable_audio_tracks() == DVD_WIDE_CHANNELS )
-                       mwindow->remap_audio(MWindow::AUDIO_5_1_TO_2);
-       }
+       session->audio_channels = session->audio_tracks =
+               !use_wide_audio ? DVD_CHANNELS : DVD_WIDE_CHANNELS;
+       for( int i=0; i<MAX_CHANNELS; ++i )
+               session->achannel_positions[i] = default_audio_channel_position(i, session->audio_channels);
+       int audio_mapping = edl->tracks->recordable_audio_tracks() == DVD_WIDE_CHANNELS &&
+               !use_wide_audio ? MWindow::AUDIO_5_1_TO_2 : MWindow::AUDIO_1_TO_1;
+       mwindow->remap_audio(audio_mapping);
 
        double new_samplerate = session->sample_rate;
        double new_framerate = session->frame_rate;
@@ -277,7 +275,7 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
        char xml_filename[BCTEXTLEN];
        sprintf(xml_filename, "%s/dvd.xml", asset_dir);
        FileXML xml_file;
-       edl->save_xml(&xml_file, xml_filename, 0, 0);
+       edl->save_xml(&xml_file, xml_filename);
        xml_file.terminate_string();
        if( xml_file.write_to_file(xml_filename) ) {
                char msg[BCTEXTLEN];
@@ -286,7 +284,7 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
                return 1;
        }
 
-       BatchRenderJob *job = new BatchRenderJob(mwindow->preferences);
+       BatchRenderJob *job = new BatchRenderJob(mwindow->preferences, use_label_chapters);
        jobs->append(job);
        strcpy(&job->edl_path[0], xml_filename);
        Asset *asset = job->asset;
@@ -334,7 +332,7 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
                asset->vmpeg_preset = 8;
                asset->vmpeg_field_order = 0;
                asset->vmpeg_pframe_distance = 0;
-               job = new BatchRenderJob(mwindow->preferences);
+               job = new BatchRenderJob(mwindow->preferences, 0, 0);
                jobs->append(job);
                strcpy(&job->edl_path[0], xml_filename);
                asset = job->asset;
@@ -352,7 +350,7 @@ int CreateDVD_Thread::create_dvd_jobs(ArrayList<BatchRenderJob*> *jobs, const ch
                asset->ac3_bitrate = dvd_kaudio_rate;
        }
 
-       job = new BatchRenderJob(mwindow->preferences);
+       job = new BatchRenderJob(mwindow->preferences, 0, 0);
        jobs->append(job);
        job->edl_path[0] = '@';
        strcpy(&job->edl_path[1], script_filename);
@@ -438,8 +436,8 @@ void CreateDVD_Thread::handle_close_event(int result)
                insert_video_plugin("Histogram", &keyframe);
        }
        char asset_dir[BCTEXTLEN], jobs_path[BCTEXTLEN];
-       sprintf(asset_dir, "%s/%s", tmp_path, asset_title);
-       sprintf(jobs_path, "%s/dvd.jobs", asset_dir);
+       snprintf(asset_dir, sizeof(asset_dir), "%s/%s", tmp_path, asset_title);
+       snprintf(jobs_path, sizeof(jobs_path), "%s/dvd.jobs", asset_dir);
        mwindow->batch_render->reset(jobs_path);
        int ret = create_dvd_jobs(&mwindow->batch_render->jobs, asset_dir);
        mwindow->undo->update_undo_after(_("create dvd"), LOAD_ALL);
@@ -966,14 +964,13 @@ option_presets()
                                if( !EQUIV(aspect, dvd_aspect) ) use_scale = Rescale::scaled;
                        }
                        for( int i=0; i<trk->plugin_set.size(); ++i ) {
-                               for(Plugin *plugin = (Plugin*)trk->plugin_set[i]->first;
-                                               plugin;
-                                               plugin = (Plugin*)plugin->next) {
-                                       if( !strcmp(plugin->title, _("Deinterlace")) )
+                               for( Plugin *plugin = (Plugin*)trk->plugin_set[i]->first;
+                                               plugin; plugin=(Plugin*)plugin->next ) {
+                                       if( !strcmp(plugin->title, "Deinterlace") )
                                                has_deinterlace = 1;
-                                       if( !strcmp(plugin->title, _("Auto Scale")) ||
-                                           !strcmp(plugin->title, _("Scale Ratio")) ||
-                                           !strcmp(plugin->title, _("Scale")) )
+                                       if( !strcmp(plugin->title, "Auto Scale") ||
+                                           !strcmp(plugin->title, "Scale Ratio") ||
+                                           !strcmp(plugin->title, "Scale") )
                                                has_scale = 1;
                                }
                        }