Exemple #1
0
 private void UpdateCropSizeInfo()
 {
     if (inputFile == null)
     {
         labelCropSize.Text = "";
         return;
     }
     if (PictureConfig.IsCropped())
     {
         labelCropSize.Text = $"{PictureConfig.InputDisplaySize.ToString()} → {PictureConfig.CropSize.ToString()}";
     }
     else
     {
         labelCropSize.Text = "";
     }
 }
        private void SetInputFile(string path)
        {
            try
            {
                ValidateInputFile(path);
                inputFile = new InputFile(path);
                inputFile.Probe();
            }
            catch (Exception ex)
            {
                inputFile = null;

                textBoxIn.Text  = "Файл не выбран";
                textBoxOut.Text = "";

                buttonGo.Enabled            = false;
                buttonPreview.Enabled       = false;
                buttonShowInfo.Enabled      = false;
                buttonOpenInputFile.Enabled = false;

                ToggleTabs();

                // reset
                PictureConfig.Reset();
                UpdateCropSizeInfo();
                CalcFileSize();
                SetOutputInfo();
                ClearTags();
                ResetCrop();

                sizeChanged = false;

                textBoxSubtitlesPath.Text = "";

                Text = formTitle;

                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }

#if DEBUG
            Console.WriteLine(inputFile.StreamInfo);
#endif

            textBoxIn.Text = path;
            Properties.Settings.Default.InPath = Path.GetDirectoryName(path);

            ToggleTabs();

            Text = Path.GetFileName(path) + " - " + formTitle;

            VideoStream vStream = inputFile.VideoStreams[0];

            PictureConfig.Reset();
            PictureConfig.InputOriginalSize = vStream.OriginalSize;
            PictureConfig.InputDisplaySize  = vStream.PictureSize;

            numericUpDownHeight.Value = Math.Max(PictureConfig.CropSize.Height, PictureConfig.MinHeight);
            numericUpDownWidth.Value  = Math.Max(PictureConfig.CropSize.Width, PictureConfig.MinWidth); // triggered UpdateHeight() if keeping ar

            numericCropTop.Maximum    = PictureConfig.InputOriginalSize.Height;
            numericCropBottom.Maximum = PictureConfig.InputOriginalSize.Height;
            numericCropLeft.Maximum   = PictureConfig.InputOriginalSize.Width;
            numericCropRight.Maximum  = PictureConfig.InputOriginalSize.Width;

            ResetCrop();

            // set original aspect ratio
            FillComboBoxAspectRatio(true);

            sizeChanged = false; // reset after wet WxH in numericUpDown

            // if need deinterlace
            PictureConfig.Deinterlace        = checkBoxDeinterlace.Checked = vStream.FieldOrder != "progressive";
            comboBoxFieldOrder.SelectedIndex = 0; // TODO: get from Picture
            ManageCheckPanel(checkBoxDeinterlace, panelDeinterlace);

            ResetRotateAndFlip();

            comboBoxFrameRate.SelectedIndex = 0;

            CheckVideoMustConvert();

            // fill audio streams
            FillAudioStreams();

            // show info
            SetInputInfo();

            CalcFileSize();

            buttonGo.Enabled            = true;
            buttonPreview.Enabled       = true;
            buttonShowInfo.Enabled      = true;
            buttonOpenInputFile.Enabled = true;

            UpdateCropSizeInfo();
            SetOutputInfo();

            SetTagsFromInputFile();

            textBoxSubtitlesPath.Text = "";

            try
            {
                string outDir           = "";
                string withoutExtension = Path.GetFileNameWithoutExtension(path);

                if (checkBoxKeepOutPath.Checked)
                {
                    if (!string.IsNullOrWhiteSpace(textBoxOut.Text))
                    {
                        outDir = Path.GetDirectoryName(textBoxOut.Text);
                    }
                    else if (!string.IsNullOrWhiteSpace(Properties.Settings.Default.OutPath))
                    {
                        outDir = Properties.Settings.Default.OutPath;
                    }
                }

                if (string.IsNullOrWhiteSpace(outDir) || !Directory.Exists(outDir))
                {
                    outDir = Path.GetDirectoryName(path);
                }

                Properties.Settings.Default.OutPath = outDir;

                string outPath = Path.Combine(outDir, withoutExtension + "." + fileType);
                int    num     = 2;
                while (File.Exists(outPath))
                {
                    outPath = Path.Combine(outDir, withoutExtension + " (" + num.ToString() + ")." + fileType);
                    num++;
                    // if so many duplicates set name manually
                    if (num > 100)
                    {
                        break;
                    }
                }
                textBoxOut.Text = outPath;
            }
            catch (Exception) { }
        }
        /// <summary>
        /// Create content for "vf" argument
        /// </summary>
        /// <param name="subtitlesPath"></param>
        /// <returns></returns>
        private string GetVideoFilters(string subtitlesPath)
        {
            List <string> filters = new List <string>();

            // https://ffmpeg.org/ffmpeg-filters.html#yadif-1
            if (PictureConfig.Deinterlace)
            {
                filters.Add($"yadif=parity={PictureConfig.FieldOrder}");
            }

            // https://ffmpeg.org/ffmpeg-filters.html#crop
            if (PictureConfig.IsCropped())
            {
                // using oar
                int cropW = PictureConfig.InputOriginalSize.Width - PictureConfig.Crop.Left - PictureConfig.Crop.Right;
                int cropH = PictureConfig.InputOriginalSize.Height - PictureConfig.Crop.Top - PictureConfig.Crop.Bottom;
                filters.Add($"crop={cropW}:{cropH}:{PictureConfig.Crop.Left}:{PictureConfig.Crop.Top}");
            }

            // https://ffmpeg.org/ffmpeg-filters.html#scale-1
            if (PictureConfig.OutputSize.Width != PictureConfig.CropSize.Width || PictureConfig.OutputSize.Height != PictureConfig.CropSize.Height)
            {
                // https://www.ffmpeg.org/ffmpeg-scaler.html#sws_005fflags
                filters.Add($"scale={PictureConfig.OutputSize.Width}x{PictureConfig.OutputSize.Height}:flags={PictureConfig.Interpolation}");
            }
            else if (PictureConfig.IsUsingDAR())
            {
                // force scale for not square pixels
                filters.Add($"scale={PictureConfig.CropSize.Width}x{PictureConfig.CropSize.Height}:flags={PictureConfig.Interpolation}");
            }

            // https://ffmpeg.org/ffmpeg-filters.html#pad-1

            /*if (PictureConfig.Padding.X > 0 || PictureConfig.Padding.Y > 0)
             * {
             *  filters.Add($"pad={PictureConfig.SelectedSize.Width}:{PictureConfig.SelectedSize.Height}:{PictureConfig.Padding.X}:{PictureConfig.Padding.Y}");
             * }*/

            // https://ffmpeg.org/ffmpeg-filters.html#transpose
            if (PictureConfig.Rotate == 180)
            {
                filters.Add("transpose=2,transpose=2");
            }
            else if (PictureConfig.Rotate == 90)
            {
                filters.Add("transpose=1");
            }
            else if (PictureConfig.Rotate == 270)
            {
                filters.Add("transpose=2");
            }

            // https://ffmpeg.org/ffmpeg-filters.html#hflip
            if (PictureConfig.Flip)
            {
                filters.Add("hflip");
            }

            // Set subtitles
            // https://trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo
            if (!string.IsNullOrWhiteSpace(subtitlesPath) && File.Exists(subtitlesPath))
            {
                // https://ffmpeg.org/ffmpeg-filters.html#Notes-on-filtergraph-escaping
                filters.Add($"subtitles={subtitlesPath.Replace("\\", "\\\\\\\\").Replace("'", "\\\\\\'").Replace(":", "\\\\:").Replace(",", "\\,")}");
            }

            // force sar 1:1
            // https://ffmpeg.org/ffmpeg-filters.html#setdar_002c-setsar
            filters.Add("setsar=sar=1/1");

            // color filter
            // https://ffmpeg.org/ffmpeg-filters.html#colorchannelmixer
            if (PictureConfig.ColorChannelMixerList.ContainsKey(PictureConfig.ColorFilter))
            {
                filters.Add($"colorchannelmixer={PictureConfig.ColorChannelMixerList[PictureConfig.ColorFilter]}");
            }

            return(string.Join(",", filters));
        }