123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Linq;
- using System.Text;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Collections.ObjectModel;
- using MatrixIO.IO.Bmff;
- using Microsoft.Win32;
- using System.IO;
- using System.Windows.Controls.Primitives;
- using System.Diagnostics;
- using MatrixIO.IO.Bmff.Boxes;
- namespace BmffViewer
- {
- /// <summary>
- /// Interaction logic for MainWindow.xaml
- /// </summary>
- public partial class MainWindow : Window
- {
- private readonly ObservableCollection<IMediaFile> _files = new ObservableCollection<IMediaFile>();
- public ObservableCollection<IMediaFile> Files { get { return _files; } }
- public VirtualizedBinaryReader BinaryReader;
- public MainWindow()
- {
- InitializeComponent();
- }
- private void SupportedBoxes_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var supportedBoxes = new SupportedBoxesWindow();
- supportedBoxes.ShowDialog();
- }
- private static readonly string FileFormats = String.Join("|", new string[]
- {
- "All Supported Files|*.mp4;*.m4a;*.m4v;*.mov;*.moov;*.qif;*.qtif;*.ismv;*.isma;*.ismt;*.3gp;*.3gpp;*.3g2;*.3gpp2;*.dcf;*.m21;*.mp21;*.dvb;*.jp2;*.jpx;*.f4v;*.f4p;*.f4a;*.f4b",
- "Audio Files|*.m4a;*.isma;*.f4a",
- "Caption Files|*.ismt",
- "Mobile Files|*.3gp;*.3gpp;*.3g2;*.3gpp2;*.dcf",
- "Image Files|*.jp2;*.jpx;*.qif;*.qtif",
- "Video files|*.mp4;*.m4a;*.m4v;*.mov;*.moov;*.ismv;*.isma;*.ismt;*.3gp;*.3gpp;*.3g2;*.3gpp2;*.m21;*.mp21;*.dvb;*.f4v;*.f4p",
-
- "3GPP|*.3gp;*.3gpp;*.3g2;*.3gpp2",
- "DCF|*.dcf",
- "DVB|*.dvb",
- "JPEG2000|*.jp2;*.jpx;*.jpm",
- "MPEG|*.mp4;*.m4a;*.m4v;*.m21;*.mp21",
- "PIFF|*.ismv;*.isma;*.ismt",
- "Flash|*.f4v;*.f4p;*.f4a;*.f4b",
- "All Files|*.*",
- });
- private void Open_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var openFileDialog = new OpenFileDialog {Filter = FileFormats, CheckFileExists = true, Multiselect = true};
- openFileDialog.FileOk += (source, cancelEventArgs) =>
- {
- foreach (var bmf in from fileName in openFileDialog.FileNames where !Files.Any(file => file.FullName == fileName ? true : false) select new BaseMediaFile(fileName))
- {
- Files.Add(bmf);
- }
- };
- openFileDialog.ShowDialog(this);
- e.Handled = true;
- }
- private void Close_CanExecute(object sender, CanExecuteRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- e.CanExecute = true;
- e.Handled = true;
- }
- private void Close_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- Files.Remove(bmf);
- bmf.Close();
- bmf.Dispose();
- e.Handled = true;
- }
- private void SaveAs_CanExecute(object sender, CanExecuteRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- e.CanExecute = true;
- e.Handled = true;
- }
- private void SaveAs_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- var saveFileDialog = new SaveFileDialog
- {
- FileName = bmf.NameWithoutExtension + " (Copy)" + bmf.Extension,
- InitialDirectory = bmf.DirectoryName,
- Filter = FileFormats,
- CheckFileExists = false
- };
- saveFileDialog.FileOk += (source, cancelEventArgs) =>
- {
- if (saveFileDialog.FileName != bmf.FullName)
- {
- bmf.SaveAs(saveFileDialog.FileName);
- Files.Add(new BaseMediaFile(saveFileDialog.FileName));
- }
- else
- MessageBox.Show("Cannot Save As to the same filename as the source file.", "Error");
- };
- saveFileDialog.ShowDialog(this);
- e.Handled = true;
- }
- private void FastStart_CanExecute(object sender, CanExecuteRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- var moov = bmf.Children.OfType<MovieBox>().SingleOrDefault();
- if (moov == null) return;
- var mdat = bmf.Children.OfType<MovieDataBox>().SingleOrDefault();
- if (mdat == null) return;
- if (bmf.Children.IndexOf(moov) > bmf.Children.IndexOf(mdat)) e.CanExecute = true;
- else
- {
- bool foundJunk = false;
- for (int i = bmf.Children.IndexOf(moov) + 1; i < bmf.Children.IndexOf(mdat); i++)
- {
- if (bmf.Children[i].Type == "junk" || bmf.Children[i].Type == "skip" || bmf.Children[i].Type == "free" || bmf.Children[i].Type == "wide")
- foundJunk = true;
- }
- if (!foundJunk) return;
- e.CanExecute = true;
- }
- e.Handled = true;
- }
- private void FastStart_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- var saveFileDialog = new SaveFileDialog
- {
- FileName = bmf.NameWithoutExtension + ".Progressive" + bmf.Extension,
- InitialDirectory = bmf.DirectoryName,
- Filter = FileFormats,
- CheckFileExists = false
- };
- saveFileDialog.FileOk += (source, cancelEventArgs) =>
- {
- if (saveFileDialog.FileName != bmf.FullName)
- {
- bmf.FastStart(saveFileDialog.FileName);
- Files.Add(new BaseMediaFile(saveFileDialog.FileName));
- }
- else
- MessageBox.Show("Cannot FastStart to the same filename as the source file.", "Error");
- };
- saveFileDialog.ShowDialog(this);
- e.Handled = true;
- }
- private void DecompressMovieHeader_CanExecute(object sender, CanExecuteRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- var moov = bmf.Children.OfType<MovieBox>().SingleOrDefault();
- if (moov == null) return;
- var cmov = moov.Children.OfType<CompressedMovieBox>().SingleOrDefault();
- if (cmov == null) return;
- var dcom = cmov.Children.OfType<DataCompressionBox>().SingleOrDefault();
- if (dcom == null) return;
- var cmvd = cmov.Children.OfType<CompressedMovieDataBox>().SingleOrDefault();
- if (cmvd == null) return;
-
- e.CanExecute = true;
- e.Handled = true;
- }
- private void DecompressMovieHeader_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- var item = TreeView1.Tag as TreeViewItem;
- if (item == null) return;
- BaseMediaFile bmf = GetFileForItem(item);
- if (bmf == null) return;
- bmf.DecompressMovieHeader();
- e.Handled = true;
- }
- // This is a bit hackish but it saves the TreeViewItem for the current selected item.
- private void TreeView1_TreeViewItem_Selected(object sender, RoutedEventArgs e)
- {
- var tv = sender as TreeView;
- if (tv != null) tv.Tag = e.OriginalSource;
- }
- private BaseMediaFile GetFileForItem(TreeViewItem item)
- {
- var currentItem = item;
- while(currentItem != null)
- {
- var parent = GetTreeViewItemParent(currentItem);
- if (parent !=null) currentItem = parent;
- else break;
- }
- var treeViewItem = (TreeViewItem) currentItem;
- return (treeViewItem != null) ? treeViewItem.DataContext as BaseMediaFile : null;
- }
- private TreeViewItem GetTreeViewItemParent(TreeViewItem item)
- {
- var parent = VisualTreeHelper.GetParent(item);
- while (parent != null && !(parent is TreeViewItem || parent is TreeView))
- {
- parent = VisualTreeHelper.GetParent(parent);
- }
- return parent as TreeViewItem;
- }
- private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
- {
- e.Row.Header = e.Row.DataContext == CollectionView.NewItemPlaceholder ? "*" : e.Row.GetIndex().ToString(CultureInfo.InvariantCulture);
- }
- private LogWindow _logWindow;
- private void Log_Executed(object sender, ExecutedRoutedEventArgs e)
- {
- if (_logWindow == null)
- {
- _logWindow = new LogWindow();
- _logWindow.Closed += (sender2, e2) => { _logWindow = null; };
- _logWindow.Show();
- }
- else
- {
- _logWindow.Activate();
- }
- }
- }
- }
|