X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=win%2FC%23%2FFunctions%2FQueryGenerator.cs;fp=win%2FC%23%2FFunctions%2FQueryGenerator.cs;h=749103618948460e3d7dad687e41c5725118c636;hb=ee932fa7c59d811e53dcab64bcaf0fce2527052d;hp=0000000000000000000000000000000000000000;hpb=03abe4fee6e608fd5c20cda70c0eb4763a56ad4f;p=handbrake-jp%2Fhandbrake-jp.git diff --git a/win/C#/Functions/QueryGenerator.cs b/win/C#/Functions/QueryGenerator.cs new file mode 100644 index 0000000..7491036 --- /dev/null +++ b/win/C#/Functions/QueryGenerator.cs @@ -0,0 +1,594 @@ +/* QueryGenerator.cs $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +using System; +using System.Windows.Forms; +using System.Globalization; +using System.IO; +using System.Collections.Generic; + +namespace Handbrake.Functions +{ + class QueryGenerator + { + /// + /// Generates a full CLI query for either encoding or previe encoeds if duration and preview are defined. + /// + /// + /// + /// + /// + public string GenerateCLIQuery(frmMain mainWindow, int duration, string preview) + { + string query = ""; + + if (!string.IsNullOrEmpty(mainWindow.sourcePath)) + if (mainWindow.sourcePath.Trim() != "Select \"Source\" to continue") + query = " -i " + '"' + mainWindow.sourcePath + '"'; + + if (mainWindow.drp_dvdtitle.Text != "") + { + string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' '); + query += " -t " + titleInfo[0]; + } + + if (!Properties.Settings.Default.noDvdNav) + if (mainWindow.drop_angle.Items.Count != 0) + query += " --angle " + mainWindow.drop_angle.SelectedItem; + + + if (duration != 0 && preview != null) // Preivew Query + { + query += " --start-at-preview " + preview; + query += " --stop-at duration:" + duration + " "; + + if (mainWindow.text_destination.Text != "") + query += " -o " + '"' + mainWindow.text_destination.Text.Replace(".m", "_sample.m") + '"'; + } + else // Non Preview Query + { + if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text && mainWindow.drop_chapterStart.Text != "") + query += " -c " + mainWindow.drop_chapterStart.Text; + else if (mainWindow.drop_chapterStart.Text == "Auto" && mainWindow.drop_chapterFinish.Text != "Auto") + query += " -c " + "0-" + mainWindow.drop_chapterFinish.Text; + else if (mainWindow.drop_chapterStart.Text != "Auto" && mainWindow.drop_chapterFinish.Text != "Auto" && mainWindow.drop_chapterStart.Text != "") + query += " -c " + mainWindow.drop_chapterStart.Text + "-" + mainWindow.drop_chapterFinish.Text; + + if (mainWindow.text_destination.Text != "") + query += " -o " + '"' + mainWindow.text_destination.Text + '"'; + } + + query += GenerateTabbedComponentsQuery(mainWindow); + + return query; + } + + /// + /// Generates part of the CLI query, for the tabbed components only. + /// + /// + /// + public static string GenerateTabbedComponentsQuery(frmMain mainWindow) + { + string query = ""; + + #region Output Settings Box + query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", ""); + + // These are output settings features + if (mainWindow.check_largeFile.Checked) + query += " -4 "; + + if (mainWindow.check_iPodAtom.Checked) + query += " -I "; + + if (mainWindow.check_optimiseMP4.Checked) + query += " -O "; + #endregion + + #region Picture Settings Tab + + // Use MaxWidth for built-in presets and width for user settings. + if (mainWindow.PictureSettings.PresetMaximumResolution.Width == 0) + { + if (mainWindow.PictureSettings.text_width.Value != 0) + if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic + query += " -w " + mainWindow.PictureSettings.text_width.Text; + } + else + { + if (mainWindow.PictureSettings.text_width.Value != 0) + if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) + query += " -X " + mainWindow.PictureSettings.text_width.Text; + } + + // Use MaxHeight for built-in presets and height for user settings. + if (mainWindow.PictureSettings.PresetMaximumResolution.Height == 0) + { + if (mainWindow.PictureSettings.text_height.Value != 0) + if (mainWindow.PictureSettings.text_height.Text != "") + if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 || mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic + query += " -l " + mainWindow.PictureSettings.text_height.Text; + } + else + { + if (mainWindow.PictureSettings.text_height.Value != 0) + if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 || mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) + query += " -Y " + mainWindow.PictureSettings.text_height.Text; + } + + string cropTop = mainWindow.PictureSettings.crop_top.Text; + string cropBottom = mainWindow.PictureSettings.crop_bottom.Text; + string cropLeft = mainWindow.PictureSettings.crop_left.Text; + string cropRight = mainWindow.PictureSettings.crop_right.Text; + + if (mainWindow.PictureSettings.check_customCrop.Checked) + { + if (mainWindow.PictureSettings.crop_top.Text == string.Empty) + cropTop = "0"; + if (mainWindow.PictureSettings.crop_bottom.Text == string.Empty) + cropBottom = "0"; + if (mainWindow.PictureSettings.crop_left.Text == string.Empty) + cropLeft = "0"; + if (mainWindow.PictureSettings.crop_right.Text == string.Empty) + cropRight = "0"; + + query += " --crop " + cropTop + ":" + cropBottom + ":" + cropLeft + ":" + cropRight; + } + + switch (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex) + { + case 1: + query += " --strict-anamorphic "; + break; + case 2: + query += " --loose-anamorphic "; + break; + case 3: + query += " --custom-anamorphic "; + + if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0) + query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem; + + if (mainWindow.PictureSettings.check_KeepAR.Checked) + query += " --display-width " + mainWindow.PictureSettings.updownDisplayWidth.Text + " "; + + if (mainWindow.PictureSettings.check_KeepAR.Checked) + query += " --keep-display-aspect "; + + if (!mainWindow.PictureSettings.check_KeepAR.Checked) + if (mainWindow.PictureSettings.updownParWidth.Text != "" && mainWindow.PictureSettings.updownParHeight.Text != "") + query += " --pixel-aspect " + mainWindow.PictureSettings.updownParWidth.Text + ":" + mainWindow.PictureSettings.updownParHeight.Text + " "; + break; + } + #endregion + + #region Filters + query += mainWindow.Filters.getCLIQuery; + #endregion + + #region Video Settings Tab + + switch (mainWindow.drp_videoEncoder.Text) + { + case "MPEG-4 (FFmpeg)": + query += " -e ffmpeg"; + break; + case "H.264 (x264)": + query += " -e x264"; + break; + case "VP3 (Theora)": + query += " -e theora"; + break; + default: + query += " -e x264"; + break; + } + + // Video Settings + if (mainWindow.radio_avgBitrate.Checked) + query += " -b " + mainWindow.text_bitrate.Text; + + if (mainWindow.radio_targetFilesize.Checked) + query += " -S " + mainWindow.text_filesize.Text; + + // Video Quality Setting + if (mainWindow.radio_cq.Checked) + { + double cqStep = Properties.Settings.Default.x264cqstep; + double value; + switch (mainWindow.drp_videoEncoder.Text) + { + case "MPEG-4 (FFmpeg)": + value = 31 - (mainWindow.slider_videoQuality.Value - 1); + query += " -q " + value.ToString(new CultureInfo("en-US")); + break; + case "H.264 (x264)": + CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); + value = 51 - mainWindow.slider_videoQuality.Value * cqStep; + value = Math.Round(value, 2); + query += " -q " + value.ToString(culture); + break; + case "VP3 (Theora)": + value = mainWindow.slider_videoQuality.Value; + query += " -q " + value.ToString(new CultureInfo("en-US")); + break; + } + } + + if (mainWindow.check_2PassEncode.Checked) + query += " -2 "; + + if (mainWindow.check_turbo.Checked) + query += " -T "; + + if (mainWindow.drp_videoFramerate.Text != "Same as source") + query += " -r " + mainWindow.drp_videoFramerate.Text; + #endregion + + #region Audio Settings Tab + + ListView audioTracks = mainWindow.AudioSettings.GetAudioPanel(); + List tracks = new List(); + List codecs = new List(); + List mixdowns = new List(); + List samplerates = new List(); + List bitrates = new List(); + List drcs = new List(); + + // No Audio + if (audioTracks.Items.Count == 0) + query += " -a none "; + + // Gather information about each audio track and store them in the declared lists. + foreach (ListViewItem row in audioTracks.Items) + { + // Audio Track (-a) + if (row.SubItems[1].Text == "Automatic") + tracks.Add("1"); + else if (row.Text != "None") + { + string[] tempSub = row.SubItems[1].Text.Split(' '); + tracks.Add(tempSub[0]); + } + + // Audio Codec (-E) + if (row.SubItems[2].Text != String.Empty) + codecs.Add(getAudioEncoder(row.SubItems[2].Text)); + + // Audio Mixdown (-6) + if (row.SubItems[3].Text != String.Empty) + mixdowns.Add(getMixDown(row.SubItems[3].Text)); + + // Sample Rate (-R) + if (row.SubItems[4].Text != String.Empty) + samplerates.Add(row.SubItems[4].Text.Replace("Auto", "Auto")); + + // Audio Bitrate (-B) + if (row.SubItems[5].Text != String.Empty) + bitrates.Add(row.SubItems[5].Text.Replace("Auto", "auto")); + + // DRC (-D) + if (row.SubItems[6].Text != String.Empty) + drcs.Add(row.SubItems[6].Text); + } + + // Audio Track (-a) + String audioItems = ""; + Boolean firstLoop = true; + + foreach (String item in tracks) + { + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -a " + audioItems; + firstLoop = true; audioItems = ""; // Reset for another pass. + + // Audio Codec (-E) + foreach (String item in codecs) + { + + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -E " + audioItems; + firstLoop = true; audioItems = ""; // Reset for another pass. + + // Audio Mixdown (-6) + foreach (String item in mixdowns) + { + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -6 " + audioItems; + firstLoop = true; audioItems = ""; // Reset for another pass. + + // Sample Rate (-R) + foreach (String item in samplerates) + { + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -R " + audioItems; + firstLoop = true; audioItems = ""; // Reset for another pass. + + // Audio Bitrate (-B) + foreach (String item in bitrates) + { + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -B " + audioItems; + firstLoop = true; audioItems = ""; // Reset for another pass. + + // DRC (-D) + foreach (var itm in drcs) + { + string item = itm.ToString(new CultureInfo("en-US")); + if (firstLoop) + { + audioItems = item; firstLoop = false; + } + else + audioItems += "," + item; + } + if (audioItems.Trim() != String.Empty) + query += " -D " + audioItems; + + #endregion + + #region Subtitles Tab + if (mainWindow.Subtitles.lv_subList.Items.Count != 0) // If we have subtitle tracks + { + IDictionary langMap = Main.mapLanguages(); + + // BitMap and CC's + string subtitleTracks = String.Empty; + string subtitleForced = String.Empty; + string subtitleBurn = String.Empty; + string subtitleDefault = String.Empty; + + // SRT + string srtFile = String.Empty; + string srtCodeset = String.Empty; + string srtOffset = String.Empty; + string srtLang = String.Empty; + string srtDefault = String.Empty; + int srtCount = 0; + + List SubList = mainWindow.Subtitles.GetSubtitleInfoList(); + + foreach (var item in SubList) + { + string itemToAdd, trackID; + + if (item.SrtPath != "-") // We have an SRT file + { + srtCount++; // SRT track id. + + srtLang += srtLang == "" ? langMap[item.SrtLang] : "," + langMap[item.SrtLang]; + srtCodeset += srtCodeset == "" ? item.SrtCharCode : "," + item.SrtCharCode; + + if (item.Default == "Yes") // default + srtDefault = srtCount.ToString(); + + itemToAdd = item.SrtPath; + srtFile += srtFile == "" ? itemToAdd : "," + itemToAdd; + + itemToAdd = item.SrtOffset.ToString(); + srtOffset += srtOffset == "" ? itemToAdd : "," + itemToAdd; + } + else // We have Bitmap or CC + { + string[] tempSub; + + // Find --subtitle + if (item.Track.Contains("Foreign Audio Search")) + itemToAdd = "scan"; + else + { + tempSub = item.Track.Split(' '); + itemToAdd = tempSub[0]; + } + + subtitleTracks += subtitleTracks == "" ? itemToAdd : "," + itemToAdd; + + // Find --subtitle-forced + itemToAdd = ""; + tempSub = item.Track.Split(' '); + trackID = tempSub[0]; + + if (item.Forced == "Yes") + itemToAdd = trackID; + + if (itemToAdd != "") + subtitleForced += subtitleForced == "" ? itemToAdd : "," + itemToAdd; + + // Find --subtitle-burn and --subtitle-default + trackID = tempSub[0]; + + if (trackID.Trim() == "Foreign") + trackID = "scan"; + + if (item.Burned == "Yes") // burn + subtitleBurn = trackID; + + if (item.Default == "Yes") // default + subtitleDefault = trackID; + } + } + + // Build The CLI Subtitles Query + if (subtitleTracks != "") + { + query += " --subtitle " + subtitleTracks; + + if (subtitleForced != "") + query += " --subtitle-forced=" + subtitleForced; + if (subtitleBurn != "") + query += " --subtitle-burn=" + subtitleBurn; + if (subtitleDefault != "") + query += " --subtitle-default=" + subtitleDefault; + } + + if (srtFile != "") // SRTs + { + query += " --srt-file " + "\"" + srtFile + "\""; + + if (srtCodeset != "") + query += " --srt-codeset " + srtCodeset; + if (srtOffset != "") + query += " --srt-offset " + srtOffset; + if (srtLang != "") + query += " --srt-lang " + srtLang; + if (srtDefault != "") + query += " --srt-default=" + srtDefault; + } + + } + #endregion + + #region Chapter Markers + + // Attach Source name and dvd title to the start of the chapters.csv filename. + // This is for the queue. It allows different chapter name files for each title. + string[] destName = mainWindow.text_destination.Text.Split('\\'); + string dest_name = destName[destName.Length - 1]; + dest_name = dest_name.Replace("\"", ""); + dest_name = dest_name.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", ""); + + string source_title = mainWindow.drp_dvdtitle.Text; + string[] titlesplit = source_title.Split(' '); + source_title = titlesplit[0]; + + if (mainWindow.Check_ChapterMarkers.Checked && mainWindow.Check_ChapterMarkers.Enabled) + { + if (dest_name.Trim() != String.Empty) + { + string path = source_title != "Automatic" + ? Path.Combine(Path.GetTempPath(), dest_name + "-" + source_title + "-chapters.csv") + : Path.Combine(Path.GetTempPath(), dest_name + "-chapters.csv"); + + if (chapterCSVSave(mainWindow, path) == false) + query += " -m "; + else + query += " --markers=" + "\"" + path + "\""; + } + else + query += " -m"; + } + #endregion + + #region H264 Tab + if (mainWindow.x264Panel.x264Query != "") + query += " -x " + mainWindow.x264Panel.x264Query; + #endregion + + #region Processors / Other + string processors = Properties.Settings.Default.Processors; + if (processors != "Automatic") + query += " -C " + processors + " "; + + query += " -v " + Properties.Settings.Default.verboseLevel; + + if (Properties.Settings.Default.noDvdNav) + query += " --no-dvdnav"; + #endregion + + return query; + } + + private static string getMixDown(string selectedAudio) + { + switch (selectedAudio) + { + case "Automatic": + return "auto"; + case "Mono": + return "mono"; + case "Stereo": + return "stereo"; + case "Dolby Surround": + return "dpl1"; + case "Dolby Pro Logic II": + return "dpl2"; + case "6 Channel Discrete": + return "6ch"; + default: + return "auto"; + } + } + private static string getAudioEncoder(string selectedEncoder) + { + switch (selectedEncoder) + { + case "AAC (faac)": + return "faac"; + case "MP3 (lame)": + return "lame"; + case "Vorbis (vorbis)": + return "vorbis"; + case "AC3 Passthru": + return "ac3"; + case "DTS Passthru": + return "dts"; + default: + return ""; + } + } + private static Boolean chapterCSVSave(frmMain mainWindow, string filePathName) + { + try + { + string csv = ""; + + foreach (DataGridViewRow row in mainWindow.data_chpt.Rows) + { + csv += row.Cells[0].Value.ToString(); + csv += ","; + csv += row.Cells[1].Value.ToString(); + csv += Environment.NewLine; + } + StreamWriter file = new StreamWriter(filePathName); + file.Write(csv); + file.Close(); + file.Dispose(); + return true; + } + catch (Exception exc) + { + MessageBox.Show("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode \n\n" + exc, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + } + } +} \ No newline at end of file