OSDN Git Service

import original 0.9.5 release original-0.9.5
authorhylom <hylom@silver.local>
Tue, 4 Jan 2011 06:27:26 +0000 (15:27 +0900)
committerhylom <hylom@silver.local>
Tue, 4 Jan 2011 06:27:26 +0000 (15:27 +0900)
388 files changed:
AUTHORS
CREDITS
DoxyfileDotNet [new file with mode: 0644]
DoxyfileGtk [new file with mode: 0644]
DoxyfileLibHb [new file with mode: 0644]
DoxyfileMac [new file with mode: 0644]
NEWS
contrib/a52dec/module.defs
contrib/bzip2/module.defs
contrib/faac/A00-bitrates.patch [new file with mode: 0644]
contrib/ffmpeg/A01-mpegleak.patch
contrib/ffmpeg/A02-audioconvert.patch
contrib/ffmpeg/A03-png-sequences.patch
contrib/ffmpeg/A05-avi-seek.patch [new file with mode: 0644]
contrib/ffmpeg/P01-solaris.patch
contrib/ffmpeg/P02-darwin-pic.patch [new file with mode: 0644]
contrib/ffmpeg/P03-mingw-gnu99.patch [new file with mode: 0644]
contrib/ffmpeg/module.defs
contrib/fontconfig/A00-mingw-disableShared.patch [new file with mode: 0644]
contrib/fontconfig/module.defs [new file with mode: 0644]
contrib/fontconfig/module.rules [new file with mode: 0644]
contrib/freetype/module.defs [new file with mode: 0644]
contrib/freetype/module.rules [new file with mode: 0644]
contrib/libass/A00-configure.patch [new file with mode: 0644]
contrib/libass/module.defs [new file with mode: 0644]
contrib/libass/module.rules [new file with mode: 0644]
contrib/libbluray/module.defs [new file with mode: 0644]
contrib/libbluray/module.rules [new file with mode: 0644]
contrib/libdca/module.defs
contrib/libdvdnav/A06-reset-mutex.patch [new file with mode: 0644]
contrib/libdvdnav/A07-missing-menu.patch
contrib/libdvdnav/A08-dvdnav-dup.patch [new file with mode: 0644]
contrib/libdvdnav/module.defs
contrib/libdvdread/P00-mingw-dlfcn.patch [new file with mode: 0644]
contrib/libdvdread/module.defs
contrib/libmkv/module.defs
contrib/libvorbis/A01-docs.patch [new file with mode: 0644]
contrib/libvorbis/module.defs
contrib/libxml2/module.defs [new file with mode: 0644]
contrib/libxml2/module.rules [new file with mode: 0644]
contrib/mp4v2/A00-nero-vobsub.patch [new file with mode: 0644]
contrib/mp4v2/P00-mingw-dllimport.patch [new file with mode: 0644]
contrib/mp4v2/module.defs
contrib/pthreadw32/P00-mingw-w64.patch [new file with mode: 0644]
contrib/pthreadw32/module.defs
contrib/x264/module.defs
doc/BUILD-Linux
doc/BUILD-Mac
doc/texi/Building.linux.texi
doc/texi/Building.osx.texi
doc/texi/building/chapter.via.xcode.texi
gtk/configure.ac
gtk/ghb.spec
gtk/module.defs
gtk/module.rules
gtk/src/Makefile.am
gtk/src/appcast.c
gtk/src/audiohandler.c
gtk/src/audiohandler.h
gtk/src/callbacks.c
gtk/src/callbacks.h
gtk/src/create_resources.c
gtk/src/create_resources.py
gtk/src/ghb-dvd.c
gtk/src/ghb.ui
gtk/src/ghbcompositor.c
gtk/src/hb-backend.c
gtk/src/hb-backend.h
gtk/src/icon_tools.c
gtk/src/icons.c
gtk/src/internal_defaults.xml
gtk/src/main.c
gtk/src/makedeps.py
gtk/src/marshalers.c
gtk/src/marshalers.h
gtk/src/presets.c
gtk/src/presets.h
gtk/src/preview.c
gtk/src/queuehandler.c
gtk/src/queuehandler.h
gtk/src/resources.c
gtk/src/settings.c
gtk/src/settings.h
gtk/src/standard_presets.xml
gtk/src/subtitlehandler.c
gtk/src/subtitlehandler.h
gtk/src/values.c
gtk/src/widgetdeps.c
gtk/src/x264handler.c
gtk/src/x264handler.h
libhb/batch.c [new file with mode: 0644]
libhb/bd.c [new file with mode: 0644]
libhb/common.c
libhb/common.h
libhb/deca52.c
libhb/decavcodec.c
libhb/deccc608sub.c
libhb/deccc608sub.h
libhb/decdca.c
libhb/declpcm.c
libhb/decmetadata.c
libhb/decmpeg2.c
libhb/decomb.c
libhb/decsrtsub.c
libhb/decssasub.c [new file with mode: 0644]
libhb/dectx3gsub.c [new file with mode: 0644]
libhb/decutf8sub.c [new file with mode: 0644]
libhb/decvobsub.c
libhb/demuxmpeg.c
libhb/downmix.c [new file with mode: 0644]
libhb/downmix.h [new file with mode: 0644]
libhb/dvd.c
libhb/dvd.h
libhb/dvdnav.c
libhb/encac3.c [new file with mode: 0644]
libhb/encavcodec.c
libhb/encfaac.c
libhb/enclame.c
libhb/encvorbis.c
libhb/encx264.c
libhb/fifo.c
libhb/hb.c
libhb/hb.h
libhb/hbffmpeg.h
libhb/internal.h
libhb/module.defs
libhb/muxcommon.c
libhb/muxmkv.c
libhb/muxmp4.c
libhb/platform/macosx/encca_aac.c
libhb/ports.c
libhb/ports.h
libhb/reader.c
libhb/render.c
libhb/rotate.c [new file with mode: 0644]
libhb/scan.c
libhb/stream.c
libhb/sync.c
libhb/work.c
macosx/Controller.h
macosx/Controller.m
macosx/English.lproj/AdvancedView.xib
macosx/English.lproj/MainMenu.xib
macosx/English.lproj/PicturePreview.xib
macosx/English.lproj/Preferences.xib
macosx/English.lproj/Queue.xib
macosx/HBAdvancedController.h
macosx/HBAdvancedController.m
macosx/HBAudio.h [new file with mode: 0644]
macosx/HBAudio.m [new file with mode: 0644]
macosx/HBAudioController.h [new file with mode: 0644]
macosx/HBAudioController.m [new file with mode: 0644]
macosx/HBOutputPanelController.m
macosx/HBOutputRedirect.m
macosx/HBPreferencesController.h
macosx/HBPreferencesController.m
macosx/HBPresets.h
macosx/HBPresets.m
macosx/HBPreviewController.h
macosx/HBPreviewController.m
macosx/HBQueueController.h
macosx/HBQueueController.mm
macosx/HBSubtitles.h
macosx/HBSubtitles.m
macosx/HandBrake.xcodeproj/project.pbxproj
macosx/Info.plist
macosx/PictureController.h
macosx/PictureController.m
macosx/main.mm
make/configure.py
make/include/contrib.defs
make/include/gcc.defs
make/include/main.defs
make/include/main.rules
make/include/tool.defs
pkg/linux/debian/control
pkg/linux/debian/rules
pkg/linux/module.defs
pkg/linux/module.rules
pkg/mingw/module.defs [new file with mode: 0644]
pkg/mingw/module.rules [new file with mode: 0644]
pkg/module.defs
pkg/module.rules
scripts/manicure.rb
test/module.defs
test/module.rules
test/test.c
win/C#/Controls/AudioPanel.Designer.cs
win/C#/Controls/AudioPanel.cs
win/C#/Controls/AudioPanel.resx
win/C#/Controls/Filters.Designer.cs
win/C#/Controls/Filters.cs
win/C#/Controls/PictureSettings.Designer.cs
win/C#/Controls/PictureSettings.cs
win/C#/Controls/Subtitles.Designer.cs
win/C#/Controls/Subtitles.cs
win/C#/Controls/Subtitles.resx
win/C#/Controls/x264Panel.Designer.cs
win/C#/Controls/x264Panel.cs
win/C#/Controls/x264Panel.resx
win/C#/Functions/Main.cs
win/C#/Functions/PresetLoader.cs
win/C#/Functions/QueryGenerator.cs
win/C#/Functions/QueryParser.cs
win/C#/HandBrake.5.1.ReSharper [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/EncodeProgressEventArgs.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/EnumHelper.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/Logging.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/Main.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/System.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/Win32.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Functions/Win7.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Init.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Model/Cropping.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Model/Job.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Model/SubtitleType.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/AudioTrack.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/Chapter.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/DVD.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/Parser.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/Subtitle.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Parsing/Title.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Properties/Resources.Designer.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Properties/Resources.resx [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Resources/logo64.png [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Encode.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Interfaces/IQueue.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Queue.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Services/Scan.cs [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/Settings.StyleCop [new file with mode: 0644]
win/C#/HandBrake.ApplicationServices/app.config [new file with mode: 0644]
win/C#/HandBrake.Framework/HandBrake.Framework.csproj [new file with mode: 0644]
win/C#/HandBrake.Framework/Model/UpdateCheckInformation.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Model/UpdateCheckResult.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Properties/AssemblyInfo.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Properties/Resources.Designer.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Properties/Resources.resx [new file with mode: 0644]
win/C#/HandBrake.Framework/Resources/copy.png [new file with mode: 0644]
win/C#/HandBrake.Framework/Resources/download.png [new file with mode: 0644]
win/C#/HandBrake.Framework/Resources/errorx.png [new file with mode: 0644]
win/C#/HandBrake.Framework/Resources/logo64.png [new file with mode: 0644]
win/C#/HandBrake.Framework/Services/AppcastReader.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Services/ErrorService.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Services/Interfaces/IAppcastReader.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Services/Interfaces/IErrorService.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Services/UpdateService.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Settings.StyleCop [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/DownloadUpdate.Designer.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/DownloadUpdate.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/DownloadUpdate.resx [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/ExceptionWindow.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/ExceptionWindow.designer.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/ExceptionWindow.resx [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/UpdateInfo.Designer.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/UpdateInfo.cs [new file with mode: 0644]
win/C#/HandBrake.Framework/Views/UpdateInfo.resx [new file with mode: 0644]
win/C#/HandBrake.sln [new file with mode: 0644]
win/C#/HandBrake10.5.1.ReSharper [new file with mode: 0644]
win/C#/HandBrake10.sln [new file with mode: 0644]
win/C#/HandBrakeCS.5.0.ReSharper [new file with mode: 0644]
win/C#/HandBrakeCS.csproj
win/C#/Installer/Installer.nsi
win/C#/Installer/MakeNightly.nsi.tmpl [new file with mode: 0644]
win/C#/Model/ActivityLogMode.cs [new file with mode: 0644]
win/C#/Model/AudioTrack.cs [new file with mode: 0644]
win/C#/Model/DriveInformation.cs [new file with mode: 0644]
win/C#/Model/QueryEncodeMode.cs [new file with mode: 0644]
win/C#/Model/QueryPictureSettingsMode.cs [new file with mode: 0644]
win/C#/Model/SourceType.cs [new file with mode: 0644]
win/C#/Model/Subtitle.cs [new file with mode: 0644]
win/C#/Presets/PlistPresetHandler.cs [new file with mode: 0644]
win/C#/Presets/PresetsHandler.cs
win/C#/Presets/preset.cs
win/C#/Program.cs
win/C#/Properties/AssemblyInfo.cs.tmpl [new file with mode: 0644]
win/C#/Properties/Resources.Designer.cs
win/C#/Properties/Resources.resx
win/C#/Properties/Settings.Designer.cs
win/C#/Properties/Settings.settings
win/C#/Resources/ErrorX.png [new file with mode: 0644]
win/C#/Resources/Restore.png [new file with mode: 0644]
win/C#/Resources/download.png [new file with mode: 0644]
win/C#/Resources/folder.png
win/C#/Settings.StyleCop [new file with mode: 0644]
win/C#/ToolWindows/BatchAdd.Designer.cs [new file with mode: 0644]
win/C#/ToolWindows/BatchAdd.cs [new file with mode: 0644]
win/C#/ToolWindows/BatchAdd.resx [new file with mode: 0644]
win/C#/ToolWindows/PreviewOverlay.Designer.cs [new file with mode: 0644]
win/C#/ToolWindows/PreviewOverlay.cs [new file with mode: 0644]
win/C#/ToolWindows/PreviewOverlay.resx [new file with mode: 0644]
win/C#/ToolWindows/TitleSpecificScan.Designer.cs [new file with mode: 0644]
win/C#/ToolWindows/TitleSpecificScan.cs [new file with mode: 0644]
win/C#/ToolWindows/TitleSpecificScan.resx [new file with mode: 0644]
win/C#/app.config
win/C#/doc/AUTHORS [new file with mode: 0644]
win/C#/doc/COPYING [new file with mode: 0644]
win/C#/doc/CREDITS [new file with mode: 0644]
win/C#/doc/NEWS [new file with mode: 0644]
win/C#/doc/THANKS [new file with mode: 0644]
win/C#/doc/TRANSLATIONS [new file with mode: 0644]
win/C#/frmAbout.Designer.cs
win/C#/frmAbout.cs
win/C#/frmAbout.resx
win/C#/frmActivityWindow.Designer.cs
win/C#/frmActivityWindow.cs
win/C#/frmActivityWindow.resx
win/C#/frmAddPreset.Designer.cs
win/C#/frmAddPreset.cs
win/C#/frmMain.Designer.cs
win/C#/frmMain.cs
win/C#/frmMain.resx
win/C#/frmOptions.Designer.cs
win/C#/frmOptions.cs
win/C#/frmOptions.resx
win/C#/frmPreview.Designer.cs
win/C#/frmPreview.cs
win/C#/frmPreview.resx
win/C#/frmQueue.Designer.cs
win/C#/frmQueue.cs
win/C#/frmQueue.resx
win/C#/interop/Converters.cs [new file with mode: 0644]
win/C#/interop/DisplayStringAttribute.cs [new file with mode: 0644]
win/C#/interop/EncodeCompletedEventArgs.cs [new file with mode: 0644]
win/C#/interop/EncodeProgressEventArgs.cs [new file with mode: 0644]
win/C#/interop/HandBrakeInstance.cs [new file with mode: 0644]
win/C#/interop/HandBrakeInterop.csproj [new file with mode: 0644]
win/C#/interop/HandBrakeInterop.sln [new file with mode: 0644]
win/C#/interop/HandBrakeInterop.suo [new file with mode: 0644]
win/C#/interop/HandBrakeInterop2008.sln [new file with mode: 0644]
win/C#/interop/HbLib.cs [new file with mode: 0644]
win/C#/interop/InteropUtilities.cs [new file with mode: 0644]
win/C#/interop/Language.cs [new file with mode: 0644]
win/C#/interop/LanguageCodes.cs [new file with mode: 0644]
win/C#/interop/MessageLoggedEventArgs.cs [new file with mode: 0644]
win/C#/interop/Model/Cropping.cs [new file with mode: 0644]
win/C#/interop/Model/EncodeJob.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Anamorphic.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/AudioEncoder.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/AudioEncoding.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Decomb.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Deinterlace.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Denoise.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Detelecine.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/EncodingProfile.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/Mixdown.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/OutputExtension.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/OutputFormat.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/VideoEncodeRateType.cs [new file with mode: 0644]
win/C#/interop/Model/Encoding/VideoEncoder.cs [new file with mode: 0644]
win/C#/interop/Model/Size.cs [new file with mode: 0644]
win/C#/interop/Model/SourceSubtitle.cs [new file with mode: 0644]
win/C#/interop/Model/SourceType.cs [new file with mode: 0644]
win/C#/interop/Model/SrtSubtitle.cs [new file with mode: 0644]
win/C#/interop/Model/Subtitles.cs [new file with mode: 0644]
win/C#/interop/NativeList.cs [new file with mode: 0644]
win/C#/interop/Properties/AssemblyInfo.cs [new file with mode: 0644]
win/C#/interop/ScanProgressEventArgs.cs [new file with mode: 0644]
win/C#/interop/Settings.StyleCop [new file with mode: 0644]
win/C#/interop/SourceData/AudioTrack.cs [new file with mode: 0644]
win/C#/interop/SourceData/Chapter.cs [new file with mode: 0644]
win/C#/interop/SourceData/Subtitle.cs [new file with mode: 0644]
win/C#/interop/SourceData/SubtitleType.cs [new file with mode: 0644]
win/C#/interop/SourceData/Title.cs [new file with mode: 0644]
win/C#/libraries/Growl license.txt [new file with mode: 0644]
win/C#/libraries/Growl.Connector.dll
win/C#/libraries/Growl.CoreLibrary.dll
win/C#/libraries/Microsoft.WindowsAPICodePack.Shell.dll [new file with mode: 0644]
win/C#/libraries/Microsoft.WindowsAPICodePack.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Caliburn.Castle.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Caliburn.Core.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Caliburn.ModelFramework.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Caliburn.PresentationFramework.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Castle.Core.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Castle.DynamicProxy2.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Castle.MicroKernel.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Castle.Windsor.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Changes.txt [new file with mode: 0644]
win/C#/libraries/caliburn/Common.Logging.dll [new file with mode: 0644]
win/C#/libraries/caliburn/License.txt [new file with mode: 0644]
win/C#/libraries/caliburn/Microsoft.Practices.ServiceLocation.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Readme.txt [new file with mode: 0644]
win/C#/libraries/caliburn/System.ComponentModel.Composition.dll [new file with mode: 0644]
win/C#/libraries/caliburn/Thanks.txt [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 5568f1d..be6664e 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -43,6 +43,10 @@ Edward Groenendaal <eddyg.hb@myreflection.org> (eddyg)
  + Major bug fixes
  + Subtitle scan & Colour
  + Performance improvements
+David Foster <unknown> (davidfstr)
+ + Subtitles from file inputs
+ + SSA subtitle support
 
 Rodney Hester <rhester@multics.dynalias.com> (rhester)
  + iPod firmware 1.2+ 640x480 MPEG-4/H.264 support
diff --git a/CREDITS b/CREDITS
index 52fbad5..92ae696 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -35,25 +35,10 @@ libavcodec authors:
   Juan J. Sierralta
   Lionel Ulmer
 
-libdts authors:
+libdca authors:
   Gildas Bazin
   Sam Hocevar
 
-libdvdcss authors:
-  Billy Biggs
-  Stéphane Borel
-  HÃ¥kan Hjort
-  Samuel Hocevar
-  Eugenio Jarosiewicz
-  Jon Lech Johansen
-  Markus Kuespert
-  Pascal Levesque
-  Steven M. Schultz
-  David Siebörger
-  Alex Strelnikov
-  German Tischler
-  Gildas Bazin
-
 libdvdread authors:
   Björn Englund
   HÃ¥kan Hjort
@@ -67,6 +52,12 @@ libfaac authors:
   thebard
   Ivan Dimkovic
   Krzysztof Nikiel
+  
+libfaad2 authors:
+  M. Bakker
+  Alexander Kurpiers
+  Volker Fischer
+  Gian-Carlo Pascutto
 
 libmp3lame authors:
   Mike Cheng
@@ -136,6 +127,13 @@ libmpeg2 authors:
 
 libogg authors:
   Christopher Montgomery
+  
+libmkv authors:
+  John A. Stebbins
+  Nathan Caldwell
+  Mike Matsnev
+  Nathan Caldwell
+  Christophe Devine
 
 libsamplerate authors:
   Erik de Castro Lopo
@@ -145,16 +143,33 @@ libvorbis authors:
 
 libx264 authors:
   Laurent Aimar
-
-libxvidcore authors:
-  Christoph Lampert
-  Michael Militzer
-  Peter Ross
-  Benjamin Herrenschmidt
-  Daniel Smith
-  Dirk Knop
-  Edouard Gomez
-  Guillaume Morin
-  MinChen
-  Pascal Massimino
-  Radoslaw Czyz
+  
+libtheora authors:
+  Monty
+  Ralph Giles
+  Timothy B. Terriberry
+  Dan B. Miller
+  Rudolf Marek
+  Wim Tayman
+  Dan Lenski
+  Nils Pipenbrinck
+  Aaron Colwell
+  Thomas Vander Stichele
+  Jan Gerber
+  Conrad Parker
+  Cristian Adam
+  Sebastian Pippin
+  Simon Hosie
+  Mauricio Piacentini
+  Silvia Pfeiffer
+  Michael Smith
+  Andre Pang
+  calc
+  Chris Cheney
+  Brendan Cully
+  Edward Hervey
+  Adam Moss
+  Colin Ward
+  Jeremy C. Reed
+  Arc Riley
+  Rodolphe Ortalo
diff --git a/DoxyfileDotNet b/DoxyfileDotNet
new file mode 100644 (file)
index 0000000..7c9a91f
--- /dev/null
@@ -0,0 +1,1661 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = HandBrake
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = svn
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./documentation/dotnet/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = "./win/C#/"
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/DoxyfileGtk b/DoxyfileGtk
new file mode 100644 (file)
index 0000000..b99c135
--- /dev/null
@@ -0,0 +1,1661 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = HandBrake
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = svn
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./documentation/gtk/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = "./gtk/"
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/DoxyfileLibHb b/DoxyfileLibHb
new file mode 100644 (file)
index 0000000..c9ae095
--- /dev/null
@@ -0,0 +1,1661 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = HandBrake
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = svn
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./documentation/libhb/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = "./libhb/"
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/DoxyfileMac b/DoxyfileMac
new file mode 100644 (file)
index 0000000..d27ea48
--- /dev/null
@@ -0,0 +1,1661 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = HandBrake
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = svn
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./documentation/objc/
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = "./macosx/"
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.d \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.idl \
+                         *.odl \
+                         *.cs \
+                         *.php \
+                         *.php3 \
+                         *.inc \
+                         *.m \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.f90 \
+                         *.f \
+                         *.vhd \
+                         *.vhdl
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvances is that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/NEWS b/NEWS
index ed7b57d..4d7cc2b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,42 @@
 NEWS file for HandBrake <http://handbrake.fr/>
 
+Changes between 0.9.4 and 0.9.5:
+
+* Core Library
+  - BluRay disc structure support. (No decryption support) 
+  - Updated Libraries (x264, ffmpeg) 
+  - SSA Subtitle support. (Including burn-in) 
+  - MP3 audio now supported in MP4 files (Note: Limited Player compatibility) 
+  - VOBSUB subtitle now supported in MP4 files (Note: Limited Player compatibility) 
+  - Updated Presets for newer devices and better quality 
+  - AC3 encoding support.
+  - Many Bug fixes and other small improvements
+  - Improved DVD Main Feature detection (when using dvdnav)
+  - Universal audio downmix support (all audio types can be downmixed)
+
+*All GUIs
+  - Updated x264 Advanced Panel
+  - Video Quality Slider drops % value and only shows RF for x264
+  - Batch Scan (Scan Multiple files at once. N.B: Does not include multiple VIDEO_TS folders / Image files) 
+  - Peak framerate option (Capped VFR)
+  - Many Bug fixes
+  - Many Tweaks to improve usability.
+  - Ability to edit queue jobs
+  - Point-to-Point encoding (second or frame start and end times)
+
+* Mac GUI
+  - New Audio Panel supporting >4 Audio Tracks
+  - VLC detection in /Applications and ~/Applications
+
+* Windows GUI
+  - Encode Status in GUI. (CLI window is now always hidden)
+  - Improved Auto-Naming for Destination file name.
+  - Drag / Drop Video onto Main Window to scan.
+  
+* Linux GUI
+  - Multiple instance support (run multiple copies of ghb at once)
+  - Many Bug fixes and UI improvements. 
+  
 Changes between 0.9.3 and 0.9.4:
 
 Core:
index 470ddfa..c120de0 100644 (file)
@@ -4,3 +4,5 @@ $(eval $(call import.CONTRIB.defs,A52DEC))
 A52DEC.FETCH.url = http://download.m0k.org/handbrake/contrib/a52dec-0.7.4.tar.gz
 A52DEC.EXTRACT.tarbase = a52dec
 A52DEC.INSTALL.strip = liba52.a
+
+A52DEC.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; autoreconf -fiv;
index 8cb6d7e..728e281 100644 (file)
@@ -1,7 +1,7 @@
 $(eval $(call import.MODULE.defs,BZIP2,bzip2))
 $(eval $(call import.CONTRIB.defs,BZIP2))
 
-BZIP2.FETCH.url = http://download.m0k.org/handbrake/contrib/bzip2-1.0.5.tar.gz
+BZIP2.FETCH.url = http://download.handbrake.fr/handbrake/contrib/bzip2-1.0.6.tar.gz
 BZIP2.EXTRACT.tarbase = bzip2
 BZIP2.CONFIGURE = $(TOUCH.exe) $@
 
diff --git a/contrib/faac/A00-bitrates.patch b/contrib/faac/A00-bitrates.patch
new file mode 100644 (file)
index 0000000..50b11ec
--- /dev/null
@@ -0,0 +1,60 @@
+diff -Naur faac-1.28/libfaac/frame.c ../build.debug/contrib/faac/faac-1.28/libfaac/frame.c
+--- faac-1.28.orig/libfaac/frame.c     2004-11-17 06:26:06.000000000 -0800
++++ faac-1.28/libfaac/frame.c  2010-04-10 12:26:28.200614437 -0700
+@@ -196,6 +196,8 @@
+                       {47000, 10000},
+                       {64000, 16000},
+                       {76000, 20000},
++                      {128000, 22000},
++                      {160000, 22000},
+ #endif
+                       {0, 0}
+               };
+@@ -242,8 +244,6 @@
+               config->bitRate = tmpbitRate * hEncoder->sampleRate / 44100;
+ #endif
+-              if (config->bandWidth > bwbase)
+-                config->bandWidth = bwbase;
+       }
+     hEncoder->config.bitRate = config->bitRate;
+@@ -251,6 +251,7 @@
+     if (!config->bandWidth)
+     {
+         config->bandWidth = (config->quantqual - 100) * bwmult + bwbase;
++        config->bandWidth *= (double)hEncoder->sampleRate / 44100;
+     }
+     hEncoder->config.bandWidth = config->bandWidth;
+@@ -261,8 +262,8 @@
+     if (hEncoder->config.bandWidth > (hEncoder->sampleRate / 2))
+               hEncoder->config.bandWidth = hEncoder->sampleRate / 2;
+-    if (config->quantqual > 500)
+-              config->quantqual = 500;
++    if (config->quantqual > 700)
++              config->quantqual = 700;
+     if (config->quantqual < 10)
+               config->quantqual = 10;
+@@ -328,8 +329,6 @@
+     hEncoder->config.useTns = 0;
+     hEncoder->config.bitRate = 0; /* default bitrate / channel */
+     hEncoder->config.bandWidth = bwfac * hEncoder->sampleRate;
+-    if (hEncoder->config.bandWidth > bwbase)
+-              hEncoder->config.bandWidth = bwbase;
+     hEncoder->config.quantqual = 100;
+     hEncoder->config.psymodellist = (psymodellist_t *)psymodellist;
+     hEncoder->config.psymodelidx = 0;
+@@ -888,8 +887,8 @@
+               if (((diff > 0) && (fix > 0.0)) || ((diff < 0) && (fix < 0.0)))
+               {
+                       hEncoder->aacquantCfg.quality *= (1.0 - fix);
+-                      if (hEncoder->aacquantCfg.quality > 300)
+-                              hEncoder->aacquantCfg.quality = 300;
++                      if (hEncoder->aacquantCfg.quality > 700)
++                              hEncoder->aacquantCfg.quality = 700;
+             if (hEncoder->aacquantCfg.quality < 50)
+                 hEncoder->aacquantCfg.quality = 50;
+               }
index d02365d..49e9945 100644 (file)
@@ -1,28 +1,8 @@
-diff -Naur ffmpeg-r19067.orig/libavcodec/h264.c ffmpeg-r19067/libavcodec/h264.c
---- ffmpeg-r19067.orig/libavcodec/h264.c       2009-05-29 20:24:20.000000000 -0400
-+++ ffmpeg-r19067/libavcodec/h264.c    2009-06-01 12:45:16.000000000 -0400
-@@ -3406,7 +3406,7 @@
-          * stream. Need to discard one frame. Prevents overrun of the
-          * short_ref and long_ref buffers.
-          */
--        av_log(h->s.avctx, AV_LOG_ERROR,
-+        av_log(h->s.avctx, AV_LOG_DEBUG,
-                "number of reference frames exceeds max (probably "
-                "corrupt input), discarding one\n");
-@@ -7770,7 +7770,7 @@
-     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){
-         if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0;
--        av_log(avctx, AV_LOG_ERROR, "no frame!\n");
-+        av_log(avctx, AV_LOG_DEBUG, "no frame!\n");
-         return -1;
-     }
-diff -Naur ffmpeg-r19067.orig/libavcodec/mpegvideo.c ffmpeg-r19067/libavcodec/mpegvideo.c
---- ffmpeg-r19067.orig/libavcodec/mpegvideo.c  2009-05-27 15:55:35.000000000 -0400
-+++ ffmpeg-r19067/libavcodec/mpegvideo.c       2009-06-01 12:45:16.000000000 -0400
-@@ -831,19 +831,18 @@
+Index: libavcodec/mpegvideo.c
+===================================================================
+--- ffmpeg.orig/libavcodec/mpegvideo.c (revision 22823)
++++ ffmpeg/libavcodec/mpegvideo.c      (working copy)
+@@ -867,19 +867,18 @@
      }
  
      av_log(s->avctx, AV_LOG_FATAL, "Internal error, picture buffer overflow\n");
@@ -54,3 +34,29 @@ diff -Naur ffmpeg-r19067.orig/libavcodec/mpegvideo.c ffmpeg-r19067/libavcodec/mp
  }
  
  static void update_noise_reduction(MpegEncContext *s){
+Index: libavcodec/h264.c
+===================================================================
+--- ffmpeg.orig/libavcodec/h264.c      (revision 22823)
++++ ffmpeg/libavcodec/h264.c   (working copy)
+@@ -2772,7 +2772,7 @@
+     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){
+         if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0;
+-        av_log(avctx, AV_LOG_ERROR, "no frame!\n");
++        av_log(avctx, AV_LOG_DEBUG, "no frame!\n");
+         return -1;
+     }
+Index: libavcodec/h264_refs.c
+===================================================================
+--- ffmpeg.orig/libavcodec/h264_refs.c (revision 22823)
++++ ffmpeg/libavcodec/h264_refs.c      (working copy)
+@@ -608,7 +608,7 @@
+          * stream. Need to discard one frame. Prevents overrun of the
+          * short_ref and long_ref buffers.
+          */
+-        av_log(h->s.avctx, AV_LOG_ERROR,
++        av_log(h->s.avctx, AV_LOG_DEBUG,
+                "number of reference frames exceeds max (probably "
+                "corrupt input), discarding one\n");
index bec0cac..8bbb657 100644 (file)
@@ -1,12 +1,13 @@
-diff -Naur ffmpeg.orig/libavcodec/Makefile ffmpeg/libavcodec/Makefile
---- ffmpeg.orig/libavcodec/Makefile    2008-12-01 01:40:36.000000000 -0500
-+++ ffmpeg/libavcodec/Makefile 2009-02-23 07:03:23.000000000 -0500
+Index: libavcodec/Makefile
+===================================================================
+--- ffmpeg.orig/libavcodec/Makefile    (revision 22823)
++++ ffmpeg/libavcodec/Makefile (working copy)
 @@ -3,7 +3,7 @@
  NAME = avcodec
  FFLIBS = avutil
  
--HEADERS = avcodec.h opt.h vdpau.h xvmc.h
-+HEADERS = avcodec.h opt.h vdpau.h xvmc.h audioconvert.h
+-HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h
++HEADERS = avcodec.h avfft.h dxva2.h opt.h vaapi.h vdpau.h xvmc.h audioconvert.h
  
  OBJS = allcodecs.o                                                      \
         audioconvert.o                                                   \
index c996fa1..6f24417 100644 (file)
@@ -1,7 +1,8 @@
-diff -Naur ffmpeg-r19067.orig/libavcodec/pngdec.c ffmpeg-r19067/libavcodec/pngdec.c
---- ffmpeg-r19067.orig/libavcodec/pngdec.c     2009-05-24 08:44:54.000000000 -0400
-+++ ffmpeg-r19067/libavcodec/pngdec.c  2009-06-03 18:53:52.000000000 -0400
-@@ -593,6 +593,18 @@
+Index: libavcodec/pngdec.c
+===================================================================
+--- ffmpeg.orig/libavcodec/pngdec.c    (revision 22823)
++++ ffmpeg/libavcodec/pngdec.c (working copy)
+@@ -597,6 +597,18 @@
          }
      }
   exit_loop:
@@ -19,8 +20,8 @@ diff -Naur ffmpeg-r19067.orig/libavcodec/pngdec.c ffmpeg-r19067/libavcodec/pngde
 +#if 0
       /* handle p-frames only if a predecessor frame is available */
       if(s->last_picture->data[0] != NULL) {
-          if(!(avpkt->flags & PKT_FLAG_KEY)) {
-@@ -609,6 +621,7 @@
+          if(!(avpkt->flags & AV_PKT_FLAG_KEY)) {
+@@ -613,6 +625,7 @@
              }
          }
      }
diff --git a/contrib/ffmpeg/A05-avi-seek.patch b/contrib/ffmpeg/A05-avi-seek.patch
new file mode 100644 (file)
index 0000000..e5df731
--- /dev/null
@@ -0,0 +1,55 @@
+Index: libavformat/avidec.c
+===================================================================
+--- ffmpeg.orig/libavformat/avidec.c   (revision 22950)
++++ ffmpeg/libavformat/avidec.c        (working copy)
+@@ -1072,7 +1072,7 @@
+     AVIContext *avi = s->priv_data;
+     AVStream *st;
+     int i, index;
+-    int64_t pos;
++    int64_t pos, min_pos;
+     AVIStream *ast;
+     if (!avi->index_loaded) {
+@@ -1109,6 +1109,7 @@
+         return 0;
+     }
++    min_pos = pos;
+     for(i = 0; i < s->nb_streams; i++) {
+         AVStream *st2 = s->streams[i];
+         AVIStream *ast2 = st2->priv_data;
+@@ -1129,10 +1130,20 @@
+             index=0;
+         if(!avi->non_interleaved){
+-            while(index>0 && st2->index_entries[index].pos > pos)
+-                index--;
+-            while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
+-                index++;
++            if (flags & AVSEEK_FLAG_BACKWARD) {
++                while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
++                    index++;
++                while(index>0 && st2->index_entries[index].pos > pos)
++                    index--;
++                if (st2->index_entries[index].pos < min_pos)
++                    min_pos = st2->index_entries[index].pos;
++            }
++            else {
++                while(index>0 && st2->index_entries[index].pos > pos)
++                    index--;
++                while(index+1 < st2->nb_index_entries && st2->index_entries[index].pos < pos)
++                    index++;
++            }
+         }
+ //        av_log(s, AV_LOG_DEBUG, "%"PRId64" %d %"PRId64"\n", timestamp, index, st2->index_entries[index].timestamp);
+@@ -1141,7 +1152,7 @@
+     }
+     /* do the seek */
+-    url_fseek(s->pb, pos, SEEK_SET);
++    url_fseek(s->pb, min_pos, SEEK_SET);
+     avi->stream_index= -1;
+     return 0;
+ }
index f5cd7d7..4eadaa6 100644 (file)
@@ -1,6 +1,8 @@
---- ffmpeg/configure   Sat Jun  7 03:19:09 2008
-+++ ffmpeg.solaris/configure   Thu Jun 19 12:10:48 2008
-@@ -50,6 +50,9 @@
+Index: configure
+===================================================================
+--- ffmpeg.orig/configure      (revision 22823)
++++ ffmpeg/configure   (working copy)
+@@ -54,6 +54,9 @@
      exit 1
  fi
  
 +PATH=/usr/xpg4/bin:$PATH
 +
  show_help(){
-   echo "Usage: configure [options]"
-   echo "Options: [defaults in brackets after descriptions]"
-@@ -1585,8 +1588,11 @@
+ cat <<EOF
+ Usage: configure [options]
+@@ -2387,7 +2390,7 @@
  check_cc <<EOF || die "endian test failed"
  unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
  EOF
--od -A n -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
-+#od -A n -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
+-od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
 +/usr/bin/tr -cd "BIGE" < $TMPO | grep -q 'B *I *G *E' && enable bigendian
  
-+echo "BIGE=$bigendian"
-+
- # ---
- # check availability of some header files
+ if enabled alpha; then
  
diff --git a/contrib/ffmpeg/P02-darwin-pic.patch b/contrib/ffmpeg/P02-darwin-pic.patch
new file mode 100644 (file)
index 0000000..c151b29
--- /dev/null
@@ -0,0 +1,21 @@
+Index: configure
+===================================================================
+--- ffmpeg.orig/configure      (revision 22823)
++++ ffmpeg/configure   (working copy)
+@@ -2191,6 +2191,7 @@
+         FFSERVERLDFLAGS=-Wl,-bind_at_load
+         objformat="macho"
+         enabled x86_64 && objformat="macho64"
++        enabled x86_64 && enable pic
+         enabled_any pic shared ||
+             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
+         ;;
+@@ -2291,7 +2292,7 @@
+         ;;
+ esac
+-check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
++#check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
+ set_default $PATHS_LIST
diff --git a/contrib/ffmpeg/P03-mingw-gnu99.patch b/contrib/ffmpeg/P03-mingw-gnu99.patch
new file mode 100644 (file)
index 0000000..06a598d
--- /dev/null
@@ -0,0 +1,22 @@
+Index: configure
+===================================================================
+--- ffmpeg.orig/configure      (revision 25082)
++++ ffmpeg/configure   (working copy)
+@@ -2222,7 +2222,7 @@
+ fi
+ add_cppflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
+-check_cflags -std=c99
++check_cflags -std=gnu99
+ check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
+ #include <stdlib.h>
+ EOF
+@@ -2230,7 +2230,7 @@
+ #include <stdlib.h>
+ EOF
+-check_host_cflags -std=c99
++check_host_cflags -std=gnu99
+ case "$arch" in
+     alpha|ia64|mips|parisc|sparc)
index 4b8b092..304183f 100644 (file)
@@ -1,25 +1,27 @@
 $(eval $(call import.MODULE.defs,FFMPEG,ffmpeg,BZIP2 FAAD2 ZLIB))
 $(eval $(call import.CONTRIB.defs,FFMPEG))
 
-FFMPEG.FETCH.url = http://download.m0k.org/handbrake/contrib/ffmpeg-r19067.tar.bz2
+FFMPEG.FETCH.url = http://download.m0k.org/handbrake/contrib/ffmpeg-r25689.tar.bz2
 
 FFMPEG.CONFIGURE.deps =
 FFMPEG.CONFIGURE.env  =
 FFMPEG.CONFIGURE.host =
 
 FFMPEG.CONFIGURE.extra = \
+    --disable-doc \
     --disable-bsfs \
     --disable-encoders \
     --disable-ffmpeg \
     --disable-ffserver \
     --disable-muxers \
     --disable-network \
+    --disable-vaapi \
+    --disable-dxva2 \
     --enable-bzlib \
     --enable-encoder=ac3 \
     --enable-encoder=mpeg4 \
     --enable-encoder=snow \
     --enable-gpl \
-    --enable-libfaad \
     --enable-muxer=ipod \
     --enable-zlib \
     --cc="$(FFMPEG.GCC.gcc)" \
@@ -32,12 +34,13 @@ ifeq (0-cygwin,$(BUILD.cross)-$(BUILD.system))
     FFMPEG.GCC.args.extra = -fno-common
 else ifeq (darwin,$(BUILD.system))
     ## section for darwin-archs
-    FFMPEG.CONFIGURE.extra += --enable-pthreads --enable-cross-compile --arch=$(BUILD.machine)
+    FFMPEG.CONFIGURE.extra += --enable-pthreads --enable-cross-compile --arch=$(BUILD.machine) --target-os=darwin
 else ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
     FFMPEG.CONFIGURE.extra += \
         --enable-w32threads \
         --enable-memalign-hack \
         --target-os=mingw32 \
+        --arch=i386 \
         --enable-cross-compile --cross-prefix=$(BUILD.cross.prefix)
     FFMPEG.GCC.args.extra += -fno-common
 else
diff --git a/contrib/fontconfig/A00-mingw-disableShared.patch b/contrib/fontconfig/A00-mingw-disableShared.patch
new file mode 100644 (file)
index 0000000..1fd7474
--- /dev/null
@@ -0,0 +1,73 @@
+--- fontconfig-2.8.0/configure 2009-11-18 15:49:41.000000000 -0800
++++ fontconfig-2.8.0/configure 2010-09-09 21:23:24.000000000 -0700
+@@ -825,6 +825,8 @@
+ ms_librarian
+ OS_WIN32_FALSE
+ OS_WIN32_TRUE
++OS_WIN32_ENABLE_SHARED_TRUE
++OS_WIN32_ENABLE_SHARED_FALSE
+ LTCXXCOMPILE
+ LTCOMPILE
+ DOLT_BASH
+@@ -11782,6 +11784,14 @@
+   OS_WIN32_FALSE=
+ fi
++ if test "$os_win32-$enable_shared" = "yes-yes"; then
++  OS_WIN32_ENABLE_SHARED_TRUE=
++  OS_WIN32_ENABLE_SHARED_FALSE='#'
++else
++  OS_WIN32_ENABLE_SHARED_TRUE='#'
++  OS_WIN32_ENABLE_SHARED_FALSE=
++fi
++
+ if test "$os_win32" = "yes"; then
+   # Extract the first word of "lib.exe", so it can be a program name with args.
+@@ -15155,6 +15165,13 @@
+ Usually this means the macro was only invoked conditionally." >&2;}
+    { (exit 1); exit 1; }; }
+ fi
++if test -z "${OS_WIN32_ENABLE_SHARED_TRUE}" && test -z "${OS_WIN32_ENABLE_SHARED_FALSE}"; then
++  { { echo "$as_me:$LINENO: error: conditional \"OS_WIN32_ENABLE_SHARED\" was never defined.
++Usually this means the macro was only invoked conditionally." >&5
++echo "$as_me: error: conditional \"OS_WIN32_ENABLE_SHARED\" was never defined.
++Usually this means the macro was only invoked conditionally." >&2;}
++   { (exit 1); exit 1; }; }
++fi
+ if test -z "${MS_LIB_AVAILABLE_TRUE}" && test -z "${MS_LIB_AVAILABLE_FALSE}"; then
+   { { $as_echo "$as_me:$LINENO: error: conditional \"MS_LIB_AVAILABLE\" was never defined.
+ Usually this means the macro was only invoked conditionally." >&5
+--- fontconfig-2.8.0/configure.in      2009-11-18 15:49:23.000000000 -0800
++++ fontconfig-2.8.0/configure.in      2010-09-09 21:11:37.000000000 -0700
+@@ -76,6 +76,7 @@
+     os_win32=no
+ esac
+ AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
++AM_CONDITIONAL(OS_WIN32_ENABLE_SHARED, test "$os_win32-$enable_shared" = "yes-yes")
+ if test "$os_win32" = "yes"; then
+   AC_CHECK_PROG(ms_librarian, lib.exe, yes, no)
+--- fontconfig-2.8.0/src/Makefile.am   2010-09-09 21:12:43.000000000 -0700
++++ fontconfig-2.8.0/src/Makefile.am   2010-09-09 21:13:07.000000000 -0700
+@@ -30,7 +30,9 @@
+ # gcc import library install/uninstall
+ install-libtool-import-lib: 
++if OS_WIN32_ENABLE_SHARED
+       $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir)
++endif
+       $(INSTALL) fontconfig.def $(DESTDIR)$(libdir)/fontconfig.def
+ uninstall-libtool-import-lib:
+--- fontconfig-2.8.0/src/Makefile.in   2009-11-18 15:49:39.000000000 -0800
++++ fontconfig-2.8.0/src/Makefile.in   2010-09-09 21:14:38.000000000 -0700
+@@ -688,7 +688,7 @@
+ # gcc import library install/uninstall
+ @OS_WIN32_TRUE@install-libtool-import-lib: 
+-@OS_WIN32_TRUE@       $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir)
++@OS_WIN32_ENABLE_SHARED_TRUE@@OS_WIN32_TRUE@  $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir)
+ @OS_WIN32_TRUE@       $(INSTALL) fontconfig.def $(DESTDIR)$(libdir)/fontconfig.def
+ @OS_WIN32_TRUE@uninstall-libtool-import-lib:
diff --git a/contrib/fontconfig/module.defs b/contrib/fontconfig/module.defs
new file mode 100644 (file)
index 0000000..ce96c82
--- /dev/null
@@ -0,0 +1,71 @@
+__deps__ := FREETYPE LIBXML2
+$(eval $(call import.MODULE.defs,FONTCONFIG,fontconfig,$(__deps__)))
+$(eval $(call import.CONTRIB.defs,FONTCONFIG))
+
+FONTCONFIG.FETCH.url = http://download.m0k.org/handbrake/contrib/fontconfig-2.8.0.tar.gz
+FONTCONFIG.EXTRACT.tarbase = fontconfig-2.8.0
+
+#
+# Under MinGW:
+# 
+# - A 'i386-ming32-gcc' $(FONTCONFIG.GCC.gcc) command will be available,
+#   and the '-arch <arch>' argument should be omitted, as it will confuse this compiler.
+# 
+# - The $(FONTCONFIG.GCC.archs) variable is not set.
+#   Therefore statically guess the target arch to be i386.
+# 
+ifeq ($(BUILD.system),mingw)
+    FONTCONFIG.cc_archoption      = 
+    FONTCONFIG.config_archoption  = --with-arch=i386
+else ifeq ($(BUILD.system),linux)
+    FONTCONFIG.cc_archoption      = 
+else
+    FONTCONFIG.cc_archoption      = -arch $(FONTCONFIG.GCC.archs)
+    FONTCONFIG.config_archoption  = --with-arch=$(FONTCONFIG.GCC.archs)
+endif
+
+#
+# Support cross-compiling:
+# 
+# - Add '-arch <arch>' to CC argument to avoid the need to put a <host_triplet>-gcc
+#   trampoline script in the PATH, since fontconfig's configure looks for this when
+#   in cross-compile mode. If such a trampoline were used, it would just call "gcc -arch <arch> $@".
+# 
+# - In the case of MinGW (on i386), a 'i386-ming32-gcc' command will be available,
+#   and the '-arch <arch>' argument should be omitted, as it will confuse the compiler.
+# 
+# The following line overrides the original line in /make/include/contrib.defs,
+# but has the -arch argument added (and '$(1)' presubstituted for 'FONTCONFIG').
+# 
+FONTCONFIG.CONFIGURE.env.CC       = CC="$(FONTCONFIG.GCC.gcc) $(FONTCONFIG.cc_archoption)"
+
+#
+# Support cross-compiling:
+# - Remove '-arch <arch>' from *FLAGS variables, since fontconfig's configure script
+#   needs to be given the freedom to insert that flag as necessary, since there are
+#   some trampoline executables that need to be built in the native build architecture
+#   (without the -arch flag).
+# 
+# The following lines override the original lines in /make/include/contrib.defs,
+# but have '*archs' removed (and '$(1)' presubstituted for 'FONTCONFIG').
+# 
+FONTCONFIG.CONFIGURE.env.CFLAGS   = CFLAGS="$(call fn.ARGS,FONTCONFIG.GCC,*sysroot *minver ?extra)"
+FONTCONFIG.CONFIGURE.env.CXXFLAGS = CXXFLAGS="$(call fn.ARGS,FONTCONFIG.GCC,*sysroot *minver ?extra)"
+FONTCONFIG.CONFIGURE.env.CPPFLAGS = CPPFLAGS="$(call fn.ARGS,FONTCONFIG.GCC,*sysroot *minver ?extra)"
+FONTCONFIG.CONFIGURE.env.LDFLAGS  = LDFLAGS="$(call fn.ARGS,FONTCONFIG.GCC,*sysroot *minver)"
+
+# 
+# Force use of libxml2 instead of expat with --enable-libxml2.
+# 
+# Tell configure where to find our (cross-compiled) versions of freetype and libxml2.
+# 
+# Support cross-compiling:
+# - Add --with-arch argument since fontconfig's configure isn't smart enough
+#   to infer it from the --host argument
+# 
+FONTCONFIG.CONFIGURE.extra = \
+    --enable-libxml2 \
+    --with-freetype-config=$(call fn.ABSOLUTE,$(CONTRIB.build/)bin/freetype-config) \
+    LIBXML2_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lxml2" \
+    LIBXML2_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include/libxml2" \
+    $(FONTCONFIG.config_archoption)
diff --git a/contrib/fontconfig/module.rules b/contrib/fontconfig/module.rules
new file mode 100644 (file)
index 0000000..72ebbd9
--- /dev/null
@@ -0,0 +1,2 @@
+$(eval $(call import.MODULE.rules,FONTCONFIG))
+$(eval $(call import.CONTRIB.rules,FONTCONFIG))
diff --git a/contrib/freetype/module.defs b/contrib/freetype/module.defs
new file mode 100644 (file)
index 0000000..85437ba
--- /dev/null
@@ -0,0 +1,5 @@
+$(eval $(call import.MODULE.defs,FREETYPE,freetype))
+$(eval $(call import.CONTRIB.defs,FREETYPE))
+
+FREETYPE.FETCH.url = http://download.m0k.org/handbrake/contrib/freetype-2.3.9.tar.gz
+FREETYPE.EXTRACT.tarbase = freetype-2.3.9
diff --git a/contrib/freetype/module.rules b/contrib/freetype/module.rules
new file mode 100644 (file)
index 0000000..d4ebbda
--- /dev/null
@@ -0,0 +1,2 @@
+$(eval $(call import.MODULE.rules,FREETYPE))
+$(eval $(call import.CONTRIB.rules,FREETYPE))
diff --git a/contrib/libass/A00-configure.patch b/contrib/libass/A00-configure.patch
new file mode 100644 (file)
index 0000000..d26e0fb
--- /dev/null
@@ -0,0 +1,84 @@
+--- libass-0.9.9/configure     2010-02-28 20:38:16.000000000 -0800
++++ libass-0.9.9/configure     2010-08-19 23:24:11.000000000 -0700
+@@ -15728,10 +15728,10 @@
+ { echo "$as_me:$LINENO: checking for FREETYPE" >&5
+ echo $ECHO_N "checking for FREETYPE... $ECHO_C" >&6; }
+-if test -n "$PKG_CONFIG"; then
+     if test -n "$FREETYPE_CFLAGS"; then
+         pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS"
+     else
++if test -n "$PKG_CONFIG"; then
+         if test -n "$PKG_CONFIG" && \
+     { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 9.10.3\"") >&5
+   ($PKG_CONFIG --exists --print-errors "freetype2 >= 9.10.3") 2>&5
+@@ -15742,14 +15742,14 @@
+ else
+   pkg_failed=yes
+ fi
+-    fi
+ else
+       pkg_failed=untried
+ fi
+-if test -n "$PKG_CONFIG"; then
++    fi
+     if test -n "$FREETYPE_LIBS"; then
+         pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS"
+     else
++if test -n "$PKG_CONFIG"; then
+         if test -n "$PKG_CONFIG" && \
+     { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"freetype2 >= 9.10.3\"") >&5
+   ($PKG_CONFIG --exists --print-errors "freetype2 >= 9.10.3") 2>&5
+@@ -15760,10 +15760,10 @@
+ else
+   pkg_failed=yes
+ fi
+-    fi
+ else
+       pkg_failed=untried
+ fi
++    fi
+@@ -15849,10 +15849,10 @@
+ { echo "$as_me:$LINENO: checking for FONTCONFIG" >&5
+ echo $ECHO_N "checking for FONTCONFIG... $ECHO_C" >&6; }
+-if test -n "$PKG_CONFIG"; then
+     if test -n "$FONTCONFIG_CFLAGS"; then
+         pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS"
+     else
++if test -n "$PKG_CONFIG"; then
+         if test -n "$PKG_CONFIG" && \
+     { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.4.2\"") >&5
+   ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.4.2") 2>&5
+@@ -15863,14 +15863,14 @@
+ else
+   pkg_failed=yes
+ fi
+-    fi
+ else
+       pkg_failed=untried
+ fi
+-if test -n "$PKG_CONFIG"; then
++    fi
+     if test -n "$FONTCONFIG_LIBS"; then
+         pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS"
+     else
++if test -n "$PKG_CONFIG"; then
+         if test -n "$PKG_CONFIG" && \
+     { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"fontconfig >= 2.4.2\"") >&5
+   ($PKG_CONFIG --exists --print-errors "fontconfig >= 2.4.2") 2>&5
+@@ -15881,10 +15881,10 @@
+ else
+   pkg_failed=yes
+ fi
+-    fi
+ else
+       pkg_failed=untried
+ fi
++    fi
diff --git a/contrib/libass/module.defs b/contrib/libass/module.defs
new file mode 100644 (file)
index 0000000..e5528fd
--- /dev/null
@@ -0,0 +1,15 @@
+__deps__ := FONTCONFIG FREETYPE
+$(eval $(call import.MODULE.defs,LIBASS,libass,$(__deps__)))
+$(eval $(call import.CONTRIB.defs,LIBASS))
+
+LIBASS.FETCH.url = http://download.m0k.org/handbrake/contrib/libass-0.9.9.tar.bz2
+LIBASS.EXTRACT.tarbase = libass-0.9.9
+
+# Disable as many external dependencies as I can get away with
+# and tell configure where to find our version of freetype
+LIBASS.CONFIGURE.extra = \
+    --disable-png --disable-enca \
+    FREETYPE_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lfreetype" \
+    FREETYPE_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include/freetype2" \
+    FONTCONFIG_LIBS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/))lib -lfontconfig" \
+    FONTCONFIG_CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/))include"
diff --git a/contrib/libass/module.rules b/contrib/libass/module.rules
new file mode 100644 (file)
index 0000000..67a5ab6
--- /dev/null
@@ -0,0 +1,2 @@
+$(eval $(call import.MODULE.rules,LIBASS))
+$(eval $(call import.CONTRIB.rules,LIBASS))
diff --git a/contrib/libbluray/module.defs b/contrib/libbluray/module.defs
new file mode 100644 (file)
index 0000000..479e602
--- /dev/null
@@ -0,0 +1,8 @@
+$(eval $(call import.MODULE.defs,LIBBLURAY,libbluray))
+$(eval $(call import.CONTRIB.defs,LIBBLURAY))
+
+LIBBLURAY.FETCH.url = http://download.m0k.org/handbrake/contrib/libbluray-0.0.1-pre-16-g1aab213.tar.gz
+
+LIBBLURAY.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; ./bootstrap;
+
+LIBBLURAY.CONFIGURE.extra += --disable-optimizations --enable-debug --disable-examples
diff --git a/contrib/libbluray/module.rules b/contrib/libbluray/module.rules
new file mode 100644 (file)
index 0000000..ddea021
--- /dev/null
@@ -0,0 +1,2 @@
+$(eval $(call import.MODULE.rules,LIBBLURAY))
+$(eval $(call import.CONTRIB.rules,LIBBLURAY))
index b69d1fb..456ed3c 100644 (file)
@@ -3,3 +3,5 @@ $(eval $(call import.CONTRIB.defs,LIBDCA))
 
 LIBDCA.FETCH.url = http://download.m0k.org/handbrake/contrib/libdca-r81-strapped.tar.gz
 LIBDCA.EXTRACT.tarbase = libdca
+
+LIBDCA.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; autoreconf -fiv;
diff --git a/contrib/libdvdnav/A06-reset-mutex.patch b/contrib/libdvdnav/A06-reset-mutex.patch
new file mode 100644 (file)
index 0000000..76f55e3
--- /dev/null
@@ -0,0 +1,25 @@
+Index: src/dvdnav.c
+===================================================================
+--- libdvdnav.orig/src/dvdnav.c        (revision 1168)
++++ libdvdnav/src/dvdnav.c     (working copy)
+@@ -178,9 +178,9 @@
+ #ifdef LOG_DEBUG
+   fprintf(MSG_OUT, "libdvdnav: clearing dvdnav\n");
+ #endif
++  pthread_mutex_unlock(&this->vm_lock);
+   result = dvdnav_clear(this);
+-  pthread_mutex_unlock(&this->vm_lock);
+   return result;
+ }
+@@ -519,7 +519,8 @@
+   }
+   /* Check to see if we need to change the currently opened VOB */
+-  if((this->position_current.vts != this->position_next.vts) ||
++  if((this->file == NULL) ||
++     (this->position_current.vts != this->position_next.vts) ||
+      (this->position_current.domain != this->position_next.domain)) {
+     dvd_read_domain_t domain;
+     int32_t vtsN;
index 078f474..7f03559 100644 (file)
@@ -1,6 +1,6 @@
 diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
 --- libdvdnav.orig/src/vm/vm.c 2009-10-29 09:10:44.836643320 -0700
-+++ libdvdnav/src/vm/vm.c      2009-11-16 11:10:07.527247268 -0800
++++ libdvdnav/src/vm/vm.c      2009-11-27 11:32:47.475322754 -0800
 @@ -585,6 +585,9 @@
      switch(menuid) {
      case DVD_MENU_Title:
@@ -29,7 +29,43 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
    return 0;
  }
  
-@@ -1488,6 +1495,10 @@
+@@ -1412,8 +1419,9 @@
+       if(link_values.data2 != 0)
+       (vm->state).HL_BTNN_REG = link_values.data2 << 10;
+       if(!set_VTS_PTT(vm, (vm->state).vtsN, (vm->state).VTS_TTN_REG, link_values.data1))
+-      assert(0);
+-      link_values = play_PG(vm);
++        link_values.command = Exit;
++      else
++        link_values = play_PG(vm);
+       break;
+     case LinkPGN:
+       /* Link to Program Number:data1 */
+@@ -1458,8 +1466,9 @@
+       /* Set SPRM1 and SPRM2 */
+       assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
+       if(!set_VTS_TT(vm, (vm->state).vtsN, link_values.data1))
+-      assert(0);
+-      link_values = play_PGC(vm);
++        link_values.command = Exit;
++      else
++        link_values = play_PGC(vm);
+       break;
+     case JumpVTS_PTT:
+       /* Jump to Part:data2 of Title:data1 in same VTS Title Domain */
+@@ -1469,8 +1478,9 @@
+       /* Set SPRM1 and SPRM2 */
+       assert((vm->state).domain == VTSM_DOMAIN || (vm->state).domain == VTS_DOMAIN); /* ?? */
+       if(!set_VTS_PTT(vm, (vm->state).vtsN, link_values.data1, link_values.data2))
+-      assert(0);
+-      link_values = play_PGC_PG(vm, (vm->state).pgN);
++        link_values.command = Exit;
++      else
++        link_values = play_PGC_PG(vm, (vm->state).pgN);
+       break;
+     case JumpSS_FP:
+@@ -1488,6 +1498,10 @@
        /* Allowed from anywhere except the VTS Title domain */
        /* Stop SPRM9 Timer and any GPRM counters */
        assert((vm->state).domain != VTS_DOMAIN); /* ?? */
@@ -40,7 +76,7 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
        (vm->state).domain = VMGM_DOMAIN;
        if(!set_MENU(vm, link_values.data1))
        assert(0);
-@@ -1504,14 +1515,22 @@
+@@ -1504,14 +1518,22 @@
        if (link_values.data1 != (vm->state).vtsN) {
          /* the normal case */
          assert((vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */
@@ -64,7 +100,7 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
          (vm->state).domain = VTSM_DOMAIN;
        }
        } else {
-@@ -1533,6 +1552,10 @@
+@@ -1533,6 +1555,10 @@
        /* set_PGCN:data1 */
        /* Stop SPRM9 Timer and any GPRM counters */
        assert((vm->state).domain != VTS_DOMAIN); /* ?? */
@@ -75,7 +111,7 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
        (vm->state).domain = VMGM_DOMAIN;
        if(!set_PGCN(vm, link_values.data1))
        assert(0);
-@@ -1552,6 +1575,10 @@
+@@ -1552,6 +1578,10 @@
        /* set_RSMinfo:data2 */
        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
        /* Must be called before domain is changed */
@@ -86,7 +122,7 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
        (vm->state).domain = VMGM_DOMAIN;
        if(!set_MENU(vm, link_values.data1))
-@@ -1563,6 +1590,10 @@
+@@ -1563,6 +1593,10 @@
        /* set_RSMinfo:data2 */
        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
        /* Must be called before domain is changed */
@@ -97,7 +133,7 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
        (vm->state).domain = VTSM_DOMAIN;
        if(!set_MENU(vm, link_values.data1))
-@@ -1574,6 +1605,10 @@
+@@ -1574,6 +1608,10 @@
        /* set_RSMinfo:data2 */
        assert((vm->state).domain == VTS_DOMAIN); /* ?? */
        /* Must be called before domain is changed */
@@ -108,3 +144,14 @@ diff -Naur libdvdnav.orig/src/vm/vm.c libdvdnav/src/vm/vm.c
        set_RSMinfo(vm, link_values.data2, /* We dont have block info */ 0);
        (vm->state).domain = VMGM_DOMAIN;
        if(!set_PGCN(vm, link_values.data1))
+@@ -1634,7 +1672,9 @@
+   (vm->state).TT_PGCN_REG = pgcN;
+   (vm->state).PTTN_REG    = part;
+   (vm->state).TTN_REG     = get_TT(vm, vtsN, vts_ttn);
+-  assert( (vm->state.TTN_REG) != 0 );
++  if( (vm->state.TTN_REG) == 0 )
++    return 0;
++
+   (vm->state).VTS_TTN_REG = vts_ttn;
+   (vm->state).vtsN        = vtsN;  /* Not sure about this one. We can get to it easily from TTN_REG */
+   /* Any other registers? */
diff --git a/contrib/libdvdnav/A08-dvdnav-dup.patch b/contrib/libdvdnav/A08-dvdnav-dup.patch
new file mode 100644 (file)
index 0000000..ce6072a
--- /dev/null
@@ -0,0 +1,137 @@
+Index: src/dvdnav.c
+===================================================================
+--- libdvdnav.orig/src/dvdnav.c        (revision 1168)
++++ libdvdnav/src/dvdnav.c     (working copy)
+@@ -71,6 +71,67 @@
+   return DVDNAV_STATUS_OK;
+ }
++dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src) {
++  dvdnav_t *this;
++
++  (*dest) = NULL;
++  this = (dvdnav_t*)malloc(sizeof(dvdnav_t));
++  if(!this)
++    return DVDNAV_STATUS_ERR;
++
++  memcpy(this, src, sizeof(dvdnav_t));
++  this->file = NULL;
++
++  pthread_mutex_init(&this->vm_lock, NULL);
++
++  this->vm = vm_new_copy(src->vm);
++  if(!this->vm) {
++    printerr("Error initialising the DVD VM.");
++    pthread_mutex_destroy(&this->vm_lock);
++    free(this);
++    return DVDNAV_STATUS_ERR;
++  }
++
++  /* Start the read-ahead cache. */
++  this->cache = dvdnav_read_cache_new(this);
++
++  (*dest) = this;
++  return DVDNAV_STATUS_OK;
++}
++
++dvdnav_status_t dvdnav_free_dup(dvdnav_t *this) {
++
++#ifdef LOG_DEBUG
++  fprintf(MSG_OUT, "libdvdnav: free_dup:called\n");
++#endif
++
++  if (this->file) {
++    pthread_mutex_lock(&this->vm_lock);
++    DVDCloseFile(this->file);
++#ifdef LOG_DEBUG
++    fprintf(MSG_OUT, "libdvdnav: close:file closing\n");
++#endif
++    this->file = NULL;
++    pthread_mutex_unlock(&this->vm_lock);
++  }
++
++  /* Free the VM */
++  if(this->vm)
++    vm_free_copy(this->vm);
++
++  pthread_mutex_destroy(&this->vm_lock);
++
++  /* We leave the final freeing of the entire structure to the cache,
++   * because we don't know, if there are still buffers out in the wild,
++   * that must return first. */
++  if(this->cache)
++    dvdnav_read_cache_free(this->cache);
++  else
++    free(this);
++
++  return DVDNAV_STATUS_OK;
++}
++
+ dvdnav_status_t dvdnav_open(dvdnav_t** dest, const char *path) {
+   dvdnav_t *this;
+   struct timeval time;
+Index: src/dvdnav/dvdnav.h
+===================================================================
+--- libdvdnav.orig/src/dvdnav/dvdnav.h (revision 1168)
++++ libdvdnav/src/dvdnav/dvdnav.h      (working copy)
+@@ -89,6 +89,9 @@
+  */
+ dvdnav_status_t dvdnav_open(dvdnav_t **dest, const char *path);
++dvdnav_status_t dvdnav_dup(dvdnav_t **dest, dvdnav_t *src);
++dvdnav_status_t dvdnav_free_dup(dvdnav_t *this);
++
+ /*
+  * Closes a dvdnav_t previously opened with dvdnav_open(), freeing any
+  * memory associated with it.
+Index: src/vm/vm.c
+===================================================================
+--- libdvdnav.orig/src/vm/vm.c (revision 1168)
++++ libdvdnav/src/vm/vm.c      (working copy)
+@@ -96,6 +98,7 @@
+ static pgcit_t* get_MENU_PGCIT(vm_t *vm, ifo_handle_t *h, uint16_t lang);
+ static pgcit_t* get_PGCIT(vm_t *vm);
++static void vm_close(vm_t *vm);
+ /* Helper functions */
+@@ -262,7 +265,7 @@
+ }
+ void vm_free_vm(vm_t *vm) {
+-  vm_stop(vm);
++  vm_close(vm);
+   free(vm);
+ }
+@@ -289,12 +292,20 @@
+ int vm_start(vm_t *vm) {
+   /* Set pgc to FP (First Play) pgc */
++  if (vm->stopped) {
++    vm_reset(vm, NULL);
++    vm->stopped = 0;
++  }
+   set_FP_PGC(vm);
+   process_command(vm, play_PGC(vm));
+   return !vm->stopped;
+ }
+ void vm_stop(vm_t *vm) {
++  vm->stopped = 1;
++}
++
++static void vm_close(vm_t *vm) {
+   if(vm->vmgi) {
+     ifoClose(vm->vmgi);
+     vm->vmgi=NULL;
+@@ -346,7 +357,7 @@
+   if (vm->dvd && dvdroot) {
+     /* a new dvd device has been requested */
+-    vm_stop(vm);
++    vm_close(vm);
+   }
+   if (!vm->dvd) {
+     vm->dvd = DVDOpen(dvdroot);
index 4134146..a8f3080 100644 (file)
@@ -4,6 +4,10 @@ $(eval $(call import.CONTRIB.defs,LIBDVDNAV))
 LIBDVDNAV.FETCH.url = http://download.m0k.org/handbrake/contrib/libdvdnav-svn1168.tar.gz
 LIBDVDNAV.EXTRACT.tarbase = libdvdnav
 
+ifneq (max,$(GCC.g))
+       LIBDVDNAV.CONFIGURE.env.CFLAGS = CFLAGS="-DNDEBUG"
+endif
+
 LIBDVDNAV.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; autoreconf -fiv;
 
 LIBDVDNAV.CONFIGURE.extra += --with-dvdread-config=$(call fn.ABSOLUTE,$(CONTRIB.build/)bin/dvdread-config)
diff --git a/contrib/libdvdread/P00-mingw-dlfcn.patch b/contrib/libdvdread/P00-mingw-dlfcn.patch
new file mode 100644 (file)
index 0000000..811c366
--- /dev/null
@@ -0,0 +1,34 @@
+Index: configure.ac
+===================================================================
+--- libdvdread/configure.ac    (revision 1168)
++++ libdvdread/configure.ac    (working copy)
+@@ -158,6 +158,16 @@
+     ;;
+ esac
++AC_ARG_ENABLE([local-dlfcn],
++  [AS_HELP_STRING([--enable-local-dlfcn],
++  [use local dlfcn for mingw (default is auto)])],
++  [use_local_dlfcn=$enableval],
++  [use_local_dlfcn=no])
++
++if [[ $use_local_dlfcn = "yes" ]]; then
++      AC_DEFINE([USING_LOCAL_DLFCN], [1], ["Define to 1 to use local dlfcn"])
++fi
++
+ dnl ---------------------------------------------
+ dnl cflags
+ dnl ---------------------------------------------
+Index: src/dvd_input.c
+===================================================================
+--- libdvdread/src/dvd_input.c (revision 1168)
++++ libdvdread/src/dvd_input.c (working copy)
+@@ -50,7 +50,7 @@
+ #else
+ /* dlopening libdvdcss */
+-#ifdef HAVE_DLFCN_H
++#if defined(HAVE_DLFCN_H) && !defined(USING_LOCAL_DLFCN)
+ #include <dlfcn.h>
+ #else
+ /* Only needed on MINGW at the moment */
index 3db333b..1aea1e3 100644 (file)
@@ -4,4 +4,5 @@ $(eval $(call import.CONTRIB.defs,LIBDVDREAD))
 LIBDVDREAD.FETCH.url = http://download.m0k.org/handbrake/contrib/libdvdread-svn1168.tar.gz
 LIBDVDREAD.EXTRACT.tarbase = libdvdread
 
+LIBDVDREAD.CONFIGURE.extra = --enable-local-dlfcn
 LIBDVDREAD.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; autoreconf -fiv;
index 3805d25..9f3b095 100644 (file)
@@ -1,4 +1,6 @@
 $(eval $(call import.MODULE.defs,LIBMKV,libmkv))
 $(eval $(call import.CONTRIB.defs,LIBMKV))
 
-LIBMKV.FETCH.url = http://download.m0k.org/handbrake/contrib/libmkv-0.6.4.tar.bz2
+LIBMKV.FETCH.url = http://download.m0k.org/handbrake/contrib/libmkv-0.6.4.1-0-ga80e593.tar.bz2
+
+LIBMKV.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; mkdir m4; autoreconf -fiv;
diff --git a/contrib/libvorbis/A01-docs.patch b/contrib/libvorbis/A01-docs.patch
new file mode 100644 (file)
index 0000000..8173457
--- /dev/null
@@ -0,0 +1,34 @@
+--- libvorbis/doc/Makefile.am  2005-11-27 21:43:22.000000000 -0800
++++ xxx/doc/Makefile.am        2010-09-11 09:29:32.849597873 -0700
+@@ -30,7 +30,18 @@
+       vorbisword2.png \
+       wait.png \
+       white-ogg.png \
+-      white-xifish.png
++      components.png \
++      floor1-1.png \
++      floor1-2.png \
++      floor1-3.png \
++      floor1-4.png \
++      hufftree.png \
++      hufftree-under.png \
++      residue-pack.png \
++      residue2.png \
++      white-xifish.png \
++      window1.png \
++      window2.png
+ ### FIXME: bits needed by the spec which lives in xml
+ SPEC_PNG = \
+@@ -55,9 +66,9 @@
+ # conditionally make the generated documentation
+ if BUILD_DOCS
+-doc_DATA = $(static_docs) $(SPEC_PNG) $(built_docs)
++doc_DATA = $(static_docs) $(built_docs)
+ else
+-doc_DATA = $(static_docs) $(SPEC_PNG)
++doc_DATA = $(static_docs)
+ endif
+ EXTRA_DIST = $(static_docs) $(doc_sources) \
index df7339c..d3795df 100644 (file)
@@ -5,3 +5,5 @@ LIBVORBIS.FETCH.url = http://download.m0k.org/handbrake/contrib/libvorbis-aotuv_
 LIBVORBIS.EXTRACT.tarbase = libvorbis
 
 LIBVORBIS.CONFIGURE.extra = --with-ogg=$(call fn.ABSOLUTE,$(CONTRIB.build/)) HAVE_PKG_CONFIG="no"
+
+LIBVORBIS.CONFIGURE.bootstrap = rm -fr aclocal.m4 autom4te.cache; autoreconf -fiv;
diff --git a/contrib/libxml2/module.defs b/contrib/libxml2/module.defs
new file mode 100644 (file)
index 0000000..b495fef
--- /dev/null
@@ -0,0 +1,10 @@
+$(eval $(call import.MODULE.defs,LIBXML2,libxml2))
+$(eval $(call import.CONTRIB.defs,LIBXML2))
+
+LIBXML2.FETCH.url = http://download.m0k.org/handbrake/contrib/libxml2-2.7.7.tar.gz
+LIBXML2.EXTRACT.tarbase = libxml2-2.7.7
+
+# The Python components do not build on MinGW due to the lack of a select() call
+# in the MinGW environment.
+LIBXML2.CONFIGURE.extra = \
+    --without-python --without-threads
diff --git a/contrib/libxml2/module.rules b/contrib/libxml2/module.rules
new file mode 100644 (file)
index 0000000..0715628
--- /dev/null
@@ -0,0 +1,2 @@
+$(eval $(call import.MODULE.rules,LIBXML2))
+$(eval $(call import.CONTRIB.rules,LIBXML2))
diff --git a/contrib/mp4v2/A00-nero-vobsub.patch b/contrib/mp4v2/A00-nero-vobsub.patch
new file mode 100644 (file)
index 0000000..beb8be6
--- /dev/null
@@ -0,0 +1,142 @@
+diff -Naur mp4v2-trunk-r355/include/mp4v2/general.h mp4v2-trunk-r355/include/mp4v2/general.h
+--- mp4v2-trunk-r355/include/mp4v2/general.h   2009-05-23 06:09:58.000000000 -0700
++++ mp4v2-trunk-r355/include/mp4v2/general.h   2010-05-23 14:22:21.949288657 -0700
+@@ -75,6 +75,7 @@
+ #define MP4_CNTL_TRACK_TYPE     "cntl"  /**< Constant: control track. */
+ #define MP4_TEXT_TRACK_TYPE     "text"  /**< Constant: text track. */
+ #define MP4_SUBTITLE_TRACK_TYPE "sbtl"  /**< Constant: subtitle track. */
++#define MP4_SUBPIC_TRACK_TYPE   "subp"  /**< Constant: subtitle track. */
+ /*
+  * This second set of track types should be created
+  * via MP4AddSystemsTrack(type)
+diff -Naur mp4v2-trunk-r355/include/mp4v2/track.h mp4v2-trunk-r355/include/mp4v2/track.h
+--- mp4v2-trunk-r355/include/mp4v2/track.h     2009-05-23 06:21:49.000000000 -0700
++++ mp4v2-trunk-r355/include/mp4v2/track.h     2010-05-23 15:43:47.249286008 -0700
+@@ -310,6 +310,13 @@
+     uint16_t      height );
+ MP4V2_EXPORT
++MP4TrackId MP4AddSubpicTrack(
++    MP4FileHandle hFile,
++    uint32_t      timescale,
++    uint16_t      width,
++    uint16_t      height );
++
++MP4V2_EXPORT
+ MP4TrackId MP4AddPixelAspectRatio(
+     MP4FileHandle hFile,
+     MP4TrackId    refTrackId,
+diff -Naur mp4v2-trunk-r355/src/descriptors.h mp4v2-trunk-r355/src/descriptors.h
+--- mp4v2-trunk-r355/src/descriptors.h 2009-05-20 19:52:32.000000000 -0700
++++ mp4v2-trunk-r355/src/descriptors.h 2010-05-23 16:29:34.800935677 -0700
+@@ -119,6 +119,7 @@
+ // ES objectTypeId
+ const uint8_t MP4SystemsV1ObjectType            = 0x01;
+ const uint8_t MP4SystemsV2ObjectType            = 0x02;
++const uint8_t MP4SubpicObjectType               = 0xe0;
+ // ES streamType
+ const uint8_t MP4ObjectDescriptionStreamType    = 0x01;
+@@ -131,6 +132,7 @@
+ const uint8_t MP4OCIStreamType                  = 0x08;
+ const uint8_t MP4MPEGJStreamType                = 0x09;
+ const uint8_t MP4UserPrivateStreamType          = 0x20;
++const uint8_t MP4NeroSubpicStreamType           = 0x38;
+ ///////////////////////////////////////////////////////////////////////////////
+diff -Naur mp4v2-trunk-r355/src/mp4.cpp mp4v2-trunk-r355/src/mp4.cpp
+--- mp4v2-trunk-r355/src/mp4.cpp       2009-05-23 06:29:37.000000000 -0700
++++ mp4v2-trunk-r355/src/mp4.cpp       2010-05-23 15:45:28.852222074 -0700
+@@ -1174,6 +1174,23 @@
+         return MP4_INVALID_TRACK_ID;
+     }
++    MP4TrackId MP4AddSubpicTrack(MP4FileHandle hFile,
++                                   uint32_t timescale,
++                                   uint16_t width,
++                                   uint16_t height)
++    {
++        if (MP4_IS_VALID_FILE_HANDLE(hFile)) {
++            try {
++                return ((MP4File*)hFile)->AddSubpicTrack(timescale, width, height);
++            }
++            catch (MP4Error* e) {
++                PRINT_ERROR(e);
++                delete e;
++            }
++        }
++        return MP4_INVALID_TRACK_ID;
++    }
++
+     MP4TrackId MP4AddChapterTextTrack(
+         MP4FileHandle hFile, MP4TrackId refTrackId, uint32_t timescale)
+     {
+diff -Naur mp4v2-trunk-r355/src/mp4file.cpp mp4v2-trunk-r355/src/mp4file.cpp
+--- mp4v2-trunk-r355/src/mp4file.cpp   2009-05-26 19:34:56.000000000 -0700
++++ mp4v2-trunk-r355/src/mp4file.cpp   2010-05-23 16:32:52.654220633 -0700
+@@ -2095,6 +2095,50 @@
+     return trackId;
+ }
++MP4TrackId MP4File::AddSubpicTrack(uint32_t timescale,
++                                     uint16_t width,
++                                     uint16_t height)
++{
++    MP4TrackId trackId =
++        AddTrack(MP4_SUBPIC_TRACK_TYPE, timescale);
++
++    InsertChildAtom(MakeTrackName(trackId, "mdia.minf"), "nmhd", 0);
++
++    (void)AddChildAtom(MakeTrackName(trackId, "mdia.minf.stbl.stsd"), "mp4s");
++
++    SetTrackFloatProperty(trackId, "tkhd.width", width);
++    SetTrackFloatProperty(trackId, "tkhd.height", height);
++    SetTrackIntegerProperty(trackId, "tkhd.layer", 0);
++
++    // stsd is a unique beast in that it has a count of the number
++    // of child atoms that needs to be incremented after we add the mp4s atom
++    MP4Integer32Property* pStsdCountProperty;
++    FindIntegerProperty(
++        MakeTrackName(trackId, "mdia.minf.stbl.stsd.entryCount"),
++        (MP4Property**)&pStsdCountProperty);
++    pStsdCountProperty->IncrementValue();
++
++    SetTrackIntegerProperty(trackId,
++                            "mdia.minf.stbl.stsd.mp4s.esds.ESID",
++#if 0
++                            // note - for a file, these values need to
++                            // be 0 - wmay - 04/16/2003
++                            trackId
++#else
++                            0
++#endif
++                           );
++
++    SetTrackIntegerProperty(trackId,
++                            "mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr.objectTypeId",
++                            MP4SubpicObjectType);
++
++    SetTrackIntegerProperty(trackId,
++                            "mdia.minf.stbl.stsd.mp4s.esds.decConfigDescr.streamType",
++                            MP4NeroSubpicStreamType);
++    return trackId;
++}
++
+ MP4TrackId MP4File::AddChapterTextTrack(MP4TrackId refTrackId, uint32_t timescale)
+ {
+     // validate reference track id
+diff -Naur mp4v2-trunk-r355/src/mp4file.h mp4v2-trunk-r355/src/mp4file.h
+--- mp4v2-trunk-r355/src/mp4file.h     2009-05-23 06:29:37.000000000 -0700
++++ mp4v2-trunk-r355/src/mp4file.h     2010-05-23 15:44:57.568026299 -0700
+@@ -388,6 +388,10 @@
+                                 uint16_t width,
+                                 uint16_t height);
++    MP4TrackId AddSubpicTrack(uint32_t timescale,
++                                uint16_t width,
++                                uint16_t height);
++
+     MP4TrackId AddPixelAspectRatio(MP4TrackId trackId, uint32_t hSpacing, uint32_t vSpacing);
+     MP4TrackId AddColr(MP4TrackId trackId, uint16_t pri, uint16_t tran, uint16_t mat);
diff --git a/contrib/mp4v2/P00-mingw-dllimport.patch b/contrib/mp4v2/P00-mingw-dllimport.patch
new file mode 100644 (file)
index 0000000..5b7f1a3
--- /dev/null
@@ -0,0 +1,11 @@
+--- mp4v2-trunk-r355/include/mp4v2/platform.h  2009-05-20 19:52:26.000000000 -0700
++++ xxx/include/mp4v2/platform.h       2010-09-11 09:36:20.881523832 -0700
+@@ -24,7 +24,7 @@
+ #if defined( _WIN32 ) || defined( __MINGW32__ )
+ #   if defined( _WINDLL ) || defined( DLL_EXPORT )
+ #       define MP4V2_EXPORT __declspec(dllexport)
+-#   elif defined( _DLL ) || defined( DLL_IMPORT ) 
++#   elif defined( DLL_IMPORT ) 
+ #       define MP4V2_EXPORT __declspec(dllimport)
+ #   else
+ #       define MP4V2_EXPORT
index c27f347..a69151d 100644 (file)
@@ -10,8 +10,5 @@ MP4V2.CONFIGURE.env.CXXFLAGS = CXXFLAGS="$(call fn.ARGS,MP4V2.GCC,*archs *sysroo
 ## save some build-time by disabling utils
 MP4V2.CONFIGURE.extra += --disable-util
 
-## make sure gch is disabled; we get build errors on linux with gcc-4.3.x and -g3
-## relatively safe to enable for darwin as it is unlikely to have that bugged version
-ifneq (darwin,$(BUILD.system))
-    MP4V2.CONFIGURE.extra += --disable-gch
-endif
+# gch causes build errors with -g3 on many gcc toolchains
+MP4V2.CONFIGURE.extra += --disable-gch
diff --git a/contrib/pthreadw32/P00-mingw-w64.patch b/contrib/pthreadw32/P00-mingw-w64.patch
new file mode 100644 (file)
index 0000000..1d4b968
--- /dev/null
@@ -0,0 +1,1457 @@
+# Bazaar merge directive format 2 (Bazaar 0.90)
+# revision_id: dmitrij.ledkov@ubuntu.com-20100710232946-\
+#   1vpsymidgi7alpwt
+# target_branch: ../pthreads.bzr/
+# testament_sha1: 521ee14bce6f871b77f9d6797b4460612a673359
+# timestamp: 2010-07-11 02:10:15 +0100
+# source_branch: .
+# base_revision_id: git-v1:fe3f4b4cd92c4d6fc37139dd6cf8214c558676ca
+# 
+# Begin patch
+=== modified file 'GNUmakefile'
+--- pthreadw32/GNUmakefile     2010-06-20 03:31:18 +0000
++++ pthreadw32/GNUmakefile     2010-07-10 23:29:46 +0000
+@@ -49,14 +49,27 @@
+ # For cross compiling use e.g.
+ # make CROSS=i386-mingw32msvc- clean GC-inlined
+-CROSS = 
+-
+-AR    = $(CROSS)ar
+-DLLTOOL = $(CROSS)dlltool
+-CC      = $(CROSS)gcc
+-CXX     = $(CROSS)g++
+-RANLIB  = $(CROSS)ranlib
+-RC    = $(CROSS)windres
++target  = 
++prefix = /usr/local
++
++ifeq (,$(findstring x86_64, $(target)))
++#32bit
++BITNESS=-m32
++DLLFLAG=-m i386
++WINDRESFLAG=pe-i386
++else
++#64bit
++BITNESS=-m64
++DLLFLAG=-m i386:x86-64
++WINDRESFLAG=pe-x86-64
++endif
++
++AR    = $(target)ar
++DLLTOOL = $(target)dlltool $(DLLFLAG)
++CC      = $(target)gcc $(BITNESS)
++CXX     = $(target)g++ $(BITNESS)
++RANLIB  = $(target)ranlib
++RC    = $(target)windres -F $(WINDRESFLAG)
+ OPT   = $(CLEANUP) -O3 -finline-functions
+ DOPT  = $(CLEANUP) -g -O0
+@@ -268,7 +281,7 @@
+               version.o
+ INCL  = \
+-              config.h \
++              pthreads_win32_config.h \
+               implement.h \
+               semaphore.h \
+               pthread.h \
+@@ -585,3 +598,11 @@
+ sync.o:               sync.c $(SYNC_SRCS) $(INCL)
+ tsd.o:                tsd.c $(TSD_SRCS) $(INCL)
+ version.o:    version.rc $(INCL)
++
++install:
++      install -d $(prefix)/$(target)/bin
++      install -d $(prefix)/$(target)/lib
++      install -d $(prefix)/$(target)/include
++      install pthreadGC$(DLL_VER).dll $(prefix)/$(target)/bin/pthreadGC$(DLL_VER).dll
++      install pthreadGC$(DLL_VER).dll $(prefix)/$(target)/lib/libpthread.a
++      install pthreads_win32_config.h pthread.h sched.h semaphore.h $(prefix)/$(target)/include
+
+=== modified file 'context.h'
+--- pthreadw32/context.h       2007-01-06 13:44:39 +0000
++++ pthreadw32/context.h       2010-07-10 23:05:44 +0000
+@@ -39,7 +39,7 @@
+ #undef PTW32_PROGCTR
+-#if defined(_M_IX86) || defined(_X86_)
++#if defined(_M_IX86) || (defined(_X86_) && !defined(__amd64__))
+ #define PTW32_PROGCTR(Context)  ((Context).Eip)
+ #endif
+
+=== modified file 'pthread.h'
+--- pthreadw32/pthread.h       2010-06-20 03:31:18 +0000
++++ pthreadw32/pthread.h       2010-07-10 23:29:46 +0000
+@@ -112,7 +112,7 @@
+ #ifdef _UWIN
+ #   define HAVE_STRUCT_TIMESPEC 1
+ #   define HAVE_SIGNAL_H        1
+-#   undef HAVE_CONFIG_H
++#   undef 1
+ #   pragma comment(lib, "pthread")
+ #endif
+@@ -210,9 +210,17 @@
+  * -----------------
+  */
+-#if HAVE_CONFIG_H
+-#include "config.h"
+-#endif /* HAVE_CONFIG_H */
++#if 1
++#include "pthreads_win32_config.h"
++#endif /* 1 */
++
++#ifdef __MINGW32__
++# include <_mingw.h>
++# ifdef __MINGW64_VERSION_MAJOR
++  /* MinGW-w64 already has it: */
++#   define HAVE_STRUCT_TIMESPEC 1
++# endif
++#endif
+ #ifndef NEED_FTIME
+ #include <time.h>
+@@ -236,7 +244,7 @@
+ };
+ /*
+- * This is a duplicate of what is in the autoconf config.h,
++ * This is a duplicate of what is in the autoconf pthreads_win32_config.h,
+  * which is only used when building the pthread-win32 libraries.
+  */
+
+--- pthreadsw32/pthread_win32_attach_detach_np.c       2010-09-11 13:08:31.120188567 -0700
++++ xxx/pthread_win32_attach_detach_np.c       2010-09-11 13:08:40.209188369 -0700
+@@ -97,6 +97,10 @@
+  * InterlockedCompareExchange routine in WIN64 is an intrinsic function.
+  * See PTW32_INTERLOCKED_COMPARE_EXCHANGE implement.h
+  */
++  ptw32_interlocked_compare_exchange = 
++    (PTW32_INTERLOCKED_LONG (WINAPI *)
++     (PTW32_INTERLOCKED_LPLONG, PTW32_INTERLOCKED_LONG,
++      PTW32_INTERLOCKED_LONG)) InterlockedCompareExchange;
+ #else
+=== modified file 'pthread_cancel.c'
+--- pthreadw32/pthread_cancel.c        2010-06-20 03:31:18 +0000
++++ pthreadw32/pthread_cancel.c        2010-07-10 23:29:46 +0000
+@@ -47,7 +47,7 @@
+ }
+ static void CALLBACK
+-ptw32_cancel_callback (DWORD unused)
++ptw32_cancel_callback (ULONG_PTR unused)
+ {
+   ptw32_throw (PTW32_EPS_CANCEL);
+@@ -157,7 +157,7 @@
+              * this will result in a call to ptw32_RegisterCancelation and only
+              * the threadH arg will be used.
+              */
+-            ptw32_register_cancelation (ptw32_cancel_callback, threadH, 0);
++            ptw32_register_cancelation ((PAPCFUNC)ptw32_cancel_callback, threadH, 0);
+             (void) pthread_mutex_unlock (&tp->cancelLock);
+             ResumeThread (threadH);
+           }
+
+=== modified file 'pthread_exit.c'
+--- pthreadw32/pthread_exit.c  2007-05-15 13:46:42 +0000
++++ pthreadw32/pthread_exit.c  2010-07-10 23:05:44 +0000
+@@ -89,7 +89,7 @@
+        */
+ #if ! defined (__MINGW32__) || defined (__MSVCRT__)  || defined (__DMC__)
+-      _endthreadex ((unsigned) value_ptr);
++      _endthreadex ((unsigned) (size_t) value_ptr);
+ #else
+       _endthread ();
+ #endif
+
+=== modified file 'pthread_spin_destroy.c'
+--- pthreadw32/pthread_spin_destroy.c  2005-01-01 14:36:17 +0000
++++ pthreadw32/pthread_spin_destroy.c  2010-07-10 23:05:44 +0000
+@@ -59,9 +59,9 @@
+              PTW32_INTERLOCKED_COMPARE_EXCHANGE ((PTW32_INTERLOCKED_LPLONG)
+                                                  & (s->interlock),
+                                                  (PTW32_INTERLOCKED_LONG)
+-                                                 PTW32_OBJECT_INVALID,
++                                                 (size_t)PTW32_OBJECT_INVALID,
+                                                  (PTW32_INTERLOCKED_LONG)
+-                                                 PTW32_SPIN_UNLOCKED))
++                                                 (size_t)PTW32_SPIN_UNLOCKED))
+       {
+         result = EINVAL;
+       }
+
+=== modified file 'pthread_timechange_handler_np.c'
+--- pthreadw32/pthread_timechange_handler_np.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/pthread_timechange_handler_np.c 2010-07-10 23:05:44 +0000
+@@ -103,5 +103,5 @@
+   LeaveCriticalSection (&ptw32_cond_list_lock);
+-  return (void *) (result != 0 ? EAGAIN : 0);
++  return (void *) (size_t) (result != 0 ? EAGAIN : 0);
+ }
+
+=== renamed file 'config.h' => 'pthreads_win32_config.h'
+=== modified file 'ptw32_MCS_lock.c'
+--- pthreadw32/ptw32_MCS_lock.c        2010-06-20 03:31:18 +0000
++++ pthreadw32/ptw32_MCS_lock.c        2010-07-10 23:29:46 +0000
+@@ -101,10 +101,10 @@
+ INLINE void 
+ ptw32_mcs_flag_set (LONG * flag)
+ {
+-  HANDLE e = (HANDLE)PTW32_INTERLOCKED_COMPARE_EXCHANGE(
++  HANDLE e = (HANDLE)(size_t) PTW32_INTERLOCKED_COMPARE_EXCHANGE(
+                                               (PTW32_INTERLOCKED_LPLONG)flag,
+-                                              (PTW32_INTERLOCKED_LONG)-1,
+-                                              (PTW32_INTERLOCKED_LONG)0);
++                                              (PTW32_INTERLOCKED_LONG)(size_t)-1,
++                                              (PTW32_INTERLOCKED_LONG)(size_t)0);
+   if ((HANDLE)0 != e)
+     {
+       /* another thread has already stored an event handle in the flag */
+@@ -129,8 +129,8 @@
+       if (0 == PTW32_INTERLOCKED_COMPARE_EXCHANGE(
+                                         (PTW32_INTERLOCKED_LPLONG)flag,
+-                                        (PTW32_INTERLOCKED_LONG)e,
+-                                        (PTW32_INTERLOCKED_LONG)0))
++                                        (PTW32_INTERLOCKED_LONG)(size_t)e,
++                                        (PTW32_INTERLOCKED_LONG)(size_t)0))
+       {
+         /* stored handle in the flag. wait on it now. */
+         WaitForSingleObject(e, INFINITE);
+@@ -159,8 +159,8 @@
+   node->next = 0; /* initially, no successor */
+   
+   /* queue for the lock */
+-  pred = (ptw32_mcs_local_node_t *)PTW32_INTERLOCKED_EXCHANGE((PTW32_INTERLOCKED_LPLONG)lock,
+-                                                            (PTW32_INTERLOCKED_LONG)node);
++  pred = (ptw32_mcs_local_node_t *)InterlockedExchangePointer((PVOID volatile *)lock,
++                                                            (void*)node);
+   if (0 != pred)
+     {
+@@ -184,17 +184,19 @@
+ {
+   ptw32_mcs_lock_t *lock = node->lock;
+   ptw32_mcs_local_node_t *next = (ptw32_mcs_local_node_t *)
+-    InterlockedExchangeAdd((LPLONG)&node->next,
+-                           (LONG)0); /* MBR fence */
+-
++#ifndef _WIN64
++    InterlockedExchangeAdd((LPLONG)&node->next, 0); /* MBR fence */
++#else
++    InterlockedExchangeAdd64((LONG64 *)&node->next, 0); /* MBR fence */
++#endif
+   if (0 == next)
+     {
+       /* no known successor */
+       if (node == (ptw32_mcs_local_node_t *)
+-        PTW32_INTERLOCKED_COMPARE_EXCHANGE((PTW32_INTERLOCKED_LPLONG)lock,
+-                                           (PTW32_INTERLOCKED_LONG)0,
+-                                           (PTW32_INTERLOCKED_LONG)node))
++        InterlockedCompareExchangePointer((LPVOID volatile *)lock,
++                                           (PVOID)0,
++                                           (PVOID)node))
+       {
+         /* no successor, lock is free now */
+         return;
+@@ -203,7 +205,11 @@
+       /* wait for successor */
+       ptw32_mcs_flag_wait(&node->nextFlag);
+       next = (ptw32_mcs_local_node_t *)
++#ifndef _WIN64
+       InterlockedExchangeAdd((LPLONG)&node->next, 0); /* MBR fence */
++#else
++      InterlockedExchangeAdd64((LONG64 *)&node->next, 0); /* MBR fence */
++#endif
+     }
+   /* pass the lock */
+
+=== modified file 'ptw32_threadStart.c'
+--- pthreadw32/ptw32_threadStart.c     2005-05-15 15:28:24 +0000
++++ pthreadw32/ptw32_threadStart.c     2010-07-10 23:05:44 +0000
+@@ -344,7 +344,7 @@
+ #endif
+ #if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__)
+-  _endthreadex ((unsigned) status);
++  _endthreadex ((unsigned) (size_t) status);
+ #else
+   _endthread ();
+ #endif
+@@ -354,7 +354,7 @@
+    */
+ #if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__)
+-  return (unsigned) status;
++  return (unsigned) (size_t) status;
+ #endif
+ }                             /* ptw32_threadStart */
+
+=== modified file 'ptw32_throw.c'
+--- pthreadw32/ptw32_throw.c   2008-06-06 00:23:20 +0000
++++ pthreadw32/ptw32_throw.c   2010-07-10 23:05:44 +0000
+@@ -79,12 +79,12 @@
+       switch (exception)
+       {
+       case PTW32_EPS_CANCEL:
+-        exitCode = (unsigned) PTHREAD_CANCELED;
++        exitCode = (unsigned) (size_t) PTHREAD_CANCELED;
+         break;
+       case PTW32_EPS_EXIT:
+         if (NULL != sp)
+           {
+-            exitCode = (unsigned) sp->exitStatus;
++            exitCode = (unsigned) (size_t) sp->exitStatus;
+           }
+         break;
+       }
+@@ -166,7 +166,7 @@
+ #else
+-  return (DWORD) NULL;
++  return (DWORD) (size_t) NULL;
+ #endif
+ }
+
+=== modified file 'tests/GNUmakefile'
+--- pthreadw32/tests/GNUmakefile       2010-06-20 04:26:26 +0000
++++ pthreadw32/tests/GNUmakefile       2010-07-10 23:29:46 +0000
+@@ -33,6 +33,11 @@
+ DLL_VER       = 2
++# For cross compiling use, e.g. CROSS=x86_64-w64-mingw32msvc-
++# Although testing is supposed to be done on windows, this may still be
++# needed, because one may as well use an x86-hosted toolchain on an x64.
++CROSS = 
++
+ CP    = cp -f
+ MV    = mv -f
+ RM    = rm -f
+@@ -167,34 +172,34 @@
+       @ $(MAKE) clean GCE
+ GC:
+-      $(MAKE) TEST=GC CC=gcc XXCFLAGS="-fopenmp -D__CLEANUP_C" all-pass
++      $(MAKE) TEST=GC CC=$(CROSS)gcc XXCFLAGS="-fopenmp -D__CLEANUP_C" all-pass
+ GCE:
+-      $(MAKE) TEST=GCE CC=g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_CXX" all-pass
++      $(MAKE) TEST=GCE CC=$(CROSS)g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_CXX" all-pass
+ GCX:
+-      $(MAKE) TEST=GC CC=g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_C" all-pass
++      $(MAKE) TEST=GC CC=$(CROSS)g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_C" all-pass
+ GC-bench:
+-      $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench
++      $(MAKE) TEST=GC CC=$(CROSS)gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench
+ GCE-bench:
+-      $(MAKE) TEST=GCE  CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench
++      $(MAKE) TEST=GCE  CC=$(CROSS)g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench
+ GC-debug:
+-      $(MAKE) TEST=GC CC=gcc XXCFLAGS="-fopenmp -D__CLEANUP_C" DLL_VER="$(DLL_VER)d" all-pass
++      $(MAKE) TEST=GC CC=$(CROSS)gcc XXCFLAGS="-fopenmp -D__CLEANUP_C" DLL_VER="$(DLL_VER)d" all-pass
+ GC-static:
+-      $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C -DPTW32_STATIC_LIB" XXLIBS="-lws2_32" DLL="" all-static
++      $(MAKE) TEST=GC CC=$(CROSS)gcc XXCFLAGS="-D__CLEANUP_C -DPTW32_STATIC_LIB" XXLIBS="-lws2_32" DLL="" all-static
+ GC-stress:
+       $(ECHO) Stress tests can take a long time since they are trying to
+       $(ECHO) expose weaknesses that may be intermittant or statistically rare.
+       $(ECHO) A pass does not prove correctness, but may give greater confidence.
+-      $(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="" all-stress
++      $(MAKE) TEST=GC CC=$(CROSS)gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="" all-stress
+ GCE-stress:
+-      $(MAKE) TEST=GCE  CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="" all-stress
++      $(MAKE) TEST=GCE  CC=$(CROSS)g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="" all-stress
+ all-pass: $(PASSES)
+       @ $(ECHO) ALL TESTS PASSED! Congratulations!
+
+=== modified file 'tests/barrier3.c'
+--- pthreadw32/tests/barrier3.c        2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/barrier3.c        2010-07-10 23:05:44 +0000
+@@ -41,7 +41,7 @@
+ #include "test.h"
+  
+ pthread_barrier_t barrier = NULL;
+-static int result = 1;
++static DWORD_PTR result = 1;
+ void * func(void * arg)
+ {
+
+=== modified file 'tests/barrier5.c'
+--- pthreadw32/tests/barrier5.c        2010-06-20 03:31:18 +0000
++++ pthreadw32/tests/barrier5.c        2010-07-10 23:29:46 +0000
+@@ -79,7 +79,7 @@
+ main()
+ {
+   int i, j;
+-  int result;
++  DWORD_PTR result;
+   int serialThreadsTotal;
+   LONG Crossings;
+   pthread_t t[NUMTHREADS + 1];
+@@ -104,7 +104,7 @@
+       for (i = 1; i <= j; i++)
+         {
+           assert(pthread_join(t[i], (void **) &result) == 0);
+-          serialThreadsTotal += result;
++          serialThreadsTotal += (int)result;
+         }
+       assert(serialThreadsTotal == BARRIERMULTIPLE);
+
+=== modified file 'tests/cancel2.c'
+--- pthreadw32/tests/cancel2.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/cancel2.c 2010-07-10 23:05:44 +0000
+@@ -217,7 +217,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+       fail = (result != (int) PTHREAD_CANCELED);
+
+=== modified file 'tests/cancel3.c'
+--- pthreadw32/tests/cancel3.c 2010-06-22 01:19:08 +0000
++++ pthreadw32/tests/cancel3.c 2010-07-10 23:29:46 +0000
+@@ -173,7 +173,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       /*
+        * The thread does not contain any cancelation points, so
+
+=== modified file 'tests/cancel4.c'
+--- pthreadw32/tests/cancel4.c 2005-05-06 07:31:28 +0000
++++ pthreadw32/tests/cancel4.c 2010-07-10 23:05:44 +0000
+@@ -98,7 +98,7 @@
+ void *
+ mythread(void * arg)
+ {
+-  int result = ((int)PTHREAD_CANCELED + 1);
++  int result = ((int)(size_t)PTHREAD_CANCELED + 1);
+   bag_t * bag = (bag_t *) arg;
+   assert(bag == &threadbag[bag->threadnum]);
+@@ -118,7 +118,7 @@
+   for (bag->count = 0; bag->count < 20; bag->count++)
+     Sleep(100);
+-  return (void *) result;
++  return (void *) (size_t)result;
+ }
+ int
+@@ -173,7 +173,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       /*
+        * The thread does not contain any cancelation points, so
+@@ -182,7 +182,7 @@
+        */
+       assert(pthread_join(t[i], (void **) &result) == 0);
+-      fail = (result == (int) PTHREAD_CANCELED);
++      fail = (result == (int) (size_t) PTHREAD_CANCELED);
+       if (fail)
+       {
+
+=== modified file 'tests/cancel5.c'
+--- pthreadw32/tests/cancel5.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/cancel5.c 2010-07-10 23:05:44 +0000
+@@ -171,7 +171,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       /*
+        * The thread does not contain any cancelation points, so
+
+=== modified file 'tests/cancel6a.c'
+--- pthreadw32/tests/cancel6a.c        2004-11-03 01:08:41 +0000
++++ pthreadw32/tests/cancel6a.c        2010-07-10 23:05:44 +0000
+@@ -85,7 +85,7 @@
+ void *
+ mythread(void * arg)
+ {
+-  int result = ((int)PTHREAD_CANCELED + 1);
++  int result = ((int)(size_t)PTHREAD_CANCELED + 1);
+   bag_t * bag = (bag_t *) arg;
+   assert(bag == &threadbag[bag->threadnum]);
+@@ -105,7 +105,7 @@
+   for (bag->count = 0; bag->count < 100; bag->count++)
+     Sleep(100);
+-  return (void *) result;
++  return (void *) (size_t)result;
+ }
+ int
+@@ -161,7 +161,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       /*
+        * The thread does not contain any cancelation points, so
+@@ -170,7 +170,7 @@
+        */
+       assert(pthread_join(t[i], (void **) &result) == 0);
+-      fail = (result != (int) PTHREAD_CANCELED);
++      fail = (result != (int) (size_t) PTHREAD_CANCELED);
+       if (fail)
+       {
+
+=== modified file 'tests/cancel6d.c'
+--- pthreadw32/tests/cancel6d.c        2004-11-03 01:08:41 +0000
++++ pthreadw32/tests/cancel6d.c        2010-07-10 23:05:44 +0000
+@@ -86,7 +86,7 @@
+ void *
+ mythread(void * arg)
+ {
+-  int result = ((int)PTHREAD_CANCELED + 1);
++  int result = ((int) (size_t) PTHREAD_CANCELED + 1);
+   bag_t * bag = (bag_t *) arg;
+   assert(bag == &threadbag[bag->threadnum]);
+@@ -109,7 +109,7 @@
+       pthread_testcancel();
+     }
+-  return (void *) result;
++  return (void *) (size_t) result;
+ }
+ int
+@@ -165,11 +165,11 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+-      fail = (result != (int) PTHREAD_CANCELED);
++      fail = (result != (int) (size_t) PTHREAD_CANCELED);
+       if (fail)
+       {
+
+=== modified file 'tests/cancel8.c'
+--- pthreadw32/tests/cancel8.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/cancel8.c 2010-07-10 23:05:44 +0000
+@@ -195,7 +195,7 @@
+       assert(threadbag[i].self.p != NULL);
+       assert(pthread_kill(threadbag[i].self, 0) == ESRCH);
+-      fail = (result != (int) PTHREAD_CANCELED);
++      fail = (result != (int) (size_t) PTHREAD_CANCELED);
+       if (fail)
+       {
+
+=== modified file 'tests/cleanup0.c'
+--- pthreadw32/tests/cleanup0.c        2005-04-06 02:16:29 +0000
++++ pthreadw32/tests/cleanup0.c        2010-07-10 23:05:44 +0000
+@@ -189,7 +189,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+
+=== modified file 'tests/cleanup1.c'
+--- pthreadw32/tests/cleanup1.c        2005-04-06 02:16:29 +0000
++++ pthreadw32/tests/cleanup1.c        2010-07-10 23:05:44 +0000
+@@ -203,7 +203,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+
+=== modified file 'tests/cleanup2.c'
+--- pthreadw32/tests/cleanup2.c        2005-04-06 02:16:29 +0000
++++ pthreadw32/tests/cleanup2.c        2010-07-10 23:05:44 +0000
+@@ -178,7 +178,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+
+=== modified file 'tests/cleanup3.c'
+--- pthreadw32/tests/cleanup3.c        2005-04-06 02:16:29 +0000
++++ pthreadw32/tests/cleanup3.c        2010-07-10 23:05:44 +0000
+@@ -183,7 +183,7 @@
+   for (i = 1; i <= NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(t[i], (void **) &result) == 0);
+
+=== modified file 'tests/condvar1_2.c'
+--- pthreadw32/tests/condvar1_2.c      2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/condvar1_2.c      2010-07-10 23:05:44 +0000
+@@ -89,7 +89,7 @@
+ main()
+ {
+   int i, j, k;
+-  int result = -1;
++  DWORD_PTR result = -1;
+   pthread_t t;
+   for (k = 0; k < NUM_LOOPS; k++)
+
+=== modified file 'tests/condvar2.c'
+--- pthreadw32/tests/condvar2.c        2005-05-06 07:31:28 +0000
++++ pthreadw32/tests/condvar2.c        2010-07-10 23:05:44 +0000
+@@ -99,7 +99,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+@@ -109,7 +109,7 @@
+   assert(pthread_mutex_unlock(&mutex) == 0);
+   {
+-  int result = pthread_cond_destroy(&cv);
++  DWORD_PTR result = pthread_cond_destroy(&cv);
+   if (result != 0)
+     {
+       fprintf(stderr, "Result = %s\n", error_string[result]);
+
+=== modified file 'tests/condvar2_1.c'
+--- pthreadw32/tests/condvar2_1.c      2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/condvar2_1.c      2010-07-10 23:05:44 +0000
+@@ -105,7 +105,7 @@
+ {
+   int i;
+   pthread_t t[NUMTHREADS + 1];
+-  int result = 0;
++  DWORD_PTR result = 0;
+   struct _timeb currSysTime;
+   const DWORD NANOSEC_PER_MILLISEC = 1000000;
+@@ -116,7 +116,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/condvar3.c'
+--- pthreadw32/tests/condvar3.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar3.c        2010-07-10 23:05:44 +0000
+@@ -126,7 +126,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0);
+
+=== modified file 'tests/condvar3_1.c'
+--- pthreadw32/tests/condvar3_1.c      2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar3_1.c      2010-07-10 23:05:44 +0000
+@@ -126,7 +126,7 @@
+ {
+   int i;
+   pthread_t t[NUMTHREADS + 1];
+-  int result = 0;
++  DWORD_PTR result = 0;
+   struct _timeb currSysTime;
+   const DWORD NANOSEC_PER_MILLISEC = 1000000;
+@@ -139,7 +139,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/condvar3_2.c'
+--- pthreadw32/tests/condvar3_2.c      2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar3_2.c      2010-07-10 23:05:44 +0000
+@@ -127,7 +127,7 @@
+ {
+   int i;
+   pthread_t t[NUMTHREADS + 1];
+-  int result = 0;
++  DWORD_PTR result = 0;
+   struct _timeb currSysTime;
+   const DWORD NANOSEC_PER_MILLISEC = 1000000;
+@@ -138,7 +138,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = abstime.tv_sec = currSysTime.time + 5;
++  abstime.tv_sec = abstime.tv_sec = (long)currSysTime.time + 5;
+   abstime.tv_nsec = abstime2.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   assert(pthread_mutex_lock(&mutex) == 0);
+
+=== modified file 'tests/condvar3_3.c'
+--- pthreadw32/tests/condvar3_3.c      2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar3_3.c      2010-07-10 23:05:44 +0000
+@@ -96,7 +96,7 @@
+    /* get current system time */
+    _ftime(&currSysTime);
+-   abstime.tv_sec = currSysTime.time;
++   abstime.tv_sec = (long)currSysTime.time;
+    abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+    abstime.tv_sec += 1;
+@@ -120,7 +120,7 @@
+    assert(pthread_mutex_lock(&mtx) == 0);
+-   abstime.tv_sec = currSysTime.time;
++   abstime.tv_sec = (long)currSysTime.time;
+    abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+    abstime.tv_sec += 1;
+
+=== modified file 'tests/condvar4.c'
+--- pthreadw32/tests/condvar4.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar4.c        2010-07-10 23:05:44 +0000
+@@ -130,7 +130,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+@@ -143,7 +143,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/condvar5.c'
+--- pthreadw32/tests/condvar5.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar5.c        2010-07-10 23:05:44 +0000
+@@ -129,7 +129,7 @@
+   /* get current system time */
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+@@ -142,7 +142,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/condvar6.c'
+--- pthreadw32/tests/condvar6.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar6.c        2010-07-10 23:05:44 +0000
+@@ -159,7 +159,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/condvar7.c'
+--- pthreadw32/tests/condvar7.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar7.c        2010-07-10 23:05:44 +0000
+@@ -169,7 +169,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 10;
+
+=== modified file 'tests/condvar8.c'
+--- pthreadw32/tests/condvar8.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar8.c        2010-07-10 23:05:44 +0000
+@@ -166,7 +166,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 10;
+
+=== modified file 'tests/condvar9.c'
+--- pthreadw32/tests/condvar9.c        2005-04-25 14:42:37 +0000
++++ pthreadw32/tests/condvar9.c        2010-07-10 23:05:44 +0000
+@@ -174,7 +174,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 5;
+
+=== modified file 'tests/delay2.c'
+--- pthreadw32/tests/delay2.c  2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/delay2.c  2010-07-10 23:05:44 +0000
+@@ -65,7 +65,7 @@
+ main(int argc, char * argv[])
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   assert(pthread_mutex_lock(&mx) == 0);
+
+=== modified file 'tests/exception1.c'
+--- pthreadw32/tests/exception1.c      2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/exception1.c      2010-07-10 23:05:44 +0000
+@@ -226,7 +226,7 @@
+   for (i = 0; i < NUMTHREADS; i++)
+     {
+       int fail = 0;
+-      int result = 0;
++      DWORD_PTR result = 0;
+       /* Canceled thread */
+       assert(pthread_join(ct[i], (void **) &result) == 0);
+
+=== modified file 'tests/inherit1.c'
+--- pthreadw32/tests/inherit1.c        2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/inherit1.c        2010-07-10 23:05:44 +0000
+@@ -89,7 +89,7 @@
+   struct sched_param param;
+   assert(pthread_getschedparam(pthread_self(), &policy, &param) == 0);
+-  return (void *) param.sched_priority;
++  return (void *) (size_t) param.sched_priority;
+ }
+@@ -169,7 +169,7 @@
+           assert(pthread_attr_setschedparam(&attr, &param) == 0);
+           assert(pthread_create(&t, &attr, func, NULL) == 0);
+           pthread_join(t, &result);
+-          assert((int) result == mainParam.sched_priority);
++          assert((int) (size_t)result == mainParam.sched_priority);
+         }
+     }
+
+=== modified file 'tests/join0.c'
+--- pthreadw32/tests/join0.c   2005-05-15 15:28:24 +0000
++++ pthreadw32/tests/join0.c   2010-07-10 23:05:44 +0000
+@@ -53,7 +53,7 @@
+ main(int argc, char * argv[])
+ {
+   pthread_t id;
+-  int result;
++  DWORD_PTR result;
+   /* Create a single thread and wait for it to exit. */
+   assert(pthread_create(&id, NULL, func, (void *) 123) == 0);
+
+=== modified file 'tests/join1.c'
+--- pthreadw32/tests/join1.c   2005-05-15 15:28:24 +0000
++++ pthreadw32/tests/join1.c   2010-07-10 23:05:44 +0000
+@@ -56,7 +56,7 @@
+ {
+       pthread_t id[4];
+       int i;
+-      int result;
++      DWORD_PTR result;
+       /* Create a few threads and then exit. */
+       for (i = 0; i < 4; i++)
+
+=== modified file 'tests/join2.c'
+--- pthreadw32/tests/join2.c   2005-05-15 15:28:24 +0000
++++ pthreadw32/tests/join2.c   2010-07-10 23:05:44 +0000
+@@ -50,7 +50,7 @@
+ {
+       pthread_t id[4];
+       int i;
+-      int result;
++      DWORD_PTR result;
+       /* Create a few threads and then exit. */
+       for (i = 0; i < 4; i++)
+
+=== modified file 'tests/join3.c'
+--- pthreadw32/tests/join3.c   2005-05-15 15:28:24 +0000
++++ pthreadw32/tests/join3.c   2010-07-10 23:05:44 +0000
+@@ -50,7 +50,7 @@
+ {
+       pthread_t id[4];
+       int i;
+-      int result;
++      DWORD_PTR result;
+       /* Create a few threads and then exit. */
+       for (i = 0; i < 4; i++)
+
+=== modified file 'tests/mutex6e.c'
+--- pthreadw32/tests/mutex6e.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex6e.c 2010-07-10 23:05:44 +0000
+@@ -74,7 +74,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   int mxType = -1;
+   assert(pthread_mutexattr_init(&mxAttr) == 0);
+
+=== modified file 'tests/mutex6es.c'
+--- pthreadw32/tests/mutex6es.c        2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex6es.c        2010-07-10 23:05:44 +0000
+@@ -73,7 +73,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   assert(mutex == PTHREAD_ERRORCHECK_MUTEX_INITIALIZER);
+
+=== modified file 'tests/mutex6r.c'
+--- pthreadw32/tests/mutex6r.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex6r.c 2010-07-10 23:05:44 +0000
+@@ -73,7 +73,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   int mxType = -1;
+   assert(pthread_mutexattr_init(&mxAttr) == 0);
+
+=== modified file 'tests/mutex6rs.c'
+--- pthreadw32/tests/mutex6rs.c        2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex6rs.c        2010-07-10 23:05:44 +0000
+@@ -72,7 +72,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   assert(mutex == PTHREAD_RECURSIVE_MUTEX_INITIALIZER);
+
+=== modified file 'tests/mutex7e.c'
+--- pthreadw32/tests/mutex7e.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex7e.c 2010-07-10 23:05:44 +0000
+@@ -74,7 +74,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   int mxType = -1;
+   assert(pthread_mutexattr_init(&mxAttr) == 0);
+
+=== modified file 'tests/mutex7r.c'
+--- pthreadw32/tests/mutex7r.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/mutex7r.c 2010-07-10 23:05:44 +0000
+@@ -73,7 +73,7 @@
+ main()
+ {
+   pthread_t t;
+-  int result = 0;
++  DWORD_PTR result = 0;
+   int mxType = -1;
+   assert(pthread_mutexattr_init(&mxAttr) == 0);
+
+=== modified file 'tests/mutex8.c'
+--- pthreadw32/tests/mutex8.c  2002-02-20 04:39:56 +0000
++++ pthreadw32/tests/mutex8.c  2010-07-10 23:05:44 +0000
+@@ -49,7 +49,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/mutex8e.c'
+--- pthreadw32/tests/mutex8e.c 2002-02-20 04:39:56 +0000
++++ pthreadw32/tests/mutex8e.c 2010-07-10 23:05:44 +0000
+@@ -57,7 +57,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/mutex8n.c'
+--- pthreadw32/tests/mutex8n.c 2002-02-20 04:39:56 +0000
++++ pthreadw32/tests/mutex8n.c 2010-07-10 23:05:44 +0000
+@@ -57,7 +57,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/mutex8r.c'
+--- pthreadw32/tests/mutex8r.c 2002-02-20 04:39:56 +0000
++++ pthreadw32/tests/mutex8r.c 2010-07-10 23:05:44 +0000
+@@ -57,7 +57,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/priority1.c'
+--- pthreadw32/tests/priority1.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/priority1.c       2010-07-10 23:05:44 +0000
+@@ -91,7 +91,7 @@
+   assert(pthread_getschedparam(threadID, &policy, &param) == 0);
+   assert(policy == SCHED_OTHER);
+-  return (void *) (param.sched_priority);
++  return (void *) (size_t) (param.sched_priority);
+ }
+ void *
+@@ -164,8 +164,8 @@
+       assert(pthread_join(t, &result) == 0);
+-      assert(param.sched_priority == (int) result);
+-      printf("%10d %10d %10d\n", param.sched_priority, (int) result, prio);
++      assert(param.sched_priority == (int) (size_t) result);
++      printf("%10d %10d %10d\n", param.sched_priority, (int) (size_t) result, prio);
+     }
+   return 0;
+
+=== modified file 'tests/priority2.c'
+--- pthreadw32/tests/priority2.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/priority2.c       2010-07-10 23:05:44 +0000
+@@ -95,7 +95,7 @@
+   assert(policy == SCHED_OTHER);
+   result = pthread_barrier_wait(&endBarrier);
+   assert(result == 0 || result == PTHREAD_BARRIER_SERIAL_THREAD);
+-  return (void *) param.sched_priority;
++  return (void *) (size_t) param.sched_priority;
+ }
+@@ -162,7 +162,7 @@
+       assert(GetThreadPriority(pthread_getw32threadhandle_np(t)) ==
+         validPriorities[param.sched_priority+(PTW32TEST_MAXPRIORITIES/2)]);
+       pthread_join(t, &result);
+-      assert(param.sched_priority == (int)result);
++      assert(param.sched_priority == (int)(size_t)result);
+     }
+   return 0;
+
+=== modified file 'tests/rwlock2_t.c'
+--- pthreadw32/tests/rwlock2_t.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock2_t.c       2010-07-10 23:05:44 +0000
+@@ -55,7 +55,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/rwlock3_t.c'
+--- pthreadw32/tests/rwlock3_t.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock3_t.c       2010-07-10 23:05:44 +0000
+@@ -68,7 +68,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/rwlock4_t.c'
+--- pthreadw32/tests/rwlock4_t.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock4_t.c       2010-07-10 23:05:44 +0000
+@@ -68,7 +68,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/rwlock5_t.c'
+--- pthreadw32/tests/rwlock5_t.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock5_t.c       2010-07-10 23:05:44 +0000
+@@ -70,7 +70,7 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/rwlock6.c'
+--- pthreadw32/tests/rwlock6.c 2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock6.c 2010-07-10 23:05:44 +0000
+@@ -77,9 +77,9 @@
+   pthread_t wrt1;
+   pthread_t wrt2;
+   pthread_t rdt;
+-  int wr1Result = 0;
+-  int wr2Result = 0;
+-  int rdResult = 0;
++  DWORD_PTR wr1Result = 0;
++  DWORD_PTR wr2Result = 0;
++  DWORD_PTR rdResult = 0;
+   bankAccount = 0;
+
+=== modified file 'tests/rwlock6_t.c'
+--- pthreadw32/tests/rwlock6_t.c       2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock6_t.c       2010-07-10 23:05:44 +0000
+@@ -55,7 +55,7 @@
+   bankAccount += 10;
+   assert(pthread_rwlock_unlock(&rwlock1) == 0);
+-  return ((void *) bankAccount);
++  return ((void *) (size_t) bankAccount);
+ }
+ void * rdfunc(void * arg)
+@@ -67,17 +67,17 @@
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+-  if ((int) arg == 1)
++  if ((int) ((size_t) arg) == 1)
+     {
+       abstime.tv_sec += 1;
+       assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == ETIMEDOUT);
+       ba = 0;
+     }
+-  else if ((int) arg == 2)
++  else if ((int) ((size_t) arg) == 2)
+     {
+       abstime.tv_sec += 3;
+       assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == 0);
+@@ -85,7 +85,7 @@
+       assert(pthread_rwlock_unlock(&rwlock1) == 0);
+     }
+-  return ((void *) ba);
++  return ((void *) (size_t) ba);
+ }
+ int
+@@ -95,10 +95,10 @@
+   pthread_t wrt2;
+   pthread_t rdt1;
+   pthread_t rdt2;
+-  int wr1Result = 0;
+-  int wr2Result = 0;
+-  int rd1Result = 0;
+-  int rd2Result = 0;
++  DWORD_PTR wr1Result = 0;
++  DWORD_PTR wr2Result = 0;
++  DWORD_PTR rd1Result = 0;
++  DWORD_PTR rd2Result = 0;
+   bankAccount = 0;
+
+=== modified file 'tests/rwlock6_t2.c'
+--- pthreadw32/tests/rwlock6_t2.c      2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/rwlock6_t2.c      2010-07-10 23:05:44 +0000
+@@ -54,21 +54,21 @@
+   int result;
+   result = pthread_rwlock_timedwrlock(&rwlock1, &abstime);
+-  if ((int) arg == 1)
++  if ((int) ((size_t)arg) == 1)
+     {
+       assert(result == 0);
+       Sleep(2000);
+       bankAccount += 10;
+       assert(pthread_rwlock_unlock(&rwlock1) == 0);
+-      return ((void *) bankAccount);
++      return ((void *) (size_t) bankAccount);
+     }
+-  else if ((int) arg == 2)
++  else if ((int) ((size_t)arg) == 2)
+     {
+       assert(result == ETIMEDOUT);
+-      return ((void *) 100);
++      return ((void *) (size_t) 100);
+     }
+-  return ((void *) -1);
++  return ((void *) (size_t) -1);
+ }
+ void * rdfunc(void * arg)
+@@ -77,7 +77,7 @@
+   assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == ETIMEDOUT);
+-  return ((void *) ba);
++  return ((void *) (size_t) ba);
+ }
+ int
+@@ -86,15 +86,15 @@
+   pthread_t wrt1;
+   pthread_t wrt2;
+   pthread_t rdt;
+-  int wr1Result = 0;
+-  int wr2Result = 0;
+-  int rdResult = 0;
++  DWORD_PTR wr1Result = 0;
++  DWORD_PTR wr2Result = 0;
++  DWORD_PTR rdResult = 0;
+   struct _timeb currSysTime;
+   const DWORD NANOSEC_PER_MILLISEC = 1000000;
+   _ftime(&currSysTime);
+-  abstime.tv_sec = currSysTime.time;
++  abstime.tv_sec = (long)currSysTime.time;
+   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
+   abstime.tv_sec += 1;
+
+=== modified file 'tests/semaphore1.c'
+--- pthreadw32/tests/semaphore1.c      2005-05-08 16:52:50 +0000
++++ pthreadw32/tests/semaphore1.c      2010-07-10 23:05:44 +0000
+@@ -119,7 +119,7 @@
+ {
+   pthread_t t;
+   sem_t s;
+-  int result;
++  DWORD_PTR result;
+   assert(pthread_create(&t, NULL, thr, NULL) == 0);
+   assert(pthread_join(t, (void **)&result) == 0);
+
+=== modified file 'tests/semaphore4.c'
+--- pthreadw32/tests/semaphore4.c      2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/semaphore4.c      2010-07-10 23:05:44 +0000
+@@ -113,7 +113,7 @@
+ //printf("value = %d\n", -value); fflush(stdout);
+       assert(pthread_cancel(t[50]) == 0);
+         {
+-          int result;
++          DWORD_PTR result;
+           assert(pthread_join(t[50], (void **) &result) == 0);
+ //        printf("result = %d\n", result); fflush(stdout);
+         }
+
+=== modified file 'tests/spin3.c'
+--- pthreadw32/tests/spin3.c   2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/spin3.c   2010-07-10 23:05:44 +0000
+@@ -46,7 +46,7 @@
+  
+ void * unlocker(void * arg)
+ {
+-  int expectedResult = (int) arg;
++  int expectedResult = (int) (size_t) arg;
+   wasHere++;
+   assert(pthread_spin_unlock(&spin) == expectedResult);
+
+=== modified file 'tests/spin4.c'
+--- pthreadw32/tests/spin4.c   2005-01-01 14:36:17 +0000
++++ pthreadw32/tests/spin4.c   2010-07-10 23:05:44 +0000
+@@ -63,7 +63,7 @@
+ int
+ main()
+ {
+-  long result = 0;
++  DWORD_PTR result = 0;
+   pthread_t t;
+   int CPUs;
+   struct _timeb sysTime;
+
+=== modified file 'tests/stress1.c'
+--- pthreadw32/tests/stress1.c 2010-06-20 03:31:18 +0000
++++ pthreadw32/tests/stress1.c 2010-07-10 23:29:46 +0000
+@@ -141,9 +141,9 @@
+ void *
+ masterThread (void * arg)
+ {
+-  int dither = (int) arg;
++  int dither = (int) (size_t)arg;
+-  timeout = (int) arg;
++  timeout = (int) (size_t)arg;
+   pthread_barrier_wait(&startBarrier);
+@@ -239,7 +239,7 @@
+   assert(pthread_barrier_init(&readyBarrier, NULL, 3) == 0);
+   assert(pthread_barrier_init(&holdBarrier, NULL, 3) == 0);
+-  assert(pthread_create(&master, NULL, masterThread, (void *) timeout) == 0);
++  assert(pthread_create(&master, NULL, masterThread, (void *) (size_t)timeout) == 0);
+   assert(pthread_create(&slave, NULL, slaveThread, NULL) == 0);
+   allExit = FALSE;
+
+=== modified file 'tests/tsd1.c'
+--- pthreadw32/tests/tsd1.c    2005-05-08 16:52:50 +0000
++++ pthreadw32/tests/tsd1.c    2010-07-10 23:05:44 +0000
+@@ -179,7 +179,7 @@
+    */
+   for (i = 1; i < NUM_THREADS; i++)
+     {
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(thread[i], (void **) &result) == 0);
+     }
+
+=== modified file 'tests/tsd2.c'
+--- pthreadw32/tests/tsd2.c    2005-05-08 16:52:50 +0000
++++ pthreadw32/tests/tsd2.c    2010-07-10 23:05:44 +0000
+@@ -183,7 +183,7 @@
+    */
+   for (i = 1; i < NUM_THREADS; i++)
+     {
+-      int result = 0;
++      DWORD_PTR result = 0;
+       assert(pthread_join(thread[i], (void **) &result) == 0);
+     }
+
+=== modified file 'version.rc'
+--- pthreadw32/version.rc      2005-05-19 04:19:35 +0000
++++ pthreadw32/version.rc      2010-07-10 23:05:44 +0000
+@@ -102,7 +102,7 @@
+     BEGIN
+         BLOCK "040904b0"
+         BEGIN
+-            VALUE "FileDescription", "POSIX Threads for Windows32 Library\0"
++            VALUE "FileDescription", "POSIX Threads for Windows Library\0"
+             VALUE "ProductVersion", PTW32_VERSION_STRING
+             VALUE "FileVersion", PTW32_VERSION_STRING
+             VALUE "InternalName", PTW32_VERSIONINFO_NAME
+
index 0768da6..4977d97 100644 (file)
@@ -1,18 +1,20 @@
 $(eval $(call import.MODULE.defs,PTHREADW32,pthreadw32))
 $(eval $(call import.CONTRIB.defs,PTHREADW32))
 
-PTHREADW32.FETCH.url = http://download.m0k.org/handbrake/contrib/pthreads-w32-2-8-0-release.tar.gz
+PTHREADW32.FETCH.url = http://download.m0k.org/handbrake/contrib/pthreads-w32-cvs20100909.tar.bz2
 
 PTHREADW32.CONFIGURE = $(TOUCH.exe) $@
 
-PTHREADW32.BUILD.extra = CROSS=$(BUILD.cross.prefix) clean GC-static
+PTHREADW32.BUILD.extra = target=$(BUILD.cross.prefix) clean GC-static
 PTHREADW32.BUILD.ntargets = clean GC-static
 
 define PTHREADW32.INSTALL
     $(CP.exe) $(PTHREADW32.EXTRACT.dir/)libpthreadGC2.a $(CONTRIB.build/)lib/
     $(CP.exe) $(PTHREADW32.EXTRACT.dir/)pthread.h $(CONTRIB.build/)include/
+    $(CP.exe) $(PTHREADW32.EXTRACT.dir/)pthreads_win32_config.h $(CONTRIB.build/)include/
     $(CP.exe) $(PTHREADW32.EXTRACT.dir/)sched.h $(CONTRIB.build/)include/
     $(CP.exe) $(PTHREADW32.EXTRACT.dir/)semaphore.h $(CONTRIB.build/)include/
+    $(LN.exe) -sf ./libpthreadGC2.a $(CONTRIB.build/)lib/libpthread.a
     $(TOUCH.exe) $@
 endef
 
index fc7c56c..18986c6 100644 (file)
@@ -1,19 +1,18 @@
 $(eval $(call import.MODULE.defs,X264,x264,PTHREADW32))
 $(eval $(call import.CONTRIB.defs,X264))
 
-X264.FETCH.url = http://download.handbrake.fr/handbrake/contrib/x264-r1347-5ddd61b.tar.gz
+X264.FETCH.url = http://download.handbrake.fr/handbrake/contrib/x264-r1834-a51816a.tar.gz
 X264.EXTRACT.tarbase = x264
 
 X264.CONFIGURE.deps   =
 X264.CONFIGURE.shared =
 X264.CONFIGURE.static =
 
-X264.CONFIGURE.extra = --disable-mp4-output
+X264.CONFIGURE.extra = --disable-gpac
+X264.CONFIGURE.extra += --disable-avs --disable-lavf --disable-ffms --disable-swscale
 
 ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
-    X264.CONFIGURE.extra += --enable-pthread --cross-prefix=$(BUILD.spec)-
+    X264.CONFIGURE.extra += --cross-prefix=$(BUILD.spec)-
     X264.CONFIGURE.env.CFLAGS = CFLAGS="-I$(call fn.ABSOLUTE,$(CONTRIB.build/)include) $(call fn.ARGS,X264.GCC,*archs *sysroot *minver ?extra)"
     X264.CONFIGURE.env.LDFLAGS = LDFLAGS="-L$(call fn.ABSOLUTE,$(CONTRIB.build/)lib) $(call fn.ARGS,X264.GCC,*archs *sysroot *minver)"
-else
-    X264.CONFIGURE.extra += --enable-pthread
 endif
index 2e2f1f9..883d03e 100644 (file)
@@ -1,4 +1,4 @@
-Guide to Building HandBrake svn2688 (2009071301) on Linux
+Guide to Building HandBrake svn3555 (2010092801) on Linux
 *********************************************************
 
 Table of Contents
@@ -38,13 +38,21 @@ Linux; but is not necessarily the only configuration that is possible:
 
    * Intel 32-bit or 64-bit kernel
 
-   * Ubuntu 8.0.4, gcc 4.3.0, yasm 0.7.1.2093
+   * Ubuntu 8.04, gcc 4.3.0, yasm 0.7.1
 
-   * Ubuntu 8.10, gcc 4.3.2, yasm 0.7.1.2093
+   * Ubuntu 8.10, gcc 4.3.2, yasm 0.7.1
 
-   * Fedora 9, gcc 4.3.0, yasm 0.7.1.2093
+   * Ubuntu 9.04, gcc 4.3.3, yasm 0.7.1
 
-   * Fedora 10, gcc 4.3.2, yasm 0.7.1.2093
+   * Ubuntu 9.10, gcc 4.4.1, yasm 0.8.0
+
+   * Fedora 9, gcc 4.3.0, yasm 0.7.1
+
+   * Fedora 10, gcc 4.3.2, yasm 0.7.1
+
+   * Fedora 11, gcc 4.4.0, yasm 0.7.2
+
+   * Fedora 12, gcc 4.4.2, yasm 0.7.2
 
    * gcc 4.0.0 or higher is reported to work
 
@@ -78,7 +86,7 @@ The GTK UI introduces some significant extra build requirements. If you
 intend to disable building the GUI with `configure --disable-gtk' you
 will not need many of these packages installed:
 
-Ubuntu 8.10 packages:
+Ubuntu 9.10 - 10.04 packages:
    * subversion (cli/gui)
 
    * yasm (cli/gui)
@@ -101,9 +109,7 @@ Ubuntu 8.10 packages:
 
    * libgtk2.0-dev (gui)
 
-   * libhal-dev (gui)
-
-   * libhal-storage-dev (gui)
+   * libgudev-1.0-dev (gui)
 
    * libwebkit-dev (gui)
 
@@ -116,11 +122,11 @@ Ubuntu 8.10 packages:
 To install these packages:
      sudo apt-get install subversion yasm build-essential \
      autoconf libtool zlib1g-dev libbz2-dev intltool libglib2.0-dev \
-     libdbus-glib-1-dev libgtk2.0-dev libhal-dev libhal-storage-dev \
+     libdbus-glib-1-dev libgtk2.0-dev libgudev-1.0-dev \
      libwebkit-dev libnotify-dev libgstreamer0.10-dev \
      libgstreamer-plugins-base0.10-dev
 
-Fedora 10 package groups:
+Fedora 12 - 13 package groups:
    * Development Tools
 
    * Development Libraries
@@ -133,7 +139,7 @@ To install these package groups:
      sudo yum groupinstall "Development Tools" "Development Libraries" \
      "X Software Development" "GNOME Software Development"
 
-Additional Fedora 10 packages:
+Additional Fedora packages:
    * yasm (cli/gui)
 
    * zlib-devel (cli/gui)
@@ -142,7 +148,7 @@ Additional Fedora 10 packages:
 
    * dbus-glib-devel (gui)
 
-   * hal-devel (gui)
+   * libgudev1-devel (gui)
 
    * webkitgtk-devel (gui)
 
@@ -154,7 +160,7 @@ Additional Fedora 10 packages:
 
 To install these packages:
      sudo yum install yasm zlib-devel bzip2-devel \
-     dbus-glib-devel hal-devel webkitgtk-devel libnotify-devel\
+     dbus-glib-devel libgudev1-devel webkitgtk-devel libnotify-devel \
      gstreamer-devel gstreamer-plugins-base-devel
 
 3 QuickStart
@@ -542,7 +548,7 @@ Appendix A Project Repository Details
      root:   svn://svn.handbrake.fr/HandBrake
      branch: trunk
      uuid:   b64f7644-9d1e-0410-96f1-a4d463321fa5
-     rev:    2688
-     date:   2009-07-12 22:47:33 -0700
+     rev:    3555
+     date:   2010-09-26 09:13:48 -0700
      type:   developer
 
index 55a785e..5416aae 100644 (file)
@@ -1,4 +1,4 @@
-Build Guide for HandBrake svn2591 on Mac OS X
+Build Guide for HandBrake svn3349 on Mac OS X
 *********************************************
 
 Table of Contents
@@ -504,6 +504,13 @@ to build the default configuration:
 
    * click Build or Build and Go
 
+When using Build and Go, xcode launches the application under the gdb
+debugger.  gdb will encounter a trap when starting the program.  This
+trap is harmless and you should just 'continue'.  For the curious, the
+trap occurs because we add some values to the environment with setenv,
+then do a brain transplant with execv. Restarting the application with
+execv triggers the trap.
+
 The first build (on an empty `build' directory) will take a bit of
 time. You may use the Build Results window to observe progress. The
 most time-consuming part of the build is when the external build system
@@ -646,6 +653,10 @@ When troubleshooting build issues, the following files relative to the
      Environment (variables) dump as seen when Xcode forks `make'.
      Mac OS X only.
 
+A note about gdb: We perform an extra execv when starting the
+application.  This triggers a trap in gdb.  It is harmless.  You should
+just 'continue' from the trap.
+
 Appendix A Project Repository Details
 *************************************
 
@@ -653,7 +664,7 @@ Appendix A Project Repository Details
      root:   svn://svn.handbrake.fr/HandBrake
      branch: trunk
      uuid:   b64f7644-9d1e-0410-96f1-a4d463321fa5
-     rev:    2591
-     date:   2009-06-21 13:15:04 -0400
+     rev:    3349
+     date:   2010-06-02 09:49:18 -0700
      type:   developer
 
index cd11e1a..8ad0fd4 100644 (file)
@@ -19,10 +19,14 @@ The following are the recommended specifications for building on @value{OS.linux
 
 @itemize @bullet
 @item Intel 32-bit or 64-bit kernel
-@item Ubuntu 8.0.4, gcc 4.3.0, yasm 0.7.1.2093
-@item Ubuntu 8.10, gcc 4.3.2, yasm 0.7.1.2093
-@item Fedora 9, gcc 4.3.0, yasm 0.7.1.2093
-@item Fedora 10, gcc 4.3.2, yasm 0.7.1.2093
+@item Ubuntu 8.04, gcc 4.3.0, yasm 0.7.1
+@item Ubuntu 8.10, gcc 4.3.2, yasm 0.7.1
+@item Ubuntu 9.04, gcc 4.3.3, yasm 0.7.1
+@item Ubuntu 9.10, gcc 4.4.1, yasm 0.8.0
+@item Fedora 9, gcc 4.3.0, yasm 0.7.1
+@item Fedora 10, gcc 4.3.2, yasm 0.7.1
+@item Fedora 11, gcc 4.4.0, yasm 0.7.2
+@item Fedora 12, gcc 4.4.2, yasm 0.7.2
 @item gcc 4.0.0 or higher is reported to work
 @end itemize
 
@@ -32,7 +36,7 @@ The following are the recommended specifications for building on @value{OS.linux
 
 The @b{GTK UI} introduces some significant extra build requirements. If you intend to disable building the GUI with @command{configure --disable-gtk} you will not need many of these packages installed:
 
-Ubuntu 8.10 packages:
+Ubuntu 9.10 - 10.04 packages:
 @itemize @bullet
 @item subversion (cli/gui)
 @item yasm (cli/gui)
@@ -45,8 +49,7 @@ Ubuntu 8.10 packages:
 @item libglib2.0-dev (gui)
 @item libdbus-glib-1-dev (gui)
 @item libgtk2.0-dev (gui)
-@item libhal-dev (gui)
-@item libhal-storage-dev (gui)
+@item libgudev-1.0-dev (gui)
 @item libwebkit-dev (gui)
 @item libnotify-dev (gui)
 @item libgstreamer0.10-dev (gui)
@@ -57,12 +60,12 @@ To install these packages:
 @example
 sudo apt-get install subversion yasm build-essential \
 autoconf libtool zlib1g-dev libbz2-dev intltool libglib2.0-dev \
-libdbus-glib-1-dev libgtk2.0-dev libhal-dev libhal-storage-dev \
+libdbus-glib-1-dev libgtk2.0-dev libgudev-1.0-dev \
 libwebkit-dev libnotify-dev libgstreamer0.10-dev \
 libgstreamer-plugins-base0.10-dev
 @end example
 
-Fedora 10 package groups:
+Fedora 12 - 13 package groups:
 @itemize @bullet
 @item Development Tools
 @item Development Libraries
@@ -76,13 +79,13 @@ sudo yum groupinstall "Development Tools" "Development Libraries" \
 "X Software Development" "GNOME Software Development"
 @end example
 
-Additional Fedora 10 packages:
+Additional Fedora packages:
 @itemize @bullet
 @item yasm (cli/gui)
 @item zlib-devel (cli/gui)
 @item bzip2-devel (cli/gui)
 @item dbus-glib-devel (gui)
-@item hal-devel (gui)
+@item libgudev1-devel (gui)
 @item webkitgtk-devel (gui)
 @item libnotify-devel (gui)
 @item gstreamer-devel (gui)
@@ -92,11 +95,10 @@ Additional Fedora 10 packages:
 To install these packages:
 @example
 sudo yum install yasm zlib-devel bzip2-devel \
-dbus-glib-devel hal-devel webkitgtk-devel libnotify-devel\
+dbus-glib-devel libgudev1-devel webkitgtk-devel libnotify-devel \
 gstreamer-devel gstreamer-plugins-base-devel
 @end example
 
-
 @c %**-------------------------------------------------------------------------
 @include building/chapter.quickstart.texi
 
index ee3f826..6afa9b5 100644 (file)
@@ -68,4 +68,6 @@ UB.archs = i386 x86_64
 @c %**-------------------------------------------------------------------------
 @include building/chapter.via.xcode.texi
 @include building/chapter.troubleshooting.texi
+
+A note about gdb: We perform an extra execv when starting the application.  This triggers a trap in gdb.  It is harmless.  You should just 'continue' from the trap.
 @include building/appendix.repo.texi
index 2b79a7b..0b0c2b4 100644 (file)
@@ -23,6 +23,8 @@ Once the HandBrake Xcode project is open, perform the following steps to build t
 @item click @b{Build} or @b{Build and Go}
 @end itemize
 
+When using Build and Go, xcode launches the application under the gdb debugger.  gdb will encounter a trap when starting the program.  This trap is harmless and you should just 'continue'.  For the curious, the trap occurs because we add some values to the environment with setenv, then do a brain transplant with execv. Restarting the application with execv triggers the trap.
+
 The first build (on an empty @file{build} directory) will take a bit of time. You may use the Build Results window to observe progress. The most time-consuming part of the build is when the external build system (essentially the @b{terminal} method) is triggered by Xcode and a substantial amount of log transcript ensues. Much of that transcript are warnings and errors that are part of the normal build process for 3rd-party contributed modules so in general you need not do anything. However, if Xcode itself reports the build failed, then you must take corrective action.
 
 Unfortunately, due to limitations of Xcode we do not have hooks in place to offer finer-grained control over per-module make actions for the (external) build system. Thus, you will have to use @b{terminal} to accomplish those tasks. Just @command{cd} into the build directory which is associated with your active configuration and perform any necessary @command{make} commands. @b{Be careful not to issue commands from the terminal simultaneously with Xcode tasks} as that will confuse both Xcode and make and likely corrupt your build directory.
index 0a1b251..bda4d37 100644 (file)
@@ -13,6 +13,16 @@ AC_PROG_CXX
 AM_PROG_CC_STDC
 AC_HEADER_STDC
 
+if test x"$CC_FOR_BUILD" = x; then
+       if test x"$cross_compiling" = x"yes"; then
+               AC_CHECK_PROGS(CC_FOR_BUILD, gcc, cc)
+       else
+               CC_FOR_BUILD="$CC"
+       fi
+fi
+
+AC_SUBST(CC_FOR_BUILD)
+
 # introduce the optional configure parameter for the path of libXXX.a
 AC_ARG_WITH(hb,
        AC_HELP_STRING(
@@ -45,10 +55,18 @@ else
        AC_SUBST(HB_DIR, '$(top_srcdir)/'"..")
 fi
 
+AC_ARG_ENABLE(dl,
+       AS_HELP_STRING([--enable-dl], [enable libdl]),
+       use_libdl=yes, use_libdl=no)
+
 AC_ARG_ENABLE(gst,
        AS_HELP_STRING([--enable-gst], [enable gstreamer on Win32]),
        w32_gst=yes, w32_gst=no)
 
+AC_ARG_ENABLE(update-checks,
+       AS_HELP_STRING([--disable-update-checks], [disable update checks]),
+       update_checks=no, update_checks=yes)
+
 # overwrite global variable (used for Makefile generation)
 AC_SUBST(GLOBALCXXFLAGS, $CXXFLAGS )
 AC_SUBST(GLOBALLDFLAGS, $LDFLAGS )
@@ -76,7 +94,7 @@ case $host in
        mingw_flag=yes
     ;;
   *)
-       GHB_PACKAGES="gtk+-2.0 >= 2.10 gthread-2.0 gstreamer-0.10 gstreamer-interfaces-0.10 gstreamer-video-0.10 gstreamer-pbutils-0.10 gio-2.0 hal hal-storage libnotify"
+       GHB_PACKAGES="gtk+-2.0 >= 2.10 gthread-2.0 gstreamer-0.10 gstreamer-interfaces-0.10 gstreamer-video-0.10 gstreamer-pbutils-0.10 gio-2.0 libnotify gudev-1.0"
        mingw_flag=no
     ;;
 esac
@@ -86,23 +104,46 @@ if test "x$w32_gst" = "xyes" -o  "x$mingw_flag" != "xyes" ; then
        CFLAGS="$CFLAGS -D_ENABLE_GST"
 fi
 
-PKG_CHECK_MODULES(OldWebKitGtk, WebKitGtk, old_webkit=yes, old_webkit=no)
-if test "x$old_webkit" = "xyes" ; then
-       if test "x$mingw_flag" = "xno" ; then
-               GHB_PACKAGES="$GHB_PACKAGES WebKitGtk"
-               CXXFLAGS="$CXXFLAGS -D_OLD_WEBKIT"
-               CFLAGS="$CFLAGS -D_OLD_WEBKIT"
+PKG_PROG_PKG_CONFIG
+if test "x$update_checks" = "xyes" ; then
+       PKG_CHECK_MODULES(OldWebKitGtk, WebKitGtk, old_webkit=yes, old_webkit=no)
+       if test "x$old_webkit" = "xyes" ; then
+               if test "x$mingw_flag" = "xno" ; then
+                       GHB_PACKAGES="$GHB_PACKAGES WebKitGtk"
+                       CXXFLAGS="$CXXFLAGS -D_OLD_WEBKIT"
+                       CFLAGS="$CFLAGS -D_OLD_WEBKIT"
+               fi
+       else
+               if test "x$mingw_flag" = "xno" ; then
+                       GHB_PACKAGES="$GHB_PACKAGES webkit-1.0"
+               fi
        fi
 else
-       if test "x$mingw_flag" = "xno" ; then
-               GHB_PACKAGES="$GHB_PACKAGES webkit-1.0"
-       fi
+       CFLAGS="$CFLAGS -D_NO_UPDATE_CHECK"
 fi
 
 AM_CONDITIONAL([MINGW], [test "x$mingw_flag" = "xyes"])
 
 PKG_CHECK_MODULES(GHB, [$GHB_PACKAGES])
 
+AC_PATH_PROG(BUILD_PKG_CONFIG, pkg-config, no)
+if test x"$BUILD_PKG_CONFIG" = x"no"; then
+       AC_MSG_ERROR([You need to install pkg-config])
+fi
+
+GHB_TOOLS_CFLAGS=`$BUILD_PKG_CONFIG --cflags glib-2.0 gdk-pixbuf-2.0`
+GHB_TOOLS_LIBS=`$BUILD_PKG_CONFIG --libs glib-2.0 gdk-pixbuf-2.0`
+
+case $host in
+  *-*-mingw*)
+    if test "x$use_libdl" = "xyes" ; then
+               GHB_LIBS="$GHB_LIBS -ldl"
+       fi
+    ;;
+esac
+
+AC_SUBST(GHB_TOOLS_CFLAGS)
+AC_SUBST(GHB_TOOLS_LIBS)
 AC_SUBST(GHB_CFLAGS)
 AC_SUBST(GHB_LIBS)
 
index 5b83853..d217903 100644 (file)
@@ -1,5 +1,3 @@
-%define name HandBrake
-%define release 1
 
 Name:          %{name}
 Version:       %{version}
@@ -7,17 +5,19 @@ Release:      %{release}%{?dist}
 Summary:       A program to transcode DVDs and other sources to MPEG-4
 
 Group:         Applications/Multimedia
-License:       GPL
+License:       GPLv2
 URL:           http://handbrake.fr/
-Vendor:                The HandBrake Project
 Source0:       %{name}-%{version}.tar.bz2
 Prefix:                %{_prefix}
-BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-Requires:      glib2 >= 2.16, gtk2 >= 2.12, hal-libs, webkitgtk, gstreamer
-Requires:      gstreamer-plugins-base
+BuildRoot:     %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
+BuildRequires: glib2-devel, gtk2-devel, webkitgtk-devel
+BuildRequires: gstreamer-devel, gstreamer-plugins-base-devel, libgudev1-devel
+Requires:      gtk2, coreutils
+
+%define debug_package %{nil}
 
 %description
-HandBrake is an open-source, GPL-licensed, multiplatform, multithreaded 
+HandBrake is an open-source, GPL-licensed, multi-platform, multi-threaded 
 transcoder, available for MacOS X, Linux and Windows.
 
 %package gui
@@ -29,34 +29,31 @@ Summary:    A program to transcode DVDs and other sources to MPEG-4
 Group:         Applications/Multimedia
 
 %description gui
-HandBrake is an open-source, GPL-licensed, multiplatform, multithreaded 
+HandBrake is an open-source, GPL-licensed, multi-platform, multi-threaded 
 transcoder, available for MacOS X, Linux and Windows.
 
 %description cli
-HandBrake is an open-source, GPL-licensed, multiplatform, multithreaded 
+HandBrake is an open-source, GPL-licensed, multi-platform, multi-threaded 
 transcoder, available for MacOS X, Linux and Windows.
 
 %prep
-%setup -n %{name}-%{version} -D -T
-#%setup -q
-#cd %{_builddir}/%{name}-%{version}
+%setup -q
+cd %{_builddir}/%{name}-%{version}
 
 
 %build
-#./configure --prefix=%{_prefix}
-#make -C build
+./configure --debug=std --prefix=%{_prefix}
+make %{?_smp_mflags} -C build
 
 
 %install
-#rm -rf $RPM_BUILD_ROOT
-# I don't want to rebuild the world, so just install what I've prebuilt
-make -C $RPM_BUILD_ROOT/../.. DESTDIR=$RPM_BUILD_ROOT install
+make -C build DESTDIR=$RPM_BUILD_ROOT install-strip
 
 ## blow away stuff we don't want
 /bin/rm -f $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/icon-theme.cache
 
 %clean
-rm -rf $RPM_BUILD_ROOT
+rm -rf %{buildroot}
 
 %post gui
 touch --no-create %{_datadir}/icons/hicolor
@@ -73,7 +70,7 @@ fi
 %files gui
 %defattr(-,root,root,-)
 %doc NEWS AUTHORS CREDITS THANKS COPYING
-%{_datadir}/icons
+%{_datadir}/icons/hicolor
 %{_datadir}/applications
 %{_bindir}/ghb
 
@@ -83,7 +80,7 @@ fi
 %{_bindir}/HandBrakeCLI
 
 %changelog
-* Sat May 31 2008 John Stebbins <jstebbins@jetheaddev.com> 
-- Initial release
+* Sun Apr 11 2010 John Stebbins <jstebbins@jetheaddev.com> - svn
+- Snapshot release
 
 
index 8c1648d..cc20a18 100644 (file)
@@ -15,55 +15,13 @@ BUILD.out += $(GTK.out)
 ###############################################################################
 
 ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
-    GTK.GCC.D += PTW32_STATIC_LIB
+GTK.CONFIGURE.extra += --host=$(BUILD.spec) 
+ifeq ($(HAS.dlfcn),1)
+       GTK.CONFIGURE.extra += --enable-dl
+endif
 endif
 
+ifeq (0,$(FEATURE.gtk.update.checks))
+       GTK.CONFIGURE.extra += --disable-update-checks
+endif
 
-###############################################################################
-###############################################################################
-$(eval $(call import.MODULE.defs,HGTK,hgtk))
-$(eval $(call import.GCC,HGTK))
-
-HGTK.GCC.gcc = gcc
-HGTK.GCC.args.extra = $(shell pkg-config --cflags glib-2.0)
-HGTK.GCC.args.extra += $(shell pkg-config --cflags gdk-pixbuf-2.0)
-HGTK.GCC.args.extra += $(shell pkg-config --libs glib-2.0)
-HGTK.GCC.args.extra += $(shell pkg-config --libs gdk-pixbuf-2.0)
-
-HGTK.src/ = $(SRC/)gtk/src/
-HGTK.build/ = $(BUILD/)gtk/src/
-
-HGTKCOMMON.c = \
-       $(HGTK.src/)plist.c \
-       $(HGTK.src/)values.c
-
-HGTKCOMMON.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%-native.o,$(HGTKCOMMON.c))
-
-CREATE_RES.c = \
-       $(HGTK.src/)create_resources.c \
-       $(HGTK.src/)icon_tools.c
-
-CREATE_RES.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%-native.o,$(CREATE_RES.c))
-CREATE_RES.exe = $(HGTK.build/)create_resources
-
-WIDGETDEPS.c = \
-       $(HGTK.src/)widgetdeps.c
-
-WIDGETDEPS.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%-native.o,$(WIDGETDEPS.c))
-WIDGETDEPS.exe = $(HGTK.build/)widgetdeps
-
-QUOTESTRING.c = \
-       $(HGTK.src/)quotestring.c
-
-QUOTESTRING.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%-native.o,$(QUOTESTRING.c))
-QUOTESTRING.exe = $(HGTK.build/)quotestring
-
-HGTK.out += $(HGTKCOMMON.c.o)
-HGTK.out += $(CREATE_RES.exe)
-HGTK.out += $(CREATE_RES.c.o)
-HGTK.out += $(WIDGETDEPS.exe)
-HGTK.out += $(WIDGETDEPS.c.o)
-HGTK.out += $(QUOTESTRING.exe)
-HGTK.out += $(QUOTESTRING.c.o)
-
-BUILD.out += $(HGTK.out)
index 657a203..a1c1eb7 100644 (file)
@@ -1,10 +1,11 @@
 $(eval $(call import.MODULE.rules,GTK))
 
-build: hgtk.build gtk.build
+build: gtk.build
 install: gtk.install
+install-strip: gtk.install-strip
 uninstall: gtk.uninstall
-clean: hgtk.clean gtk.clean
-xclean: hgtk.clean gtk.xclean
+clean: gtk.clean
+xclean: gtk.xclean
 
 gtk.configure: $(GTK.CONFIGURE.stamp)
 
@@ -12,31 +13,25 @@ $(GTK.CONFIGURE.stamp): | $(dir $(GTK.CONFIGURE.stamp))
 $(GTK.CONFIGURE.stamp): $(GTK.src/)Makefile.am
 $(GTK.CONFIGURE.stamp): $(GTK.src/)configure.ac $(GTK.src/)src/Makefile.am
        set -e; cd $(GTK.src/); NOCONFIGURE=1 ./autogen.sh
-ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
        set -e; cd $(GTK.build/); $(call fn.ABSOLUTE,$(GTK.src/))configure \
-               --host=$(BUILD.spec) \
+               $(GTK.CONFIGURE.extra) \
                PKG_CONFIG_PATH=$(BUILD/)contrib/lib/pkgconfig \
            CFLAGS="$(call fn.ARGS,GTK.GCC,.g .O *D ?extra)" \
            LDFLAGS="$(call fn.ARGS,GTK.GCC,?strip .g .O) " \
            --prefix=$(PREFIX) \
            --with-hb=$(call fn.ABSOLUTE,$(BUILD/))
-else
-       set -e; cd $(GTK.build/); $(call fn.ABSOLUTE,$(GTK.src/))configure \
-               PKG_CONFIG_PATH=$(BUILD/)contrib/lib/pkgconfig \
-           CFLAGS="$(call fn.ARGS,GTK.GCC,.g .O ?extra)" \
-           LDFLAGS="$(call fn.ARGS,GTK.GCC,?strip .g .O)" \
-           --prefix=$(PREFIX) \
-           --with-hb=$(call fn.ABSOLUTE,$(BUILD/))
-endif
        $(TOUCH.exe) $@
 
 gtk.build: | $(GTK.build/)
 gtk.build: $(GTK.CONFIGURE.stamp) $(LIBHB.a)
        +$(MAKE) -C $(GTK.build/)
 
-gtk.install:
+gtk.install-strip:
        $(MAKE) -C $(GTK.build/) prefix=$(PREFIX) install-strip
 
+gtk.install:
+       $(MAKE) -C $(GTK.build/) prefix=$(PREFIX) install
+
 gtk.uninstall:
        $(MAKE) -C $(GTK.build/) uninstall
 
@@ -48,39 +43,3 @@ gtk.xclean:
        $(RM.exe) -f $(GTK.out)
        $(RM.exe) -fr $(GTK.build/)
 
-###############################################################################
-###############################################################################
-$(eval $(call import.MODULE.rules,HGTK))
-
-hgtk.build: $(CREATE_RES.exe) $(WIDGETDEPS.exe) $(QUOTESTRING.exe)
-
-$(CREATE_RES.exe): | $(dir $(CREATE_RES.exe))
-$(CREATE_RES.exe): $(CREATE_RES.c.o) $(HGTKCOMMON.c.o)
-       $(call HGTK.GCC.EXE,$@,$^)
-
-$(HGTKCOMMON.c.o): | $(dir $(HGTKCOMMON.c.o))
-$(HGTKCOMMON.c.o): $(BUILD/)%-native.o: $(SRC/)%.c
-       $(call HGTK.GCC.C_O,$@,$<)
-
-$(CREATE_RES.c.o): | $(dir $(CREATE_RES.c.o))
-$(CREATE_RES.c.o): $(BUILD/)%-native.o: $(SRC/)%.c
-       $(call HGTK.GCC.C_O,$@,$<)
-
-$(WIDGETDEPS.exe): | $(dir $(WIDGETDEPS.exe))
-$(WIDGETDEPS.exe): $(WIDGETDEPS.c.o) $(HGTKCOMMON.c.o)
-       $(call HGTK.GCC.EXE,$@,$^)
-
-$(WIDGETDEPS.c.o): | $(dir $(WIDGETDEPS.c.o))
-$(WIDGETDEPS.c.o): $(BUILD/)%-native.o: $(SRC/)%.c
-       $(call HGTK.GCC.C_O,$@,$<)
-
-$(QUOTESTRING.c.o): | $(dir $(QUOTESTRING.c.o))
-$(QUOTESTRING.c.o): $(BUILD/)%-native.o: $(SRC/)%.c
-       $(call HGTK.GCC.C_O,$@,$<)
-
-$(QUOTESTRING.exe): | $(dir $(QUOTESTRING.exe))
-$(QUOTESTRING.exe): $(QUOTESTRING.c.o)
-       $(call HGTK.GCC.EXE,$@,$^)
-
-hgtk.clean:
-       $(RM.exe) -f $(HGTK.out)
index 52be4d1..b901baf 100644 (file)
@@ -2,16 +2,16 @@
 
 if MINGW
 HB_LIBS= \
-       -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -ldca -ldvdnav -ldvdread \
+       -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -lavcore -ldca -ldvdnav -ldvdread \
        -lfaac -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate \
        -lx264 -lmp4v2 -lswscale -ltheora -lfaad -lz \
-       -lbz2 -liberty -lpthreadGC2
+       -lbz2 -liberty -lpthreadGC2 -lbluray -lass -lfontconfig -lfreetype
 else
 HB_LIBS= \
-       -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -ldca -ldvdnav -ldvdread \
+       -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -lavcore -ldca -ldvdnav -ldvdread \
        -lfaac -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate \
        -lx264 -lmp4v2 -lswscale -ltheora -lfaad -lz \
-       -lbz2 -lpthread
+       -lbz2 -lpthread -lbluray -lass -lfontconfig -lfreetype
 endif
 
 icons =        \
@@ -117,16 +117,29 @@ ghb_DEPENDENCIES = $(HB_DIR)/libhb/libhb.a
 
 resources.o: resource_data.h
 
-resource_data.h: quotestring resources.plist
-       ./quotestring resources.plist resource_data.h
+resource_data.h: resources.plist
+       python $(srcdir)/quotestring.py resources.plist resource_data.h
 
-widget_reverse.deps: widgetdeps
-widget.deps: widgetdeps
-       ./widgetdeps
+widget_reverse.deps: makedeps.py
+widget.deps: makedeps.py
+       python $(srcdir)/makedeps.py
 
 resources.plist: create_resources resources.list $(icons_dep) internal_defaults.xml standard_presets.xml ghb.ui widget.deps widget_reverse.deps
        ./create_resources -I$(srcdir) $(srcdir)/resources.list resources.plist
 
+CREATE_RES.c = \
+       create_resources.c \
+       plist.c \
+       values.c 
+
+CREATE_RES.c.o = $(patsubst %.c,%-native.o,$(CREATE_RES.c))
+
+create_resources: $(CREATE_RES.c.o)
+       $(CC_FOR_BUILD) -o $@ $^ $(GHB_TOOLS_LIBS)
+$(CREATE_RES.c.o): %-native.o: %.c
+       $(CC_FOR_BUILD) $(GHB_TOOLS_CFLAGS) -c -o $@ $<
+
 ghbcellrenderertext.$(OBJEXT): marshalers.h
 
 $(srcdir)/marshalers.h: marshalers.list
index 6e6f564..0658e9d 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * appcast.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * appcast.c is free software.
  * 
index fbe5e90..c52b2cd 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * audiohandler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * audiohandler.c is free software.
  * 
 #include "preview.h"
 #include "audiohandler.h"
 
+static void ghb_add_audio(signal_user_data_t *ud, GValue *settings);
+static GValue* get_selected_asettings(signal_user_data_t *ud);
+
+static gboolean block_updates = FALSE;
+
 void
 ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
 {
-       gint titleindex, audioindex, acodec, mix;
-       ghb_audio_info_t ainfo;
+       gint titleindex, track, acodec, select_acodec, mix;
+       hb_audio_config_t *aconfig;
        GtkWidget *widget;
        GValue *gval;
+       int mux;
+       gint bitrate;
+       gint sr = 48000;
        
        g_debug("ghb_adjust_audio_rate_combos ()");
+       mux = ghb_settings_combo_int(ud->settings, "FileFormat");
        titleindex = ghb_settings_combo_int(ud->settings, "title");
 
        widget = GHB_WIDGET(ud->builder, "AudioTrack");
        gval = ghb_widget_value(widget);
-       audioindex = ghb_lookup_combo_int("AudioTrack", gval);
+       track = ghb_lookup_combo_int("AudioTrack", gval);
        ghb_value_free(gval);
 
        widget = GHB_WIDGET(ud->builder, "AudioEncoder");
@@ -45,57 +54,95 @@ ghb_adjust_audio_rate_combos(signal_user_data_t *ud)
        mix = ghb_lookup_combo_int("AudioMixdown", gval);
        ghb_value_free(gval);
 
-       if (ghb_audio_is_passthru (acodec))
+       widget = GHB_WIDGET(ud->builder, "AudioBitrate");
+       gval = ghb_widget_value(widget);
+       bitrate = ghb_lookup_combo_int("AudioBitrate", gval);
+
+       widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
+       gval = ghb_widget_value(widget);
+       sr = ghb_lookup_combo_int("AudioSamplerate", gval);
+
+       select_acodec = acodec;
+       if (mux == HB_MUX_MP4)
+       {
+               select_acodec &= ~HB_ACODEC_DCA;
+       }
+       if ((select_acodec & HB_ACODEC_MASK) == 0)
        {
-               ghb_set_default_bitrate_opts (ud->builder, 0, -1);
-               if (ghb_get_audio_info (&ainfo, titleindex, audioindex))
+               // Unsuported codec in this container.
+               select_acodec |= HB_ACODEC_AC3;
+               acodec = select_acodec;
+       }
+
+       aconfig = ghb_get_scan_audio_info(titleindex, track);
+       if (sr == 0)
+       {
+               sr = aconfig ? aconfig->in.samplerate : 48000;
+       }
+       gboolean codec_defined_bitrate = FALSE;
+       if (ghb_audio_is_passthru (select_acodec))
+       {
+               if (aconfig)
                {
-                       gint br = ainfo.bitrate / 1000;
+                       bitrate = aconfig->in.bitrate / 1000;
+
                        // Set the values for bitrate and samplerate to the input rates
-                       if (br >= 8)
-                               ghb_set_passthru_bitrate_opts (ud->builder, br);
+                       if (aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK)
+                       {
+                               ghb_set_passthru_bitrate_opts (ud->builder, bitrate);
+                               ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
+                               codec_defined_bitrate = TRUE;
+                       }
                        else
-                               br = 160;
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
+                       {
+                               select_acodec = ghb_select_audio_codec(ud->settings, aconfig, acodec);
+                               if (acodec != HB_ACODEC_ANY)
+                               {
+                                       ghb_ui_update(ud, "AudioEncoder", ghb_int64_value(select_acodec));
+                               }
+
+                               mix = ghb_get_best_mix( aconfig, select_acodec, mix);
+                               bitrate = hb_get_default_audio_bitrate(select_acodec, sr, mix);
+                               ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix));
+                       }
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
-                       ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
                }
                else
                {
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(384));
                        ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(0));
                        ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(0));
+                       bitrate = 448;
+                       mix = ghb_get_best_mix( aconfig, select_acodec, 0);
                }
                ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(0));
        }
-       else if (acodec == HB_ACODEC_FAAC)
+       else
        {
-               gint br, last = 160, first = 0;
-
-               if (mix == HB_AMIXDOWN_6CH)
-               {
-                       first = 192;
-                       last = 448;
-               }
-
-               widget = GHB_WIDGET(ud->builder, "AudioBitrate");
-               gval = ghb_widget_value(widget);
-               br = ghb_lookup_combo_int("AudioBitrate", gval);
-               ghb_value_free(gval);
-               if (br > last)
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(last));
-               if (br < first)
-                       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(first));
-               ghb_set_default_bitrate_opts (ud->builder, first, last);
+               bitrate = hb_get_best_audio_bitrate(select_acodec, bitrate, sr, mix);
        }
-       else
+       if (!codec_defined_bitrate)
+       {
+               int low, high;
+               hb_get_audio_bitrate_limits(select_acodec, sr, mix, &low, &high);
+               ghb_set_default_bitrate_opts (ud->builder, low, high);
+       }
+       ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(bitrate));
+
+       ghb_settings_take_value(ud->settings, "AudioEncoderActual", 
+                                                       ghb_lookup_acodec_value(select_acodec));
+       GValue *asettings = get_selected_asettings(ud);
+       if (asettings)
        {
-               ghb_set_default_bitrate_opts (ud->builder, 0, -1);
+               ghb_settings_take_value(asettings, "AudioEncoderActual", 
+                                                       ghb_lookup_acodec_value(select_acodec));
        }
+       ghb_audio_list_refresh_selected(ud);
+       ghb_check_dependency(ud, NULL, "AudioEncoderActual");
 }
 
-void
-free_audio_index_list(gpointer data)
+static void
+free_audio_hash_key_value(gpointer data)
 {
        g_free(data);
 }
@@ -118,23 +165,33 @@ ghb_get_user_audio_lang(signal_user_data_t *ud, gint titleindex, gint track)
 void
 ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
 {
-       gint acodec_code, mix_code, track;
+       gint fallback_acodec, track;
        gchar *source_lang = NULL;
-       GtkWidget *button;
-       ghb_audio_info_t ainfo;
+       hb_audio_config_t *aconfig;
        GHashTable *track_indices;
+       gint mux;
 
        const GValue *pref_audio;
-       const GValue *audio, *acodec, *bitrate, *rate, *mix, *drc;
+       const GValue *audio, *drc;
+       gint acodec, bitrate, mix;
+       gdouble rate;
        gint count, ii, list_count;
        
        g_debug("set_pref_audio");
+       mux = ghb_settings_combo_int(ud->settings, "FileFormat");
+       if (mux == HB_MUX_MP4)
+       {
+               fallback_acodec = HB_ACODEC_FAAC;
+       }
+       else
+       {
+               fallback_acodec = HB_ACODEC_LAME;
+       }
        track_indices = g_hash_table_new_full(g_int_hash, g_int_equal, 
-                                                                                       NULL, free_audio_index_list);
+                                               free_audio_hash_key_value, free_audio_hash_key_value);
        // Clear the audio list
        ghb_clear_audio_list(ud);
        // Find "best" audio based on audio preferences
-       button = GHB_WIDGET (ud->builder, "audio_add");
        if (!ghb_settings_get_boolean(ud->settings, "AudioDUB"))
        {
                source_lang = ghb_get_source_audio_lang(titleindex, 0);
@@ -148,63 +205,97 @@ ghb_set_pref_audio(gint titleindex, signal_user_data_t *ud)
        count = ghb_array_len(pref_audio);
        for (ii = 0; ii < count; ii++)
        {
+               int select_acodec;
+
                audio = ghb_array_get_nth(pref_audio, ii);
-               acodec = ghb_settings_get_value(audio, "AudioEncoder");
-               bitrate = ghb_settings_get_value(audio, "AudioBitrate");
-               rate = ghb_settings_get_value(audio, "AudioSamplerate");
-               mix = ghb_settings_get_value(audio, "AudioMixdown");
+               select_acodec = acodec = ghb_settings_combo_int(audio, "AudioEncoder");
+               if (mux == HB_MUX_MP4)
+               {
+                       select_acodec &= ~HB_ACODEC_DCA;
+               }
+               if ((select_acodec & HB_ACODEC_MASK) == 0)
+               {
+                       // Unsuported codec in this container.
+                       select_acodec |= HB_ACODEC_AC3;
+                       acodec = select_acodec;
+               }
+               if ( ghb_audio_can_passthru( select_acodec ) )
+               {
+                       fallback_acodec = HB_ACODEC_AC3;
+               }
+               bitrate = ghb_settings_combo_int(audio, "AudioBitrate");
+               rate = ghb_settings_combo_double(audio, "AudioSamplerate");
+               mix = ghb_settings_combo_int(audio, "AudioMixdown");
                drc = ghb_settings_get_value(audio, "AudioTrackDRCSlider");
-               acodec_code = ghb_lookup_combo_int("AudioEncoder", acodec);
                // If there are multiple audios using the same codec, then
                // select sequential tracks for each.  The hash keeps track 
                // of the tracks used for each codec.
                track = ghb_find_audio_track(titleindex, source_lang, 
-                                                                       acodec_code, track_indices);
+                                                               select_acodec, fallback_acodec, track_indices);
                // Check to see if:
-               // 1. pref codec is ac3
-               // 2. source codec is not ac3
+               // 1. pref codec is passthru
+               // 2. source codec is not passthru
                // 3. next pref is enabled
-               if (ghb_get_audio_info (&ainfo, titleindex, track) && 
-                       ghb_audio_is_passthru (acodec_code))
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
+               if (aconfig && ghb_audio_is_passthru (acodec))
                {
-                       // HB_ACODEC_* are bit fields.  Treat acodec_code as mask
-                       if (!(ainfo.codec & acodec_code))
+                       // HB_ACODEC_* are bit fields.  Treat acodec as mask
+                       if (!(aconfig->in.codec & select_acodec & HB_ACODEC_PASS_MASK))
                        {
-                               acodec_code = ghb_get_default_acodec();
+                               if (acodec != HB_ACODEC_ANY)
+                                       acodec = fallback_acodec;
+                               // If we can't substitute the passthru with a suitable
+                               // encoder and
                                // If there's more audio to process, or we've already
                                // placed one in the list, then we can skip this one
-                               if ((ii + 1 < count) || (list_count != 0))
+                               if (!(select_acodec & fallback_acodec) && 
+                                       ((ii + 1 < count) || (list_count != 0)))
                                {
                                        // Skip this audio
-                                       acodec_code = 0;
+                                       acodec = 0;
+                               }
+                               else
+                               {
+                                       int channels, min_rate, max_rate;
+                                       select_acodec = fallback_acodec;
+                                       mix = ghb_get_best_mix(aconfig, select_acodec, mix);
+                                       channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mix);
+                                       bitrate = aconfig->in.bitrate / 1000;
+                                       min_rate = channels * 64;
+                                       max_rate = channels * 160;
+                                       if (bitrate < min_rate)
+                                               bitrate = min_rate;
+                                       if (bitrate > max_rate)
+                                               bitrate = max_rate;
+                                       rate = 0;
                                }
                        }
                        else
                        {
-                               acodec_code &= ainfo.codec;
+                               select_acodec &= aconfig->in.codec | HB_ACODEC_PASS_FLAG;
                        }
                }
                if (titleindex >= 0 && track < 0)
-                       acodec_code = 0;
-               if (acodec_code != 0)
+                       acodec = 0;
+               if (acodec != 0)
                {
-                       // Add to audio list
-                       g_signal_emit_by_name(button, "clicked", ud);
-                       list_count++;
-                       ghb_ui_update(ud, "AudioTrack", ghb_int64_value(track));
-                       ghb_ui_update(ud, "AudioEncoder", acodec);
-                       if (!ghb_audio_is_passthru (acodec_code))
-                       {
-                               // This gets set autimatically if the codec is passthru
-                               ghb_ui_update(ud, "AudioBitrate", bitrate);
-                               ghb_ui_update(ud, "AudioSamplerate", rate);
-                               mix_code = ghb_lookup_combo_int("AudioMixdown", mix);
-                               mix_code = ghb_get_best_mix(
-                                       titleindex, track, acodec_code, mix_code);
-                               ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
-                       }
+                       GValue *settings = ghb_dict_value_new();
+                       ghb_settings_set_int(settings, "AudioTrack", track);
+                       ghb_settings_set_string(settings, "AudioEncoder", 
+                               ghb_lookup_combo_string("AudioEncoder", ghb_int_value(acodec)));
+                       ghb_settings_set_value(settings, "AudioEncoderActual", 
+                                                                       ghb_lookup_acodec_value(select_acodec));
+                       // This gets set autimatically if the codec is passthru
+                       ghb_settings_set_string(settings, "AudioBitrate",
+                               ghb_lookup_combo_string("AudioBitrate", ghb_int_value(bitrate)));
+                       ghb_settings_set_string(settings, "AudioSamplerate",
+                               ghb_lookup_combo_string("AudioSamplerate", ghb_int_value(rate)));
+                       mix = ghb_get_best_mix( aconfig, select_acodec, mix);
+                       ghb_settings_set_string(settings, "AudioMixdown",
+                               ghb_lookup_combo_string("AudioMixdown", ghb_int_value(mix)));
+                       ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
+                       ghb_add_audio(ud, settings);
                        ghb_adjust_audio_rate_combos(ud);
-                       ghb_ui_update(ud, "AudioTrackDRCSlider", drc);
                }
        }
        g_free(source_lang);
@@ -263,8 +354,8 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
        if (gtk_tree_selection_get_selected(selection, &store, &iter))
        {
                const gchar *track, *codec, *br, *sr, *mix;
-               gchar *s_drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix;
-               gint itrack, icodec;
+               gchar *s_drc;
+               gint itrack;
                gdouble drc;
                // Get the row number
                treepath = gtk_tree_model_get_path (store, &iter);
@@ -280,26 +371,17 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
 
                track = ghb_settings_combo_option(asettings, "AudioTrack");
                itrack = ghb_settings_combo_int(asettings, "AudioTrack");
-               codec = ghb_settings_combo_option(asettings, "AudioEncoder");
-               icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+               codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
                br = ghb_settings_combo_option(asettings, "AudioBitrate");
                sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
                mix = ghb_settings_combo_option(asettings, "AudioMixdown");
 
-               s_track = ghb_settings_get_string(asettings, "AudioTrack");
-               s_codec = ghb_settings_get_string(asettings, "AudioEncoder");
-               s_br = ghb_settings_get_string(asettings, "AudioBitrate");
-               s_sr = ghb_settings_get_string(asettings, "AudioSamplerate");
-               s_mix = ghb_settings_get_string(asettings, "AudioMixdown");
                drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
                if (drc < 1.0)
                        s_drc = g_strdup("Off");
                else
                        s_drc = g_strdup_printf("%.1f", drc);
 
-               if (icodec == HB_ACODEC_MASK)
-                       codec = ghb_select_audio_codec_str(ud, itrack);
-
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
                        0, track,
@@ -308,20 +390,8 @@ ghb_audio_list_refresh_selected(signal_user_data_t *ud)
                        3, sr,
                        4, mix,
                        5, s_drc,
-                       // These are used to set combo values when a list item is selected
-                       6, s_track,
-                       7, s_codec,
-                       8, s_br,
-                       9, s_sr,
-                       10, s_mix,
-                       11, drc,
                        -1);
                g_free(s_drc);
-               g_free(s_track);
-               g_free(s_codec);
-               g_free(s_br);
-               g_free(s_sr);
-               g_free(s_mix);
        }
 }
 
@@ -329,13 +399,24 @@ G_MODULE_EXPORT void
 audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        static gint prev_acodec = 0;
-       gint acodec_code, mix_code;
+       gint acodec_code;
        GValue *asettings, *gval;
        
        g_debug("audio_codec_changed_cb ()");
        gval = ghb_widget_value(widget);
        acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
+       if (block_updates)
+       {
+               prev_acodec = acodec_code;
+               ghb_grey_combo_options (ud->builder);
+               return;
+       }
+
+       gval = ghb_widget_value(widget);
+       acodec_code = ghb_lookup_combo_int("AudioEncoder", gval);
        ghb_value_free(gval);
+
+       asettings = get_selected_asettings(ud);
        if (ghb_audio_is_passthru (prev_acodec) && 
                !ghb_audio_is_passthru (acodec_code))
        {
@@ -343,24 +424,49 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                // pref settings
                gint titleindex;
                gint track;
+               gint br, sr, mix_code;
+
+               if (asettings != NULL)
+               {
+                       br = ghb_settings_get_int(asettings, "AudioBitrate");
+                       sr = ghb_settings_combo_int(asettings, "AudioSamplerate");
+                       mix_code = ghb_settings_combo_int(asettings, "AudioMixdown");
+               }
+               else
+               {
+                       br = 160;
+                       sr = 0;
+                       mix_code = 0;
+               }
 
                titleindex = ghb_settings_combo_int(ud->settings, "title");
                track = ghb_settings_combo_int(ud->settings, "AudioTrack");
+               if (sr)
+               {
+                       sr = ghb_find_closest_audio_rate(sr);
+               }
+               ghb_ui_update(ud, "AudioSamplerate", ghb_int64_value(sr));
+
+               hb_audio_config_t *aconfig;
+               aconfig = ghb_get_scan_audio_info(titleindex, track);
+               if (sr == 0)
+               {
+                       sr = aconfig ? aconfig->in.samplerate : 48000;
+               }
+               mix_code = ghb_get_best_mix( aconfig, acodec_code, mix_code);
+               br = hb_get_best_audio_bitrate(acodec_code, br, sr, mix_code);
+               ghb_ui_update(ud, "AudioBitrate", ghb_int64_value(br));
 
-               ghb_ui_update(ud, "AudioBitrate", ghb_string_value("160"));
-               ghb_ui_update(ud, "AudioSamplerate", ghb_string_value("source"));
-               mix_code = ghb_lookup_combo_int("AudioMixdown", ghb_string_value("dpl2"));
-               mix_code = ghb_get_best_mix( titleindex, track, acodec_code, mix_code);
                ghb_ui_update(ud, "AudioMixdown", ghb_int64_value(mix_code));
        }
        ghb_adjust_audio_rate_combos(ud);
        ghb_grey_combo_options (ud->builder);
        ghb_check_dependency(ud, widget, NULL);
        prev_acodec = acodec_code;
-       asettings = get_selected_asettings(ud);
        if (asettings != NULL)
        {
                ghb_widget_to_setting(asettings, widget);
+               ghb_settings_set_value(asettings, "AudioEncoderActual", ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
                ghb_audio_list_refresh_selected(ud);
        }
        ghb_update_destination_extension(ud);
@@ -373,6 +479,8 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_track_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        ghb_grey_combo_options(ud->builder);
@@ -395,6 +503,8 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_mix_changed_cb ()");
+       if (block_updates) return;
+
        ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
@@ -412,6 +522,9 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        GValue *asettings;
 
        g_debug("audio_widget_changed_cb ()");
+       if (block_updates) return;
+
+       ghb_adjust_audio_rate_combos(ud);
        ghb_check_dependency(ud, widget, NULL);
        asettings = get_selected_asettings(ud);
        if (asettings != NULL)
@@ -430,6 +543,7 @@ drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
        gchar *drc;
 
        g_debug("drc_widget_changed_cb ()");
+       if (block_updates) return;
 
        label = GTK_LABEL(GHB_WIDGET(ud->builder, "drc_label"));
        if (val < 1.0)
@@ -448,20 +562,6 @@ drc_widget_changed_cb(GtkWidget *widget, gdouble val, signal_user_data_t *ud)
        ghb_live_reset(ud);
 }
 
-// subtitles differ from other settings in that
-// the selection is updated automaitcally when the title
-// changes.  I don't want the preset selection changed as
-// would happen for regular settings.
-G_MODULE_EXPORT void
-subtitle_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
-{
-       const gchar *name = gtk_widget_get_name(widget);
-       g_debug("subtitle_changed_cb () %s", name);
-       ghb_widget_to_setting(ud->settings, widget);
-       ghb_check_dependency(ud, widget, NULL);
-       ghb_live_reset(ud);
-}
-
 void
 ghb_clear_audio_list(signal_user_data_t *ud)
 {
@@ -491,8 +591,8 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
        GtkListStore *store;
        GtkTreeSelection *selection;
        const gchar *track, *codec, *br, *sr, *mix;
-       gchar *s_drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix;
-       gint icodec, itrack;
+       gchar *s_drc;
+       gint itrack;
        gdouble drc;
        
        g_debug("add_to_audio_list ()");
@@ -502,28 +602,17 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
 
        track = ghb_settings_combo_option(settings, "AudioTrack");
        itrack = ghb_settings_combo_int(settings, "AudioTrack");
-       codec = ghb_settings_combo_option(settings, "AudioEncoder");
-       icodec = ghb_settings_combo_int(settings, "AudioEncoder");
+       codec = ghb_settings_combo_option(settings, "AudioEncoderActual");
        br = ghb_settings_combo_option(settings, "AudioBitrate");
        sr = ghb_settings_combo_option(settings, "AudioSamplerate");
        mix = ghb_settings_combo_option(settings, "AudioMixdown");
 
-       s_track = ghb_settings_get_string(settings, "AudioTrack");
-       s_codec = ghb_settings_get_string(settings, "AudioEncoder");
-       s_br = ghb_settings_get_string(settings, "AudioBitrate");
-       s_sr = ghb_settings_get_string(settings, "AudioSamplerate");
-       s_mix = ghb_settings_get_string(settings, "AudioMixdown");
        drc = ghb_settings_get_double(settings, "AudioTrackDRCSlider");
        if (drc < 1.0)
                s_drc = g_strdup("Off");
        else
                s_drc = g_strdup_printf("%.1f", drc);
 
-       if (icodec == HB_ACODEC_MASK)
-       {
-               codec = ghb_select_audio_codec_str(ud, itrack);
-       }
-
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
                // These are displayed in list
@@ -533,21 +622,9 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings)
                3, sr,
                4, mix,
                5, s_drc,
-               // These are used to set combo box values when a list item is selected
-               6, s_track,
-               7, s_codec,
-               8, s_br,
-               9, s_sr,
-               10, s_mix,
-               11, drc,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_drc);
-       g_free(s_track);
-       g_free(s_codec);
-       g_free(s_br);
-       g_free(s_sr);
-       g_free(s_mix);
 }
 
 G_MODULE_EXPORT void
@@ -557,26 +634,40 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
        GtkTreeIter iter;
        GtkWidget *widget;
        
+       GtkTreePath *treepath;
+       gint *indices;
+       gint row;
+       GValue *asettings = NULL;
+
+       const GValue *audio_list;
        g_debug("audio_list_selection_changed_cb ()");
        if (gtk_tree_selection_get_selected(selection, &store, &iter))
        {
-               const gchar *track, *codec, *bitrate, *sample_rate, *mix;
-               gdouble drc;
+               //const gchar *actual_codec, *track, *codec, *bitrate, *sample_rate, *mix;
+               //gdouble drc;
+
+               // Get the row number
+               treepath = gtk_tree_model_get_path (store, &iter);
+               indices = gtk_tree_path_get_indices (treepath);
+               row = indices[0];
+               gtk_tree_path_free(treepath);
+               // find audio settings
+               if (row < 0) return;
+               audio_list = ghb_settings_get_value(ud->settings, "audio_list");
+               if (row >= ghb_array_len(audio_list))
+                       return;
+               asettings = ghb_array_get_nth(audio_list, row);
 
-               gtk_tree_model_get(store, &iter,
-                                                  6, &track,
-                                                  7, &codec,
-                                                  8, &bitrate,
-                                                  9, &sample_rate,
-                                                  10, &mix,
-                                                  11, &drc,
-                                                  -1);
-               ghb_ui_update(ud, "AudioTrack", ghb_string_value(track));
-               ghb_ui_update(ud, "AudioEncoder", ghb_string_value(codec));
-               ghb_ui_update(ud, "AudioBitrate", ghb_string_value(bitrate));
-               ghb_ui_update(ud, "AudioSamplerate", ghb_string_value(sample_rate));
-               ghb_ui_update(ud, "AudioMixdown", ghb_string_value(mix));
-               ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_double_value(drc));
+               block_updates = TRUE;
+               ghb_ui_update(ud, "AudioTrack", ghb_settings_get_value(asettings, "AudioTrack"));
+               ghb_ui_update(ud, "AudioEncoder", ghb_settings_get_value(asettings, "AudioEncoder"));
+               ghb_settings_set_value(ud->settings, "AudioEncoderActual", ghb_settings_get_value(asettings, "AudioEncoderActual"));
+               ghb_check_dependency(ud, NULL, "AudioEncoderActual");
+               ghb_ui_update(ud, "AudioBitrate", ghb_settings_get_value(asettings, "AudioBitrate"));
+               ghb_ui_update(ud, "AudioSamplerate", ghb_settings_get_value(asettings, "AudioSamplerate"));
+               ghb_ui_update(ud, "AudioMixdown", ghb_settings_get_value(asettings, "AudioMixdown"));
+               ghb_ui_update(ud, "AudioTrackDRCSlider", ghb_settings_get_value(asettings, "AudioTrackDRCSlider"));
+               block_updates = FALSE;
                widget = GHB_WIDGET (ud->builder, "audio_remove");
                gtk_widget_set_sensitive(widget, TRUE);
        }
@@ -587,23 +678,48 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t
        }
 }
 
+static void
+ghb_add_audio(signal_user_data_t *ud, GValue *settings)
+{
+       GValue *audio_list;
+       int count;
+       const gchar * track;
+
+       track = ghb_settings_combo_option(settings, "AudioTrack");
+       ghb_settings_set_string(settings, "AudioTrackDescription", track);
+
+       audio_list = ghb_settings_get_value(ud->settings, "audio_list");
+       if (audio_list == NULL)
+       {
+               audio_list = ghb_array_value_new(8);
+               ghb_settings_set_value(ud->settings, "audio_list", audio_list);
+       }
+       ghb_array_append(audio_list, settings);
+       add_to_audio_list(ud, settings);
+       count = ghb_array_len(audio_list);
+       if (count >= 99)
+       {
+               GtkWidget * widget = GHB_WIDGET(ud->builder, "audio_add");
+               gtk_widget_set_sensitive(widget, FALSE);
+       }
+       ghb_update_destination_extension(ud);
+}
+
 G_MODULE_EXPORT void
 audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        // Add the current audio settings to the list.
        GValue *asettings;
        GtkWidget *widget;
-       gint count;
-       GValue *audio_list;
-       const gchar *track;
        
        g_debug("audio_add_clicked_cb ()");
        asettings = ghb_dict_value_new();
-       // Only allow up to 8 audio entries
        widget = GHB_WIDGET(ud->builder, "AudioTrack");
        ghb_settings_take_value(asettings, "AudioTrack", ghb_widget_value(widget));
        widget = GHB_WIDGET(ud->builder, "AudioEncoder");
        ghb_settings_take_value(asettings, "AudioEncoder", ghb_widget_value(widget));
+       ghb_settings_set_value(asettings, "AudioEncoderActual", 
+               ghb_settings_get_value(ud->settings, "AudioEncoderActual"));
        widget = GHB_WIDGET(ud->builder, "AudioBitrate");
        ghb_settings_take_value(asettings, "AudioBitrate", ghb_widget_value(widget));
        widget = GHB_WIDGET(ud->builder, "AudioSamplerate");
@@ -612,23 +728,8 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        ghb_settings_take_value(asettings, "AudioMixdown", ghb_widget_value(widget));
        widget = GHB_WIDGET(ud->builder, "AudioTrackDRCSlider");
        ghb_settings_take_value(asettings, "AudioTrackDRCSlider", ghb_widget_value(widget));
-       track = ghb_settings_combo_option(asettings, "AudioTrack");
-       ghb_settings_set_string(asettings, "AudioTrackDescription", track);
 
-       audio_list = ghb_settings_get_value(ud->settings, "audio_list");
-       if (audio_list == NULL)
-       {
-               audio_list = ghb_array_value_new(8);
-               ghb_settings_set_value(ud->settings, "audio_list", audio_list);
-       }
-       ghb_array_append(audio_list, asettings);
-       add_to_audio_list(ud, asettings);
-       count = ghb_array_len(audio_list);
-       if (count >= 99)
-       {
-               gtk_widget_set_sensitive(xwidget, FALSE);
-       }
-       ghb_update_destination_extension(ud);
+       ghb_add_audio(ud, asettings);
 }
 
 G_MODULE_EXPORT void
@@ -685,16 +786,14 @@ void
 ghb_set_audio(signal_user_data_t *ud, GValue *settings)
 {
        gint acodec_code;
-       GtkWidget *button;
 
        GValue *alist;
-       GValue *track, *audio, *acodec, *bitrate, *rate, *mix, *drc;
+       GValue *track, *audio, *acodec, *acodec_actual, *bitrate, *rate, *mix, *drc;
        gint count, ii;
        
        g_debug("set_audio");
        // Clear the audio list
        ghb_clear_audio_list(ud);
-       button = GHB_WIDGET (ud->builder, "audio_add");
        alist = ghb_settings_get_value(settings, "audio_list");
 
        count = ghb_array_len(alist);
@@ -703,6 +802,7 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
                audio = ghb_array_get_nth(alist, ii);
                track = ghb_settings_get_value(audio, "AudioTrack");
                acodec = ghb_settings_get_value(audio, "AudioEncoder");
+               acodec_actual = ghb_settings_get_value(audio, "AudioEncoderActual");
                bitrate = ghb_settings_get_value(audio, "AudioBitrate");
                rate = ghb_settings_get_value(audio, "AudioSamplerate");
                mix = ghb_settings_get_value(audio, "AudioMixdown");
@@ -711,18 +811,18 @@ ghb_set_audio(signal_user_data_t *ud, GValue *settings)
 
                if (acodec_code != 0)
                {
-                       // Add to audio list
-                       g_signal_emit_by_name(button, "clicked", ud);
-                       ghb_ui_update(ud, "AudioTrack", track);
-                       ghb_ui_update(ud, "AudioEncoder", acodec);
-                       if (!ghb_audio_is_passthru (acodec_code))
-                       {
-                               // This gets set autimatically if the codec is passthru
-                               ghb_ui_update(ud, "AudioBitrate", bitrate);
-                               ghb_ui_update(ud, "AudioSamplerate", rate);
-                               ghb_ui_update(ud, "AudioMixdown", mix);
-                       }
-                       ghb_ui_update(ud, "AudioTrackDRCSlider", drc);
+                       GValue *settings = ghb_dict_value_new();
+                       ghb_settings_set_value(settings, "AudioTrack", track);
+                       ghb_settings_set_value(settings, "AudioEncoder", acodec);
+                       ghb_settings_set_value(settings, "AudioEncoderActual", acodec_actual);
+
+                       // This gets set autimatically if the codec is passthru
+                       ghb_settings_set_value(settings, "AudioBitrate", bitrate);
+                       ghb_settings_set_value(settings, "AudioSamplerate", rate);
+                       ghb_settings_set_value(settings, "AudioMixdown", mix);
+                       ghb_settings_set_value(settings, "AudioTrackDRCSlider", drc);
+                       ghb_add_audio(ud, settings);
+                       ghb_adjust_audio_rate_combos(ud);
                }
        }
 }
index a3b3234..87b9612 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * audiohandler.h
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * audiohandler.h is free software.
  * 
index 532ac69..f225ff9 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * callbacks.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * callbacks.c is free software.
  * 
 
 #if !defined(_WIN32)
 #include <poll.h>
-#include <libhal-storage.h>
+#define G_UDEV_API_IS_SUBJECT_TO_CHANGE 1
+#include <gudev/gudev.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
 #include <netinet/in.h>
 #include <netdb.h>
+
+#if !defined(_NO_UPDATE_CHECK)
 #if defined(_OLD_WEBKIT)
 #include <webkit.h>
 #else
 #include <webkit/webkit.h>
 #endif
+#endif
+
 #include <libnotify/notify.h>
 #include <gdk/gdkx.h>
 #else
@@ -199,7 +204,7 @@ ghb_check_dependency(
                type = GTK_WIDGET_TYPE(widget);
                if (type == GTK_TYPE_COMBO_BOX || type == GTK_TYPE_COMBO_BOX_ENTRY)
                        if (gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) < 0) return;
-               name = gtk_widget_get_name(widget);
+               name = ghb_get_setting_key(widget);
        }
        else
                name = alt_name;
@@ -296,7 +301,7 @@ on_quit1_activate(GtkMenuItem *quit, signal_user_data_t *ud)
 {
        gint state = ghb_get_queue_state();
        g_debug("on_quit1_activate ()");
-       if (state & GHB_STATE_WORKING)
+       if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING))
        {
                if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n"))
                {
@@ -580,7 +585,8 @@ set_destination(signal_user_data_t *ud)
                                title = ghb_settings_combo_int(ud->settings, "title");
                                g_string_append_printf(str, " - %d", title+1);
                        }
-                       if (ghb_settings_get_boolean(
+                       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0 && 
+                               ghb_settings_get_boolean(
                                        ud->settings, "chapters_in_destination"))
                        {
                                gint start, end;
@@ -590,8 +596,8 @@ set_destination(signal_user_data_t *ud)
                                {
                                        g_string_append_printf(str, " -");
                                }
-                               start = ghb_settings_get_int(ud->settings, "start_chapter");
-                               end = ghb_settings_get_int(ud->settings, "end_chapter");
+                               start = ghb_settings_get_int(ud->settings, "start_point");
+                               end = ghb_settings_get_int(ud->settings, "end_point");
                                if (start == end)
                                        g_string_append_printf(str, " Ch %d", start);
                                else
@@ -762,6 +768,8 @@ chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud)
        gboolean foundit = FALSE;
        GtkComboBox *combo;
        
+       g_debug("chooser_file_selected_cb ()");
+
        if (name == NULL) return;
        combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
        store = gtk_combo_box_get_model(combo);
@@ -791,6 +799,7 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud)
        GtkWidget *dialog;
        gint ii;
 
+       g_debug("dvd_device_changed_cb ()");
        ii = gtk_combo_box_get_active (combo);
        if (ii > 0)
        {
@@ -807,52 +816,17 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud)
        }
 }
 
-G_MODULE_EXPORT void
-source_type_changed_cb(GtkToggleButton *toggle, signal_user_data_t *ud)
-{
-       gchar *folder;
-       GtkFileChooser *chooser;
-       GtkWidget *dvd_device_combo;
-       
-       g_debug("source_type_changed_cb ()");
-       chooser = GTK_FILE_CHOOSER(GHB_WIDGET(ud->builder, "source_dialog"));
-       dvd_device_combo = GHB_WIDGET(ud->builder, "source_device");
-       folder = gtk_file_chooser_get_current_folder (chooser);
-       if (gtk_toggle_button_get_active (toggle))
-       {
-               gtk_file_chooser_set_action (chooser, 
-                                                                       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
-               gtk_widget_set_sensitive (dvd_device_combo, FALSE);
-               gtk_combo_box_set_active (GTK_COMBO_BOX(dvd_device_combo), 0);
-       }
-       else
-       {
-               gtk_file_chooser_set_action (chooser, GTK_FILE_CHOOSER_ACTION_OPEN);
-               gtk_widget_set_sensitive (dvd_device_combo, TRUE);
-       }
-       if (folder != NULL)
-       {
-               gtk_file_chooser_set_current_folder(chooser, folder);
-               g_free(folder);
-       }
-}
-
 static void
 source_dialog_extra_widgets(
        signal_user_data_t *ud,
-       GtkWidget *dialog, 
-       gboolean checkbutton_active)
+       GtkWidget *dialog)
 {
-       GtkToggleButton *checkbutton;
        GtkComboBox *combo;
        GList *drives, *link;
        
-       checkbutton = GTK_TOGGLE_BUTTON(
-               GHB_WIDGET(ud->builder, "source_folder_flag"));
-       gtk_toggle_button_set_active(checkbutton, checkbutton_active);
+       g_debug("source_dialog_extra_widgets ()");
        combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, "source_device"));
-       gtk_list_store_clear(GTK_LIST_STORE(
-                                               gtk_combo_box_get_model(combo)));
+       gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(combo)));
 
        link = drives = dvd_device_list();
        gtk_combo_box_append_text (combo, "Not Selected");
@@ -865,6 +839,7 @@ source_dialog_extra_widgets(
                link = link->next;
        }
        g_list_free(drives);
+       gtk_combo_box_set_active (combo, 0);
 }
 
 extern GValue *ghb_queue_edit_settings;
@@ -900,12 +875,33 @@ start_scan(
                return;
 
        widget = GHB_WIDGET(ud->builder, "sourcetoolbutton");
-       gtk_widget_set_sensitive(widget, FALSE);
+       gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-stop");
+       gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Stop Scan");
+       gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Stop Scan");
+       //gtk_widget_set_sensitive(widget, FALSE);
+
        action = GHB_ACTION(ud->builder, "source_action");
        gtk_action_set_sensitive(action, FALSE);
        action = GHB_ACTION(ud->builder, "source_single_action");
        gtk_action_set_sensitive(action, FALSE);
-       ghb_backend_scan(path, titlenum, preview_count);
+       ghb_backend_scan(path, titlenum, preview_count, 
+                       90000L * ghb_settings_get_int64(ud->settings, "MinTitleDuration"));
+}
+
+gboolean
+ghb_idle_scan(signal_user_data_t *ud)
+{
+       gchar *path;
+       gint preview_count;
+
+       show_scan_progress(ud);
+       path = ghb_settings_get_string( ud->settings, "scan_source");
+       prune_logs(ud);
+
+       preview_count = ghb_settings_get_int(ud->settings, "preview_count");
+       start_scan(ud, path, 0, preview_count);
+       g_free(path);
+       return FALSE;
 }
 
 void
@@ -936,14 +932,14 @@ ghb_do_scan(
        if (filename != NULL)
        {
                last_scan_file = g_strdup(filename);
-               ghb_settings_set_string(ud->settings, "source", filename);
+               ghb_settings_set_string(ud->settings, "scan_source", filename);
                if (update_source_label(ud, filename, TRUE))
                {
                        gchar *path;
                        gint preview_count;
 
                        show_scan_progress(ud);
-                       path = ghb_settings_get_string( ud->settings, "source");
+                       path = ghb_settings_get_string( ud->settings, "scan_source");
                        prune_logs(ud);
 
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
@@ -957,41 +953,15 @@ ghb_do_scan(
        }
 }
 
-static gboolean 
-update_source_name(gpointer data)
-{
-       signal_user_data_t *ud = (signal_user_data_t*)data;
-       GtkWidget *dialog;
-       gchar *sourcename;
-
-       sourcename = ghb_settings_get_string(ud->settings, "source");
-       dialog = GHB_WIDGET(ud->builder, "source_dialog");
-       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
-       g_free(sourcename);
-       return FALSE;
-}
-
 static void
 do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
 {
        GtkWidget *dialog;
        gchar *sourcename;
        gint    response;
-       GtkFileChooserAction action;
-       gboolean checkbutton_active;
 
        g_debug("source_browse_clicked_cb ()");
-       sourcename = ghb_settings_get_string(ud->settings, "source");
-       checkbutton_active = FALSE;
-       if (g_file_test(sourcename, G_FILE_TEST_IS_DIR))
-       {
-               action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER;
-               checkbutton_active = TRUE;
-       }
-       else
-       {
-               action = GTK_FILE_CHOOSER_ACTION_OPEN;
-       }
+       sourcename = ghb_settings_get_string(ud->settings, "scan_source");
        GtkWidget *widget;
        widget = GHB_WIDGET(ud->builder, "single_title_box");
        if (single)
@@ -999,16 +969,11 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
        else
                gtk_widget_hide(widget);
        dialog = GHB_WIDGET(ud->builder, "source_dialog");
-       source_dialog_extra_widgets(ud, dialog, checkbutton_active);
-       gtk_file_chooser_set_action(GTK_FILE_CHOOSER(dialog), action);
-       // Updating the filename in the file chooser dialog doesn't seem
-       // to work unless the dialog is running for some reason.
-       // So handle it in an "idle" event.
-       //gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
-       g_idle_add((GSourceFunc)update_source_name, ud);
+       source_dialog_extra_widgets(ud, dialog);
+       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), sourcename);
        response = gtk_dialog_run(GTK_DIALOG (dialog));
        gtk_widget_hide(dialog);
-       if (response == GTK_RESPONSE_ACCEPT)
+       if (response == GTK_RESPONSE_NO)
        {
                gchar *filename;
 
@@ -1038,7 +1003,16 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud)
 G_MODULE_EXPORT void
 source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud)
 {
-       do_source_dialog(button, FALSE, ud);
+       ghb_status_t status;
+       ghb_get_status(&status);
+       if (status.scan.state & GHB_STATE_SCANNING)
+       {
+               ghb_backend_scan_stop();
+       }
+       else
+       {
+               do_source_dialog(button, FALSE, ud);
+       }
 }
 
 G_MODULE_EXPORT void
@@ -1053,8 +1027,8 @@ dvd_source_activate_cb(GtkAction *action, signal_user_data_t *ud)
        const gchar *filename;
        gchar *sourcename;
 
-       sourcename = ghb_settings_get_string(ud->settings, "source");
-       filename = gtk_action_get_name(action);
+       sourcename = ghb_settings_get_string(ud->settings, "scan_source");
+       filename = gtk_buildable_get_name(GTK_BUILDABLE(action));
        ghb_do_scan(ud, filename, 0, TRUE);
        if (strcmp(sourcename, filename) != 0)
        {
@@ -1246,7 +1220,7 @@ window_delete_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *u
 {
        gint state = ghb_get_queue_state();
        g_debug("window_delete_event_cb ()");
-       if (state & GHB_STATE_WORKING)
+       if (state & (GHB_STATE_WORKING|GHB_STATE_SEARCHING))
        {
                if (ghb_cancel_encode2(ud, "Closing HandBrake will terminate encoding.\n"))
                {
@@ -1309,25 +1283,88 @@ get_rate_string(gint rate_base, gint rate)
        rate_s = g_strdup_printf("%.6g", rate_f);
        return rate_s;
 }
+
 static void
-show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
+update_title_duration(signal_user_data_t *ud)
 {
-       GtkWidget *widget;
+       gint ti;
+       gint hh, mm, ss, start, end;
        gchar *text;
+       GtkWidget *widget;
 
-       ud->dont_clear_presets = TRUE;
+       ti = ghb_settings_combo_int(ud->settings, "title");
        widget = GHB_WIDGET (ud->builder, "title_duration");
-       if (tinfo->duration != 0)
+
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
        {
-               text = g_strdup_printf ("%02d:%02d:%02d", tinfo->hours, 
-                               tinfo->minutes, tinfo->seconds);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               ghb_part_duration(ti, start, end, &hh, &mm, &ss);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               text = g_strdup_printf ("Unknown");
+               gint duration;
+
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               duration = end - start;
+               hh = duration / (60*60);
+               mm = (duration / 60) % 60;
+               ss = duration % 60;
        }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               ghb_title_info_t tinfo;
+
+               if (ghb_get_title_info (&tinfo, ti))
+               {
+                       gint64 frames;
+                       gint duration;
+
+                       start = ghb_settings_get_int(ud->settings, "start_point");
+                       end = ghb_settings_get_int(ud->settings, "end_point");
+                       frames = end - start + 1;
+                       duration = frames * tinfo.rate_base / tinfo.rate;
+                       hh = duration / (60*60);
+                       mm = (duration / 60) % 60;
+                       ss = duration % 60;
+               }
+               else
+               {
+                       hh = mm = ss = 0;
+               }
+       }
+       text = g_strdup_printf("%02d:%02d:%02d", hh, mm, ss);
        gtk_label_set_text (GTK_LABEL(widget), text);
        g_free(text);
+}
+
+static void
+show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
+{
+       GtkWidget *widget;
+       gchar *text;
+
+       ghb_settings_set_string(ud->settings, "source", tinfo->path);
+       if (tinfo->type == HB_STREAM_TYPE)
+       {
+               GtkWidget *widget = GHB_WIDGET (ud->builder, "source_title");
+               if (tinfo->name != NULL && tinfo->name[0] != 0)
+               {
+                       gtk_label_set_text (GTK_LABEL(widget), tinfo->name);
+                       ghb_settings_set_string(ud->settings, "volume_label", tinfo->name);
+                       set_destination(ud);
+               }
+               else
+               {
+                       gchar *label = "No Title Found";
+                       gtk_label_set_text (GTK_LABEL(widget), label);
+                       ghb_settings_set_string(ud->settings, "volume_label", label);
+               }
+       }
+       ud->dont_clear_presets = TRUE;
+       ud->scale_busy = TRUE;
+       update_title_duration(ud);
        widget = GHB_WIDGET (ud->builder, "source_dimensions");
        text = g_strdup_printf ("%d x %d", tinfo->width, tinfo->height);
        gtk_label_set_text (GTK_LABEL(widget), text);
@@ -1344,6 +1381,9 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        gtk_label_set_text (GTK_LABEL(widget), text);
        g_free(text);
 
+       //widget = GHB_WIDGET (ud->builder, "source_interlaced");
+       //gtk_label_set_text (GTK_LABEL(widget), tinfo->interlaced ? "Yes" : "No");
+
        ghb_ui_update(ud, "scale_width", 
                ghb_int64_value(tinfo->width - tinfo->crop[2] - tinfo->crop[3]));
        // If anamorphic or keep_aspect, the hight will be automatically calculated
@@ -1377,7 +1417,8 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
                ghb_ui_update(ud, "PictureLeftCrop", ghb_int64_value(tinfo->crop[2]));
                ghb_ui_update(ud, "PictureRightCrop", ghb_int64_value(tinfo->crop[3]));
        }
-       ghb_set_scale (ud, GHB_PIC_KEEP_PAR);
+       ud->scale_busy = FALSE;
+       ghb_set_scale (ud, GHB_PIC_KEEP_PAR|GHB_PIC_USE_MAX);
        gint width, height, crop[4];
        crop[0] = ghb_settings_get_int(ud->settings, "PictureTopCrop");
        crop[1] = ghb_settings_get_int(ud->settings, "PictureBottomCrop");
@@ -1390,17 +1431,46 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        gtk_label_set_text (GTK_LABEL(widget), text);
        g_free(text);
 
-       g_debug("setting max end chapter %d", tinfo->num_chapters);
-       widget = GHB_WIDGET (ud->builder, "end_chapter");
-       gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
-       gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters);
-       widget = GHB_WIDGET (ud->builder, "start_chapter");
-       gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
-       gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+
+       gint duration = tinfo->duration / 90000;
+
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo->num_chapters);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
+       {
+
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               gdouble max_frames = (gdouble)duration * tinfo->rate / tinfo->rate_base;
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames);
+       }
 
        widget = GHB_WIDGET (ud->builder, "angle");
        gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
        gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo->angle_count);
+       ghb_settings_set_int(ud->settings, "angle_count", tinfo->angle_count);
        ud->dont_clear_presets = FALSE;
 }
 
@@ -1414,7 +1484,6 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        
        g_debug("title_changed_cb ()");
        ghb_widget_to_setting(ud->settings, widget);
-       ghb_check_dependency(ud, widget, NULL);
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
        ghb_update_ui_combo_box (ud, "AudioTrack", titleindex, FALSE);
@@ -1424,6 +1493,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        {
                show_title_info(ud, &tinfo);
        }
+       ghb_check_dependency(ud, widget, NULL);
        update_chapter_list (ud);
        ghb_adjust_audio_rate_combos(ud);
        ghb_set_pref_audio(titleindex, ud);
@@ -1451,6 +1521,66 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
                set_destination(ud);
        }
        ghb_preview_set_visible(ud);
+
+       gint end;
+       widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
+       gtk_widget_set_sensitive(widget, TRUE);
+       end = ghb_settings_get_int(ud->settings, "end_point");
+       if (1 == end)
+       {
+               ud->dont_clear_presets = TRUE;
+               ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
+               ud->dont_clear_presets = FALSE;
+               gtk_widget_set_sensitive(widget, FALSE);
+       }
+}
+
+G_MODULE_EXPORT void
+ptop_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+       gint ti;
+       ghb_title_info_t tinfo;
+
+       ghb_widget_to_setting(ud->settings, widget);
+       ghb_check_dependency(ud, widget, NULL);
+       ghb_live_reset(ud);
+
+       ti = ghb_settings_combo_int(ud->settings, "title");
+       if (!ghb_get_title_info (&tinfo, ti))
+               return;
+
+       gint duration = tinfo.duration / 90000;
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, tinfo.num_chapters);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), tinfo.num_chapters);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
+       {
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 0, duration-1);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 0);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, duration);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), duration);
+       }
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
+       {
+               gdouble max_frames = (gdouble)duration * tinfo.rate / tinfo.rate_base;
+               widget = GHB_WIDGET (ud->builder, "start_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), 1);
+
+               widget = GHB_WIDGET (ud->builder, "end_point");
+               gtk_spin_button_set_range (GTK_SPIN_BUTTON(widget), 1, max_frames);
+               gtk_spin_button_set_value (GTK_SPIN_BUTTON(widget), max_frames);
+       }
 }
 
 G_MODULE_EXPORT void
@@ -1529,7 +1659,7 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 G_MODULE_EXPORT void
 target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        g_debug("target_size_changed_cb () %s", name);
        ghb_widget_to_setting(ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
@@ -1545,62 +1675,106 @@ target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
-start_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+start_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint start, end;
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
 
-       g_debug("start_chapter_changed_cb () %s", name);
+       g_debug("start_point_changed_cb () %s", name);
        ghb_widget_to_setting(ud->settings, widget);
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start > end)
-               ghb_ui_update(ud, "end_chapter", ghb_int_value(start));
-       ghb_check_dependency(ud, widget, NULL);
-       if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
-       {
-               set_destination(ud);
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start));
+               ghb_check_dependency(ud, widget, NULL);
+               if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
+               {
+                       set_destination(ud);
+               }
+               widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
+               gtk_widget_set_sensitive(widget, TRUE);
+               // End may have been changed above, get it again
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start == end)
+               {
+                       ud->dont_clear_presets = TRUE;
+                       ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
+                       ud->dont_clear_presets = FALSE;
+                       gtk_widget_set_sensitive(widget, FALSE);
+               }
+               update_title_duration(ud);
        }
-       widget = GHB_WIDGET (ud->builder, "chapters_tab");
-       // End may have been changed above, get it again
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start == end)
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               gtk_widget_hide(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start >= end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start+1));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
        {
-               gtk_widget_show(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "end_point", ghb_int_value(start));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
 }
 
 G_MODULE_EXPORT void
-end_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+end_point_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint start, end;
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
 
-       g_debug("end_chapter_changed_cb () %s", name);
+       g_debug("end_point_changed_cb () %s", name);
        ghb_widget_to_setting(ud->settings, widget);
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       end = ghb_settings_get_int(ud->settings, "end_chapter");
-       if (start > end)
-               ghb_ui_update(ud, "start_chapter", ghb_int_value(end));
-       ghb_check_dependency(ud, widget, NULL);
-       if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
-       {
-               set_destination(ud);
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end));
+               ghb_check_dependency(ud, widget, NULL);
+               if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
+               {
+                       set_destination(ud);
+               }
+               widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
+               gtk_widget_set_sensitive(widget, TRUE);
+               // Start may have been changed above, get it again
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               if (start == end)
+               {
+                       ud->dont_clear_presets = TRUE;
+                       ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
+                       ud->dont_clear_presets = FALSE;
+                       gtk_widget_set_sensitive(widget, FALSE);
+               }
+               update_title_duration(ud);
        }
-       widget = GHB_WIDGET (ud->builder, "chapters_tab");
-       // Start may have been changed above, get it again
-       start = ghb_settings_get_int(ud->settings, "start_chapter");
-       if (start == end)
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 1)
        {
-               gtk_widget_hide(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start >= end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end-1));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
-       else
+       else if (ghb_settings_combo_int(ud->settings, "PtoPType") == 2)
        {
-               gtk_widget_show(widget);
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               if (start > end)
+                       ghb_ui_update(ud, "start_point", ghb_int_value(end));
+               ghb_check_dependency(ud, widget, NULL);
+               update_title_duration(ud);
        }
 }
 
@@ -1816,9 +1990,32 @@ typedef struct
        const gchar *msg;
        const gchar *action;
        gint timeout;
+       signal_user_data_t *ud;
 } countdown_t;
 
 static gboolean
+quit_cb(countdown_t *cd)
+{
+       gchar *str;
+
+       cd->timeout--;
+       if (cd->timeout == 0)
+       {
+               ghb_hb_cleanup(FALSE);
+               prune_logs(cd->ud);
+
+               gtk_widget_destroy (GTK_WIDGET(cd->dlg));
+               gtk_main_quit();
+               return FALSE;
+       }
+       str = g_strdup_printf("%s\n\n%s in %d seconds ...", 
+                                                       cd->msg, cd->action, cd->timeout);
+       gtk_message_dialog_set_markup(cd->dlg, str);
+       g_free(str);
+       return TRUE;
+}
+
+static gboolean
 shutdown_cb(countdown_t *cd)
 {
        gchar *str;
@@ -1826,6 +2023,9 @@ shutdown_cb(countdown_t *cd)
        cd->timeout--;
        if (cd->timeout == 0)
        {
+               ghb_hb_cleanup(FALSE);
+               prune_logs(cd->ud);
+
                ghb_shutdown_gsm();
                gtk_main_quit();
                return FALSE;
@@ -1863,6 +2063,7 @@ ghb_countdown_dialog(
        const gchar *action, 
        const gchar *cancel, 
        GSourceFunc action_func,
+       signal_user_data_t *ud,
        gint timeout)
 {
        GtkWidget *dialog;
@@ -1873,6 +2074,7 @@ ghb_countdown_dialog(
        cd.msg = message;
        cd.action = action;
        cd.timeout = timeout;
+       cd.ud = ud;
 
        // Toss up a warning dialog
        dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
@@ -2335,6 +2537,46 @@ working_status_string(signal_user_data_t *ud, ghb_instance_status_t *status)
        return status_str;
 }
 
+gchar*
+searching_status_string(signal_user_data_t *ud, ghb_instance_status_t *status)
+{
+       gchar *task_str, *job_str, *status_str;
+       gint qcount;
+       gint index;
+       GValue *js;
+
+       qcount = ghb_array_len(ud->queue);
+       index = find_queue_job(ud->queue, status->unique_id, &js);
+       if (qcount > 1)
+       {
+               job_str = g_strdup_printf("job %d of %d, ", index+1, qcount);
+       }
+       else
+       {
+               job_str = g_strdup("");
+       }
+       task_str = g_strdup_printf("Searching for start time, ");
+       if(status->seconds > -1)
+       {
+               status_str= g_strdup_printf(
+                       "Encoding: %s%s%.2f %%"
+                       " (ETA %02dh%02dm%02ds)",
+                       job_str, task_str,
+                       100.0 * status->progress,
+                       status->hours, status->minutes, status->seconds );
+       }
+       else
+       {
+               status_str= g_strdup_printf(
+                       "Encoding: %s%s%.2f %%",
+                       job_str, task_str,
+                       100.0 * status->progress );
+       }
+       g_free(task_str);
+       g_free(job_str);
+       return status_str;
+}
+
 static void
 ghb_backend_events(signal_user_data_t *ud)
 {
@@ -2410,19 +2652,27 @@ ghb_backend_events(signal_user_data_t *ud)
                GtkAction *action;
 
                widget = GHB_WIDGET(ud->builder, "sourcetoolbutton");
-               gtk_widget_set_sensitive(widget, TRUE);
+               gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(widget), "hb-source");
+               gtk_tool_button_set_label(GTK_TOOL_BUTTON(widget), "Source");
+               gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(widget), "Choose Video Source");
+
                action = GHB_ACTION(ud->builder, "source_action");
                gtk_action_set_sensitive(action, TRUE);
                action = GHB_ACTION(ud->builder, "source_single_action");
                gtk_action_set_sensitive(action, TRUE);
 
-               source = ghb_settings_get_string(ud->settings, "source");
+               source = ghb_settings_get_string(ud->settings, "scan_source");
                update_source_label(ud, source, FALSE);
 
                scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog"));
                gtk_progress_bar_set_fraction (scan_prog, 1.0);
                gtk_widget_hide(GTK_WIDGET(scan_prog));
 
+               if (!ghb_settings_get_boolean(ud->settings, "preset_modified"))
+               {
+                       ghb_refresh_preset(ud);
+               }
+
                ghb_title_info_t tinfo;
                        
                ghb_update_ui_combo_box(ud, "title", 0, FALSE);
@@ -2465,6 +2715,44 @@ ghb_backend_events(signal_user_data_t *ud)
        {
                gtk_label_set_text (work_status, "Paused");
        }
+       else if (status.queue.state & GHB_STATE_SEARCHING)
+       {
+               static gint working = 0;
+
+               // This needs to be in scanning and working since scanning
+               // happens fast enough that it can be missed
+               index = find_queue_job(ud->queue, status.queue.unique_id, &js);
+               if (status.queue.unique_id != 0 && index >= 0)
+               {
+                       gchar working_icon[] = "hb-working0";
+                       working_icon[10] = '0' + working;
+                       working = (working+1) % 6;
+                       treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list"));
+                       store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
+                       gchar *path = g_strdup_printf ("%d", index);
+                       if (gtk_tree_model_get_iter_from_string(
+                                       GTK_TREE_MODEL(store), &iter, path))
+                       {
+                               gtk_tree_store_set(store, &iter, 0, working_icon, -1);
+                       }
+                       g_free(path);
+               }
+               GtkLabel *label;
+               gchar *status_str;
+
+               status_str = searching_status_string(ud, &status.queue);
+               label = GTK_LABEL(GHB_WIDGET(ud->builder, "queue_status"));
+               gtk_label_set_text (label, status_str);
+#if !GTK_CHECK_VERSION(2, 16, 0)
+               GtkStatusIcon *si;
+
+               si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
+               gtk_status_icon_set_tooltip(si, status_str);
+#endif
+               gtk_label_set_text (work_status, status_str);
+               gtk_progress_bar_set_fraction (progress, status.queue.progress);
+               g_free(status_str);
+       }
        else if (status.queue.state & GHB_STATE_WORKING)
        {
                static gint working = 0;
@@ -2632,6 +2920,8 @@ status_icon_query_tooltip_cb(
        ghb_get_status(&status);
        if (status.queue.state & GHB_STATE_WORKING)
                status_str = working_status_string(ud, &status.queue);
+       else if (status.queue.state & GHB_STATE_SEARCHING)
+               status_str = searching_status_string(ud, &status.queue);
        else if (status.queue.state & GHB_STATE_WORKDONE)
                status_str = g_strdup("Encode Complete");
        else
@@ -2674,6 +2964,7 @@ ghb_timer_cb(gpointer data)
                update_preview = FALSE;
        }
 
+#if !defined(_NO_UPDATE_CHECK)
        if (!appcast_busy)
        {
                gchar *updates;
@@ -2704,6 +2995,7 @@ ghb_timer_cb(gpointer data)
                        }
                }
        }
+#endif
        return TRUE;
 }
 
@@ -2873,6 +3165,10 @@ ghb_log(gchar *log, ...)
 static void
 browse_url(const gchar *url)
 {
+#if defined(_WIN32)
+       HINSTANCE r;
+       r = ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
+#else
        gboolean result;
        char *argv[] = 
                {"xdg-open",NULL,NULL,NULL};
@@ -2898,6 +3194,7 @@ browse_url(const gchar *url)
        argv[2] = NULL;
        result = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL,
                                NULL, NULL, NULL);
+#endif
 }
 
 void
@@ -3291,7 +3588,7 @@ pref_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        g_debug("pref_changed_cb");
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 }
 
@@ -3301,7 +3598,7 @@ use_m4v_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        g_debug("use_m4v_changed_cb");
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
        ghb_update_destination_extension(ud);
 }
@@ -3312,7 +3609,7 @@ show_status_cb(GtkWidget *widget, signal_user_data_t *ud)
        g_debug("show_status_cb");
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 
        GtkStatusIcon *si;
@@ -3329,7 +3626,7 @@ vqual_granularity_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
 
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 
        gdouble vqmin, vqmax, step, page;
@@ -3346,7 +3643,7 @@ tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        g_debug("tweaks_changed_cb");
        ghb_widget_to_setting (ud->settings, widget);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 }
 
@@ -3355,7 +3652,7 @@ hbfd_feature_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        g_debug("hbfd_feature_changed_cb");
        ghb_widget_to_setting (ud->settings, widget);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 
        gboolean hbfd = ghb_settings_get_boolean(ud->settings, "hbfd_feature");
@@ -3488,7 +3785,7 @@ dvd_device_list()
 }
 
 #if !defined(_WIN32)
-static LibHalContext *hal_ctx = NULL;
+static GUdevClient *udev_ctx = NULL;
 #endif
 
 gboolean
@@ -3496,27 +3793,43 @@ ghb_is_cd(GDrive *gd)
 {
 #if !defined(_WIN32)
        gchar *device;
-       LibHalDrive *halDrive;
-       LibHalDriveType dtype;
+       GUdevDevice *udd;
 
-       if (hal_ctx == NULL)
+       if (udev_ctx == NULL)
                return FALSE;
 
        device = g_drive_get_identifier(gd, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
        if (device == NULL)
                return FALSE;
-       halDrive = libhal_drive_from_device_file (hal_ctx, device);
+
+       udd = g_udev_client_query_by_device_file(udev_ctx, device);
        g_free(device);
-       if (halDrive == NULL)
+
+       if (udd == NULL)
+       {
+               g_message("udev: Failed to lookup device %s", device);
                return FALSE;
-       dtype = libhal_drive_get_type(halDrive);
-       libhal_drive_free(halDrive);
-       return (dtype == LIBHAL_DRIVE_TYPE_CDROM);
+       }
+
+       gint val;
+       val = g_udev_device_get_property_as_int(udd, "ID_CDROM_DVD");
+       if (val == 1)
+               return TRUE;
+
+       return FALSE;
 #else
        return FALSE;
 #endif
 }
 
+void
+ghb_udev_init()
+{
+#if !defined(_WIN32)
+       udev_ctx = g_udev_client_new(NULL);
+#endif
+}
+
 #if defined(_WIN32)
 static void
 handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud)
@@ -3546,7 +3859,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud
                                update_source_label(ud, device, TRUE);
                                gint preview_count;
                                preview_count = ghb_settings_get_int(ud->settings, "preview_count");
-                               ghb_settings_set_string(ud->settings, "source", device);
+                               ghb_settings_set_string(ud->settings, "scan_source", device);
                                start_scan(ud, device, 0, preview_count);
                        }
                }
@@ -3563,7 +3876,7 @@ handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud
                        {
                                ghb_hb_cleanup(TRUE);
                                prune_logs(ud);
-                               ghb_settings_set_string(ud->settings, "source", "/dev/null");
+                               ghb_settings_set_string(ud->settings, "scan_source", "/dev/null");
                                start_scan(ud, "/dev/null", 0, 1);
                        }
                }
@@ -3650,7 +3963,7 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
                        update_source_label(ud, device, TRUE);
                        gint preview_count;
                        preview_count = ghb_settings_get_int(ud->settings, "preview_count");
-                       ghb_settings_set_string(ud->settings, "source", device);
+                       ghb_settings_set_string(ud->settings, "scan_source", device);
                        start_scan(ud, device, 0, preview_count);
                }
        }
@@ -3658,19 +3971,13 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud)
        {
                ghb_hb_cleanup(TRUE);
                prune_logs(ud);
-               ghb_settings_set_string(ud->settings, "source", "/dev/null");
+               ghb_settings_set_string(ud->settings, "scan_source", "/dev/null");
                start_scan(ud, "/dev/null", 0, 1);
        }
 }
 #endif
 
 #if !defined(_WIN32)
-static void
-dbus_init (void)
-{
-       dbus_g_thread_init();
-}
-
 #define GPM_DBUS_PM_SERVICE                    "org.freedesktop.PowerManagement"
 #define GPM_DBUS_PM_PATH                       "/org/freedesktop/PowerManagement"
 #define GPM_DBUS_PM_INTERFACE          "org.freedesktop.PowerManagement"
@@ -3773,11 +4080,11 @@ ghb_suspend_gpm()
 #endif
 }
 
+#if !defined(_WIN32)
 static gboolean
 ghb_can_shutdown_gpm()
 {
        gboolean can_shutdown = FALSE;
-#if !defined(_WIN32)
        DBusGConnection *conn;
        DBusGProxy      *proxy;
        GError *error = NULL;
@@ -3818,14 +4125,14 @@ ghb_can_shutdown_gpm()
        }
        g_object_unref(G_OBJECT(proxy));
        dbus_g_connection_unref(conn);
-#endif
        return can_shutdown;
 }
+#endif
 
+#if !defined(_WIN32)
 static void
 ghb_shutdown_gpm()
 {
-#if !defined(_WIN32)
        DBusGConnection *conn;
        DBusGProxy      *proxy;
        GError *error = NULL;
@@ -3863,8 +4170,8 @@ ghb_shutdown_gpm()
        }
        g_object_unref(G_OBJECT(proxy));
        dbus_g_connection_unref(conn);
-#endif
 }
+#endif
 
 void
 ghb_inhibit_gpm()
@@ -4183,65 +4490,6 @@ ghb_uninhibit_gsm()
 #endif
 }
 
-void
-ghb_hal_init()
-{
-#if !defined(_WIN32)
-       DBusGConnection *gconn;
-       DBusConnection *conn;
-       GError *gerror = NULL;
-       DBusError error;
-       char **devices;
-       int nr;
-
-       dbus_init ();
-
-       if (!(hal_ctx = libhal_ctx_new ())) {
-               g_warning ("failed to create a HAL context!");
-               return;
-       }
-
-       gconn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &gerror);
-       if (gerror != NULL)
-       {
-               g_warning("DBUS cannot connect: %s", gerror->message);
-               g_error_free(gerror);
-               return;
-       }
-       conn = dbus_g_connection_get_connection(gconn);
-       libhal_ctx_set_dbus_connection (hal_ctx, conn);
-       dbus_error_init (&error);
-       if (!libhal_ctx_init (hal_ctx, &error)) {
-               g_warning ("libhal_ctx_init failed: %s", error.message ? error.message : "unknown");
-               dbus_error_free (&error);
-               libhal_ctx_free (hal_ctx);
-               dbus_g_connection_unref(gconn);
-               hal_ctx = NULL;
-               return;
-       }
-
-       /*
-        * Do something to ping the HAL daemon - the above functions will
-        * succeed even if hald is not running, so long as DBUS is.  But we
-        * want to exit silently if hald is not running, to behave on
-        * pre-2.6 systems.
-        */
-       if (!(devices = libhal_get_all_devices (hal_ctx, &nr, &error))) {
-               g_warning ("seems that HAL is not running: %s", error.message ? error.message : "unknown");
-               dbus_error_free (&error);
-
-               libhal_ctx_shutdown (hal_ctx, NULL);
-               libhal_ctx_free (hal_ctx);
-               hal_ctx = NULL;
-               dbus_g_connection_unref(gconn);
-               return;
-       }
-
-       libhal_free_string_array (devices);
-       dbus_g_connection_unref(gconn);
-#endif
-}
-
 G_MODULE_EXPORT gboolean 
 tweak_setting_cb(
        GtkWidget *widget, 
@@ -4262,7 +4510,7 @@ tweak_setting_cb(
                GtkResponseType response;
                gchar *tweak = NULL;
 
-               name = gtk_widget_get_name(widget);
+               name = ghb_get_setting_key(widget);
                if (g_str_has_prefix(name, "tweak_"))
                {
                        tweak_name = g_strdup(name);
@@ -4359,35 +4607,36 @@ format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
 G_MODULE_EXPORT gchar*
 format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
 {
-       gdouble percent;
-
        gint vcodec = ghb_settings_combo_int(ud->settings, "VideoEncoder");
        switch (vcodec)
        {
                case HB_VCODEC_X264:
                {
-                       percent = 100. * (51 - val) / 51.;
-                       return g_strdup_printf("RF: %.4g (%.0f%%)", val, percent);
+                       if (val == 0.0)
+                       {
+                               return g_strdup_printf("RF: %.4g (Warning: lossless)", val);
+                       }
+                       else
+                       {
+                               return g_strdup_printf("RF: %.4g", val);
+                       }
                } break;
 
                case HB_VCODEC_FFMPEG:
                {
-                       percent = 100. * (30 - (val - 1)) / 30.;
-                       return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent);
+                       return g_strdup_printf("QP: %d", (int)val);
                } break;
 
                case HB_VCODEC_THEORA:
                {
-                       percent = 100. * val / 63.;
-                       return g_strdup_printf("QP: %d (%.0f%%)", (int)val, percent);
+                       return g_strdup_printf("QP: %d", (int)val);
                } break;
 
                default:
                {
-                       percent = 0;
                } break;
        }
-       return g_strdup_printf("QP: %.1f / %.1f%%", val, percent);
+       return g_strdup_printf("QP: %.4g", val);
 }
 
 static void
@@ -4421,6 +4670,7 @@ process_appcast(signal_user_data_t *ud)
        gtk_label_set_text(GTK_LABEL(label), msg);
 
 #if !defined(_WIN32)
+#if !defined(_NO_UPDATE_CHECK)
        if (html == NULL)
        {
                html = webkit_web_view_new();
@@ -4432,6 +4682,7 @@ process_appcast(signal_user_data_t *ud)
        }
        webkit_web_view_open(WEBKIT_WEB_VIEW(html), description);
 #endif
+#endif
        dialog = GHB_WIDGET(ud->builder, "update_dialog");
        response = gtk_dialog_run(GTK_DIALOG(dialog));
        gtk_widget_hide(dialog);
@@ -4487,7 +4738,10 @@ ghb_net_recv_cb(GIOChannel *ioc, GIOCondition cond, gpointer data)
        }
        if (status == G_IO_STATUS_EOF)
        {
-               ud->appcast[ud->appcast_len] = 0;
+               if ( ud->appcast != NULL )
+               {
+                       ud->appcast[ud->appcast_len] = 0;
+               }
                ghb_net_close(ioc);
                process_appcast(ud);
                return FALSE;
@@ -4649,7 +4903,7 @@ ghb_notify_done(signal_user_data_t *ud)
                        ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
                                "Your encode is complete.",
                                "Shutting down the computer", 
-                               "Cancel", (GSourceFunc)shutdown_cb, 60);
+                               "Cancel", (GSourceFunc)shutdown_cb, ud, 60);
                }
        }
        if (ghb_settings_combo_int(ud->settings, "WhenComplete") == 2)
@@ -4659,7 +4913,14 @@ ghb_notify_done(signal_user_data_t *ud)
                        ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
                                "Your encode is complete.",
                                "Putting computer to sleep", 
-                               "Cancel", (GSourceFunc)suspend_cb, 60);
+                               "Cancel", (GSourceFunc)suspend_cb, ud, 60);
                }
        }
+       if (ghb_settings_combo_int(ud->settings, "WhenComplete") == 4)
+       {
+               ghb_countdown_dialog(GTK_MESSAGE_WARNING, 
+                                                       "Your encode is complete.",
+                                                       "Quiting Handbrake", 
+                                                       "Cancel", (GSourceFunc)quit_cb, ud, 60);
+       }
 }
index a124ab5..2ebcf93 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * callbacks.h
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * callbacks.h is free software.
  * 
@@ -41,7 +41,7 @@ void debug_log_handler(
        const gchar *domain, GLogLevelFlags flags, const gchar *msg, gpointer ud);
 void ghb_hbfd(signal_user_data_t *ud, gboolean hbfd);
 gboolean ghb_file_menu_add_dvd(signal_user_data_t *ud);
-void ghb_hal_init(void);
+void ghb_udev_init(void);
 gboolean ghb_message_dialog(
        GtkMessageType type, const gchar *message, 
        const gchar *no, const gchar *yes);
@@ -66,6 +66,7 @@ gpointer ghb_cache_volnames(signal_user_data_t *ud);
 void ghb_volname_cache_init(void);
 void ghb_update_destination_extension(signal_user_data_t *ud);
 void ghb_update_pending(signal_user_data_t *ud);
+gboolean ghb_idle_scan(signal_user_data_t *ud);
 
 #endif // _CALLBACKS_H_
 
index b91def6..3a979bd 100644 (file)
@@ -7,6 +7,8 @@
 #include "icon_tools.h"
 #include "plist.h"
 #include "values.h"
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk-pixbuf/gdk-pixdata.h>
 
 enum
 {
@@ -177,12 +179,42 @@ start_element(
                        if (filename && name)
                        {
                                ghb_rawdata_t *rd;
-                               guint size;
+                               GdkPixbuf *pb;
+                               GError *err = NULL;
+
+                               pb = gdk_pixbuf_new_from_file(filename, &err);
+                               if (pb == NULL)
+                               {
+                                       g_warning("Failed to open icon file %s: %s", filename, err->message);
+                                       break;
+                               }
+                               gval = ghb_dict_value_new();
+                               int colorspace = gdk_pixbuf_get_colorspace(pb);
+                               gboolean alpha = gdk_pixbuf_get_has_alpha(pb);
+                               int width = gdk_pixbuf_get_width(pb);
+                               int height = gdk_pixbuf_get_height(pb);
+                               int bps = gdk_pixbuf_get_bits_per_sample(pb);
+                               int rowstride = gdk_pixbuf_get_rowstride(pb);
+
+                               ghb_dict_insert(gval, g_strdup("colorspace"), 
+                                                               ghb_int_value_new(colorspace));
+                               ghb_dict_insert(gval, g_strdup("alpha"), 
+                                                               ghb_boolean_value_new(alpha));
+                               ghb_dict_insert(gval, g_strdup("width"), 
+                                                               ghb_int_value_new(width));
+                               ghb_dict_insert(gval, g_strdup("height"), 
+                                                               ghb_int_value_new(height));
+                               ghb_dict_insert(gval, g_strdup("bps"), 
+                                                               ghb_int_value_new(bps));
+                               ghb_dict_insert(gval, g_strdup("rowstride"), 
+                                                               ghb_int_value_new(rowstride));
 
                                rd = g_malloc(sizeof(ghb_rawdata_t));
-                               rd->data = icon_file_serialize(filename, &size);
-                               rd->size = size;
-                               gval = ghb_rawdata_value_new(rd);
+                               rd->data = gdk_pixbuf_get_pixels(pb);
+                               rd->size = height * rowstride * bps / 8;
+                               GValue *data = ghb_rawdata_value_new(rd);
+                               ghb_dict_insert(gval, g_strdup("data"), data);
+
                                if (pd->key) g_free(pd->key);
                                pd->key = g_strdup(name);
                                g_free(filename);
index 69d9e7d..5d21ba8 100644 (file)
@@ -1,7 +1,6 @@
 #! /bin/python
 #
 
-import gtk
 import types
 import os
 import sys
@@ -10,7 +9,7 @@ import datetime
 import plistlib
 import getopt
 from xml.parsers import expat
-
+from gtk import gdk
 
 pl = dict()
 stack = list()
@@ -41,7 +40,7 @@ def start_element_handler(tag, attr):
                key = attr["name"]
                if fname != None and key != None:
                        val = dict()
-                       pb = gtk.gdk.pixbuf_new_from_file(fname)
+                       pb = gdk.pixbuf_new_from_file(fname)
                        val["colorspace"] = pb.get_colorspace()
                        val["alpha"] = pb.get_has_alpha()
                        val["bps"] = pb.get_bits_per_sample()
index 1d3422c..32f77f2 100644 (file)
@@ -2,7 +2,7 @@
  *            ghb-dvd.c
  *
  *  Sat Apr 19 11:12:53 2008
- *  Copyright  2008  John Stebbins
+ *  Copyright  2008-2011  John Stebbins
  *  <john at stebbins dot name>
  ****************************************************************************/
 
index 226e686..77b5d78 100644 (file)
@@ -66,7 +66,7 @@
     <property name="value">0</property>
   </object>
   <object class="GtkAdjustment" id="adjustment17">
-    <property name="upper">2000</property>
+    <property name="upper">8000</property>
     <property name="lower">0</property>
     <property name="page_increment">16</property>
     <property name="step_increment">2</property>
@@ -74,7 +74,7 @@
     <property name="value">0</property>
   </object>
   <object class="GtkAdjustment" id="adjustment18">
-    <property name="upper">1200</property>
+    <property name="upper">8000</property>
     <property name="lower">0</property>
     <property name="page_increment">16</property>
     <property name="step_increment">2</property>
     <property name="page_size">0</property>
     <property name="value">20.25</property>
   </object>
-  <object class="GtkAdjustment" id="adjustment6">
-    <property name="upper">4</property>
-    <property name="lower">0</property>
-    <property name="page_increment">1</property>
-    <property name="step_increment">0.2</property>
-    <property name="page_size">0</property>
-    <property name="value">2.6</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment7">
-    <property name="upper">4</property>
-    <property name="lower">1</property>
-    <property name="page_increment">0.20000000000000001</property>
-    <property name="step_increment">0.20000000000000001</property>
-    <property name="page_size">0</property>
-    <property name="value">2.3999999999999999</property>
-  </object>
   <object class="GtkAdjustment" id="adjustment8">
     <property name="upper">16</property>
-    <property name="lower">0</property>
+    <property name="lower">1</property>
     <property name="page_increment">1</property>
     <property name="step_increment">1</property>
     <property name="page_size">0</property>
     <property name="page_size">0</property>
   </object>
   <object class="GtkAdjustment" id="adjustment22">
-    <property name="upper">1</property>
+    <property name="upper">2</property>
     <property name="lower">0</property>
     <property name="page_increment">0.5</property>
     <property name="step_increment">0.1</property>
     <property name="upper">1</property>
     <property name="lower">0</property>
     <property name="page_increment">0.5</property>
-    <property name="step_increment">0.1</property>
+    <property name="step_increment">0.05</property>
     <property name="page_size">0</property>
     <property name="value">0</property>
   </object>
   </object>
   <object class="GtkAdjustment" id="adjustment29">
     <property name="upper">2000</property>
-    <property name="lower">0</property>
+    <property name="lower">1</property>
     <property name="page_increment">16</property>
     <property name="step_increment">1</property>
     <property name="page_size">0</property>
   </object>
   <object class="GtkAdjustment" id="adjustment30">
     <property name="upper">2000</property>
-    <property name="lower">0</property>
+    <property name="lower">1</property>
     <property name="page_increment">16</property>
     <property name="step_increment">1</property>
     <property name="page_size">0</property>
     <property name="page_size">0</property>
     <property name="value">0</property>
   </object>
+  <object class="GtkAdjustment" id="adjustment32">
+    <property name="upper">8000</property>
+    <property name="lower">0</property>
+    <property name="page_increment">16</property>
+    <property name="step_increment">2</property>
+    <property name="page_size">0</property>
+    <property name="value">0</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment33">
+    <property name="upper">8000</property>
+    <property name="lower">0</property>
+    <property name="page_increment">16</property>
+    <property name="step_increment">2</property>
+    <property name="page_size">0</property>
+    <property name="value">0</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment34">
+    <property name="upper">2</property>
+    <property name="lower">0</property>
+    <property name="page_increment">0.5</property>
+    <property name="step_increment">0.1</property>
+    <property name="page_size">0</property>
+    <property name="value">1</property>
+  </object>
   <object class="GtkAdjustment" id="preview_progress_adj">
     <property name="upper">100</property>
     <property name="lower">0</property>
     <property name="page_size">0</property>
     <property name="value">10</property>
   </object>
+  <object class="GtkAdjustment" id="min_title_adj">
+    <property name="upper">7200</property>
+    <property name="lower">0</property>
+    <property name="page_increment">10</property>
+    <property name="step_increment">5</property>
+    <property name="page_size">0</property>
+    <property name="value">10</property>
+  </object>
   <object class="GtkImage" id="subtitle_add_image">
     <property name="visible">True</property>
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         </child>
         <child>
           <object class="GtkAction" id="source_single_action">
-            <property name="icon-name">gtk-open</property>
+            <property name="stock_id">gtk-open</property>
             <property name="name">source_single_action</property>
             <property name="label">Single _Title</property>
             <signal handler="single_title_source_cb" name="activate"/>
     <signal handler="window_delete_event_cb" name="delete_event"/>
     <child>
       <object class="GtkVBox" id="vbox48">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <child>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <child>
           <object class="GtkVBox" id="vbox14">
+            <property name="orientation">vertical</property>
             <property name="visible">True</property>
             <child>
               <object class="GtkVBox" id="vbox15">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkAlignment" id="alignment1">
                     <property name="xscale">1</property>
                     <child>
                       <object class="GtkVBox" id="vbox16">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
-                        <property name="spacing">6</property>
+                        <property name="spacing">2</property>
                         <child>
                           <object class="GtkHBox" id="hbox54">
                             <property name="visible">True</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkAlignment" id="alignment65">
+                          <object class="GtkTable" id="table7">
                             <property name="visible">True</property>
-                            <property name="left_padding">6</property>
-                            <property name="bottom_padding">6</property>
+                            <property name="n_rows">2</property>
+                            <property name="n_columns">2</property>
+                            <property name="column-spacing">5</property>
                             <child>
-                              <object class="GtkHBox" id="hbox5">
+                              <object class="GtkAlignment" id="alignment72">
                                 <property name="visible">True</property>
-                                <property name="spacing">4</property>
+                                <property name="top_padding">6</property>
+                                <property name="left_padding">6</property>
                                 <child>
                                   <object class="GtkLabel" id="label20">
                                     <property name="visible">True</property>
-                                    <property name="label" translatable="yes">Title</property>
+                                    <property name="xalign">0.1</property>
+                                    <property name="label" translatable="yes">Title:</property>
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                  </packing>
                                 </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">0</property>
+                                <property name="right_attach">1</property>
+                                <property name="top_attach">0</property>
+                                <property name="bottom_attach">1</property>
+                                <property name="x_options">GTK_FILL</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox42">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="spacing">5</property>
+
+                                <child>
+                                  <object class="GtkAlignment" id="alignment75">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="xscale">0</property>
+                                    <property name="yscale">0</property>
                                 <child>
                                   <object class="GtkComboBox" id="title">
                                     <property name="visible">True</property>
                                     <property name="tooltip-text" translatable="yes">Set the title to encode. By default the longest title is chosen.  This is often the feature title of a DVD.</property>
                                     <signal handler="title_changed_cb" name="changed"/>
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">1</property>
-                                  </packing>
                                 </child>
-                                <child>
-                                  <object class="GtkAlignment" id="chapter_box">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="xalign">0</property>
-                                    <property name="xscale">0</property>
-                                    <property name="left_padding">8</property>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox4">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label4">
-                                            <property name="visible">True</property>
-                                            <property name="label" translatable="yes">Chapters</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkSpinButton" id="start_chapter">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Set the first chapter to encode.</property>
-                                            <property name="adjustment">adjustment1</property>
-                                            <signal handler="start_chapter_changed_cb" name="value_changed"/>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="label5">
-                                            <property name="visible">True</property>
-                                            <property name="label" translatable="yes"> through </property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                            <property name="position">2</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkSpinButton" id="end_chapter">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Set the last chapter to encode.</property>
-                                            <property name="adjustment">adjustment2</property>
-                                            <signal handler="end_chapter_changed_cb" name="value_changed"/>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">3</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                    </child>
+
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">2</property>
-                                  </packing>
                                 </child>
+
                                 <child>
-                                  <object class="GtkAlignment" id="alignment47">
+                                  <object class="GtkAlignment" id="alignment73">
                                     <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="xalign">0</property>
+                                    <property name="xalign">1</property>
                                     <property name="xscale">0</property>
-                                    <property name="left_padding">8</property>
+                                    <property name="yscale">0</property>
                                     <child>
                                       <object class="GtkHBox" id="hbox44">
                                         <property name="visible">True</property>
                                           <packing>
                                             <property name="expand">False</property>
                                             <property name="fill">False</property>
-                                            <property name="position">4</property>
+                                            <property name="position">0</property>
                                           </packing>
                                         </child>
                                         <child>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
-                                            <property name="position">5</property>
+                                            <property name="position">1</property>
                                           </packing>
                                         </child>
                                       </object>
                                     </child>
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="position">3</property>
-                                  </packing>
                                 </child>
+                              </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">0</property>
+                                <property name="bottom_attach">1</property>
+                              </packing>
+                            </child>
+
+                            <child>
+                              <object class="GtkAlignment" id="alignment74">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="xscale">0</property>
+                                <property name="yscale">0</property>
                                 <child>
-                                  <object class="GtkAlignment" id="alignment41">
+                                  <object class="GtkHBox" id="hbox48">
                                     <property name="visible">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="xalign">0</property>
-                                    <property name="xscale">0</property>
-                                    <property name="left_padding">8</property>
+                                    <property name="spacing">5</property>
+
+                                    <child>
+                                      <object class="GtkComboBox" id="PtoPType">
+                                        <property name="visible">True</property>
+                                        <property name="tooltip-text" translatable="yes">Range of title to encode. Can be chapters, seconds, or frames.</property>
+                                        <signal handler="ptop_widget_changed_cb" name="changed"/>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
                                     <child>
-                                      <object class="GtkHBox" id="hbox42">
+                                      <object class="GtkSpinButton" id="start_point">
                                         <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="spacing">7</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label6">
-                                            <property name="visible">True</property>
-                                            <property name="xalign">0.10000000149011612</property>
-                                            <property name="label" translatable="yes">Duration:</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="title_duration">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">hh:mm:ss</property>
-                                            <property name="width_chars">8</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
+                                        <property name="tooltip-text" translatable="yes">Set the first chapter to encode.</property>
+                                        <property name="adjustment">adjustment1</property>
+                                        <signal handler="start_point_changed_cb" name="value_changed"/>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="label56">
+                                        <property name="visible">True</property>
+                                        <property name="label" translatable="yes">through</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">2</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkSpinButton" id="end_point">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">True</property>
+                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                        <property name="tooltip-text" translatable="yes">Set the last chapter to encode.</property>
+                                        <property name="adjustment">adjustment2</property>
+                                        <signal handler="end_point_changed_cb" name="value_changed"/>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">3</property>
+                                      </packing>
+                                    </child>
+                                <child>
+                                  <object class="GtkHBox" id="hbox47">
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="spacing">7</property>
+                                    <child>
+                                      <object class="GtkLabel" id="label6">
+                                        <property name="visible">True</property>
+                                        <property name="xalign">0.1</property>
+                                        <property name="label" translatable="yes">Duration:</property>
+                                      </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
+                                    </child>
+                                    <child>
+                                      <object class="GtkLabel" id="title_duration">
+                                        <property name="visible">True</property>
+                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                        <property name="xalign">0</property>
+                                        <property name="label" translatable="yes">hh:mm:ss</property>
+                                        <property name="width_chars">8</property>
                                       </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
                                     </child>
                                   </object>
                                   <packing>
                                     <property name="position">4</property>
                                   </packing>
                                 </child>
+                                  </object>
+                                </child>
                               </object>
+                              <packing>
+                                <property name="left_attach">1</property>
+                                <property name="right_attach">2</property>
+                                <property name="top_attach">1</property>
+                                <property name="bottom_attach">2</property>
+                              </packing>
                             </child>
                           </object>
                           <packing>
                             <property name="visible">True</property>
                             <property name="spacing">12</property>
                             <child>
-                              <object class="GtkTable" id="table3">
+                              <object class="GtkTable" id="table4">
                                 <property name="visible">True</property>
                                 <property name="n_rows">2</property>
                                 <property name="n_columns">2</property>
                                 <child>
                                   <object class="GtkFileChooserButton" id="dest_dir">
                                     <property name="visible">True</property>
+                                    <property name="local-only">False</property>
                                     <property name="action">GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER</property>
                                     <property name="title" translatable="yes">Destination Directory</property>
                                     <property name="tooltip-text" translatable="yes">Destination directory for your encode.</property>
                         <property name="top_padding">10</property>
                         <property name="left_padding">10</property>
 
+                                               <child>
+                                                 <object class="GtkVBox" id="vbox43">
+                                                       <property name="orientation">vertical</property>
+                                                       <property name="visible">True</property>
+                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                       <property name="spacing">14</property>
+                                                       <child>
+                                                         <object class="GtkFrame" id="frame5">
+                                                               <property name="visible">True</property>
+                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                               <property name="label_xalign">0</property>
+                                                               <property name="shadow_type">GTK_SHADOW_NONE</property>
+                                                               <child>
+                                                                 <object class="GtkAlignment" id="alignment9">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="top_padding">6</property>
+                                                                       <property name="bottom_padding">2</property>
+                                                                       <property name="left_padding">12</property>
+                                                                       <child>
+                                                                         <object class="GtkTable" id="table11">
+                                                                               <property name="visible">True</property>
+                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                               <property name="n_rows">3</property>
+                                                                               <property name="n_columns">2</property>
+                                                                               <property name="homogeneous">True</property>
+
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label23">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Dimensions:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="source_dimensions">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label42">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Aspect: </property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="source_aspect">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label43">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Frame Rate:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="source_frame_rate">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                         </object>
+                                                                       </child>
+                                                                 </object>
+                                                               </child>
+                                                               <child type="label">
+                                                                 <object class="GtkLabel" id="label44">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="label" translatable="yes">&lt;b&gt;Source Picture Parameters&lt;/b&gt;</property>
+                                                                       <property name="use_markup">True</property>
+                                                                 </object>
+                                                               </child>
+                                                         </object>
+                                                         <packing>
+                                                               <property name="expand">False</property>
+                                                               <property name="padding">2</property>
+                                                         </packing>
+                                                       </child>
+                                                       <child>
+                                                         <object class="GtkFrame" id="Cropping1">
+                                                               <property name="visible">True</property>
+                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                               <property name="label_xalign">0</property>
+                                                               <property name="shadow_type">GTK_SHADOW_NONE</property>
+                                                               <child>
+                                                                 <object class="GtkAlignment" id="alignment52">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="top_padding">6</property>
+                                                                       <property name="bottom_padding">2</property>
+                                                                       <property name="left_padding">12</property>
+                                                                       <property name="right_padding">2</property>
+                                                                       <child>
+                                                                         <object class="GtkTable" id="table12">
+                                                                               <property name="visible">True</property>
+                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                               <property name="n_rows">3</property>
+                                                                               <property name="n_columns">2</property>
+                                                                               <property name="homogeneous">True</property>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label13">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Autocrop:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="crop_auto">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="label" translatable="yes">On</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label12">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Crop:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="crop_values">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label76">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Crop Dimensions:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="crop_dimensions">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                         </object>
+                                                                       </child>
+                                                                 </object>
+                                                               </child>
+                                                               <child type="label">
+                                                                 <object class="GtkLabel" id="label16">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="label" translatable="yes">&lt;b&gt;Cropping&lt;/b&gt;</property>
+                                                                       <property name="use_markup">True</property>
+                                                                 </object>
+                                                               </child>
+                                                         </object>
+                                                         <packing>
+                                                               <property name="expand">False</property>
+                                                               <property name="padding">2</property>
+                                                               <property name="position">1</property>
+                                                         </packing>
+                                                       </child>
+                                                       <child>
+                                                         <object class="GtkFrame" id="frame16">
+                                                               <property name="visible">True</property>
+                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                               <property name="label_xalign">0</property>
+                                                               <property name="shadow_type">GTK_SHADOW_NONE</property>
+                                                               <child>
+                                                                 <object class="GtkAlignment" id="alignment20">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="top_padding">6</property>
+                                                                       <property name="bottom_padding">2</property>
+                                                                       <property name="left_padding">12</property>
+                                                                       <property name="right_padding">2</property>
+                                                                       <child>
+                                                                         <object class="GtkTable" id="table13">
+                                                                               <property name="visible">True</property>
+                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                               <property name="n_rows">3</property>
+                                                                               <property name="n_columns">2</property>
+                                                                               <property name="homogeneous">True</property>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label14">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Scale Dimensions:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="scale_dimensions">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="label" translatable="yes">--</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">0</property>
+                                                                                       <property name="bottom_attach">1</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label15">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Optimal for Source:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="scale_auto">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="label" translatable="yes">On</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">1</property>
+                                                                                       <property name="bottom_attach">2</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="label17">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="xalign">0</property>
+                                                                                       <property name="label" translatable="yes">Anamorphic:</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">0</property>
+                                                                                       <property name="right_attach">1</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                               <child>
+                                                                                 <object class="GtkLabel" id="scale_anamorphic">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="label" translatable="yes">On</property>
+                                                                                 </object>
+                                                                                 <packing>
+                                                                                       <property name="left_attach">1</property>
+                                                                                       <property name="right_attach">2</property>
+                                                                                       <property name="top_attach">2</property>
+                                                                                       <property name="bottom_attach">3</property>
+                                                                                       <property name="x_options">GTK_EXPAND|GTK_FILL</property>
+                                                                                 </packing>
+                                                                               </child>
+                                                                         </object>
+                                                                       </child>
+                                                                 </object>
+                                                               </child>
+                                                               <child type="label">
+                                                                 <object class="GtkLabel" id="label19">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                       <property name="label" translatable="yes">&lt;b&gt;Scaling&lt;/b&gt;</property>
+                                                                       <property name="use_markup">True</property>
+                                                                 </object>
+                                                               </child>
+                                                         </object>
+                                                         <packing>
+                                                               <property name="expand">False</property>
+                                                               <property name="padding">2</property>
+                                                         </packing>
+                                                       </child>
+                                                 </object>
+                                               </child>
+
+                      </object>
+                      <packing>
+                                               <property name="expand">True</property>
+                                               <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
                     <child>
-                      <object class="GtkVBox" id="vbox43">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                       <property name="spacing">14</property>
-                        <child>
-                          <object class="GtkFrame" id="frame5">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">GTK_SHADOW_NONE</property>
-                            <child>
-                              <object class="GtkAlignment" id="alignment9">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <child>
-                                  <object class="GtkVBox" id="vbox11">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox14">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label23">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Dimensions:</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="source_dimensions">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="label" translatable="yes">--</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox15">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label42">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Aspect: </property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="source_aspect">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="label" translatable="yes">--</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox16">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label43">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Frame Rate:</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="source_frame_rate">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="label" translatable="yes">--</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">2</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label44">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Source Picture Parameters&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame" id="Cropping1">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">GTK_SHADOW_NONE</property>
-                            <child>
-                              <object class="GtkAlignment" id="alignment52">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <property name="right_padding">2</property>
-                                <child>
-                                  <object class="GtkVBox" id="vbox44">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox61">
-                                        <property name="visible">True</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label13">
-                                            <property name="visible">True</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Autocrop:</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="crop_auto">
-                                            <property name="visible">True</property>
-                                            <property name="label" translatable="yes">On</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox55">
-                                        <property name="visible">True</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label12">
-                                            <property name="visible">True</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Crop:</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="crop_values">
-                                            <property name="visible">True</property>
-                                            <property name="label" translatable="yes">--</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox10">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label76">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Crop Dimensions:</property>
-                                            <property name="width_chars">15</property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="crop_dimensions">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="label" translatable="yes">--</property>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">2</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label16">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Cropping&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">2</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkVBox" id="vbox45">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <child>
-                              <object class="GtkFrame" id="frame16">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label_xalign">0</property>
-                                <property name="shadow_type">GTK_SHADOW_NONE</property>
-                                <child>
-                                  <object class="GtkAlignment" id="alignment20">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="top_padding">6</property>
-                                    <property name="bottom_padding">2</property>
-                                    <property name="left_padding">12</property>
-                                    <property name="right_padding">2</property>
-                                    <child>
-                                      <object class="GtkVBox" id="vbox46">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkHBox" id="hbox11">
-                                            <property name="visible">True</property>
-                                            <child>
-                                              <object class="GtkLabel" id="label14">
-                                                <property name="visible">True</property>
-                                                <property name="xalign">0</property>
-                                                <property name="label" translatable="yes">Scale Dimensions:</property>
-                                                <property name="width_chars">15</property>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkLabel" id="scale_dimensions">
-                                                <property name="visible">True</property>
-                                                <property name="label" translatable="yes">--</property>
-                                              </object>
-                                              <packing>
-                                                <property name="position">1</property>
-                                              </packing>
-                                            </child>
-                                          </object>
-                                        </child>
-                                        <child>
-                                          <object class="GtkHBox" id="hbox68">
-                                            <property name="visible">True</property>
-                                            <child>
-                                              <object class="GtkLabel" id="label15">
-                                                <property name="visible">True</property>
-                                                <property name="xalign">0</property>
-                                                <property name="label" translatable="yes">Optimal for Source:</property>
-                                                <property name="width_chars">15</property>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkLabel" id="scale_auto">
-                                                <property name="visible">True</property>
-                                                <property name="label" translatable="yes">On</property>
-                                              </object>
-                                              <packing>
-                                                <property name="position">1</property>
-                                              </packing>
-                                            </child>
-                                          </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkHBox" id="hbox69">
-                                            <property name="visible">True</property>
-                                            <child>
-                                              <object class="GtkLabel" id="label17">
-                                                <property name="visible">True</property>
-                                                <property name="xalign">0</property>
-                                                <property name="label" translatable="yes">Anamorphic:</property>
-                                                <property name="width_chars">15</property>
-                                              </object>
-                                              <packing>
-                                                <property name="expand">False</property>
-                                              </packing>
-                                            </child>
-                                            <child>
-                                              <object class="GtkLabel" id="scale_anamorphic">
-                                                <property name="visible">True</property>
-                                                <property name="label" translatable="yes">On</property>
-                                              </object>
-                                              <packing>
-                                                <property name="position">1</property>
-                                              </packing>
-                                            </child>
-                                          </object>
-                                          <packing>
-                                            <property name="position">2</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child type="label">
-                                  <object class="GtkLabel" id="label19">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="label" translatable="yes">&lt;b&gt;Scaling&lt;/b&gt;</property>
-                                    <property name="use_markup">True</property>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="padding">2</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                      </object>
-                    </child>
-
-                      </object>
-                      <packing>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-
-                    <child>
-                      <object class="GtkAlignment" id="alignment56">
+                      <object class="GtkAlignment" id="alignment56">
                         <property name="visible">True</property>
                         <property name="right_padding">12</property>
                         <property name="top_padding">12</property>
+                                               <child>
+                                                 <object class="GtkVBox" id="vbox9">
+                                                       <property name="orientation">vertical</property>
+                                                       <property name="visible">True</property>
+                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                       <child>
+                                                         <object class="GtkFrame" id="frame8">
+                                                               <property name="visible">True</property>
+                                                               <property name="label_xalign">0</property>
+                                                               <property name="shadow_type">none</property>
+                                                               <child>
+                                                                 <object class="GtkAlignment" id="alignment19">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="bottom_padding">4</property>
+                                                                       <property name="left_padding">4</property>
+                                                                       <property name="right_padding">4</property>
+                                                                       <child>
+                                                                         <object class="GtkImage" id="preview_button_image">
+                                                                               <property name="width_request">400</property>
+                                                                               <property name="height_request">200</property>
+                                                                               <property name="visible">True</property>
+                                                                               <property name="icon_name">hb-icon</property>
+                                                                               <property name="icon-size">6</property>
+                                                                               <signal name="size_allocate" handler="preview_button_size_allocate_cb"/>
+                                                                         </object>
+                                                                       </child>
+                                                                 </object>
+                                                               </child>
+                                                         </object>
+                                                         <packing>
+                                                               <property name="expand">False</property>
+                                                               <property name="fill">False</property>
+                                                               <property name="position">1</property>
+                                                         </packing>
+                                                       </child>
+                                                       <child>
+                                                         <object class="GtkAlignment" id="alignment57">
+                                                               <property name="visible">True</property>
+                                                               <property name="xscale">0</property>
+                                                               <property name="yscale">0</property>
+                                                               <child>
+                                                                 <object class="GtkHBox" id="hbox7">
+                                                                       <property name="visible">True</property>
+                                                                       <property name="spacing">4</property>
+                                                                       <child>
+                                                                         <object class="GtkLabel" id="label10">
+                                                                               <property name="visible">True</property>
+                                                                               <property name="label" translatable="yes">Presentation Dimensions:</property>
+                                                                               <property name="justify">right</property>
+                                                                         </object>
+                                                                         <packing>
+                                                                               <property name="expand">False</property>
+                                                                               <property name="position">0</property>
+                                                                         </packing>
+                                                                       </child>
+                                                                       <child>
+                                                                         <object class="GtkLabel" id="preview_dims">
+                                                                               <property name="width_request">85</property>
+                                                                               <property name="visible">True</property>
+                                                                               <property name="xalign">0.2</property>
+                                                                               <property name="yalign">0</property>
+                                                                               <property name="label" translatable="yes">--</property>
+                                                                         </object>
+                                                                         <packing>
+                                                                               <property name="expand">False</property>
+                                                                               <property name="position">1</property>
+                                                                         </packing>
+                                                                       </child>
 
-                    <child>
-                      <object class="GtkVBox" id="vbox9">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-
-                        <child>
-                          <object class="GtkFrame" id="frame8">
-                            <property name="visible">True</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
-                            <child>
-                              <object class="GtkAlignment" id="alignment19">
-                                <property name="visible">True</property>
-                                <property name="bottom_padding">4</property>
-                                <property name="left_padding">4</property>
-                                <property name="right_padding">4</property>
-                                <child>
-                                  <object class="GtkImage" id="preview_button_image">
-                                    <property name="width_request">400</property>
-                                    <property name="height_request">200</property>
-                                    <property name="visible">True</property>
-                                    <property name="icon_name">hb-icon</property>
-                                    <property name="icon-size">6</property>
-                                    <signal name="size_allocate" handler="preview_button_size_allocate_cb"/>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-
-                    <child>
-                      <object class="GtkAlignment" id="alignment57">
-                        <property name="visible">True</property>
-                        <property name="xscale">0</property>
-                        <property name="yscale">0</property>
-                        <child>
-                          <object class="GtkHBox" id="hbox7">
-                            <property name="visible">True</property>
-                            <property name="spacing">4</property>
-                            <child>
-                              <object class="GtkLabel" id="label10">
-                                <property name="visible">True</property>
-                                <property name="label" translatable="yes">Presentation Dimensions:</property>
-                                <property name="justify">right</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="position">0</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkLabel" id="preview_dims">
-                                <property name="width_request">85</property>
-                                <property name="visible">True</property>
-                                <property name="xalign">0.2</property>
-                                <property name="yalign">0</property>
-                                <property name="label" translatable="yes">--</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-
-                          </object>
-                        </child>
-
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
-
-                      </object>
-                    </child>
-
+                                                                 </object>
+                                                               </child>
+                                                         </object>
+                                                         <packing>
+                                                               <property name="expand">False</property>
+                                                               <property name="fill">False</property>
+                                                               <property name="position">2</property>
+                                                         </packing>
+                                                       </child>
+                                                 </object>
+                                               </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
-
                   </object>
                 </child>
                 <child type="tab">
                   <object class="GtkLabel" id="picture_label">
                     <property name="visible">True</property>
-                    <property name="label" translatable="yes">Picture</property>
+                    <property name="label" translatable="yes">Summary</property>
                   </object>
                   <packing>
                     <property name="tab_fill">False</property>
                         <property name="left_padding">24</property>
                         <child>
                           <object class="GtkVBox" id="vbox13">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="spacing">4</property>
                               </packing>
                             </child>
                             <child>
+                              <object class="GtkCheckButton" id="VideoFrameratePFR">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="tooltip-text" translatable="yes">Enables variable framerate output with a peak rate determined by the framerate setting</property>
+                                <property name="label" translatable="yes">Peak Framerate (VFR)</property>
+                                <property name="draw_indicator">True</property>
+                                <signal handler="setting_widget_changed_cb" name="toggled"/>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
                               <object class="GtkCheckButton" id="VideoTwoPass">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
-                                <property name="position">2</property>
+                                <property name="position">3</property>
                               </packing>
                             </child>
                             <child>
                               </object>
                               <packing>
                                 <property name="expand">False</property>
-                                <property name="position">3</property>
+                                <property name="position">4</property>
                               </packing>
                             </child>
                           </object>
                         <property name="right_padding">24</property>
                         <child>
                           <object class="GtkVBox" id="vbox47">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <child>
@@ -1955,6 +2001,7 @@ FFmpeg's and Theora's scale is more linear.  These encoders do not have a lossle
                 </child>
                 <child>
                   <object class="GtkVBox" id="audio_tab">
+                    <property name="orientation">vertical</property>
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                     <child>
@@ -1967,6 +2014,7 @@ FFmpeg's and Theora's scale is more linear.  These encoders do not have a lossle
                         <property name="right_padding">2</property>
                         <child>
                           <object class="GtkVBox" id="vbox17">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="spacing">2</property>
@@ -2258,6 +2306,7 @@ For source audio that has a wide dynamic range (very loud and very soft sequence
                 </child>
                 <child>
                   <object class="GtkVBox" id="subtitle_tab">
+                    <property name="orientation">vertical</property>
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                     <child>
@@ -2270,6 +2319,7 @@ For source audio that has a wide dynamic range (very loud and very soft sequence
                         <property name="right_padding">2</property>
                         <child>
                           <object class="GtkVBox" id="vbox12">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="spacing">2</property>
@@ -2472,6 +2522,7 @@ For source audio that has a wide dynamic range (very loud and very soft sequence
                                 <child>
                                   <object class="GtkFileChooserButton" id="SrtFile">
                                     <property name="visible">True</property>
+                                    <property name="local-only">False</property>
                                     <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
                                     <property name="title" translatable="yes">Srt File</property>
                                     <property name="tooltip-text" translatable="yes">Select the SRT file to import.</property>
@@ -2547,848 +2598,898 @@ For source audio that has a wide dynamic range (very loud and very soft sequence
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkHBox" id="x264_tab">
+                  <object class="GtkVBox" id="x264_tab">
+                    <property name="orientation">vertical</property>
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="spacing">2</property>
                     <child>
-                      <object class="GtkVBox" id="vbox21">
+                      <object class="GtkHBox" id="hbox73">
                         <property name="visible">True</property>
-                        <property name="spacing">10</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="spacing">2</property>
                         <child>
-                          <object class="GtkFrame" id="frame9">
+                          <object class="GtkVBox" id="vbox21">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
                             <child>
-                              <object class="GtkAlignment" id="alignment25">
+                              <object class="GtkFrame" id="frame10">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="left_padding">12</property>
+                                <property name="label_xalign">0</property>
+                                <property name="shadow_type">none</property>
                                 <child>
-                                  <object class="GtkVBox" id="vbox22">
+                                  <object class="GtkAlignment" id="alignment26">
                                     <property name="visible">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="top_padding">6</property>
+                                    <property name="bottom_padding">2</property>
+                                    <property name="left_padding">12</property>
+                                    <property name="right_padding">2</property>
                                     <child>
-                                      <object class="GtkHBox" id="hbox31">
+                                      <object class="GtkTable" id="table6">
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="spacing">4</property>
+                                        <property name="n_rows">4</property>
+                                        <property name="n_columns">2</property>
+                                        <property name="column-spacing">4</property>
+                                        <property name="row-spacing">2</property>
                                         <child>
                                           <object class="GtkLabel" id="label49">
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="label" translatable="yes">Number:</property>
+                                            <property name="xalign">0</property>
+                                            <property name="label" translatable="yes">&lt;small&gt;Reference Frames:&lt;/small&gt;</property>
+                                               <property name="use_markup">True</property>
                                           </object>
                                           <packing>
-                                            <property name="expand">False</property>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="top_attach">0</property>
+                                            <property name="bottom_attach">1</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">1</property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <object class="GtkSpinButton" id="x264_refs">
+                                          <object class="GtkAlignment" id="alignment41">
                                             <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Selects the number of reference frames that can be used. Slows down encoding.  Good typical values are 3 to 5. Animation can benefit from more (8 to 10).</property>
-                                            <property name="adjustment">adjustment8</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                            <property name="xalign">0</property>
+                                            <child>
+                                              <object class="GtkSpinButton" id="x264_refs">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Sane values are ~1-6.  The more you add, the better the compression, but the slower the encode.  Cel animation tends to benefit from more reference frames a lot more than film content.  Note that many hardware devices have limitations on the number of supported reference frames, so if you're encoding for a handheld or standalone player, don't touch this unless you're absolutely sure you know what you're doing!</property>
+                                                <property name="adjustment">adjustment8</property>
+                                                <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                              </object>
+                                              <packing>
+                                              </packing>
+                                            </child>
                                           </object>
                                           <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="y_options">GTK_FILL</property>
+                                            <property name="top_attach">0</property>
+                                            <property name="bottom_attach">1</property>
+                                            <property name="left_attach">1</property>
+                                            <property name="right_attach">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkLabel" id="label51">
+                                            <property name="visible">True</property>
+                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                            <property name="xalign">0</property>
+                                            <property name="label" translatable="yes">&lt;small&gt;Maximum B-Frames:&lt;/small&gt;</property>
+                                               <property name="use_markup">True</property>
+                                          </object>
+                                          <packing>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="top_attach">1</property>
+                                            <property name="bottom_attach">2</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkAlignment" id="alignment38">
+                                            <property name="visible">True</property>
+                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                            <property name="xalign">0</property>
+                                            <child>
+                                              <object class="GtkSpinButton" id="x264_bframes">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Sane values are ~2-5.  This specifies the maximum number of sequential B-frames that the encoder can use.  Large numbers generally won't help significantly unless Adaptive B-frames is set to Optimal.  Cel-animated source material and B-pyramid also significantly increase the usefulness of larger values. Baseline profile, as required for iPods and similar devices, requires B-frames to be set to 0 (off).</property>
+                                                <property name="adjustment">adjustment9</property>
+                                                <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                              </object>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="y_options">GTK_FILL</property>
+                                            <property name="top_attach">1</property>
+                                            <property name="bottom_attach">2</property>
+                                            <property name="left_attach">1</property>
+                                            <property name="right_attach">2</property>
                                           </packing>
                                         </child>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_mixed_refs">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">This option allows x264 to have greater control over reference frames.  Improves quality, but slows down encoding. </property>
-                                        <property name="label" translatable="yes">Mixed References</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                  </object>
-                                </child>
-                              </object>
-                            </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label50">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Reference Frames&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame" id="frame10">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
-                            <child>
-                              <object class="GtkAlignment" id="alignment26">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <property name="right_padding">2</property>
-                                <child>
-                                  <object class="GtkTable" id="table6">
-                                    <property name="visible">True</property>
-                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="n_rows">4</property>
-                                    <property name="n_columns">2</property>
-                                    <property name="column-spacing">4</property>
-                                    <property name="row-spacing">2</property>
-                                    <child>
-                                      <object class="GtkLabel" id="label51">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Number:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment38">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0</property>
                                         <child>
-                                          <object class="GtkSpinButton" id="x264_bframes">
+                                          <object class="GtkLabel" id="label50">
                                             <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">B-Frames cost little in speed, unless you are using b-adapt=2 (optimal). So you generally want to choose a high value. 16 isn't unreasonable.</property>
-                                            <property name="adjustment">adjustment9</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                            <property name="xalign">0</property>
+                                            <property name="label" translatable="yes">&lt;small&gt;Pyramidal B-Frames:&lt;/small&gt;</property>
+                                               <property name="use_markup">True</property>
                                           </object>
+                                          <packing>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="top_attach">2</property>
+                                            <property name="bottom_attach">3</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">1</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                                                                 <object class="GtkComboBox" id="x264_bpyramid">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                            <property name="tooltip-text" translatable="yes">B-pyramid improves compression by creating a pyramidal structure (hence the name) of B-frames, allowing B-frames to reference each other to improve compression.  Requires Max B-frames greater than 1; optimal adaptive B-frames is strongly recommended for full compression benefit.</property>
+                                                                                       <signal handler="x264_widget_changed_cb" name="changed"/>
+                                                                                 </object>
+                                          <packing>
+                                            <property name="top_attach">2</property>
+                                            <property name="bottom_attach">3</property>
+                                            <property name="left_attach">1</property>
+                                            <property name="right_attach">2</property>
+                                            <property name="x_options">GTK_FILL</property>
+                                          </packing>
                                         </child>
-                                      </object>
-                                      <packing>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label52">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Direct Prediction:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="top_attach">1</property>
-                                        <property name="bottom_attach">2</property>
-                                        <property name="x_options">GTK_FILL</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment39">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0</property>
                                         <child>
-                                          <object class="GtkComboBox" id="x264_direct">
+                                          <object class="GtkLabel" id="label40">
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Set prediction mode for 'direct' motion vectors. This option improves compression efficiency.</property>
-                                            <signal handler="x264_widget_changed_cb" name="changed"/>
+                                            <property name="xalign">0</property>
+                                            <property name="label" translatable="yes">&lt;small&gt;Weighted P-Frames:&lt;/small&gt;</property>
+                                               <property name="use_markup">True</property>
                                           </object>
+                                          <packing>
+                                            <property name="x_options">GTK_FILL</property>
+                                            <property name="top_attach">3</property>
+                                            <property name="bottom_attach">4</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">1</property>
+                                          </packing>
                                         </child>
-                                      </object>
-                                      <packing>
-                                        <property name="top_attach">1</property>
-                                        <property name="bottom_attach">2</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label84">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Adaptive B-Frames:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="top_attach">2</property>
-                                        <property name="bottom_attach">3</property>
-                                        <property name="x_options">GTK_FILL</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment40">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0</property>
                                         <child>
-                                          <object class="GtkComboBox" id="x264_b_adapt">
+                                                                                 <object class="GtkComboBox" id="x264_weighted_pframes">
+                                                                                       <property name="visible">True</property>
+                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                            <property name="tooltip-text" translatable="yes">Performs extra analysis to decide upon weighting parameters for each frame.  This improves overall compression slightly and improves the quality of fades greatly. Baseline profile, as required for iPods and similar devices, requires weighted P-frame prediction to be disabled.  Note that some devices and players, even those that support Main Profile, may have problems with Weighted P-frame prediction: the Apple TV is completely incompatible with it, for example.</property>
+                                                                                       <signal handler="x264_widget_changed_cb" name="changed"/>
+                                                                                 </object>
+                                          <packing>
+                                            <property name="top_attach">3</property>
+                                            <property name="bottom_attach">4</property>
+                                            <property name="left_attach">1</property>
+                                            <property name="right_attach">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkCheckButton" id="x264_8x8dct">
                                             <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-markup" translatable="yes">This setting controls how x264 decides between 
-placing a P or B-frame.
-&lt;small&gt;
-Off            - Pick B-frames always
-Fast           - Speed slightly increases with higher B-frames setting
-Optimal        - Speed significantly decreases with higher B-frames setting
-&lt;/small&gt;
-This option can improve compression efficiency. Use 'Optimal' if you can afford the time.</property>
-                                            <signal handler="x264_widget_changed_cb" name="changed"/>
+                                            <property name="tooltip-text" translatable="yes">The 8x8 transform is the single most useful feature of x264 in terms of compression-per-speed.  It improves compression by at least 5% at a very small speed cost and may provide an unusually high visual quality benefit compared to its compression gain.  However, it requires High Profile, which many devices may not support.</property>
+                                            <property name="label" translatable="yes">8x8 Transform</property>
+                                            <property name="active">True</property>
+                                            <property name="draw_indicator">True</property>
+                                            <signal handler="x264_widget_changed_cb" name="toggled"/>
                                           </object>
+                                          <packing>
+                                            <property name="top_attach">4</property>
+                                            <property name="bottom_attach">5</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">2</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkCheckButton" id="x264_cabac">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">True</property>
+                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                            <property name="tooltip-text" translatable="yes">After the encoder has done its work, it has a bunch of data that needs to be compressed losslessly, similar to ZIP or RAR.  H.264 provides two options for this: CAVLC and CABAC.  CABAC decodes a lot slower but compresses significantly better (10-30%), especially at lower bitrates.  If you're looking to minimize CPU requirements for video playback, disable this option. Baseline profile, as required for iPods and similar devices, requires CABAC to be disabled.</property>
+                                            <property name="label" translatable="yes">CABAC Entropy Encoding</property>
+                                            <property name="active">True</property>
+                                            <property name="draw_indicator">True</property>
+                                            <signal handler="x264_widget_changed_cb" name="toggled"/>
+                                          </object>
+                                          <packing>
+                                            <property name="top_attach">5</property>
+                                            <property name="bottom_attach">6</property>
+                                            <property name="left_attach">0</property>
+                                            <property name="right_attach">2</property>
+                                          </packing>
                                         </child>
                                       </object>
-                                      <packing>
-                                        <property name="top_attach">2</property>
-                                        <property name="bottom_attach">3</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_bpyramid">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">Allows B-Frames to be used as references for other B-Frames. Improves encoding efficiency with little speed penalty</property>
-                                        <property name="label" translatable="yes">Pyramidal B-Frames</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="top_attach">3</property>
-                                        <property name="bottom_attach">4</property>
-                                        <property name="left_attach">0</property>
-                                        <property name="right_attach">1</property>
-                                        <property name="x_options">GTK_FILL</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_weighted_bframes">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">Turn on weighted prediction for B-Frames.  Improves compression efficiency and has little speed penalty. </property>
-                                        <property name="label" translatable="yes">Weighted B-Frames</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="top_attach">3</property>
-                                        <property name="bottom_attach">4</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                      </packing>
                                     </child>
                                   </object>
                                 </child>
-                              </object>
-                            </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label53">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;B-Frames&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame" id="frame11">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
-                            <child>
-                              <object class="GtkAlignment" id="alignment29">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <property name="right_padding">2</property>
-                                <child>
-                                  <object class="GtkScrolledWindow" id="scrolledwindow6">
+                                <child type="label">
+                                  <object class="GtkLabel" id="label53">
                                     <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                    <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                    <property name="shadow_type">etched-in</property>
-                                    <child>
-                                      <object class="GtkTextView" id="x264Option">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                            <property name="tooltip-text" translatable="yes">Your selected options will appear here. 
-You can edit these and add additional options.  
-
-Default values will not be shown. The defaults are:
-ref=3:mixed-refs=1:bframes=3:direct=spatial:b-pyramid=0:
-weightb=1:me=hex:merange=16:subme=7:analyse=some:8x8dct=1:
-deblock=0,0:trellis=1:psy-rd=1,0:no-fast-pskip=0:
-no-dct-decimate=0:cabac=1</property>
-                                        <property name="wrap_mode">GTK_WRAP_CHAR</property>
-                                        <property name="accepts_tab">False</property>
-                                        <signal handler="x264_focus_out_cb" name="focus_out_event"/>
-                                      </object>
-                                    </child>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Encoding Features&lt;/b&gt;&lt;/small&gt;</property>
+                                    <property name="use_markup">True</property>
                                   </object>
                                 </child>
                               </object>
-                            </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label54">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Manual Options String&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">1</property>
+                              </packing>
                             </child>
                           </object>
                           <packing>
                             <property name="expand">True</property>
-                            <property name="padding">2</property>
-                            <property name="position">2</property>
                           </packing>
                         </child>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkVSeparator" id="vseparator1">
-                        <property name="visible">True</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkVBox" id="vbox25">
-                        <property name="visible">True</property>
-                        <property name="spacing">10</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                         <child>
-                          <object class="GtkFrame" id="frame12">
+                          <object class="GtkVBox" id="vbox25">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
                             <child>
-                              <object class="GtkAlignment" id="alignment30">
+                              <object class="GtkFrame" id="frame12">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <property name="right_padding">2</property>
+                                <property name="label_xalign">0</property>
+                                <property name="shadow_type">none</property>
                                 <child>
-                                  <object class="GtkTable" id="table5">
+                                  <object class="GtkHBox" id="hbox84">
                                     <property name="visible">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="n_rows">4</property>
-                                    <property name="n_columns">2</property>
-                                    <property name="row-spacing">2</property>
-                                    <property name="column-spacing">4</property>
-                                    <child>
-                                      <object class="GtkLabel" id="label55">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Method: </property>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">0</property>
-                                        <property name="right_attach">1</property>
-                                        <property name="top_attach">0</property>
-                                        <property name="bottom_attach">1</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment31">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0</property>
-                                        <child>
-                                          <object class="GtkComboBox" id="x264_me">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">This sets the search pattern x264 uses when estimating motion. Uneven Multi-Hexagonal provides some benefit over Hex with a modest hit in speed. Exhaustive and Hadamard Exhaustive are very slow and generally not useful for everyday encoding.</property>
-                                            <signal handler="x264_me_changed_cb" name="changed"/>
-                                          </object>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                        <property name="top_attach">0</property>
-                                        <property name="bottom_attach">1</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label57">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Range: </property>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">0</property>
-                                        <property name="right_attach">1</property>
-                                        <property name="top_attach">1</property>
-                                        <property name="bottom_attach">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkAlignment" id="alignment32">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0</property>
-                                        <child>
-                                          <object class="GtkSpinButton" id="x264_merange">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">The radius, in pixels, x264 should use for motion estimation searches. Higher values can be useful on HiDef or high-motion footage.</property>
-                                            <property name="adjustment">adjustment10</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
-                                          </object>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                        <property name="top_attach">1</property>
-                                        <property name="bottom_attach">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label58">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Subpixel Method:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">0</property>
-                                        <property name="right_attach">1</property>
-                                        <property name="top_attach">2</property>
-                                        <property name="bottom_attach">3</property>
-                                      </packing>
-                                    </child>
+
                                     <child>
-                                      <object class="GtkAlignment" id="alignment33">
+                                      <object class="GtkAlignment" id="alignment30">
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="xscale">0.05000000074505806</property>
+                                        <property name="top_padding">6</property>
+                                        <property name="bottom_padding">2</property>
+                                        <property name="left_padding">12</property>
+                                        <property name="right_padding">2</property>
                                         <child>
-                                          <object class="GtkComboBox" id="x264_subme">
+                                          <object class="GtkTable" id="table5">
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-markup" translatable="yes">Determines how motion estimation decisions are made. Higher numbers provide greater compression efficiency and are slower.
-&lt;small&gt;
-1      - QPel SAD 1 iteration
-2      - QPel SATD 2 iterations
-3      - HPel on MB then QPel
-4      - Always QPel
-5      - Multi QPel + bime
-6      - RD on I/P frames
-7      - RD on all frames
-8      - RD refinement on I/P frames
-9      - RD refinement on all frames
-10     - QP-RD (requires trellis=2 and aq-mode > 0) &lt;/small&gt;</property>
-                                            <signal handler="x264_widget_changed_cb" name="changed"/>
+                                            <property name="n_rows">4</property>
+                                            <property name="n_columns">2</property>
+                                            <property name="row-spacing">2</property>
+                                            <property name="column-spacing">4</property>
+                                            <child>
+                                              <object class="GtkLabel" id="label55">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Motion Est. Method:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="left_attach">0</property>
+                                                <property name="right_attach">1</property>
+                                                <property name="top_attach">0</property>
+                                                <property name="bottom_attach">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkComboBox" id="x264_me">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Controls the motion estimation method. Motion estimation is how the encoder estimates how each block of pixels in a frame has moved.  A better motion search method improves compression at the cost of speed.
+
+Diamond: performs an extremely fast and simple search using a diamond pattern.
+
+Hexagon: performs a somewhat more effective but slightly slower search using a hexagon pattern.
+
+Uneven Multi-Hex: performs a very wide search using a variety of patterns, more accurately capturing complex motion.
+
+Exhaustive: performs a "dumb" search of every pixel in a wide area.  Significantly slower for only a small compression gain.
+
+Transformed Exhaustive: Like exhaustive, but makes even more accurate decisions. Accordingly, somewhat slower, also for only a small improvement.</property>
+                                                <signal handler="x264_me_changed_cb" name="changed"/>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="top_attach">0</property>
+                                                <property name="bottom_attach">1</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label58">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Subpel ME &amp;amp; Mode:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                                <property name="left_attach">0</property>
+                                                <property name="right_attach">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkComboBox" id="x264_subme">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-markup" translatable="yes">This setting controls both subpixel-precision motion estimation and mode decision methods.
+
+Subpixel motion estimation is used for refining motion estimates beyond mere pixel accuracy, improving compression.
+
+Mode decision is the method used to choose how to encode each block of the frame: a very important decision.
+
+SAD is the fastest method, followed by SATD, RD, RD refinement, and the slowest, QPRD.
+
+6 or higher is strongly recommended: Psy-RD, a very powerful psy optimization that helps retain detail, requires RD.
+
+10, the most powerful and slowest option, requires trellis=2.</property>
+                                                <signal handler="x264_widget_changed_cb" name="changed"/>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label57">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Motion Est. Range:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                                <property name="left_attach">0</property>
+                                                <property name="right_attach">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkSpinButton" id="x264_merange">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">This is the distance x264 searches from its best guess at the motion of a block in order to try to find its actual motion.  The default is fine for most content, but extremely high motion video, especially at HD resolutions, may benefit from higher ranges, albeit at a high speed cost.</property>
+                                                <property name="adjustment">adjustment10</property>
+                                                <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
+                                                                                       <child>
+                                                                                         <object class="GtkLabel" id="label52">
+                                                                                               <property name="visible">True</property>
+                                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                               <property name="xalign">0</property>
+                                                                                               <property name="label" translatable="yes">&lt;small&gt;Adaptive Direct Mode:&lt;/small&gt;</property>
+                                                                                               <property name="use_markup">True</property>
+                                                                                         </object>
+                                                                                         <packing>
+                                                                                               <property name="top_attach">3</property>
+                                                                                               <property name="bottom_attach">4</property>
+                                                                                               <property name="left_attach">0</property>
+                                                                                               <property name="right_attach">1</property>
+                                                                                               <property name="x_options">GTK_FILL</property>
+                                                                                         </packing>
+                                                                                       </child>
+                                                                                       <child>
+                                                                                         <object class="GtkAlignment" id="alignment39">
+                                                                                               <property name="visible">True</property>
+                                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                               <property name="xalign">0</property>
+                                                                                               <child>
+                                                                                                 <object class="GtkComboBox" id="x264_direct">
+                                                                                                       <property name="visible">True</property>
+                                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                                       <property name="tooltip-text" translatable="yes">H.264 allows for two different prediction modes, spatial and temporal, in B-frames.
+
+Spatial, the default, is almost always better, but temporal is sometimes useful too.
+
+x264 can, at the cost of a small amount of speed (and accordingly for a small compression gain), adaptively select which is better for each particular frame.</property>
+                                                                                                       <signal handler="x264_widget_changed_cb" name="changed"/>
+                                                                                                 </object>
+                                                                                               </child>
+                                                                                         </object>
+                                                                                         <packing>
+                                                                                               <property name="x_options">GTK_FILL</property>
+                                                                                               <property name="y_options">GTK_FILL</property>
+                                                                                               <property name="top_attach">3</property>
+                                                                                               <property name="bottom_attach">4</property>
+                                                                                               <property name="left_attach">1</property>
+                                                                                               <property name="right_attach">2</property>
+                                                                                         </packing>
+                                                                                       </child>
+                                                                                       <child>
+                                                                                         <object class="GtkLabel" id="label84">
+                                                                                               <property name="visible">True</property>
+                                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                               <property name="xalign">0</property>
+                                                                                               <property name="label" translatable="yes">&lt;small&gt;Adaptive B-Frames:&lt;/small&gt;</property>
+                                                                                               <property name="use_markup">True</property>
+                                                                                         </object>
+                                                                                         <packing>
+                                                                                               <property name="top_attach">4</property>
+                                                                                               <property name="bottom_attach">5</property>
+                                                                                               <property name="left_attach">0</property>
+                                                                                               <property name="right_attach">1</property>
+                                                                                               <property name="x_options">GTK_FILL</property>
+                                                                                         </packing>
+                                                                                       </child>
+                                                                                       <child>
+                                                                                         <object class="GtkAlignment" id="alignment40">
+                                                                                               <property name="visible">True</property>
+                                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                               <property name="xalign">0</property>
+                                                                                               <child>
+                                                                                                 <object class="GtkComboBox" id="x264_b_adapt">
+                                                                                                       <property name="visible">True</property>
+                                                                                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                                       <property name="tooltip-markup" translatable="yes">x264 has a variety of algorithms to decide when to use B-frames and how many to use.
+
+Fast mode takes roughly the same amount of time no matter how many B-frames you specify.  However, while fast, its decisions are often suboptimal.
+
+Optimal mode gets slower as the maximum number of B-Frames increases, but makes much more accurate decisions, especially when used with B-pyramid.</property>
+                                                                                                       <signal handler="x264_widget_changed_cb" name="changed"/>
+                                                                                                 </object>
+                                                                                               </child>
+                                                                                         </object>
+                                                                                         <packing>
+                                                                                               <property name="x_options">GTK_FILL</property>
+                                                                                               <property name="y_options">GTK_FILL</property>
+                                                                                               <property name="top_attach">4</property>
+                                                                                               <property name="bottom_attach">5</property>
+                                                                                               <property name="left_attach">1</property>
+                                                                                               <property name="right_attach">2</property>
+                                                                                         </packing>
+                                                                                       </child>
                                           </object>
                                         </child>
                                       </object>
                                       <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                        <property name="top_attach">2</property>
-                                        <property name="bottom_attach">3</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkLabel" id="label59">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="xalign">0</property>
-                                        <property name="label" translatable="yes">Analysis:</property>
-                                      </object>
-                                      <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">0</property>
-                                        <property name="right_attach">1</property>
-                                        <property name="top_attach">3</property>
-                                        <property name="bottom_attach">4</property>
+                                        <property name="position">0</property>
                                       </packing>
                                     </child>
                                     <child>
-                                      <object class="GtkHBox" id="hbox38">
+                                      <object class="GtkAlignment" id="alignment31">
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                        <property name="top_padding">6</property>
+                                        <property name="bottom_padding">2</property>
+                                        <property name="left_padding">12</property>
+                                        <property name="right_padding">2</property>
                                         <child>
-                                          <object class="GtkAlignment" id="alignment37">
+                                          <object class="GtkTable" id="table3">
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="xscale">0</property>
+                                            <property name="n_rows">4</property>
+                                            <property name="n_columns">2</property>
+                                            <property name="row-spacing">2</property>
+                                            <property name="column-spacing">4</property>
+                                            <child>
+                                              <object class="GtkLabel" id="label59">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Partitions:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="left_attach">0</property>
+                                                <property name="right_attach">1</property>
+                                                <property name="top_attach">0</property>
+                                                <property name="bottom_attach">1</property>
+                                              </packing>
+                                            </child>
                                             <child>
                                               <object class="GtkComboBox" id="x264_analyse">
                                                 <property name="visible">True</property>
                                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                                <property name="tooltip-text" translatable="yes">Determines which macroblock partitions are analyzed.
-"Some" is recommended.  "All" is slow and generally not useful.</property>
+                                                <property name="tooltip-text" translatable="yes">Mode decision picks from a variety of options to make its decision: this option chooses what options those are.  Fewer partitions to check means faster encoding, at the cost of worse decisions, since the best option might have been one that was turned off.</property>
                                                 <signal handler="x264_widget_changed_cb" name="changed"/>
                                               </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">0</property>
+                                                <property name="bottom_attach">1</property>
+                                              </packing>
                                             </child>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">0</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkAlignment" id="alignment34">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="xscale">0</property>
                                             <child>
-                                              <object class="GtkCheckButton" id="x264_8x8dct">
+                                              <object class="GtkLabel" id="label62">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Trellis:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="left_attach">0</property>
+                                                <property name="right_attach">1</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkComboBox" id="x264_trellis">
                                                 <property name="visible">True</property>
-                                                <property name="can_focus">True</property>
                                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                                <property name="tooltip-text" translatable="yes">Enables the intelligent adaptive use of 8x8 transforms in I-frames. Improves coding efficiency.</property>
-                                                <property name="label" translatable="yes">8x8dct</property>
-                                                <property name="active">True</property>
-                                                <property name="draw_indicator">True</property>
-                                                <signal handler="x264_widget_changed_cb" name="toggled"/>
+                                                <property name="tooltip-text" translatable="yes">Trellis fine-tunes the rounding of transform coefficients to squeeze out 3-5% more compression at the cost of some speed. "Always" uses trellis not only during the main encoding process, but also during analysis, which improves compression even more, albeit at great speed cost.  Trellis costs more speed at higher bitrates and requires CABAC.</property>
+                                                <signal handler="x264_widget_changed_cb" name="changed"/>
                                               </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="y_options">GTK_FILL</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                              </packing>
                                             </child>
                                           </object>
-                                          <packing>
-                                            <property name="position">1</property>
-                                          </packing>
                                         </child>
                                       </object>
                                       <packing>
-                                        <property name="x_options">GTK_FILL</property>
-                                        <property name="y_options">GTK_FILL</property>
-                                        <property name="left_attach">1</property>
-                                        <property name="right_attach">2</property>
-                                        <property name="top_attach">3</property>
-                                        <property name="bottom_attach">4</property>
+                                        <property name="position">1</property>
                                       </packing>
                                     </child>
                                   </object>
+                                  <packing>
+                                  </packing>
+                                </child>
+                                <child type="label">
+                                  <object class="GtkLabel" id="label60">
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Analysis&lt;/b&gt;&lt;/small&gt;</property>
+                                    <property name="use_markup">True</property>
+                                  </object>
                                 </child>
                               </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="padding">2</property>
+                              </packing>
                             </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label60">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Motion Estimation&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="padding">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame" id="frame13">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
                             <child>
-                              <object class="GtkAlignment" id="alignment35">
+                              <object class="GtkFrame" id="frame13">
                                 <property name="visible">True</property>
                                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="top_padding">6</property>
-                                <property name="bottom_padding">2</property>
-                                <property name="left_padding">12</property>
-                                <property name="right_padding">2</property>
+                                <property name="label_xalign">0</property>
+                                <property name="shadow_type">none</property>
                                 <child>
-                                  <object class="GtkVBox" id="vbox27">
+                                  <object class="GtkAlignment" id="alignment35">
                                     <property name="visible">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                    <property name="spacing">2</property>
+                                    <property name="top_padding">6</property>
+                                    <property name="bottom_padding">2</property>
+                                    <property name="left_padding">12</property>
+                                    <property name="right_padding">2</property>
                                     <child>
-                                      <object class="GtkHBox" id="hbox39">
+                                      <object class="GtkVBox" id="vbox27">
+                                        <property name="orientation">vertical</property>
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                         <child>
-                                          <object class="GtkLabel" id="label61">
+                                          <object class="GtkTable" id="table9">
                                             <property name="visible">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Deblocking: </property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkSpinButton" id="x264_deblock_alpha">
+                                            <property name="n_rows">2</property>
+                                            <property name="n_columns">2</property>
                                             <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-markup" translatable="yes">Controls the loop filter which is part of the H.264 standard.
-
-&lt;b&gt;Alpha:&lt;/b&gt; determines the strength of the deblocking action. Higher values will produce stronger 'blurring'.</property>
-                                            <property name="adjustment">adjustment11</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                            <child>
+                                              <object class="GtkLabel" id="label73">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                               <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Adaptive Quantization Strength:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkHScale" id="x264_aq_strength">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Adaptive quantization controls how the encoder distributes bits across the frame.  Higher values take more bits away from edges and complex areas to improve areas with finer detail.</property>
+                                                <property name="adjustment">adjustment34</property>
+                                                <property name="restrict_to_fill_level">False</property>
+                                                <property name="value_pos">GTK_POS_RIGHT</property>
+                                                <signal handler="x264_slider_changed_cb" name="value_changed"/>
+                                                <signal name="format_value" handler="x264_format_slider_cb"/>
+                                              </object>
+                                              <packing>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label82">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                               <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Psychovisual Rate Distortion:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="x_options">GTK_FILL</property>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkHScale" id="x264_psy_rd">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Psychovisual rate-distortion optimization takes advantage of the characteristics of human vision to dramatically improve apparent detail and sharpness.  The effect can be made weaker or stronger by adjusting the strength.  Being an RD algorithm, it requires mode decision to be at least "6".</property>
+                                                <property name="adjustment">adjustment22</property>
+                                                <property name="restrict_to_fill_level">False</property>
+                                                <property name="value_pos">GTK_POS_RIGHT</property>
+                                                <signal handler="x264_slider_changed_cb" name="value_changed"/>
+                                                <signal name="format_value" handler="x264_format_slider_cb"/>
+                                              </object>
+                                              <packing>
+                                                <property name="top_attach">1</property>
+                                                <property name="bottom_attach">2</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="label83">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                               <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">&lt;small&gt;Psychovisual Trellis:&lt;/small&gt;</property>
+                                                               <property name="use_markup">True</property>
+                                              </object>
+                                              <packing>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                                <property name="x_options">GTK_FILL</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkHScale" id="x264_psy_trell">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-text" translatable="yes">Psychovisual trellis is an experimental algorithm to further improve sharpness and detail retention beyond what Psychovisual RD does.  Recommended values are around 0.2, though higher values may help for very grainy video or lower bitrate encodes.  Not recommended for cel animation and other sharp-edged graphics.</property>
+                                                <property name="adjustment">adjustment23</property>
+                                                <property name="digits">2</property>
+                                                <property name="restrict_to_fill_level">False</property>
+                                                <property name="value_pos">GTK_POS_RIGHT</property>
+                                                <signal handler="x264_slider_changed_cb" name="value_changed"/>
+                                                <signal name="format_value" handler="x264_format_slider_cb"/>
+                                              </object>
+                                              <packing>
+                                                <property name="top_attach">2</property>
+                                                <property name="bottom_attach">3</property>
+                                                <property name="left_attach">1</property>
+                                                <property name="right_attach">2</property>
+                                              </packing>
+                                            </child>
                                           </object>
                                           <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
+                                            <property name="position">0</property>
                                           </packing>
                                         </child>
                                         <child>
-                                          <object class="GtkSpinButton" id="x264_deblock_beta">
+                                          <object class="GtkHBox" id="hbox39">
                                             <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
                                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-markup" translatable="yes">Controls the loop filter which is part of the H.264 standard. 
+                                            <child>
+                                              <object class="GtkLabel" id="label61">
+                                                <property name="visible">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes">Deblocking: </property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkSpinButton" id="x264_deblock_alpha">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-markup" translatable="yes">H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame.  This not only improves visual quality, but also helps compression significantly. The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
 
-&lt;b&gt;Beta:&lt;/b&gt; determines when something is a block. Higher values increase sensitivity and will flag more blocks.</property>
-                                            <property name="adjustment">adjustment12</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">2</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkHBox" id="hbox40">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label62">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">0</property>
-                                            <property name="label" translatable="yes">Trellis: </property>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkComboBox" id="x264_trellis">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Trellis fine-tunes how bitrate is doled out, so it can reduce file size/bitrate or increase quality. "All" forces it to be used more often than "Final Macro Block".</property>
-                                            <signal handler="x264_widget_changed_cb" name="changed"/>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="position">1</property>
-                                          </packing>
-                                        </child>
-                                      </object>
-                                      <packing>
-                                        <property name="position">1</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_no_fast_pskip">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">This can help with blocking on solid colors like blue skies, but it also slows down the encode.</property>
-                                        <property name="label" translatable="yes">No Fast P-Skip</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="position">2</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_no_dct_decimate">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">Disables coefficient thresholding on P-frames. Only use this with constant quality encoding. It increases quality but also bitrate/file size.</property>
-                                        <property name="label" translatable="yes">No DCT Decimate</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="position">3</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkCheckButton" id="x264_cabac">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="tooltip-text" translatable="yes">Context Adaptive Binary Arithmetic Coding. Improves compression efficiency at the expense of playback/decoding efficiency. Use CABAC unless your decoder really sucks.</property>
-                                        <property name="label" translatable="yes">CABAC Entropy Encoding</property>
-                                        <property name="active">True</property>
-                                        <property name="draw_indicator">True</property>
-                                        <signal handler="x264_widget_changed_cb" name="toggled"/>
-                                      </object>
-                                      <packing>
-                                        <property name="position">4</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <object class="GtkTable" id="table9">
-                                        <property name="visible">True</property>
-                                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                        <property name="n_rows">2</property>
-                                        <property name="n_columns">2</property>
-                                        <property name="visible">True</property>
-                                        <child>
-                                          <object class="GtkLabel" id="label82">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">1</property>
-                                            <property name="label" translatable="yes">Psychovisual Rate Distortion: </property>
-                                          </object>
-                                          <packing>
-                                            <property name="x_options">GTK_FILL</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkHScale" id="x264_psy_rd">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Sets the strength of Psy-RDO.
-Requires subme >= 6.</property>
-                                            <property name="adjustment">adjustment22</property>
-                                            <property name="restrict_to_fill_level">False</property>
-                                            <property name="value_pos">GTK_POS_RIGHT</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
-                                          </object>
-                                          <packing>
-                                            <property name="left_attach">1</property>
-                                            <property name="right_attach">2</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkLabel" id="label83">
-                                            <property name="visible">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="xalign">1</property>
-                                            <property name="label" translatable="yes">Psychovisual Trellis: </property>
-                                          </object>
-                                          <packing>
-                                            <property name="top_attach">1</property>
-                                            <property name="bottom_attach">2</property>
-                                            <property name="x_options">GTK_FILL</property>
-                                          </packing>
-                                        </child>
-                                        <child>
-                                          <object class="GtkHScale" id="x264_psy_trell">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                            <property name="tooltip-text" translatable="yes">Sets the strength of Psy-Trellis.
-Requires subme >= 6 and trellis >= 1.</property>
-                                            <property name="adjustment">adjustment23</property>
-                                            <property name="restrict_to_fill_level">False</property>
-                                            <property name="value_pos">GTK_POS_RIGHT</property>
-                                            <signal handler="x264_widget_changed_cb" name="value_changed"/>
+The deblocking filter has two adjustable parameters, "strength" (Alpha) and "threshold" (Beta). The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to. Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</property>
+                                                <property name="adjustment">adjustment11</property>
+                                                <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkSpinButton" id="x264_deblock_beta">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">True</property>
+                                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip-markup" translatable="yes">H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame.  This not only improves visual quality, but also helps compression significantly. The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.
+
+The deblocking filter has two adjustable parameters, "strength" (Alpha) and "threshold" (Beta). The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to. Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</property>
+                                                <property name="adjustment">adjustment12</property>
+                                                <signal handler="x264_widget_changed_cb" name="value_changed"/>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="position">2</property>
+                                              </packing>
+                                            </child>
+                                                                                       <child>
+                                                                                         <object class="GtkCheckButton" id="x264_no_dct_decimate">
+                                                                                               <property name="visible">True</property>
+                                                                                               <property name="can_focus">True</property>
+                                                                                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                                                               <property name="tooltip-text" translatable="yes">x264 normally zeroes out nearly-empty data blocks to save bits to be better used for some other purpose in the video.  However, this can sometimes have slight negative effects on retention of subtle grain and dither.  Don't touch this unless you're having banding issues or other such cases where you are having trouble keeping fine noise.</property>
+                                                                                               <property name="label" translatable="yes">No DCT Decimate</property>
+                                                                                               <property name="active">True</property>
+                                                                                               <property name="draw_indicator">True</property>
+                                                                                               <signal handler="x264_widget_changed_cb" name="toggled"/>
+                                                                                         </object>
+                                                                                         <packing>
+                                                                                               <property name="padding">20</property>
+                                                                                               <property name="position">3</property>
+                                                                                         </packing>
+                                                                                       </child>
                                           </object>
                                           <packing>
-                                            <property name="top_attach">1</property>
-                                            <property name="bottom_attach">2</property>
-                                            <property name="left_attach">1</property>
-                                            <property name="right_attach">2</property>
+                                            <property name="position">1</property>
                                           </packing>
                                         </child>
                                       </object>
-                                      <packing>
-                                        <property name="position">5</property>
-                                      </packing>
                                     </child>
                                   </object>
                                 </child>
+                                <child type="label">
+                                  <object class="GtkLabel" id="label63">
+                                    <property name="visible">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Psychovisual&lt;/b&gt;&lt;/small&gt;</property>
+                                    <property name="use_markup">True</property>
+                                  </object>
+                                </child>
                               </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="position">1</property>
+                              </packing>
                             </child>
-                            <child type="label">
-                              <object class="GtkLabel" id="label63">
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                      </object>
+                                         <packing>
+                                               <property name="expand">True</property>
+                                               <property name="position">0</property>
+                                         </packing>
+                    </child>
+                    <child>
+                      <object class="GtkHBox" id="hbox85">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="spacing">2</property>
+                      </object>
+                                         <packing>
+                                               <property name="expand">True</property>
+                                               <property name="position">1</property>
+                                         </packing>
+                    </child>
+                    <child>
+                      <object class="GtkFrame" id="frame11">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">none</property>
+                        <child>
+                          <object class="GtkAlignment" id="alignment29">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="top_padding">6</property>
+                            <property name="bottom_padding">2</property>
+                            <property name="left_padding">12</property>
+                            <property name="right_padding">2</property>
+                            <child>
+                              <object class="GtkScrolledWindow" id="scrolledwindow6">
+                                <property name="height_request">40</property>
                                 <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="label" translatable="yes">&lt;b&gt;Miscellaneous&lt;/b&gt;</property>
-                                <property name="use_markup">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                                <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                                <property name="shadow_type">etched-in</property>
+                                <child>
+                                  <object class="GtkTextView" id="x264Option">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                        <property name="tooltip-text" translatable="yes">Your selected options will appear here. 
+You can edit these and add additional options.  
+
+Default values will not be shown. The defaults are:
+ref=3:bframes=3:b-adapt=fast:direct=spatial:
+b-pyramid=normal:weightp=2:me=hex:merange=16:
+subme=7:partitions=p8x8,b8x8,i8x8,i4x4:8x8dct=1:
+deblock=0,0:trellis=1:psy-rd=1,0:aq-strength=1.0:
+no-fast-pskip=0:no-dct-decimate=0:cabac=1</property>
+                                    <property name="wrap_mode">GTK_WRAP_CHAR</property>
+                                    <property name="accepts_tab">False</property>
+                                    <signal handler="x264_focus_out_cb" name="focus_out_event"/>
+                                  </object>
+                                </child>
                               </object>
                             </child>
                           </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="position">1</property>
-                          </packing>
+                        </child>
+                        <child type="label">
+                          <object class="GtkLabel" id="label54">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">&lt;small&gt;&lt;b&gt;Current x264 Advanced Option String&lt;/b&gt;&lt;/small&gt;</property>
+                            <property name="use_markup">True</property>
+                          </object>
                         </child>
                       </object>
                       <packing>
-                        <property name="expand">True</property>
+                        <property name="expand">False</property>
+                                               <property name="fill">True</property>
+                        <property name="padding">2</property>
                         <property name="position">2</property>
                       </packing>
                     </child>
                   </object>
+                  <packing>
+                  </packing>
                 </child>
                 <child type="tab">
                   <object class="GtkLabel" id="x264_tab_label">
@@ -3402,6 +3503,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                 </child>
                 <child>
                   <object class="GtkVBox" id="chapters_tab">
+                    <property name="orientation">vertical</property>
                     <property name="visible">True</property>
                     <child>
                       <object class="GtkHBox" id="hbox30">
@@ -3567,6 +3669,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                 <property name="left_padding">8</property>
                 <child>
                   <object class="GtkVBox" id="presets_vbox">
+                    <property name="orientation">vertical</property>
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                     <child>
@@ -3602,7 +3705,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="label" translatable="yes">_Save</property>
                             <property name="use_underline">True</property>
                             <property name="tooltip-text" translatable="yes">Save current settings to new preset.</property>
-                            <property name="icon_name">gtk-save</property>
+                            <property name="stock_id">gtk-save</property>
                             <signal name="clicked" handler="presets_save_clicked_cb"/>
                           </object>
                           <packing>
@@ -3617,7 +3720,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="label" translatable="yes">_Delete</property>
                             <property name="use_underline">True</property>
                             <property name="tooltip-text" translatable="yes">Delete the currently selected preset.</property>
-                            <property name="icon_name">gtk-delete</property>
+                            <property name="stock_id">gtk-delete</property>
                             <signal name="clicked" handler="presets_remove_clicked_cb"/>
                           </object>
                           <packing>
@@ -3642,7 +3745,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="use_underline">True</property>
                             <property name="tooltip-text" translatable="yes">Preset Options</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="icon_name">gtk-execute</property>
+                            <property name="stock_id">gtk-preferences</property>
                             <signal handler="presets_menu_clicked_cb" name="clicked"/>
                           </object>
                           <packing>
@@ -3698,6 +3801,7 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal name="delete_event" handler="gtk_widget_hide_on_delete"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox6">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="spacing">2</property>
         <child>
@@ -3705,6 +3809,7 @@ Requires subme >= 6 and trellis >= 1.</property>
             <property name="visible">True</property>
             <child>
               <object class="GtkVBox" id="vbox20">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkEventBox" id="eventbox1">
@@ -3745,9 +3850,10 @@ Requires subme >= 6 and trellis >= 1.</property>
                     <property name="show-border">False</property>
                     <child>
                       <object class="GtkVBox" id="vbox42">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
                         <child>
-                          <object class="GtkAlignment" id="alignment60">
+                          <object class="GtkAlignment" id="check_updates_box">
                             <property name="visible">True</property>
                             <property name="left_padding">12</property>
                             <property name="top_padding">6</property>
@@ -3833,6 +3939,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="bottom_padding">6</property>
                             <child>
                               <object class="GtkVBox" id="vbox5">
+                                <property name="orientation">vertical</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <object class="GtkCheckButton" id="use_source_name">
@@ -3854,6 +3961,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                                     <property name="left_padding">18</property>
                                     <child>
                                       <object class="GtkVBox" id="vbox29">
+                                        <property name="orientation">vertical</property>
                                         <property name="visible">True</property>
                                         <child>
                                           <object class="GtkCheckButton" id="chapters_in_destination">
@@ -3961,6 +4069,51 @@ Requires subme >= 6 and trellis >= 1.</property>
                           </packing>
                         </child>
                         <child>
+                          <object class="GtkAlignment" id="alignment58">
+                            <property name="visible">True</property>
+                            <property name="top_padding">6</property>
+                            <property name="bottom_padding">6</property>
+                            <property name="left_padding">12</property>
+                            <child>
+                              <object class="GtkHBox" id="hbox60">
+                                <property name="visible">True</property>
+                                <property name="spacing">4</property>
+                                <child>
+                                  <object class="GtkSpinButton" id="MinTitleDuration">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="max_length">4</property>
+                                    <property name="invisible_char">&#x25CF;</property>
+                                    <property name="shadow_type">none</property>
+                                    <property name="adjustment">min_title_adj</property>
+                                    <property name="numeric">True</property>
+                                    <signal name="value_changed" handler="pref_changed_cb"/>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkLabel" id="label70">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">Filter short titles (seconds)</property>
+                                    <property name="use_markup">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="position">4</property>
+                          </packing>
+                        </child>
+                        <child>
                           <object class="GtkAlignment" id="alignment64">
                             <property name="visible">True</property>
                             <property name="top_padding">6</property>
@@ -3979,7 +4132,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                           </object>
                           <packing>
                             <property name="expand">False</property>
-                            <property name="position">4</property>
+                            <property name="position">5</property>
                           </packing>
                         </child>
                       </object>
@@ -3995,6 +4148,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                     </child>
                     <child>
                       <object class="GtkVBox" id="vbox18">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
                         <child>
                           <object class="GtkAlignment" id="alignment61">
@@ -4006,6 +4160,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="left_padding">12</property>
                             <child>
                               <object class="GtkVBox" id="vbox7">
+                                <property name="orientation">vertical</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <object class="GtkHBox" id="hbox81">
@@ -4047,6 +4202,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                                     <property name="left_padding">17</property>
                                     <child>
                                       <object class="GtkVBox" id="vbox49">
+                                        <property name="orientation">vertical</property>
                                         <property name="visible">True</property>
                                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                                         <child>
@@ -4136,6 +4292,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                     </child>
                     <child>
                       <object class="GtkVBox" id="vbox1">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
                         <child>
                           <object class="GtkAlignment" id="alignment3">
@@ -4145,6 +4302,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="left_padding">12</property>
                             <child>
                               <object class="GtkVBox" id="vbox3">
+                                <property name="orientation">vertical</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <object class="GtkHBox" id="hbox6">
@@ -4211,6 +4369,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="left_padding">12</property>
                             <child>
                               <object class="GtkVBox" id="vbox2">
+                                <property name="orientation">vertical</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <object class="GtkCheckButton" id="EncodeLogLocation">
@@ -4360,6 +4519,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                             <property name="left_padding">12</property>
                             <child>
                               <object class="GtkVBox" id="vbox4">
+                                <property name="orientation">vertical</property>
                                 <property name="visible">True</property>
                                 <child>
                                   <object class="GtkCheckButton" id="allow_tweaks">
@@ -4463,6 +4623,7 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox7">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <property name="spacing">2</property>
@@ -4544,6 +4705,147 @@ Requires subme >= 6 and trellis >= 1.</property>
       <action-widget response="-5">tweak_ok</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkDialog" id="preset_new_folder_dialog">
+    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+    <property name="border_width">5</property>
+    <property name="modal">True</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox2">
+        <property name="orientation">vertical</property>
+        <property name="visible">True</property>
+        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVBox" id="vbox26">
+            <property name="orientation">vertical</property>
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <child>
+              <object class="GtkHBox" id="hbox31">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <child>
+                  <object class="GtkLabel" id="label30">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">Folder Name:</property>
+                    <property name="xalign">0</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="FolderName">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="max_length">40</property>
+                    <property name="activates_default">True</property>
+                    <property name="width_chars">30</property>
+                    <property name="truncate_multiline">True</property>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                               <property name="position">0</property>
+                <property name="padding">10</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame17">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">GTK_SHADOW_ETCHED_OUT</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment32">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="top_padding">6</property>
+                    <property name="bottom_padding">4</property>
+                    <property name="left_padding">12</property>
+                    <property name="right_padding">4</property>
+                    <child>
+                      <object class="GtkTextView" id="FolderDescription">
+                        <property name="height_request">60</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="wrap_mode">GTK_WRAP_WORD</property>
+                        <property name="accepts_tab">False</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label">
+                  <object class="GtkLabel" id="label21">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Description&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="padding">10</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area2">
+            <property name="visible">True</property>
+            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <object class="GtkButton" id="preset_folder_cancel">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="use_stock">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkButton" id="preset_folder_ok">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="label" translatable="yes">gtk-ok</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">preset_folder_cancel</action-widget>
+      <action-widget response="-5">preset_folder_ok</action-widget>
+    </action-widgets>
+  </object>
   <object class="GtkDialog" id="preset_save_dialog">
     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
     <property name="border_width">5</property>
@@ -4554,11 +4856,13 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox3">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <property name="spacing">2</property>
         <child>
           <object class="GtkVBox" id="vbox28">
+            <property name="orientation">vertical</property>
             <property name="visible">True</property>
             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
             <child>
@@ -4570,6 +4874,7 @@ Requires subme >= 6 and trellis >= 1.</property>
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                     <property name="label" translatable="yes">Preset Name:</property>
+                    <property name="xalign">0</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -4592,8 +4897,124 @@ Requires subme >= 6 and trellis >= 1.</property>
               </object>
               <packing>
                 <property name="expand">False</property>
+                               <property name="position">0</property>
+                <property name="padding">10</property>
               </packing>
             </child>
+                       <child>
+                         <object class="GtkTable" id="PicturePresetBox">
+                               <property name="visible">True</property>
+                               <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                               <property name="n_rows">3</property>
+                               <property name="n_columns">3</property>
+                               <child>
+                                 <object class="GtkLabel" id="UsingCurrentPicLabel">
+                                       <property name="visible">True</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="label" translatable="yes">&lt;b&gt;Custom Picture Dimensions&lt;/b&gt;</property>
+                                       <property name="xalign">0</property>
+                                       <property name="use_markup">True</property>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">0</property>
+                                       <property name="bottom_attach">1</property>
+                                       <property name="left_attach">0</property>
+                                       <property name="right_attach">3</property>
+                                 </packing>
+                               </child>
+                               <child>
+                                 <object class="GtkLabel" id="fillerlabel1">
+                                       <property name="visible">True</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="label" translatable="yes"></property>
+                                       <property name="xalign">0</property>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">1</property>
+                                       <property name="bottom_attach">2</property>
+                                       <property name="left_attach">2</property>
+                                       <property name="right_attach">3</property>
+                    <property name="x_options">GTK_EXPAND</property>
+                                 </packing>
+                               </child>
+                               <child>
+                                 <object class="GtkCheckButton" id="PictureWidthEnable">
+                                       <property name="label" translatable="yes">Maximum Width:</property>
+                                       <property name="visible">True</property>
+                                       <property name="can_focus">True</property>
+                                       <property name="receives_default">False</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="tooltip-text" translatable="yes">Enable maximum width limit.</property>
+                                       <property name="draw_indicator">True</property>
+                                       <signal name="toggled" handler="setting_widget_changed_cb"/>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">1</property>
+                                       <property name="bottom_attach">2</property>
+                                       <property name="left_attach">0</property>
+                                       <property name="right_attach">1</property>
+                    <property name="x_options">GTK_FILL</property>
+                                 </packing>
+                               </child>
+                               <child>
+                                 <object class="GtkSpinButton" id="PictureWidth">
+                                       <property name="visible">True</property>
+                                       <property name="can_focus">True</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="tooltip-text" translatable="yes">This is the maximum width that the video will be stored at.  Whenever a new source is loaded, this value will be applied if the source width is greater. Setting this to 0 means there is no maximum width.</property>
+                                       <property name="adjustment">adjustment32</property>
+                                       <property name="snap_to_ticks">True</property>
+                                       <signal name="value_changed" handler="setting_widget_changed_cb"/>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">1</property>
+                                       <property name="bottom_attach">2</property>
+                                       <property name="left_attach">1</property>
+                                       <property name="right_attach">2</property>
+                    <property name="x_options"></property>
+                                 </packing>
+                               </child>
+                               <child>
+                                 <object class="GtkCheckButton" id="PictureHeightEnable">
+                                       <property name="label" translatable="yes">Maximum Height:</property>
+                                       <property name="visible">True</property>
+                                       <property name="can_focus">True</property>
+                                       <property name="receives_default">False</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="tooltip-text" translatable="yes">Enable maximum height limit.</property>
+                                       <property name="draw_indicator">True</property>
+                                       <signal name="toggled" handler="setting_widget_changed_cb"/>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">2</property>
+                                       <property name="bottom_attach">3</property>
+                                       <property name="left_attach">0</property>
+                                       <property name="right_attach">1</property>
+                    <property name="x_options">GTK_FILL</property>
+                                 </packing>
+                               </child>
+                               <child>
+                                 <object class="GtkSpinButton" id="PictureHeight">
+                                       <property name="visible">True</property>
+                                       <property name="can_focus">True</property>
+                                       <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                       <property name="tooltip-text" translatable="yes">This is the maximum height that the video will be stored at.  Whenever a new source is loaded, this value will be applied if the source height is greater. Setting this to 0 means there is no maximum height.</property>
+                                       <property name="adjustment">adjustment33</property>
+                                       <signal name="value_changed" handler="setting_widget_changed_cb"/>
+                                 </object>
+                                 <packing>
+                                       <property name="top_attach">2</property>
+                                       <property name="bottom_attach">3</property>
+                                       <property name="left_attach">1</property>
+                                       <property name="right_attach">2</property>
+                    <property name="x_options"></property>
+                                 </packing>
+                               </child>
+                         </object>
+                         <packing>
+                               <property name="position">1</property>
+                         </packing>
+                       </child>
             <child>
               <object class="GtkFrame" id="frame14">
                 <property name="visible">True</property>
@@ -4630,8 +5051,8 @@ Requires subme >= 6 and trellis >= 1.</property>
                 </child>
               </object>
               <packing>
-                <property name="padding">2</property>
-                <property name="position">1</property>
+                <property name="padding">10</property>
+                <property name="position">2</property>
               </packing>
             </child>
           </object>
@@ -4690,6 +5111,7 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal handler="activity_window_delete_cb" name="delete_event"/>
     <child>
       <object class="GtkVBox" id="vbox37">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <child>
@@ -4748,6 +5170,7 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal handler="queue_window_delete_cb" name="delete_event"/>
     <child>
       <object class="GtkVBox" id="vbox34">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
         <child>
@@ -4802,6 +5225,7 @@ Requires subme >= 6 and trellis >= 1.</property>
         </child>
         <child>
           <object class="GtkVBox" id="vbox38">
+            <property name="orientation">vertical</property>
             <property name="visible">True</property>
             <child>
               <object class="GtkLabel" id="current_encode">
@@ -4884,6 +5308,7 @@ Requires subme >= 6 and trellis >= 1.</property>
     <signal handler="settings_window_delete_cb" name="delete_event"/>
     <child>
       <object class="GtkVBox" id="vbox40">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="spacing">5</property>
         <child>
@@ -4929,6 +5354,7 @@ Requires subme >= 6 and trellis >= 1.</property>
 
                     <child>
                       <object class="GtkVBox" id="vbox6">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
                         <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                         <child>
@@ -5163,6 +5589,7 @@ the required multiple.</property>
                         <property name="right_padding">2</property>
                         <child>
                           <object class="GtkVBox" id="vbox30">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="spacing">2</property>
@@ -5364,6 +5791,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
                         <property name="right_padding">2</property>
                         <child>
                           <object class="GtkVBox" id="vbox10">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="spacing">2</property>
@@ -5588,6 +6016,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
                 <property name="spacing">16</property>
                         <child>
                           <object class="GtkVBox" id="vbox8">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <child>
@@ -5675,7 +6104,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
                                   <object class="GtkEntry" id="PictureDenoiseCustom">
                                     <property name="width_chars">8</property>
                                     <property name="tooltip-text" translatable="yes">Custom denoise filter string format
-       SpatialLuma:SpatialChroma:TemporalLuma:TemporalChroma</property>
+    SpatialLuma:SpatialChroma:TemporalLuma:TemporalChroma</property>
                                     <signal name="changed" handler="setting_widget_changed_cb"/>
                                   </object>
                                   <packing>
@@ -5703,6 +6132,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
                         </child>
                         <child>
                           <object class="GtkVBox" id="vbox39">
+                            <property name="orientation">vertical</property>
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <child>
@@ -5749,7 +6179,7 @@ Encoders are most effecient when the video dimensions are aligned to some specif
                                   <object class="GtkEntry" id="PictureDetelecineCustom">
                                     <property name="width_chars">8</property>
                                     <property name="tooltip-text" translatable="yes">Custom detelecine filter string format
-       JunkLeft:JunkRight:JunkTop:JunkBottom:StrictBreaks:MetricPlane:Parity</property>
+    JunkLeft:JunkRight:JunkTop:JunkBottom:StrictBreaks:MetricPlane:Parity</property>
                                     <signal name="changed" handler="setting_widget_changed_cb"/>
                                   </object>
                                   <packing>
@@ -5834,7 +6264,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
                                   <object class="GtkEntry" id="PictureDecombCustom">
                                     <property name="width_chars">8</property>
                                     <property name="tooltip-text" translatable="yes">Custom decomb filter string format
-       Mode:SpatialMetric:MotionThresh:SpatialThresh:BlockThresh:BlockWidth:BlockHeight:MagnitudeThres:VarianceThres:LaplacianThresh:DilationThresh:ErosionThresh:NoiseThresh:MaxSearchDistance:PostProcessing:Parity</property>
+    Mode:SpatialMetric:MotionThresh:SpatialThresh:BlockThresh:BlockWidth:BlockHeight:MagnitudeThres:VarianceThres:LaplacianThresh:DilationThresh:ErosionThresh:NoiseThresh:MaxSearchDistance:PostProcessing:Parity</property>
                                     <signal name="changed" handler="setting_widget_changed_cb"/>
                                   </object>
                                   <packing>
@@ -5878,7 +6308,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
                                   <object class="GtkEntry" id="PictureDeinterlaceCustom">
                                     <property name="width_chars">8</property>
                                     <property name="tooltip-text" translatable="yes">Custom deinterlace filter string format
-       YadifMode:YadifParity:McdintMode:McdeintQp</property>
+    YadifMode:YadifParity:McdintMode:McdeintQp</property>
                                     <signal name="changed" handler="setting_widget_changed_cb"/>
                                   </object>
                                   <packing>
@@ -5969,6 +6399,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
             <property name="bottom_padding">5</property>
             <child>
               <object class="GtkVBox" id="vbox35">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <child>
@@ -5987,7 +6418,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkHBox" id="hbox70">
+                  <object class="GtkHBox" id="live_preview_box">
                     <property name="visible">True</property>
                     <property name="spacing">5</property>
                     <child>
@@ -6025,6 +6456,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
                     </child>
                     <child>
                       <object class="GtkVBox" id="live_progress_box">
+                        <property name="orientation">vertical</property>
                         <property name="visible">True</property>
                         <child>
                           <object class="GtkLabel" id="label71">
@@ -6070,7 +6502,7 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
                     <property name="visible">True</property>
                     <property name="spacing">10</property>
                     <child>
-                      <object class="GtkHBox" id="hbox60">
+                      <object class="GtkHBox" id="live_preview_duration_box">
                         <property name="visible">True</property>
                         <property name="spacing">2</property>
                         <child>
@@ -6186,8 +6618,8 @@ The classic deinterlace filter is applied to all frames. Frames that are not int
     <property name="skip_pager_hint">True</property>
     <property name="program_name">HandBrake</property>
     <property name="version">0.9.2</property>
-    <property name="copyright" translatable="yes">Copyright &#xA9; 2008 John Stebbins
-Copyright &#xA9; 2004 - 2008, HandBrake Devs</property>
+    <property name="copyright" translatable="yes">Copyright &#xA9; 2008 - 2011 John Stebbins
+Copyright &#xA9; 2004 - 2011, HandBrake Devs</property>
     <property name="comments" translatable="yes">HandBrake is a GPL-licensed, multiplatform, multithreaded video transcoder.</property>
     <property name="website">http://handbrake.fr</property>
     <property name="website_label" translatable="yes">http://handbrake.fr</property>
@@ -6371,6 +6803,7 @@ libx264 authors:
     <signal handler="gtk_widget_hide_on_delete" name="delete_event"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox4">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="spacing">2</property>
         <child>
@@ -6404,6 +6837,7 @@ libx264 authors:
     <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox8">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="spacing">2</property>
         <child>
@@ -6411,6 +6845,7 @@ libx264 authors:
             <property name="visible">True</property>
             <child>
               <object class="GtkVBox" id="vbox19">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkEventBox" id="eventbox2">
@@ -6443,6 +6878,7 @@ libx264 authors:
             </child>
             <child>
               <object class="GtkVBox" id="vbox41">
+                <property name="orientation">vertical</property>
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkLabel" id="label22">
@@ -6557,7 +6993,10 @@ libx264 authors:
   </object>
   <object class="GtkFileChooserDialog" id="source_dialog">
     <property name="border_width">5</property>
+    <property name="local-only">False</property>
+    <property name="create-folders">False</property>
     <property name="modal">True</property>
+    <property name="action">GTK_FILE_CHOOSER_ACTION_OPEN</property>
     <property name="type_hint">dialog</property>
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
@@ -6565,10 +7004,12 @@ libx264 authors:
     <signal handler="chooser_file_selected_cb" name="selection-changed"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox9">
+        <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <property name="spacing">2</property>
         <child>
           <object class="GtkVBox" id="source_extra">
+            <property name="orientation">vertical</property>
             <property name="visible">True</property>
             <child>
               <object class="GtkHBox" id="single_title_box">
@@ -6609,21 +7050,6 @@ libx264 authors:
               </packing>
             </child>
             <child>
-              <object class="GtkCheckButton" id="source_folder_flag">
-                <property name="label" translatable="yes">Open VIDEO_TS folder</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="xalign">0</property>
-                <property name="draw_indicator">True</property>
-                <signal handler="source_type_changed_cb" name="toggled"/>
-              </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
               <object class="GtkHBox" id="hbox74">
                 <property name="visible">True</property>
                 <property name="spacing">4</property>
@@ -6662,7 +7088,7 @@ libx264 authors:
                 </child>
               </object>
               <packing>
-                <property name="position">2</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </object>
@@ -6714,7 +7140,7 @@ libx264 authors:
     </child>
     <action-widgets>
       <action-widget response="-6">source_cancel</action-widget>
-      <action-widget response="-3">source_ok</action-widget>
+      <action-widget response="-9">source_ok</action-widget>
     </action-widgets>
   </object>
   <object class="GtkImage" id="image11">
index 81628b6..d151734 100644 (file)
@@ -617,6 +617,10 @@ ghb_compositor_blend (GtkWidget *widget, GdkEventExpose *event)
         {
             /* get our child */
             child = GTK_WIDGET(draw->data);
+            if (!GTK_WIDGET_VISIBLE(cc->widget) || 
+                !GTK_WIDGET_VISIBLE(child))
+                continue;
+
             /* the source data is the (composited) event box */
             gdk_cairo_set_source_pixmap (cr, child->window,
                                         child->allocation.x,
index bb41aa4..9527977 100644 (file)
@@ -2,7 +2,7 @@
  *            hb-backend.c
  *
  *  Fri Mar 28 10:38:44 2008
- *  Copyright  2008  John Stebbins
+ *  Copyright  2008-2011  John Stebbins
  *  <john at stebbins dot name>
  ****************************************************************************/
 
@@ -70,10 +70,23 @@ index_str_init(gint max_index)
        }
 }
 
+static options_map_t d_point_to_point_opts[] =
+{
+       {"Chapters:",       "chapter", 0, "0"},
+       {"Seconds:", "time",    1, "1"},
+       {"Frames:",   "frame",   2, "2"},
+};
+combo_opts_t point_to_point_opts =
+{
+       sizeof(d_point_to_point_opts)/sizeof(options_map_t),
+       d_point_to_point_opts
+};
+
 static options_map_t d_when_complete_opts[] =
 {
        {"Do Nothing",            "nothing",  0, "0"},
        {"Show Notification",     "notify",   1, "1"},
+       {"Quit Handbrake",        "quit",     4, "4"},
        {"Put Computer To Sleep", "sleep",    2, "2"},
        {"Shutdown Computer",     "shutdown", 3, "3"},
 };
@@ -237,12 +250,13 @@ combo_opts_t vcodec_opts =
 
 static options_map_t d_acodec_opts[] =
 {
-       {"AAC (faac)",      "faac",   HB_ACODEC_FAAC,   "faac"},
-       {"MP3 (lame)",      "lame",   HB_ACODEC_LAME,   "lame"},
-       {"Vorbis",          "vorbis", HB_ACODEC_VORBIS, "vorbis"},
-       {"AC3 (pass-thru)", "ac3",    HB_ACODEC_AC3,    "ac3"},
-       {"DTS (pass-thru)", "dts",    HB_ACODEC_DCA,    "dts"},
-       {"Choose For Me",   "auto",   HB_ACODEC_MASK,   "auto"},
+       {"AAC (faac)",      "faac",    HB_ACODEC_FAAC,     "faac"},
+       {"MP3 (lame)",      "lame",    HB_ACODEC_LAME,     "lame"},
+       {"Vorbis",          "vorbis",  HB_ACODEC_VORBIS,   "vorbis"},
+       {"AC3 (ffmpeg)",    "ac3",     HB_ACODEC_AC3,      "ac3"},
+       {"AC3 (pass-thru)", "ac3pass", HB_ACODEC_AC3_PASS, "ac3pass"},
+       {"DTS (pass-thru)", "dtspass", HB_ACODEC_DCA_PASS, "dtspass"},
+       {"Choose For Me",   "auto",    HB_ACODEC_ANY,      "auto"},
 };
 combo_opts_t acodec_opts =
 {
@@ -275,6 +289,30 @@ combo_opts_t badapt_opts =
        d_badapt_opts
 };
 
+static options_map_t d_bpyramid_opts[] =
+{
+       {"Off",    "none",   0, "none"},
+       {"Strict", "strict", 1, "strict"},
+       {"Normal", "normal", 2, "normal"},
+};
+combo_opts_t bpyramid_opts =
+{
+       sizeof(d_bpyramid_opts)/sizeof(options_map_t),
+       d_bpyramid_opts
+};
+
+static options_map_t d_weightp_opts[] =
+{
+       {"Off",   "0", 0, "0"},
+       {"Blind", "1", 1, "1"},
+       {"Smart", "2", 2, "2"},
+};
+combo_opts_t weightp_opts =
+{
+       sizeof(d_weightp_opts)/sizeof(options_map_t),
+       d_weightp_opts
+};
+
 static options_map_t d_me_opts[] =
 {
        {"Diamond",              "dia",  0, "dia"},
@@ -291,16 +329,17 @@ combo_opts_t me_opts =
 
 static options_map_t d_subme_opts[] =
 {
-       {"1", "1", 1, "1"},
-       {"2", "2", 2, "2"},
-       {"3", "3", 3, "3"},
-       {"4", "4", 4, "4"},
-       {"5", "5", 5, "5"},
-       {"6", "6", 6, "6"},
-       {"7", "7", 7, "7"},
-       {"8", "8", 8, "8"},
-       {"9", "9", 9, "9"},
-       {"10", "10", 10, "10"},
+       {"0: SAD, no subpel",          "0", 0, "0"},
+       {"1: SAD, qpel",               "1", 1, "1"},
+       {"2: SATD, qpel",              "2", 2, "2"},
+       {"3: SATD: multi-qpel",        "3", 3, "3"},
+       {"4: SATD, qpel on all",       "4", 4, "4"},
+       {"5: SATD, multi-qpel on all", "5", 5, "5"},
+       {"6: RD in I/P-frames",        "6", 6, "6"},
+       {"7: RD in all frames",        "7", 7, "7"},
+       {"8: RD refine in I/P-frames", "8", 8, "8"},
+       {"9: RD refine in all frames", "9", 9, "9"},
+       {"10: QPRD in all frames",     "10", 10, "10"},
 };
 combo_opts_t subme_opts =
 {
@@ -310,10 +349,11 @@ combo_opts_t subme_opts =
 
 static options_map_t d_analyse_opts[] =
 {
-       {"Some", "some", 0, "some"},
+       {"Most", "p8x8,b8x8,i8x8,i4x4", 0, "p8x8,b8x8,i8x8,i4x4"},
        {"None", "none", 1, "none"},
-       {"All",  "all",  2, "all"},
-       {"Custom",  "custom",  3, "all"},
+       {"Some", "i4x4,i8x8", 2, "i4x4,i8x8"},
+       {"All",  "all",  3, "all"},
+       {"Custom",  "custom",  4, "all"},
 };
 combo_opts_t analyse_opts =
 {
@@ -323,9 +363,9 @@ combo_opts_t analyse_opts =
 
 static options_map_t d_trellis_opts[] =
 {
-       {"Disabled",          "0", 0, "0"},
-       {"Final Macro Block", "1", 1, "1"},
-       {"Always",            "2", 2, "2"},
+       {"Off",         "0", 0, "0"},
+       {"Encode only", "1", 1, "1"},
+       {"Always",      "2", 2, "2"},
 };
 combo_opts_t trellis_opts =
 {
@@ -359,6 +399,7 @@ typedef struct
 
 combo_name_map_t combo_name_map[] =
 {
+       {"PtoPType", &point_to_point_opts},
        {"WhenComplete", &when_complete_opts},
        {"PicturePAR", &par_opts},
        {"PictureModulus", &alignment_opts},
@@ -373,8 +414,11 @@ combo_name_map_t combo_name_map[] =
        {"PictureDenoise", &denoise_opts},
        {"VideoEncoder", &vcodec_opts},
        {"AudioEncoder", &acodec_opts},
+       {"AudioEncoderActual", &acodec_opts},
        {"x264_direct", &direct_opts},
        {"x264_b_adapt", &badapt_opts},
+       {"x264_bpyramid", &bpyramid_opts},
+       {"x264_weighted_pframes", &weightp_opts},
        {"x264_me", &me_opts},
        {"x264_subme", &subme_opts},
        {"x264_analyse", &analyse_opts},
@@ -718,23 +762,67 @@ ghb_vquality_range(
        }
 }
 
+gint
+find_combo_entry(combo_opts_t *opts, const GValue *gval)
+{
+       gint ii;
+
+       if (G_VALUE_TYPE(gval) == G_TYPE_STRING)
+       {
+               gchar *str;
+               str = ghb_value_string(gval);
+               for (ii = 0; ii < opts->count; ii++)
+               {
+                       if (strcmp(opts->map[ii].shortOpt, str) == 0)
+                       {
+                               break;
+                       }
+               }
+               g_free(str);
+               return ii;
+       }
+       else if (G_VALUE_TYPE(gval) == G_TYPE_DOUBLE)
+       {
+               gdouble val;
+               val = ghb_value_double(gval);
+               for (ii = 0; ii < opts->count; ii++)
+               {
+                       if (opts->map[ii].ivalue == val)
+                       {
+                               break;
+                       }
+               }
+               return ii;
+       }
+       else if (G_VALUE_TYPE(gval) == G_TYPE_INT ||
+                        G_VALUE_TYPE(gval) == G_TYPE_BOOLEAN ||
+                        G_VALUE_TYPE(gval) == G_TYPE_INT64)
+       {
+               gint64 val;
+               val = ghb_value_int64(gval);
+               for (ii = 0; ii < opts->count; ii++)
+               {
+                       if ((gint64)opts->map[ii].ivalue == val)
+                       {
+                               break;
+                       }
+               }
+               return ii;
+       }
+       return opts->count;
+}
+
 static const gchar*
 lookup_generic_string(combo_opts_t *opts, const GValue *gval)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "";
 
-       str = ghb_value_string(gval);
-       for (ii = 0; ii < opts->count; ii++)
+       ii = find_combo_entry(opts, gval);
+       if (ii < opts->count)
        {
-               if (strcmp(opts->map[ii].shortOpt, str) == 0)
-               {
-                       result = opts->map[ii].svalue;
-                       break;
-               }
+               result = opts->map[ii].svalue;
        }
-       g_free(str);
        return result;
 }
 
@@ -742,19 +830,13 @@ static gint
 lookup_generic_int(combo_opts_t *opts, const GValue *gval)
 {
        gint ii;
-       gchar *str;
        gint result = -1;
 
-       str = ghb_value_string(gval);
-       for (ii = 0; ii < opts->count; ii++)
+       ii = find_combo_entry(opts, gval);
+       if (ii < opts->count)
        {
-               if (strcmp(opts->map[ii].shortOpt, str) == 0)
-               {
-                       result = opts->map[ii].ivalue;
-                       break;
-               }
+               result = opts->map[ii].ivalue;
        }
-       g_free(str);
        return result;
 }
 
@@ -762,19 +844,13 @@ static gdouble
 lookup_generic_double(combo_opts_t *opts, const GValue *gval)
 {
        gint ii;
-       gchar *str;
        gdouble result = -1;
 
-       str = ghb_value_string(gval);
-       for (ii = 0; ii < opts->count; ii++)
+       ii = find_combo_entry(opts, gval);
+       if (ii < opts->count)
        {
-               if (strcmp(opts->map[ii].shortOpt, str) == 0)
-               {
-                       result = opts->map[ii].ivalue;
-                       break;
-               }
+               result = opts->map[ii].ivalue;
        }
-       g_free(str);
        return result;
 }
 
@@ -782,19 +858,13 @@ static const gchar*
 lookup_generic_option(combo_opts_t *opts, const GValue *gval)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "";
 
-       str = ghb_value_string(gval);
-       for (ii = 0; ii < opts->count; ii++)
+       ii = find_combo_entry(opts, gval);
+       if (ii < opts->count)
        {
-               if (strcmp(opts->map[ii].shortOpt, str) == 0)
-               {
-                       result = opts->map[ii].option;
-                       break;
-               }
+               result = opts->map[ii].option;
        }
-       g_free(str);
        return result;
 }
 
@@ -802,20 +872,36 @@ static gint
 lookup_mix_int(const GValue *mix)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
 
-       str = ghb_value_string(mix);
-       for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+               gchar * str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
                {
-                       result = hb_audio_mixdowns[ii].amixdown;
-                       break;
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].amixdown;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].amixdown;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -823,20 +909,73 @@ static const gchar*
 lookup_mix_option(const GValue *mix)
 {
        gint ii;
-       gchar *str;
        gchar *result = "None";
 
 
-       str = ghb_value_string(mix);
-       for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+               gchar *str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
                {
-                       result = hb_audio_mixdowns[ii].human_readable_name;
-                       break;
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].human_readable_name;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].human_readable_name;
+                               break;
+                       }
+               }
+       }
+       return result;
+}
+
+static const gchar*
+lookup_mix_string(const GValue *mix)
+{
+       gint ii;
+       gchar *result = "None";
+
+
+       if (G_VALUE_TYPE(mix) == G_TYPE_STRING)
+       {
+               gchar *str = ghb_value_string(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (strcmp(hb_audio_mixdowns[ii].short_name, str) == 0)
+                       {
+                               result = hb_audio_mixdowns[ii].short_name;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(mix) == G_TYPE_INT ||
+                        G_VALUE_TYPE(mix) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(mix) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(mix);
+               for (ii = 0; ii < hb_audio_mixdowns_count; ii++)
+               {
+                       if (hb_audio_mixdowns[ii].amixdown == val)
+                       {
+                               result = hb_audio_mixdowns[ii].short_name;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -886,21 +1025,37 @@ static gint
 lookup_audio_rate_int(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_rates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_rates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar * str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
                {
-                       result = hb_audio_rates[ii].rate;
-                       break;
+                       if (strcmp(hb_audio_rates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_rates[ii].rate;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
+               {
+                       gint val = ghb_value_int(rate);
+                       if (val == hb_audio_rates[ii].rate)
+                       {
+                               result = hb_audio_rates[ii].rate;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -908,43 +1063,96 @@ static const gchar*
 lookup_audio_rate_option(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "Same as source";
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
+       {
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
+               {
+                       if (strcmp(hb_audio_rates[ii].string, str) == 0)
+                       {
+                               result = hb_audio_rates[ii].string;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               for (ii = 0; ii < hb_audio_rates_count; ii++)
+               {
+                       gint val = ghb_value_int(rate);
+                       if (val == hb_audio_rates[ii].rate)
+                       {
+                               result = hb_audio_rates[ii].string;
+                               break;
+                       }
+               }
+       }
+       return result;
+}
+
+gint
+ghb_find_closest_audio_rate(gint rate)
+{
+       gint ii;
+       gint result;
+
+       result = 0;
        for (ii = 0; ii < hb_audio_rates_count; ii++)
        {
-               if (strcmp(hb_audio_rates[ii].string, str) == 0)
+               if (rate <= hb_audio_rates[ii].rate)
                {
-                       result = hb_audio_rates[ii].string;
+                       result = hb_audio_rates[ii].rate;
                        break;
                }
        }
-       g_free(str);
        return result;
 }
 
+hb_rate_t *ghb_audio_bitrates;
+int ghb_audio_bitrates_count;
+
 static gint
 lookup_audio_bitrate_int(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        gint result = 0;
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
                {
-                       result = hb_audio_bitrates[ii].rate;
-                       break;
+                       if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
+                       {
+                               result = ghb_audio_bitrates[ii].rate;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(rate);
+               for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+               {
+                       if (ghb_audio_bitrates[ii].rate == val)
+                       {
+                               result = ghb_audio_bitrates[ii].rate;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -952,21 +1160,37 @@ static const gchar*
 lookup_audio_bitrate_option(const GValue *rate)
 {
        gint ii;
-       gchar *str;
        const gchar *result = "Same as source";
 
-       // Coincidentally, the string "source" will return 0
-       // which is our flag to use "same as source"
-       str = ghb_value_string(rate);
-       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       if (G_VALUE_TYPE(rate) == G_TYPE_STRING)
        {
-               if (strcmp(hb_audio_bitrates[ii].string, str) == 0)
+               // Coincidentally, the string "source" will return 0
+               // which is our flag to use "same as source"
+               gchar *str = ghb_value_string(rate);
+               for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
                {
-                       result = hb_audio_bitrates[ii].string;
-                       break;
+                       if (strcmp(ghb_audio_bitrates[ii].string, str) == 0)
+                       {
+                               result = ghb_audio_bitrates[ii].string;
+                               break;
+                       }
+               }
+               g_free(str);
+       }
+       else if (G_VALUE_TYPE(rate) == G_TYPE_INT ||
+                        G_VALUE_TYPE(rate) == G_TYPE_INT64 ||
+                        G_VALUE_TYPE(rate) == G_TYPE_DOUBLE)
+       {
+               gint val = ghb_value_int(rate);
+               for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
+               {
+                       if (ghb_audio_bitrates[ii].rate == val)
+                       {
+                               result = ghb_audio_bitrates[ii].string;
+                               break;
+                       }
                }
        }
-       g_free(str);
        return result;
 }
 
@@ -1017,8 +1241,8 @@ lookup_audio_lang_option(const GValue *rate)
        return result;
 }
 
-static GValue*
-get_acodec_value(gint val)
+GValue*
+ghb_lookup_acodec_value(gint val)
 {
        GValue *value = NULL;
        gint ii;
@@ -1028,9 +1252,10 @@ get_acodec_value(gint val)
                if ((int)acodec_opts.map[ii].ivalue == val)
                {
                        value = ghb_string_value_new(acodec_opts.map[ii].shortOpt);
-                       break;
+                       return value;
                }
        }
+       value = ghb_string_value_new("auto");
        return value;
 }
 
@@ -1055,14 +1280,14 @@ get_amix_value(gint val)
 static hb_handle_t * h_scan = NULL;
 static hb_handle_t * h_queue = NULL;
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
+extern void hb_get_temporary_directory(char path[512]);
 
 gchar*
 ghb_get_tmp_dir()
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        return g_strdup(dir);
 }
 
@@ -1071,7 +1296,7 @@ ghb_hb_cleanup(gboolean partial)
 {
        char dir[512];
 
-       hb_get_tempory_directory(h_scan, dir);
+       hb_get_temporary_directory(dir);
        del_tree(dir, !partial);
 }
 
@@ -1109,6 +1334,37 @@ ghb_subtitle_track_source(signal_user_data_t *ud, gint track)
 }
 
 const char*
+ghb_subtitle_source_name(gint source)
+{
+       const gchar * name = "Unknown";
+       switch (source)
+       {
+               case VOBSUB:
+                       name = "VOBSUB";
+                       break;
+               case TX3GSUB:
+                       name = "TX3G";
+                       break;
+               case UTF8SUB:
+                       name = "UTF8";
+                       break;
+               case CC708SUB:
+               case CC608SUB:
+                       name = "CC";
+                       break;
+               case SRTSUB:
+                       name = "SRT";
+                       break;
+               case SSASUB:
+                       name = "SSA";
+                       break;
+               default:
+                       break;
+       }
+       return name;
+}
+
+const char*
 ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track)
 {
        gint titleindex;
@@ -1146,21 +1402,7 @@ ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track)
        sub = hb_list_item( title->list_subtitle, track);
        if (sub != NULL)
        {
-               switch (sub->source)
-               {
-                       case VOBSUB:
-                               name = "Bitmap";
-                               break;
-                       case CC708SUB:
-                       case CC608SUB:
-                               name = "Text";
-                               break;
-                       case SRTSUB:
-                               name = "SRT";
-                               break;
-                       default:
-                               break;
-               }
+               name = ghb_subtitle_source_name(sub->source);
        }
 
 done:
@@ -1223,14 +1465,14 @@ ghb_get_title_number(gint titleindex)
 }
 
 static hb_audio_config_t*
-get_hb_audio(gint titleindex, gint track)
+get_hb_audio(hb_handle_t *h, gint titleindex, gint track)
 {
        hb_list_t  * list;
        hb_title_t * title;
     hb_audio_config_t *audio = NULL;
        
-    if (h_scan == NULL) return NULL;
-       list = hb_get_titles( h_scan );
+    if (h == NULL) return NULL;
+       list = hb_get_titles( h );
        if( !hb_list_count( list ) )
        {
                /* No valid title, stop right there */
@@ -1293,7 +1535,7 @@ ghb_grey_combo_options(GtkBuilder *builder)
 {
        GtkWidget *widget;
        gint container, track, titleindex, acodec;
-    hb_audio_config_t *audio = NULL;
+    hb_audio_config_t *aconfig = NULL;
        GValue *gval;
        
        widget = GHB_WIDGET (builder, "title");
@@ -1304,13 +1546,13 @@ ghb_grey_combo_options(GtkBuilder *builder)
        gval = ghb_widget_value(widget);
        track = ghb_lookup_combo_int("AudioTrack", gval);
        ghb_value_free(gval);
-       audio = get_hb_audio(titleindex, track);
+       aconfig = get_hb_audio(h_scan, titleindex, track);
        widget = GHB_WIDGET (builder, "FileFormat");
        gval = ghb_widget_value(widget);
        container = ghb_lookup_combo_int("FileFormat", gval);
        ghb_value_free(gval);
 
-       grey_combo_box_item(builder, "x264_analyse", 3, TRUE);
+       grey_combo_box_item(builder, "x264_analyse", 4, TRUE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_FAAC, FALSE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_LAME, FALSE);
        grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, FALSE);
@@ -1318,19 +1560,19 @@ ghb_grey_combo_options(GtkBuilder *builder)
        gboolean allow_dca = TRUE;
        allow_dca = (container != HB_MUX_MP4);
 
-       grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_AC3, FALSE);
+       grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_AC3_PASS, FALSE);
        if (allow_dca)
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA, FALSE);
+               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA_PASS, FALSE);
        else
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA, TRUE);
+               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA_PASS, TRUE);
 
-       if (audio && audio->in.codec != HB_ACODEC_AC3)
+       if (aconfig && aconfig->in.codec != HB_ACODEC_AC3)
        {
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_AC3, TRUE);
+               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_AC3_PASS, TRUE);
        }
-       if (audio && audio->in.codec != HB_ACODEC_DCA)
+       if (aconfig && aconfig->in.codec != HB_ACODEC_DCA)
        {
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA, TRUE);
+               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_DCA_PASS, TRUE);
        }
        grey_combo_box_item(builder, "VideoEncoder", HB_VCODEC_THEORA, FALSE);
 
@@ -1338,13 +1580,9 @@ ghb_grey_combo_options(GtkBuilder *builder)
        gval = ghb_widget_value(widget);
        acodec = ghb_lookup_combo_int("AudioEncoder", gval);
        ghb_value_free(gval);
-       if (acodec != HB_ACODEC_AC3)
-       {
-               grey_combo_box_item(builder, "AudioMixdown", 0, TRUE);
-       }
+       grey_combo_box_item(builder, "AudioMixdown", 0, TRUE);
        if (container == HB_MUX_MP4)
        {
-               grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_LAME, TRUE);
                grey_combo_box_item(builder, "AudioEncoder", HB_ACODEC_VORBIS, TRUE);
                grey_combo_box_item(builder, "VideoEncoder", HB_VCODEC_THEORA, TRUE);
        }
@@ -1354,24 +1592,16 @@ ghb_grey_combo_options(GtkBuilder *builder)
        gboolean allow_dolby = TRUE;
        gboolean allow_dpl2 = TRUE;
        gboolean allow_6ch = TRUE;
-       allow_mono = acodec & ~HB_ACODEC_LAME;
+       allow_mono = TRUE;
        allow_6ch = acodec & ~HB_ACODEC_LAME;
-       if (audio)
-       {
-               allow_mono = allow_mono &&
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA));
-               gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch = allow_6ch &&
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
+       if (aconfig)
+       {
+               gint best = hb_get_best_mixdown(acodec, aconfig->in.channel_layout, 0);
+
+               allow_stereo = best >= HB_AMIXDOWN_STEREO;
+               allow_dolby = best >= HB_AMIXDOWN_DOLBY;
+               allow_dpl2 = best >= HB_AMIXDOWN_DOLBYPLII;
+               allow_6ch = best >= HB_AMIXDOWN_6CH;
        }
        grey_combo_box_item(builder, "AudioMixdown", HB_AMIXDOWN_MONO, !allow_mono);
        grey_combo_box_item(builder, "AudioMixdown", HB_AMIXDOWN_STEREO, !allow_stereo);
@@ -1381,88 +1611,12 @@ ghb_grey_combo_options(GtkBuilder *builder)
 }
 
 gint
-ghb_get_best_audio_bitrate(gint acodec, gint br, gint channels)
+ghb_get_best_mix(hb_audio_config_t *aconfig, gint acodec, gint mix)
 {
-       if (acodec & HB_ACODEC_FAAC)
-       {
-       int maxbr = channels * 80;
-               if (br > maxbr)
-                       br = maxbr;
-       }
-       return br;
-}
-
-gint
-ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix)
-{
-    hb_audio_config_t *audio = NULL;
-       gboolean allow_mono = TRUE;
-       gboolean allow_stereo = TRUE;
-       gboolean allow_dolby = TRUE;
-       gboolean allow_dpl2 = TRUE;
-       gboolean allow_6ch = TRUE;
-       
-       if (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
-       {
-               // Audio codec pass-thru.  No mixdown
-               return 0;
-       }
-       audio = get_hb_audio(titleindex, track);
-       if (audio)
-       {
-               allow_mono =
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (acodec & ~HB_ACODEC_LAME);
-               gint layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch =
-                       (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (acodec & ~HB_ACODEC_LAME) &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
-       }
-       gboolean greater = FALSE;
-       if (mix == 0) 
-       {
-               // If no mix is specified, select the best available.
-               mix = HB_AMIXDOWN_6CH;
-       }
-       if (mix == HB_AMIXDOWN_6CH)
-       {
-               greater = TRUE;
-               if (allow_6ch) return HB_AMIXDOWN_6CH;
-       }
-       if (mix == HB_AMIXDOWN_DOLBYPLII || greater)
-       {
-               greater = TRUE;
-               if (allow_dpl2) return HB_AMIXDOWN_DOLBYPLII;
-       }
-       if (mix == HB_AMIXDOWN_DOLBY || greater)
-       {
-               greater = TRUE;
-               if (allow_dolby) return HB_AMIXDOWN_DOLBY;
-       }
-       if (mix == HB_AMIXDOWN_STEREO || greater)
-       {
-               greater = TRUE;
-               if (allow_stereo) return HB_AMIXDOWN_STEREO;
-       }
-       if (mix == HB_AMIXDOWN_MONO || greater)
-       {
-               greater = TRUE;
-               if (allow_mono) return HB_AMIXDOWN_MONO;
-       }
-       if (allow_stereo) return HB_AMIXDOWN_STEREO;
-       if (allow_dolby) return HB_AMIXDOWN_DOLBY;
-       if (allow_dpl2) return HB_AMIXDOWN_DOLBYPLII;
-       if (allow_6ch) return HB_AMIXDOWN_6CH;
-       return 0;
+       int layout;
+       layout = aconfig ? aconfig->in.channel_layout : 
+                                               HB_INPUT_CH_LAYOUT_3F2R | HB_INPUT_CH_LAYOUT_HAS_LFE;
+       return hb_get_best_mixdown( acodec, layout, mix );
 }
 
 // Set up the model for the combo box
@@ -1732,14 +1886,32 @@ title_opts_set(GtkBuilder *builder, const gchar *name)
        for (ii = 0; ii < count; ii++)
        {
                title = (hb_title_t*)hb_list_item(list, ii);
-               if (title->duration != 0)
+               if (title->type == HB_STREAM_TYPE)
                {
-                       titles[ii]  = g_strdup_printf ("%d - %02dh%02dm%02ds",
-                               title->index, title->hours, title->minutes, title->seconds);
+                       if (title->duration != 0)
+                       {
+                               titles[ii]  = g_strdup_printf ("%d - %02dh%02dm%02ds - %s",
+                                       title->index, title->hours, title->minutes, title->seconds, 
+                                       title->name);
+                       }
+                       else
+                       {
+                               titles[ii]  = g_strdup_printf ("%d - %s", 
+                                                                               title->index, title->name);
+                       }
                }
                else
                {
-                       titles[ii]  = g_strdup_printf ("%d - Unknown Length", title->index);
+                       if (title->duration != 0)
+                       {
+                               titles[ii]  = g_strdup_printf ("%d - %02dh%02dm%02ds",
+                                       title->index, title->hours, title->minutes, title->seconds);
+                       }
+                       else
+                       {
+                               titles[ii]  = g_strdup_printf ("%d - Unknown Length", 
+                                                                               title->index);
+                       }
                }
                gtk_list_store_append(store, &iter);
                gtk_list_store_set(store, &iter, 
@@ -1768,7 +1940,7 @@ find_combo_item_by_int(GtkTreeModel *store, gint value, GtkTreeIter *iter)
                do
                {
                        gtk_tree_model_get(store, iter, 3, &ivalue, -1);
-                       if (value == (int)ivalue)
+                       if (value == (gint)ivalue)
                        {
                                foundit = TRUE;
                                break;
@@ -1908,9 +2080,9 @@ subtitle_track_opts_set(GtkBuilder *builder, const gchar *name, gint titleindex)
                for (ii = 0; ii < count; ii++)
                {
                        subtitle = (hb_subtitle_t *)hb_list_item(title->list_subtitle, ii);
-                       // Skip subtitles that must be burned if there is already
-                       // a burned subtitle in the list
-                       options[ii] = g_strdup_printf("%d - %s", ii+1, subtitle->lang);
+                       options[ii] = g_strdup_printf("%d - %s (%s)", ii+1, 
+                               subtitle->lang, 
+                               ghb_subtitle_source_name(subtitle->source));
                        subtitle_opts.map[ii+1].option = options[ii];
                        subtitle_opts.map[ii+1].shortOpt = index_str[ii];
                        subtitle_opts.map[ii+1].ivalue = ii;
@@ -1961,21 +2133,23 @@ ghb_longest_title()
        hb_title_t * title;
        gint ii;
        gint count = 0;
-       guint64 longest = 0;
        gint titleindex = 0;
+       gint feature;
        
        g_debug("ghb_longest_title ()\n");
        if (h_scan == NULL) return 0;
        list = hb_get_titles( h_scan );
        count = hb_list_count( list );
        if (count > 100) count = 100;
+       if (count < 1) return 0;
+       title = (hb_title_t*)hb_list_item(list, 0);
+       feature = title->job->feature;
        for (ii = 0; ii < count; ii++)
        {
                title = (hb_title_t*)hb_list_item(list, ii);
-               if (title->duration > longest)
+               if (title->index == feature)
                {
-                       titleindex = ii;
-                       longest = title->duration;
+                       return ii;
                }
        }
        return titleindex;
@@ -2003,8 +2177,26 @@ ghb_get_source_audio_lang(gint titleindex, gint track)
        if (audio == NULL)
                return NULL;
 
-       lang = g_strdup(audio->lang.iso639_2);
-       return lang;
+       lang = g_strdup(audio->lang.iso639_2);
+       return lang;
+}
+
+static gboolean*
+get_track_used(gint acodec, GHashTable *track_indices, gint count)
+{
+       gboolean *used;
+
+       used = g_hash_table_lookup(track_indices, &acodec);
+       if (used == NULL)
+       {
+               gint *key;
+
+               used = g_malloc0(count * sizeof(gboolean));
+               key = g_malloc(sizeof(gint));
+               *key = acodec;
+               g_hash_table_insert(track_indices, key, used);
+       }
+       return used;
 }
 
 gint
@@ -2012,51 +2204,56 @@ ghb_find_audio_track(
        gint titleindex, 
        const gchar *lang, 
        gint acodec,
+       gint fallback_acodec,
        GHashTable *track_indices)
 {
        hb_list_t  * list;
        hb_title_t * title;
-    hb_audio_config_t * audio;
+       hb_audio_config_t * audio;
        gint ii;
        gint count = 0;
        gint track = -1;
-       gint max_chan = 0;
-       gboolean *used;
+       gint max_chan;
+       gboolean *used = NULL;
+       gboolean *passthru_used;
+       gint try_acodec;
+       gint passthru_acodec;
+       gboolean passthru;
+       gint channels;
        
        g_debug("find_audio_track ()\n");
        if (h_scan == NULL) return -1;
        list = hb_get_titles( h_scan );
-    title = (hb_title_t*)hb_list_item( list, titleindex );
+       title = (hb_title_t*)hb_list_item( list, titleindex );
        if (title != NULL)
        {
                count = hb_list_count( title->list_audio );
        }
        if (count > 10) count = 10;
-       used = g_hash_table_lookup(track_indices, &acodec);
-       if (used == NULL)
-       {
-               used = g_malloc0(count * sizeof(gboolean));
-               g_hash_table_insert(track_indices, &acodec, used);
-       }
        // Try to find an item that matches the preferred language and
        // the passthru codec type
-       if (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
+       max_chan = 0;
+       passthru = (acodec & HB_ACODEC_PASS_FLAG) != 0;
+       if (passthru)
        {
                for (ii = 0; ii < count; ii++)
                {
-                       gint channels;
-
+                       audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+                       passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
+                       // Is the source track use a passthru capable codec?
+                       if (passthru_acodec == 0)
+                               continue;
+                       used = get_track_used(passthru_acodec, track_indices, count);
+                       // Has the track already been used with this codec?
                        if (used[ii])
                                continue;
 
-               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
                        channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
                                                                                                        audio->in.channel_layout);
                        // Find a track that is not visually impaired or dirctor's
                        // commentary, and has the highest channel count.
-                       if ((audio->in.codec & acodec) &&
-                               (audio->lang.type < 2) &&
+                       if ((audio->lang.type < 2) &&
                                ((strcmp(lang, audio->lang.iso639_2) == 0) ||
                                (strcmp(lang, "und") == 0)))
                        {
@@ -2067,6 +2264,11 @@ ghb_find_audio_track(
                                }
                        }
                }
+               try_acodec = fallback_acodec;
+       }
+       else
+       {
+               try_acodec = acodec;
        }
        if (track > -1)
        {
@@ -2074,19 +2276,35 @@ ghb_find_audio_track(
                return track;
        }
        // Try to find an item that matches the preferred language
+       max_chan = 0;
+       used = get_track_used(try_acodec, track_indices, count);
        for (ii = 0; ii < count; ii++)
        {
+               // Has the track already been used with this codec?
                if (used[ii])
                        continue;
-        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
+               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                               title->list_audio, ii );
+               passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+               if (passthru_acodec && passthru)
+               {
+                       passthru_used = get_track_used(passthru_acodec, track_indices, count);
+                       // Has the track already been used with this codec for passthru?
+                       if (passthru_used[ii])
+                               continue;
+               }
+               channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+                                                                                               audio->in.channel_layout);
                // Find a track that is not visually impaired or dirctor's commentary
                if ((audio->lang.type < 2) &&
                        ((strcmp(lang, audio->lang.iso639_2) == 0) ||
                        (strcmp(lang, "und") == 0)))
                {
-                       track = ii;
-                       break;
+                       if (channels > max_chan)
+                       {
+                               track = ii;
+                               max_chan = channels;
+                       }
                }
        }
        if (track > -1)
@@ -2096,23 +2314,27 @@ ghb_find_audio_track(
        }
        // Try to fine an item that does not match the preferred language and
        // matches the passthru codec type
-       if (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
+       max_chan = 0;
+       if (passthru)
        {
                for (ii = 0; ii < count; ii++)
                {
-                       gint channels;
-
+                       audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                                       title->list_audio, ii );
+                       passthru_acodec = HB_ACODEC_PASS_MASK & acodec & audio->in.codec;
+                       // Is the source track use a passthru capable codec?
+                       if (passthru_acodec == 0)
+                               continue;
+                       used = get_track_used(passthru_acodec, track_indices, count);
+                       // Has the track already been used with this codec?
                        if (used[ii])
                                continue;
 
-               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
                        channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
                                                                                                        audio->in.channel_layout);
                        // Find a track that is not visually impaired or dirctor's
                        // commentary, and has the highest channel count.
-                       if ((audio->in.codec & acodec) &&
-                               (audio->lang.type < 2))
+                       if (audio->lang.type < 2)
                        {
                                if (channels > max_chan)
                                {
@@ -2121,6 +2343,11 @@ ghb_find_audio_track(
                                }
                        }
                }
+               try_acodec = fallback_acodec;
+       }
+       else
+       {
+               try_acodec = acodec;
        }
        if (track > -1)
        {
@@ -2128,17 +2355,33 @@ ghb_find_audio_track(
                return track;
        }
        // Try to fine an item that does not match the preferred language
+       max_chan = 0;
+       used = get_track_used(try_acodec, track_indices, count);
        for (ii = 0; ii < count; ii++)
        {
+               // Has the track already been used with this codec?
                if (used[ii])
                        continue;
-        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
                                                                                                        title->list_audio, ii );
+               passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+               channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(
+                                                                                               audio->in.channel_layout);
+               if (passthru_acodec && passthru)
+               {
+                       passthru_used = get_track_used(passthru_acodec, track_indices, count);
+                       // Has the track already been used with this codec for passthru?
+                       if (passthru_used[ii])
+                               continue;
+               }
                // Find a track that is not visually impaired or dirctor's commentary
                if (audio->lang.type < 2)
                {
-                       track = ii;
-                       break;
+                       if (channels > max_chan)
+                       {
+                               track = ii;
+                               max_chan = channels;
+                       }
                }
        }
        if (track > -1)
@@ -2149,8 +2392,17 @@ ghb_find_audio_track(
        // Last ditch, anything goes
        for (ii = 0; ii < count; ii++)
        {
-        audio = (hb_audio_config_t*)hb_list_audio_config_item( 
-                                                                                                       title->list_audio, ii );
+               audio = (hb_audio_config_t*)hb_list_audio_config_item( 
+                                                                                               title->list_audio, ii );
+               passthru_acodec = HB_ACODEC_PASS_MASK & audio->in.codec;
+               if (passthru_acodec && passthru)
+               {
+                       passthru_used = get_track_used(passthru_acodec, track_indices, count);
+                       // Has the track already been used with this codec for passthru?
+                       if (passthru_used[ii])
+                               continue;
+               }
+               // Has the track already been used with this codec?
                if (!used[ii])
                {
                        track = ii;
@@ -2205,6 +2457,18 @@ ghb_find_cc_track(gint titleindex)
        return -2;
 }
 
+static gboolean
+canForce(int source)
+{
+       return (source == VOBSUB);
+}
+
+static gboolean
+canBurn(int source)
+{
+       return (source == VOBSUB || source == SSASUB);
+}
+
 gint
 ghb_find_subtitle_track(
        gint          titleindex, 
@@ -2257,7 +2521,8 @@ ghb_find_subtitle_track(
                                continue;
 
                        subtitle = (hb_subtitle_t*)hb_list_item( title->list_subtitle, ii );
-                       if (((burn || force) && (subtitle->source == VOBSUB)) &&
+                       if (((!force || (force && canForce(subtitle->source))) &&
+                                (!burn  || (burn  &&  canBurn(subtitle->source)))) &&
                                ((strcmp(lang, subtitle->iso639_2) == 0) ||
                                 (strcmp(lang, "und") == 0)))
                        {
@@ -2301,7 +2566,7 @@ small_opts_set(GtkBuilder *builder, const gchar *name, combo_opts_t *opts)
        gint ii;
        gchar *str;
        
-       g_debug("generic_opts_set ()\n");
+       g_debug("small_opts_set ()\n");
        if (name == NULL || opts == NULL) return;
        store = get_combo_box_store(builder, name);
        gtk_list_store_clear(store);
@@ -2422,7 +2687,7 @@ ghb_lookup_combo_string(const gchar *name, const GValue *gval)
        else if (strcmp(name, "VideoFramerate") == 0)
                return lookup_video_rate_option(gval);
        else if (strcmp(name, "AudioMixdown") == 0)
-               return lookup_mix_option(gval);
+               return lookup_mix_string(gval);
        else if (strcmp(name, "SrtLanguage") == 0)
                return lookup_audio_lang_option(gval);
        else if (strcmp(name, "PreferredLanguage") == 0)
@@ -2479,6 +2744,7 @@ ghb_update_ui_combo_box(
                audio_track_opts_set(ud->builder, "AudioTrack", user_data);
                subtitle_track_opts_set(ud->builder, "SubtitleTrack", user_data);
                generic_opts_set(ud->builder, "VideoQualityGranularity", &vqual_granularity_opts);
+               generic_opts_set(ud->builder, "PtoPType", &point_to_point_opts);
                generic_opts_set(ud->builder, "WhenComplete", &when_complete_opts);
                generic_opts_set(ud->builder, "PicturePAR", &par_opts);
                generic_opts_set(ud->builder, "PictureModulus", &alignment_opts);
@@ -2492,12 +2758,14 @@ ghb_update_ui_combo_box(
                generic_opts_set(ud->builder, "PictureDenoise", &denoise_opts);
                generic_opts_set(ud->builder, "VideoEncoder", &vcodec_opts);
                small_opts_set(ud->builder, "AudioEncoder", &acodec_opts);
-               generic_opts_set(ud->builder, "x264_direct", &direct_opts);
-               generic_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
-               generic_opts_set(ud->builder, "x264_me", &me_opts);
-               generic_opts_set(ud->builder, "x264_subme", &subme_opts);
-               generic_opts_set(ud->builder, "x264_analyse", &analyse_opts);
-               generic_opts_set(ud->builder, "x264_trellis", &trellis_opts);
+               small_opts_set(ud->builder, "x264_direct", &direct_opts);
+               small_opts_set(ud->builder, "x264_b_adapt", &badapt_opts);
+               small_opts_set(ud->builder, "x264_bpyramid", &bpyramid_opts);
+               small_opts_set(ud->builder, "x264_weighted_pframes", &weightp_opts);
+               small_opts_set(ud->builder, "x264_me", &me_opts);
+               small_opts_set(ud->builder, "x264_subme", &subme_opts);
+               small_opts_set(ud->builder, "x264_analyse", &analyse_opts);
+               small_opts_set(ud->builder, "x264_trellis", &trellis_opts);
        }
        else
        {
@@ -2573,6 +2841,44 @@ ghb_build_x264opts_string(GValue *settings)
 }
 
 void
+ghb_part_duration(gint tt, gint sc, gint ec, gint *hh, gint *mm, gint *ss)
+{
+       hb_list_t  * list;
+       hb_title_t * title;
+    hb_chapter_t * chapter;
+       gint count, c;
+       gint64 duration;
+       
+       *hh = *mm = *ss = 0;
+       if (h_scan == NULL) return;
+       list = hb_get_titles( h_scan );
+    title = (hb_title_t*)hb_list_item( list, tt );
+       if (title == NULL) return;
+
+       *hh = title->hours;
+       *mm = title->minutes;
+       *ss = title->seconds;
+
+       count = hb_list_count(title->list_chapter);
+       if (sc > count) sc = count;
+       if (ec > count) ec = count;
+
+       if (sc == 1 && ec == count)
+               return;
+
+       duration = 0;
+       for (c = sc; c <= ec; c++)
+       {
+               chapter = hb_list_item(title->list_chapter, c-1);
+               duration += chapter->duration;
+       }
+
+       *hh =   duration / 90000 / 3600;
+       *mm = ((duration / 90000) % 3600) / 60;
+       *ss =  (duration / 90000) % 60;
+}
+
+void
 ghb_get_chapter_duration(gint ti, gint ii, gint *hh, gint *mm, gint *ss)
 {
        hb_list_t  * list;
@@ -2660,6 +2966,15 @@ audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
 
        if (rate < 8) return;
 
+       if (ghb_audio_bitrates[hb_audio_bitrates_count].string)
+       {
+               g_free(ghb_audio_bitrates[hb_audio_bitrates_count].string);
+       }
+       ghb_audio_bitrates[hb_audio_bitrates_count].rate = rate;
+       ghb_audio_bitrates[hb_audio_bitrates_count].string = 
+               g_strdup_printf("%d", rate);
+       ghb_audio_bitrates_count = hb_audio_bitrates_count + 1;
+
        store = get_combo_box_store(builder, name);
        if (!find_combo_item_by_int(GTK_TREE_MODEL(store), rate, &iter))
        {
@@ -2668,9 +2983,9 @@ audio_bitrate_opts_add(GtkBuilder *builder, const gchar *name, gint rate)
                gtk_list_store_set(store, &iter, 
                                                   0, str, 
                                                   1, TRUE, 
-                                                  2, str
+                                                  2, ghb_audio_bitrates[hb_audio_bitrates_count].string
                                                   3, (gdouble)rate, 
-                                                  4, str
+                                                  4, ghb_audio_bitrates[hb_audio_bitrates_count].string
                                                   -1);
                g_free(str);
        }
@@ -2691,6 +3006,8 @@ audio_bitrate_opts_clean(
        guint last = (guint)last_rate;
        guint first = (guint)first_rate;
        
+       ghb_audio_bitrates_count = hb_audio_bitrates_count;
+
        g_debug("audio_bitrate_opts_clean ()\n");
        store = get_combo_box_store(builder, name);
        if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL(store), &iter))
@@ -2699,7 +3016,7 @@ audio_bitrate_opts_clean(
                {
                        gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 3, &ivalue, -1);
                        if (search_rates(
-                               hb_audio_bitrates, ivalue, hb_audio_bitrates_count) < 0)
+                               ghb_audio_bitrates, ivalue, ghb_audio_bitrates_count) < 0)
                        {
                                done = !gtk_list_store_remove(store, &iter);
                        }
@@ -2727,20 +3044,28 @@ audio_bitrate_opts_set(GtkBuilder *builder, const gchar *name)
        gint ii;
        gchar *str;
        
+       ghb_audio_bitrates_count = hb_audio_bitrates_count;
+       ghb_audio_bitrates = calloc(hb_audio_bitrates_count+1, sizeof(hb_rate_t));
+
+       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       {
+               ghb_audio_bitrates[ii] = hb_audio_bitrates[ii];
+       }
+
        g_debug("audio_bitrate_opts_set ()\n");
        store = get_combo_box_store(builder, name);
        gtk_list_store_clear(store);
-       for (ii = 0; ii < hb_audio_bitrates_count; ii++)
+       for (ii = 0; ii < ghb_audio_bitrates_count; ii++)
        {
                gtk_list_store_append(store, &iter);
                str = g_strdup_printf ("<small>%s</small>", 
-                       hb_audio_bitrates[ii].string);
+                       ghb_audio_bitrates[ii].string);
                gtk_list_store_set(store, &iter, 
                                                   0, str,
                                                   1, TRUE, 
-                                                  2, hb_audio_bitrates[ii].string, 
-                                                  3, (gdouble)hb_audio_bitrates[ii].rate, 
-                                                  4, hb_audio_bitrates[ii].string, 
+                                                  2, ghb_audio_bitrates[ii].string, 
+                                                  3, (gdouble)ghb_audio_bitrates[ii].rate, 
+                                                  4, ghb_audio_bitrates[ii].string, 
                                                   -1);
                g_free(str);
        }
@@ -2785,12 +3110,18 @@ ghb_backend_close()
 {
        hb_close(&h_queue);
        hb_close(&h_scan);
+       hb_global_close();
+}
+
+void ghb_backend_scan_stop()
+{
+    hb_scan_stop( h_scan );
 }
 
 void
-ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count)
+ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count, uint64_t min_duration)
 {
-    hb_scan( h_scan, path, titleindex, preview_count, 1 );
+    hb_scan( h_scan, path, titleindex, preview_count, 1, min_duration );
        hb_status.scan.state |= GHB_STATE_SCANNING;
        // initialize count and cur to something that won't cause FPE
        // when computing progress
@@ -2802,7 +3133,7 @@ void
 ghb_backend_queue_scan(const gchar *path, gint titlenum)
 {
        g_debug("ghb_backend_queue_scan()");
-       hb_scan( h_queue, path, titlenum, 10, 0 );
+       hb_scan( h_queue, path, titlenum, 10, 0, 0 );
        hb_status.queue.state |= GHB_STATE_SCANNING;
 }
 
@@ -2951,6 +3282,22 @@ ghb_track_status()
         case HB_STATE_WORKING:
                        hb_status.queue.state |= GHB_STATE_WORKING;
                        hb_status.queue.state &= ~GHB_STATE_PAUSED;
+                       hb_status.queue.state &= ~GHB_STATE_SEARCHING;
+                       hb_status.queue.job_cur = p.job_cur;
+                       hb_status.queue.job_count = p.job_count;
+                       hb_status.queue.progress = p.progress;
+                       hb_status.queue.rate_cur = p.rate_cur;
+                       hb_status.queue.rate_avg = p.rate_avg;
+                       hb_status.queue.hours = p.hours;
+                       hb_status.queue.minutes = p.minutes;
+                       hb_status.queue.seconds = p.seconds;
+                       hb_status.queue.unique_id = p.sequence_id & 0xFFFFFF;
+            break;
+
+        case HB_STATE_SEARCHING:
+                       hb_status.queue.state |= GHB_STATE_SEARCHING;
+                       hb_status.queue.state &= ~GHB_STATE_WORKING;
+                       hb_status.queue.state &= ~GHB_STATE_PAUSED;
                        hb_status.queue.job_cur = p.job_cur;
                        hb_status.queue.job_count = p.job_count;
                        hb_status.queue.progress = p.progress;
@@ -2981,6 +3328,7 @@ ghb_track_status()
                        hb_status.queue.state &= ~GHB_STATE_MUXING;
                        hb_status.queue.state &= ~GHB_STATE_PAUSED;
                        hb_status.queue.state &= ~GHB_STATE_WORKING;
+                       hb_status.queue.state &= ~GHB_STATE_SEARCHING;
                        switch (p.error)
                        {
                        case HB_ERROR_NONE:
@@ -3019,8 +3367,9 @@ ghb_get_title_info(ghb_title_info_t *tinfo, gint titleindex)
                return FALSE;
        }
 
-    title = hb_list_item( list, titleindex );
+       title = hb_list_item( list, titleindex );
        if (title == NULL) return FALSE;        // Bad titleindex
+       tinfo->index = titleindex;
        tinfo->width = title->width;
        tinfo->height = title->height;
        memcpy(tinfo->crop, title->crop, 4 * sizeof(int));
@@ -3032,6 +3381,7 @@ ghb_get_title_info(ghb_title_info_t *tinfo, gint titleindex)
        tinfo->num_chapters = hb_list_count(title->list_chapter);
        tinfo->rate_base = title->rate_base;
        tinfo->rate = title->rate;
+       tinfo->interlaced = title->detected_interlacing;
        hb_reduce(&(tinfo->aspect_n), &(tinfo->aspect_d), 
                                title->width * title->pixel_aspect_width, 
                                title->height * title->pixel_aspect_height);
@@ -3041,27 +3391,33 @@ ghb_get_title_info(ghb_title_info_t *tinfo, gint titleindex)
        tinfo->duration = title->duration;
 
        tinfo->angle_count = title->angle_count;
+       tinfo->path = title->path;
+       tinfo->name = title->name;
+       tinfo->type = title->type;
        return TRUE;
 }
 
-gboolean
-ghb_get_audio_info(ghb_audio_info_t *ainfo, gint titleindex, gint audioindex)
+hb_audio_config_t*
+ghb_get_scan_audio_info(gint titleindex, gint audioindex)
 {
-    hb_audio_config_t *audio;
+    hb_audio_config_t *aconfig;
        
-       audio = get_hb_audio(titleindex, audioindex);
-       if (audio == NULL) return FALSE; // Bad audioindex
-       ainfo->codec = audio->in.codec;
-       ainfo->bitrate = audio->in.bitrate;
-       ainfo->samplerate = audio->in.samplerate;
-       return TRUE;
+       aconfig = get_hb_audio(h_scan, titleindex, audioindex);
+       return aconfig;
 }
 
 gboolean
 ghb_audio_is_passthru(gint acodec)
 {
        g_debug("ghb_audio_is_passthru () \n");
-       return (acodec & (HB_ACODEC_AC3 | HB_ACODEC_DCA));
+       return (acodec & HB_ACODEC_PASS_FLAG) != 0;
+}
+
+gboolean
+ghb_audio_can_passthru(gint acodec)
+{
+       g_debug("ghb_audio_can_passthru () \n");
+       return (acodec & HB_ACODEC_PASS_MASK) != 0;
 }
 
 gint
@@ -3141,9 +3497,9 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        gint mod;
        gint max_width = 0;
        gint max_height = 0;
-       static gboolean busy = FALSE;
        
        g_debug("ghb_set_scale ()\n");
+       picture_settings_deps(ud);
        if (h_scan == NULL) return;
        list = hb_get_titles( h_scan );
        if( !hb_list_count( list ) )
@@ -3154,20 +3510,13 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        gint titleindex;
 
        titleindex = ghb_settings_combo_int(ud->settings, "title");
-    title = hb_list_item( list, titleindex );
+       title = hb_list_item( list, titleindex );
        if (title == NULL) return;
        job   = title->job;
        if (job == NULL) return;
 
-       picture_settings_deps(ud);
-       if (busy) return;
-       busy = TRUE;
-
-       if (!ud->dont_clear_presets && (keep_width || keep_height))
-       {
-               ghb_settings_set_int(ud->settings, "PictureWidth", 0);
-               ghb_settings_set_int(ud->settings, "PictureHeight", 0);
-       }
+       if (ud->scale_busy) return;
+       ud->scale_busy = TRUE;
 
        // First configure widgets
        mod = ghb_settings_combo_int(ud->settings, "PictureModulus");
@@ -3271,10 +3620,13 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        {
                width = ghb_settings_get_int(ud->settings, "scale_width");
                height = ghb_settings_get_int(ud->settings, "scale_height");
-               max_width = MOD_DOWN(
-                       ghb_settings_get_int(ud->settings, "PictureWidth"), mod);
-               max_height = MOD_DOWN(
-                       ghb_settings_get_int(ud->settings, "PictureHeight"), mod);
+               if (mode & GHB_PIC_USE_MAX)
+               {
+                       max_width = MOD_DOWN(
+                               ghb_settings_get_int(ud->settings, "PictureWidth"), mod);
+                       max_height = MOD_DOWN(
+                               ghb_settings_get_int(ud->settings, "PictureHeight"), mod);
+               }
        }
        g_debug("max_width %d, max_height %d\n", max_width, max_height);
 
@@ -3286,25 +3638,19 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        width = MOD_ROUND(width, mod);
        height = MOD_ROUND(height, mod);
 
-       // Adjust dims according to max values
-       if (max_height)
-               height = MIN(height, max_height);
-       if (max_width)
-               width = MIN(width, max_width);
-
+       job->anamorphic.mode = pic_par;
        if (pic_par)
        {
-               job->anamorphic.mode = pic_par;
                // The scaler crashes if the dimensions are not divisible by 2
                // Align mod 2.  And so does something in x264_encoder_headers()
-               job->anamorphic.modulus = mod;
+               job->modulus = mod;
                job->anamorphic.par_width = title->pixel_aspect_width;
                job->anamorphic.par_height = title->pixel_aspect_height;
                job->anamorphic.dar_width = 0;
                job->anamorphic.dar_height = 0;
 
                if (keep_height && pic_par == 2)
-                       width = ((double)height * crop_width / crop_height) + mod / 2;
+                       width = ((double)height * crop_width / crop_height);
                job->width = width;
                job->height = height;
                job->maxWidth = max_width;
@@ -3333,6 +3679,9 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
                {
                        job->anamorphic.keep_display_aspect = 1;
                }
+               // hb_set_anamorphic_size will adjust par, dar, and width/height
+               // to conform to job parameters that have been set, including 
+               // maxWidth and maxHeight
                hb_set_anamorphic_size( job, &width, &height, 
                                                                &par_width, &par_height );
                if (job->anamorphic.mode == 3 && !keep_aspect && 
@@ -3349,7 +3698,12 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        }
        else 
        {
-               job->anamorphic.mode = pic_par;
+               // Adjust dims according to max values
+               if (max_height)
+                       height = MIN(height, max_height);
+               if (max_width)
+                       width = MIN(width, max_width);
+
                if (keep_aspect)
                {
                        gdouble par;
@@ -3428,7 +3782,7 @@ ghb_set_scale(signal_user_data_t *ud, gint mode)
        ghb_ui_update(ud, "PicturePARHeight", ghb_int64_value(par_height));
        ghb_ui_update(ud, "PictureDisplayWidth", ghb_int64_value(disp_width));
        ghb_ui_update(ud, "PictureDisplayHeight", ghb_int64_value(height));
-       busy = FALSE;
+       ud->scale_busy = FALSE;
 }
 
 static void
@@ -3440,7 +3794,7 @@ set_preview_job_settings(hb_job_t *job, GValue *settings)
        job->crop[3] = ghb_settings_get_int(settings, "PictureRightCrop");
 
        job->anamorphic.mode = ghb_settings_combo_int(settings, "PicturePAR");
-       job->anamorphic.modulus = 
+       job->modulus = 
                ghb_settings_combo_int(settings, "PictureModulus");
        job->width = ghb_settings_get_int(settings, "scale_width");
        job->height = ghb_settings_get_int(settings, "scale_height");
@@ -3457,7 +3811,7 @@ set_preview_job_settings(hb_job_t *job, GValue *settings)
                job->crop[1] = 0;
                job->crop[2] = 0;
                job->crop[3] = 0;
-               job->anamorphic.modulus = 2;
+               job->modulus = 2;
        }
 
        gboolean decomb_deint = ghb_settings_get_boolean(settings, "PictureDecombDeinterlace");
@@ -3669,7 +4023,6 @@ ghb_validate_subtitles(signal_user_data_t *ud)
        titleindex = ghb_settings_combo_int(ud->settings, "title");
     title = hb_list_item( list, titleindex );
        if (title == NULL) return FALSE;
-       gint mux = ghb_settings_combo_int(ud->settings, "FileFormat");
 
        const GValue *slist, *settings;
        gint count, ii, source;
@@ -3702,23 +4055,6 @@ ghb_validate_subtitles(signal_user_data_t *ud)
                {
                        one_burned = TRUE;
                }
-               if (!burned && mux == HB_MUX_MP4 && source == VOBSUB)
-               {
-                       // MP4 can only handle burned vobsubs.  make sure there isn't
-                       // already something burned in the list
-                       message = g_strdup_printf(
-                       "Your chosen container does not support soft bitmap subtitles.\n\n"
-                               "You should change your subtitle selections.\n"
-                               "If you continue, some subtitles will be lost.");
-                       if (!ghb_message_dialog(GTK_MESSAGE_WARNING, message, 
-                               "Cancel", "Continue"))
-                       {
-                               g_free(message);
-                               return FALSE;
-                       }
-                       g_free(message);
-                       break;
-               }
                if (source == SRTSUB)
                {
                        gchar *filename;
@@ -3745,62 +4081,63 @@ ghb_validate_subtitles(signal_user_data_t *ud)
 }
 
 gint
-ghb_select_audio_codec(signal_user_data_t *ud, gint track)
+ghb_select_audio_codec(GValue *settings, hb_audio_config_t *aconfig, gint acodec)
 {
-       hb_list_t  * list;
-       hb_title_t * title;
-       hb_audio_config_t *audio;
-
-       if (h_scan == NULL) return -1;
-       list = hb_get_titles( h_scan );
-       if( !hb_list_count( list ) )
-       {
-               return -1;
-       }
-
-       gint titleindex;
-
-       titleindex = ghb_settings_combo_int(ud->settings, "title");
-    title = hb_list_item( list, titleindex );
-       if (title == NULL) return -1;
-
-       gint mux = ghb_settings_combo_int(ud->settings, "FileFormat");
-
-       if (track < 0 || track >= hb_list_count(title->list_audio))
-               return -1;
+       gint mux = ghb_settings_combo_int(settings, "FileFormat");
 
-       audio = (hb_audio_config_t *) hb_list_audio_config_item(
-                                                                       title->list_audio, track );
+       guint32 in_codec = aconfig ? aconfig->in.codec : HB_ACODEC_MASK;
        if (mux == HB_MUX_MP4)
        {
-               if (audio->in.codec == HB_ACODEC_AC3)
-                       return audio->in.codec;
+               if ((acodec & in_codec & HB_ACODEC_AC3))
+               {
+                       return acodec & (in_codec | HB_ACODEC_PASS_FLAG);
+               }
+               else if (acodec & HB_ACODEC_AC3)
+               {
+                       return HB_ACODEC_AC3;
+               }
+               else if (acodec & HB_ACODEC_LAME)
+               {
+                       return HB_ACODEC_LAME;
+               }
+               else if (acodec & HB_ACODEC_FAAC)
+               {
+                       return HB_ACODEC_FAAC;
+               }
                else
+               {
                        return HB_ACODEC_FAAC;
+               }
        }
        else
        {
-               if (audio->in.codec == HB_ACODEC_AC3 || audio->in.codec == HB_ACODEC_DCA)
-                       return audio->in.codec;
+               if ((acodec & in_codec & HB_ACODEC_PASS_MASK))
+               {
+                       return acodec & (in_codec | HB_ACODEC_PASS_FLAG);
+               }
+               else if (acodec & HB_ACODEC_AC3)
+               {
+                       return HB_ACODEC_AC3;
+               }
+               else if (acodec & HB_ACODEC_VORBIS)
+               {
+                       return HB_ACODEC_VORBIS;
+               }
+               else if (acodec & HB_ACODEC_LAME)
+               {
+                       return HB_ACODEC_LAME;
+               }
+               else if (acodec & HB_ACODEC_FAAC)
+               {
+                       return HB_ACODEC_FAAC;
+               }
                else
+               {
                        return HB_ACODEC_LAME;
+               }
        }
 }
 
-const gchar*
-ghb_select_audio_codec_str(signal_user_data_t *ud, gint track)
-{
-       gint acodec, ii;
-
-       acodec = ghb_select_audio_codec(ud, track);
-       for (ii = 0; ii < acodec_opts.count; ii++)
-       {
-               if (acodec_opts.map[ii].ivalue == acodec)
-                       return acodec_opts.map[ii].option;
-       }
-       return "Unknown";
-}
-
 gboolean
 ghb_validate_audio(signal_user_data_t *ud)
 {
@@ -3833,18 +4170,19 @@ ghb_validate_audio(signal_user_data_t *ud)
        for (ii = 0; ii < count; ii++)
        {
                GValue *asettings;
-           hb_audio_config_t *taudio;
+           hb_audio_config_t *aconfig;
 
                asettings = ghb_array_get_nth(audio_list, ii);
                gint track = ghb_settings_combo_int(asettings, "AudioTrack");
                gint codec = ghb_settings_combo_int(asettings, "AudioEncoder");
-               if (codec == HB_ACODEC_MASK)
+               if (codec == HB_ACODEC_ANY)
                        continue;
 
-        taudio = (hb_audio_config_t *) hb_list_audio_config_item(
+        aconfig = (hb_audio_config_t *) hb_list_audio_config_item(
                                                                                        title->list_audio, track );
-               if (!(taudio->in.codec & codec) && 
-                       (codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)))
+               if ( ghb_audio_is_passthru(codec) &&
+                       !(ghb_audio_can_passthru(aconfig->in.codec) && 
+                        (aconfig->in.codec & codec)))
                {
                        // Not supported.  AC3 is passthrough only, so input must be AC3
                        message = g_strdup_printf(
@@ -3857,7 +4195,12 @@ ghb_validate_audio(signal_user_data_t *ud)
                                return FALSE;
                        }
                        g_free(message);
-                       if (mux == HB_MUX_MKV)
+                       if ((codec & HB_ACODEC_AC3) ||
+                               aconfig->in.codec == HB_ACODEC_DCA)
+                       {
+                               codec = HB_ACODEC_AC3;
+                       }
+                       else if (mux == HB_MUX_MKV)
                        {
                                codec = HB_ACODEC_LAME;
                        }
@@ -3865,7 +4208,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                        {
                                codec = HB_ACODEC_FAAC;
                        }
-                       value = get_acodec_value(codec);
+                       value = ghb_lookup_acodec_value(codec);
                        ghb_settings_take_value(asettings, "AudioEncoder", value);
                }
                gchar *a_unsup = NULL;
@@ -3873,12 +4216,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                if (mux == HB_MUX_MP4)
                { 
                        mux_s = "MP4";
-                       // mp4/mp3|vorbis combination is not supported.
-                       if (codec == HB_ACODEC_LAME)
-                       {
-                               a_unsup = "MP3";
-                               codec = HB_ACODEC_FAAC;
-                       }
+                       // mp4/vorbis|DTS combination is not supported.
                        if (codec == HB_ACODEC_VORBIS)
                        {
                                a_unsup = "Vorbis";
@@ -3887,7 +4225,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                        if (codec == HB_ACODEC_DCA)
                        {
                                a_unsup = "DTS";
-                               codec = HB_ACODEC_FAAC;
+                               codec = HB_ACODEC_AC3;
                        }
                }
                if (a_unsup)
@@ -3902,31 +4240,24 @@ ghb_validate_audio(signal_user_data_t *ud)
                                return FALSE;
                        }
                        g_free(message);
-                       value = get_acodec_value(codec);
+                       value = ghb_lookup_acodec_value(codec);
                        ghb_settings_take_value(asettings, "AudioEncoder", value);
                }
+
                gint mix = ghb_settings_combo_int (asettings, "AudioMixdown");
                gboolean allow_mono = TRUE;
                gboolean allow_stereo = TRUE;
                gboolean allow_dolby = TRUE;
                gboolean allow_dpl2 = TRUE;
                gboolean allow_6ch = TRUE;
-               allow_mono =
-                       (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (codec & ~HB_ACODEC_LAME);
-               gint layout = taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-               allow_stereo =
-                       ((layout == HB_INPUT_CH_LAYOUT_MONO && !allow_mono) || layout >= HB_INPUT_CH_LAYOUT_STEREO);
-               allow_dolby =
-                       (layout == HB_INPUT_CH_LAYOUT_3F1R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) || 
-                       (layout == HB_INPUT_CH_LAYOUT_DOLBY);
-               allow_dpl2 = (layout == HB_INPUT_CH_LAYOUT_3F2R);
-               allow_6ch =
-                       (taudio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                       (codec & ~HB_ACODEC_LAME) &&
-                       (layout == HB_INPUT_CH_LAYOUT_3F2R) && 
-                       (taudio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE);
+               allow_mono = TRUE;
+
+               gint best = hb_get_best_mixdown(codec, aconfig->in.channel_layout, 0);
+
+               allow_stereo = best >= HB_AMIXDOWN_STEREO;
+               allow_dolby = best >= HB_AMIXDOWN_DOLBY;
+               allow_dpl2 = best >= HB_AMIXDOWN_DOLBYPLII;
+               allow_6ch = best >= HB_AMIXDOWN_6CH;
 
                gchar *mix_unsup = NULL;
                if (mix == HB_AMIXDOWN_MONO && !allow_mono)
@@ -3961,7 +4292,7 @@ ghb_validate_audio(signal_user_data_t *ud)
                                return FALSE;
                        }
                        g_free(message);
-                       mix = ghb_get_best_mix(titleindex, track, codec, mix);
+                       mix = ghb_get_best_mix(aconfig, codec, mix);
                        value = get_amix_value(mix);
                        ghb_settings_take_value(asettings, "AudioMixdown", value);
                }
@@ -4008,11 +4339,28 @@ ghb_validate_vquality(GValue *settings)
                                max = 62;
                        } break;
                }
-               if (vquality < min || vquality > max)
+               if (vcodec == HB_VCODEC_X264 && vquality == 0.0)
+               {
+                       message = g_strdup_printf(
+                                               "Warning: lossless h.264 selected\n\n"
+                                               "Lossless h.264 is not well supported by\n"
+                                               "many players and editors.\n\n"
+                        "It will produce enormous output files.\n\n"
+                                               "Are you sure you wish to use this setting?",
+                                               (gint)vquality, min, max);
+                       if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message, 
+                                                                       "Cancel", "Continue"))
+                       {
+                               g_free(message);
+                               return FALSE;
+                       }
+                       g_free(message);
+               }
+               else if (vquality < min || vquality > max)
                {
                        message = g_strdup_printf(
-                                               "Interesting video quality choise: %d\n\n"
-                                               "Typical values range from %d to %d.\n"
+                                               "Interesting video quality choice: %d\n\n"
+                                               "Typical values range from %d to %d.\n\n"
                                                "Are you sure you wish to use this setting?",
                                                (gint)vquality, min, max);
                        if (!ghb_message_dialog(GTK_MESSAGE_QUESTION, message, 
@@ -4081,13 +4429,42 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        }
        if (!job->start_at_preview)
        {
-               gint chapter_start, chapter_end;
-               chapter_start = ghb_settings_get_int(js, "start_chapter");
-               chapter_end = ghb_settings_get_int(js, "end_chapter");
+               gint start, end;
                gint num_chapters = hb_list_count(title->list_chapter);
-               job->chapter_start = MIN( num_chapters, chapter_start );
-               job->chapter_end   = MAX( job->chapter_start, chapter_end );
+               gint duration = title->duration / 90000;
+               job->chapter_start = 1;
+               job->chapter_end = num_chapters;
+
+               if (ghb_settings_combo_int(js, "PtoPType") == 0)
+               {
+                       start = ghb_settings_get_int(js, "start_point");
+                       end = ghb_settings_get_int(js, "end_point");
+                       job->chapter_start = MIN( num_chapters, start );
+                       job->chapter_end   = MAX( job->chapter_start, end );
 
+               }
+               if (ghb_settings_combo_int(js, "PtoPType") == 1)
+               {
+                       job->chapter_start = 1;
+                       job->chapter_end = num_chapters;
+                       start = ghb_settings_get_int(js, "start_point");
+                       end = ghb_settings_get_int(js, "end_point");
+                       job->pts_to_start = (int64_t)MIN(duration-1, start) * 90000;
+                       job->pts_to_stop = (int64_t)MAX(start+1, end) * 90000 - 
+                                                               job->pts_to_start;
+               }
+               if (ghb_settings_combo_int(js, "PtoPType") == 2)
+               {
+                       job->chapter_start = 1;
+                       job->chapter_end = num_chapters;
+                       start = ghb_settings_get_int(js, "start_point");
+                       end = ghb_settings_get_int(js, "end_point");
+                       gint64 max_frames;
+                       max_frames = (gint64)duration * title->rate / title->rate_base;
+                       job->frame_to_start = (int64_t)MIN(max_frames-1, start-1);
+                       job->frame_to_stop = (int64_t)MAX(start, end-1) - 
+                                                                job->frame_to_start;
+               }
                job->chapter_markers = ghb_settings_get_boolean(js, "ChapterMarkers");
                if (job->chapter_start == job->chapter_end)
                        job->chapter_markers = 0;
@@ -4097,25 +4474,22 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                        GValue *chapter;
                        gint chap;
                        gint count;
-               
+
                        chapters = ghb_settings_get_value(js, "chapter_list");
                        count = ghb_array_len(chapters);
-                       for(chap = chapter_start; chap <= chapter_end; chap++)
+                       for(chap = 0; chap < count; chap++)
                        {
                                hb_chapter_t * chapter_s;
                                gchar *name;
-                               
+
                                name = NULL;
-                               if (chap-1 < count)
-                               {
-                                       chapter = ghb_array_get_nth(chapters, chap-1);
-                                       name = ghb_value_string(chapter); 
-                               }
+                               chapter = ghb_array_get_nth(chapters, chap);
+                               name = ghb_value_string(chapter); 
                                if (name == NULL)
                                {
-                                       name = g_strdup_printf ("Chapter %2d", chap);
+                                       name = g_strdup_printf ("Chapter %2d", chap+1);
                                }
-                               chapter_s = hb_list_item( job->title->list_chapter, chap - 1);
+                               chapter_s = hb_list_item( job->title->list_chapter, chap);
                                strncpy(chapter_s->title, name, 1023);
                                chapter_s->title[1023] = '\0';
                                g_free(name);
@@ -4140,7 +4514,7 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        gboolean keep_aspect;
        keep_aspect = ghb_settings_get_boolean(js, "PictureKeepRatio");
        job->anamorphic.mode = ghb_settings_combo_int(js, "PicturePAR");
-       job->anamorphic.modulus = ghb_settings_combo_int(js, "PictureModulus");
+       job->modulus = ghb_settings_combo_int(js, "PictureModulus");
        if (job->anamorphic.mode)
        {
                job->anamorphic.par_width = title->pixel_aspect_width;
@@ -4258,7 +4632,11 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        {
                job->vrate = 27000000;
                job->vrate_base = vrate;
-               job->cfr = 1;
+               gboolean pfr = ghb_settings_get_boolean(js, "VideoFrameratePFR");
+               if (pfr)
+                       job->cfr = 2;
+               else
+                       job->cfr = 1;
        }
 
        const GValue *audio_list;
@@ -4271,78 +4649,47 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
        {
                GValue *asettings;
            hb_audio_config_t audio;
-           hb_audio_config_t *taudio;
+           hb_audio_config_t *aconfig;
+               gint acodec;
 
                hb_audio_config_init(&audio);
                asettings = ghb_array_get_nth(audio_list, ii);
                audio.in.track = ghb_settings_get_int(asettings, "AudioTrack");
                audio.out.track = tcount;
-               audio.out.codec = ghb_settings_combo_int(asettings, "AudioEncoder");
-        taudio = (hb_audio_config_t *) hb_list_audio_config_item(
+
+        aconfig = (hb_audio_config_t *) hb_list_audio_config_item(
                                                                        title->list_audio, audio.in.track );
-               if (audio.out.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
-               {
-                       if (!(taudio->in.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA)))
-                       {
-                               // Not supported.  
-                               // AC3/DTS is passthrough only, so input must be AC3/DTS
-                               if (job->mux == HB_MUX_MKV)
-                               {
-                                       audio.out.codec = HB_ACODEC_LAME;
-                               }
-                               else
-                               {
-                                       audio.out.codec = HB_ACODEC_FAAC;
-                               }
-                       }
-                       else
-                       {
-                               audio.out.codec &= taudio->in.codec;
-                       }
-               }
-               if ((job->mux == HB_MUX_MP4) && 
-                       ((audio.out.codec & HB_ACODEC_LAME) ||
-                       (audio.out.codec & HB_ACODEC_DCA) ||
-                       (audio.out.codec & HB_ACODEC_VORBIS)))
-               {
-                       // mp4/mp3|dts|vorbis combination is not supported.
-                       audio.out.codec = HB_ACODEC_FAAC;
-               }
+
+               acodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+               audio.out.codec = ghb_select_audio_codec(js, aconfig, acodec);
+
         audio.out.dynamic_range_compression = 
                        ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
         if (audio.out.dynamic_range_compression < 1.0)
                audio.out.dynamic_range_compression = 0.0;
 
                // It would be better if this were done in libhb for us, but its not yet.
-               if (audio.out.codec & (HB_ACODEC_AC3 | HB_ACODEC_DCA))
+               if (ghb_audio_is_passthru(audio.out.codec))
                {
                        audio.out.mixdown = 0;
                }
                else
                {
-                       int channels;
-
                        audio.out.mixdown = ghb_settings_combo_int(asettings, "AudioMixdown");
-                       if (audio.out.mixdown == HB_AMIXDOWN_MONO)
-                               channels = 1;
-                       else if (audio.out.mixdown == HB_AMIXDOWN_6CH)
-                               channels = 6;
-                       else
-                               channels = 2;
-
                        // Make sure the mixdown is valid and pick a new one if not.
-                       audio.out.mixdown = ghb_get_best_mix(titleindex
-                               audio.in.track, audio.out.codec, audio.out.mixdown);
+                       audio.out.mixdown = ghb_get_best_mix(aconfig, audio.out.codec
+                                                                                                       audio.out.mixdown);
                        audio.out.bitrate = 
                                ghb_settings_combo_int(asettings, "AudioBitrate");
                        gint srate = ghb_settings_combo_int(asettings, "AudioSamplerate");
                        if (srate == 0) // 0 is same as source
-                               audio.out.samplerate = taudio->in.samplerate;
+                               audio.out.samplerate = aconfig->in.samplerate;
                        else
                                audio.out.samplerate = srate;
 
-                       audio.out.bitrate = ghb_get_best_audio_bitrate(
-                               audio.out.codec, audio.out.bitrate, channels);
+                       audio.out.bitrate = hb_get_best_audio_bitrate(
+                               audio.out.codec, audio.out.bitrate, 
+                               audio.out.samplerate, audio.out.mixdown);
                }
 
                // Add it to the jobs audio list
@@ -4396,8 +4743,10 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                        sub_config.offset = ghb_settings_get_int(ssettings, "SrtOffset");
                        lang = ghb_settings_get_string(ssettings, "SrtLanguage");
                        code = ghb_settings_get_string(ssettings, "SrtCodeset");
-                       strncpy(sub_config.src_filename, filename, 128);
-                       strncpy(sub_config.src_codeset, code, 40);
+                       strncpy(sub_config.src_filename, filename, 255);
+                       sub_config.src_filename[255] = 0;
+                       strncpy(sub_config.src_codeset, code, 39);
+                       sub_config.src_codeset[39] = 0;
                        sub_config.force = 0;
                        sub_config.dest = PASSTHRUSUB;
                        sub_config.default_track = def;
@@ -4413,15 +4762,10 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                subtitle = ghb_settings_get_int(ssettings, "SubtitleTrack");
                if (subtitle == -1)
                {
-                       if (!burned && job->mux == HB_MUX_MKV)
+                       if (!burned)
                        {
                                job->select_subtitle_config.dest = PASSTHRUSUB;
                        }
-                       else if (!burned && job->mux == HB_MUX_MP4)
-                       {
-                               // Skip any non-burned vobsubs when output is mp4
-                               continue;
-                       }
                        else if (burned)
                        {
                                // Only allow one subtitle to be burned into the video
@@ -4441,25 +4785,19 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex)
                hb_subtitle_config_t sub_config;
 
                        subt = (hb_subtitle_t *)hb_list_item(title->list_subtitle, subtitle);
-                       sub_config = subt->config;
                        if (subt != NULL)
                        {
-                               if (!burned && job->mux == HB_MUX_MKV && 
-                                       subt->format == PICTURESUB)
+                               sub_config = subt->config;
+                               if (!burned)
                                {
                                        sub_config.dest = PASSTHRUSUB;
                                }
-                               else if (!burned && job->mux == HB_MUX_MP4 && 
-                                       subt->format == PICTURESUB)
-                               {
-                                       // Skip any non-burned vobsubs when output is mp4
-                                       continue;
-                               }
-                               else if ( burned && subt->format == PICTURESUB )
+                               else if ( burned && canBurn(subt->source) )
                                {
                                        // Only allow one subtitle to be burned into the video
                                        if (one_burned)
                                                continue;
+                                       sub_config.dest = RENDERSUB;
                                        one_burned = TRUE;
                                }
                                sub_config.force = force;
index 92b006f..547415c 100644 (file)
@@ -18,6 +18,7 @@
 #define _HBBACKEND_H_
 
 #include "settings.h"
+#include "hb.h"
 
 enum
 {
@@ -59,15 +60,21 @@ typedef struct
 #define GHB_PIC_KEEP_DISPLAY_HEIGHT 0x08
 #define GHB_PIC_KEEP_DAR            0x10
 #define GHB_PIC_KEEP_PAR            0x20
+#define GHB_PIC_USE_MAX             0x40
 
 typedef struct
 {
+       gchar *path;
+       gchar *name;
+       gint index;
+       gint type;
        gint width;
        gint height;
        gint crop[4];
        gint num_chapters;
        gint rate;
        gint rate_base;
+       gint interlaced;
        gint aspect_n;
        gint aspect_d;
        gint hours;
@@ -77,13 +84,6 @@ typedef struct
        gint angle_count;
 } ghb_title_info_t;
 
-typedef struct
-{
-       gint codec;
-       gint bitrate;
-       gint samplerate;
-} ghb_audio_info_t;
-
 #define GHB_AUDIO_SAMPLERATE 1
 #define GHB_AUDIO_BITRATE 2
 #define GHB_FRAMERATE 3
@@ -119,19 +119,21 @@ gint ghb_get_scan_state();
 gint ghb_get_queue_state();
 void ghb_get_status(ghb_status_t *status);
 void ghb_track_status(void);
-void ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count);
+void ghb_backend_scan(const gchar *path, gint titleindex, gint preview_count, guint64 min_duration);
+void ghb_backend_scan_stop();
 void ghb_backend_queue_scan(const gchar *path, gint titleindex);
 gboolean ghb_get_title_info(ghb_title_info_t *tinfo, gint titleindex);
 void ghb_par_init(signal_user_data_t *ud);
 void ghb_set_scale(signal_user_data_t *ud, gint mode);
 GValue* ghb_get_chapters(gint titleindex);
 void ghb_get_chapter_duration(gint ti, gint ii, gint *hh, gint *mm, gint *ss);
-gint ghb_get_best_mix(gint titleindex, gint track, gint acodec, gint mix);
+void ghb_part_duration(gint tt, gint sc, gint ec, gint *hh, gint *mm, gint *ss);
+gint ghb_get_best_mix(hb_audio_config_t *aconfig, gint acodec, gint mix);
 gboolean ghb_ac3_in_audio_list(const GValue *audio_list);
 gboolean ghb_audio_is_passthru(gint acodec);
+gboolean ghb_audio_can_passthru(gint acodec);
 gint ghb_get_default_acodec(void);
-gboolean ghb_get_audio_info(
-       ghb_audio_info_t *ainfo, gint titleindex, gint audioindex);
+hb_audio_config_t* ghb_get_scan_audio_info(gint titleindex, gint audioindex);
 void ghb_set_passthru_bitrate_opts(GtkBuilder *builder, gint bitrate);
 void ghb_set_default_bitrate_opts(
        GtkBuilder *builder, gint first_rate, gint last_rate);
@@ -140,7 +142,8 @@ void ghb_update_ui_combo_box(
        signal_user_data_t *ud, const gchar *name, gint user_data, gboolean all);
 gchar* ghb_get_source_audio_lang(gint titleindex, gint track);
 gint ghb_find_audio_track(
-       gint titleindex, const gchar *lang, gint acodec, GHashTable *track_indices);
+       gint titleindex, const gchar *lang, gint acodec, 
+       gint fallback_acodec, GHashTable *track_indices);
 void ghb_add_all_subtitles(signal_user_data_t *ud, gint titleindex);
 gint ghb_find_pref_subtitle_track(const gchar *lang);
 gint ghb_find_subtitle_track(
@@ -158,6 +161,7 @@ gchar* ghb_dvd_volname(const gchar *device);
 gint ghb_get_title_number(gint titleindex);
 gint ghb_subtitle_track_source(signal_user_data_t *ud, gint track);
 const char* ghb_subtitle_track_source_name(signal_user_data_t *ud, gint track);
+const char* ghb_subtitle_source_name(gint source);
 gchar* ghb_subtitle_track_lang(signal_user_data_t *ud, gint track);
 
 gboolean ghb_validate_vquality(GValue *settings);
@@ -172,7 +176,8 @@ gdouble ghb_lookup_combo_double(const gchar *name, const GValue *gval);
 const gchar* ghb_lookup_combo_option(const gchar *name, const GValue *gval);
 const gchar* ghb_lookup_combo_string(const gchar *name, const GValue *gval);
 gchar* ghb_get_tmp_dir();
-gint ghb_select_audio_codec(signal_user_data_t *ud, gint track);
-const gchar* ghb_select_audio_codec_str(signal_user_data_t *ud, gint track);
+gint ghb_select_audio_codec(GValue *settings, hb_audio_config_t *aconfig, gint acodec);
+gint ghb_find_closest_audio_rate(gint rate);
+GValue* ghb_lookup_acodec_value(gint val);
 
 #endif // _HBBACKEND_H_
index b63640b..7fd0479 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * icon_tools.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * icon_tools.c is free software.
  * 
index 948213d..9054976 100644 (file)
@@ -3,7 +3,6 @@
 #include "values.h"
 #include "resources.h"
 
-#if 0
 void
 ghb_load_icons()
 {
@@ -40,31 +39,3 @@ ghb_load_icons()
                gdk_pixbuf_unref(pb);
        }
 }
-
-#else
-
-void
-ghb_load_icons()
-{
-       GdkPixbuf *pb;
-       GHashTableIter iter;
-       gchar *name;
-       GValue *gval;
-       ghb_rawdata_t *rd;
-       gint size;
-
-       GValue *icons = ghb_resource_get("icons");
-       ghb_dict_iter_init(&iter, icons);
-       // middle (void*) cast prevents gcc warning "defreferencing type-punned
-       // pointer will break strict-aliasing rules"
-       while (g_hash_table_iter_next(
-                       &iter, (gpointer*)(void*)&name, (gpointer*)(void*)&gval))
-       {
-               rd = g_value_get_boxed(gval);
-               pb = icon_deserialize(rd->data, rd->size);
-               size = gdk_pixbuf_get_height(pb);
-               gtk_icon_theme_add_builtin_icon(name, size, pb);
-               gdk_pixbuf_unref(pb);
-       }
-}
-#endif
index ec68024..568da2f 100644 (file)
@@ -4,6 +4,10 @@
 <dict>
        <key>Initialization</key>
        <dict>
+               <key>AudioEncoderActual</key>
+               <string></string>
+               <key>angle_count</key>
+               <integer>1</integer>
                <key>angle</key>
                <integer>1</integer>
                <key>anamorphic</key>
@@ -14,7 +18,7 @@
                <string></string>
                <key>dest_file</key>
                <string>new_video.mp4</string>
-               <key>end_chapter</key>
+               <key>end_point</key>
                <integer>100</integer>
                <key>folder</key>
                <string></string>
@@ -30,6 +34,8 @@
                <integer>720</integer>
                <key>PictureDisplayHeight</key>
                <integer>480</integer>
+               <key>PtoPType</key>
+               <string>chapter</string>
                <key>scale_height</key>
                <integer>0</integer>
                <key>scale_width</key>
@@ -42,7 +48,7 @@
                <false />
                <key>single_title</key>
                <integer>1</integer>
-               <key>start_chapter</key>
+               <key>start_point</key>
                <integer>1</integer>
                <key>start_frame</key>
                <integer>-1</integer>
                <true />
                <key>reduce_hd_preview</key>
                <true />
+               <key>MinTitleDuration</key>
+               <integer>10</integer>
                <key>preview_count</key>
                <integer>10</integer>
                <key>preview_fullscreen</key>
                <integer>0</integer>
                <key>VideoFramerate</key>
                <string>source</string>
+               <key>VideoFrameratePFR</key>
+               <false />
                <key>VideoGrayScale</key>
                <false />
                <key>Mp4HttpOptimize</key>
                                <key>AudioBitrate</key>
                                <string>192</string>
                                <key>AudioEncoder</key>
-                               <string>ac3</string>
+                               <string>ac3pass</string>
                                <key>AudioTrack</key>
                                <integer>1</integer>
                                <key>AudioTrackDescription</key>
index e92f974..de995e9 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * main.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * main.c is free software.
  * 
 #if !defined(_WIN32)
 #include <gst/gst.h>
 #include <libnotify/notify.h>
+#include <dbus/dbus-glib.h>
 #else
 #include <windows.h>
 #include <io.h>
-//#include <pthread/pthread.h>
 #define pipe(phandles) _pipe (phandles, 4096, _O_BINARY)
 #endif
 
@@ -152,7 +152,7 @@ MyConnect(
     g_return_if_fail(handler_name != NULL);
     g_return_if_fail(signal_name != NULL);
 
-       //const gchar *name = gtk_widget_get_name((GtkWidget*)object);
+       //const gchar *name = ghb_get_setting_key((GtkWidget*)object);
        //g_message("\n\nname %s", name);
        g_debug("handler_name %s", handler_name);
        g_debug("signal_name %s", signal_name);
@@ -192,7 +192,7 @@ change_font(GtkWidget *widget, gpointer data)
     font_desc = pango_font_description_from_string(font);
     if (font_desc == NULL) exit(1);
     gtk_widget_modify_font(widget, font_desc);
-    name = gtk_widget_get_name(widget);
+    name = ghb_get_setting_key(widget);
     g_debug("changing font for widget %s\n", name);
     if (GTK_IS_CONTAINER(widget))
     {
@@ -330,12 +330,9 @@ bind_audio_tree_model (signal_user_data_t *ud)
        selection = gtk_tree_view_get_selection (treeview);
        // 12 columns in model.  6 are visible, the other 6 are for storing
        // values that I need
-       treestore = gtk_list_store_new(12, G_TYPE_STRING, G_TYPE_STRING, 
+       treestore = gtk_list_store_new(6, G_TYPE_STRING, G_TYPE_STRING, 
                                                                   G_TYPE_STRING, G_TYPE_STRING, 
-                                                                  G_TYPE_STRING, G_TYPE_STRING,
-                                                                  G_TYPE_STRING, G_TYPE_STRING, 
-                                                                  G_TYPE_STRING, G_TYPE_STRING,
-                                                                  G_TYPE_STRING, G_TYPE_DOUBLE);
+                                                                  G_TYPE_STRING, G_TYPE_STRING);
        gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(treestore));
 
        cell = gtk_cell_renderer_text_new();
@@ -406,10 +403,10 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
        // values that I need
        // Track, force, burn, default, type, srt offset, track short, source
        // force visible, burn visible, offset visible
-       treestore = gtk_list_store_new(11
+       treestore = gtk_list_store_new(10
                                                                        G_TYPE_STRING,
                                                                        G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
-                                                                       G_TYPE_BOOLEAN, G_TYPE_STRING,  
+                                                                       G_TYPE_BOOLEAN,
                                                                        G_TYPE_INT,     G_TYPE_STRING,
                                                                        G_TYPE_INT,
                                                                        G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
@@ -420,19 +417,19 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
        column = gtk_tree_view_column_new_with_attributes(
                                                                        _("Track"), cell, "text", 0, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
-       gtk_tree_view_column_set_min_width (column, 190);
-       gtk_tree_view_column_set_max_width (column, 190);
+       gtk_tree_view_column_set_min_width (column, 350);
+       gtk_tree_view_column_set_max_width (column, 350);
 
        cell = gtk_cell_renderer_toggle_new();
        column = gtk_tree_view_column_new_with_attributes(
-                       _("Forced Only"), cell, "active", 1, "visible", 8, NULL);
+                       _("Forced Only"), cell, "active", 1, "visible", 7, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_forced_toggled_cb, ud);
 
        cell = gtk_cell_renderer_toggle_new();
        gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(cell), TRUE);
        column = gtk_tree_view_column_new_with_attributes(
-                       _("Burned In"), cell, "active", 2, "visible", 9, NULL);
+                       _("Burned In"), cell, "active", 2, "visible", 8, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
        g_signal_connect(cell, "toggled", subtitle_burned_toggled_cb, ud);
 
@@ -445,14 +442,7 @@ bind_subtitle_tree_model (signal_user_data_t *ud)
 
        cell = gtk_cell_renderer_text_new();
        column = gtk_tree_view_column_new_with_attributes(
-                                                                       _("Type"), cell, "text", 4, NULL);
-       gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
-       gtk_tree_view_column_set_min_width (column, 190);
-       gtk_tree_view_column_set_max_width (column, 190);
-
-       cell = gtk_cell_renderer_text_new();
-       column = gtk_tree_view_column_new_with_attributes(
-                       _("Srt Offset"), cell, "text", 5, "visible", 10, NULL);
+                       _("Srt Offset"), cell, "text", 4, "visible", 9, NULL);
        gtk_tree_view_append_column(treeview, GTK_TREE_VIEW_COLUMN(column));
 
 
@@ -519,11 +509,121 @@ bind_presets_tree_model (signal_user_data_t *ud)
 }
 
 static void
+clean_old_logs()
+{
+#if !defined(_WIN32)
+       const gchar *file;
+       gchar *config;
+
+       config = ghb_get_user_config_dir(NULL);
+
+       if (g_file_test(config, G_FILE_TEST_IS_DIR))
+       {
+               GDir *gdir = g_dir_open(config, 0, NULL);
+               file = g_dir_read_name(gdir);
+               while (file)
+               {
+                       if (strncmp(file, "Activity.log.", 13) == 0)
+                       {
+                               gchar *path;
+                               int fd, lock = 1;
+                               int pid;
+
+                               sscanf(file, "Activity.log.%d", &pid);
+
+                               path = g_strdup_printf("%s/ghb.pid.%d", config, pid);
+                               if (g_file_test(path, G_FILE_TEST_EXISTS))
+                               {
+                                       fd = open(path, O_RDWR);
+                                       if (fd >= 0)
+                                       {
+                                               lock = lockf(fd, F_TLOCK, 0);
+                                       }
+                                       g_free(path);
+                                       close(fd);
+                                       if (lock == 0)
+                                       {
+                                               path = g_strdup_printf("%s/%s", config, file);
+                                               g_unlink(path);
+                                               g_free(path);
+                                       }
+                               }
+                               else
+                               {
+                                       g_free(path);
+                                       path = g_strdup_printf("%s/%s", config, file);
+                                       g_unlink(path);
+                                       g_free(path);
+                               }
+                       }
+                       file = g_dir_read_name(gdir);
+               }
+               g_dir_close(gdir);
+       }
+       g_free(config);
+#else
+       const gchar *file;
+       gchar *config;
+
+       config = ghb_get_user_config_dir(NULL);
+
+       if (g_file_test(config, G_FILE_TEST_IS_DIR))
+       {
+               GDir *gdir = g_dir_open(config, 0, NULL);
+               file = g_dir_read_name(gdir);
+               while (file)
+               {
+                       if (strncmp(file, "Activity.log.", 13) == 0)
+                       {
+                               gchar *path;
+                               int pid;
+
+                               sscanf(file, "Activity.log.%d", &pid);
+
+#if 0
+                               int fd, lock = 1;
+
+                               path = g_strdup_printf("%s/ghb.pid.%d", config, pid);
+                               if (g_file_test(path, G_FILE_TEST_EXISTS))
+                               {
+                                       fd = open(path, O_RDWR);
+                                       if (fd >= 0)
+                                       {
+                                               lock = lockf(fd, F_TLOCK, 0);
+                                       }
+                                       g_free(path);
+                                       close(fd);
+                                       if (lock == 0)
+                                       {
+                                               path = g_strdup_printf("%s/%s", config, file);
+                                               g_unlink(path);
+                                               g_free(path);
+                                       }
+                               }
+                               else
+#endif
+                               {
+                                       //g_free(path);
+                                       path = g_strdup_printf("%s/%s", config, file);
+                                       g_unlink(path);
+                                       g_free(path);
+                               }
+                       }
+                       file = g_dir_read_name(gdir);
+               }
+               g_dir_close(gdir);
+       }
+       g_free(config);
+#endif
+}
+
+static void
 IoRedirect(signal_user_data_t *ud)
 {
        GIOChannel *channel;
        gint pfd[2];
        gchar *config, *path, *str;
+       pid_t pid;
 
        // I'm opening a pipe and attaching the writer end to stderr
        // The reader end will be polled by main event loop and I'll get
@@ -533,10 +633,11 @@ IoRedirect(signal_user_data_t *ud)
                g_warning("Failed to redirect IO. Logging impaired\n");
                return;
        }
+       clean_old_logs();
        // Open activity log.
-       // TODO: Put this in the same directory as the encode destination
        config = ghb_get_user_config_dir(NULL);
-       path = g_strdup_printf("%s/%s", config, "Activity.log");
+       pid = getpid();
+       path = g_strdup_printf("%s/Activity.log.%d", config, pid);
        ud->activity_log = g_io_channel_new_file (path, "w", NULL);
        ud->job_activity_log = NULL;
        str = g_strdup_printf("<big><b>%s</b></big>", path);
@@ -546,10 +647,12 @@ IoRedirect(signal_user_data_t *ud)
        g_free(config);
        // Set encoding to raw.
        g_io_channel_set_encoding (ud->activity_log, NULL, NULL);
-#if !defined(_WIN32)
-       stderr->_fileno = pfd[1];
-#else
+       // redirect stderr to the writer end of the pipe
+#if defined(_WIN32)
+       // dup2 doesn't work on windows for some stupid reason
        stderr->_file = pfd[1];
+#else
+       dup2(pfd[1], /*stderr*/2);
 #endif
        setvbuf(stderr, NULL, _IONBF, 0);
        channel = g_io_channel_unix_new (pfd[0]);
@@ -613,10 +716,6 @@ watch_volumes(signal_user_data_t *ud)
 #endif
 }
 
-// Hack to avoid a segfault in libavcodec
-extern int mm_flags;
-int mm_support();
-
 G_MODULE_EXPORT void x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud);
 void preview_window_expose_cb(void);
 
@@ -662,18 +761,12 @@ main (int argc, char *argv[])
        GError *error = NULL;
        GOptionContext *context;
 
-       mm_flags = mm_support();
 #ifdef ENABLE_NLS
        bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        textdomain (GETTEXT_PACKAGE);
 #endif
 
-#ifdef PTW32_STATIC_LIB
-       pthread_win32_process_attach_np();
-       pthread_win32_thread_attach_np();
-#endif
-
        if (!g_thread_supported())
                g_thread_init(NULL);
        context = g_option_context_new ("- Rip and encode DVD or MPEG file");
@@ -684,6 +777,11 @@ main (int argc, char *argv[])
 #endif
        g_option_context_parse (context, &argc, &argv, &error);
        g_option_context_free(context);
+
+       if (argc > 1 && dvd_device == NULL && argv[1][0] != '-')
+       {
+               dvd_device = argv[1];
+       }
        
        gtk_set_locale ();
        gtk_init (&argc, &argv);
@@ -698,24 +796,11 @@ main (int argc, char *argv[])
        ghb_load_icons();
 
 #if !defined(_WIN32)
-       ghb_hal_init();
+       dbus_g_thread_init();
 #endif
+       ghb_udev_init();
 
-       if (!ghb_lock_file("queue_lock"))
-       {
-       const gchar *markup =
-               N_("<b><big>Another instance of HandBrake is already running.</big></b>\n"
-               "\n"
-               "Only one instance of HandBrake may run.\n");
-        GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL,
-            GTK_DIALOG_MODAL,
-            GTK_MESSAGE_ERROR,
-            GTK_BUTTONS_CLOSE,
-            _(markup));
-        gtk_dialog_run(GTK_DIALOG(dialog));
-        gtk_widget_destroy(dialog);
-        exit(EXIT_FAILURE);
-       }
+       ghb_write_pid_file();
        ud = g_malloc0(sizeof(signal_user_data_t));
        ud->debug = ghb_debug;
        g_log_set_handler (NULL, G_LOG_LEVEL_DEBUG, debug_log_handler, ud);
@@ -729,6 +814,19 @@ main (int argc, char *argv[])
        //GtkWidget *widget = GHB_WIDGET(ud->builder, "PictureDetelecineCustom");
        //gtk_entry_set_inner_border(widget, 2);
 
+       // Since GtkBuilder no longer assigns object ids to widget names
+       // Assign a few that are necessary for style overrides to work
+       GtkWidget *widget;
+#if defined(_NO_UPDATE_CHECK)
+       widget = GHB_WIDGET(ud->builder, "check_updates_box");
+       gtk_widget_hide(widget);
+#endif
+
+       widget = GHB_WIDGET(ud->builder, "preview_hud");
+       gtk_widget_set_name(widget, "preview_hud");
+       widget = GHB_WIDGET(ud->builder, "preview_window");
+       gtk_widget_set_name(widget, "preview_window");
+
        // Set up the "hud" control overlay for the preview window
        GtkWidget *draw, *hud, *blender, *align;
 
@@ -820,7 +918,8 @@ main (int argc, char *argv[])
        if (dvd_device != NULL)
        {
                // Source overridden from command line option
-               ghb_settings_set_string(ud->settings, "source", dvd_device);
+               ghb_settings_set_string(ud->settings, "scan_source", dvd_device);
+               g_idle_add((GSourceFunc)ghb_idle_scan, ud);
        }
        // Reload and check status of the last saved queue
        g_idle_add((GSourceFunc)ghb_reload_queue, ud);
@@ -849,7 +948,6 @@ main (int argc, char *argv[])
        // Ugly hack to keep subtitle table from bouncing around as I change
        // which set of controls are visible
        GtkRequisition req;
-       GtkWidget *widget;
        gint height;
        
        widget = GHB_WIDGET(ud->builder, "SrtCodeset");
@@ -875,9 +973,6 @@ main (int argc, char *argv[])
        notify_uninit();
 #endif
        g_free(ud);
-#ifdef PTW32_STATIC_LIB
-       pthread_win32_thread_detach_np();
-       pthread_win32_process_detach_np();
-#endif
+
        return 0;
 }
index 9b5359e..121c565 100644 (file)
@@ -7,59 +7,58 @@ DepEntry = collections.namedtuple('DepEntry', 'widget dep enable die hide')
 dep_map = (
        DepEntry("title", "queue_add", "none", True, False),
        DepEntry("title", "queue_add_menu", "none", True, False),
-       DepEntry("title", "show_picture", "none", True, False),
-       DepEntry("title", "show_preview_menu", "none", True, False),
        DepEntry("title", "preview_frame", "none", True, False),
        DepEntry("title", "picture_label", "none", True, False),
        DepEntry("title", "picture_tab", "none", True, False),
        DepEntry("title", "chapters_label", "none", True, False),
        DepEntry("title", "chapters_tab", "none", True, False),
-       DepEntry("title", "title", "none", True, False),
-       DepEntry("title", "start_chapter", "none", True, False),
-       DepEntry("title", "end_chapter", "none", True, False),
+       DepEntry("title", "start_point", "none", True, False),
+       DepEntry("title", "end_point", "none", True, False),
+       DepEntry("title", "angle", "none", True, False),
+       DepEntry("title", "angle_label", "1", True, False),
+       DepEntry("use_dvdnav", "angle", "FALSE", True, True),
+       DepEntry("use_dvdnav", "angle_label", "FALSE", True, True),
+       DepEntry("angle_count", "angle", "1", True, True),
+       DepEntry("angle_count", "angle_label", "1", True, True),
        DepEntry("vquality_type_bitrate", "VideoAvgBitrate", "TRUE", False, False),
        DepEntry("vquality_type_target", "VideoTargetSize", "TRUE", False, False),
        DepEntry("vquality_type_constant", "VideoQualitySlider", "TRUE", False, False),
-       DepEntry("vquality_type_constant", "constant_rate_factor", "TRUE", False, False),
        DepEntry("vquality_type_constant", "VideoTwoPass", "TRUE", True, False),
        DepEntry("vquality_type_constant", "VideoTurboTwoPass", "TRUE", True, False),
+       DepEntry("VideoFramerate", "VideoFrameratePFR", "source", True, False),
        DepEntry("VideoTwoPass", "VideoTurboTwoPass", "TRUE", False, False),
-       DepEntry("FileFormat", "Mp4LargeFile", "mp4|m4v", False, True),
-       DepEntry("FileFormat", "Mp4HttpOptimize", "mp4|m4v", False, True),
-       DepEntry("FileFormat", "Mp4iPodCompatible", "mp4|m4v", False, True),
-       DepEntry("PictureDecomb", "PictureDeinterlace", "none", False, False),
-       DepEntry("PictureDecomb", "PictureDeinterlaceCustom", "none", False, True),
+       DepEntry("FileFormat", "Mp4LargeFile", "mp4", False, True),
+       DepEntry("FileFormat", "Mp4HttpOptimize", "mp4", False, True),
+       DepEntry("FileFormat", "Mp4iPodCompatible", "mp4", False, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDeinterlace", "TRUE", True, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDeinterlaceCustom", "TRUE", True, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDeinterlaceLabel", "TRUE", True, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDecomb", "FALSE", True, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDecombCustom", "FALSE", True, True),
+       DepEntry("PictureDecombDeinterlace", "PictureDecombLabel", "FALSE", True, True),
        DepEntry("PictureDeinterlace", "PictureDeinterlaceCustom", "custom", False, True),
        DepEntry("PictureDenoise", "PictureDenoiseCustom", "custom", False, True),
        DepEntry("PictureDecomb", "PictureDecombCustom", "custom", False, True),
        DepEntry("PictureDetelecine", "PictureDetelecineCustom", "custom", False, True),
+       DepEntry("PictureWidthEnable", "PictureWidth", "TRUE", False, False),
+       DepEntry("PictureHeightEnable", "PictureHeight", "TRUE", False, False),
        DepEntry("PictureAutoCrop", "PictureTopCrop", "FALSE", False, False),
        DepEntry("PictureAutoCrop", "PictureBottomCrop", "FALSE", False, False),
        DepEntry("PictureAutoCrop", "PictureLeftCrop", "FALSE", False, False),
        DepEntry("PictureAutoCrop", "PictureRightCrop", "FALSE", False, False),
-       DepEntry("autoscale", "scale_width", "FALSE", False, False),
-       DepEntry("autoscale", "scale_height", "FALSE", False, False),
-       DepEntry("anamorphic", "PictureKeepRatio", "FALSE", False, False),
-       ## "CHECK" is a dummy value that forces scale_height deps to
-       ## be re-evaluated whenever anamorphic changes
-       DepEntry("anamorphic", "scale_height", "CHECK", True, False),
-       DepEntry("PictureKeepRatio", "scale_height", "FALSE", False, False),
        DepEntry("VideoEncoder", "x264_tab", "x264", False, False),
        DepEntry("VideoEncoder", "x264_tab_label", "x264", False, False),
        DepEntry("VideoEncoder", "Mp4iPodCompatible", "x264", False, False),
-       DepEntry("AudioEncoder", "AudioBitrate", "ac3|dts", True, False),
-       DepEntry("AudioEncoder", "AudioSamplerate", "ac3|dts", True, False),
-       DepEntry("AudioEncoder", "AudioMixdown", "ac3|dts", True, False),
-       DepEntry("AudioEncoder", "AudioTrackDRCSlider", "ac3|dts", True, False),
-       DepEntry("x264_bframes", "x264_weighted_bframes", "0", True, False),
+       DepEntry("AudioEncoderActual", "AudioBitrate", "ac3pass|dtspass", True, False),
+       DepEntry("AudioEncoderActual", "AudioSamplerate", "ac3pass|dtspass", True, False),
+       DepEntry("AudioEncoderActual", "AudioMixdown", "ac3pass|dtspass", True, False),
+       DepEntry("AudioEncoderActual", "AudioTrackDRCSlider", "ac3pass|dtspass", True, False),
+       DepEntry("AudioEncoderActual", "drc_label", "ac3pass|dtspass", True, False),
        DepEntry("x264_bframes", "x264_bpyramid", "<2", True, False),
        DepEntry("x264_bframes", "x264_direct", "0", True, False),
        DepEntry("x264_bframes", "x264_b_adapt", "0", True, False),
-       DepEntry("x264_refs", "x264_mixed_refs", "<2", True, False),
-       DepEntry("x264_cabac", "x264_trellis", "TRUE", False, False),
        DepEntry("x264_subme", "x264_psy_rd", "<6", True, False),
        DepEntry("x264_subme", "x264_psy_trell", "<6", True, False),
-       DepEntry("x264_cabac", "x264_psy_trell", "TRUE", False, False),
        DepEntry("x264_trellis", "x264_psy_trell", "0", True, False),
        DepEntry("ChapterMarkers", "chapters_list", "TRUE", False, False),
        DepEntry("use_source_name", "chapters_in_destination", "TRUE", False, False),
index 0f234ec..a876152 100644 (file)
@@ -47,7 +47,7 @@
 #endif /* !G_ENABLE_DEBUG */
 
 
-/* VOID:STRING,STRING (marshalers.list:1) */
+/* VOID:STRING,STRING (/home/jstebbins/Source/HandBrake.update-checks/build.debug/../gtk/src/marshalers.list:1) */
 void
 ghb_marshal_VOID__STRING_STRING (GClosure     *closure,
                                  GValue       *return_value G_GNUC_UNUSED,
@@ -84,7 +84,7 @@ ghb_marshal_VOID__STRING_STRING (GClosure     *closure,
             data2);
 }
 
-/* BOOLEAN:BOXED (marshalers.list:2) */
+/* BOOLEAN:BOXED (/home/jstebbins/Source/HandBrake.update-checks/build.debug/../gtk/src/marshalers.list:2) */
 void
 ghb_marshal_BOOLEAN__BOXED (GClosure     *closure,
                             GValue       *return_value G_GNUC_UNUSED,
index 1034f92..a5ae524 100644 (file)
@@ -6,7 +6,7 @@
 
 G_BEGIN_DECLS
 
-/* VOID:STRING,STRING (marshalers.list:1) */
+/* VOID:STRING,STRING (/home/jstebbins/Source/HandBrake.batch/build.dbg/../gtk/src/marshalers.list:1) */
 extern void ghb_marshal_VOID__STRING_STRING (GClosure     *closure,
                                              GValue       *return_value,
                                              guint         n_param_values,
@@ -14,7 +14,7 @@ extern void ghb_marshal_VOID__STRING_STRING (GClosure     *closure,
                                              gpointer      invocation_hint,
                                              gpointer      marshal_data);
 
-/* BOOLEAN:BOXED (marshalers.list:2) */
+/* BOOLEAN:BOXED (/home/jstebbins/Source/HandBrake.batch/build.dbg/../gtk/src/marshalers.list:2) */
 extern void ghb_marshal_BOOLEAN__BOXED (GClosure     *closure,
                                         GValue       *return_value,
                                         guint         n_param_values,
index bac7bb8..db3cd6d 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * presets.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * presets.c is free software.
  * 
@@ -918,6 +918,16 @@ preset_to_ui(signal_user_data_t *ud, GValue *dict)
                        dd = ghb_value_boolean(val);
                        ghb_ui_update(ud, "PictureDeinterlaceDecomb", ghb_boolean_value(!dd));
                }
+               val = ghb_dict_lookup(dict, "PictureHeight");
+               if (val != NULL)
+               {
+                       ghb_ui_update(ud, "scale_height", val);
+               }
+               val = ghb_dict_lookup(dict, "PictureWidth");
+               if (val != NULL)
+               {
+                       ghb_ui_update(ud, "scale_width", val);
+               }
        }
 }
 
@@ -1151,6 +1161,113 @@ ghb_lock_file(const gchar *name)
 #endif
 }
 
+void
+ghb_write_pid_file()
+{
+#if !defined(_WIN32)
+       gchar *config, *path;
+       pid_t pid;
+       FILE *fp;
+       int fd, lock;
+
+       pid = getpid();
+
+       config = ghb_get_user_config_dir(NULL);
+       path = g_strdup_printf ("%s/ghb.pid.%d", config, pid);
+
+       fp = g_fopen(path, "w");
+       fprintf(fp, "%d\n", pid);
+       fclose(fp);
+
+       fd = open(path, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
+       lock = lockf(fd, F_TLOCK, 0);
+
+       g_free(config);
+       g_free(path);
+#endif
+}
+
+void
+ghb_unlink_pid_file(int pid)
+{
+       gchar *config, *path;
+
+       config = ghb_get_user_config_dir(NULL);
+       path = g_strdup_printf ("%s/ghb.pid.%d", config, pid);
+
+       if (g_file_test(path, G_FILE_TEST_IS_REGULAR))
+       {
+               g_unlink(path);
+       }
+
+       g_free(config);
+       g_free(path);
+}
+
+int
+ghb_find_pid_file()
+{
+       const gchar *file;
+       gchar *config;
+
+       config = ghb_get_user_config_dir(NULL);
+
+       if (g_file_test(config, G_FILE_TEST_IS_DIR))
+       {
+               GDir *gdir = g_dir_open(config, 0, NULL);
+               file = g_dir_read_name(gdir);
+               while (file)
+               {
+                       if (strncmp(file, "ghb.pid.", 8) == 0)
+                       {
+                               gchar *path;
+                               pid_t my_pid;
+                               int pid;
+
+                               sscanf(file, "ghb.pid.%d", &pid);
+                               my_pid = getpid();
+                               if (my_pid == pid)
+                               {
+                                       file = g_dir_read_name(gdir);
+                                       continue;
+                               }
+                               path = g_strdup_printf("%s/%s", config, file);
+
+#if !defined(_WIN32)
+                               int fd, lock = 1;
+
+                               fd = open(path, O_RDWR);
+                               if (fd >= 0)
+                               {
+                                       lock = lockf(fd, F_TLOCK, 0);
+                               }
+                               if (lock == 0)
+                               {
+                                       close(fd);
+                                       g_dir_close(gdir);
+                                       g_unlink(path);
+                                       g_free(path);
+                                       g_free(config);
+                                       return pid;
+                               }
+                               g_free(path);
+                               close(fd);
+#else
+                               g_dir_close(gdir);
+                               g_unlink(path);
+                               g_free(path);
+                               g_free(config);
+                               return pid;
+#endif
+                       }
+                       file = g_dir_read_name(gdir);
+               }
+               g_dir_close(gdir);
+       }
+       g_free(config);
+       return -1;
+}
+
 static void
 remove_plist(const gchar *name)
 {
@@ -1241,7 +1358,7 @@ ghb_prefs_to_ui(signal_user_data_t *ud)
                ghb_ui_update(ud, "hbfd", ghb_int64_value(0));
        }
        gval = ghb_settings_get_value(ud->settings, "default_source");
-       ghb_settings_set_value (ud->settings, "source", gval);
+       ghb_settings_set_value (ud->settings, "scan_source", gval);
 
        str = ghb_settings_get_string(ud->settings, "destination_dir");
        ghb_ui_update(ud, "dest_dir", ghb_string_value(str));
@@ -1806,19 +1923,61 @@ remove_std_presets(signal_user_data_t *ud)
 void
 ghb_save_queue(GValue *queue)
 {
-       store_plist(queue, "queue");
+       pid_t pid;
+       char *path;
+
+       pid = getpid();
+       path = g_strdup_printf ("queue.%d", pid);
+       store_plist(queue, path);
+       g_free(path);
 }
 
 GValue*
 ghb_load_queue()
 {
-       return load_plist("queue");
+       GValue *queue;
+       pid_t pid;
+       char *path;
+
+       pid = getpid();
+       path = g_strdup_printf ("queue.%d", pid);
+       queue = load_plist(path);
+       g_free(path);
+       return queue;
+}
+
+GValue*
+ghb_load_old_queue(int pid)
+{
+       GValue *queue;
+       char *path;
+
+       path = g_strdup_printf ("queue.%d", pid);
+       queue = load_plist(path);
+       g_free(path);
+       return queue;
+}
+
+void
+ghb_remove_old_queue_file(int pid)
+{
+       char *path;
+
+       path = g_strdup_printf ("queue.%d", pid);
+       remove_plist(path);
+       g_free(path);
 }
 
 void
 ghb_remove_queue_file()
 {
-       remove_plist("queue");
+       pid_t pid;
+       char *path;
+
+       pid = getpid();
+       path = g_strdup_printf ("queue.%d", pid);
+       remove_plist(path);
+       g_free(path);
 }
 
 typedef struct
@@ -1840,7 +1999,8 @@ static value_map_t acodec_xlat[] =
 {
        {"AAC (faac)", "faac"},
        {"AAC (CoreAudio)", "faac"},
-       {"AC3 Passthru", "ac3"},
+       {"AC3 Passthru", "ac3pass"},
+       {"DTS Passthru", "dtspass"},
        {"MP3 (lame)", "lame"},
        {"Vorbis (vorbis)", "vorbis"},
        {NULL,NULL}
@@ -1863,10 +2023,10 @@ value_map_t framerate_xlat[] =
        {"10", "10"},
        {"12", "12"},
        {"15", "15"},
-       {"23.976", "23.976"},
+       {"23.976 (NTSC Film)", "23.976"},
        {"24", "24"},
-       {"25", "25"},
-       {"29.97", "29.97"},
+       {"25 (PAL Film/Video)", "25"},
+       {"29.97 (NTSC Video)", "29.97"},
        {NULL, NULL}
 };
 
@@ -2528,7 +2688,7 @@ import_xlat_preset(GValue *dict)
        const GValue *gval;
 
        vquality = ghb_value_double(preset_dict_get_value(dict, "VideoQualitySlider"));
-       if (vquality < 1.0)
+       if (vquality > 0.0 && vquality < 1.0)
        {
                gint vcodec;
 
@@ -2903,7 +3063,6 @@ settings_save(signal_user_data_t *ud, const GValue *path)
        GHashTableIter iter;
        gchar *key;
        GValue *value;
-       gboolean autoscale;
        gint *indices, len, count;
        gint *def_indices, def_len;
        const gchar *name;
@@ -2946,7 +3105,6 @@ settings_save(signal_user_data_t *ud, const GValue *path)
                }
        }
        current_preset = dict;
-       autoscale = ghb_settings_get_boolean(ud->settings, "autoscale");
        ghb_settings_set_int64(ud->settings, "Type", PRESETS_CUSTOM);
        ghb_settings_set_int64(ud->settings, "PresetBuildNumber", hb_get_build(NULL));
 
@@ -2958,21 +3116,8 @@ settings_save(signal_user_data_t *ud, const GValue *path)
                        &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&value))
        {
                const GValue *gval;
-               gchar *key2;
 
-               key2 = key;
-               if (!autoscale)
-               {
-                       if (strcmp(key, "PictureWidth") == 0)
-                       {
-                               key2 = "scale_width";
-                       }
-                       else if (strcmp(key, "PictureHeight") == 0)
-                       {
-                               key2 = "scale_height";
-                       }
-               }
-               gval = ghb_settings_get_value(ud->settings, key2);
+               gval = ghb_settings_get_value(ud->settings, key);
                if (gval == NULL)
                {
                        continue;
@@ -3013,6 +3158,20 @@ settings_save(signal_user_data_t *ud, const GValue *path)
                                                ghb_boolean_value_new(FALSE));
                presets_list_insert(ud, indices, len);
        }
+       if (!ghb_settings_get_boolean( ud->settings, "PictureWidthEnable"))
+       {
+               ghb_dict_remove(dict, "PictureWidth");
+       }
+       if (!ghb_settings_get_boolean( ud->settings, "PictureHeightEnable"))
+       {
+               ghb_dict_remove(dict, "PictureHeight");
+       }
+       ghb_dict_insert(dict, g_strdup("autoscale"), 
+               ghb_boolean_value_new(
+                       !ghb_settings_get_boolean( ud->settings, "PictureWidthEnable") &&
+                       !ghb_settings_get_boolean( ud->settings, "PictureHeightEnable")
+               )
+       );
        store_presets();
        ud->dont_clear_presets = TRUE;
        // Make the new preset the selected item
@@ -3242,7 +3401,6 @@ preset_import_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                        return;
                }
                array = ghb_plist_parse_file(filename);
-               g_free(filename);
 
                import_xlat_presets(array);
                presets_clear_default(array);
@@ -3292,8 +3450,10 @@ preset_import_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                        ghb_settings_set_string(ud->settings, "ExportDirectory", dir);
                        ghb_pref_save(ud->settings, "ExportDirectory");
                }
+               g_free(filename);
                g_free(exportDir);
                g_free(dir);
+               store_presets();
        }
        gtk_widget_destroy(dialog);
 }
@@ -3396,7 +3556,7 @@ presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        const gchar *description = "";
        gint count, *indices, len;
 
-       g_debug("presets_save_clicked_cb ()");
+       g_debug("presets_new_folder_clicked_cb ()");
        preset = ghb_settings_get_value (ud->settings, "preset_selection");
 
        count = ghb_array_len(preset);
@@ -3411,12 +3571,12 @@ presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        {
                description = g_value_get_string(
                                                        ghb_dict_lookup(dict, "PresetDescription"));
-               ghb_ui_update(ud, "PresetDescription", ghb_string_value(description));
+               ghb_ui_update(ud, "FolderDescription", ghb_string_value(description));
        }
 
-       desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "PresetDescription"));
-       dialog = GHB_WIDGET(ud->builder, "preset_save_dialog");
-       entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName"));
+       desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "FolderDescription"));
+       dialog = GHB_WIDGET(ud->builder, "preset_new_folder_dialog");
+       entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "FolderName"));
        gtk_entry_set_text(entry, name);
        response = gtk_dialog_run(GTK_DIALOG(dialog));
        gtk_widget_hide(dialog);
@@ -3441,7 +3601,8 @@ presets_new_folder_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                        }
                }
                ghb_array_append(dest, ghb_string_value_new(name));
-               ghb_widget_to_setting(ud->settings, GTK_WIDGET(desc));
+               GValue *val = ghb_widget_value(GTK_WIDGET(desc));
+               ghb_settings_set_value(ud->settings, "PresetDescription", val);
                folder_save(ud, dest);
                ghb_value_free(dest);
        }
@@ -3470,6 +3631,23 @@ presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
                count = 1;
 
        desc = GTK_TEXT_VIEW(GHB_WIDGET(ud->builder, "PresetDescription"));
+       int width = ghb_settings_get_int(ud->settings, "PictureWidth");
+       int height = ghb_settings_get_int(ud->settings, "PictureHeight");
+       gboolean autoscale = ghb_settings_get_boolean(ud->settings, "autoscale");
+       ghb_ui_update(ud, "PictureWidthEnable", 
+               ghb_boolean_value(width!=0&&!autoscale));
+       ghb_ui_update(ud, "PictureHeightEnable", 
+               ghb_boolean_value(height!=0&&!autoscale));
+       if (!width)
+       {
+               width = ghb_settings_get_int(ud->settings, "scale_width");
+               ghb_ui_update(ud, "PictureWidth", ghb_int_value(width));
+       }
+       if (!height)
+       {
+               height = ghb_settings_get_int(ud->settings, "scale_height");
+               ghb_ui_update(ud, "PictureHeight", ghb_int_value(height));
+       }
        dialog = GHB_WIDGET(ud->builder, "preset_save_dialog");
        entry = GTK_ENTRY(GHB_WIDGET(ud->builder, "PresetName"));
        gtk_entry_set_text(entry, name);
@@ -3936,6 +4114,76 @@ preset_update_title_deps(signal_user_data_t *ud, ghb_title_info_t *tinfo)
        }
 }
 
+void
+ghb_refresh_preset(signal_user_data_t *ud)
+{
+       ghb_title_info_t tinfo;
+       GValue *preset;
+       gint *indices, len;
+
+       g_debug("ghb_refresh_preset ()");
+       preset = ghb_settings_get_value(ud->settings, "preset_selection");
+       indices = ghb_preset_indices_from_path(presetsPlist, preset, &len);
+       if (indices)
+       {
+               gboolean folder;
+
+               folder = ghb_presets_get_folder(presetsPlist, indices, len);
+               if (!folder)
+               {
+                       ud->dont_clear_presets = TRUE;
+                       ud->scale_busy = TRUE;
+                       // Temporarily set the video_quality range to (0,100)
+                       // This is needed so the video_quality value does not get
+                       // truncated when set.  The range will be readjusted below
+                       GtkWidget *qp = GHB_WIDGET(ud->builder, "VideoQualitySlider");
+                       gtk_range_set_range (GTK_RANGE(qp), 0, 100);
+                       gtk_scale_set_digits(GTK_SCALE(qp), 3);
+                       // Clear the audio list prior to changing the preset.  Existing 
+                       // audio can cause the container extension to be automatically 
+                       // changed when it shouldn't be
+                       ghb_clear_audio_list(ud);
+                       ghb_set_preset_from_indices(ud, indices, len);
+                       gint titleindex;
+                       titleindex = ghb_settings_combo_int(ud->settings, "title");
+                       ghb_set_pref_audio(titleindex, ud);
+                       ghb_set_pref_subtitle(titleindex, ud);
+                       ghb_settings_set_boolean(ud->settings, "preset_modified", FALSE);
+                       if (ghb_get_title_info (&tinfo, titleindex))
+                       {
+                               preset_update_title_deps(ud, &tinfo);
+                       }
+                       ud->scale_busy = FALSE;
+                       ghb_set_scale (ud, GHB_PIC_KEEP_PAR|GHB_PIC_USE_MAX);
+                       ud->dont_clear_presets = FALSE;
+
+                       gdouble vqmin, vqmax, step, page;
+                       gint digits;
+                       gboolean inverted;
+
+                       ghb_vquality_range(ud, &vqmin, &vqmax, &step, 
+                                                               &page, &digits, &inverted);
+                       gtk_range_set_range (GTK_RANGE(qp), vqmin, vqmax);
+                       gtk_range_set_increments (GTK_RANGE(qp), step, page);
+                       gtk_scale_set_digits(GTK_SCALE(qp), digits);
+                       gtk_range_set_inverted (GTK_RANGE(qp), inverted);
+
+                       gchar *text;
+                       gint crop[4];
+                       GtkWidget *crop_widget;
+                       crop[0] = ghb_settings_get_int(ud->settings, "PictureTopCrop");
+                       crop[1] = ghb_settings_get_int(ud->settings, "PictureBottomCrop");
+                       crop[2] = ghb_settings_get_int(ud->settings, "PictureLeftCrop");
+                       crop[3] = ghb_settings_get_int(ud->settings, "PictureRightCrop");
+                       crop_widget = GHB_WIDGET (ud->builder, "crop_values");
+                       text = g_strdup_printf("%d:%d:%d:%d", 
+                                                                       crop[0], crop[1], crop[2], crop[3]);
+                       gtk_label_set_text (GTK_LABEL(crop_widget), text);
+                       g_free(text);
+               }
+       }
+}
+
 G_MODULE_EXPORT void
 presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud)
 {
@@ -3964,6 +4212,7 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
                if (!folder)
                {
                        ud->dont_clear_presets = TRUE;
+                       ud->scale_busy = TRUE;
                        // Temporarily set the video_quality range to (0,100)
                        // This is needed so the video_quality value does not get
                        // truncated when set.  The range will be readjusted below
@@ -3975,7 +4224,6 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
                        // changed when it shouldn't be
                        ghb_clear_audio_list(ud);
                        ghb_set_preset_from_indices(ud, indices, len);
-                       gtk_tree_path_free(treepath);
                        gint titleindex;
                        titleindex = ghb_settings_combo_int(ud->settings, "title");
                        ghb_set_pref_audio(titleindex, ud);
@@ -3985,7 +4233,8 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
                        {
                                preset_update_title_deps(ud, &tinfo);
                        }
-                       ghb_set_scale (ud, GHB_PIC_KEEP_PAR);
+                       ud->scale_busy = FALSE;
+                       ghb_set_scale (ud, GHB_PIC_KEEP_PAR|GHB_PIC_USE_MAX);
                        ud->dont_clear_presets = FALSE;
 
                        gdouble vqmin, vqmax, step, page;
@@ -4012,6 +4261,7 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
                        gtk_label_set_text (GTK_LABEL(crop_widget), text);
                        g_free(text);
                }
+               gtk_tree_path_free(treepath);
                gtk_widget_set_sensitive(widget, TRUE);
        }
        else
@@ -4019,6 +4269,21 @@ presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_
                g_debug("No selection???  Perhaps unselected.");
                gtk_widget_set_sensitive(widget, FALSE);
        }
+       if (ghb_settings_combo_int(ud->settings, "PtoPType") == 0)
+       {
+               gint start, end;
+               start = ghb_settings_get_int(ud->settings, "start_point");
+               end = ghb_settings_get_int(ud->settings, "end_point");
+               widget = GHB_WIDGET (ud->builder, "ChapterMarkers");
+               gtk_widget_set_sensitive(widget, TRUE);
+               if (start == end)
+               {
+                       ud->dont_clear_presets = TRUE;
+                       ghb_ui_update(ud, "ChapterMarkers", ghb_boolean_value(FALSE));
+                       ud->dont_clear_presets = FALSE;
+                       gtk_widget_set_sensitive(widget, FALSE);
+               }
+       }
 }
 
 void
index 65b4e8c..89f7780 100644 (file)
@@ -27,7 +27,9 @@ void ghb_prefs_save(GValue *settings);
 void ghb_pref_save(GValue *settings, const gchar *key);
 void ghb_save_queue(GValue *queue);
 GValue* ghb_load_queue();
-void ghb_remove_queue_file(void);;
+GValue* ghb_load_old_queue(int pid);
+void ghb_remove_queue_file(void);
+void ghb_remove_old_queue_file(int pid);
 gchar* ghb_get_user_config_dir(gchar *subdir);
 void ghb_settings_to_ui(signal_user_data_t *ud, GValue *dict);
 void ghb_clear_presets_selection(signal_user_data_t *ud);
@@ -41,5 +43,9 @@ gboolean ghb_preset_is_custom(void);
 void ghb_prefs_store(void);
 void ghb_pref_set(GValue *settings, const gchar *key);
 gboolean ghb_lock_file(const gchar *name);
+void ghb_refresh_preset(signal_user_data_t *ud);
+int ghb_find_pid_file();
+void ghb_unlink_pid_file(int pid);
+void ghb_write_pid_file();
 
 #endif // _GHB_PRESETS_H_
index e85130e..796700d 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * preview.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * preview.c is free software.
  * 
@@ -62,6 +62,7 @@ struct preview_s
        gint encode_frame;
        gint live_id;
        gchar *current;
+       gint live_enabled;
 };
 
 #if defined(_ENABLE_GST)
@@ -82,6 +83,9 @@ ghb_screen_par(signal_user_data_t *ud, gint *par_n, gint *par_d)
        GObjectClass *klass;
        GParamSpec *pspec;
 
+       if (!ud->preview->live_enabled)
+               goto fail;
+
        g_value_init(&disp_par, GST_TYPE_FRACTION);
        gst_value_set_fraction(&disp_par, 1, 1);
        g_object_get(ud->preview->play, "video-sink", &xover, NULL);
@@ -160,35 +164,57 @@ ghb_preview_init(signal_user_data_t *ud)
        GstBus *bus;
        GstElement *xover;
 
+#if GTK_CHECK_VERSION(2,18,0)
+       if (!gdk_window_ensure_native(ud->preview->view->window))
+       {
+               g_message("Couldn't create native window for GstXOverlay. Disabling live preview.");
+               GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
+               gtk_widget_hide (widget);
+               widget = GHB_WIDGET(ud->builder, "live_preview_duration_box");
+               gtk_widget_hide (widget);
+               return;
+       }
+#endif
+
 #if !defined(_WIN32)
        ud->preview->xid = GDK_DRAWABLE_XID(ud->preview->view->window);
 #else
        ud->preview->xid = GDK_WINDOW_HWND(ud->preview->view->window);
 #endif
        ud->preview->play = gst_element_factory_make("playbin", "play");
-       //xover = gst_element_factory_make("xvimagesink", "xover");
-       //xover = gst_element_factory_make("ximagesink", "xover");
        xover = gst_element_factory_make("gconfvideosink", "xover");
        if (xover == NULL)
        {
+               xover = gst_element_factory_make("xvimagesink", "xover");
+       }
+       if (xover == NULL)
+       {
+               xover = gst_element_factory_make("ximagesink", "xover");
+       }
+       if (ud->preview->play == NULL || xover == NULL)
+       {
+               g_message("Couldn't initialize gstreamer. Disabling live preview.");
                GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
                gtk_widget_hide (widget);
                widget = GHB_WIDGET(ud->builder, "live_preview_duration_box");
                gtk_widget_hide (widget);
                return;
        }
+       else
+       {
 
-       g_object_set(G_OBJECT(ud->preview->play), "video-sink", xover, NULL);
-       g_object_set(ud->preview->play, "subtitle-font-desc", 
-                               "sans bold 20", NULL);
-       //g_object_set(G_OBJECT(xover), "force-aspect-ratio", TRUE, NULL);
+               g_object_set(G_OBJECT(ud->preview->play), "video-sink", xover, NULL);
+               g_object_set(ud->preview->play, "subtitle-font-desc", 
+                                       "sans bold 20", NULL);
 
-       bus = gst_pipeline_get_bus(GST_PIPELINE(ud->preview->play));
-       gst_bus_add_watch(bus, live_preview_cb, ud);
-       gst_bus_set_sync_handler(bus, create_window, ud->preview);
-       gst_object_unref(bus);
+               bus = gst_pipeline_get_bus(GST_PIPELINE(ud->preview->play));
+               gst_bus_add_watch(bus, live_preview_cb, ud);
+               gst_bus_set_sync_handler(bus, create_window, ud->preview);
+               gst_object_unref(bus);
+               ud->preview->live_enabled = 1;
+       }
 #else
-       GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
+       widget = GHB_WIDGET(ud->builder, "live_preview_box");
        gtk_widget_hide (widget);
        widget = GHB_WIDGET(ud->builder, "live_preview_duration_box");
        gtk_widget_hide (widget);
@@ -445,6 +471,9 @@ live_preview_start(signal_user_data_t *ud)
        GtkImage *img;
        gchar *uri;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        if (!ud->preview->encoded[ud->preview->frame])
        {
@@ -468,6 +497,9 @@ live_preview_pause(signal_user_data_t *ud)
 {
        GtkImage *img;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        gtk_image_set_from_stock(img, "gtk-media-play", GTK_ICON_SIZE_BUTTON);
        gst_element_set_state(ud->preview->play, GST_STATE_PAUSED);
@@ -481,6 +513,9 @@ live_preview_stop(signal_user_data_t *ud)
        GtkImage *img;
        GtkRange *progress;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image"));
        gtk_image_set_from_stock(img, "gtk-media-play", GTK_ICON_SIZE_BUTTON);
 #if defined(_ENABLE_GST)
@@ -517,8 +552,6 @@ ghb_live_reset(signal_user_data_t *ud)
                ghb_set_preview_image(ud);
 }
 
-extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]);
-
 G_MODULE_EXPORT void
 live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
@@ -605,6 +638,9 @@ ghb_live_preview_progress(signal_user_data_t *ud)
        GstFormat fmt = GST_FORMAT_TIME;
        gint64 len = -1, pos = -1;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        if (ud->preview->state != PREVIEW_STATE_LIVE || ud->preview->seek_lock)
                return;
 
@@ -654,6 +690,9 @@ live_preview_seek_cb(GtkWidget *widget, signal_user_data_t *ud)
        gdouble dval;
        gint64 pos;
 
+       if (!ud->preview->live_enabled)
+               return;
+
        if (ud->preview->progress_lock)
                return;
 
@@ -757,6 +796,9 @@ delayed_expose_cb(signal_user_data_t *ud)
        GstElement *vsink;
        GstXOverlay *xover;
 
+       if (!ud->preview->live_enabled)
+               return FALSE;
+
        g_object_get(ud->preview->play, "video-sink", &vsink, NULL);
        if (vsink == NULL)
                return FALSE;
@@ -780,7 +822,7 @@ preview_expose_cb(
        signal_user_data_t *ud)
 {
 #if defined(_ENABLE_GST)
-       if (ud->preview->state == PREVIEW_STATE_LIVE)
+       if (ud->preview->live_enabled && ud->preview->state == PREVIEW_STATE_LIVE)
        {
                if (GST_STATE(ud->preview->play) >= GST_STATE_PAUSED)
                {
@@ -877,7 +919,7 @@ preview_button_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        ghb_widget_to_setting (ud->settings, xwidget);
        ghb_preview_set_visible(ud);
        ghb_check_dependency(ud, xwidget, NULL);
-       const gchar *name = gtk_widget_get_name(xwidget);
+       const gchar *name = ghb_get_setting_key(xwidget);
        ghb_pref_save(ud->settings, name);
 }
 
@@ -934,7 +976,7 @@ fullscreen_clicked_cb(GtkWidget *toggle, signal_user_data_t *ud)
        g_debug("fullscreen_clicked_cb()");
        ghb_widget_to_setting (ud->settings, toggle);
        ghb_check_dependency(ud, toggle, NULL);
-       const gchar *name = gtk_widget_get_name(toggle);
+       const gchar *name = ghb_get_setting_key(toggle);
        ghb_pref_save(ud->settings, name);
 
        window = GTK_WINDOW(GHB_WIDGET (ud->builder, "preview_window"));
@@ -1030,7 +1072,7 @@ preview_duration_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
        ghb_live_reset(ud);
        ghb_widget_to_setting (ud->settings, widget);
        ghb_check_dependency(ud, widget, NULL);
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        ghb_pref_save(ud->settings, name);
 }
 
index 4ba0957..adbbd9c 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * callbacks.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * callbacks.c is free software.
  * 
@@ -70,12 +70,12 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
        gchar *dest, *preset, *vol_name, *basename;
        const gchar *vcodec, *container;
        gchar *fps, *vcodec_abbr;
-       gint title, start_chapter, end_chapter, width, height;
+       gint title, start_point, end_point, width, height;
        gint source_width, source_height;
        gboolean pass2 = FALSE, keep_aspect, vqtype, turbo;
        gint pic_par;
        gboolean tweaks;
-       gchar *escape;
+       gchar *escape, *escape2;
        
        g_debug("update_queue_list ()");
        if (settings == NULL) return;
@@ -84,26 +84,35 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
                
        tweaks = ghb_settings_get_boolean(settings, "allow_tweaks");
        title = ghb_settings_get_int(settings, "titlenum");
-       start_chapter = ghb_settings_get_int(settings, "start_chapter");
-       end_chapter = ghb_settings_get_int(settings, "end_chapter");
+       start_point = ghb_settings_get_int(settings, "start_point");
+       end_point = ghb_settings_get_int(settings, "end_point");
        vol_name = ghb_settings_get_string(settings, "volume_label");
        dest = ghb_settings_get_string(settings, "destination");
        basename = g_path_get_basename(dest);
        escape = g_markup_escape_text(basename, -1);
+       escape2 = g_markup_escape_text(vol_name, -1);
 
        vqtype = ghb_settings_get_boolean(settings, "vquality_type_constant");
        if (!vqtype)
                pass2 = ghb_settings_get_boolean(settings, "VideoTwoPass");
+       const gchar *points = "Chapters";
+       if (ghb_settings_combo_int(settings, "PtoPType") == 0)
+               points = "Chapters";
+       else if (ghb_settings_combo_int(settings, "PtoPType") == 1)
+               points = "Seconds";
+       else if (ghb_settings_combo_int(settings, "PtoPType") == 2)
+               points = "Frames";
        info = g_strdup_printf 
        (
                "<big><b>%s</b></big> "
-               "<small>(Title %d, Chapters %d through %d, %d Video %s)"
+               "<small>(Title %d, %s %d through %d, %d Video %s)"
                " --> %s</small>",
-                vol_name, title, start_chapter, end_chapter
+                escape2, title, points, start_point, end_point
                 pass2 ? 2:1, pass2 ? "Passes":"Pass", escape
        );
        g_free(basename);
        g_free(escape);
+       g_free(escape2);
 
        if (piter)
                iter = *piter;
@@ -398,17 +407,22 @@ add_to_queue_list(signal_user_data_t *ud, GValue *settings, GtkTreeIter *piter)
                gchar *bitrate, *samplerate, *track;
                const gchar *acodec, *mix;
                GValue *asettings;
+               gdouble sr;
 
                asettings = ghb_array_get_nth(audio_list, ii);
 
-               acodec = ghb_settings_combo_option(asettings, "AudioEncoder");
+               acodec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
                bitrate = ghb_settings_get_string(asettings, "AudioBitrate");
+               sr = ghb_settings_get_double(asettings, "AudioSamplerate");
                samplerate = ghb_settings_get_string(asettings, "AudioSamplerate");
-               if (strcmp("source", samplerate) == 0)
+               if ((int)sr == 0)
                {
-                       g_free(samplerate);
                        samplerate = g_strdup("Same As Source");
                }
+               else
+               {
+                       samplerate = g_strdup_printf("%.4g", sr);
+               }
                track = ghb_settings_get_string(asettings, "AudioTrackDescription");
                mix = ghb_settings_combo_option(asettings, "AudioMixdown");
                if (count == 1)
@@ -513,9 +527,9 @@ audio_list_refresh(signal_user_data_t *ud)
                do
                {
                        const gchar *track, *codec, *br, *sr, *mix;
-                       gchar *drc, *s_track, *s_codec, *s_br, *s_sr, *s_mix;
-                       gint itrack, icodec;
-                       gdouble s_drc;
+                       gchar *s_drc;
+                       gint itrack;
+                       gdouble drc;
                        GValue *asettings;
 
                        audio_list = ghb_settings_get_value(ud->settings, "audio_list");
@@ -525,25 +539,16 @@ audio_list_refresh(signal_user_data_t *ud)
 
                        track = ghb_settings_combo_option(asettings, "AudioTrack");
                        itrack = ghb_settings_combo_int(asettings, "AudioTrack");
-                       codec = ghb_settings_combo_option(asettings, "AudioEncoder");
-                       icodec = ghb_settings_combo_int(asettings, "AudioEncoder");
+                       codec = ghb_settings_combo_option(asettings, "AudioEncoderActual");
                        br = ghb_settings_combo_option(asettings, "AudioBitrate");
                        sr = ghb_settings_combo_option(asettings, "AudioSamplerate");
                        mix = ghb_settings_combo_option(asettings, "AudioMixdown");
 
-                       s_track = ghb_settings_get_string(asettings, "AudioTrack");
-                       s_codec = ghb_settings_get_string(asettings, "AudioEncoder");
-                       s_br = ghb_settings_get_string(asettings, "AudioBitrate");
-                       s_sr = ghb_settings_get_string(asettings, "AudioSamplerate");
-                       s_mix = ghb_settings_get_string(asettings, "AudioMixdown");
-                       s_drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
-                       if (s_drc < 1.0)
-                               drc = g_strdup("Off");
+                       drc = ghb_settings_get_double(asettings, "AudioTrackDRCSlider");
+                       if (drc < 1.0)
+                               s_drc = g_strdup("Off");
                        else
-                               drc = g_strdup_printf("%.1f", s_drc);
-
-                       if (icodec == HB_ACODEC_MASK)
-                               codec = ghb_select_audio_codec_str(ud, itrack);
+                               s_drc = g_strdup_printf("%.1f", drc);
 
                        gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                                // These are displayed in list
@@ -552,21 +557,9 @@ audio_list_refresh(signal_user_data_t *ud)
                                2, br,
                                3, sr,
                                4, mix,
-                               5, drc,
-                               // These are used to set combo values when an item is selected
-                               6, s_track,
-                               7, s_codec,
-                               8, s_br,
-                               9, s_sr,
-                               10, s_mix,
-                               11, s_drc,
+                               5, s_drc,
                                -1);
-                       g_free(drc);
-                       g_free(s_track);
-                       g_free(s_codec);
-                       g_free(s_br);
-                       g_free(s_sr);
-                       g_free(s_mix);
+                       g_free(s_drc);
                        done = !gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
                        row++;
                } while (!done);
@@ -1044,13 +1037,19 @@ ghb_queue_buttons_grey(signal_user_data_t *ud)
        scan_state = ghb_get_scan_state();
 
        show_stop = queue_state & 
-                               (GHB_STATE_WORKING | GHB_STATE_SCANNING | GHB_STATE_MUXING);
+                               (GHB_STATE_WORKING | GHB_STATE_SEARCHING | 
+                                GHB_STATE_SCANNING | GHB_STATE_MUXING);
        show_start = !(scan_state & GHB_STATE_SCANNING) && 
                                        (titleindex >= 0 || queue_count > 0);
 
 
        paused = queue_state & GHB_STATE_PAUSED;
 
+       widget = GHB_WIDGET(ud->builder, "queue_add");
+       gtk_widget_set_sensitive(widget, show_start);
+       action = GHB_ACTION(ud->builder, "queue_add_menu");
+       gtk_action_set_sensitive(action, show_start);
+
        widget = GHB_WIDGET (ud->builder, "queue_start1");
        if (show_stop)
        {
@@ -1205,7 +1204,8 @@ queue_start_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
        gint state;
 
        state = ghb_get_queue_state();
-       if (state & (GHB_STATE_WORKING | GHB_STATE_SCANNING | GHB_STATE_MUXING))
+       if (state & (GHB_STATE_WORKING | GHB_STATE_SEARCHING | 
+                                GHB_STATE_SCANNING | GHB_STATE_MUXING))
        {
                ghb_cancel_encode(ud, "You are currently encoding.  "
                                                                "What would you like to do?");
@@ -1250,13 +1250,20 @@ ghb_reload_queue(signal_user_data_t *ud)
        GValue *queue;
        gint unfinished = 0;
        gint count, ii;
+       gint pid;
        gint status;
        GValue *settings;
        gchar *message;
 
        g_debug("ghb_reload_queue");
 
-       queue = ghb_load_queue();
+find_pid:
+       pid = ghb_find_pid_file();
+       if (pid < 0)
+               return FALSE;
+
+       queue = ghb_load_old_queue(pid);
+       ghb_remove_old_queue_file(pid);
        // Look for unfinished entries
        count = ghb_array_len(queue);
        for (ii = 0; ii < count; ii++)
@@ -1268,6 +1275,9 @@ ghb_reload_queue(signal_user_data_t *ud)
                        unfinished++;
                }
        }
+       if (!unfinished)
+               goto find_pid;
+
        if (unfinished)
        {
                message = g_strdup_printf(
@@ -1305,11 +1315,11 @@ ghb_reload_queue(signal_user_data_t *ud)
                                add_to_queue_list(ud, settings, NULL);
                        }
                        ghb_queue_buttons_grey(ud);
+                       ghb_save_queue(ud->queue);
                }
                else
                {
                        ghb_value_free(queue);
-                       ghb_remove_queue_file();
                }
                g_free(message);
        }
index 8ff454a..36a8e44 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * queuehandler.h
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * queuehandler.h is free software.
  * 
index b98d8dd..e425214 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * resources.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * resources.c is free software.
  * 
index 4bafd9b..34c6497 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * settings.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * settings.c is free software.
  * 
@@ -179,17 +179,14 @@ ghb_settings_combo_string(const GValue *settings, const gchar *key)
 // Map widget names to setting keys
 // Widgets that map to settings have names
 // of this format: s_<setting key>
-static const gchar*
-get_setting_key(GtkWidget *widget)
+const gchar*
+ghb_get_setting_key(GtkWidget *widget)
 {
        const gchar *name;
        
        g_debug("get_setting_key ()\n");
        if (widget == NULL) return NULL;
-       if (GTK_IS_ACTION(widget))
-               name = gtk_action_get_name(GTK_ACTION(widget));
-       else
-               name = gtk_widget_get_name(widget);
+       name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
                
        if (name == NULL)
        {
@@ -214,10 +211,7 @@ ghb_widget_value(GtkWidget *widget)
        }
 
        type = GTK_WIDGET_TYPE(widget);
-       if (GTK_IS_ACTION(widget))
-               name = gtk_action_get_name(GTK_ACTION(widget));
-       else
-               name = gtk_widget_get_name(widget);
+       name = ghb_get_setting_key(widget);
        g_debug("ghb_widget_value widget (%s)\n", name);
        if (type == GTK_TYPE_ENTRY)
        {
@@ -442,7 +436,7 @@ ghb_widget_to_setting(GValue *settings, GtkWidget *widget)
        if (widget == NULL) return;
        g_debug("ghb_widget_to_setting");
        // Find corresponding setting
-       key = get_setting_key(widget);
+       key = ghb_get_setting_key(widget);
        if (key == NULL) return;
        value = ghb_widget_value(widget);
        if (value != NULL)
index c499da5..2f96403 100644 (file)
@@ -34,6 +34,7 @@ enum
        GHB_STATE_WORKDONE      = 0x10,
        GHB_STATE_PAUSED        = 0x20,
        GHB_STATE_MUXING        = 0x40,
+       GHB_STATE_SEARCHING     = 0x80,
 };
 
 enum
@@ -51,6 +52,7 @@ typedef struct
        gchar *current_dvd_device;
        gboolean debug;
        gboolean dont_clear_presets;
+       gboolean scale_busy;
        gint cancel_encode;
        GtkBuilder *builder;
        GValue *settings;
@@ -107,5 +109,6 @@ gint ghb_widget_boolean(GtkWidget *widget);
 void ghb_widget_to_setting(GValue *settings, GtkWidget *widget);
 int ghb_ui_update(
        signal_user_data_t *ud, const gchar *name, const GValue *value);
+const gchar* ghb_get_setting_key(GtkWidget *widget);
 
 #endif // _SETTINGS_H_
index b5e36ef..22457bf 100644 (file)
@@ -16,7 +16,7 @@
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6</string>
+                               <string>cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6</string>
                        </dict>
                        <dict>
                                <key>AudioList</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>0</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0</string>
+                               <string>level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0</string>
                        </dict>
                        <dict>
                                <key>AudioList</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>0</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0</string>
+                               <string>cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0</string>
                        </dict>
                        <dict>
                                <key>AudioList</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
+                                               <key>AudioTrack</key>
+                                               <integer>1</integer>
+                                               <key>AudioTrackDRCSlider</key>
+                                               <real>0.0</real>
+                                       </dict>
+                               </array>
+                               <key>ChapterMarkers</key>
+                               <integer>1</integer>
+                               <key>Default</key>
+                               <integer>0</integer>
+                               <key>FileFormat</key>
+                               <string>MP4 file</string>
+                               <key>Folder</key>
+                               <false/>
+                               <key>Mp4LargeFile</key>
+                               <integer>1</integer>
+                               <key>PictureAutoCrop</key>
+                               <integer>1</integer>
+                               <key>PictureBottomCrop</key>
+                               <integer>0</integer>
+                               <key>PictureDeblock</key>
+                               <integer>0</integer>
+                               <key>PictureDeinterlace</key>
+                               <integer>0</integer>
+                               <key>PictureDenoise</key>
+                               <integer>0</integer>
+                               <key>PictureDetelecine</key>
+                               <integer>0</integer>
+                               <key>PictureHeight</key>
+                               <integer>0</integer>
+                               <key>PictureKeepRatio</key>
+                               <integer>0</integer>
+                               <key>PictureLeftCrop</key>
+                               <integer>0</integer>
+                               <key>PicturePAR</key>
+                               <integer>2</integer>
+                               <key>PictureRightCrop</key>
+                               <integer>0</integer>
+                               <key>PictureTopCrop</key>
+                               <integer>0</integer>
+                               <key>PictureWidth</key>
+                               <integer>960</integer>
+                               <key>PresetDescription</key>
+                               <string>HandBrake's preset for the iPhone 4 is optimized for viewing on its 960x480 display.</string>
+                               <key>PresetName</key>
+                               <string>iPhone 4</string>
+                               <key>Subtitles</key>
+                               <string>None</string>
+                               <key>Type</key>
+                               <integer>0</integer>
+                               <key>UsesPictureFilters</key>
+                               <integer>1</integer>
+                               <key>UsesPictureSettings</key>
+                               <integer>1</integer>
+                               <key>VFR</key>
+                               <integer>0</integer>
+                               <key>VideoAvgBitrate</key>
+                               <string>2500</string>
+                               <key>VideoEncoder</key>
+                               <string>H.264 (x264)</string>
+                               <key>VideoFramerate</key>
+                               <string>29.97 (NTSC Video)</string>
+                               <key>VideoFrameratePFR</key>
+                               <integer>1</integer>
+                               <key>VideoGrayScale</key>
+                               <integer>0</integer>
+                               <key>VideoQualitySlider</key>
+                               <real>20</real>
+                               <key>VideoQualityType</key>
+                               <integer>2</integer>
+                               <key>VideoTargetSize</key>
+                               <string>700</string>
+                               <key>VideoTwoPass</key>
+                               <integer>0</integer>
+                               <key>x264Option</key>
+                               <string></string>
+                       </dict>
+                       <dict>
+                               <key>AudioList</key>
+                               <array>
+                                       <dict>
+                                               <key>AudioBitrate</key>
+                                               <string>160</string>
+                                               <key>AudioEncoder</key>
+                                               <string>AAC (faac)</string>
+                                               <key>AudioMixdown</key>
+                                               <string>Dolby Pro Logic II</string>
+                                               <key>AudioSamplerate</key>
+                                               <string>Auto</string>
+                                               <key>AudioTrack</key>
+                                               <integer>1</integer>
+                                               <key>AudioTrackDRCSlider</key>
+                                               <real>0.0</real>
+                                       </dict>
+                               </array>
+                               <key>ChapterMarkers</key>
+                               <integer>1</integer>
+                               <key>Default</key>
+                               <integer>0</integer>
+                               <key>FileFormat</key>
+                               <string>MP4 file</string>
+                               <key>Folder</key>
+                               <false/>
+                               <key>Mp4LargeFile</key>
+                               <integer>1</integer>
+                               <key>PictureAutoCrop</key>
+                               <integer>1</integer>
+                               <key>PictureBottomCrop</key>
+                               <integer>0</integer>
+                               <key>PictureDeblock</key>
+                               <integer>0</integer>
+                               <key>PictureDeinterlace</key>
+                               <integer>0</integer>
+                               <key>PictureDenoise</key>
+                               <integer>0</integer>
+                               <key>PictureDetelecine</key>
+                               <integer>0</integer>
+                               <key>PictureHeight</key>
+                               <integer>0</integer>
+                               <key>PictureKeepRatio</key>
+                               <integer>0</integer>
+                               <key>PictureLeftCrop</key>
+                               <integer>0</integer>
+                               <key>PicturePAR</key>
+                               <integer>2</integer>
+                               <key>PictureRightCrop</key>
+                               <integer>0</integer>
+                               <key>PictureTopCrop</key>
+                               <integer>0</integer>
+                               <key>PictureWidth</key>
+                               <integer>1024</integer>
+                               <key>PresetDescription</key>
+                               <string>HandBrake's preset for the iPad (1st gen) is optimized for viewing on its 1024x768 display.</string>
+                               <key>PresetName</key>
+                               <string>iPad</string>
+                               <key>Subtitles</key>
+                               <string>None</string>
+                               <key>Type</key>
+                               <integer>0</integer>
+                               <key>UsesPictureFilters</key>
+                               <integer>1</integer>
+                               <key>UsesPictureSettings</key>
+                               <integer>1</integer>
+                               <key>VFR</key>
+                               <integer>0</integer>
+                               <key>VideoAvgBitrate</key>
+                               <string>2500</string>
+                               <key>VideoEncoder</key>
+                               <string>H.264 (x264)</string>
+                               <key>VideoFramerate</key>
+                               <string>29.97 (NTSC Video)</string>
+                               <key>VideoFrameratePFR</key>
+                               <integer>1</integer>
+                               <key>VideoGrayScale</key>
+                               <integer>0</integer>
+                               <key>VideoQualitySlider</key>
+                               <real>20</real>
+                               <key>VideoQualityType</key>
+                               <integer>2</integer>
+                               <key>VideoTargetSize</key>
+                               <string>700</string>
+                               <key>VideoTwoPass</key>
+                               <integer>0</integer>
+                               <key>x264Option</key>
+                               <string></string>
+                       </dict>
+                       <dict>
+                               <key>AudioList</key>
+                               <array>
+                                       <dict>
+                                               <key>AudioBitrate</key>
+                                               <string>160</string>
+                                               <key>AudioEncoder</key>
+                                               <string>AAC (faac)</string>
+                                               <key>AudioMixdown</key>
+                                               <string>Dolby Pro Logic II</string>
+                                               <key>AudioSamplerate</key>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0</string>
+                               <string>cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500</string>
+                       </dict>
+                       <dict>
+                               <key>AudioList</key>
+                               <array>
+                                       <dict>
+                                               <key>AudioBitrate</key>
+                                               <string>160</string>
+                                               <key>AudioEncoder</key>
+                                               <string>AAC (faac)</string>
+                                               <key>AudioMixdown</key>
+                                               <string>Dolby Pro Logic II</string>
+                                               <key>AudioSamplerate</key>
+                                               <string>Auto</string>
+                                               <key>AudioTrack</key>
+                                               <integer>1</integer>
+                                               <key>AudioTrackDRCSlider</key>
+                                               <real>0.0</real>
+                                       </dict>
+                                       <dict>
+                                               <key>AudioBitrate</key>
+                                               <string>160</string>
+                                               <key>AudioEncoder</key>
+                                               <string>AC3 Passthru</string>
+                                               <key>AudioMixdown</key>
+                                               <string>AC3 Passthru</string>
+                                               <key>AudioSamplerate</key>
+                                               <string>Auto</string>
+                                               <key>AudioTrack</key>
+                                               <integer>1</integer>
+                                               <key>AudioTrackDRCSlider</key>
+                                               <real>0.0</real>
+                                       </dict>
+                               </array>
+                               <key>ChapterMarkers</key>
+                               <integer>1</integer>
+                               <key>Default</key>
+                               <integer>0</integer>
+                               <key>FileFormat</key>
+                               <string>MP4 file</string>
+                               <key>Folder</key>
+                               <false/>
+                               <key>Mp4LargeFile</key>
+                               <integer>1</integer>
+                               <key>PictureAutoCrop</key>
+                               <integer>1</integer>
+                               <key>PictureBottomCrop</key>
+                               <integer>0</integer>
+                               <key>PictureDeblock</key>
+                               <integer>0</integer>
+                               <key>PictureDeinterlace</key>
+                               <integer>0</integer>
+                               <key>PictureDenoise</key>
+                               <integer>0</integer>
+                               <key>PictureDetelecine</key>
+                               <integer>0</integer>
+                               <key>PictureHeight</key>
+                               <integer>0</integer>
+                               <key>PictureKeepRatio</key>
+                               <integer>0</integer>
+                               <key>PictureLeftCrop</key>
+                               <integer>0</integer>
+                               <key>PicturePAR</key>
+                               <integer>2</integer>
+                               <key>PictureRightCrop</key>
+                               <integer>0</integer>
+                               <key>PictureTopCrop</key>
+                               <integer>0</integer>
+                               <key>PictureWidth</key>
+                               <integer>1280</integer>
+                               <key>PresetDescription</key>
+                               <string>HandBrake's preset for the Apple TV (2nd gen) is optimized for viewing on its 1280x720 display.</string>
+                               <key>PresetName</key>
+                               <string>AppleTV 2</string>
+                               <key>Subtitles</key>
+                               <string>None</string>
+                               <key>Type</key>
+                               <integer>0</integer>
+                               <key>UsesPictureFilters</key>
+                               <integer>1</integer>
+                               <key>UsesPictureSettings</key>
+                               <integer>1</integer>
+                               <key>VFR</key>
+                               <integer>0</integer>
+                               <key>VideoAvgBitrate</key>
+                               <string>2500</string>
+                               <key>VideoEncoder</key>
+                               <string>H.264 (x264)</string>
+                               <key>VideoFramerate</key>
+                               <string>29.97 (NTSC Video)</string>
+                               <key>VideoFrameratePFR</key>
+                               <integer>1</integer>
+                               <key>VideoGrayScale</key>
+                               <integer>0</integer>
+                               <key>VideoQualitySlider</key>
+                               <real>20</real>
+                               <key>VideoQualityType</key>
+                               <integer>2</integer>
+                               <key>VideoTargetSize</key>
+                               <string>700</string>
+                               <key>VideoTwoPass</key>
+                               <integer>0</integer>
+                               <key>x264Option</key>
+                               <string></string>
                        </dict>
                </array>
                <key>Default</key>
                <key>Folder</key>
                <true/>
                <key>PresetBuildNumber</key>
-               <integer>2009112101</integer>
+               <integer>2010122101</integer>
                <key>PresetName</key>
                <string>Apple</string>
                <key>Type</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>1</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
-                               <integer>1</integer>
+                               <integer>2</integer>
                                <key>VFR</key>
                                <integer>0</integer>
                                <key>VideoAvgBitrate</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>1</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
-                               <integer>1</integer>
+                               <integer>2</integer>
                                <key>VideoAvgBitrate</key>
                                <string>1800</string>
                                <key>VideoEncoder</key>
                <key>Folder</key>
                <true/>
                <key>PresetBuildNumber</key>
-               <integer>2009112101</integer>
+               <integer>2010122101</integer>
                <key>PresetName</key>
                <string>Regular</string>
                <key>Type</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>1</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
-                               <integer>1</integer>
+                               <integer>2</integer>
                                <key>VFR</key>
                                <integer>0</integer>
                                <key>VideoAvgBitrate</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>1</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
-                               <integer>1</integer>
+                               <integer>2</integer>
                                <key>VFR</key>
                                <integer>0</integer>
                                <key>VideoAvgBitrate</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0</string>
+                               <string>ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0</string>
                        </dict>
                        <dict>
                                <key>AudioList</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>0</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0</string>
+                               <string>level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0</string>
                        </dict>
                        <dict>
                                <key>AudioList</key>
                                                <key>AudioMixdown</key>
                                                <string>Dolby Pro Logic II</string>
                                                <key>AudioSamplerate</key>
-                                               <string>48</string>
+                                               <string>Auto</string>
                                                <key>AudioTrack</key>
                                                <integer>1</integer>
                                                <key>AudioTrackDRCSlider</key>
                                <string>None</string>
                                <key>Type</key>
                                <integer>0</integer>
-                               <key>UsesMaxPictureSettings</key>
-                               <integer>0</integer>
                                <key>UsesPictureFilters</key>
                                <integer>1</integer>
                                <key>UsesPictureSettings</key>
                                <key>VideoTwoPass</key>
                                <integer>0</integer>
                                <key>x264Option</key>
-                               <string>level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0</string>
+                               <string>level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0</string>
                        </dict>
                </array>
                <key>Default</key>
                <key>Folder</key>
                <true/>
                <key>PresetBuildNumber</key>
-               <integer>2009112101</integer>
+               <integer>2010122101</integer>
                <key>PresetName</key>
                <string>Legacy</string>
                <key>Type</key>
index 5374408..0746b26 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * subtitlehandler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * subtitlehandler.c is free software.
  * 
@@ -41,18 +41,21 @@ free_subtitle_key(gpointer data)
 static gboolean
 mustBurn(signal_user_data_t *ud, GValue *settings)
 {
-       if (ghb_settings_combo_int(ud->settings, "FileFormat") == HB_MUX_MP4)
-       {
-               // MP4 can only handle burned vobsubs.  make sure there isn't
-               // already something burned in the list
-               if (ghb_settings_get_int(settings, "SubtitleSource") == VOBSUB)
-               {
-                       return TRUE;
-               }
-       }
        return FALSE;
 }
 
+static gboolean
+canBurn(int source)
+{
+       return (source == VOBSUB || source == SSASUB);
+}
+
+static gboolean
+canForce(int source)
+{
+       return (source == VOBSUB);
+}
+
 gboolean
 ghb_soft_in_subtitle_list(GValue *subtitle_list)
 {
@@ -528,7 +531,7 @@ subtitle_forced_toggled_cb(
        settings = ghb_array_get_nth(subtitle_list, row);
 
        source = ghb_settings_get_int(settings, "SubtitleSource");
-       if (source != VOBSUB)
+       if (!canForce(source))
                return;
 
        ghb_settings_set_boolean(settings, "SubtitleForced", active);
@@ -576,7 +579,7 @@ subtitle_burned_toggled_cb(
 
        settings = ghb_array_get_nth(subtitle_list, row);
        source = ghb_settings_get_int(settings, "SubtitleSource");
-       if (source != VOBSUB)
+       if (!canBurn(source))
                return;
        if (!active && mustBurn(ud, settings))
                return;
@@ -613,7 +616,6 @@ subtitle_default_toggled_cb(
        GValue *subtitle_list;
        gint count;
        GValue *settings;
-       gboolean burned;
 
        g_debug("default toggled");
        tp = gtk_tree_path_new_from_string (path);
@@ -652,30 +654,6 @@ subtitle_default_toggled_cb(
        ghb_live_reset(ud);
 }
 
-static const char*
-subtitle_source_name(gint source)
-{
-       const gchar * name;
-
-       switch (source)
-       {
-               case VOBSUB:
-                       name = "Bitmap";
-                       break;
-               case CC708SUB:
-               case CC608SUB:
-                       name = "Text";
-                       break;
-               case SRTSUB:
-                       name = "SRT";
-                       break;
-               default:
-                       name = "Unknown";
-                       break;
-       }
-       return name;
-}
-
 static void
 subtitle_list_refresh_selected(signal_user_data_t *ud)
 {
@@ -688,6 +666,8 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
        gint row;
        GValue *settings = NULL;
        const GValue *subtitle_list;
+       gboolean allow_force = FALSE;
+       gboolean allow_burn = FALSE;
        
        g_debug("subtitle_list_refresh_selected ()");
        treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
@@ -714,14 +694,17 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
 
                gint i_source;
                i_source = ghb_settings_get_int(settings, "SubtitleSource");
-               if (i_source != VOBSUB)
+               if (!canBurn(i_source))
                {
-                       // Force and burn only apply to VOBSUBS
-                       forced = FALSE;
                        burned = FALSE;
-                       ghb_settings_set_boolean(settings, "SubtitleForced", forced);
                        ghb_settings_set_boolean(settings, "SubtitleBurned", burned);
                }
+               if (!canForce(i_source))
+               {
+                       // Force only apply to VOBSUBS
+                       forced = FALSE;
+                       ghb_settings_set_boolean(settings, "SubtitleForced", forced);
+               }
 
                if (i_source == SRTSUB)
                {
@@ -730,8 +713,6 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
 
                        lang = ghb_settings_combo_option(settings, "SrtLanguage");
                        code = ghb_settings_get_string(settings, "SrtCodeset");
-                       track = g_strdup_printf("%s (%s)", lang, code);
-                       g_free(code);
 
                        s_track = ghb_settings_get_string(settings, "SrtFile");
                        if (g_file_test(s_track, G_FILE_TEST_IS_REGULAR))
@@ -739,13 +720,16 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
                                gchar *basename;
 
                                basename = g_path_get_basename(s_track);
+                               track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
                                source = g_strdup_printf("SRT (%s)", basename);
                                g_free(basename);
                        }
                        else
                        {
+                               track = g_strdup_printf("%s (%s)(SRT)", lang, code);
                                source = g_strdup_printf("SRT (none)");
                        }
+                       g_free(code);
                        offset = ghb_settings_get_int(settings, "SrtOffset");
 
                        forced = FALSE;
@@ -755,24 +739,30 @@ subtitle_list_refresh_selected(signal_user_data_t *ud)
                {
                        track = g_strdup(
                                ghb_settings_combo_option(settings, "SubtitleTrack"));
-                       source = g_strdup(subtitle_source_name(i_source));
+                       source = g_strdup(ghb_subtitle_source_name(i_source));
                        s_track = ghb_settings_get_string(settings, "SubtitleTrack");
 
                        forced = ghb_settings_get_boolean(settings, "SubtitleForced");
                        burned = ghb_settings_get_boolean(settings, "SubtitleBurned");
                }
 
+               if (canBurn(i_source))
+                       allow_burn = TRUE;
+               if (canForce(i_source))
+                       allow_force = TRUE;
+
                gtk_list_store_set(GTK_LIST_STORE(store), &iter, 
                        // These are displayed in list
                        0, track,
                        1, forced,
                        2, burned,
                        3, def,
-                       4, source,
-                       5, offset,
+                       4, offset,
                        // These are used to set combo box values when a list item is selected
-                       6, s_track,
-                       7, i_source,
+                       5, s_track,
+                       6, i_source,
+                       7, allow_force,
+                       8, allow_burn,
                        -1);
                g_free(track);
                g_free(source);
@@ -919,6 +909,8 @@ add_to_subtitle_list(
        gboolean forced, burned, def;
        gchar *s_track;
        gint i_source;
+       gboolean allow_force = FALSE;
+       gboolean allow_burn = FALSE;
        
        g_debug("add_to_subtitle_list ()");
        treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "subtitle_list"));
@@ -932,7 +924,12 @@ add_to_subtitle_list(
 
        s_track = ghb_settings_get_string(settings, "SubtitleTrack");
        i_source = ghb_settings_get_int(settings, "SubtitleSource");
-       source = subtitle_source_name(i_source);
+       source = ghb_subtitle_source_name(i_source);
+
+       if (canBurn(i_source))
+               allow_burn = TRUE;
+       if (canForce(i_source))
+               allow_force = TRUE;
 
        gtk_list_store_append(store, &iter);
        gtk_list_store_set(store, &iter, 
@@ -941,13 +938,12 @@ add_to_subtitle_list(
                1, forced,
                2, burned,
                3, def,
-               4, source,
                // These are used to set combo box values when a list item is selected
-               6, s_track,
-               7, i_source,
-               8, TRUE,
-               9, TRUE,
-               10, FALSE,
+               5, s_track,
+               6, i_source,
+               7, allow_force,
+               8, allow_burn,
+               9, FALSE,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(s_track);
@@ -974,7 +970,6 @@ add_to_srt_list(
 
        lang = ghb_settings_combo_option(settings, "SrtLanguage");
        code = ghb_settings_get_string(settings, "SrtCodeset");
-       track = g_strdup_printf("%s (%s)", lang, code);
        forced = FALSE;
        burned = FALSE;
        def = ghb_settings_get_boolean(settings, "SubtitleDefaultTrack");
@@ -985,11 +980,13 @@ add_to_srt_list(
                gchar *basename;
 
                basename = g_path_get_basename(filename);
+               track = g_strdup_printf("%s (%s)(SRT)(%s)", lang, code, basename);
                source = g_strdup_printf("SRT (%s)", basename);
                g_free(basename);
        }
        else
        {
+               track = g_strdup_printf("%s (%s)(SRT)", lang, code);
                source = g_strdup_printf("SRT (none)");
        }
        i_source = SRTSUB;
@@ -1002,14 +999,13 @@ add_to_srt_list(
                1, forced,
                2, burned,
                3, def,
-               4, source,
-               5, offset,
+               4, offset,
                // These are used to set combo box values when a list item is selected
-               6, filename,
-               7, i_source,
+               5, filename,
+               6, i_source,
+               7, FALSE,
                8, FALSE,
-               9, FALSE,
-               10, TRUE,
+               9, TRUE,
                -1);
        gtk_tree_selection_select_iter(selection, &iter);
        g_free(code);
@@ -1148,13 +1144,15 @@ srt_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 {
        // Add the current subtitle settings to the list.
        GValue *settings;
-       gchar *dir, *filename;
+       gchar *dir, *filename, *lang;
        
        g_debug("subtitle_add_clicked_cb ()");
 
        settings = ghb_dict_value_new();
        ghb_settings_set_int(settings, "SubtitleSource", SRTSUB);
-       ghb_settings_set_string(settings, "SrtLanguage", "und");
+       lang = ghb_settings_get_string(ud->settings, "PreferredLanguage");
+       ghb_settings_set_string(settings, "SrtLanguage", lang);
+       g_free(lang);
        ghb_settings_set_string(settings, "SrtCodeset", "UTF-8");
 
        dir = ghb_settings_get_string(ud->settings, "SrtDir");
index c0970d0..8390578 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * subtitlehandler.h
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * audiohandler.h is free software.
  * 
index 17319a5..dd23d0e 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * presets.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * presets.c is free software.
  * 
@@ -753,6 +753,15 @@ xform_string_double(const GValue *sval, GValue *dval)
 }
 
 static void
+xform_double_string(const GValue *dval, GValue *sval)
+{
+       gchar *str;
+       double val = g_value_get_double(dval);
+       str = g_strdup_printf("%g", val);
+       g_value_take_string(sval, str);
+}
+
+static void
 xform_boolean_double(const GValue *bval, GValue *dval)
 {
        gboolean b = g_value_get_boolean(bval);
@@ -771,4 +780,6 @@ ghb_register_transforms()
                                                                xform_string_double);
        g_value_register_transform_func(G_TYPE_BOOLEAN, G_TYPE_DOUBLE, 
                                                                xform_boolean_double);
+       g_value_register_transform_func(G_TYPE_DOUBLE, G_TYPE_STRING, 
+                                                               xform_double_string);
 }
index 17502eb..8d6b032 100644 (file)
@@ -23,11 +23,14 @@ static dependency_t dep_map[] =
        {"title", "picture_tab", "none", TRUE, FALSE},
        {"title", "chapters_label", "none", TRUE, FALSE},
        {"title", "chapters_tab", "none", TRUE, FALSE},
-       {"title", "start_chapter", "none", TRUE, FALSE},
-       {"title", "end_chapter", "none", TRUE, FALSE},
+       {"title", "start_point", "none", TRUE, FALSE},
+       {"title", "end_point", "none", TRUE, FALSE},
        {"title", "angle", "none", TRUE, FALSE},
+       {"title", "angle_label", "1", TRUE, FALSE},
        {"use_dvdnav", "angle", "FALSE", TRUE, TRUE},
        {"use_dvdnav", "angle_label", "FALSE", TRUE, TRUE},
+       {"angle_count", "angle", "1", TRUE, TRUE},
+       {"angle_count", "angle_label", "1", TRUE, TRUE},
        {"vquality_type_bitrate", "VideoAvgBitrate", "TRUE", FALSE, FALSE},
        {"vquality_type_target", "VideoTargetSize", "TRUE", FALSE, FALSE},
        {"vquality_type_constant", "VideoQualitySlider", "TRUE", FALSE, FALSE},
@@ -54,22 +57,19 @@ static dependency_t dep_map[] =
        {"VideoEncoder", "x264_tab", "x264", FALSE, FALSE},
        {"VideoEncoder", "x264_tab_label", "x264", FALSE, FALSE},
        {"VideoEncoder", "Mp4iPodCompatible", "x264", FALSE, FALSE},
-       {"AudioEncoder", "AudioBitrate", "ac3|dts|auto", TRUE, FALSE},
-       {"AudioEncoder", "AudioSamplerate", "ac3|dts|auto", TRUE, FALSE},
-       {"AudioEncoder", "AudioMixdown", "ac3|dts|auto", TRUE, FALSE},
-       {"AudioEncoder", "AudioTrackDRCSlider", "ac3|dts|auto", TRUE, FALSE},
-       {"AudioEncoder", "drc_label", "ac3|dts|auto", TRUE, FALSE},
-       {"x264_bframes", "x264_weighted_bframes", "0", TRUE, FALSE},
+       {"AudioEncoderActual", "AudioBitrate", "ac3|dts", TRUE, FALSE},
+       {"AudioEncoderActual", "AudioSamplerate", "ac3|dts", TRUE, FALSE},
+       {"AudioEncoderActual", "AudioMixdown", "ac3|dts", TRUE, FALSE},
+       {"AudioEncoderActual", "AudioTrackDRCSlider", "ac3|dts", TRUE, FALSE},
+       {"AudioEncoderActual", "drc_label", "ac3|dts", TRUE, FALSE},
        {"x264_bframes", "x264_bpyramid", "<2", TRUE, FALSE},
        {"x264_bframes", "x264_direct", "0", TRUE, FALSE},
        {"x264_bframes", "x264_b_adapt", "0", TRUE, FALSE},
-       {"x264_refs", "x264_mixed_refs", "<2", TRUE, FALSE},
        {"x264_cabac", "x264_trellis", "TRUE", FALSE, FALSE},
        {"x264_subme", "x264_psy_rd", "<6", TRUE, FALSE},
        {"x264_subme", "x264_psy_trell", "<6", TRUE, FALSE},
        {"x264_cabac", "x264_psy_trell", "TRUE", FALSE, FALSE},
        {"x264_trellis", "x264_psy_trell", "0", TRUE, FALSE},
-       {"x264_mbtree", "x264_bpyramid", "TRUE", TRUE, FALSE},
        {"ChapterMarkers", "chapters_list", "TRUE", FALSE, FALSE},
        {"use_source_name", "chapters_in_destination", "TRUE", FALSE, FALSE},
        {"use_source_name", "title_no_in_destination", "TRUE", FALSE, FALSE},
index a466412..d9f1fd7 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * x264handler.c
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * x264handler.c is free software.
  * 
@@ -42,6 +42,38 @@ x264_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 }
 
 G_MODULE_EXPORT void
+x264_slider_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
+{
+       ghb_widget_to_setting(ud->settings, widget);
+
+       // Lock slider values to multiples of step_increment
+       GtkAdjustment * adj = gtk_range_get_adjustment(GTK_RANGE(widget));
+       gdouble step = gtk_adjustment_get_step_increment(adj);
+       gdouble val = gtk_range_get_value(GTK_RANGE(widget));
+       gdouble new_val = ((int)((val + step / 2) / step)) * step;
+       gdouble diff = val - new_val;
+       if ( diff > 0.0001 || diff < -0.0001 )
+       {
+               gtk_range_set_value(GTK_RANGE(widget), new_val);
+       }
+       else if (!ignore_options_update)
+       {
+               ignore_options_update = TRUE;
+               x264_opt_update(ud, widget);
+               ignore_options_update = FALSE;
+       }
+       ghb_check_dependency(ud, widget, NULL);
+       ghb_clear_presets_selection(ud);
+}
+
+G_MODULE_EXPORT gchar*
+x264_format_slider_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud)
+{
+       return g_strdup_printf("%-6.6g", val);
+}
+
+
+G_MODULE_EXPORT void
 x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
 {
        gint me;
@@ -126,37 +158,88 @@ enum
        X264_OPT_DEBLOCK,
        X264_OPT_PSY,
        X264_OPT_INT,
+       X264_OPT_DOUBLE,
        X264_OPT_COMBO,
        X264_OPT_BOOL,
+       X264_OPT_TRANS,
 };
 
+typedef struct
+{
+       gchar *x264_val;
+       char *ui_val;
+} trans_entry_t;
+
+typedef struct
+{
+       gint count;
+       gint x264_type;
+       gint ui_type;
+       trans_entry_t *map;
+} trans_table_t;
+
+static gchar *
+trans_x264_val(trans_table_t *trans, char *val)
+{
+       int ii;
+
+       if (val == NULL)
+               return NULL;
+       for (ii = 0; ii < trans->count; ii++)
+       {
+               if (strcmp(val, trans->map[ii].x264_val) == 0)
+               {
+                       return trans->map[ii].ui_val;
+               }
+       }
+       return NULL;
+}
+
+static gchar *
+trans_ui_val(trans_table_t *trans, char *val)
+{
+       int ii;
+
+       if (val == NULL)
+               return NULL;
+       for (ii = 0; ii < trans->count; ii++)
+       {
+               if (strcmp(val, trans->map[ii].ui_val) == 0)
+               {
+                       return trans->map[ii].x264_val;
+               }
+       }
+       return NULL;
+}
+
 struct x264_opt_map_s
 {
        gchar **opt_syns;
        gchar *name;
        gchar *def_val;
        gint type;
+       trans_table_t *translation;
        gboolean found;
 };
 
 static gchar *x264_ref_syns[] = {"ref", "frameref", NULL};
-static gchar *x264_mixed_syns[] = {"mixed-refs", "mixed_refs", NULL};
 static gchar *x264_bframes_syns[] = {"bframes", NULL};
 static gchar *x264_badapt_syns[] = {"b-adapt", "b_adapt", NULL};
 static gchar *x264_direct_syns[] = 
        {"direct", "direct-pred", "direct_pred", NULL};
-static gchar *x264_weightb_syns[] = {"weightb", "weight-b", "weight_b", NULL};
+static gchar *x264_weightp_syns[] = {"weightp", NULL};
 static gchar *x264_bpyramid_syns[] = {"b-pyramid", "b_pyramid", NULL};
 static gchar *x264_me_syns[] = {"me", NULL};
 static gchar *x264_merange_syns[] = {"merange", "me-range", "me_range", NULL};
 static gchar *x264_subme_syns[] = {"subme", "subq", NULL};
 static gchar *x264_aqmode_syns[] = {"aq-mode", NULL};
-static gchar *x264_analyse_syns[] = {"analyse", "partitions", NULL};
+static gchar *x264_analyse_syns[] = {"partitions", "analyse", NULL};
 static gchar *x264_8x8dct_syns[] = {"8x8dct", NULL};
 static gchar *x264_deblock_syns[] = {"deblock", "filter", NULL};
 static gchar *x264_trellis_syns[] = {"trellis", NULL};
 static gchar *x264_pskip_syns[] = {"no-fast-pskip", "no_fast_pskip", NULL};
 static gchar *x264_psy_syns[] = {"psy-rd", "psy_rd", NULL};
+static gchar *x264_aq_strength_syns[] = {"aq-strength", "aq_strength", NULL};
 static gchar *x264_mbtree_syns[] = {"mbtree", NULL};
 static gchar *x264_decimate_syns[] = 
        {"no-dct-decimate", "no_dct_decimate", NULL};
@@ -177,17 +260,16 @@ find_syn_match(const gchar *opt, gchar **syns)
 struct x264_opt_map_s x264_opt_map[] =
 {
        {x264_ref_syns, "x264_refs", "3", X264_OPT_INT},
-       {x264_mixed_syns, "x264_mixed_refs", "1", X264_OPT_BOOL},
        {x264_bframes_syns, "x264_bframes", "3", X264_OPT_INT},
        {x264_direct_syns, "x264_direct", "spatial", X264_OPT_COMBO},
        {x264_badapt_syns, "x264_b_adapt", "1", X264_OPT_COMBO},
-       {x264_weightb_syns, "x264_weighted_bframes", "1", X264_OPT_BOOL},
-       {x264_bpyramid_syns, "x264_bpyramid", "0", X264_OPT_BOOL},
+       {x264_weightp_syns, "x264_weighted_pframes", "2", X264_OPT_COMBO},
+       {x264_bpyramid_syns, "x264_bpyramid", "normal", X264_OPT_COMBO},
        {x264_me_syns, "x264_me", "hex", X264_OPT_COMBO},
        {x264_merange_syns, "x264_merange", "16", X264_OPT_INT},
        {x264_subme_syns, "x264_subme", "7", X264_OPT_COMBO},
        {x264_aqmode_syns, "x264_aqmode", "1", X264_OPT_INT_NONE},
-       {x264_analyse_syns, "x264_analyse", "some", X264_OPT_COMBO},
+       {x264_analyse_syns, "x264_analyse", "p8x8,b8x8,i8x8,i4x4", X264_OPT_COMBO},
        {x264_8x8dct_syns, "x264_8x8dct", "1", X264_OPT_BOOL},
        {x264_deblock_syns, "x264_deblock_alpha", "0,0", X264_OPT_DEBLOCK},
        {x264_deblock_syns, "x264_deblock_beta", "0,0", X264_OPT_DEBLOCK},
@@ -195,8 +277,9 @@ struct x264_opt_map_s x264_opt_map[] =
        {x264_pskip_syns, "x264_no_fast_pskip", "0", X264_OPT_BOOL},
        {x264_decimate_syns, "x264_no_dct_decimate", "0", X264_OPT_BOOL},
        {x264_cabac_syns, "x264_cabac", "1", X264_OPT_BOOL},
-       {x264_psy_syns, "x264_psy_rd", "1,0", X264_OPT_PSY},
-       {x264_psy_syns, "x264_psy_trell", "1,0", X264_OPT_PSY},
+       {x264_aq_strength_syns, "x264_aq_strength", "1", X264_OPT_DOUBLE},
+       {x264_psy_syns, "x264_psy_rd", "1|0", X264_OPT_PSY},
+       {x264_psy_syns, "x264_psy_trell", "1|0", X264_OPT_PSY},
        {x264_mbtree_syns, "x264_mbtree", "1", X264_OPT_BOOL_NONE},
 };
 #define X264_OPT_MAP_SIZE (sizeof(x264_opt_map)/sizeof(struct x264_opt_map_s))
@@ -216,6 +299,16 @@ x264_opt_get_default(const gchar *opt)
 }
 
 static void
+x264_update_double(signal_user_data_t *ud, const gchar *name, const gchar *val)
+{
+       gdouble dval;
+
+       if (val == NULL) return;
+       dval = g_strtod (val, NULL);
+       ghb_ui_update(ud, name, ghb_double_value(dval));
+}
+
+static void
 x264_update_int(signal_user_data_t *ud, const gchar *name, const gchar *val)
 {
        gint ival;
@@ -366,26 +459,13 @@ x264_update_deblock(signal_user_data_t *ud, const gchar *xval)
 static void
 x264_parse_psy(const gchar *psy, gdouble *psy_rd, gdouble *psy_trell)
 {
-       gchar *val;
-       gchar *trell_val = NULL;
-       gchar *end;
-
        *psy_rd = 0.;
        *psy_trell = 0.;
        if (psy == NULL) return;
-       val = g_strdup(psy);
-       gchar *pos = strchr(val, ',');
-       if (pos != NULL)
+       if (2 == sscanf(psy, "%lf|%lf", psy_rd, psy_trell) ||
+           2 == sscanf(psy, "%lf,%lf", psy_rd, psy_trell))
        {
-               trell_val = pos + 1;
-               *pos = 0;
        }
-       *psy_rd = g_strtod (val, &end);
-       if (trell_val != NULL)
-       {
-               *psy_trell = g_strtod (trell_val, &end);
-       }
-       g_free(val);
 }
 
 static void
@@ -399,6 +479,31 @@ x264_update_psy(signal_user_data_t *ud, const gchar *xval)
        ghb_ui_update(ud, "x264_psy_trell", ghb_double_value(trell_value));
 }
 
+static void do_update(signal_user_data_t *ud, char *name, gint type, char *val)
+{
+       switch(type)
+       {
+       case X264_OPT_INT:
+               x264_update_int(ud, name, val);
+               break;
+       case X264_OPT_DOUBLE:
+               x264_update_double(ud, name, val);
+               break;
+       case X264_OPT_BOOL:
+               x264_update_bool(ud, name, val);
+               break;
+       case X264_OPT_COMBO:
+               x264_update_combo(ud, name, val);
+               break;
+       case X264_OPT_BOOL_NONE:
+               x264_update_bool_setting(ud, name, val);
+               break;
+       case X264_OPT_INT_NONE:
+               x264_update_int_setting(ud, name, val);
+               break;
+       }
+}
+
 void
 ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
 {
@@ -430,6 +535,9 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
                                case X264_OPT_INT:
                                        x264_update_int(ud, x264_opt_map[jj].name, val);
                                        break;
+                               case X264_OPT_DOUBLE:
+                                       x264_update_double(ud, x264_opt_map[jj].name, val);
+                                       break;
                                case X264_OPT_BOOL:
                                        x264_update_bool(ud, x264_opt_map[jj].name, val);
                                        break;
@@ -452,6 +560,21 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
                                case X264_OPT_INT_NONE:
                                        x264_update_int_setting(ud, x264_opt_map[jj].name, val);
                                        break;
+                               case X264_OPT_TRANS:
+                                       if (x264_opt_map[jj].translation == NULL)
+                                               break;
+                                       val = trans_x264_val(x264_opt_map[jj].translation, val);
+                                       if (val != NULL)
+                                       {
+                                               do_update(ud, x264_opt_map[jj].name, 
+                                                       x264_opt_map[jj].translation->ui_type, val);
+                                               // TODO un-grey the ui control
+                                       }
+                                       else
+                                       {
+                                               // TODO grey out the ui control
+                                       }
+                                       break;
                                }
                                break;
                        }
@@ -469,6 +592,9 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
                        case X264_OPT_INT:
                                x264_update_int(ud, x264_opt_map[jj].name, val);
                                break;
+                       case X264_OPT_DOUBLE:
+                               x264_update_double(ud, x264_opt_map[jj].name, val);
+                               break;
                        case X264_OPT_BOOL:
                                x264_update_bool(ud, x264_opt_map[jj].name, val);
                                break;
@@ -487,6 +613,21 @@ ghb_x264_parse_options(signal_user_data_t *ud, const gchar *options)
                        case X264_OPT_INT_NONE:
                                x264_update_int_setting(ud, x264_opt_map[jj].name, val);
                                break;
+                       case X264_OPT_TRANS:
+                               if (x264_opt_map[jj].translation == NULL)
+                                       break;
+                               val = g_strdup(trans_x264_val(x264_opt_map[jj].translation, val));
+                               if (val != NULL)
+                               {
+                                       do_update(ud, x264_opt_map[jj].name, 
+                                               x264_opt_map[jj].translation->ui_type, val);
+                                       // TODO un-grey the ui control
+                               }
+                               else
+                               {
+                                       // TODO grey out the ui control
+                               }
+                               break;
                        }
                        x264_opt_map[jj].found = TRUE;
                        g_free(val);
@@ -515,7 +656,7 @@ get_psy_val(signal_user_data_t *ud)
        gchar *result;
        rd = ghb_settings_get_double(ud->settings, "x264_psy_rd");
        trell = ghb_settings_get_double(ud->settings, "x264_psy_trell");
-       result = g_strdup_printf("%g,%g", rd, trell);
+       result = g_strdup_printf("%g|%g", rd, trell);
        return result;
 }
 
@@ -523,10 +664,11 @@ static void
 x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
 {
        gint jj;
-       const gchar *name = gtk_widget_get_name(widget);
+       const gchar *name = ghb_get_setting_key(widget);
        gchar **opt_syns = NULL;
        const gchar *def_val = NULL;
        gint type;
+       trans_table_t *trans;
 
        for (jj = 0; jj < X264_OPT_MAP_SIZE; jj++)
        {
@@ -536,6 +678,7 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
                        opt_syns = x264_opt_map[jj].opt_syns;
                        def_val = x264_opt_map[jj].def_val;
                        type = x264_opt_map[jj].type;
+                       trans = x264_opt_map[jj].translation;
                        break;
                }
        }
@@ -589,6 +732,16 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
                                        }
                                        ghb_value_free(gval);
                                }
+                               if (type == X264_OPT_TRANS)
+                               {
+                                       gchar *tmp;
+                                       tmp = g_strdup(trans_ui_val(trans, val));
+                                       if (tmp)
+                                       {
+                                               g_free(val);
+                                               val = tmp;
+                                       }
+                               }
                                if (strcmp(def_val, val) != 0)
                                {
                                        g_string_append_printf(x264opts, "%s=%s:", opt_syns[syn], val);
@@ -626,6 +779,16 @@ x264_opt_update(signal_user_data_t *ud, GtkWidget *widget)
                                }
                                ghb_value_free(gval);
                        }
+                       if (type == X264_OPT_TRANS)
+                       {
+                               gchar *tmp;
+                               tmp = g_strdup(trans_ui_val(trans, val));
+                               if (tmp)
+                               {
+                                       g_free(val);
+                                       val = tmp;
+                               }
+                       }
                        if (strcmp(def_val, val) != 0)
                        {
                                g_string_append_printf(x264opts, "%s=%s:", opt_syns[0], val);
@@ -819,11 +982,6 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
        gint ii;
 
        // Fix up option dependencies
-       gboolean mbtree = ghb_lookup_mbtree(options);
-       if (mbtree)
-       {
-               x264_remove_opt(split, x264_bpyramid_syns);
-       }
        gint subme = ghb_settings_combo_int(ud->settings, "x264_subme");
        if (subme < 6)
        {
@@ -854,18 +1012,12 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
                                x264_parse_psy(pos+1, &psy_rd, &psy_trell);
                        }
                        g_free(split[psy]);
-                       split[psy] = g_strdup_printf("psy-rd=%g,0", psy_rd);
+                       split[psy] = g_strdup_printf("psy-rd=%g|0", psy_rd);
                }
        }
-       gint refs = ghb_settings_get_int(ud->settings, "x264_refs");
-       if (refs <= 1)
-       {
-               x264_remove_opt(split, x264_mixed_syns);
-       }
        gint bframes = ghb_settings_get_int(ud->settings, "x264_bframes");
        if (bframes == 0)
        {
-               x264_remove_opt(split, x264_weightb_syns);
                x264_remove_opt(split, x264_direct_syns);
                x264_remove_opt(split, x264_badapt_syns);
        }
@@ -873,10 +1025,6 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
        {
                x264_remove_opt(split, x264_bpyramid_syns);
        }
-       if (!ghb_settings_get_boolean(ud->settings, "x264_cabac"))
-       {
-               x264_remove_opt(split, x264_trellis_syns);
-       }
        // Remove entries that match the defaults
        for (ii = 0; split[ii] != NULL; ii++)
        {
@@ -893,14 +1041,7 @@ sanitize_x264opts(signal_user_data_t *ud, const gchar *options)
                        val = "1";
                }
                const gchar *def_val;
-               if (find_syn_match(opt, x264_mbtree_syns) >= 0 && bframes == 0)
-               {
-                       def_val = "0";
-               }
-               else
-               {
-                       def_val = x264_opt_get_default(opt);
-               }
+               def_val = x264_opt_get_default(opt);
                if (strcmp(val, def_val) == 0)
                {
                        // Matches the default, so remove it
index 945a385..9c67100 100644 (file)
@@ -1,7 +1,7 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
  * x264handler.h
- * Copyright (C) John Stebbins 2008 <stebbins@stebbins>
+ * Copyright (C) John Stebbins 2008-2011 <stebbins@stebbins>
  * 
  * x264handler.h is free software.
  * 
diff --git a/libhb/batch.c b/libhb/batch.c
new file mode 100644 (file)
index 0000000..698798c
--- /dev/null
@@ -0,0 +1,131 @@
+/* $Id: dvd.c,v 1.12 2005/11/25 15:05:25 titer Exp $
+
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+#include "hb.h"
+#include "lang.h"
+
+struct hb_batch_s
+{
+    char      * path;
+    hb_list_t * list_file;
+};
+
+/***********************************************************************
+ * hb_batch_init
+ ***********************************************************************
+ *
+ **********************************************************************/
+hb_batch_t * hb_batch_init( char * path )
+{
+    hb_batch_t    * d;
+    struct stat     sb;
+    DIR           * dir;
+    struct dirent * entry;
+    char          * filename;
+
+    if ( stat( path, &sb ) )
+        return NULL;
+
+    if ( !S_ISDIR( sb.st_mode ) )
+        return NULL;
+
+    dir = opendir( path );
+    if ( dir == NULL )
+        return NULL;
+
+    d = calloc( sizeof( hb_batch_t ), 1 );
+    d->list_file = hb_list_init();
+
+    while ( (entry = readdir( dir ) ) )
+    {
+        filename = hb_strdup_printf( "%s" DIR_SEP_STR "%s", path, entry->d_name );
+        if ( stat( filename, &sb ) )
+        {
+            free( filename );
+            continue;
+        }
+
+        if ( !S_ISREG( sb.st_mode ) )
+        {
+            free( filename );
+            continue;
+        }
+
+        hb_list_add( d->list_file, filename );
+    }
+
+    if ( hb_list_count( d->list_file ) == 0 )
+    {
+        hb_list_close( &d->list_file );
+        free( d );
+        return NULL;
+    }
+
+    d->path = strdup( path );
+
+    return d;
+}
+
+/***********************************************************************
+ * hb_batch_title_count
+ **********************************************************************/
+int hb_batch_title_count( hb_batch_t * d )
+{
+    return hb_list_count( d->list_file );
+}
+
+/***********************************************************************
+ * hb_batch_title_scan
+ **********************************************************************/
+hb_title_t * hb_batch_title_scan( hb_batch_t * d, int t )
+{
+
+    hb_title_t   * title;
+    char         * filename;
+    hb_stream_t  * stream;
+
+    if ( t < 0 )
+        return NULL;
+
+    filename = hb_list_item( d->list_file, t - 1 );
+    if ( filename == NULL )
+        return NULL;
+
+    stream = hb_stream_open( filename, 0 );
+    if ( stream == NULL )
+        return NULL;
+
+    title = hb_stream_title_scan( stream );
+    hb_stream_close( &stream );
+    if ( title != NULL )
+    {
+        title->index = t;
+    }
+
+    return title;
+}
+
+/***********************************************************************
+ * hb_batch_close
+ ***********************************************************************
+ * Closes and frees everything
+ **********************************************************************/
+void hb_batch_close( hb_batch_t ** _d )
+{
+    hb_batch_t * d = *_d;
+    char       * filename;
+
+    while ( ( filename = hb_list_item( d->list_file, 0 ) ) )
+    {
+        hb_list_rem( d->list_file, filename );
+        free( filename );
+    }
+    hb_list_close( &d->list_file );
+    free( d->path );
+    free( d );
+    *_d = NULL;
+}
+
diff --git a/libhb/bd.c b/libhb/bd.c
new file mode 100644 (file)
index 0000000..4e4865b
--- /dev/null
@@ -0,0 +1,665 @@
+/* $Id: dvd.c,v 1.12 2005/11/25 15:05:25 titer Exp $
+
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+#include "hb.h"
+#include "lang.h"
+#include "hbffmpeg.h"
+
+#include "libbluray/bluray.h"
+
+struct hb_bd_s
+{
+    char         * path;
+    BLURAY       * bd;
+    int            title_count;
+    uint64_t       pkt_count;
+    hb_stream_t  * stream;
+    int            chapter;
+    int            next_chap;
+};
+
+/***********************************************************************
+ * Local prototypes
+ **********************************************************************/
+static int           next_packet( BLURAY *bd, uint8_t *pkt );
+
+/***********************************************************************
+ * hb_bd_init
+ ***********************************************************************
+ *
+ **********************************************************************/
+hb_bd_t * hb_bd_init( char * path )
+{
+    hb_bd_t * d;
+
+    d = calloc( sizeof( hb_bd_t ), 1 );
+
+    /* Open device */
+    d->bd = bd_open( path, NULL );
+    if( d->bd == NULL )
+    {
+        /*
+         * Not an error, may be a stream - which we'll try in a moment.
+         */
+        hb_log( "bd: not a bd - trying as a stream/file instead" );
+        goto fail;
+    }
+
+    d->title_count = bd_get_titles( d->bd, TITLES_RELEVANT );
+    if ( d->title_count == 0 )
+    {
+        hb_log( "bd: not a bd - trying as a stream/file instead" );
+        goto fail;
+    }
+    d->path = strdup( path );
+
+    return d;
+
+fail:
+    if( d->bd ) bd_close( d->bd );
+    free( d );
+    return NULL;
+}
+
+/***********************************************************************
+ * hb_bd_title_count
+ **********************************************************************/
+int hb_bd_title_count( hb_bd_t * d )
+{
+    return d->title_count;
+}
+
+/***********************************************************************
+ * hb_bd_title_scan
+ **********************************************************************/
+hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration )
+{
+
+    hb_title_t   * title;
+    hb_chapter_t * chapter;
+    int            ii;
+    BLURAY_TITLE_INFO * ti = NULL;
+
+    hb_log( "bd: scanning title %d", tt );
+
+    title = hb_title_init( d->path, tt );
+    title->demuxer = HB_MPEG2_TS_DEMUXER;
+    title->type = HB_BD_TYPE;
+    title->reg_desc = STR4_TO_UINT32("HDMV");
+
+    char * p_cur, * p_last = d->path;
+    for( p_cur = d->path; *p_cur; p_cur++ )
+    {
+        if( p_cur[0] == '/' && p_cur[1] )
+        {
+            p_last = &p_cur[1];
+        }
+    }
+    snprintf( title->name, sizeof( title->name ), "%s", p_last );
+    strncpy( title->path, d->path, 1024 );
+    title->path[1023] = 0;
+
+    title->vts = 0;
+    title->ttn = 0;
+
+    ti = bd_get_title_info( d->bd, tt - 1 );
+    if ( ti == NULL )
+    {
+        hb_log( "bd: invalid title" );
+        goto fail;
+    }
+    if ( ti->clip_count == 0 )
+    {
+        hb_log( "bd: stream has no clips" );
+        goto fail;
+    }
+    if ( ti->clips[0].video_stream_count == 0 )
+    {
+        hb_log( "bd: stream has no video" );
+        goto fail;
+    }
+
+    uint64_t pkt_count = 0;
+    for ( ii = 0; ii < ti->clip_count; ii++ )
+    {
+        pkt_count += ti->clips[ii].pkt_count;
+    }
+    title->block_start = 0;
+    title->block_end = pkt_count;
+    title->block_count = pkt_count;
+
+    title->angle_count = ti->angle_count;
+
+    /* Get duration */
+    title->duration = ti->duration;
+    title->hours    = title->duration / 90000 / 3600;
+    title->minutes  = ( ( title->duration / 90000 ) % 3600 ) / 60;
+    title->seconds  = ( title->duration / 90000 ) % 60;
+    hb_log( "bd: duration is %02d:%02d:%02d (%"PRId64" ms)",
+            title->hours, title->minutes, title->seconds,
+            title->duration / 90 );
+
+    /* ignore short titles because they're often stills */
+    if( ti->duration < min_duration )
+    {
+        hb_log( "bd: ignoring title (too short)" );
+        goto fail;
+    }
+
+    BLURAY_STREAM_INFO * bdvideo = &ti->clips[0].video_streams[0];
+
+    title->video_id = bdvideo->pid;
+    title->video_stream_type = bdvideo->coding_type;
+
+    hb_log( "bd: video id=%x, stream type=%s, format %s", title->video_id,
+            bdvideo->coding_type == BLURAY_STREAM_TYPE_VIDEO_MPEG1 ? "MPEG1" :
+            bdvideo->coding_type == BLURAY_STREAM_TYPE_VIDEO_MPEG2 ? "MPEG2" :
+            bdvideo->coding_type == BLURAY_STREAM_TYPE_VIDEO_VC1 ? "VC-1" :
+            bdvideo->coding_type == BLURAY_STREAM_TYPE_VIDEO_H264 ? "H264" :
+            "Unknown",
+            bdvideo->format == BLURAY_VIDEO_FORMAT_480I ? "480i" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_576I ? "576i" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_480P ? "480p" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_1080I ? "1080i" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_720P ? "720p" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_1080P ? "1080p" :
+            bdvideo->format == BLURAY_VIDEO_FORMAT_576P ? "576p" :
+            "Unknown"
+          );
+
+    if ( bdvideo->coding_type == BLURAY_STREAM_TYPE_VIDEO_VC1 &&
+       ( bdvideo->format == BLURAY_VIDEO_FORMAT_480I ||
+         bdvideo->format == BLURAY_VIDEO_FORMAT_576I ||
+         bdvideo->format == BLURAY_VIDEO_FORMAT_1080I ) )
+    {
+        hb_log( "bd: Interlaced VC-1 not supported" );
+        goto fail;
+    }
+
+    switch( bdvideo->coding_type )
+    {
+        case BLURAY_STREAM_TYPE_VIDEO_MPEG1:
+        case BLURAY_STREAM_TYPE_VIDEO_MPEG2:
+            title->video_codec = WORK_DECMPEG2;
+            title->video_codec_param = 0;
+            break;
+
+        case BLURAY_STREAM_TYPE_VIDEO_VC1:
+            title->video_codec = WORK_DECAVCODECV;
+            title->video_codec_param = CODEC_ID_VC1;
+            break;
+
+        case BLURAY_STREAM_TYPE_VIDEO_H264:
+            title->video_codec = WORK_DECAVCODECV;
+            title->video_codec_param = CODEC_ID_H264;
+            title->flags |= HBTF_NO_IDR;
+            break;
+
+        default:
+            hb_log( "scan: unknown video codec (%x)",
+                    bdvideo->coding_type );
+            goto fail;
+    }
+
+    switch ( bdvideo->aspect )
+    {
+        case BLURAY_ASPECT_RATIO_4_3:
+            title->container_aspect = 4. / 3.;
+            break;
+        case BLURAY_ASPECT_RATIO_16_9:
+            title->container_aspect = 16. / 9.;
+            break;
+        default:
+            hb_log( "bd: unknown aspect" );
+            goto fail;
+    }
+    hb_log( "bd: aspect = %g", title->container_aspect );
+
+    /* Detect audio */
+    // The BD may have clips that have no audio tracks, so scan
+    // the list of clips for one that has audio.
+    int most_audio = 0;
+    int audio_clip_index = 0;
+    for ( ii = 0; ii < ti->clip_count; ii++ )
+    {
+        if ( most_audio < ti->clips[ii].audio_stream_count )
+        {
+            most_audio = ti->clips[ii].audio_stream_count;
+            audio_clip_index = ii;
+        }
+    }
+    // Add all the audios found in the above clip.
+    for ( ii = 0; ii < ti->clips[audio_clip_index].audio_stream_count; ii++ )
+    {
+        hb_audio_t * audio;
+        iso639_lang_t * lang;
+        BLURAY_STREAM_INFO * bdaudio;
+
+        bdaudio = &ti->clips[audio_clip_index].audio_streams[ii];
+
+        hb_log( "bd: checking audio %d", ii + 1 );
+
+        audio = calloc( sizeof( hb_audio_t ), 1 );
+
+        audio->id = bdaudio->pid;
+
+        audio->config.in.stream_type = bdaudio->coding_type;
+        switch( bdaudio->coding_type )
+        {
+            case BLURAY_STREAM_TYPE_AUDIO_AC3:
+            case BLURAY_STREAM_TYPE_AUDIO_TRUHD:
+                audio->config.in.codec = HB_ACODEC_AC3;
+                audio->config.in.codec_param = 0;
+                break;
+
+            case BLURAY_STREAM_TYPE_AUDIO_LPCM:
+                audio->config.in.codec = HB_ACODEC_MPGA;
+                audio->config.in.codec_param = CODEC_ID_PCM_BLURAY;
+                break;
+
+            case BLURAY_STREAM_TYPE_AUDIO_AC3PLUS:
+                audio->config.in.codec = HB_ACODEC_MPGA;
+                audio->config.in.codec_param = CODEC_ID_AC3;
+                break;
+
+            case BLURAY_STREAM_TYPE_AUDIO_MPEG1:
+            case BLURAY_STREAM_TYPE_AUDIO_MPEG2:
+                audio->config.in.codec = HB_ACODEC_MPGA;
+                audio->config.in.codec_param = CODEC_ID_MP2;
+                break;
+
+            case BLURAY_STREAM_TYPE_AUDIO_DTS:
+            case BLURAY_STREAM_TYPE_AUDIO_DTSHD:
+            case BLURAY_STREAM_TYPE_AUDIO_DTSHD_MASTER:
+                audio->config.in.codec = HB_ACODEC_DCA;
+                audio->config.in.codec_param = 0;
+                break;
+
+            default:
+                audio->config.in.codec = 0;
+                hb_log( "scan: unknown audio codec (%x)",
+                        bdaudio->coding_type );
+                break;
+        }
+
+        audio->config.lang.type = 0;
+        lang = lang_for_code2( (char*)bdaudio->lang );
+
+        snprintf( audio->config.lang.description, 
+                  sizeof( audio->config.lang.description ), "%s (%s)",
+                  strlen(lang->native_name) ? lang->native_name : 
+                                              lang->eng_name,
+                  audio->config.in.codec == HB_ACODEC_AC3 ? "AC3" : 
+                  ( audio->config.in.codec == HB_ACODEC_DCA ? "DTS" : 
+                  ( audio->config.in.codec == HB_ACODEC_MPGA ? "MPEG" : 
+                                                               "LPCM" ) ) );
+
+        snprintf( audio->config.lang.simple, 
+                  sizeof( audio->config.lang.simple ), "%s",
+                  strlen(lang->native_name) ? lang->native_name : 
+                                              lang->eng_name );
+
+        snprintf( audio->config.lang.iso639_2, 
+                  sizeof( audio->config.lang.iso639_2 ), "%s", lang->iso639_2);
+
+        hb_log( "bd: audio id=%x, lang=%s, 3cc=%s", audio->id,
+                audio->config.lang.description, audio->config.lang.iso639_2 );
+
+        audio->config.in.track = ii;
+        hb_list_add( title->list_audio, audio );
+    }
+
+    /* Chapters */
+    for ( ii = 0; ii < ti->chapter_count; ii++ )
+    {
+        chapter = calloc( sizeof( hb_chapter_t ), 1 );
+
+        chapter->index = ii + 1;
+        chapter->duration = ti->chapters[ii].duration;
+        chapter->block_start = ti->chapters[ii].offset;
+
+        int seconds;
+        seconds            = ( chapter->duration + 45000 ) / 90000;
+        chapter->hours     = seconds / 3600;
+        chapter->minutes   = ( seconds % 3600 ) / 60;
+        chapter->seconds   = seconds % 60;
+
+        hb_log( "bd: chap %d packet=%"PRIu64", %"PRId64" ms",
+                chapter->index,
+                chapter->block_start,
+                chapter->duration / 90 );
+
+        hb_list_add( title->list_chapter, chapter );
+    }
+    hb_log( "bd: title %d has %d chapters", tt, ti->chapter_count );
+
+    /* This title is ok so far */
+    goto cleanup;
+
+fail:
+    hb_list_close( &title->list_audio );
+    free( title );
+    title = NULL;
+
+cleanup:
+    if ( ti ) bd_free_title_info( ti );
+
+    return title;
+}
+
+/***********************************************************************
+ * hb_bd_main_feature
+ **********************************************************************/
+int hb_bd_main_feature( hb_bd_t * d, hb_list_t * list_title )
+{
+    int longest = 0;
+    int ii;
+    uint64_t longest_duration = 0;
+    int highest_rank = 0;
+    int rank[8] = {0, 1, 3, 2, 6, 5, 7, 4};
+    BLURAY_TITLE_INFO * ti;
+
+    for ( ii = 0; ii < hb_list_count( list_title ); ii++ )
+    {
+        hb_title_t * title = hb_list_item( list_title, ii );
+        ti = bd_get_title_info( d->bd, title->index - 1 );
+        if ( ti ) 
+        {
+            BLURAY_STREAM_INFO * bdvideo = &ti->clips[0].video_streams[0];
+            if ( title->duration > longest_duration * 0.7 && bdvideo->format < 8 )
+            {
+                if (highest_rank < rank[bdvideo->format] ||
+                    ( title->duration > longest_duration &&
+                          highest_rank == rank[bdvideo->format]))
+                {
+                    longest = title->index;
+                    longest_duration = title->duration;
+                    highest_rank = rank[bdvideo->format];
+                }
+            }
+            bd_free_title_info( ti );
+        }
+        else if ( title->duration > longest_duration )
+        {
+            longest_duration = title->duration;
+            longest = title->index;
+        }
+    }
+    return longest;
+}
+
+/***********************************************************************
+ * hb_bd_start
+ ***********************************************************************
+ * Title and chapter start at 1
+ **********************************************************************/
+int hb_bd_start( hb_bd_t * d, hb_title_t *title )
+{
+    BD_EVENT event;
+
+    d->pkt_count = title->block_count;
+
+    // Calling bd_get_event initializes libbluray event queue.
+    bd_select_title( d->bd, title->index - 1 );
+    bd_get_event( d->bd, &event );
+    d->chapter = 1;
+    d->stream = hb_bd_stream_open( title );
+    if ( d->stream == NULL )
+    {
+        return 0;
+    }
+    return 1;
+}
+
+/***********************************************************************
+ * hb_bd_stop
+ ***********************************************************************
+ *
+ **********************************************************************/
+void hb_bd_stop( hb_bd_t * d )
+{
+    if( d->stream ) hb_stream_close( &d->stream );
+}
+
+/***********************************************************************
+ * hb_bd_seek
+ ***********************************************************************
+ *
+ **********************************************************************/
+int hb_bd_seek( hb_bd_t * d, float f )
+{
+    uint64_t packet = f * d->pkt_count;
+
+    bd_seek(d->bd, packet * 192);
+    d->next_chap = bd_get_current_chapter( d->bd ) + 1;
+    return 1;
+}
+
+int hb_bd_seek_pts( hb_bd_t * d, uint64_t pts )
+{
+    bd_seek_time(d->bd, pts);
+    d->next_chap = bd_get_current_chapter( d->bd ) + 1;
+    return 1;
+}
+
+int hb_bd_seek_chapter( hb_bd_t * d, int c )
+{
+    int64_t pos;
+    d->next_chap = c;
+    pos = bd_seek_chapter( d->bd, c - 1 );
+    return 1;
+}
+
+/***********************************************************************
+ * hb_bd_read
+ ***********************************************************************
+ *
+ **********************************************************************/
+int hb_bd_read( hb_bd_t * d, hb_buffer_t * b )
+{
+    int result;
+    int error_count = 0;
+    uint8_t buf[192];
+    BD_EVENT event;
+    uint64_t pos;
+
+    while ( 1 )
+    {
+        if ( d->next_chap != d->chapter )
+        {
+            b->new_chap = d->chapter = d->next_chap;
+        }
+        result = next_packet( d->bd, buf );
+        if ( result < 0 )
+        {
+            hb_error("bd: Read Error");
+            pos = bd_tell( d->bd );
+            bd_seek( d->bd, pos + 192 );
+            error_count++;
+            if (error_count > 10)
+            {
+                hb_error("bd: Error, too many consecutive read errors");
+                return 0;
+            }
+            continue;
+        }
+        else if ( result == 0 )
+        {
+            return 0;
+        }
+
+        error_count = 0;
+        while ( bd_get_event( d->bd, &event ) )
+        {
+            switch ( event.event )
+            {
+                case BD_EVENT_CHAPTER:
+                    // The muxers expect to only get chapter 2 and above
+                    // They write chapter 1 when chapter 2 is detected.
+                    d->next_chap = event.param;
+                    break;
+
+                default:
+                    break;
+            }
+        }
+        // buf+4 to skip the BD timestamp at start of packet
+        result = hb_ts_decode_pkt( d->stream, buf+4, b );
+        if ( result )
+        {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+/***********************************************************************
+ * hb_bd_chapter
+ ***********************************************************************
+ * Returns in which chapter the next block to be read is.
+ * Chapter numbers start at 1.
+ **********************************************************************/
+int hb_bd_chapter( hb_bd_t * d )
+{
+    return d->next_chap;
+}
+
+/***********************************************************************
+ * hb_bd_close
+ ***********************************************************************
+ * Closes and frees everything
+ **********************************************************************/
+void hb_bd_close( hb_bd_t ** _d )
+{
+    hb_bd_t * d = *_d;
+
+    if( d->stream ) hb_stream_close( &d->stream );
+    if( d->bd ) bd_close( d->bd );
+
+    free( d );
+    *_d = NULL;
+}
+
+/***********************************************************************
+ * hb_bd_set_angle
+ ***********************************************************************
+ * Sets the angle to read
+ **********************************************************************/
+void hb_bd_set_angle( hb_bd_t * d, int angle )
+{
+
+    if ( !bd_select_angle( d->bd, angle) )
+    {
+        hb_log("bd_select_angle failed");
+    }
+}
+
+static int check_ts_sync(const uint8_t *buf)
+{
+    // must have initial sync byte, no scrambling & a legal adaptation ctrl
+    return (buf[0] == 0x47) && ((buf[3] >> 6) == 0) && ((buf[3] >> 4) > 0);
+}
+
+static int have_ts_sync(const uint8_t *buf, int psize)
+{
+    return check_ts_sync(&buf[0*psize]) && check_ts_sync(&buf[1*psize]) &&
+           check_ts_sync(&buf[2*psize]) && check_ts_sync(&buf[3*psize]) &&
+           check_ts_sync(&buf[4*psize]) && check_ts_sync(&buf[5*psize]) &&
+           check_ts_sync(&buf[6*psize]) && check_ts_sync(&buf[7*psize]);
+}
+
+#define MAX_HOLE 192*80
+
+static uint64_t align_to_next_packet(BLURAY *bd, uint8_t *pkt)
+{
+    uint8_t buf[MAX_HOLE];
+    uint64_t pos = 0;
+    uint64_t start = bd_tell(bd);
+    uint64_t orig;
+    uint64_t off = 192;
+
+    memcpy(buf, pkt, 192);
+    if ( start >= 192 ) {
+        start -= 192;
+    }
+    orig = start;
+
+    while (1)
+    {
+        if (bd_read(bd, buf+off, sizeof(buf)-off) == sizeof(buf)-off)
+        {
+            const uint8_t *bp = buf;
+            int i;
+
+            for ( i = sizeof(buf) - 8 * 192; --i >= 0; ++bp )
+            {
+                if ( have_ts_sync( bp, 192 ) )
+                {
+                    break;
+                }
+            }
+            if ( i >= 0 )
+            {
+                pos = ( bp - buf );
+                break;
+            }
+            off = 8 * 192;
+            memcpy(buf, buf + sizeof(buf) - off, off);
+            start += sizeof(buf) - off;
+        }
+        else
+        {
+            return 0;
+        }
+    }
+    off = start + pos - 4;
+    // bd_seek seeks to the nearest access unit *before* the requested position
+    // we don't want to seek backwards, so we need to read until we get
+    // past that position.
+    bd_seek(bd, off);
+    while (off > bd_tell(bd))
+    {
+        if (bd_read(bd, buf, 192) != 192)
+        {
+            break;
+        }
+    }
+    return start - orig + pos;
+}
+
+static int next_packet( BLURAY *bd, uint8_t *pkt )
+{
+    int result;
+
+    while ( 1 )
+    {
+        result = bd_read( bd, pkt, 192 );
+        if ( result < 0 )
+        {
+            return -1;
+        }
+        if ( result < 192 )
+        {
+            return 0;
+        }
+        // Sync byte is byte 4.  0-3 are timestamp.
+        if (pkt[4] == 0x47)
+        {
+            return 1;
+        }
+        // lost sync - back up to where we started then try to re-establish.
+        uint64_t pos = bd_tell(bd);
+        uint64_t pos2 = align_to_next_packet(bd, pkt);
+        if ( pos2 == 0 )
+        {
+            hb_log( "next_packet: eof while re-establishing sync @ %"PRId64, pos );
+            return 0;
+        }
+        hb_log( "next_packet: sync lost @ %"PRId64", regained after %"PRId64" bytes",
+                 pos, pos2 );
+    }
+}
+
index 52ea27f..f1926e9 100644 (file)
@@ -34,10 +34,9 @@ hb_rate_t hb_audio_bitrates[] =
   {  "64",  64 }, {  "80",  80 }, {  "96",  96 }, { "112", 112 },
   { "128", 128 }, { "160", 160 }, { "192", 192 }, { "224", 224 },
   { "256", 256 }, { "320", 320 }, { "384", 384 }, { "448", 448 },
-  { "768", 768 } };
+  { "512", 512 }, { "576", 576 }, { "640", 640 }, { "768", 768 } };
 int hb_audio_bitrates_count = sizeof( hb_audio_bitrates ) /
                               sizeof( hb_rate_t );
-int hb_audio_bitrates_default = 8; /* 128 kbps */
 
 static hb_error_handler_t *error_handler = NULL;
 
@@ -77,6 +76,310 @@ const char * hb_mixdown_get_short_name_from_mixdown( int amixdown )
     return "";
 }
 
+// Given an input bitrate, find closest match in the set of allowed bitrates
+int hb_find_closest_audio_bitrate(int bitrate)
+{
+    int ii;
+    int result;
+
+    // result is highest rate if none found during search.
+    // rate returned will always be <= rate asked for.
+    result = hb_audio_bitrates[0].rate;
+    for (ii = hb_audio_bitrates_count-1; ii >= 0; ii--)
+    {
+        if (bitrate >= hb_audio_bitrates[ii].rate)
+        {
+            result = hb_audio_bitrates[ii].rate;
+            break;
+        }
+    }
+    return result;
+}
+
+// Get the bitrate low and high limits for a codec/samplerate/mixdown triplet
+// The limits have been empirically determined through testing.  Max bitrates
+// in table below. Numbers in parenthesis are the target bitrate chosen.
+/*
+Encoder     1 channel           2 channels          6 channels
+
+faac
+24kHz       86 (128)            173 (256)           460 (768)
+48kHz       152 (160)           304 (320)           759 (768)
+
+Vorbis
+24kHz       97 (80)             177 (160)           527 (512)
+48kHz       241 (224)           465 (448)           783 (768)
+
+Lame
+24kHz       146 (768)           138 (768)
+48kHz       318 (768)           318 (768)
+
+ffac3
+24kHz       318 (320)           318 (320)           318 (320)
+48kHz       636 (640)           636 (640)           636 (640)
+
+Core Audio  (core audio api provides range of allowed bitrates)
+24kHz       16-64               32-128              80-320      
+44.1kHz                         64-320              160-768      
+48kHz       32-256              64-320              160-768                 
+
+Core Audio  (minimum limits found in testing)
+24kHz       16                  32                  96
+44.1kHz     32                  64                  160
+48kHz       40                  80                  240
+*/
+
+void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, int *low, int *high)
+{
+    int channels;
+
+    channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mixdown);
+    switch (codec)
+    {
+        case HB_ACODEC_AC3:
+            *low = 32 * channels;
+            if (samplerate > 24000)
+            {
+                *high = 640;
+            }
+            else
+            {
+                *high = 320;
+            }
+            break;
+
+        case HB_ACODEC_CA_AAC:
+            if (samplerate > 44100)
+            {
+                *low = channels * 40;
+                *high = 256;
+                if (channels == 2)
+                    *high = 320;
+                if (channels == 6)
+                {
+                    *high = 768;
+                }
+            }
+            else if (samplerate > 24000)
+            {
+                *low = channels * 32;
+                *high = 256;
+                if (channels == 2)
+                    *high = 320;
+                if (channels == 6)
+                {
+                    *low = 160;
+                    *high = 768;
+                }
+            }
+            else
+            {
+                *low = channels * 16;
+                *high = channels * 64;
+                if (channels == 6)
+                {
+                    *high = 320;
+                }
+            }
+            break;
+
+        case HB_ACODEC_FAAC:
+            *low = 32 * channels;
+            if (samplerate > 24000)
+            {
+                *high = 160 * channels;
+                if (*high > 768)
+                    *high = 768;
+            }
+            else
+            {
+                *high = 96 * channels;
+                if (*high > 480)
+                    *high = 480;
+            }
+            break;
+
+        case HB_ACODEC_VORBIS:
+            *high = channels * 80;
+            if (samplerate > 24000)
+            {
+                if (channels > 2)
+                {
+                    // Vorbis minimum is around 30kbps/ch for 6ch 
+                    // at rates > 24k (32k/44.1k/48k) 
+                    *low = 32 * channels;
+                    *high = 128 * channels;
+                }
+                else
+                {
+                    // Allow 24kbps mono and 48kbps stereo at rates > 24k 
+                    // (32k/44.1k/48k)
+                    *low = 24 * channels;
+                    if (samplerate > 32000)
+                        *high = channels * 224;
+                    else
+                        *high = channels * 160;
+                }
+            }
+            else
+            {
+                *low = channels * 16;
+                *high = 80 * channels;
+            }
+            break;
+
+        case HB_ACODEC_LAME:
+            *low = hb_audio_bitrates[0].rate;
+            if (samplerate > 24000)
+                *high = 320;
+            else
+                *high = 160;
+            break;
+        
+        default:
+            *low = hb_audio_bitrates[0].rate;
+            *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
+            break;
+    }
+}
+
+// Given an input bitrate, sanitize it.  Check low and high limits and
+// make sure it is in the set of allowed bitrates.
+int hb_get_best_audio_bitrate( uint32_t codec, int bitrate, int samplerate, int mixdown)
+{
+    int low, high;
+
+    hb_get_audio_bitrate_limits(codec, samplerate, mixdown, &low, &high);
+    if (bitrate > high)
+        bitrate = high;
+    if (bitrate < low)
+        bitrate = low;
+    bitrate = hb_find_closest_audio_bitrate(bitrate);
+    return bitrate;
+}
+
+// Get the default bitrate for a given codec/samplerate/mixdown triplet.
+int hb_get_default_audio_bitrate( uint32_t codec, int samplerate, int mixdown )
+{
+    int bitrate, channels;
+    int sr_shift;
+
+    channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mixdown);
+
+    // Min bitrate is established such that we get good quality
+    // audio as a minimum.
+    sr_shift = (samplerate <= 24000) ? 1 : 0;
+
+    switch ( codec )
+    {
+        case HB_ACODEC_AC3:
+            if (channels == 1)
+                bitrate = 96;
+            else if (channels <= 2)
+                bitrate = 224;
+            else
+                bitrate = 640;
+            break;
+        default:
+            bitrate = channels * 80;
+    }
+    bitrate >>= sr_shift;
+    bitrate = hb_get_best_audio_bitrate( codec, bitrate, samplerate, mixdown );
+    return bitrate;
+}
+
+int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown )
+{
+
+    int best_mixdown;
+    
+    if (codec & HB_ACODEC_PASS_FLAG)
+    {
+        // Audio pass-thru.  No mixdown.
+        return 0;
+    }
+    switch (layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
+    {
+        // stereo input or something not handled below
+        default:
+        case HB_INPUT_CH_LAYOUT_STEREO:
+            // mono gets mixed up to stereo & more than stereo gets mixed down
+            best_mixdown = HB_AMIXDOWN_STEREO;
+            break;
+
+        // mono input
+        case HB_INPUT_CH_LAYOUT_MONO:
+            // everything else passes through
+            best_mixdown = HB_AMIXDOWN_MONO;
+            break;
+
+        // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
+        // the A52 flags don't allow for a way to distinguish between DPL1 and
+        // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
+        case HB_INPUT_CH_LAYOUT_DOLBY:
+            best_mixdown = HB_AMIXDOWN_DOLBY;
+            break;
+
+        // 4 channel discrete
+        case HB_INPUT_CH_LAYOUT_2F2R:
+        case HB_INPUT_CH_LAYOUT_3F1R:
+            // a52dec and libdca can't upmix to 6ch, 
+            // so we must downmix these.
+            best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+            break;
+
+        // 5, 6, 7, or 8 channel discrete
+        case HB_INPUT_CH_LAYOUT_4F2R:
+        case HB_INPUT_CH_LAYOUT_3F4R:
+        case HB_INPUT_CH_LAYOUT_3F2R:
+            if ( ! ( layout & HB_INPUT_CH_LAYOUT_HAS_LFE ) )
+            {
+                // we don't do 5 channel discrete so mixdown to DPLII
+                // a52dec and libdca can't upmix to 6ch, 
+                // so we must downmix this.
+                best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+            }
+            else
+            {
+                switch (codec)
+                {
+                    case HB_ACODEC_LAME:
+                        best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+                        break;
+
+                    default:
+                        best_mixdown = HB_AMIXDOWN_6CH;
+                        break;
+                }
+            }
+            break;
+    }
+    // return the best that is not greater than the requested mixdown
+    // 0 means the caller requested the best available mixdown
+    if( best_mixdown > mixdown && mixdown != 0 )
+        best_mixdown = mixdown;
+    
+    return best_mixdown;
+}
+
+int hb_get_default_mixdown( uint32_t codec, int layout )
+{
+    int mixdown;
+    switch (codec)
+    {
+        // the AC3 encoder defaults to the best mixdown up to 6-channel
+        case HB_ACODEC_AC3:
+            mixdown = HB_AMIXDOWN_6CH;
+            break;
+        // other encoders default to the best mixdown up to DPLII
+        default:
+            mixdown = HB_AMIXDOWN_DOLBYPLII;
+            break;
+    }
+    // return the best available mixdown up to the selected default
+    return hb_get_best_mixdown( codec, layout, mixdown );
+}
+
 /**********************************************************************
  * hb_reduce
  **********************************************************************
@@ -119,6 +422,9 @@ void hb_fix_aspect( hb_job_t * job, int keep )
 {
     hb_title_t * title = job->title;
     int          i;
+    int  min_width;
+    int min_height;
+    int    modulus;
 
     /* don't do anything unless the title has complete size info */
     if ( title->height == 0 || title->width == 0 || title->aspect == 0 )
@@ -129,44 +435,47 @@ void hb_fix_aspect( hb_job_t * job, int keep )
         return;
     }
 
-    /* Sanity checks:
-       Widths and heights must be multiples of 16 and greater than or
-       equal to 16
-       Crop values must be multiples of 2, greater than or equal to 0
-       and less than half of the dimension */
-    job->width   = MULTIPLE_16( job->width );
-    job->height  = MULTIPLE_16( job->height );
-    job->width   = MAX( 16, job->width );
-    job->height  = MAX( 16, job->height );
+    // min_width and min_height should be multiples of modulus
+    min_width    = 32;
+    min_height   = 32;
+    modulus      = job->modulus ? job->modulus : 16;
+
     for( i = 0; i < 4; i++ )
     {
-        job->crop[i] = EVEN( job->crop[i] );
-        job->crop[i] = MAX( 0, job->crop[i] );
+        // Sanity check crop values are zero or positive multiples of 2
         if( i < 2 )
         {
-            /* Top, bottom */
-            job->crop[i] = MIN( job->crop[i], ( title->height / 2 ) - 2 );
+            // Top, bottom
+            job->crop[i] = MIN( EVEN( job->crop[i] ), EVEN( ( title->height / 2 ) - ( min_height / 2 ) ) );
+            job->crop[i] = MAX( 0, job->crop[i] );
         }
         else
         {
-            /* Left, right */
-            job->crop[i] = MIN( job->crop[i], ( title->width / 2 ) - 2 );
+            // Left, right
+            job->crop[i] = MIN( EVEN( job->crop[i] ), EVEN( ( title->width / 2 ) - ( min_width / 2 ) ) );
+            job->crop[i] = MAX( 0, job->crop[i] );
         }
     }
 
     double par = (double)title->width / ( (double)title->height * title->aspect );
     double cropped_sar = (double)( title->height - job->crop[0] - job->crop[1] ) /
-                         (double)(title->width - job->crop[2] - job->crop[3] );
+                         (double)( title->width - job->crop[2] - job->crop[3] );
     double ar = par * cropped_sar;
+
+    // Dimensions must be greater than minimum and multiple of modulus
     if( keep == HB_KEEP_WIDTH )
     {
-        job->height = MULTIPLE_16( (uint64_t)( (double)job->width * ar ) );
-        job->height = MAX( 16, job->height );
+        job->width  = MULTIPLE_MOD( job->width, modulus );
+        job->width  = MAX( min_width, job->width );
+        job->height = MULTIPLE_MOD( (uint64_t)( (double)job->width * ar ), modulus );
+        job->height = MAX( min_height, job->height );
     }
     else
     {
-        job->width = MULTIPLE_16( (uint64_t)( (double)job->height / ar ) );
-        job->width = MAX( 16, job->width );
+        job->height = MULTIPLE_MOD( job->height, modulus );
+        job->height = MAX( min_height, job->height );
+        job->width  = MULTIPLE_MOD( (uint64_t)( (double)job->height / ar ), modulus );
+        job->width  = MAX( min_width, job->width );
     }
 }
 
@@ -191,16 +500,8 @@ int hb_calc_bitrate( hb_job_t * job, int size )
        (quite guessed) */
     switch( job->mux )
     {
-       case HB_MUX_MP4:
-       case HB_MUX_PSP:
-               case HB_MUX_IPOD:
-               case HB_MUX_MKV:
-            overhead = 6;
-            break;
-        case HB_MUX_AVI:
-            overhead = 24;
-            break;
-        case HB_MUX_OGM:
+        case HB_MUX_MP4:
+        case HB_MUX_MKV:
             overhead = 6;
             break;
         default:
@@ -249,6 +550,8 @@ int hb_calc_bitrate( hb_job_t * job, int size )
             case HB_ACODEC_LAME:
                 samples_per_frame = 1152;
                 break;
+            case HB_ACODEC_AC3_PASS:
+            case HB_ACODEC_DCA_PASS:
             case HB_ACODEC_AC3:
             case HB_ACODEC_DCA:
                 samples_per_frame = 1536;
@@ -257,8 +560,8 @@ int hb_calc_bitrate( hb_job_t * job, int size )
                 return 0;
         }
 
-        if( audio->config.out.codec == HB_ACODEC_AC3 ||
-            audio->config.out.codec == HB_ACODEC_DCA)
+        if( audio->config.out.codec == HB_ACODEC_AC3_PASS ||
+            audio->config.out.codec == HB_ACODEC_DCA_PASS)
         {
             /*
              * For pass through we take the bitrate from the input audio
@@ -613,13 +916,84 @@ void hb_deep_log( hb_debug_level_t level, char * log, ... )
 void hb_error( char * log, ... )
 {
     char        string[181]; /* 180 chars + \0 */
+    char        rep_string[181];
+    static char last_string[181];
+    static int  last_error_count = 0;
+    static uint64_t last_series_error_time = 0;
+    static hb_lock_t *mutex = 0;
     va_list     args;
+    uint64_t time_now;
 
     /* Convert the message to a string */
     va_start( args, log );
     vsnprintf( string, 180, log, args );
     va_end( args );
 
+    if( !mutex )
+    {
+        mutex = hb_lock_init();
+    }
+
+    hb_lock( mutex );
+
+    time_now = hb_get_date();
+
+    if( strcmp( string, last_string) == 0 )
+    {
+        /*
+         * The last error and this one are the same, don't log it
+         * just count it instead, unless it was more than one second
+         * ago.
+         */
+        last_error_count++;
+        if( last_series_error_time + ( 1000 * 1 ) > time_now )
+        {
+            hb_unlock( mutex );
+            return;
+        } 
+    }
+    
+    /*
+     * A new error, or the same one more than 10sec since the last one
+     * did we have any of the same counted up?
+     */
+    if( last_error_count > 0 )
+    {
+        /*
+         * Print out the last error to ensure context for the last 
+         * repeated message.
+         */
+        if( error_handler )
+        {
+            error_handler( last_string );
+        } else {
+            hb_log( "%s", last_string );
+        }
+        
+        if( last_error_count > 1 )
+        {
+            /*
+             * Only print out the repeat message for more than 2 of the
+             * same, since we just printed out two of them already.
+             */
+            snprintf( rep_string, 180, "Last error repeated %d times", 
+                      last_error_count - 1 );
+            
+            if( error_handler )
+            {
+                error_handler( rep_string );
+            } else {
+                hb_log( "%s", rep_string );
+            }
+        }
+        
+        last_error_count = 0;
+    }
+
+    last_series_error_time = time_now;
+
+    strcpy( last_string, string );
+
     /*
      * Got the error in a single string, send it off to be dispatched.
      */
@@ -627,8 +1001,10 @@ void hb_error( char * log, ... )
     {
         error_handler( string );
     } else {
-        hb_log( string );
+        hb_log( "%s", string );
     }
+
+    hb_unlock( mutex );
 }
 
 void hb_register_error_handler( hb_error_handler_t * handler )
@@ -641,7 +1017,7 @@ void hb_register_error_handler( hb_error_handler_t * handler )
  **********************************************************************
  *
  *********************************************************************/
-hb_title_t * hb_title_init( char * dvd, int index )
+hb_title_t * hb_title_init( char * path, int index )
 {
     hb_title_t * t;
 
@@ -651,7 +1027,8 @@ hb_title_t * hb_title_init( char * dvd, int index )
     t->list_audio    = hb_list_init();
     t->list_chapter  = hb_list_init();
     t->list_subtitle = hb_list_init();
-    strcat( t->dvd, dvd );
+    t->list_attachment = hb_list_init();
+    strcat( t->path, path );
     // default to decoding mpeg2
     t->video_id      = 0xE0;
     t->video_codec   = WORK_DECMPEG2;
@@ -670,6 +1047,7 @@ void hb_title_close( hb_title_t ** _t )
     hb_audio_t * audio;
     hb_chapter_t * chapter;
     hb_subtitle_t * subtitle;
+    hb_attachment_t * attachment;
 
     while( ( audio = hb_list_item( t->list_audio, 0 ) ) )
     {
@@ -688,9 +1066,31 @@ void hb_title_close( hb_title_t ** _t )
     while( ( subtitle = hb_list_item( t->list_subtitle, 0 ) ) )
     {
         hb_list_rem( t->list_subtitle, subtitle );
+        if ( subtitle->extradata )
+        {
+            free( subtitle->extradata );
+            subtitle->extradata = NULL;
+        }
         free( subtitle );
     }
     hb_list_close( &t->list_subtitle );
+    
+    while( ( attachment = hb_list_item( t->list_attachment, 0 ) ) )
+    {
+        hb_list_rem( t->list_attachment, attachment );
+        if ( attachment->name )
+        {
+            free( attachment->name );
+            attachment->name = NULL;
+        }
+        if ( attachment->data )
+        {
+            free( attachment->data );
+            attachment->data = NULL;
+        }
+        free( attachment );
+    }
+    hb_list_close( &t->list_attachment );
 
     if( t->metadata )
     {
@@ -801,7 +1201,8 @@ int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg)
      */
     audio->config.out.track = hb_list_count(job->list_audio) + 1;
     audio->config.out.codec = audiocfg->out.codec;
-    if( audiocfg->out.codec == audio->config.in.codec )
+    if( (audiocfg->out.codec & HB_ACODEC_MASK) == audio->config.in.codec &&
+        (audiocfg->out.codec & HB_ACODEC_PASS_FLAG ) )
     {
         /* Pass-through, copy from input. */
         audio->config.out.samplerate = audio->config.in.samplerate;
@@ -812,6 +1213,7 @@ int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg)
     else
     {
         /* Non pass-through, use what is given. */
+        audio->config.out.codec &= ~HB_ACODEC_PASS_FLAG;
         audio->config.out.samplerate = audiocfg->out.samplerate;
         audio->config.out.bitrate = audiocfg->out.bitrate;
         audio->config.out.dynamic_range_compression = audiocfg->out.dynamic_range_compression;
@@ -845,6 +1247,11 @@ hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src)
     {
         subtitle = calloc(1, sizeof(*subtitle));
         memcpy(subtitle, src, sizeof(*subtitle));
+        if ( src->extradata )
+        {
+            subtitle->extradata = malloc( src->extradata_size );
+            memcpy( subtitle->extradata, src->extradata, src->extradata_size );
+        }
     }
     return subtitle;
 }
@@ -900,3 +1307,162 @@ int hb_srt_add( const hb_job_t * job,
     }
     return retval;
 }
+
+char * hb_strdup_printf( char * fmt, ... )
+{
+    int       len;
+    va_list   ap;
+    int       size = 256;
+    char    * str;
+    char    * tmp;
+
+    str = malloc( size );
+    if ( str == NULL )
+        return NULL;
+
+    while (1) 
+    {
+        /* Try to print in the allocated space. */
+        va_start( ap, fmt );
+        len = vsnprintf( str, size, fmt, ap );
+        va_end( ap );
+
+        /* If that worked, return the string. */
+        if ( len > -1 && len < size )
+        {
+            return str;
+        }
+
+        /* Else try again with more space. */
+        if ( len > -1 )     /* glibc 2.1 */
+            size = len + 1; /* precisely what is needed */
+        else                /* glibc 2.0 */
+            size *= 2;      /* twice the old size */
+        tmp = realloc( str, size );
+        if ( tmp == NULL )
+        {
+            free( str );
+            return NULL;
+        }
+        else
+            str = tmp;
+    }
+}
+
+/**********************************************************************
+ * hb_attachment_copy
+ **********************************************************************
+ *
+ *********************************************************************/
+hb_attachment_t *hb_attachment_copy(const hb_attachment_t *src)
+{
+    hb_attachment_t *attachment = NULL;
+
+    if( src )
+    {
+        attachment = calloc(1, sizeof(*attachment));
+        memcpy(attachment, src, sizeof(*attachment));
+        if ( src->name )
+        {
+            attachment->name = strdup( src->name );
+        }
+        if ( src->data )
+        {
+            attachment->data = malloc( src->size );
+            memcpy( attachment->data, src->data, src->size );
+        }
+    }
+    return attachment;
+}
+
+/**********************************************************************
+ * hb_yuv2rgb
+ **********************************************************************
+ * Converts a YCbCr pixel to an RGB pixel.
+ * 
+ * This conversion is lossy (due to rounding and clamping).
+ * 
+ * Algorithm:
+ *   http://en.wikipedia.org/w/index.php?title=YCbCr&oldid=361987695#Technical_details
+ *********************************************************************/
+int hb_yuv2rgb(int yuv)
+{
+    double y, Cr, Cb;
+    int r, g, b;
+
+    y  = (yuv >> 16) & 0xff;
+    Cb = (yuv >>  8) & 0xff;
+    Cr = (yuv      ) & 0xff;
+
+    r = 1.164 * (y - 16)                      + 2.018 * (Cb - 128);
+    g = 1.164 * (y - 16) - 0.813 * (Cr - 128) - 0.391 * (Cb - 128);
+    b = 1.164 * (y - 16) + 1.596 * (Cr - 128);
+    
+    r = (r < 0) ? 0 : r;
+    g = (g < 0) ? 0 : g;
+    b = (b < 0) ? 0 : b;
+    
+    r = (r > 255) ? 255 : r;
+    g = (g > 255) ? 255 : g;
+    b = (b > 255) ? 255 : b;
+    
+    return (r << 16) | (g << 8) | b;
+}
+
+/**********************************************************************
+ * hb_rgb2yuv
+ **********************************************************************
+ * Converts an RGB pixel to a YCbCr pixel.
+ * 
+ * This conversion is lossy (due to rounding and clamping).
+ * 
+ * Algorithm:
+ *   http://en.wikipedia.org/w/index.php?title=YCbCr&oldid=361987695#Technical_details
+ *********************************************************************/
+int hb_rgb2yuv(int rgb)
+{
+    double r, g, b;
+    int y, Cr, Cb;
+    
+    r = (rgb >> 16) & 0xff;
+    g = (rgb >>  8) & 0xff;
+    b = (rgb      ) & 0xff;
+
+    y  =  16. + ( 0.257 * r) + (0.504 * g) + (0.098 * b);
+    Cb = 128. + (-0.148 * r) - (0.291 * g) + (0.439 * b);
+    Cr = 128. + ( 0.439 * r) - (0.368 * g) - (0.071 * b);
+    
+    y = (y < 0) ? 0 : y;
+    Cb = (Cb < 0) ? 0 : Cb;
+    Cr = (Cr < 0) ? 0 : Cr;
+    
+    y = (y > 255) ? 255 : y;
+    Cb = (Cb > 255) ? 255 : Cb;
+    Cr = (Cr > 255) ? 255 : Cr;
+    
+    return (y << 16) | (Cb << 8) | Cr;
+}
+
+const char * hb_subsource_name( int source )
+{
+    switch (source)
+    {
+        case VOBSUB:
+            return "VOBSUB";
+        case SRTSUB:
+            return "SRT";
+        case CC608SUB:
+            return "CC";
+        case CC708SUB:
+            return "CC";
+        case UTF8SUB:
+            return "UTF-8";
+        case TX3GSUB:
+            return "TX3G";
+        case SSASUB:
+            return "SSA";
+        default:
+            return "Unknown";
+    }
+}
+
index b6c5e57..0dd3a2d 100644 (file)
@@ -48,6 +48,7 @@
 #define EVEN( a )        ( (a) + ( (a) & 1 ) )
 #define MULTIPLE_16( a ) ( 16 * ( ( (a) + 8 ) / 16 ) )
 #define MULTIPLE_MOD( a, b ) ((b==1)?a:( b * ( ( (a) + (b / 2) - 1) / b ) ))
+#define MULTIPLE_MOD_DOWN( a, b ) ((b==1)?a:( b * ( (a) / b ) ))
 
 #define HB_DVD_READ_BUFFER_SIZE 2048
 
@@ -62,6 +63,7 @@ typedef struct hb_audio_s hb_audio_t;
 typedef struct hb_audio_config_s hb_audio_config_t;
 typedef struct hb_subtitle_s hb_subtitle_t;
 typedef struct hb_subtitle_config_s hb_subtitle_config_t;
+typedef struct hb_attachment_s hb_attachment_t;
 typedef struct hb_metadata_s hb_metadata_t;
 typedef struct hb_state_s hb_state_t;
 typedef union  hb_esconfig_u     hb_esconfig_t;
@@ -101,10 +103,12 @@ void hb_audio_config_init(hb_audio_config_t * audiocfg);
 int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg);
 hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i);
 
+hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src);
 int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track);
 int hb_srt_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, 
                const char *lang);
 
+hb_attachment_t *hb_attachment_copy(const hb_attachment_t *src);
 
 struct hb_rate_s
 {
@@ -125,7 +129,9 @@ struct hb_subtitle_config_s
     enum subdest { RENDERSUB, PASSTHRUSUB } dest;
     int  force;
     int  default_track; 
-    char src_filename[128];
+    
+    /* SRT subtitle tracks only */
+    char src_filename[256];
     char src_codeset[40];
     int64_t offset;
 };
@@ -139,11 +145,16 @@ extern int          hb_audio_rates_count;
 extern int          hb_audio_rates_default;
 extern hb_rate_t    hb_audio_bitrates[];
 extern int          hb_audio_bitrates_count;
-extern int          hb_audio_bitrates_default;
 extern hb_mixdown_t hb_audio_mixdowns[];
 extern int          hb_audio_mixdowns_count;
 int hb_mixdown_get_mixdown_from_short_name( const char * short_name );
 const char * hb_mixdown_get_short_name_from_mixdown( int amixdown );
+int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown );
+int hb_get_default_mixdown( uint32_t codec, int layout );
+int hb_find_closest_audio_bitrate(int bitrate);
+void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, int *low, int *high);
+int hb_get_best_audio_bitrate( uint32_t codec, int bitrate, int samplerate, int mixdown);
+int hb_get_default_audio_bitrate( uint32_t codec, int samplerate, int mixdown );
 
 /******************************************************************************
  * hb_job_t: settings to be filled by the UI
@@ -155,6 +166,7 @@ struct hb_job_s
 
     /* Pointer to the title to be ripped */
     hb_title_t    * title;
+    int             feature; // Detected DVD feature title
 
     /* Chapter selection */
     int             chapter_start;
@@ -166,14 +178,14 @@ struct hb_job_s
     /* Picture settings:
          crop:                must be multiples of 2 (top/bottom/left/right)
          deinterlace:         0 or 1
-         width:               must be a multiple of 16
-         height:              must be a multiple of 16
+         width:               must be a multiple of 2
+         height:              must be a multiple of 2
          keep_ratio:          used by UIs
          grayscale:           black and white encoding
          pixel_ratio:         store pixel aspect ratio in the video
          pixel_aspect_width:  numerator for pixel aspect ratio
          pixel_aspect_height: denominator for pixel aspect ratio
-         modulus:             set a number besides 16 for dimensions to be multiples of
+         modulus:             set a number for dimensions to be multiples of
          maxWidth:            keep width below this
          maxHeight:           keep height below this */
     int             crop[4];
@@ -187,15 +199,15 @@ struct hb_job_s
     struct
     {
         int             mode;
-        int             modulus;
         int             itu_par;
         int             par_width;
         int             par_height;
-        int             dar_width;
-        int             dar_height;
+        int             dar_width;  // 0 if normal
+        int             dar_height; // 0 if normal
         int             keep_display_aspect;
     } anamorphic;
-    
+
+    int             modulus;
     int             maxWidth;
     int             maxHeight;
 
@@ -208,7 +220,6 @@ struct hb_job_s
          vrate, vrate_base: output framerate is vrate / vrate_base
          cfr:               0 (vfr), 1 (cfr), 2 (pfr) [see render.c]
          pass:              0, 1 or 2 (or -1 for scan)
-         h264_level:        vestigial boolean to decide if we're encoding for iPod
          x264opts:          string of extra x264 options
          areBframes:        boolean to note if b-frames are included in x264opts */
 #define HB_VCODEC_MASK   0x0000FF
@@ -224,8 +235,6 @@ struct hb_job_s
     int             vfr;
     int             cfr;
     int             pass;
-    int             h264_13;
-    int             h264_level;
     char            *x264opts;
     int             areBframes;
     int             color_matrix;
@@ -233,8 +242,7 @@ struct hb_job_s
     /* List of audio settings. */
     hb_list_t     * list_audio;
 
-    /* Subtitles
-     */
+    /* Subtitles */
     hb_list_t     * list_subtitle;
 
     /* Muxer settings
@@ -242,10 +250,6 @@ struct hb_job_s
          file: file path */
 #define HB_MUX_MASK 0xFF0000
 #define HB_MUX_MP4  0x010000
-#define HB_MUX_PSP  0x020000
-#define HB_MUX_AVI  0x040000
-#define HB_MUX_OGM  0x080000
-#define HB_MUX_IPOD 0x100000
 #define HB_MUX_MKV  0x200000
 
     int             mux;
@@ -260,7 +264,10 @@ struct hb_job_s
     hb_subtitle_config_t    select_subtitle_config;
 
     int             angle;              // dvd angle to encode
-    int             frame_to_stop;       // declare eof when we hit this frame
+    int             frame_to_start;     // declare eof when we hit this frame
+    int64_t         pts_to_start;       // drop frames until  we pass this pts 
+                                        //  in the time-linearized input stream
+    int             frame_to_stop;      // declare eof when we hit this frame
     int64_t         pts_to_stop;        // declare eof when we pass this pts in
                                         //  the time-linearized input stream
     int             start_at_preview;   // if non-zero, encoding will start
@@ -287,7 +294,6 @@ struct hb_job_s
     hb_fifo_t     * fifo_mpeg4;   /* MPEG-4 video ES */
 
     hb_thread_t   * reader;
-    hb_thread_t   * muxer;
 
     hb_list_t     * list_work;
 
@@ -299,16 +305,21 @@ struct hb_job_s
 
 /* Audio starts here */
 /* Audio Codecs */
-#define HB_ACODEC_MASK   0x00FF00
-#define HB_ACODEC_FAAC   0x000100
-#define HB_ACODEC_LAME   0x000200
-#define HB_ACODEC_VORBIS 0x000400
-#define HB_ACODEC_AC3    0x000800
-#define HB_ACODEC_MPGA   0x001000
-#define HB_ACODEC_LPCM   0x002000
-#define HB_ACODEC_DCA    0x004000
-#define HB_ACODEC_FFMPEG 0x008000
-#define HB_ACODEC_CA_AAC 0x010000
+#define HB_ACODEC_MASK      0x000FFF00
+#define HB_ACODEC_FAAC      0x00000100
+#define HB_ACODEC_LAME      0x00000200
+#define HB_ACODEC_VORBIS    0x00000400
+#define HB_ACODEC_AC3       0x00000800
+#define HB_ACODEC_MPGA      0x00001000
+#define HB_ACODEC_LPCM      0x00002000
+#define HB_ACODEC_DCA       0x00004000
+#define HB_ACODEC_FFMPEG    0x00008000
+#define HB_ACODEC_CA_AAC    0x00010000
+#define HB_ACODEC_PASS_FLAG 0x40000000
+#define HB_ACODEC_PASS_MASK (HB_ACODEC_AC3 | HB_ACODEC_DCA)
+#define HB_ACODEC_AC3_PASS  (HB_ACODEC_AC3 | HB_ACODEC_PASS_FLAG)
+#define HB_ACODEC_DCA_PASS  (HB_ACODEC_DCA | HB_ACODEC_PASS_FLAG)
+#define HB_ACODEC_ANY       (HB_ACODEC_MASK | HB_ACODEC_PASS_FLAG)
 
 /* Audio Mixdown */
 /* define some masks, used to extract the various information from the HB_AMIXDOWN_XXXX values */
@@ -359,6 +370,7 @@ struct hb_job_s
 #define HB_INPUT_CH_LAYOUT_2F2R    0x0722022
 #define HB_INPUT_CH_LAYOUT_3F2R    0x0832032
 #define HB_INPUT_CH_LAYOUT_4F2R    0x0942042
+#define HB_INPUT_CH_LAYOUT_3F4R    0x0a34034
 #define HB_INPUT_CH_LAYOUT_HAS_LFE 0x0000100
 /* define some macros to extract the various information from the HB_AMIXDOWN_XXXX values */
 #define HB_INPUT_CH_LAYOUT_GET_DISCRETE_FRONT_COUNT( a ) ( ( a & HB_INPUT_CH_LAYOUT_DISCRETE_FRONT_MASK ) >> 16 )
@@ -390,6 +402,7 @@ struct hb_audio_config_s
     {
         int track;                /* Input track number */
         PRIVATE uint32_t codec;   /* Input audio codec */
+        PRIVATE uint32_t stream_type; /* stream type from source stream */
         PRIVATE uint32_t codec_param; /* per-codec config info */
         PRIVATE uint32_t version; /* Bitsream version */
         PRIVATE uint32_t mode;    /* Bitstream mode, codec dependent encoding */
@@ -433,6 +446,7 @@ struct hb_audio_s
 
         hb_esconfig_t config;
         hb_mux_data_t * mux_data;
+        hb_fifo_t     * scan_cache;
     } priv;
 };
 #endif
@@ -444,9 +458,9 @@ struct hb_chapter_s
     int      pgn;
     int      cell_start;
     int      cell_end;
-    int      block_start;
-    int      block_end;
-    int      block_count;
+    uint64_t block_start;
+    uint64_t block_end;
+    uint64_t block_count;
 
     /* Visual-friendly duration */
     int      hours;
@@ -460,6 +474,34 @@ struct hb_chapter_s
     char     title[1024];
 };
 
+/*
+ * A subtitle track.
+ * 
+ * Required fields when a demuxer creates a subtitle track are:
+ * > id
+ *     - ID of this track
+ *     - must be unique for all tracks within a single job,
+ *       since it is used to look up the appropriate in-FIFO with GetFifoForId()
+ * > format
+ *     - format of the packets the subtitle decoder work-object sends to sub->fifo_raw
+ *     - for passthru subtitles, is also the format of the final packets sent to sub->fifo_out
+ *     - PICTURESUB for banded 8-bit YAUV pixels; see decvobsub.c documentation for more info
+ *     - TEXTSUB for UTF-8 text marked up with <b>, <i>, or <u>
+ *     - read by the muxers, and by the subtitle burn-in logic in the hb_sync_video work-object
+ * > source
+ *     - used to create the appropriate subtitle decoder work-object in do_job()
+ * > config.dest
+ *     - whether to render the subtitle on the video track (RENDERSUB) or 
+ *       to pass it through its own subtitle track in the output container (PASSTHRUSUB)
+ *     - all newly created non-VOBSUB tracks should default to PASSTHRUSUB
+ *     - all newly created VOBSUB tracks should default to RENDERSUB, for legacy compatibility
+ * > lang
+ *     - user-readable description of the subtitle track
+ *     - may correspond to the language of the track (see the 'iso639_2' field)
+ *     - may correspond to the type of track (see the 'type' field; ex: "Closed Captions")
+ * > iso639_2
+ *     - language code for the subtitle, or "und" if unknown
+ */
 struct hb_subtitle_s
 {
     int  id;
@@ -468,10 +510,20 @@ struct hb_subtitle_s
     hb_subtitle_config_t config;
 
     enum subtype { PICTURESUB, TEXTSUB } format;
-    enum subsource { VOBSUB, SRTSUB, CC608SUB, CC708SUB } source;
+    enum subsource { VOBSUB, SRTSUB, CC608SUB, /*unused*/CC708SUB, UTF8SUB, TX3GSUB, SSASUB } source;
     char lang[1024];
     char iso639_2[4];
     uint8_t type; /* Closed Caption, Childrens, Directors etc */
+    
+    // Color lookup table for VOB subtitle tracks. Each entry is in YCbCr format.
+    // Must be filled out by the demuxer for VOB subtitle tracks.
+    uint32_t    palette[16];
+    int         width;
+    int         height;
+    
+    // Codec private data for subtitles originating from FFMPEG sources
+    uint8_t *   extradata;
+    int         extradata_size;
 
     int hits;     /* How many hits/occurrences of this subtitle */
     int forced_hits; /* How many forced hits in this subtitle */
@@ -486,6 +538,19 @@ struct hb_subtitle_s
 #endif
 };
 
+/*
+ * An attachment.
+ * 
+ * These are usually used for attaching embedded fonts to movies containing SSA subtitles.
+ */
+struct hb_attachment_s
+{
+    enum attachtype { FONT_TTF_ATTACH } type;
+    char *  name;
+    char *  data;
+    int     size;
+};
+
 struct hb_metadata_s 
 {
     char  name[255];
@@ -501,16 +566,18 @@ struct hb_metadata_s
 
 struct hb_title_s
 {
-    char        dvd[1024];
+    enum { HB_DVD_TYPE, HB_BD_TYPE, HB_STREAM_TYPE } type;
+    uint32_t    reg_desc;
+    char        path[1024];
     char        name[1024];
     int         index;
     int         vts;
     int         ttn;
     int         cell_start;
     int         cell_end;
-    int         block_start;
-    int         block_end;
-    int         block_count;
+    uint64_t    block_start;
+    uint64_t    block_end;
+    uint64_t    block_count;
     int         angle_count;
 
     /* Visual-friendly duration */
@@ -532,21 +599,22 @@ struct hb_title_s
     int         crop[4];
     enum { HB_MPEG2_PS_DEMUXER = 0, HB_MPEG2_TS_DEMUXER, HB_NULL_DEMUXER } demuxer;
     int         detected_interlacing;
+    int         pcr_pid;                /* PCR PID for TS streams */
     int         video_id;               /* demuxer stream id for video */
     int         video_codec;            /* worker object id of video codec */
+    uint32_t    video_stream_type;      /* stream type from source stream */
     int         video_codec_param;      /* codec specific config */
     const char  *video_codec_name;
     int         video_bitrate;
     const char  *container_name;
     int         data_rate;
 
-    uint32_t    palette[16];
-
     hb_metadata_t *metadata;
 
     hb_list_t * list_chapter;
     hb_list_t * list_audio;
     hb_list_t * list_subtitle;
+    hb_list_t * list_attachment;
 
     /* Job template for this title */
     hb_job_t  * job;
@@ -566,6 +634,7 @@ struct hb_state_s
 #define HB_STATE_PAUSED   16
 #define HB_STATE_WORKDONE 32
 #define HB_STATE_MUXING   64
+#define HB_STATE_SEARCHING 128
     int state;
 
     union
@@ -679,12 +748,16 @@ struct hb_work_object_s
 #endif
 };
 
-extern hb_work_object_t hb_sync;
+extern hb_work_object_t hb_sync_video;
+extern hb_work_object_t hb_sync_audio;
 extern hb_work_object_t hb_decmpeg2;
 extern hb_work_object_t hb_decvobsub;
 extern hb_work_object_t hb_encvobsub;
 extern hb_work_object_t hb_deccc608;
 extern hb_work_object_t hb_decsrtsub;
+extern hb_work_object_t hb_decutf8sub;
+extern hb_work_object_t hb_dectx3gsub;
+extern hb_work_object_t hb_decssasub;
 extern hb_work_object_t hb_render;
 extern hb_work_object_t hb_encavcodec;
 extern hb_work_object_t hb_encx264;
@@ -699,7 +772,9 @@ extern hb_work_object_t hb_declpcm;
 extern hb_work_object_t hb_encfaac;
 extern hb_work_object_t hb_enclame;
 extern hb_work_object_t hb_encvorbis;
+extern hb_work_object_t hb_muxer;
 extern hb_work_object_t hb_encca_aac;
+extern hb_work_object_t hb_encac3;
 
 #define FILTER_OK      0
 #define FILTER_DELAY   1
@@ -725,14 +800,29 @@ struct hb_filter_object_s
 #endif
 };
 
+#define HB_FILTER_DETELECINE    1
+#define HB_FILTER_DEINTERLACE   2
+#define HB_FILTER_DEBLOCK       3
+#define HB_FILTER_DENOISE       4
+#define HB_FILTER_DECOMB        5
+#define HB_FILTER_ROTATE        6
+
 extern hb_filter_object_t hb_filter_detelecine;
 extern hb_filter_object_t hb_filter_deinterlace;
 extern hb_filter_object_t hb_filter_deblock;
 extern hb_filter_object_t hb_filter_denoise;
 extern hb_filter_object_t hb_filter_decomb;
+extern hb_filter_object_t hb_filter_rotate;
 
 typedef void hb_error_handler_t( const char *errmsg );
 
 extern void hb_register_error_handler( hb_error_handler_t * handler );
 
+char * hb_strdup_printf( char * fmt, ... );
+
+int hb_yuv2rgb(int yuv);
+int hb_rgb2yuv(int rgb);
+
+const char * hb_subsource_name( int source );
+
 #endif
index db3b56f..0958a91 100644 (file)
@@ -97,13 +97,13 @@ static int deca52Init( hb_work_object_t * w, hb_job_t * job )
     pv->list      = hb_list_init();
     pv->state     = a52_init( 0 );
 
-       /* Decide what format we want out of a52dec
-       work.c has already done some of this deduction for us in do_job() */
+    /* Decide what format we want out of a52dec
+    work.c has already done some of this deduction for us in do_job() */
 
-       pv->flags_out = HB_AMIXDOWN_GET_A52_FORMAT(audio->config.out.mixdown);
+    pv->flags_out = HB_AMIXDOWN_GET_A52_FORMAT(audio->config.out.mixdown);
 
-       /* pass the number of channels used into the private work data */
-       /* will only be actually used if we're not doing AC3 passthru */
+    /* pass the number of channels used into the private work data */
+    /* will only be actually used if we're not doing AC3 passthru */
     pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
 
     pv->level     = 32768.0;
@@ -259,7 +259,7 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
     double frame_dur = (6. * 256. * 90000.) / pv->rate;
 
     /* AC3 passthrough: don't decode the AC3 frame */
-    if( audio->config.out.codec == HB_ACODEC_AC3 )
+    if( audio->config.out.codec == HB_ACODEC_AC3_PASS )
     {
         buf = hb_buffer_init( size );
         memcpy( buf->data, pv->frame, size );
@@ -304,10 +304,10 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
         /* Interleave */
         for( j = 0; j < 256; j++ )
         {
-                       for ( k = 0; k < pv->out_discrete_channels; k++ )
-                       {
-                               samples_out[(pv->out_discrete_channels*j)+k]   = samples_in[(256*k)+j];
-                       }
+            for ( k = 0; k < pv->out_discrete_channels; k++ )
+            {
+                samples_out[(pv->out_discrete_channels*j)+k]   = samples_in[(256*k)+j];
+            }
         }
 
     }
index 9d1474b..ecb1d3c 100644 (file)
@@ -61,6 +61,7 @@
 
 #include "hb.h"
 #include "hbffmpeg.h"
+#include "downmix.h"
 #include "libavcodec/audioconvert.h"
 
 static int  decavcodecInit( hb_work_object_t *, hb_job_t * );
@@ -108,8 +109,16 @@ struct hb_work_private_s
     pts_heap_t      pts_heap;
     void*           buffer;
     struct SwsContext *sws_context; // if we have to rescale or convert color space
+    hb_downmix_t    *downmix;
+    hb_sample_t     *downmix_buffer;
+    int cadence[12];
+    hb_chan_map_t   *out_map;
 };
 
+static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *data, int size );
+static hb_buffer_t *link_buf_list( hb_work_private_t *pv );
+
+
 static int64_t heap_pop( pts_heap_t *heap )
 {
     int64_t result;
@@ -183,6 +192,7 @@ static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
     w->private_data = pv;
 
     pv->job   = job;
+    pv->list  = hb_list_init();
 
     int codec_id = w->codec_param;
     /*XXX*/
@@ -195,6 +205,27 @@ static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
     pv->context = avcodec_alloc_context();
     hb_avcodec_open( pv->context, codec );
 
+    if ( w->audio != NULL )
+    {
+        if ( w->audio->config.out.codec == HB_ACODEC_AC3 )
+        {
+            // ffmpegs audio encoder expect an smpte chan map as input.
+            // So we need to map the decoders output to smpte.
+            pv->out_map = &hb_smpte_chan_map;
+        }
+        else
+        {
+            pv->out_map = &hb_qt_chan_map;
+        }
+        if ( hb_need_downmix( w->audio->config.in.channel_layout, 
+                              w->audio->config.out.mixdown) )
+        {
+            pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout, 
+                                          w->audio->config.out.mixdown);
+            hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, pv->out_map );
+        }
+    }
+
     return 0;
 }
 
@@ -236,6 +267,15 @@ static void decavcodecClose( hb_work_object_t * w )
             av_free( pv->buffer );
             pv->buffer = NULL;
         }
+        if ( pv->downmix )
+        {
+            hb_downmix_close( &(pv->downmix) );
+        }
+        if ( pv->downmix_buffer )
+        {
+            free( pv->downmix_buffer );
+            pv->downmix_buffer = NULL;
+        }
         free( pv );
         w->private_data = NULL;
     }
@@ -250,17 +290,12 @@ static int decavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                     hb_buffer_t ** buf_out )
 {
     hb_work_private_t * pv = w->private_data;
-    hb_buffer_t * in = *buf_in, * buf, * last = NULL;
-    int   pos, len, out_size, i, uncompressed_len;
-    short* bufaligned;
-    uint64_t cur;
-    unsigned char *parser_output_buffer;
-    int parser_output_buffer_len;
+    hb_buffer_t * in = *buf_in;
 
-    if ( (*buf_in)->size <= 0 )
+    if ( in->size <= 0 )
     {
         /* EOF on input stream - send it downstream & say that we're done */
-        *buf_out = *buf_in;
+        *buf_out = in;
         *buf_in = NULL;
         return HB_WORK_DONE;
     }
@@ -273,75 +308,48 @@ static int decavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
         return HB_WORK_OK;
     }
 
-    cur = ( in->start < 0 )? pv->pts_next : in->start;
+    // if the packet has a timestamp use it 
+    if ( in->start != -1 )
+    {
+        pv->pts_next = in->start;
+    }
 
-    bufaligned = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
-    pos = 0;
-    while( pos < in->size )
+    int pos, len;
+    for ( pos = 0; pos < in->size; pos += len )
     {
-        len = av_parser_parse2( pv->parser, pv->context,
-                                &parser_output_buffer, &parser_output_buffer_len,
-                                in->data + pos, in->size - pos, cur, cur, AV_NOPTS_VALUE );
-        out_size = 0;
-        uncompressed_len = 0;
-        if (parser_output_buffer_len)
-        {
-            AVPacket avp;
-            av_init_packet( &avp );
-            avp.data = parser_output_buffer;
-            avp.size = parser_output_buffer_len;
+        uint8_t *parser_output_buffer;
+        int parser_output_buffer_len;
+        int64_t cur = pv->pts_next;
 
-            out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
-            uncompressed_len = avcodec_decode_audio3( pv->context, bufaligned, &out_size, &avp );
+        if ( pv->parser != NULL )
+        {
+            len = av_parser_parse2( pv->parser, pv->context,
+                    &parser_output_buffer, &parser_output_buffer_len,
+                    in->data + pos, in->size - pos, cur, cur, AV_NOPTS_VALUE );
         }
-        if( out_size )
+        else
         {
-            short * s16;
-            float * fl32;
-
-            buf = hb_buffer_init( 2 * out_size );
-
-            int sample_size_in_bytes = 2;   // Default to 2 bytes
-            switch (pv->context->sample_fmt)
-            {
-              case SAMPLE_FMT_S16:
-                sample_size_in_bytes = 2;
-                break;
-              /* We should handle other formats here - but that needs additional format conversion work below */
-              /* For now we'll just report the error and try to carry on */
-              default:
-                hb_log("decavcodecWork - Unknown Sample Format from avcodec_decode_audio (%d) !", pv->context->sample_fmt);
-                break;
-            }
-
-            buf->start = cur;
-            buf->stop  = cur + 90000 * ( out_size / (sample_size_in_bytes * pv->context->channels) ) /
-                         pv->context->sample_rate;
-            cur = buf->stop;
-
-            s16  = bufaligned;
-            fl32 = (float *) buf->data;
-            for( i = 0; i < out_size / 2; i++ )
-            {
-                fl32[i] = s16[i];
-            }
-
-            if( last )
-            {
-                last = last->next = buf;
-            }
-            else
+            parser_output_buffer = in->data;
+            len = parser_output_buffer_len = in->size;
+        }
+        if (parser_output_buffer_len)
+        {
+            // set the duration on every frame since the stream format can
+            // change (it shouldn't but there's no way to guarantee it).
+            // duration is a scaling factor to go from #bytes in the decoded
+            // frame to frame time (in 90KHz mpeg ticks). 'channels' converts
+            // total samples to per-channel samples. 'sample_rate' converts
+            // per-channel samples to seconds per sample and the 90000
+            // is mpeg ticks per second.
+            if ( pv->context->sample_rate && pv->context->channels )
             {
-                *buf_out = last = buf;
+                pv->duration = 90000. /
+                            (double)( pv->context->sample_rate * pv->context->channels );
             }
+            decodeAudio( w->audio, pv, parser_output_buffer, parser_output_buffer_len );
         }
-
-        pos += len;
     }
-
-    pv->pts_next = cur;
-
-    av_free( bufaligned );
+    *buf_out = link_buf_list( pv );
     return HB_WORK_OK;
 }
 
@@ -364,18 +372,6 @@ static int decavcodecInfo( hb_work_object_t *w, hb_work_info_t *info )
     return 0;
 }
 
-static const int chan2layout[] = {
-    HB_INPUT_CH_LAYOUT_MONO,  // We should allow no audio really.
-    HB_INPUT_CH_LAYOUT_MONO,   
-    HB_INPUT_CH_LAYOUT_STEREO,
-    HB_INPUT_CH_LAYOUT_2F1R,   
-    HB_INPUT_CH_LAYOUT_2F2R,
-    HB_INPUT_CH_LAYOUT_3F2R,   
-    HB_INPUT_CH_LAYOUT_4F2R,
-    HB_INPUT_CH_LAYOUT_STEREO, 
-    HB_INPUT_CH_LAYOUT_STEREO,
-};
-
 static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
                              hb_work_info_t *info )
 {
@@ -408,35 +404,56 @@ static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
     uint8_t *buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
     int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
     unsigned char *pbuffer;
-    int pos = 0, pbuffer_size;
+    int pos, pbuffer_size;
 
-    while ( pos < buf->size )
+    while ( buf && !ret )
     {
-        int len = av_parser_parse2( parser, context, &pbuffer, &pbuffer_size,
-                                    buf->data + pos, buf->size - pos,
-                                    buf->start, buf->start, AV_NOPTS_VALUE );
-        pos += len;
-        if ( pbuffer_size > 0 )
+        pos = 0;
+        while ( pos < buf->size )
         {
-            AVPacket avp;
-            av_init_packet( &avp );
-            avp.data = pbuffer;
-            avp.size = pbuffer_size;
+            int len;
 
-            len = avcodec_decode_audio3( context, (int16_t*)buffer, &out_size, &avp );
-            if ( len > 0 && context->sample_rate > 0 )
+            if (parser != NULL )
             {
-                info->bitrate = context->bit_rate;
-                info->rate = context->sample_rate;
-                info->rate_base = 1;
-                info->channel_layout = chan2layout[context->channels & 7];
-                ret = 1;
-                break;
+                len = av_parser_parse2( parser, context, &pbuffer, 
+                                        &pbuffer_size, buf->data + pos, 
+                                        buf->size - pos, buf->start, 
+                                        buf->start, AV_NOPTS_VALUE );
+            }
+            else
+            {
+                pbuffer = buf->data;
+                len = pbuffer_size = buf->size;
+            }
+            pos += len;
+            if ( pbuffer_size > 0 )
+            {
+                AVPacket avp;
+                av_init_packet( &avp );
+                avp.data = pbuffer;
+                avp.size = pbuffer_size;
+
+                len = avcodec_decode_audio3( context, (int16_t*)buffer, 
+                                             &out_size, &avp );
+                if ( len > 0 && context->sample_rate > 0 )
+                {
+                    info->bitrate = context->bit_rate;
+                    info->rate = context->sample_rate;
+                    info->rate_base = 1;
+                    info->channel_layout = 
+                        hb_ff_layout_xlat(context->channel_layout, 
+                                          context->channels);
+                    ret = 1;
+                    break;
+                }
             }
         }
+        buf = buf->next;
     }
+
     av_free( buffer );
-    av_parser_close( parser );
+    if ( parser != NULL )
+        av_parser_close( parser );
     hb_avcodec_close( context );
     return ret;
 }
@@ -494,10 +511,9 @@ static hb_buffer_t *copy_frame( hb_work_private_t *pv, AVFrame *frame )
 
         if ( ! pv->sws_context )
         {
-            pv->sws_context = sws_getContext( context->width, context->height, context->pix_fmt,
+            pv->sws_context = hb_sws_get_context( context->width, context->height, context->pix_fmt,
                                               w, h, PIX_FMT_YUV420P,
-                                              SWS_LANCZOS|SWS_ACCURATE_RND,
-                                              NULL, NULL, NULL );
+                                              SWS_LANCZOS|SWS_ACCURATE_RND);
         }
         sws_scale( pv->sws_context, frame->data, frame->linesize, 0, h,
                    dstpic.data, dstpic.linesize );
@@ -520,9 +536,22 @@ static int get_frame_buf( AVCodecContext *context, AVFrame *frame )
     return avcodec_default_get_buffer( context, frame );
 }
 
+static int reget_frame_buf( AVCodecContext *context, AVFrame *frame )
+{
+    hb_work_private_t *pv = context->opaque;
+    frame->pts = pv->pts;
+    pv->pts = -1;
+    return avcodec_default_reget_buffer( context, frame );
+}
+
 static void log_chapter( hb_work_private_t *pv, int chap_num, int64_t pts )
 {
-    hb_chapter_t *c = hb_list_item( pv->job->title->list_chapter, chap_num - 1 );
+    hb_chapter_t *c;
+
+    if ( !pv->job )
+        return;
+
+    c = hb_list_item( pv->job->title->list_chapter, chap_num - 1 );
     if ( c && c->title )
     {
         hb_log( "%s: \"%s\" (%d) at frame %u time %"PRId64,
@@ -550,7 +579,99 @@ static void flushDelayQueue( hb_work_private_t *pv )
     }
 }
 
-static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
+#define TOP_FIRST PIC_FLAG_TOP_FIELD_FIRST
+#define PROGRESSIVE PIC_FLAG_PROGRESSIVE_FRAME
+#define REPEAT_FIRST PIC_FLAG_REPEAT_FIRST_FIELD
+#define TB 8
+#define BT 16
+#define BT_PROG 32
+#define BTB_PROG 64
+#define TB_PROG 128
+#define TBT_PROG 256
+
+static void checkCadence( int * cadence, uint16_t flags, int64_t start )
+{
+    /*  Rotate the cadence tracking. */
+    int i = 0;
+    for(i=11; i > 0; i--)
+    {
+        cadence[i] = cadence[i-1];
+    }
+
+    if ( !(flags & PROGRESSIVE) && !(flags & TOP_FIRST) )
+    {
+        /* Not progressive, not top first...
+           That means it's probably bottom
+           first, 2 fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Bottom field first, 2 fields displayed.");
+        cadence[0] = BT;
+    }
+    else if ( !(flags & PROGRESSIVE) && (flags & TOP_FIRST) )
+    {
+        /* Not progressive, top is first,
+           Two fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Top field first, 2 fields displayed.");
+        cadence[0] = TB;
+    }
+    else if ( (flags & PROGRESSIVE) && !(flags & TOP_FIRST) && !( flags & REPEAT_FIRST )  )
+    {
+        /* Progressive, but noting else.
+           That means Bottom first,
+           2 fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Progressive. Bottom field first, 2 fields displayed.");
+        cadence[0] = BT_PROG;
+    }
+    else if ( (flags & PROGRESSIVE) && !(flags & TOP_FIRST) && ( flags & REPEAT_FIRST )  )
+    {
+        /* Progressive, and repeat. .
+           That means Bottom first,
+           3 fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Progressive repeat. Bottom field first, 3 fields displayed.");
+        cadence[0] = BTB_PROG;
+    }
+    else if ( (flags & PROGRESSIVE) && (flags & TOP_FIRST) && !( flags & REPEAT_FIRST )  )
+    {
+        /* Progressive, top first.
+           That means top first,
+           2 fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Progressive. Top field first, 2 fields displayed.");
+        cadence[0] = TB_PROG;
+    }
+    else if ( (flags & PROGRESSIVE) && (flags & TOP_FIRST) && ( flags & REPEAT_FIRST )  )
+    {
+        /* Progressive, top, repeat.
+           That means top first,
+           3 fields displayed.
+        */
+        //hb_log("MPEG2 Flag: Progressive repeat. Top field first, 3 fields displayed.");
+        cadence[0] = TBT_PROG;
+    }
+
+    if ( (cadence[2] <= TB) && (cadence[1] <= TB) && (cadence[0] > TB) && (cadence[11]) )
+        hb_log("%fs: Video -> Film", (float)start / 90000);
+    if ( (cadence[2] > TB) && (cadence[1] <= TB) && (cadence[0] <= TB) && (cadence[11]) )
+        hb_log("%fs: Film -> Video", (float)start / 90000);
+}
+
+/*
+ * Decodes a video frame from the specified raw packet data ('data', 'size', 'sequence').
+ * The output of this function is stored in 'pv->list', which contains a list
+ * of zero or more decoded packets.
+ * 
+ * The returned packets are guaranteed to have their timestamps in the correct order,
+ * even if the original packets decoded by libavcodec have misordered timestamps,
+ * due to the use of 'packed B-frames'.
+ * 
+ * Internally the set of decoded packets may be buffered in 'pv->delayq'
+ * until enough packets have been decoded so that the timestamps can be
+ * correctly rewritten, if this is necessary.
+ */
+static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size, int sequence )
 {
     int got_picture, oldlevel = 0;
     AVFrame frame;
@@ -575,6 +696,8 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
     }
     if( got_picture )
     {
+        uint16_t flags = 0;
+
         // ffmpeg makes it hard to attach a pts to a frame. if the MPEG ES
         // packet had a pts we handed it to av_parser_parse (if the packet had
         // no pts we set it to -1 but before the parse we can't distinguish between
@@ -594,9 +717,13 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
                         (double)pv->context->time_base.den;
             pv->duration = frame_dur;
         }
+        if ( pv->context->ticks_per_frame > 1 )
+        {
+            frame_dur *= 2;
+        }
         if ( frame.repeat_pict )
         {
-            frame_dur += frame.repeat_pict * frame_dur * 0.5;
+            frame_dur += frame.repeat_pict * pv->duration;
         }
         // XXX Unlike every other video decoder, the Raw decoder doesn't
         //     use the standard buffer allocation routines so we never
@@ -615,6 +742,19 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
         }
         pv->pts_next = pts + frame_dur;
 
+        if ( frame.top_field_first )
+        {
+            flags |= PIC_FLAG_TOP_FIELD_FIRST;
+        }
+        if ( !frame.interlaced_frame )
+        {
+            flags |= PIC_FLAG_PROGRESSIVE_FRAME;
+        }
+        if ( frame.repeat_pict )
+        {
+            flags |= PIC_FLAG_REPEAT_FIRST_FIELD;
+        }
+
         hb_buffer_t *buf;
 
         // if we're doing a scan or this content couldn't have been broken
@@ -623,6 +763,20 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
         {
             buf = copy_frame( pv, &frame );
             buf->start = pts;
+            buf->sequence = sequence;
+            buf->flags = flags;
+            if ( pv->new_chap && buf->start >= pv->chap_time )
+            {
+                buf->new_chap = pv->new_chap;
+                pv->new_chap = 0;
+                pv->chap_time = 0;
+                log_chapter( pv, buf->new_chap, buf->start );
+            }
+            else if ( pv->nframes == 0 && pv->job )
+            {
+                log_chapter( pv, pv->job->chapter_start, buf->start );
+            }
+            checkCadence( pv->cadence, buf->flags, buf->start );
             hb_list_add( pv->list, buf );
             ++pv->nframes;
             return got_picture;
@@ -662,15 +816,19 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
                 pv->chap_time = 0;
                 log_chapter( pv, buf->new_chap, buf->start );
             }
-            else if ( pv->nframes == 0 )
+            else if ( pv->nframes == 0 && pv->job )
             {
                 log_chapter( pv, pv->job->chapter_start, buf->start );
             }
+            checkCadence( pv->cadence, buf->flags, buf->start );
             hb_list_add( pv->list, buf );
         }
 
         // add the new frame to the delayq & push its timestamp on the heap
-        pv->delayq[slot] = copy_frame( pv, &frame );
+        buf = copy_frame( pv, &frame );
+        buf->sequence = sequence;
+        buf->flags = flags;
+        pv->delayq[slot] = buf;
         heap_push( &pv->pts_heap, pts );
 
         ++pv->nframes;
@@ -679,7 +837,7 @@ static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
     return got_picture;
 }
 
-static void decodeVideo( hb_work_private_t *pv, uint8_t *data, int size,
+static void decodeVideo( hb_work_private_t *pv, uint8_t *data, int size, int sequence,
                          int64_t pts, int64_t dts )
 {
     /*
@@ -693,26 +851,30 @@ static void decodeVideo( hb_work_private_t *pv, uint8_t *data, int size,
         uint8_t *pout;
         int pout_len;
         int len = av_parser_parse2( pv->parser, pv->context, &pout, &pout_len,
-                                    data + pos, size - pos, pts, dts, AV_NOPTS_VALUE );
+                                    data + pos, size - pos, pts, dts, 0 );
         pos += len;
 
         if ( pout_len > 0 )
         {
             pv->pts = pv->parser->pts;
-            decodeFrame( pv, pout, pout_len );
+            decodeFrame( pv, pout, pout_len, sequence );
         }
     } while ( pos < size );
 
     /* the stuff above flushed the parser, now flush the decoder */
     if ( size <= 0 )
     {
-        while ( decodeFrame( pv, NULL, 0 ) )
+        while ( decodeFrame( pv, NULL, 0, sequence ) )
         {
         }
         flushDelayQueue( pv );
     }
 }
 
+/*
+ * Removes all packets from 'pv->list', links them together into
+ * a linked-list, and returns the first packet in the list.
+ */
 static hb_buffer_t *link_buf_list( hb_work_private_t *pv )
 {
     hb_buffer_t *head = hb_list_item( pv->list, 0 );
@@ -749,6 +911,7 @@ static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
     /* we have to wrap ffmpeg's get_buffer to be able to set the pts (?!) */
     pv->context->opaque = pv;
     pv->context->get_buffer = get_frame_buf;
+    pv->context->reget_buffer = reget_frame_buf;
 
     return 0;
 }
@@ -797,7 +960,7 @@ static int setup_extradata( hb_work_object_t *w, hb_buffer_t *in )
     {
         // we haven't been inflicted with M$ - allocate a little space as
         // a marker and return success.
-        pv->context->extradata_size = 16;
+        pv->context->extradata_size = 0;
         pv->context->extradata = av_malloc(pv->context->extradata_size);
         return 0;
     }
@@ -851,7 +1014,10 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     /* if we got an empty buffer signaling end-of-stream send it downstream */
     if ( in->size == 0 )
     {
-        decodeVideo( pv, in->data, in->size, pts, dts );
+        if ( pv->context->codec != NULL )
+        {
+            decodeVideo( pv, in->data, in->size, in->sequence, pts, dts );
+        }
         hb_list_add( pv->list, in );
         *buf_out = link_buf_list( pv );
         return HB_WORK_DONE;
@@ -859,7 +1025,7 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
 
     // if this is the first frame open the codec (we have to wait for the
     // first frame because of M$ VC1 braindamage).
-    if ( pv->context->extradata_size == 0 )
+    if ( pv->context->extradata == NULL )
     {
         if ( setup_extradata( w, in ) )
         {
@@ -888,7 +1054,7 @@ static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
         pv->new_chap = in->new_chap;
         pv->chap_time = pts >= 0? pts : pv->pts_next;
     }
-    decodeVideo( pv, in->data, in->size, pts, dts );
+    decodeVideo( pv, in->data, in->size, in->sequence, pts, dts );
     hb_buffer_close( &in );
     *buf_out = link_buf_list( pv );
     return HB_WORK_OK;
@@ -918,7 +1084,7 @@ static int decavcodecvInfo( hb_work_object_t *w, hb_work_info_t *info )
             // field rate rather than frame rate so convert back to frames.
             info->rate_base *= context->ticks_per_frame;
         }
-        
+
         info->pixel_aspect_width = context->sample_aspect_ratio.num;
         info->pixel_aspect_height = context->sample_aspect_ratio.den;
 
@@ -929,10 +1095,11 @@ static int decavcodecvInfo( hb_work_object_t *w, hb_work_info_t *info )
         if ( info->pixel_aspect_width == 0 ||
              info->pixel_aspect_height == 0 )
         {
+            // There will not be an ffmpeg stream if the file is TS
             AVStream *st = hb_ffmpeg_avstream( w->codec_param );
-            info->pixel_aspect_width = st->sample_aspect_ratio.num ?
-                                        st->sample_aspect_ratio.num : 1;
-            info->pixel_aspect_height = st->sample_aspect_ratio.den ?
+            info->pixel_aspect_width = st && st->sample_aspect_ratio.num ?
+                                       st->sample_aspect_ratio.num : 1;
+            info->pixel_aspect_height = st && st->sample_aspect_ratio.den ?
                                         st->sample_aspect_ratio.den : 1;
         }
         /* ffmpeg returns the Pixel Aspect Ratio (PAR). Handbrake wants the
@@ -1013,13 +1180,19 @@ static void init_ffmpeg_context( hb_work_object_t *w )
         // Because the time bases are so screwed up, we only take values
         // in the range 8fps - 64fps.
         AVRational tb;
-        if ( st->time_base.num * 64 > st->time_base.den &&
-             st->time_base.den > st->time_base.num * 8 )
+        if ( st->avg_frame_rate.den * 64L > st->avg_frame_rate.num &&
+             st->avg_frame_rate.num > st->avg_frame_rate.den * 8L )
+        {
+            tb.num = st->avg_frame_rate.den;
+            tb.den = st->avg_frame_rate.num;
+        }
+        else if ( st->time_base.num * 64L > st->time_base.den &&
+                  st->time_base.den > st->time_base.num * 8L )
         {
             tb = st->time_base;
         }
-        else if ( st->r_frame_rate.den * 64 > st->r_frame_rate.num &&
-                  st->r_frame_rate.num > st->r_frame_rate.den * 8 )
+        else if ( st->r_frame_rate.den * 64L > st->r_frame_rate.num &&
+                  st->r_frame_rate.num > st->r_frame_rate.den * 8L )
         {
             tb.num = st->r_frame_rate.den;
             tb.den = st->r_frame_rate.num;
@@ -1036,6 +1209,7 @@ static void init_ffmpeg_context( hb_work_object_t *w )
     // we have to wrap ffmpeg's get_buffer to be able to set the pts (?!)
     pv->context->opaque = pv;
     pv->context->get_buffer = get_frame_buf;
+    pv->context->reget_buffer = reget_frame_buf;
 
     // avi, mkv and possibly mp4 containers can contain the M$ VFW packed
     // b-frames abortion that messes up frame ordering and timestamps.
@@ -1072,6 +1246,28 @@ static int decavcodecviInit( hb_work_object_t * w, hb_job_t * job )
     pv->list = hb_list_init();
     pv->pts_next = -1;
     pv->pts = -1;
+
+    if ( w->audio != NULL )
+    {
+        if ( w->audio->config.out.codec == HB_ACODEC_AC3 )
+        {
+            // ffmpegs audio encoder expect an smpte chan map as input.
+            // So we need to map the decoders output to smpte.
+            pv->out_map = &hb_smpte_chan_map;
+        }
+        else
+        {
+            pv->out_map = &hb_qt_chan_map;
+        }
+        if ( hb_need_downmix( w->audio->config.in.channel_layout, 
+                              w->audio->config.out.mixdown) )
+        {
+            pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout, 
+                                          w->audio->config.out.mixdown);
+            hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, pv->out_map );
+        }
+    }
+
     return 0;
 }
 
@@ -1079,10 +1275,6 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                              hb_buffer_t ** buf_out )
 {
     hb_work_private_t *pv = w->private_data;
-    if ( ! pv->context )
-    {
-        init_ffmpeg_context( w );
-    }
     hb_buffer_t *in = *buf_in;
     *buf_in = NULL;
 
@@ -1090,7 +1282,7 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     if ( in->size == 0 )
     {
         /* flush any frames left in the decoder */
-        while ( decodeFrame( pv, NULL, 0 ) )
+        while ( pv->context && decodeFrame( pv, NULL, 0, in->sequence ) )
         {
         }
         flushDelayQueue( pv );
@@ -1099,6 +1291,11 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
         return HB_WORK_DONE;
     }
 
+    if ( ! pv->context )
+    {
+        init_ffmpeg_context( w );
+    }
+
     int64_t pts = in->start;
     if( pts >= 0 )
     {
@@ -1116,7 +1313,7 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
         pv->chap_time = pts >= 0? pts : pv->pts_next;
     }
     prepare_ffmpeg_buffer( in );
-    decodeFrame( pv, in->data, in->size );
+    decodeFrame( pv, in->data, in->size, in->sequence );
     hb_buffer_close( &in );
     *buf_out = link_buf_list( pv );
     return HB_WORK_OK;
@@ -1140,10 +1337,11 @@ static int decavcodecviInfo( hb_work_object_t *w, hb_work_info_t *info )
     return 0;
 }
 
-static void decodeAudio( hb_work_private_t *pv, uint8_t *data, int size )
+static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *data, int size )
 {
     AVCodecContext *context = pv->context;
     int pos = 0;
+    int loop_limit = 256;
 
     while ( pos < size )
     {
@@ -1160,11 +1358,20 @@ static void decodeAudio( hb_work_private_t *pv, uint8_t *data, int size )
         avp.size = size - pos;
 
         int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
+        int nsamples;
         int len = avcodec_decode_audio3( context, buffer, &out_size, &avp );
-        if ( len <= 0 )
+        if ( len < 0 )
         {
             return;
         }
+        if ( len == 0 )
+        {
+            if ( !(loop_limit--) )
+                return;
+        }
+        else
+            loop_limit = 256;
+
         pos += len;
         if( out_size > 0 )
         {
@@ -1179,13 +1386,13 @@ static void decodeAudio( hb_work_private_t *pv, uint8_t *data, int size )
                 //       anything more complicated than a one-for-one format
                 //       conversion we'd probably want to cache the converter
                 //       context in the pv.
-                int isamp = av_get_bits_per_sample_format( context->sample_fmt ) / 8;
+                int isamp = av_get_bits_per_sample_fmt( context->sample_fmt ) / 8;
                 AVAudioConvert *ctx = av_audio_convert_alloc( SAMPLE_FMT_S16, 1,
                                                               context->sample_fmt, 1,
                                                               NULL, 0 );
                 // get output buffer size (in 2-byte samples) then malloc a buffer
-                out_size = ( out_size * 2 ) / isamp;
-                buffer = av_malloc( out_size );
+                nsamples = out_size / isamp;
+                buffer = av_malloc( nsamples * 2 );
 
                 // we're doing straight sample format conversion which behaves as if
                 // there were only one channel.
@@ -1194,26 +1401,54 @@ static void decodeAudio( hb_work_private_t *pv, uint8_t *data, int size )
                 const int istride[6] = { isamp };
                 const int ostride[6] = { 2 };
 
-                av_audio_convert( ctx, obuf, ostride, ibuf, istride, out_size >> 1 );
+                av_audio_convert( ctx, obuf, ostride, ibuf, istride, nsamples );
                 av_audio_convert_free( ctx );
             }
-            hb_buffer_t *buf = hb_buffer_init( 2 * out_size );
+            else
+            {
+                nsamples = out_size / 2;
+            }
 
-            // convert from bytes to total samples
-            out_size >>= 1;
+            hb_buffer_t * buf;
+
+            if ( pv->downmix )
+            {
+                pv->downmix_buffer = realloc(pv->downmix_buffer, nsamples * sizeof(hb_sample_t));
+                
+                int i;
+                for( i = 0; i < nsamples; ++i )
+                {
+                    pv->downmix_buffer[i] = buffer[i];
+                }
+
+                int n_ch_samples = nsamples / context->channels;
+                int channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
+
+                buf = hb_buffer_init( n_ch_samples * channels * sizeof(float) );
+                hb_sample_t *samples = (hb_sample_t *)buf->data;
+                hb_downmix(pv->downmix, samples, pv->downmix_buffer, n_ch_samples);
+            }
+            else
+            {
+                buf = hb_buffer_init( nsamples * sizeof(float) );
+                float *fl32 = (float *)buf->data;
+                int i;
+                for( i = 0; i < nsamples; ++i )
+                {
+                    fl32[i] = buffer[i];
+                }
+                int n_ch_samples = nsamples / context->channels;
+                hb_layout_remap( &hb_smpte_chan_map, pv->out_map,
+                                 audio->config.in.channel_layout, 
+                                 fl32, n_ch_samples );
+            }
 
             double pts = pv->pts_next;
             buf->start = pts;
-            pts += out_size * pv->duration;
+            pts += nsamples * pv->duration;
             buf->stop  = pts;
             pv->pts_next = pts;
 
-            float *fl32 = (float *)buf->data;
-            int i;
-            for( i = 0; i < out_size; ++i )
-            {
-                fl32[i] = buffer[i];
-            }
             hb_list_add( pv->list, buf );
 
             // if we allocated a buffer for sample format conversion, free it
@@ -1266,7 +1501,7 @@ static int decavcodecaiWork( hb_work_object_t *w, hb_buffer_t **buf_in,
         pv->pts_next = in->start;
     }
     prepare_ffmpeg_buffer( in );
-    decodeAudio( pv, in->data, in->size );
+    decodeAudio( w->audio, pv, in->data, in->size );
     *buf_out = link_buf_list( pv );
 
     return HB_WORK_OK;
index 2f13749..b9033e6 100644 (file)
@@ -18,7 +18,7 @@ static int cc_channel = 1;
 static enum output_format write_format = OF_SRT;
 static int sentence_cap = 0;
 static int subs_delay = 0;
-static LLONG screens_to_process = -1;
+static int64_t screens_to_process = -1;
 static int processed_enough = 0;
 static int gui_mode_reports = 0;
 static int norollup = 1;
@@ -27,7 +27,7 @@ static int direct_rollup = 0;
 /*
  * Get the time of the last buffer that we have received.
  */
-static LLONG get_fts(struct s_write *wb)
+static int64_t get_fts(struct s_write *wb)
 {
     return wb->last_pts;
 }
@@ -1414,10 +1414,10 @@ void handle_text_attr (const unsigned char c1, const unsigned char c2, struct s_
     }
 }
 
-void mstotime (LLONG milli, unsigned *hours, unsigned *minutes,
+void mstotime (int64_t milli, unsigned *hours, unsigned *minutes,
                unsigned *seconds, unsigned *ms)
 {
-    // LLONG milli = (LLONG) ((ccblock*1000)/29.97);
+    // int64_t milli = (int64_t) ((ccblock*1000)/29.97);
     *ms=(unsigned) (milli%1000); // milliseconds
     milli=(milli-*ms)/1000;  // Remainder, in seconds
     *seconds = (int) (milli%60);
@@ -1500,7 +1500,7 @@ void write_cc_line_as_transcript (struct eia608_screen *data, struct s_write *wb
         buffer->start = wb->data608->current_visible_start_ms;
         buffer->stop = get_fts(wb);
         memcpy( buffer->data, wb->subline, length + 1 );
-        //hb_log("CC %lld: %s", buffer->stop, wb->subline);
+        //hb_log("CC %"PRId64": %s", buffer->stop, wb->subline);
 
         if (wb->hb_last_buffer) {
             wb->hb_last_buffer->next = buffer;
@@ -1546,7 +1546,7 @@ void write_cc_buffer_to_gui (struct eia608_screen *data, struct s_write *wb)
     unsigned h2,m2,s2,ms2;    
     int i;
 
-    LLONG ms_start= wb->data608->current_visible_start_ms;
+    int64_t ms_start= wb->data608->current_visible_start_ms;
 
     ms_start+=subs_delay;
     if (ms_start<0) // Drop screens that because of subs_delay start too early
@@ -1559,7 +1559,7 @@ void write_cc_buffer_to_gui (struct eia608_screen *data, struct s_write *wb)
             hb_log ("###SUBTITLE#");            
             if (!time_reported)
             {
-                LLONG ms_end = get_fts(wb)+subs_delay;         
+                int64_t ms_end = get_fts(wb)+subs_delay;               
                 mstotime (ms_start,&h1,&m1,&s1,&ms1);
                 mstotime (ms_end-1,&h2,&m2,&s2,&ms2); // -1 To prevent overlapping with next line.
                 // Note, only MM:SS here as we need to save space in the preview window
@@ -1585,14 +1585,14 @@ int write_cc_buffer_as_srt (struct eia608_screen *data, struct s_write *wb)
     unsigned h1,m1,s1,ms1;
     unsigned h2,m2,s2,ms2;
     int wrote_something = 0;
-    LLONG ms_start= wb->data608->current_visible_start_ms;
+    int64_t ms_start= wb->data608->current_visible_start_ms;
     int i;
 
     ms_start+=subs_delay;
     if (ms_start<0) // Drop screens that because of subs_delay start too early
         return 0;
 
-    LLONG ms_end = get_fts(wb)+subs_delay;             
+    int64_t ms_end = get_fts(wb)+subs_delay;           
     mstotime (ms_start,&h1,&m1,&s1,&ms1);
     mstotime (ms_end-1,&h2,&m2,&s2,&ms2); // -1 To prevent overlapping with next line.
     char timeline[128];   
@@ -1675,16 +1675,16 @@ int write_cc_buffer_as_srt (struct eia608_screen *data, struct s_write *wb)
 int write_cc_buffer_as_sami (struct eia608_screen *data, struct s_write *wb)
 {
     int wrote_something=0;
-    LLONG startms = wb->data608->current_visible_start_ms;
+    int64_t startms = wb->data608->current_visible_start_ms;
     int i;
 
     startms+=subs_delay;
     if (startms<0) // Drop screens that because of subs_delay start too early
         return 0; 
 
-    LLONG endms   = get_fts(wb)+subs_delay;
+    int64_t endms   = get_fts(wb)+subs_delay;
     endms--; // To prevent overlapping with next line.
-    sprintf ((char *) str,"<SYNC start=\"%llu\"><P class=\"UNKNOWNCC\">\r\n",startms);
+    sprintf ((char *) str,"<SYNC start=\"%"PRId64"\"><P class=\"UNKNOWNCC\">\r\n",startms);
     if (debug_608 && encoding!=ENC_UNICODE)
     {
         hb_log ("\r%s\n", str);
@@ -1722,7 +1722,7 @@ int write_cc_buffer_as_sami (struct eia608_screen *data, struct s_write *wb)
     wb->enc_buffer_used=encode_line (wb->enc_buffer,(unsigned char *) str);
     fwrite (wb->enc_buffer,wb->enc_buffer_used,1,wb->fh);
     XMLRPC_APPEND(wb->enc_buffer,wb->enc_buffer_used);
-    sprintf ((char *) str,"<SYNC start=\"%llu\"><P class=\"UNKNOWNCC\">&nbsp;</P></SYNC>\r\n\r\n",endms);
+    sprintf ((char *) str,"<SYNC start=\"%"PRId64"\"><P class=\"UNKNOWNCC\">&nbsp;</P></SYNC>\r\n\r\n",endms);
     if (debug_608 && encoding!=ENC_UNICODE)
     {
         hb_log ("\r%s\n", str);
index 1b7b940..c142c2a 100644 (file)
@@ -63,8 +63,6 @@ struct eia608_screen // A CC buffer
     int empty; // Buffer completely empty?     
 };
 
-#define LLONG long long
-
 struct eia608
 {
     struct eia608_screen buffer1;
@@ -73,7 +71,7 @@ struct eia608
     int visible_buffer;
     int srt_counter; // Number of subs currently written
     int screenfuls_counter; // Number of meaningful screenfuls written
-    LLONG current_visible_start_ms; // At what time did the current visible buffer became so?
+    int64_t current_visible_start_ms; // At what time did the current visible buffer became so?
     // unsigned current_visible_start_cc; // At what time did the current visible buffer became so?
     enum cc_modes mode;
     unsigned char last_c1, last_c2;
index 4fe0661..ea4cb56 100644 (file)
@@ -33,7 +33,7 @@ struct hb_work_private_s
 
     hb_list_t   * list;
 
-       int           out_discrete_channels;
+    int           out_discrete_channels;
 
 };
 
@@ -75,13 +75,15 @@ static int decdcaInit( hb_work_object_t * w, hb_job_t * job )
     pv->list      = hb_list_init();
     pv->state     = dca_init( 0 );
 
-       /* Decide what format we want out of libdca
-       work.c has already done some of this deduction for us in do_job() */
+    /* Decide what format we want out of libdca
+    work.c has already done some of this deduction for us in do_job() */
 
-       pv->flags_out = HB_AMIXDOWN_GET_DCA_FORMAT(audio->config.out.mixdown);
+    pv->flags_out = HB_AMIXDOWN_GET_DCA_FORMAT(audio->config.out.mixdown);
+    if ( audio->config.out.codec == HB_ACODEC_LAME )
+        pv->flags_out |= DCA_ADJUST_LEVEL;
 
-       /* pass the number of channels used into the private work data */
-       /* will only be actually used if we're not doing AC3 passthru */
+    /* pass the number of channels used into the private work data */
+    /* will only be actually used if we're not doing AC3 passthru */
     pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
 
     pv->level     = 32768.0;
@@ -229,7 +231,7 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
     double frame_dur = (double)(pv->frame_length & ~0xFF) / (double)pv->rate * 90000.;
 
     /* DCA passthrough: don't decode the DCA frame */
-    if( audio->config.out.codec == HB_ACODEC_DCA )
+    if( audio->config.out.codec == HB_ACODEC_DCA_PASS )
     {
         buf = hb_buffer_init( pv->size );
         memcpy( buf->data, pv->frame, pv->size );
@@ -266,10 +268,10 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
         /* Interleave */
         for( j = 0; j < 256; j++ )
         {
-                       for ( k = 0; k < pv->out_discrete_channels; k++ )
-                       {
-                               samples_out[(pv->out_discrete_channels*j)+k]   = samples_in[(256*k)+j] * 16384;
-                       }
+            for ( k = 0; k < pv->out_discrete_channels; k++ )
+            {
+                samples_out[(pv->out_discrete_channels*j)+k]   = samples_in[(256*k)+j] * 16384;
+            }
         }
 
     }
index 50a5a12..f47fe87 100644 (file)
@@ -178,8 +178,13 @@ static int declpcmWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
 static hb_buffer_t *Decode( hb_work_object_t *w )
 {
     hb_work_private_t *pv = w->private_data;
-    hb_buffer_t *out = hb_buffer_init( pv->count * sizeof( float ) );
+    hb_buffer_t *out;
  
+    if (pv->count == 0)
+        return NULL;
+
+    out = hb_buffer_init( pv->count * sizeof( float ) );
+
     out->start  = pv->next_pts;
     pv->next_pts += pv->duration;
     out->stop = pv->next_pts;
index e377f8c..bd848a9 100644 (file)
@@ -13,7 +13,7 @@ static void decmp4metadata( hb_title_t *title )
     MP4FileHandle input_file;
     hb_deep_log( 2, "Got an MP4 input, read the metadata");
 
-    input_file = MP4Read( title->dvd, 0 );
+    input_file = MP4Read( title->path, 0 );
 
     if( input_file != MP4_INVALID_FILE_HANDLE )
     { 
index 385a1ae..3beef06 100644 (file)
@@ -41,6 +41,7 @@ typedef struct hb_libmpeg2_s
     int                  height;
     int                  rate;
     double               aspect_ratio;
+    enum PixelFormat     pixfmt;
     int                  got_iframe;        /* set when we get our first iframe */
     int                  look_for_iframe;   /* need an iframe to add chap break */
     int                  look_for_break;    /* need gop start to add chap break */
@@ -246,7 +247,7 @@ static void next_tag( hb_libmpeg2_t *m, hb_buffer_t *buf_es )
     {
         if ( m->tags[m->cur_tag].start < 0 ||
              ( m->got_iframe && m->tags[m->cur_tag].start >= m->first_pts ) )
-            hb_log("mpeg2 tag botch: pts %lld, tag pts %lld buf 0x%p",
+            hb_log("mpeg2 tag botch: pts %"PRId64", tag pts %"PRId64" buf 0x%p",
                    buf_es->start, m->tags[m->cur_tag].start, m->tags[m->cur_tag].cc_buf);
         if ( m->tags[m->cur_tag].cc_buf )
             hb_buffer_close( &m->tags[m->cur_tag].cc_buf );
@@ -256,6 +257,7 @@ static void next_tag( hb_libmpeg2_t *m, hb_buffer_t *buf_es )
 }
 
 static hb_buffer_t *hb_copy_frame( hb_job_t *job, int width, int height,
+                                   enum PixelFormat pixfmt,
                                    uint8_t* y, uint8_t *u, uint8_t *v )
 {
     int dst_w = width, dst_h = height;
@@ -268,22 +270,30 @@ static hb_buffer_t *hb_copy_frame( hb_job_t *job, int width, int height,
     hb_buffer_t *buf  = hb_video_buffer_init( dst_w, dst_h );
     buf->start = -1;
 
-    if ( dst_w != width || dst_h != height )
+    if ( dst_w != width || dst_h != height || pixfmt == PIX_FMT_YUV422P )
     {
         // we're encoding and the frame dimensions don't match the title dimensions -
         // rescale & matte Y, U, V into our output buf.
         AVPicture in, out;
-        avpicture_alloc(&in,  PIX_FMT_YUV420P, width, height );
+        avpicture_alloc(&in,  pixfmt, width, height );
         avpicture_alloc(&out, PIX_FMT_YUV420P, dst_w, dst_h );
 
         int src_wh = width * height;
-        memcpy( in.data[0], y, src_wh );
-        memcpy( in.data[1], u, src_wh >> 2 );
-        memcpy( in.data[2], v, src_wh >> 2 );
-        struct SwsContext *context = sws_getContext( width, height, PIX_FMT_YUV420P,
+        if ( pixfmt == PIX_FMT_YUV422P )
+        {
+            memcpy( in.data[0], y, src_wh );
+            memcpy( in.data[1], u, src_wh >> 1 );
+            memcpy( in.data[2], v, src_wh >> 1 );
+        }
+        else
+        {
+            memcpy( in.data[0], y, src_wh );
+            memcpy( in.data[1], u, src_wh >> 2 );
+            memcpy( in.data[2], v, src_wh >> 2 );
+        }
+        struct SwsContext *context = hb_sws_get_context( width, height, pixfmt,
                                                      dst_w, dst_h, PIX_FMT_YUV420P,
-                                                     SWS_LANCZOS|SWS_ACCURATE_RND,
-                                                     NULL, NULL, NULL );
+                                                     SWS_LANCZOS|SWS_ACCURATE_RND);
         sws_scale( context, in.data, in.linesize, 0, height, out.data, out.linesize );
         sws_freeContext( context );
 
@@ -323,8 +333,8 @@ static hb_buffer_t *hb_copy_frame( hb_job_t *job, int width, int height,
 static int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
                                hb_list_t * list_raw )
 {
-    mpeg2_state_t   state;
-    hb_buffer_t   * buf;
+    mpeg2_state_t    state;
+    hb_buffer_t    * buf;
 
     if ( buf_es->size )
     {
@@ -356,7 +366,7 @@ static int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
             {
                 if (m->tags[m->cur_tag].cc_buf)
                 {
-                    hb_log("mpeg2 tag botch2: pts %lld, tag pts %lld buf 0x%p",
+                    hb_log("mpeg2 tag botch2: pts %"PRId64", tag pts %"PRId64" buf 0x%p",
                            buf_es->start, m->tags[m->cur_tag].start, m->tags[m->cur_tag].cc_buf);
                     hb_buffer_close( &m->tags[m->cur_tag].cc_buf );
                 }
@@ -389,6 +399,15 @@ static int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
                     m->aspect_ratio = ar_numer / ar_denom;
                 }
             }
+            if ( m->info->sequence->width >> 1 == m->info->sequence->chroma_width &&
+                 m->info->sequence->height >> 1 == m->info->sequence->chroma_height )
+            {
+                m->pixfmt = PIX_FMT_YUV420P;
+            }
+            else
+            {
+                m->pixfmt = PIX_FMT_YUV422P;
+            }
         }
         else if( state == STATE_GOP && m->look_for_break)
         {
@@ -413,6 +432,7 @@ static int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
             {
                 buf  = hb_copy_frame( m->job, m->info->sequence->width,
                                       m->info->sequence->height,
+                                      m->pixfmt,
                                       m->info->display_fbuf->buf[0],
                                       m->info->display_fbuf->buf[1],
                                       m->info->display_fbuf->buf[2] );
@@ -485,7 +505,7 @@ static int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es,
                 m->flag = m->info->display_picture->flags;
 
 /*  Uncomment this block to see frame-by-frame picture flags, as the video encodes.
-               hb_log("***** MPEG 2 Picture Info for PTS %lld *****", buf->start);
+               hb_log("***** MPEG 2 Picture Info for PTS %"PRId64" *****", buf->start);
                 if( m->flag & TOP_FIRST )
                     hb_log("MPEG2 Flag: Top field first");
                 if( m->flag & PROGRESSIVE )
index 584a340..0873d4b 100644 (file)
@@ -498,7 +498,7 @@ int check_combing_mask( hb_filter_private_t * pv )
     int block_height    = pv->block_height;
     int block_x, block_y;
     int block_score = 0; int send_to_blend = 0;
-    
+    uint8_t * mask_p;
     int x, y, k;
 
     for( k = 0; k < 1; k++ )
@@ -509,35 +509,37 @@ int check_combing_mask( hb_filter_private_t * pv )
             for( x = 0; x < ( pv->width[k] - block_width ); x = x + block_width )
             {
                 block_score = 0;
+                
                 for( block_y = 0; block_y < block_height; block_y++ )
                 {
+                    int mask_y = y + block_y;
+                    mask_p = &pv->mask[k][mask_y*ref_stride + x];
+                    
                     for( block_x = 0; block_x < block_width; block_x++ )
                     {
-                        int mask_y = y + block_y;
-                        int mask_x = x + block_x;
-                        
                         /* We only want to mark a pixel in a block as combed
-                           if the pixels above and below are as well. Got to
-                           handle the top and bottom lines separately.       */
-                        if( y + block_y == 0 )
+                           if the adjacent pixels are as well. Got to
+                           handle the sides separately.       */
+                        if( (x + block_x) == 0 )
                         {
-                            if( pv->mask[k][mask_y*ref_stride+mask_x    ] == 255 &&
-                                pv->mask[k][mask_y*ref_stride+mask_x + 1] == 255 )
+                            if( mask_p[ 0 ] == 255 &&
+                                mask_p[ 1 ] == 255 )
                                     block_score++;
                         }
-                        else if( y + block_y == pv->height[k] - 1 )
+                        else if( (x + block_x) == (pv->width[k] -1) )
                         {
-                            if( pv->mask[k][mask_y*ref_stride+mask_x - 1] == 255 &&
-                                pv->mask[k][mask_y*ref_stride+mask_x    ] == 255 )
+                            if( mask_p[ -1 ] == 255 &&
+                                mask_p[  0 ] == 255 )
                                     block_score++;
                         }
                         else
                         {
-                            if( pv->mask[k][mask_y*ref_stride+mask_x - 1] == 255 &&
-                                pv->mask[k][mask_y*ref_stride+mask_x    ] == 255 &&
-                                pv->mask[k][mask_y*ref_stride+mask_x + 1] == 255 )
+                            if( mask_p[ -1 ] == 255 &&
+                                mask_p[  0 ] == 255 &&
+                                mask_p[  1 ] == 255 )
                                     block_score++;
-                        } 
+                        }
+                        mask_p++;
                     }
                 }
 
@@ -617,30 +619,23 @@ void detect_combed_segment( hb_filter_private_t * pv, int segment_start, int seg
         for( y =  segment_start; y < segment_stop; y++ )
         {
             /* These are just to make the buffer locations easier to read. */
-            int back_2    = ( y - 2 )*ref_stride ;
-            int back_1    = ( y - 1 )*ref_stride;
-            int current   =         y*ref_stride;
-            int forward_1 = ( y + 1 )*ref_stride;
-            int forward_2 = ( y + 2 )*ref_stride;
+            int up_2    = -2*ref_stride ;
+            int up_1    = -1*ref_stride;
+            int down_1 = ref_stride;
+            int down_2 = 2*ref_stride;
             
             /* We need to examine a column of 5 pixels
                in the prev, cur, and next frames.      */
-            uint8_t previous_frame[5];
-            uint8_t current_frame[5];
-            uint8_t next_frame[5];
+            uint8_t * cur = &pv->ref[1][k][y*ref_stride];
+            uint8_t * prev = &pv->ref[0][k][y*ref_stride];
+            uint8_t * next = &pv->ref[2][k][y*ref_stride];
+            uint8_t * mask = &pv->mask[k][y*ref_stride];
             
             for( x = 0; x < width; x++ )
             {
-                /* Fill up the current frame array with the current pixel values.*/
-                current_frame[0] = pv->ref[1][k][back_2    + x];
-                current_frame[1] = pv->ref[1][k][back_1    + x];
-                current_frame[2] = pv->ref[1][k][current   + x];
-                current_frame[3] = pv->ref[1][k][forward_1 + x];
-                current_frame[4] = pv->ref[1][k][forward_2 + x];
-
-                int up_diff   = current_frame[2] - current_frame[1];
-                int down_diff = current_frame[2] - current_frame[3];
-
+                int up_diff = cur[0] - cur[up_1];
+                int down_diff = cur[0] - cur[down_1];
+                
                 if( ( up_diff >  athresh && down_diff >  athresh ) ||
                     ( up_diff < -athresh && down_diff < -athresh ) )
                 {
@@ -650,24 +645,13 @@ void detect_combed_segment( hb_filter_private_t * pv, int segment_start, int seg
                     if( mthresh > 0 )
                     {
                         /* Make sure there's sufficient motion between frame t-1 to frame t+1. */
-                        previous_frame[0] = pv->ref[0][k][back_2    + x];
-                        previous_frame[1] = pv->ref[0][k][back_1    + x];
-                        previous_frame[2] = pv->ref[0][k][current   + x];
-                        previous_frame[3] = pv->ref[0][k][forward_1 + x];
-                        previous_frame[4] = pv->ref[0][k][forward_2 + x];
-                        next_frame[0]     = pv->ref[2][k][back_2    + x];
-                        next_frame[1]     = pv->ref[2][k][back_1    + x];
-                        next_frame[2]     = pv->ref[2][k][current   + x];
-                        next_frame[3]     = pv->ref[2][k][forward_1 + x];
-                        next_frame[4]     = pv->ref[2][k][forward_2 + x];
-                        
-                        if( abs( previous_frame[2] - current_frame[2] ) > mthresh &&
-                            abs(  current_frame[1] - next_frame[1]    ) > mthresh &&
-                            abs(  current_frame[3] - next_frame[3]    ) > mthresh )
+                        if( abs( prev[0] - cur[0] ) > mthresh &&
+                            abs(  cur[up_1] - next[up_1]    ) > mthresh &&
+                            abs(  cur[down_1] - next[down_1]    ) > mthresh )
                                 motion++;
-                        if( abs(     next_frame[2] - current_frame[2] ) > mthresh &&
-                            abs( previous_frame[1] - current_frame[1] ) > mthresh &&
-                            abs( previous_frame[3] - current_frame[3] ) > mthresh )
+                        if( abs(     next[0] - cur[0] ) > mthresh &&
+                            abs( prev[up_1] - cur[up_1] ) > mthresh &&
+                            abs( prev[down_1] - cur[down_1] ) > mthresh )
                                 motion++;
                     }
                     else
@@ -684,55 +668,64 @@ void detect_combed_segment( hb_filter_private_t * pv, int segment_start, int seg
                         if( spatial_metric == 0 )
                         {
                             /* Simple 32detect style comb detection */
-                            if( ( abs( current_frame[2] - current_frame[4] ) < 10  ) &&
-                                ( abs( current_frame[2] - current_frame[3] ) > 15 ) )
+                            if( ( abs( cur[0] - cur[down_2] ) < 10  ) &&
+                                ( abs( cur[0] - cur[down_1] ) > 15 ) )
                             {
-                                pv->mask[k][y*ref_stride + x] = 255;
+                                mask[0] = 255;
                             }
                             else
                             {
-                                pv->mask[k][y*ref_stride + x] = 0;
+                                mask[0] = 0;
                             }
                         }
                         else if( spatial_metric == 1 )
                         {
                             /* This, for comparison, is what IsCombed uses.
                                It's better, but still noise senstive.      */
-                               int combing = ( current_frame[1] - current_frame[2] ) *
-                                             ( current_frame[3] - current_frame[2] );
+                               int combing = ( cur[up_1] - cur[0] ) *
+                                             ( cur[down_1] - cur[0] );
                                
                                if( combing > athresh_squared )
-                                   pv->mask[k][y*ref_stride + x] = 255; 
+                                   mask[0] = 255; 
                                else
-                                   pv->mask[k][y*ref_stride + x] = 0;
+                                   mask[0] = 0;
                         }
                         else if( spatial_metric == 2 )
                         {
                             /* Tritical's noise-resistant combing scorer.
                                The check is done on a bob+blur convolution. */
-                            int combing = abs( current_frame[0]
-                                             + ( 4 * current_frame[2] )
-                                             + current_frame[4]
-                                             - ( 3 * ( current_frame[1]
-                                                     + current_frame[3] ) ) );
+                            int combing = abs( cur[up_2]
+                                             + ( 4 * cur[0] )
+                                             + cur[down_2]
+                                             - ( 3 * ( cur[up_1]
+                                                     + cur[down_1] ) ) );
 
                             /* If the frame is sufficiently combed,
                                then mark it down on the mask as 255. */
                             if( combing > athresh6 )
-                                pv->mask[k][y*ref_stride + x] = 255; 
+                            {
+                                mask[0] = 255;
+                            }
                             else
-                                pv->mask[k][y*ref_stride + x] = 0;
+                            {
+                                mask[0] = 0;
+                            }
                         }
                     }
                     else
                     {
-                        pv->mask[k][y*ref_stride + x] = 0;
+                        mask[0] = 0;
                     }
                 }
                 else
                 {
-                    pv->mask[k][y*ref_stride + x] = 0;
+                    mask[0] = 0;
                 }
+                
+                cur++;
+                prev++;
+                next++;
+                mask++;
             }
         }
     }
index 7f1602b..daf210d 100644 (file)
@@ -42,6 +42,7 @@ struct hb_work_private_s
     char       utf8_buf[2048];
     int        utf8_pos;
     int        utf8_end;
+    int        utf8_bom_skipped;
     unsigned long current_time;
     unsigned long number_of_entries;
     unsigned long last_entry_number;
@@ -117,6 +118,16 @@ static int utf8_fill( hb_work_private_t * pv )
         pv->utf8_end = q - pv->utf8_buf;
         pv->pos = p - pv->buf;
 
+        if ( !pv->utf8_bom_skipped )
+        {
+            uint8_t *buf = (uint8_t*)pv->utf8_buf;
+            if (buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
+            {
+                pv->utf8_pos = 3;
+            }
+            pv->utf8_bom_skipped = 1;
+        }
+
         if( ( retval == -1 ) && ( errno == EINVAL ) )
         {
             /* Incomplete multibyte sequence, read more data */
@@ -461,8 +472,6 @@ static int decsrtInit( hb_work_object_t * w, hb_job_t * job )
         buffer = hb_buffer_init( 0 );
         hb_fifo_push( w->fifo_in, buffer);
         
-        pv->file = fopen( w->subtitle->config.src_filename, "r" );
-        
         pv->current_state = k_state_potential_new_entry;
         pv->number_of_entries = 0;
         pv->last_entry_number = 0;
diff --git a/libhb/decssasub.c b/libhb/decssasub.c
new file mode 100644 (file)
index 0000000..8d0a999
--- /dev/null
@@ -0,0 +1,630 @@
+/* 
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+/*
+ * Converts SSA subtitles to either:
+ * (1) TEXTSUB format: UTF-8 subtitles with limited HTML-style markup (<b>, <i>, <u>), or
+ * (2) PICTURESUB format, using libass.
+ * 
+ * SSA format references:
+ *   http://www.matroska.org/technical/specs/subtitles/ssa.html
+ *   http://moodub.free.fr/video/ass-specs.doc
+ *   vlc-1.0.4/modules/codec/subtitles/subsass.c:ParseSSAString
+ * 
+ * libass references:
+ *   libass-0.9.9/ass.h
+ *   vlc-1.0.4/modules/codec/libass.c
+ * 
+ * @author David Foster (davidfstr)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "hb.h"
+
+#include <ass/ass.h>
+
+struct hb_work_private_s
+{
+    // If decoding to PICTURESUB format:
+    ASS_Library *ssa;
+    ASS_Renderer *renderer;
+    ASS_Track *ssaTrack;
+    int readOrder;
+};
+
+typedef enum {
+    BOLD        = 0x01,
+    ITALIC      = 0x02,
+    UNDERLINE   = 0x04
+} StyleSet;
+
+// "<b></b>".len + "<i></i>".len + "<u></u>".len
+#define MAX_OVERHEAD_PER_OVERRIDE (7 * 3)
+
+#define SSA_2_HB_TIME(hr,min,sec,centi) \
+    ( 90L * ( hr    * 1000L * 60 * 60 +\
+              min   * 1000L * 60 +\
+              sec   * 1000L +\
+              centi * 10L ) )
+
+static StyleSet ssa_parse_style_override( uint8_t *pos, StyleSet prevStyles )
+{
+    StyleSet nextStyles = prevStyles;
+    for (;;)
+    {
+        // Skip over leading '{' or last '\\'
+        pos++;
+        
+        // Scan for next \code
+        while ( *pos != '\\' && *pos != '}' && *pos != '\0' ) pos++;
+        if ( *pos != '\\' )
+        {
+            // End of style override block
+            break;
+        }
+        
+        // If next chars are \[biu][01], interpret it
+        if ( strchr("biu", pos[1]) && strchr("01", pos[2]) )
+        {
+            StyleSet styleID =
+                pos[1] == 'b' ? BOLD :
+                pos[1] == 'i' ? ITALIC :
+                pos[1] == 'u' ? UNDERLINE : 0;
+            int enabled = (pos[2] == '1');
+            
+            if (enabled)
+            {
+                nextStyles |= styleID;
+            }
+            else
+            {
+                nextStyles &= ~styleID;
+            }
+        }
+    }
+    return nextStyles;
+}
+
+static void ssa_append_html_tags_for_style_change(
+    uint8_t **dst, StyleSet prevStyles, StyleSet nextStyles )
+{
+    #define APPEND(str) { \
+        char *src = str; \
+        while (*src) { *(*dst)++ = *src++; } \
+    }
+
+    // Reverse-order close all previous styles
+    if (prevStyles & UNDERLINE) APPEND("</u>");
+    if (prevStyles & ITALIC)    APPEND("</i>");
+    if (prevStyles & BOLD)      APPEND("</b>");
+    
+    // Forward-order open all next styles
+    if (nextStyles & BOLD)      APPEND("<b>");
+    if (nextStyles & ITALIC)    APPEND("<i>");
+    if (nextStyles & UNDERLINE) APPEND("<u>");
+    
+    #undef APPEND
+}
+
+static hb_buffer_t *ssa_decode_line_to_utf8( uint8_t *in_data, int in_size, int in_sequence );
+static hb_buffer_t *ssa_decode_line_to_picture( hb_work_object_t * w, uint8_t *in_data, int in_size, int in_sequence );
+
+/*
+ * Decodes a single SSA packet to one or more TEXTSUB or PICTURESUB subtitle packets.
+ * 
+ * SSA packet format:
+ * ( Dialogue: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text CR LF ) +
+ *             1      2     3   4     5    6       7       8       9      10
+ */
+static hb_buffer_t *ssa_decode_packet( hb_work_object_t * w, hb_buffer_t *in )
+{
+    // Store NULL after the end of the buffer to make using string processing safe
+    hb_buffer_realloc( in, in->size + 1 );
+    in->data[in->size] = '\0';
+    
+    hb_buffer_t *out_list = NULL;
+    hb_buffer_t **nextPtr = &out_list;
+    
+    const char *EOL = "\r\n";
+    char *curLine, *curLine_parserData;
+    for ( curLine = strtok_r( (char *) in->data, EOL, &curLine_parserData );
+          curLine;
+          curLine = strtok_r( NULL, EOL, &curLine_parserData ) )
+    {
+        // Skip empty lines and spaces between adjacent CR and LF
+        if (curLine[0] == '\0')
+            continue;
+        
+        // Decode an individual SSA line
+        hb_buffer_t *out;
+        if ( w->subtitle->config.dest == PASSTHRUSUB ) {
+            out = ssa_decode_line_to_utf8( (uint8_t *) curLine, strlen( curLine ), in->sequence );
+            if ( out == NULL )
+                continue;
+            
+            // We shouldn't be storing the extra NULL character,
+            // but the MP4 muxer expects this, unfortunately.
+            if ( out->size > 0 && out->data[out->size - 1] != '\0' ) {
+                // NOTE: out->size remains unchanged
+                hb_buffer_realloc( out, out->size + 1 );
+                out->data[out->size] = '\0';
+            }
+            
+            // If the input packet was non-empty, do not pass through
+            // an empty output packet (even if the subtitle was empty),
+            // as this would be interpreted as an end-of-stream
+            if ( in->size > 0 && out->size == 0 ) {
+                hb_buffer_close(&out);
+                continue;
+            }
+        } else if ( w->subtitle->config.dest == RENDERSUB ) {
+            out = ssa_decode_line_to_picture( w, (uint8_t *) curLine, strlen( curLine ), in->sequence );
+            if ( out == NULL )
+                continue;
+        }
+        
+        // Append 'out' to 'out_list'
+        *nextPtr = out;
+        nextPtr = &out->next;
+    }
+
+    // For point-to-point encoding, when the start time of the stream 
+    // may be offset, the timestamps of the subtitles must be offset as well.
+    //
+    // HACK: Here we are making the assumption that, under normal circumstances,
+    //       the output display time of the first output packet is equal to the
+    //       display time of the input packet.
+    //      
+    //       During point-to-point encoding, the display time of the input 
+    //       packet will be offset to compensate.
+    //      
+    //       Therefore we offset all of the output packets by a slip amount 
+    //       such that first output packet's display time aligns with the 
+    //       input packet's display time. This should give the correct time 
+    //       when point-to-point encoding is in effect.
+    if (out_list && out_list->start > in->start)
+    {
+        int64_t slip = out_list->start - in->start;
+        hb_buffer_t *out;
+
+        out = out_list;
+        while (out)
+        {
+            out->start -= slip;
+            out->stop -= slip;
+            out = out->next;
+        }
+    }
+    
+    return out_list;
+}
+
+/*
+ * Parses the start and stop time from the specified SSA packet.
+ * 
+ * Returns true if parsing failed; false otherwise.
+ */
+static int parse_timing_from_ssa_packet( char *in_data, int64_t *in_start, int64_t *in_stop )
+{
+    /*
+     * Parse Start and End fields for timing information
+     */
+    int start_hr, start_min, start_sec, start_centi;
+    int   end_hr,   end_min,   end_sec,   end_centi;
+    int numPartsRead = sscanf( (char *) in_data, "Dialogue: %*128[^,],"
+        "%d:%d:%d.%d,"  // Start
+        "%d:%d:%d.%d,", // End
+        &start_hr, &start_min, &start_sec, &start_centi,
+          &end_hr,   &end_min,   &end_sec,   &end_centi );
+    if ( numPartsRead != 8 )
+        return 1;
+    
+    *in_start = SSA_2_HB_TIME(start_hr, start_min, start_sec, start_centi);
+    *in_stop  = SSA_2_HB_TIME(  end_hr,   end_min,   end_sec,   end_centi);
+    
+    return 0;
+}
+
+static uint8_t *find_field( uint8_t *pos, uint8_t *end, int fieldNum )
+{
+    int curFieldID = 1;
+    while (pos < end)
+    {
+        if ( *pos++ == ',' )
+        {
+            curFieldID++;
+            if ( curFieldID == fieldNum )
+                return pos;
+        }
+    }
+    return NULL;
+}
+
+/*
+ * SSA line format:
+ *   Dialogue: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text '\0'
+ *             1      2     3   4     5    6       7       8       9      10
+ */
+static hb_buffer_t *ssa_decode_line_to_utf8( uint8_t *in_data, int in_size, int in_sequence )
+{
+    uint8_t *pos = in_data;
+    uint8_t *end = in_data + in_size;
+    
+    // Parse values for in->start and in->stop
+    int64_t in_start, in_stop;
+    if ( parse_timing_from_ssa_packet( (char *) in_data, &in_start, &in_stop ) )
+        goto fail;
+    
+    uint8_t *textFieldPos = find_field( pos, end, 10 );
+    if ( textFieldPos == NULL )
+        goto fail;
+    
+    // Count the number of style overrides in the Text field
+    int numStyleOverrides = 0;
+    pos = textFieldPos;
+    while ( pos < end )
+    {
+        if (*pos++ == '{')
+        {
+            numStyleOverrides++;
+        }
+    }
+    
+    int maxOutputSize = (end - textFieldPos) + ((numStyleOverrides + 1) * MAX_OVERHEAD_PER_OVERRIDE);
+    hb_buffer_t *out = hb_buffer_init( maxOutputSize );
+    if ( out == NULL )
+        return NULL;
+    
+    /*
+     * The Text field contains plain text marked up with:
+     * (1) '\n' -> space
+     * (2) '\N' -> newline
+     * (3) curly-brace control codes like '{\k44}' -> HTML tags / strip
+     * 
+     * Perform the above conversions and copy it to the output packet
+     */
+    StyleSet prevStyles = 0;
+    uint8_t *dst = out->data;
+    pos = textFieldPos;
+    while ( pos < end )
+    {
+        if ( pos[0] == '\\' && pos[1] == 'n' )
+        {
+            *dst++ = ' ';
+            pos += 2;
+        }
+        else if ( pos[0] == '\\' && pos[1] == 'N' )
+        {
+            *dst++ = '\n';
+            pos += 2;
+        }
+        else if ( pos[0] == '{' )
+        {
+            // Parse SSA style overrides and append appropriate HTML style tags
+            StyleSet nextStyles = ssa_parse_style_override( pos, prevStyles );
+            ssa_append_html_tags_for_style_change( &dst, prevStyles, nextStyles );
+            prevStyles = nextStyles;
+            
+            // Skip past SSA control code
+            while ( pos < end && *pos != '}' ) pos++;
+            if    ( pos < end && *pos == '}' ) pos++;
+        }
+        else
+        {
+            // Copy raw character
+            *dst++ = *pos++;
+        }
+    }
+    
+    // Append closing HTML style tags
+    ssa_append_html_tags_for_style_change( &dst, prevStyles, 0 );
+    
+    // Trim output buffer to the actual amount of data written
+    out->size = dst - out->data;
+    
+    // Copy metadata from the input packet to the output packet
+    out->start = in_start;
+    out->stop = in_stop;
+    out->sequence = in_sequence;
+    
+    return out;
+    
+fail:
+    hb_log( "decssasub: malformed SSA subtitle packet: %.*s\n", in_size, in_data );
+    return NULL;
+}
+
+/*
+ * SSA line format:
+ *   Dialogue: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text '\0'
+ *             1      2     3   4     5    6       7       8       9      10
+ * 
+ * MKV-SSA packet format:
+ *   ReadOrder,Marked,          Style,Name,MarginL,MarginR,MarginV,Effect,Text '\0'
+ *   1         2                3     4    5       6       7       8      9
+ */
+static hb_buffer_t *ssa_decode_line_to_picture( hb_work_object_t * w, uint8_t *in_data, int in_size, int in_sequence )
+{
+    hb_work_private_t * pv = w->private_data;
+    
+    // Parse values for in->start and in->stop
+    int64_t in_start, in_stop;
+    if ( parse_timing_from_ssa_packet( (char *) in_data, &in_start, &in_stop ) )
+        goto fail;
+    
+    // Convert the SSA packet to MKV-SSA format, which is what libass expects
+    char *mkvIn;
+    int mkvInSize;
+    {
+        char *layerField = malloc( in_size );
+        int numPartsRead = sscanf( (char *) in_data, "Dialogue: %128[^,],", layerField );
+        if ( numPartsRead != 1 )
+            goto fail;
+        
+        char *styleToTextFields = (char *) find_field( in_data, in_data + in_size, 4 );
+        if ( styleToTextFields == NULL ) {
+            free( layerField );
+            goto fail;
+        }
+        
+        mkvIn = malloc( in_size + 1 );
+        mkvIn[0] = '\0';
+        sprintf(mkvIn, "%d", pv->readOrder++);    // ReadOrder: make this up
+        strcat( mkvIn, "," );
+        strcat( mkvIn, layerField );
+        strcat( mkvIn, "," );
+        strcat( mkvIn, (char *) styleToTextFields );
+        
+        mkvInSize = strlen(mkvIn);
+        
+        free( layerField );
+    }
+    
+    // Parse MKV-SSA packet
+    ass_process_chunk( pv->ssaTrack, mkvIn, mkvInSize, in_start / 90, (in_stop - in_start) / 90 );
+    
+    free( mkvIn );
+    
+    // TODO: To support things like karaoke, it won't be sufficient to only generate
+    //       new subtitle pictures when there are subtitle packets. Rather, pictures will
+    //       need to be generated potentially continuously. 
+    //       
+    //       Until "karaoke support" is implemented, make an educated guess about the
+    //       timepoint within the subtitle that should be rendered. I guess the midpoint.
+    int64_t renderTime = ( in_start + in_stop ) / 2; 
+    
+    int changed;
+    ASS_Image *frameList = ass_render_frame( pv->renderer, pv->ssaTrack, renderTime / 90, &changed );
+    if ( !changed || !frameList )
+        return NULL;
+    
+    int numFrames = 0;
+    ASS_Image *curFrame;
+    for (curFrame = frameList; curFrame; curFrame = curFrame->next)
+        numFrames++;
+    
+    hb_buffer_t *outSubpictureList = NULL;
+    hb_buffer_t **outSubpictureListTailPtr = &outSubpictureList;
+    
+    // Generate a PICTURESUB packet from the frames
+    ASS_Image *frame;
+    for (frame = frameList; frame; frame = frame->next) {
+        // Allocate pixmap where drawing will be done
+        uint8_t *rgba = calloc(frame->w * frame->h * 4, 1);
+        
+        unsigned r = (frame->color >> 24) & 0xff;
+        unsigned g = (frame->color >> 16) & 0xff;
+        unsigned b = (frame->color >>  8) & 0xff;
+        unsigned a = (frame->color      ) & 0xff;
+        
+        int x, y;
+        for (y = 0; y < frame->h; y++) {
+            for (x = 0; x < frame->w; x++) {
+                unsigned srcAlphaPrenormalized = frame->bitmap[y*frame->stride + x];
+                unsigned srcAlpha = (255 - a) * srcAlphaPrenormalized / 255;
+                
+                uint8_t *dst = &rgba[(y*frame->w + x) * 4];
+                unsigned oldDstAlpha = dst[3];
+                
+                if (oldDstAlpha == 0) {
+                    // Optimized version
+                    dst[0] = r;
+                    dst[1] = g;
+                    dst[2] = b;
+                    dst[3] = srcAlpha;
+                } else {
+                    dst[3] = 255 - ( 255 - dst[3] ) * ( 255 - srcAlpha ) / 255;
+                    if (dst[3] != 0) {
+                        dst[0] = ( dst[0] * oldDstAlpha * (255-srcAlpha) / 255 + r * srcAlpha ) / dst[3];
+                        dst[1] = ( dst[1] * oldDstAlpha * (255-srcAlpha) / 255 + g * srcAlpha ) / dst[3];
+                        dst[2] = ( dst[2] * oldDstAlpha * (255-srcAlpha) / 255 + b * srcAlpha ) / dst[3];
+                    }
+                }
+            }
+        }
+        
+        // Generate output subpicture (in PICTURESUB format)
+        hb_buffer_t *out = hb_buffer_init(frame->w * frame->h * 4);
+        out->x = frame->dst_x;
+        out->y = frame->dst_y;
+        out->width = frame->w;
+        out->height = frame->h;
+        
+        int i;
+        int numPixels = frame->w * frame->h;
+        for (i = 0; i < numPixels; i++) {
+            uint8_t *srcRgba = &rgba[i * 4];
+            
+            uint8_t *dstY = &out->data[(numPixels * 0) + i];
+            uint8_t *dstA = &out->data[(numPixels * 1) + i];
+            uint8_t *dstU = &out->data[(numPixels * 2) + i];
+            uint8_t *dstV = &out->data[(numPixels * 3) + i];
+            
+            int srcYuv = hb_rgb2yuv((srcRgba[0] << 16) | (srcRgba[1] << 8) | (srcRgba[2] << 0));
+            int srcA = srcRgba[3];
+            
+            *dstY = (srcYuv >> 16) & 0xff;
+            *dstU = (srcYuv >> 8 ) & 0xff;
+            *dstV = (srcYuv >> 0 ) & 0xff;
+            *dstA = srcA / 16;  // HB's max alpha value is 16
+        }
+        
+        free(rgba);
+        
+        *outSubpictureListTailPtr = out;
+        outSubpictureListTailPtr = &out->next_subpicture;
+    }
+    
+    // NOTE: The subpicture list is actually considered a single packet by most other code
+    hb_buffer_t *out = outSubpictureList;
+    
+    // Copy metadata from the input packet to the output packet
+    out->start = in_start;
+    out->stop = in_stop;
+    out->sequence = in_sequence;
+
+    return out;
+    
+fail:
+    hb_log( "decssasub: malformed SSA subtitle packet: %.*s\n", in_size, in_data );
+    return NULL;
+}
+
+static void ssa_log(int level, const char *fmt, va_list args, void *data)
+{
+    if ( level < 5 )      // same as default verbosity when no callback is set
+    {
+        char *msg;
+        if ( vasprintf( &msg, fmt, args ) < 0 )
+        {
+            hb_log( "decssasub: could not report libass message\n" );
+            return;
+        }
+        hb_log( "[ass] %s", msg );  // no need for extra '\n' because libass sends it
+        
+        free( msg );
+    }
+}
+
+static int decssaInit( hb_work_object_t * w, hb_job_t * job )
+{
+    hb_work_private_t * pv;
+
+    pv              = calloc( 1, sizeof( hb_work_private_t ) );
+    w->private_data = pv;
+    
+    if ( w->subtitle->config.dest == RENDERSUB ) {
+        pv->ssa = ass_library_init();
+        if ( !pv->ssa ) {
+            hb_log( "decssasub: libass initialization failed\n" );
+            return 1;
+        }
+        
+        // Redirect libass output to hb_log
+        ass_set_message_cb( pv->ssa, ssa_log, NULL );
+        
+        // Load embedded fonts
+        hb_list_t * list_attachment = job->title->list_attachment;
+        int i;
+        for ( i = 0; i < hb_list_count(list_attachment); i++ )
+        {
+            hb_attachment_t * attachment = hb_list_item( list_attachment, i );
+            
+            if ( attachment->type == FONT_TTF_ATTACH )
+            {
+                ass_add_font(
+                    pv->ssa,
+                    attachment->name,
+                    attachment->data,
+                    attachment->size );
+            }
+        }
+        
+        ass_set_extract_fonts( pv->ssa, 1 );
+        ass_set_style_overrides( pv->ssa, NULL );
+        
+        pv->renderer = ass_renderer_init( pv->ssa );
+        if ( !pv->renderer ) {
+            hb_log( "decssasub: renderer initialization failed\n" );
+            return 1;
+        }
+        
+        ass_set_use_margins( pv->renderer, 0 );
+        ass_set_hinting( pv->renderer, ASS_HINTING_LIGHT );     // VLC 1.0.4 uses this
+        ass_set_font_scale( pv->renderer, 1.0 );
+        ass_set_line_spacing( pv->renderer, 1.0 );
+        
+        // Setup default font family
+        // 
+        // SSA v4.00 requires that "Arial" be the default font
+        const char *font = NULL;
+        const char *family = "Arial";
+        // NOTE: This can sometimes block for several *seconds*.
+        //       It seems that process_fontdata() for some embedded fonts is slow.
+        ass_set_fonts( pv->renderer, font, family, /*haveFontConfig=*/1, NULL, 1 );
+        
+        // Setup track state
+        pv->ssaTrack = ass_new_track( pv->ssa );
+        if ( !pv->ssaTrack ) {
+            hb_log( "decssasub: ssa track initialization failed\n" );
+            return 1;
+        }
+        
+        // NOTE: The codec extradata is expected to be in MKV format
+        ass_process_codec_private( pv->ssaTrack,
+            (char *) w->subtitle->extradata, w->subtitle->extradata_size );
+        
+        int originalWidth = job->title->width;
+        int originalHeight = job->title->height;
+        ass_set_frame_size( pv->renderer, originalWidth, originalHeight);
+        ass_set_aspect_ratio( pv->renderer, /*dar=*/1.0, /*sar=*/1.0 );
+    }
+    
+    return 0;
+}
+
+static int decssaWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                        hb_buffer_t ** buf_out )
+{
+    hb_buffer_t * in = *buf_in;
+    hb_buffer_t * out_list = NULL;
+    
+    if ( in->size > 0 ) {
+        out_list = ssa_decode_packet(w, in);
+    } else {
+        out_list = hb_buffer_init( 0 );
+    }
+    
+    // Dispose the input packet, as it is no longer needed
+    hb_buffer_close(&in);
+    
+    *buf_in = NULL;
+    *buf_out = out_list;
+    return HB_WORK_OK;
+}
+
+static void decssaClose( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+
+    if ( pv->ssaTrack )
+        ass_free_track( pv->ssaTrack );
+    if ( pv->renderer )
+        ass_renderer_done( pv->renderer );
+    if ( pv->ssa )
+        ass_library_done( pv->ssa );
+    
+    free( w->private_data );
+}
+
+hb_work_object_t hb_decssasub =
+{
+    WORK_DECSSASUB,
+    "SSA Subtitle Decoder",
+    decssaInit,
+    decssaWork,
+    decssaClose
+};
diff --git a/libhb/dectx3gsub.c b/libhb/dectx3gsub.c
new file mode 100644 (file)
index 0000000..e466ac5
--- /dev/null
@@ -0,0 +1,247 @@
+/* 
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+/*
+ * Converts TX3G subtitles to UTF-8 subtitles with limited HTML-style markup (<b>, <i>, <u>).
+ * 
+ * TX3G == MPEG 4, Part 17 (ISO/IEC 14496-17) == 3GPP Timed Text (26.245)
+ * A full reference to the format can be found here:
+ * http://www.3gpp.org/ftp/Specs/html-info/26245.htm
+ * 
+ * @author David Foster (davidfstr)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "hb.h"
+
+typedef enum {
+    BOLD        = 0x1,
+    ITALIC      = 0x2,
+    UNDERLINE   = 0x4
+} FaceStyleFlag;
+
+#define NUM_FACE_STYLE_FLAGS 3
+#define MAX_OPEN_TAG_SIZE 3     // "<b>"
+#define MAX_CLOSE_TAG_SIZE 4    // "</b>"
+
+typedef struct {
+    uint16_t startChar;       // NOTE: indices in terms of *character* (not: byte) positions
+    uint16_t endChar;
+    uint16_t fontID;
+    uint8_t faceStyleFlags;   // FaceStyleFlag
+    uint8_t fontSize;
+    uint32_t textColorRGBA;
+} StyleRecord;
+
+// NOTE: None of these macros check for buffer overflow
+#define READ_U8()       *pos;                                                       pos += 1;
+#define READ_U16()      (pos[0] << 8) | pos[1];                                     pos += 2;
+#define READ_U32()      (pos[0] << 24) | (pos[1] << 16) | (pos[2] << 8) | pos[3];   pos += 4;
+#define READ_ARRAY(n)   pos;                                                        pos += n;
+#define SKIP_ARRAY(n)   pos += n;
+
+#define WRITE_CHAR(c)       {dst[0]=c;                                              dst += 1;}
+#define WRITE_START_TAG(c)  {dst[0]='<'; dst[1]=c;   dst[2]='>';                    dst += 3;}
+#define WRITE_END_TAG(c)    {dst[0]='<'; dst[1]='/'; dst[2]=c; dst[3]='>';          dst += 4;}
+
+#define FOURCC(str)    ((((uint32_t) str[0]) << 24) | \
+                        (((uint32_t) str[1]) << 16) | \
+                        (((uint32_t) str[2]) << 8) | \
+                        (((uint32_t) str[3]) << 0))
+#define IS_10xxxxxx(c) ((c & 0xC0) == 0x80)
+
+static hb_buffer_t *tx3g_decode_to_utf8( hb_buffer_t *in )
+{
+    uint8_t *pos = in->data;
+    uint8_t *end = in->data + in->size;
+    
+    uint16_t numStyleRecords = 0;
+    
+    uint8_t *startStyle;
+    uint8_t *endStyle;
+    
+    /*
+     * Parse the packet as a TX3G TextSample.
+     * 
+     * Look for a single StyleBox ('styl') and read all contained StyleRecords.
+     * Ignore all other box types.
+     * 
+     * NOTE: Buffer overflows on read are not checked.
+     */
+    uint16_t textLength = READ_U16();
+    uint8_t *text = READ_ARRAY(textLength);
+    startStyle = calloc( textLength, 1 );
+    endStyle = calloc( textLength, 1 );
+    while ( pos < end ) {
+        /*
+         * Read TextSampleModifierBox
+         */
+        uint32_t size = READ_U32();
+        if ( size == 0 ) {
+            size = pos - end;   // extends to end of packet
+        }
+        if ( size == 1 ) {
+            hb_log( "dectx3gsub: TextSampleModifierBox has unsupported large size" );
+            break;
+        }
+        uint32_t type = READ_U32();
+        if ( type == FOURCC("uuid") ) {
+            hb_log( "dectx3gsub: TextSampleModifierBox has unsupported extended type" );
+            break;
+        }
+        
+        if ( type == FOURCC("styl") ) {
+            // Found a StyleBox. Parse the contained StyleRecords
+            
+            if ( numStyleRecords != 0 ) {
+                hb_log( "dectx3gsub: found additional StyleBoxes on subtitle; skipping" );
+                SKIP_ARRAY(size);
+                continue;
+            }
+            
+            numStyleRecords = READ_U16();
+            
+            int i;
+            for (i=0; i<numStyleRecords; i++) {
+                StyleRecord curRecord;
+                curRecord.startChar         = READ_U16();
+                curRecord.endChar           = READ_U16();
+                curRecord.fontID            = READ_U16();
+                curRecord.faceStyleFlags    = READ_U8();
+                curRecord.fontSize          = READ_U8();
+                curRecord.textColorRGBA     = READ_U32();
+                
+                startStyle[curRecord.startChar] |= curRecord.faceStyleFlags;
+                endStyle[curRecord.endChar]     |= curRecord.faceStyleFlags;
+            }
+        } else {
+            // Found some other kind of TextSampleModifierBox. Skip it.
+            SKIP_ARRAY(size);
+        }
+    }
+    
+    /*
+     * Copy text to output buffer, and add HTML markup for the style records
+     */
+    int maxOutputSize = textLength + (numStyleRecords * NUM_FACE_STYLE_FLAGS * (MAX_OPEN_TAG_SIZE + MAX_CLOSE_TAG_SIZE));
+    hb_buffer_t *out = hb_buffer_init( maxOutputSize );
+    if ( out == NULL )
+        goto fail;
+    uint8_t *dst = out->data;
+    int charIndex = 0;
+    for ( pos = text, end = text + textLength; pos < end; pos++ ) {
+        if (IS_10xxxxxx(*pos)) {
+            // Is a non-first byte of a multi-byte UTF-8 character
+            WRITE_CHAR(*pos);
+            continue;   // ...without incrementing 'charIndex'
+        }
+        
+        uint8_t plusStyles = startStyle[charIndex];
+        uint8_t minusStyles = endStyle[charIndex];
+        
+        if (minusStyles & UNDERLINE)
+            WRITE_END_TAG('u');
+        if (minusStyles & ITALIC)
+            WRITE_END_TAG('i');
+        if (minusStyles & BOLD)
+            WRITE_END_TAG('b');
+        
+        if (plusStyles & BOLD)
+            WRITE_START_TAG('b');
+        if (plusStyles & ITALIC)
+            WRITE_START_TAG('i');
+        if (plusStyles & UNDERLINE)
+            WRITE_START_TAG('u');
+        
+        WRITE_CHAR(*pos);
+        charIndex++;
+    }
+    
+    // Trim output buffer to the actual amount of data written
+    out->size = dst - out->data;
+    
+    // Copy metadata from the input packet to the output packet
+    out->start = in->start;
+    out->stop = in->stop;
+    
+fail:
+    free( startStyle );
+    free( endStyle );
+    
+    return out;
+}
+
+#undef READ_U8
+#undef READ_U16
+#undef READ_U32
+#undef READ_ARRAY
+#undef SKIP_ARRAY
+
+#undef WRITE_CHAR
+#undef WRITE_START_TAG
+#undef WRITE_END_TAG
+
+static int dectx3gInit( hb_work_object_t * w, hb_job_t * job )
+{
+    return 0;
+}
+
+static int dectx3gWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                        hb_buffer_t ** buf_out )
+{
+    hb_buffer_t * in = *buf_in;
+    hb_buffer_t * out = NULL;
+    
+    // Warn if the subtitle's duration has not been passed through by the demuxer,
+    // which will prevent the subtitle from displaying at all
+    if ( in->stop == 0 ) {
+        hb_log( "dectx3gsub: subtitle packet lacks duration" );
+    }
+    
+    if ( in->size > 0 ) {
+        out = tx3g_decode_to_utf8(in);
+    } else {
+        out = hb_buffer_init( 0 );
+    }
+    
+    if ( out != NULL ) {
+        // We shouldn't be storing the extra NULL character,
+        // but the MP4 muxer expects this, unfortunately.
+        if ( out->size > 0 && out->data[out->size - 1] != '\0' ) {
+            // NOTE: out->size remains unchanged
+            hb_buffer_realloc( out, out->size + 1 );
+            out->data[out->size] = '\0';
+        }
+        
+        // If the input packet was non-empty, do not pass through
+        // an empty output packet (even if the subtitle was empty),
+        // as this would be interpreted as an end-of-stream
+        if ( in->size > 0 && out->size == 0 ) {
+            hb_buffer_close(&out);
+        }
+    }
+    
+    // Dispose the input packet, as it is no longer needed
+    hb_buffer_close(&in);
+    
+    *buf_in = NULL;
+    *buf_out = out;
+    return HB_WORK_OK;
+}
+
+static void dectx3gClose( hb_work_object_t * w )
+{
+    // nothing
+}
+
+hb_work_object_t hb_dectx3gsub =
+{
+    WORK_DECTX3GSUB,
+    "TX3G Subtitle Decoder",
+    dectx3gInit,
+    dectx3gWork,
+    dectx3gClose
+};
diff --git a/libhb/decutf8sub.c b/libhb/decutf8sub.c
new file mode 100644 (file)
index 0000000..dcd05d4
--- /dev/null
@@ -0,0 +1,64 @@
+/* 
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+/*
+ * Decoder for UTF-8 subtitles obtained from file input-sources.
+ * 
+ * Input and output packet format is UTF-8 encoded text,
+ * with limited HTML-style markup (only <b>, <i>, and <u>).
+ * 
+ * @author David Foster (davidfstr)
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "hb.h"
+
+static int decutf8Init( hb_work_object_t * w, hb_job_t * job )
+{
+    return 0;
+}
+
+static int decutf8Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                        hb_buffer_t ** buf_out )
+{
+    hb_buffer_t * in = *buf_in;
+    hb_buffer_t * out = NULL;
+
+    // Pass the packets through without modification
+    out = in;
+
+    // Warn if the subtitle's duration has not been passed through by the demuxer,
+    // which will prevent the subtitle from displaying at all
+    if ( out->stop == 0 ) {
+        hb_log( "decutf8sub: subtitle packet lacks duration" );
+    }
+    
+    // We shouldn't be storing the extra NULL character,
+    // but the MP4 muxer expects this, unfortunately.
+    if ( out->size > 0 && out->data[out->size - 1] != '\0' ) {
+        // NOTE: out->size remains unchanged
+        hb_buffer_realloc( out, out->size + 1 );
+        out->data[out->size] = '\0';
+    }
+    
+    *buf_in = NULL;
+    *buf_out = out;
+    return HB_WORK_OK;
+}
+
+static void decutf8Close( hb_work_object_t * w )
+{
+    // nothing
+}
+
+hb_work_object_t hb_decutf8sub =
+{
+    WORK_DECUTF8SUB,
+    "UTF-8 Subtitle Decoder",
+    decutf8Init,
+    decutf8Work,
+    decutf8Close
+};
index c4474f9..fc4a9e2 100644 (file)
@@ -4,6 +4,26 @@
    Homepage: <http://handbrake.fr/>.
    It may be used under the terms of the GNU General Public License. */
 
+/*
+ * Decoder for DVD bitmap subtitles, also known as "VOB subtitles" within the HandBrake source code.
+ * 
+ * Input format of the subtitle packets is described here:
+ *   http://sam.zoy.org/writings/dvd/subtitles/
+ *
+ * An auxiliary input is the color palette lookup table, in 'subtitle->palette'.
+ * The demuxer implementation must fill out this table appropriately.
+ * - In the case of a true DVD input, the palette is read from the IFO file.
+ * - In the case of an MKV file input, the palette is read from the codec private data of the subtitle track.
+ *
+ * Output format of this decoder is PICTURESUB, which is:
+ *   struct PictureSubPacket {
+ *       uint8_t lum[pixelCount];       // Y
+ *       uint8_t alpha[pixelCount];     // alpha (max = 16)
+ *       uint8_t chromaU[pixelCount];   // Cb
+ *       uint8_t chromaV[pixelCount];   // Cr
+ *   }
+ */
+
 #include "hb.h"
 
 struct hb_work_private_s
@@ -42,6 +62,21 @@ int decsubInit( hb_work_object_t * w, hb_job_t * job )
 
     pv->job = job;
     pv->pts = -1;
+    
+    // Warn if the input color palette is empty
+    int paletteEmpty = 1;
+    int i;
+    for (i=0; i<16; i++)
+    {
+        if (w->subtitle->palette[i])
+        {
+            paletteEmpty = 0;
+            break;
+        }
+    }
+    if (paletteEmpty) {
+        hb_log( "decvobsub: input color palette is empty; not demuxed properly?" );
+    }
 
     return 0;
 }
@@ -136,6 +171,10 @@ int decsubWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
 
 void decsubClose( hb_work_object_t * w )
 {
+    hb_work_private_t * pv = w->private_data;
+
+    if ( pv->buf )
+        hb_buffer_close( &pv->buf );
     free( w->private_data );
 }
 
@@ -258,7 +297,7 @@ static void ParseControls( hb_work_object_t * w )
                          * work, but I get the right colours by doing
                          * no conversion.
                          */
-                        uint32_t color = title->palette[colors[j]];
+                        uint32_t color = w->subtitle->palette[colors[j]];
                         uint8_t Cr, Cb, y;
                         y = (color>>16) & 0xff;
                         Cr = (color>>8) & 0xff;
@@ -501,6 +540,7 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
          * When forcing subtitles, ignore all those that don't
          * have the forced flag set.
          */
+        hb_buffer_close( &pv->buf );
         return NULL;
     }
 
@@ -508,7 +548,9 @@ static hb_buffer_t * Decode( hb_work_object_t * w )
     {
         pv->buf->start  = pv->pts_start;
         pv->buf->stop   = pv->pts_stop;
-        return pv->buf;
+        buf = pv->buf;
+        pv->buf = NULL;
+        return buf;
     }
 
     /* Do the actual decoding now */
index afeda30..4185cb5 100644 (file)
@@ -106,6 +106,23 @@ int hb_demux_ps( hb_buffer_t * buf_ps, hb_list_t * list_es, hb_psdemux_t* state
         id           = d[pos];
         pos               += 1;
 
+        /* pack_header */
+        if( id == 0xBA)
+        {
+            pos += 10 + (d[pos+9] & 7);
+            continue;
+        }
+
+        /* system_header */
+        if( id == 0xBB )
+        {
+            int header_length;
+
+            header_length  = ( d[pos] << 8 ) + d[pos+1];
+            pos           += 2 + header_length;
+            continue;
+        }
+
         pes_packet_length  = ( d[pos] << 8 ) + d[pos+1];
         pos               += 2;               /* pes_packet_length */
         pes_packet_end     = pos + pes_packet_length;
@@ -246,6 +263,10 @@ int hb_demux_ts( hb_buffer_t *buf_ps, hb_list_t *list_es, hb_psdemux_t *state )
 
     hb_buffer_t *buf = hb_buffer_init( buf_ps->alloc );
     hb_buffer_swap_copy( buf_ps, buf );
+    if (buf->type == VIDEO_BUF) {
+        // Consume a chapter break
+        buf_ps->new_chap = 0;
+    }
     hb_list_add( list_es, buf );
 
     return 1;
diff --git a/libhb/downmix.c b/libhb/downmix.c
new file mode 100644 (file)
index 0000000..2a441e9
--- /dev/null
@@ -0,0 +1,1608 @@
+/* $Id: downmix.c,v 1.15 2005/03/17 19:22:47 stebbins Exp $
+
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include "common.h"
+#include "downmix.h"
+
+#define LVL_PLUS6DB 2.0
+#define LVL_PLUS3DB 1.4142135623730951
+#define LVL_3DB 0.7071067811865476
+#define LVL_45DB 0.5946035575013605
+#define LVL_6DB 0.5
+
+#define LVL_SQRT_1_4 0.5
+#define LVL_SQRT_3_4 0.866025404
+
+#define HB_CH_FRONT_LEFT             0x00000001
+#define HB_CH_FRONT_RIGHT            0x00000002
+#define HB_CH_FRONT_CENTER           0x00000004
+#define HB_CH_LOW_FREQUENCY          0x00000008
+#define HB_CH_BACK_LEFT              0x00000010
+#define HB_CH_BACK_RIGHT             0x00000020
+#define HB_CH_BACK_CENTER            0x00000040
+#define HB_CH_SIDE_LEFT              0x00000080
+#define HB_CH_SIDE_RIGHT             0x00000100
+
+#define HB_CH_SURROUND_MASK          0x000001f0
+#define HB_CH_MASK                   0x000007ff
+
+#define HB_CH_DOLBY                  0x00000800
+#define HB_CH_DPLII                  0x00001000
+
+#define DOWNMIX_MONO 0
+#define DOWNMIX_STEREO 1
+#define DOWNMIX_3F 2
+#define DOWNMIX_2F1R 3
+#define DOWNMIX_3F1R 4
+#define DOWNMIX_2F2R 5
+#define DOWNMIX_3F2R 6
+#define DOWNMIX_3F4R 7
+#define DOWNMIX_DOLBY 8
+#define DOWNMIX_DPLII 9
+#define DOWNMIX_NUM_MODES 10
+
+#define DOWNMIX_CHANNEL_MASK 0x0f
+
+#define DOWNMIX_LFE_FLAG 0x10
+#define DOWNMIX_FLAGS_MASK 0x10
+
+hb_sample_t downmix_matrix[DOWNMIX_NUM_MODES][DOWNMIX_NUM_MODES][8][8] =
+{
+// MONO in
+{
+    // MONO out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       1, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 1, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 1, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // 2F2R out
+    { { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 1, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // 3F2R out
+    { { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 1, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // 3F4R out
+    { { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 1 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // DOLBY out
+    { { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+},
+// STEREO in
+{
+    // MONO out
+    { { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      {       0, 1, 0, 0, 0, 0, 0, 0 },
+      {       0, 0, 0, 0, 0, 0, 0, 0 },
+      {       0, 0, 0, 0, 0, 0, 0, 0 },
+      {       0, 0, 0, 0, 0, 0, 0, 0 },
+      {       0, 0, 0, 0, 0, 0, 0, 0 },
+      {       0, 0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F2R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F4R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 1 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DOLBY out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+},
+// 3F in
+{
+    // MONO out
+    { { LVL_PLUS3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { 0,           1, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F2R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F4R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 1 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DOLBY out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+},
+// 2F1R in
+{
+    // MONO out
+    { { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { 0,           1, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       1,       0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 0, 1,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       1,       0, 0, 0, 0, 0 },
+      { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       1, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 1, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0,       0,       1, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 } },
+    // 3F2R out
+    { { 0, 1, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 1, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, LVL_3DB, 0, 0, 0 },
+      { 0, 0, 0, 0,       0,       1, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 } },
+    // 3F4R out
+    { { 0, 1, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 1, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, LVL_3DB, LVL_3DB, 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 1 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 } },
+    // DOLBY out
+    { { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+},
+// 3F1R in
+{
+    // MONO out
+    { { LVL_PLUS3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { 0,           1, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1,       1,       0, 0, 0, 0, 0, 0 },
+      { 1,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       1,       0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       0,       0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 1, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 1,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       1,       0, 0, 0, 0, 0 },
+      { 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       1, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       0,       0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 1, 0,       0,       0, 0, 0, 0 },
+      { 1, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 1, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0,       0,       1, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, 0,       0,       0, 0, 0, 0 } },
+    // 3F2R out
+    { { 1, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 1, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 1, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, LVL_3DB, 0, 0, 0 },
+      { 0, 0, 0, 0,       0,       1, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, 0,       0,       0, 0, 0 } },
+    // 3F4R out
+    { { 1, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 1, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 1, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, LVL_3DB, LVL_3DB, 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 1 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 },
+      { 0, 0, 0, 0, 0, 0,       0      , 0 } },
+    // DOLBY out
+    { { LVL_3DB,  LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { LVL_3DB,  LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+},
+// 2F2R in
+{
+    // MONO out
+    { { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { 0,       1, 0, 0, 0, 0, 0, 0 },
+      { 0,       0, 0, 0, 0, 0, 0, 0 },
+      { 0,       0, 0, 0, 0, 0, 0, 0 },
+      { 0,       0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 1, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0, 0,       1, 0, 0, 0, 0 },
+      { 0, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, 0,       0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 0, 1, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 1, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0, 0,       1, 0, 0, 0 },
+      { 0, 0, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, 0,       0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F2R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F4R out
+    { { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 1, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 1 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DOLBY out
+    { { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_6DB, LVL_6DB, 0, 0, 0, 0, 0, 0 },
+      { -LVL_6DB, LVL_6DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { 1,             0,             0, 0, 0, 0, 0, 0 },
+      { 0,             1,             0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_3_4, LVL_SQRT_1_4,  0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_1_4, LVL_SQRT_3_4,  0, 0, 0, 0, 0, 0 },
+      { 0,             0,             1, 0, 0, 0, 0, 0 },
+      { 0,             0,             0, 0, 0, 0, 0, 0 },
+      { 0,             0,             0, 0, 0, 0, 0, 0 },
+      { 0,             0,             0, 0, 0, 0, 0, 0 } },
+},
+// 3F2R in
+{
+    // MONO out
+    { { LVL_PLUS3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { 0,           1, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 },
+      { 0,           0, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 1, 0,       0, 0, 0, 0, 0 },
+      { 1, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 1, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0, 0,       1, 0, 0, 0, 0 },
+      { 0, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, 0,       0, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 1, 0, 0, 0,       0, 0, 0, 0 },
+      { 0, 1, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 1, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0, 0,       1, 0, 0, 0 },
+      { 0, 0, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, 0,       0, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 1, 0, 0, 0, 0, 0, 0 },
+      { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F2R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // 3F4R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 1, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 1 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 0 } },
+    // DOLBY out
+    { { LVL_3DB,  LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        0,       0, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { LVL_3DB,       LVL_3DB,       0, 0, 0, 0, 0, 0 },
+      { 1,             0,             0, 0, 0, 0, 0, 0 },
+      { 0,             1,             0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_3_4, LVL_SQRT_1_4,  0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_1_4, LVL_SQRT_3_4,  0, 0, 0, 0, 0, 0 },
+      { 0,             0,             1, 0, 0, 0, 0, 0 },
+      { 0,             0,             0, 0, 0, 0, 0, 0 },
+      { 0,             0,             0, 0, 0, 0, 0, 0 } },
+},
+// 3F4R in
+{
+    // MONO out
+    { { LVL_PLUS3DB, 0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_6DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_6DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_6DB,     0, 0, 0, 0, 0, 0, 0 },
+      { LVL_6DB,     0, 0, 0, 0, 0, 0, 0 },
+      { 0,           1, 0, 0, 0, 0, 0, 0 } },
+    // STEREO out
+    { { 1,       1,       0, 0, 0, 0, 0, 0 },
+      { 1,       0,       0, 0, 0, 0, 0, 0 },
+      { 0,       1,       0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0,       0, 0, 0, 0, 0, 0 },
+      { 0,       LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { LVL_3DB, 0,       0, 0, 0, 0, 0, 0 },
+      { 0,       LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,       0,       1, 0, 0, 0, 0, 0 } },
+    // 3F out
+    { { 1, 0,       0,       0, 0, 0, 0, 0 },
+      { 0, 1,       0,       0, 0, 0, 0, 0 },
+      { 0, 0,       1,       0, 0, 0, 0, 0 },
+      { 0, LVL_3DB, 0,       0, 0, 0, 0, 0 },
+      { 0, 0,       LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, LVL_3DB, 0,       0, 0, 0, 0, 0 },
+      { 0, 0,       LVL_3DB, 0, 0, 0, 0, 0 },
+      { 0, 0,       0,       1, 0, 0, 0, 0 } },
+    // 2F1R out
+    { { 1, 1, 0,       0, 0, 0, 0, 0 },
+      { 1, 0, 0,       0, 0, 0, 0, 0 },
+      { 0, 1, 0,       0, 0, 0, 0, 0 },
+      { 0, 0, LVL_6DB, 0, 0, 0, 0, 0 },
+      { 0, 0, LVL_6DB, 0, 0, 0, 0, 0 },
+      { 0, 0, LVL_6DB, 0, 0, 0, 0, 0 },
+      { 0, 0, LVL_6DB, 0, 0, 0, 0, 0 },
+      { 0, 0, 0,       1, 0, 0, 0, 0 } },
+    // 3F1R out
+    { { 1, 0, 0, 0,       0, 0, 0, 0 },
+      { 0, 1, 0, 0,       0, 0, 0, 0 },
+      { 0, 0, 1, 0,       0, 0, 0, 0 },
+      { 0, 0, 0, LVL_6DB, 0, 0, 0, 0 },
+      { 0, 0, 0, LVL_6DB, 0, 0, 0, 0 },
+      { 0, 0, 0, LVL_6DB, 0, 0, 0, 0 },
+      { 0, 0, 0, LVL_6DB, 0, 0, 0, 0 },
+      { 0, 0, 0, 0,       1, 0, 0, 0 } },
+    // 2F2R out
+    { { 1, 1, 0,       0,       0, 0, 0, 0 },
+      { 1, 0, 0,       0,       0, 0, 0, 0 },
+      { 0, 1, 0,       0,       0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0,       0, 0, 0, 0 },
+      { 0, 0, 0,       LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, LVL_3DB, 0,       0, 0, 0, 0 },
+      { 0, 0, 0,       LVL_3DB, 0, 0, 0, 0 },
+      { 0, 0, 0,       0,       1, 0, 0, 0 } },
+    // 3F2R out
+    { { 1, 0, 0, 0,       0,       0, 0, 0 },
+      { 0, 1, 0, 0,       0,       0, 0, 0 },
+      { 0, 0, 1, 0,       0,       0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0,       0, 0, 0 },
+      { 0, 0, 0, 0,       LVL_3DB, 0, 0, 0 },
+      { 0, 0, 0, LVL_3DB, 0,       0, 0, 0 },
+      { 0, 0, 0, 0,       LVL_3DB, 0, 0, 0 },
+      { 0, 0, 0, 0,       0,       1, 0, 0 } },
+    // 3F4R out
+    { { 1, 0, 0, 0, 0, 0, 0, 0 },
+      { 0, 1, 0, 0, 0, 0, 0, 0 },
+      { 0, 0, 1, 0, 0, 0, 0, 0 },
+      { 0, 0, 0, 1, 0, 0, 0, 0 },
+      { 0, 0, 0, 0, 1, 0, 0, 0 },
+      { 0, 0, 0, 0, 0, 1, 0, 0 },
+      { 0, 0, 0, 0, 0, 0, 1, 0 },
+      { 0, 0, 0, 0, 0, 0, 0, 1 } },
+    // DOLBY out
+    { { LVL_3DB,  LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 1,        0,       0, 0, 0, 0, 0, 0 },
+      { 0,        1,       0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { -LVL_3DB, LVL_3DB, 0, 0, 0, 0, 0, 0 },
+      { 0,        0,       1, 0, 0, 0, 0, 0 } },
+    // DPLII out
+    { { LVL_3DB,               LVL_3DB,               0, 0, 0, 0, 0, 0 },
+      { 1,                     0,                     0, 0, 0, 0, 0, 0 },
+      { 0,                     1,                     0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_3_4*LVL_3DB, LVL_SQRT_1_4*LVL_3DB,  0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_1_4*LVL_3DB, LVL_SQRT_3_4*LVL_3DB,  0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_3_4*LVL_3DB, LVL_SQRT_1_4*LVL_3DB,  0, 0, 0, 0, 0, 0 },
+      { -LVL_SQRT_1_4*LVL_3DB, LVL_SQRT_3_4*LVL_3DB,  0, 0, 0, 0, 0, 0 },
+      { 0,                     0,                     1, 0, 0, 0, 0, 0 } }
+},
+};
+
+static int channel_layout_map[DOWNMIX_NUM_MODES] =
+{
+    // DOWNMIX_MONO 
+    (HB_CH_FRONT_CENTER),
+    // DOWNMIX_STEREO 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT),
+    // DOWNMIX_3F 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_FRONT_CENTER),
+    // DOWNMIX_2F1R 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_BACK_CENTER),
+    // DOWNMIX_3F1R 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_FRONT_CENTER|HB_CH_BACK_CENTER),
+    // DOWNMIX_2F2R 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_BACK_LEFT|HB_CH_BACK_RIGHT),
+    // DOWNMIX_3F2R 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_FRONT_CENTER|HB_CH_BACK_LEFT|HB_CH_BACK_RIGHT),
+    // DOWNMIX_3F4R 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT|HB_CH_FRONT_CENTER|HB_CH_SIDE_LEFT|
+     HB_CH_SIDE_RIGHT|HB_CH_BACK_LEFT|HB_CH_BACK_RIGHT),
+    // DOWNMIX_DOLBY 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT),
+    // DOWNMIX_DPLII 
+    (HB_CH_FRONT_LEFT|HB_CH_FRONT_RIGHT)
+};
+
+int hb_layout_to_mode(int layout)
+{
+    int mode;
+    switch (layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
+    {
+        case HB_INPUT_CH_LAYOUT_MONO:
+            mode = DOWNMIX_MONO;
+            break;
+        case HB_INPUT_CH_LAYOUT_STEREO:
+            mode = DOWNMIX_STEREO;
+            break;
+        case HB_INPUT_CH_LAYOUT_3F:
+            mode = DOWNMIX_3F;
+            break;
+        case HB_INPUT_CH_LAYOUT_2F1R:
+            mode = DOWNMIX_2F1R;
+            break;
+        case HB_INPUT_CH_LAYOUT_3F1R:
+            mode = DOWNMIX_3F1R;
+            break;
+        case HB_INPUT_CH_LAYOUT_2F2R:
+            mode = DOWNMIX_2F2R;
+            break;
+        case HB_INPUT_CH_LAYOUT_3F2R:
+            mode = DOWNMIX_3F2R;
+            break;
+        case HB_INPUT_CH_LAYOUT_4F2R:
+            mode = DOWNMIX_3F2R|DOWNMIX_LFE_FLAG;
+            break;
+        case HB_INPUT_CH_LAYOUT_3F4R:
+            mode = DOWNMIX_3F4R;
+            break;
+        case HB_INPUT_CH_LAYOUT_DOLBY:
+            mode = DOWNMIX_STEREO;
+            break;
+        default:
+            mode = DOWNMIX_STEREO;
+            break;
+    }
+    if (layout & HB_INPUT_CH_LAYOUT_DISCRETE_LFE_MASK)
+        mode |= DOWNMIX_LFE_FLAG;
+    return mode;
+}
+
+int hb_mixdown_to_mode(uint32_t mixdown)
+{
+    switch (mixdown)
+    {
+        case HB_AMIXDOWN_MONO:
+            return DOWNMIX_MONO;
+        case HB_AMIXDOWN_STEREO:
+            return DOWNMIX_STEREO;
+        case HB_AMIXDOWN_DOLBY:
+            return DOWNMIX_DOLBY;
+        case HB_AMIXDOWN_DOLBYPLII:
+            return DOWNMIX_DPLII;
+        case HB_AMIXDOWN_6CH:
+            return DOWNMIX_3F2R|DOWNMIX_LFE_FLAG;
+        default:
+            return DOWNMIX_STEREO;
+    }
+}
+
+
+// ffmpeg gives us SMPTE channel layout
+// We could use this layout and remap channels in encfaac,
+// but VLC may have problems with remapping, so lets
+// allow remapping to the default QuickTime order which is:
+//
+// C   L   R   LS  RS  Rls Rrs LFE
+//
+// This arrangement also makes it possible to use half as
+// many downmix matrices since the matrix with and without
+// LFE are the same.
+//
+// Use hb_layout_remap to accomplish this.  For convenience
+// I've provided the necessary maps.
+//
+// SMPTE channel layout
+//
+// DUAL-MONO      L   R 
+// DUAL-MONO-LFE  L   R   LFE
+// MONO           M
+// MONO-LFE       M   LFE
+// STEREO         L   R 
+// STEREO-LFE     L   R   LFE
+// 3F             L   R   C
+// 3F-LFE         L   R   C    LFE
+// 2F1            L   R   S
+// 2F1-LFE        L   R   LFE  S
+// 3F1            L   R   C    S
+// 3F1-LFE        L   R   C    LFE S
+// 2F2            L   R   LS   RS
+// 2F2-LFE        L   R   LFE  LS   RS
+// 3F2            L   R   C    LS   RS
+// 3F2-LFE        L   R   C    LFE  LS   RS
+// 3F4            L   R   C    Rls  Rrs  LS   RS
+// 3F4-LFE        L   R   C    LFE  Rls  Rrs  LS   RS
+//
+
+#define CH_C      0
+#define CH_L      1
+#define CH_R      2
+#define CH_CS     3
+#define CH_LS     3
+#define CH_RS     4
+#define CH_Rls    5
+#define CH_Rrs    6
+#define CH_LFE    7
+
+hb_chan_map_t hb_qt_chan_map =
+{
+{
+    {{ CH_C,                                                     },
+     { CH_C, CH_LFE,                                             }}, // MONO
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R, CH_LFE,                                       }}, // STEREO
+
+    {{ CH_C, CH_L, CH_R,                                         },
+     { CH_C, CH_L, CH_R, CH_LFE,                                 }}, // 3F
+
+    {{ CH_L, CH_R, CH_CS,                                        },
+     { CH_L, CH_R, CH_CS, CH_LFE,                                }}, // 2F1R
+
+    {{ CH_C, CH_L, CH_R, CH_CS,                                  },
+     { CH_C, CH_L, CH_R, CH_CS, CH_LFE,                          }}, // 3F1R
+
+    {{ CH_L, CH_R, CH_LS, CH_RS,                                 },
+     { CH_L, CH_R, CH_LS, CH_RS, CH_LFE,                         }}, // 2F2R
+
+    {{ CH_C, CH_L, CH_R, CH_LS, CH_RS,                           },
+     { CH_C, CH_L, CH_R, CH_LS, CH_RS, CH_LFE,                   }}, // 3F2R
+
+    {{ CH_C, CH_L, CH_R, CH_LS, CH_RS,  CH_Rls,  CH_Rrs,         },
+     { CH_C, CH_L, CH_R, CH_LS, CH_RS,  CH_Rls,  CH_Rrs,  CH_LFE }}, // 3F4R
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}, // DOLBY
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}  // DPLII
+},
+{
+    // CH_C  CH_L  CH_R  CH_LS/CS  CH_RS   CH_Rls   CH_Rrs   CH_LFE 
+    {{ 0,    0,    0,    0,        0,      0,       0,       0   },
+     { 0,    0,    0,    0,        0,      0,       0,       1   }}, // MONO
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       2   }}, // STEREO
+
+    {{ 0,    1,    2,    0,        0,      0,       0,       0   },
+     { 0,    1,    2,    0,        0,      0,       0,       3   }}, // 3F
+
+    {{ 0,    0,    1,    2,        0,      0,       0,       0   },
+     { 0,    0,    1,    2,        0,      0,       0,       3   }}, // 2F1R
+
+    {{ 0,    1,    2,    3,        0,      0,       0,       0   },
+     { 0,    1,    2,    3,        0,      0,       0,       4   }}, // 3F1R
+
+    {{ 0,    0,    1,    2,        3,      0,       0,       0   },
+     { 0,    0,    1,    2,        3,      0,       0,       4   }}, // 2F2R
+
+    {{ 0,    1,    2,    3,        4,      0,       0,       0   },
+     { 0,    1,    2,    3,        4,      0,       0,       5   }}, // 3F2R
+
+    {{ 0,    1,    2,    3,        4,      5,       6,       0   },
+     { 0,    1,    2,    3,        4,      5,       6,       7   }}, // 3F4R
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}, // DOLBY
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}  // DPLII
+}
+};
+
+hb_chan_map_t hb_smpte_chan_map =
+{
+{
+    {{ CH_C,                                                     },
+     { CH_C, CH_LFE,                                             }}, // MONO
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R, CH_LFE,                                       }}, // STEREO
+
+    {{ CH_L, CH_R, CH_C,                                         },
+     { CH_L, CH_R, CH_C, CH_LFE,                                 }}, // 3F
+
+    {{ CH_L, CH_R, CH_CS,                                        },
+     { CH_L, CH_R, CH_LFE, CH_CS,                                }}, // 2F1R
+
+    {{ CH_L, CH_R, CH_C,   CH_CS,                                },
+     { CH_L, CH_R, CH_LFE, CH_CS,                                }}, // 3F1R
+
+    {{ CH_L, CH_R, CH_LS,  CH_RS,                                },
+     { CH_L, CH_R, CH_LFE, CH_LS, CH_RS,                         }}, // 2F2R
+
+    {{ CH_L, CH_R, CH_C, CH_LS,  CH_RS,                          },
+     { CH_L, CH_R, CH_C, CH_LFE, CH_LS, CH_RS,                   }}, // 3F2R
+
+    {{ CH_L, CH_R, CH_C, CH_Rls, CH_Rrs, CH_LS, CH_RS },
+     { CH_L, CH_R, CH_C, CH_LFE, CH_Rls, CH_Rrs, CH_LS, CH_RS    }}, // 3F4R
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}, // DOLBY
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}  // DPLII
+},
+{
+    // CH_C  CH_L  CH_R  CH_LS/CS  CH_RS   CH_Rls   CH_Rrs   CH_LFE 
+    {{ 0,    0,    0,    0,        0,      0,       0,       0   },
+     { 0,    0,    0,    0,        0,      0,       0,       1   }}, // MONO
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       2   }}, // STEREO
+
+    {{ 2,    0,    1,    0,        0,      0,       0,       0   },
+     { 2,    0,    1,    0,        0,      0,       0,       3   }}, // 3F
+
+    {{ 0,    0,    1,    2,        0,      0,       0,       0   },
+     { 0,    0,    1,    3,        0,      0,       0,       2   }}, // 2F1R
+
+    {{ 2,    0,    1,    3,        0,      0,       0,       0   },
+     { 2,    0,    1,    4,        0,      0,       0,       3   }}, // 3F1R
+
+    {{ 0,    0,    1,    2,        3,      0,       0,       0   },
+     { 0,    0,    1,    3,        4,      0,       0,       2   }}, // 2F2R
+
+    {{ 2,    0,    1,    3,        4,      0,       0,       0   },
+     { 2,    0,    1,    4,        5,      0,       0,       3   }}, // 3F2R
+
+    {{ 2,    0,    1,    5,        6,      3,       4,       0   },
+     { 2,    0,    1,    6,        7,      4,       5,       3   }}, // 3F4R
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}, // DOLBY
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}  // DPLII
+}
+};
+
+hb_chan_map_t hb_ac3_chan_map =
+{
+{
+    {{ CH_C,                                                     },
+     { CH_LFE, CH_C,                                             }}, // MONO
+
+    {{ CH_L, CH_R,                                               },
+     { CH_LFE, CH_L, CH_R,                                       }}, // STEREO
+
+    {{ CH_L, CH_C, CH_R,                                         },
+     { CH_LFE, CH_L, CH_C, CH_R,                                 }}, // 3F
+
+    {{ CH_L, CH_R, CH_CS,                                        },
+     { CH_LFE, CH_L, CH_R, CH_CS,                                }}, // 2F1R
+
+    {{ CH_L, CH_C, CH_R, CH_CS,                                  },
+     { CH_LFE, CH_L, CH_C, CH_R, CH_CS,                          }}, // 3F1R
+
+    {{ CH_L, CH_R, CH_LS, CH_RS,                                 },
+     { CH_LFE, CH_L, CH_R, CH_LS, CH_RS,                         }}, // 2F2R
+
+    {{ CH_L, CH_C, CH_R, CH_LS, CH_RS,                           },
+     { CH_LFE, CH_L, CH_C, CH_R, CH_LS, CH_RS,                   }}, // 3F2R
+
+    {{ CH_L, CH_C, CH_R, CH_LS, CH_RS,  CH_Rls,  CH_Rrs,         },
+     { CH_LFE, CH_L, CH_C, CH_R, CH_LS, CH_RS,  CH_Rls,  CH_Rrs  }}, // 3F4R
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}, // DOLBY
+
+    {{ CH_L, CH_R,                                               },
+     { CH_L, CH_R,                                               }}  // DPLII
+},
+{
+    // CH_C  CH_L  CH_R  CH_LS/CS  CH_RS   CH_Rls   CH_Rrs   CH_LFE 
+    {{ 0,    0,    0,    0,        0,      0,       0,       0   },
+     { 1,    0,    0,    0,        0,      0,       0,       0   }}, // MONO
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    1,    2,    0,        0,      0,       0,       0   }}, // STEREO
+
+    {{ 1,    0,    2,    0,        0,      0,       0,       0   },
+     { 2,    1,    3,    0,        0,      0,       0,       0   }}, // 3F
+
+    {{ 0,    0,    1,    2,        0,      0,       0,       0   },
+     { 0,    1,    2,    3,        0,      0,       0,       0   }}, // 2F1R
+
+    {{ 1,    0,    2,    3,        0,      0,       0,       0   },
+     { 2,    1,    3,    4,        0,      0,       0,       0   }}, // 3F1R
+
+    {{ 0,    0,    1,    2,        3,      0,       0,       0   },
+     { 0,    1,    2,    3,        4,      0,       0,       0   }}, // 2F2R
+
+    {{ 1,    0,    2,    3,        4,      0,       0,       0   },
+     { 2,    1,    3,    4,        5,      0,       0,       0   }}, // 3F2R
+
+    {{ 1,    0,    2,    3,        4,      5,       6,       0   },
+     { 2,    1,    3,    4,        5,      6,       7,       0   }}, // 3F4R
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}, // DOLBY
+
+    {{ 0,    0,    1,    0,        0,      0,       0,       0   },
+     { 0,    0,    1,    0,        0,      0,       0,       0   }}  // DPLII
+}
+};
+
+static const uint8_t nchans_tbl[] = {1, 2, 3, 3, 4, 4, 5, 7, 2, 2};
+
+// Takes a set of samples and remaps the channel layout
+void hb_layout_remap( 
+    hb_chan_map_t * map_in, 
+    hb_chan_map_t * map_out, 
+    int layout, 
+    hb_sample_t * samples, 
+    int nsamples )
+{
+    int nchans;
+    int ii, jj;
+    int lfe;
+    int * map;
+    int * inv_map;
+    int mode;
+    hb_sample_t tmp[8];
+
+    mode = hb_layout_to_mode(layout);
+    lfe = ((mode & DOWNMIX_LFE_FLAG) != 0);
+    mode = mode & DOWNMIX_CHANNEL_MASK;
+    nchans = nchans_tbl[mode] + lfe;
+    inv_map = map_in->inv_chan_map[mode][lfe];
+    map = map_out->chan_map[mode][lfe];
+
+    for (ii = 0; ii < nsamples; ii++)
+    {
+        for (jj = 0; jj < nchans; jj++)
+        {
+            tmp[jj] = samples[jj];
+        }
+        for (jj = 0; jj < nchans; jj++)
+        {
+            int ord = map[jj];
+            samples[jj] = tmp[inv_map[ord]];
+        }
+        samples += nchans;
+    }
+}
+
+static void matrix_mul(
+    hb_sample_t * dst, 
+    hb_sample_t * src, 
+    int nchans_out, 
+    int nchans_in, 
+    int nsamples, 
+    hb_sample_t (*matrix)[8],
+    hb_sample_t bias)
+{
+    int nn, ii, jj;
+    hb_sample_t val;
+
+    for (nn = 0; nn < nsamples; nn++)
+    {
+        for (ii = 0; ii < nchans_out; ii++)
+        {
+            val = 0;
+            for (jj = 0; jj < nchans_in; jj++)
+            {
+                val += src[jj] * matrix[jj][ii];
+            }
+            dst[ii] = val + bias;
+        }
+        src += nchans_in;
+        dst += nchans_out;
+    }
+}
+
+static void set_level( hb_downmix_t * downmix )
+{
+    int ii, jj;
+    int layout_in, layout_out;
+    int mode_in;
+    int mode_out;
+
+    mode_in = downmix->mode_in & ~DOWNMIX_FLAGS_MASK;
+    mode_out = downmix->mode_out & ~DOWNMIX_FLAGS_MASK;
+
+    for (ii = 0; ii < 8; ii++)
+    {
+        for (jj = 0; jj < 8; jj++)
+        {
+            downmix->matrix[ii][jj] *= downmix->level;
+        }
+    }
+    if (mode_out >= DOWNMIX_DOLBY)
+        return;
+
+    layout_in = channel_layout_map[mode_in];
+    layout_out = channel_layout_map[mode_out];
+
+    if (layout_in & HB_CH_FRONT_CENTER)
+    {
+        if (!(layout_out & HB_CH_FRONT_CENTER))
+        {
+            for (jj = 0; jj < 8; jj++)
+            {
+                downmix->matrix[downmix->center][jj] *= downmix->clev;
+            }
+        }
+    }
+    if (layout_in & (HB_CH_BACK_LEFT|HB_CH_BACK_RIGHT|HB_CH_BACK_CENTER|HB_CH_SIDE_LEFT|HB_CH_SIDE_RIGHT))
+    {
+        if (layout_out & (HB_CH_BACK_LEFT|HB_CH_BACK_RIGHT|HB_CH_BACK_CENTER|HB_CH_SIDE_LEFT|HB_CH_SIDE_RIGHT))
+        {
+            // Note, slev only gets set if input has surround, and output has none.
+            return;
+        }
+    }
+    for (jj = 0; jj < 8; jj++)
+    {
+        if ( downmix->left_surround >= 0 )
+            downmix->matrix[downmix->left_surround][jj] *= downmix->slev;
+        if ( downmix->right_surround >= 0 )
+            downmix->matrix[downmix->right_surround][jj] *= downmix->slev;
+        if ( downmix->rear_left_surround >= 0 )
+            downmix->matrix[downmix->rear_left_surround][jj] *= downmix->slev;
+        if ( downmix->rear_right_surround >= 0 )
+            downmix->matrix[downmix->rear_right_surround][jj] *= downmix->slev;
+    }
+}
+
+#define MIXMODE(x,y) (((x)<<4)|(y))
+// The downmix operation can result in new sample values that are
+// outside the original range of sample values.  If you wish to
+// guarantee that the levels to not exceed the original range,
+// call this function after initializing downmix and setting 
+// your initial levels.
+//
+// Note that this can result in generally lower volume levels
+// in the resulting downmixed audio.
+void hb_downmix_adjust_level( hb_downmix_t * downmix )
+{
+    int mode_in, mode_out;
+    hb_sample_t level = downmix->level;
+    hb_sample_t clev = downmix->clev;
+    hb_sample_t slev = downmix->slev;
+
+    mode_in = downmix->mode_in & DOWNMIX_CHANNEL_MASK;
+    mode_out = downmix->mode_out & DOWNMIX_CHANNEL_MASK;
+
+    switch MIXMODE(mode_in, mode_out)
+    {
+    case MIXMODE(DOWNMIX_STEREO, DOWNMIX_MONO):
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_2F1R):
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_3F1R):
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_3F1R):
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_3F1R):
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_3F2R):
+    level_3db:
+        level /= LVL_PLUS3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_MONO):
+        level /= LVL_PLUS3DB + clev * LVL_PLUS3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_2F1R):
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_2F1R):
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_2F2R):
+        if (1 + clev < LVL_PLUS3DB)
+            goto level_3db;
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_STEREO):
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_2F1R):
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_2F2R):
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_DOLBY):
+    case MIXMODE(DOWNMIX_3F, DOWNMIX_DPLII):
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_2F1R):
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_2F2R):
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_2F2R):
+        level /= 1 + clev;
+        break;
+
+
+    case MIXMODE(DOWNMIX_2F1R, DOWNMIX_MONO):
+        level /= LVL_PLUS3DB + LVL_3DB * clev;
+        break;
+
+    case MIXMODE(DOWNMIX_2F1R, DOWNMIX_DOLBY):
+        level /= 1 + LVL_3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_2F1R, DOWNMIX_STEREO):
+    case MIXMODE(DOWNMIX_2F1R, DOWNMIX_3F):
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_3F):
+        level /= 1 + LVL_3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_MONO):
+        level /= LVL_PLUS3DB + LVL_PLUS3DB * clev + LVL_3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_STEREO):
+        level /= 1 + clev + LVL_3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_DOLBY):
+    case MIXMODE(DOWNMIX_3F1R, DOWNMIX_DPLII):
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_DOLBY):
+        level /= 1 + LVL_PLUS3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_MONO):
+        level /= LVL_PLUS3DB + LVL_PLUS3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_STEREO):
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_3F):
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_3F):
+        level /= 1 + slev;
+        break;
+
+    case MIXMODE(DOWNMIX_2F2R, DOWNMIX_DPLII):
+        level /= 1 + LVL_SQRT_1_4 + LVL_SQRT_3_4;
+        break;
+
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_MONO):
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_MONO):
+        level /= LVL_PLUS3DB + LVL_PLUS3DB * clev * LVL_PLUS3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_STEREO):
+        level /= 1 + clev + slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_DOLBY):
+        level /= 1 + 3 * LVL_3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_3F2R, DOWNMIX_DPLII):
+        level /= 1 + LVL_3DB + LVL_SQRT_1_4 + LVL_SQRT_3_4;
+        break;
+
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_STEREO):
+        level /= 1 + clev + LVL_PLUS3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_3F):
+        level /= 1 + LVL_PLUS3DB * slev;
+        break;
+
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_DOLBY):
+        level /= 1 + 5 * LVL_3DB;
+        break;
+
+    case MIXMODE(DOWNMIX_3F4R, DOWNMIX_DPLII):
+        level /= 1 + LVL_3DB + 2 * LVL_SQRT_1_4 + 2 * LVL_SQRT_3_4;
+    }
+
+    downmix->level = level;
+    downmix->matrix_initialized = 0;
+}
+
+void hb_downmix_set_bias( hb_downmix_t * downmix, hb_sample_t bias )
+{
+    downmix->bias = bias;
+}
+
+// Changes the downmix mode if it needs changing after initialization
+static void set_mode( hb_downmix_t * downmix )
+{
+    int ii, jj;
+    int mode_in, mode_out;
+    hb_sample_t (*matrix)[8];
+
+    mode_in = downmix->mode_in & ~DOWNMIX_FLAGS_MASK;
+    mode_out = downmix->mode_out & ~DOWNMIX_FLAGS_MASK;
+
+    matrix = downmix_matrix[mode_in][mode_out];
+
+    for (ii = 0; ii < 8; ii++)
+    {
+        for (jj = 0; jj < 8; jj++)
+        {
+            downmix->matrix[ii][jj] = matrix[ii][jj];
+        }
+    }
+}
+
+// Changes the downmix mode if it needs changing after initialization
+int hb_downmix_set_mode( hb_downmix_t * downmix, int layout, int mixdown )
+{
+    int lfe_in, lfe_out;
+    int mode_in, mode_out;
+
+    if ( downmix == NULL )
+        return -1;
+
+    mode_in = hb_layout_to_mode(layout);
+    mode_out = hb_mixdown_to_mode(mixdown);
+    downmix->mode_in = mode_in;
+    downmix->mode_out = mode_out;
+
+    mode_in = downmix->mode_in & ~DOWNMIX_FLAGS_MASK;
+    mode_out = downmix->mode_out & ~DOWNMIX_FLAGS_MASK;
+
+    if (mode_in >= DOWNMIX_NUM_MODES || mode_out >= DOWNMIX_NUM_MODES)
+        return -1;
+
+    lfe_in = ((downmix->mode_in & DOWNMIX_LFE_FLAG) != 0);
+    lfe_out = ((downmix->mode_out & DOWNMIX_LFE_FLAG) != 0);
+
+    downmix->nchans_in = nchans_tbl[mode_in] + lfe_in;
+    downmix->nchans_out = nchans_tbl[mode_out] + lfe_out;
+
+    downmix->matrix_initialized = 0;
+    return 0;
+}
+
+// Changes the downmix levels if they need changing after initialization
+void hb_downmix_set_level( hb_downmix_t * downmix, hb_sample_t clev, hb_sample_t slev, hb_sample_t level )
+{
+    if ( downmix == NULL )
+        return;
+
+    downmix->clev = clev;
+    downmix->slev = slev;
+    downmix->level = level;
+    downmix->matrix_initialized = 0;
+}
+
+static void set_chan_map( hb_downmix_t * downmix )
+{
+    int nchans;
+    int ii, jj;
+    int lfe;
+    int * map;
+    int * inv_map;
+    int mode;
+    hb_sample_t matrix[8][8];
+
+    // Copy the matrix
+    for ( ii = 0; ii < 8; ii++ )
+    {
+        for ( jj = 0; jj < 8; jj++ )
+        {
+            matrix[ii][jj] = downmix->matrix[ii][jj];
+        }
+    }
+
+    // Rearrange the rows to correspond to the input channel order
+    lfe = ((downmix->mode_in & DOWNMIX_LFE_FLAG) != 0);
+    mode = downmix->mode_in & DOWNMIX_CHANNEL_MASK;
+    nchans = nchans_tbl[mode] + lfe;
+    map = downmix->map_in.chan_map[mode][lfe];
+    inv_map = hb_qt_chan_map.inv_chan_map[mode][lfe];
+
+    downmix->center = -1;
+    downmix->left_surround = -1;
+    downmix->right_surround = -1;
+    downmix->rear_left_surround = -1;
+    downmix->rear_right_surround = -1;
+    for ( ii = 0; ii < nchans; ii++ )
+    {
+        int ord = map[ii];
+        int row = inv_map[ord];
+        switch (ord)
+        {
+            case CH_C:
+                downmix->center = ii;
+                break;
+            case CH_LS:
+                downmix->left_surround = ii;
+                break;
+            case CH_RS:
+                downmix->right_surround = ii;
+                break;
+            case CH_Rls:
+                downmix->rear_right_surround = ii;
+                break;
+            case CH_Rrs:
+                downmix->rear_left_surround = ii;
+                break;
+        }
+        for ( jj = 0; jj < 8; jj++ )
+        {
+            downmix->matrix[ii][jj] = matrix[row][jj];
+        }
+    }
+
+    // Copy the matrix
+    for ( ii = 0; ii < 8; ii++ )
+    {
+        for ( jj = 0; jj < 8; jj++ )
+        {
+            matrix[ii][jj] = downmix->matrix[ii][jj];
+        }
+    }
+
+    // Rearrange the columns to correspond to the output channel order
+    lfe = ((downmix->mode_out & DOWNMIX_LFE_FLAG) != 0);
+    mode = downmix->mode_out & DOWNMIX_CHANNEL_MASK;
+    nchans = nchans_tbl[mode] + lfe;
+    map = downmix->map_out.chan_map[mode][lfe];
+    inv_map = hb_qt_chan_map.inv_chan_map[mode][lfe];
+    for ( ii = 0; ii < nchans; ii++ )
+    {
+        int ord = map[ii];
+        int col = inv_map[ord];
+        for ( jj = 0; jj < 8; jj++ )
+        {
+            downmix->matrix[jj][ii] = matrix[jj][col];
+        }
+    }
+}
+
+void hb_downmix_set_chan_map( 
+    hb_downmix_t * downmix, 
+    hb_chan_map_t * map_in, 
+    hb_chan_map_t * map_out )
+{
+    downmix->map_in = *map_in;
+    downmix->map_out = *map_out;
+    downmix->matrix_initialized = 0;
+}
+
+hb_downmix_t * hb_downmix_init(int layout, int mixdown)
+{
+    hb_downmix_t * downmix = calloc(1, sizeof(hb_downmix_t));
+    
+    if (downmix == NULL)
+        return NULL;
+    if ( hb_downmix_set_mode( downmix, layout, mixdown ) < 0 )
+    {
+        free( downmix );
+        return NULL;
+    }
+    // Set some good default values
+    hb_downmix_set_level( downmix, LVL_3DB, LVL_3DB, 1.0 );
+    downmix->bias = 0.0;
+    downmix->matrix_initialized = 0;
+    // The default input and output channel order is QT
+    hb_downmix_set_chan_map( downmix, &hb_qt_chan_map, &hb_qt_chan_map );
+    return downmix;
+}
+
+void hb_downmix_close( hb_downmix_t **downmix )
+{
+    if (*downmix != NULL)
+        free(*downmix);
+    *downmix = NULL;
+}
+
+static void init_matrix( hb_downmix_t * downmix )
+{
+    if ( !downmix->matrix_initialized )
+    {
+        set_mode( downmix );
+        set_chan_map( downmix );
+        set_level(downmix);
+        downmix->matrix_initialized = 1;
+    }
+}
+
+void hb_downmix( hb_downmix_t * downmix, hb_sample_t * dst, hb_sample_t * src, int nsamples)
+{
+    init_matrix( downmix );
+    matrix_mul( dst, src, downmix->nchans_out, downmix->nchans_in, 
+               nsamples, downmix->matrix, downmix->bias );
+}
+
+int hb_need_downmix( int layout, int mixdown )
+{
+    int mode_in, mode_out;
+
+    mode_in = hb_layout_to_mode(layout);
+    mode_out = hb_mixdown_to_mode(mixdown);
+
+    return (mode_in != mode_out);
+}
diff --git a/libhb/downmix.h b/libhb/downmix.h
new file mode 100644 (file)
index 0000000..5a6ec0b
--- /dev/null
@@ -0,0 +1,66 @@
+/* $Id: downmix.h,v 1.51 2005/11/04 13:09:40 stebbins Exp $
+
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+#ifndef DOWNMIX_H
+#define DOWNMIX_H
+
+typedef float hb_sample_t;
+
+typedef struct
+{
+    int chan_map[10][2][8];
+    int inv_chan_map[10][2][8];
+} hb_chan_map_t;
+
+typedef struct
+{
+    int            mode_in;
+    int            mode_out;
+    int            nchans_in;
+    int            nchans_out;
+    hb_sample_t    matrix[8][8];
+    int            matrix_initialized;
+    hb_sample_t    clev;
+    hb_sample_t    slev;
+    hb_sample_t    level;
+    hb_sample_t    bias;
+    hb_chan_map_t  map_in;
+    hb_chan_map_t  map_out;
+
+    int center;
+    int left_surround;
+    int right_surround;
+    int rear_left_surround;
+    int rear_right_surround;
+} hb_downmix_t;
+
+// For convenience, a map to convert smpte channel layout
+// to QuickTime channel layout.
+// Map Indicies are mode, lfe, channel respectively
+extern hb_chan_map_t hb_smpte_chan_map;
+extern hb_chan_map_t hb_ac3_chan_map;
+extern hb_chan_map_t hb_qt_chan_map;
+
+hb_downmix_t * hb_downmix_init(int layout, int mixdown);
+void hb_downmix_close( hb_downmix_t **downmix );
+int hb_downmix_set_mode( hb_downmix_t * downmix, int layout, int mixdown );
+void hb_downmix_set_level( hb_downmix_t * downmix, hb_sample_t clev, hb_sample_t slev, hb_sample_t level );
+void hb_downmix_adjust_level( hb_downmix_t * downmix );
+void hb_downmix_set_bias( hb_downmix_t * downmix, hb_sample_t bias );
+void hb_downmix_set_chan_map( 
+    hb_downmix_t * downmix, 
+    hb_chan_map_t * map_in, 
+    hb_chan_map_t * map_out );
+void hb_downmix( hb_downmix_t * downmix, hb_sample_t * dst, hb_sample_t * src, int nsamples);
+void hb_layout_remap( 
+    hb_chan_map_t * map_in, 
+    hb_chan_map_t * map_out, 
+    int layout, 
+    hb_sample_t * samples, 
+    int nsamples );
+int hb_need_downmix( int layout, int mixdown );
+
+#endif /* DOWNMIX_H */
index fa5373e..f1411d7 100644 (file)
@@ -16,7 +16,7 @@ static hb_dvd_t    * hb_dvdread_init( char * path );
 static void          hb_dvdread_close( hb_dvd_t ** _d );
 static char        * hb_dvdread_name( char * path );
 static int           hb_dvdread_title_count( hb_dvd_t * d );
-static hb_title_t  * hb_dvdread_title_scan( hb_dvd_t * d, int t );
+static hb_title_t  * hb_dvdread_title_scan( hb_dvd_t * d, int t, uint64_t min_duration );
 static int           hb_dvdread_start( hb_dvd_t * d, hb_title_t *title, int chapter );
 static void          hb_dvdread_stop( hb_dvd_t * d );
 static int           hb_dvdread_seek( hb_dvd_t * d, float f );
@@ -24,6 +24,7 @@ static int           hb_dvdread_read( hb_dvd_t * d, hb_buffer_t * b );
 static int           hb_dvdread_chapter( hb_dvd_t * d );
 static int           hb_dvdread_angle_count( hb_dvd_t * d );
 static void          hb_dvdread_set_angle( hb_dvd_t * d, int angle );
+static int           hb_dvdread_main_feature( hb_dvd_t * d, hb_list_t * list_title );
 
 hb_dvd_func_t hb_dvdread_func =
 {
@@ -38,7 +39,8 @@ hb_dvd_func_t hb_dvdread_func =
     hb_dvdread_read,
     hb_dvdread_chapter,
     hb_dvdread_angle_count,
-    hb_dvdread_set_angle
+    hb_dvdread_set_angle,
+    hb_dvdread_main_feature
 };
 
 static hb_dvd_func_t *dvd_methods = &hb_dvdread_func;
@@ -55,6 +57,24 @@ hb_dvd_func_t * hb_dvdread_methods( void )
     return &hb_dvdread_func;
 }
 
+static int hb_dvdread_main_feature( hb_dvd_t * e, hb_list_t * list_title )
+{
+    int ii;
+    uint64_t longest_duration = 0;
+    int longest = -1;
+
+    for ( ii = 0; ii < hb_list_count( list_title ); ii++ )
+    {
+        hb_title_t * title = hb_list_item( list_title, ii );
+        if ( title->duration > longest_duration )
+        {
+            longest_duration = title->duration;
+            longest = title->index;
+        }
+    }
+    return longest;
+}
+
 static char * hb_dvdread_name( char * path )
 {
     static char name[1024];
@@ -142,7 +162,7 @@ static int hb_dvdread_title_count( hb_dvd_t * e )
 /***********************************************************************
  * hb_dvdread_title_scan
  **********************************************************************/
-static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
+static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t, uint64_t min_duration )
 {
 
     hb_dvdread_t *d = &(e->dvdread);
@@ -158,6 +178,8 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
     hb_log( "scan: scanning title %d", t );
 
     title = hb_title_init( d->path, t );
+    title->type = HB_DVD_TYPE;
+
     if( DVDUDFVolumeInfo( d->reader, title->name, sizeof( title->name ),
                           unused, sizeof( unused ) ) )
     {
@@ -277,8 +299,8 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
         d->cell_cur = d->cell_next;
     }
 
-    hb_log( "scan: vts=%d, ttn=%d, cells=%d->%d, blocks=%d->%d, "
-            "%d blocks", title->vts, title->ttn, title->cell_start,
+    hb_log( "scan: vts=%d, ttn=%d, cells=%d->%d, blocks=%"PRIu64"->%"PRIu64", "
+            "%"PRIu64" blocks", title->vts, title->ttn, title->cell_start,
             title->cell_end, title->block_start, title->block_end,
             title->block_count );
 
@@ -294,7 +316,7 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
     /* ignore titles under 10 seconds because they're often stills or
      * clips with no audio & our preview code doesn't currently handle
      * either of these. */
-    if( title->duration < 900000LL )
+    if( title->duration < min_duration )
     {
         hb_log( "scan: ignoring title (too short)" );
         goto fail;
@@ -421,10 +443,6 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
         hb_list_add( title->list_audio, audio );
     }
 
-    memcpy( title->palette,
-            vts->vts_pgcit->pgci_srp[pgc_id-1].pgc->palette,
-            16 * sizeof( uint32_t ) );
-
     /* Check for subtitles */
     for( i = 0; i < vts->vtsi_mat->nr_of_vts_subp_streams; i++ )
     {
@@ -480,6 +498,10 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
         subtitle->config.dest   = RENDERSUB;  // By default render (burn-in) the VOBSUB.
 
         subtitle->type = lang_extension;
+        
+        memcpy( subtitle->palette,
+            vts->vts_pgcit->pgci_srp[pgc_id-1].pgc->palette,
+            16 * sizeof( uint32_t ) );
 
         switch( lang_extension )
         {  
@@ -602,7 +624,7 @@ static hb_title_t * hb_dvdread_title_scan( hb_dvd_t * e, int t )
         chapter->minutes   = ( seconds % 3600 ) / 60;
         chapter->seconds   = seconds % 60;
 
-        hb_log( "scan: chap %d c=%d->%d, b=%d->%d (%d), %"PRId64" ms",
+        hb_log( "scan: chap %d c=%d->%d, b=%"PRIu64"->%"PRIu64" (%"PRIu64"), %"PRId64" ms",
                 chapter->index, chapter->cell_start, chapter->cell_end,
                 chapter->block_start, chapter->block_end,
                 chapter->block_count, chapter->duration / 90 );
@@ -839,22 +861,37 @@ static int hb_dvdread_read( hb_dvd_t * e, hb_buffer_t * b )
         {
             int block, pack_len, next_vobu, read_retry;
 
-            for( read_retry = 0; read_retry < 3; read_retry++ )
+            for( read_retry = 1; read_retry < 1024; read_retry++ )
             {
                 if( DVDReadBlocks( d->file, d->next_vobu, 1, b->data ) == 1 )
                 {
                     /*
                      * Successful read.
                      */
+                    if( read_retry > 1 && !is_nav_pack( b->data) )
+                    {
+                        // But wasn't a nav pack, so carry on looking
+                        read_retry = 1;
+                        d->next_vobu++;
+                        continue;
+                    }
                     break;
-                } else {
-                    hb_log( "dvd: Read Error on blk %d, attempt %d",
-                            d->next_vobu, read_retry );
+                } else {  
+                    // First retry the same block, then try the next one, 
+                    // adjust the skip increment upwards so that we can skip
+                    // large sections of bad blocks more efficiently (at the
+                    // cost of some missed good blocks at the end).
+                    hb_log( "dvd: vobu read error blk %d - skipping to next blk incr %d",
+                            d->next_vobu, (read_retry * 10));
+                    d->next_vobu += (read_retry * 10);
                 }
+                
             }
 
-            if( read_retry == 3 )
+            if( read_retry == 1024 )
             {
+                // That's too many bad blocks, jump to the start of the
+                // next cell.
                 hb_log( "dvd: vobu read error blk %d - skipping to cell %d",
                         d->next_vobu, d->cell_next );
                 d->cell_cur  = d->cell_next;
@@ -873,7 +910,7 @@ static int hb_dvdread_read( hb_dvd_t * e, hb_buffer_t * b )
                     hb_log("dvd: Lost sync, searching for NAV pack at blk %d",
                            d->next_vobu);
                     d->in_sync = 0;
-                }
+                } 
                 continue;
             }
 
@@ -1008,7 +1045,7 @@ static int hb_dvdread_read( hb_dvd_t * e, hb_buffer_t * b )
                 }
                 if( d->in_cell )
                 {
-                    hb_error( "dvd: assuming missed end of cell %d", d->cell_cur );
+                    hb_error( "dvd: assuming missed end of cell %d at block %d", d->cell_cur, d->block );
                     d->cell_cur  = d->cell_next;
                     d->next_vobu = d->pgc->cell_playback[d->cell_cur].first_sector;
                     FindNextCell( d );
@@ -1246,9 +1283,9 @@ int hb_dvd_title_count( hb_dvd_t * d )
     return dvd_methods->title_count(d);
 }
 
-hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t )
+hb_title_t * hb_dvd_title_scan( hb_dvd_t * d, int t, uint64_t min_duration )
 {
-    return dvd_methods->title_scan(d, t);
+    return dvd_methods->title_scan(d, t, min_duration);
 }
 
 int hb_dvd_start( hb_dvd_t * d, hb_title_t *title, int chapter )
@@ -1291,6 +1328,11 @@ void hb_dvd_set_angle( hb_dvd_t * d, int angle )
     dvd_methods->set_angle(d, angle);
 }
 
+int hb_dvd_main_feature( hb_dvd_t * d, hb_list_t * list_title )
+{
+    return dvd_methods->main_feature(d, list_title);
+}
+
 // hb_dvd_set_dvdnav must only be called when no dvd source is open
 // it rips the rug out from under things so be careful
 void hb_dvd_set_dvdnav( int enable )
index bcba78e..95f85b1 100644 (file)
@@ -71,7 +71,7 @@ struct hb_dvd_func_s
     void          (* close)       ( hb_dvd_t ** );
     char        * (* name)        ( char * );
     int           (* title_count) ( hb_dvd_t * );
-    hb_title_t  * (* title_scan)  ( hb_dvd_t *, int );
+    hb_title_t  * (* title_scan)  ( hb_dvd_t *, int, uint64_t );
     int           (* start)       ( hb_dvd_t *, hb_title_t *, int );
     void          (* stop)        ( hb_dvd_t * );
     int           (* seek)        ( hb_dvd_t *, float );
@@ -79,6 +79,7 @@ struct hb_dvd_func_s
     int           (* chapter)     ( hb_dvd_t * );
     int           (* angle_count) ( hb_dvd_t * );
     void          (* set_angle)   ( hb_dvd_t *, int );
+    int           (* main_feature)( hb_dvd_t *, hb_list_t * );
 };
 typedef struct hb_dvd_func_s hb_dvd_func_t;
 
index d525b96..7571b57 100644 (file)
@@ -18,7 +18,7 @@
 static char        * hb_dvdnav_name( char * path );
 static hb_dvd_t    * hb_dvdnav_init( char * path );
 static int           hb_dvdnav_title_count( hb_dvd_t * d );
-static hb_title_t  * hb_dvdnav_title_scan( hb_dvd_t * d, int t );
+static hb_title_t  * hb_dvdnav_title_scan( hb_dvd_t * d, int t, uint64_t min_duration );
 static int           hb_dvdnav_start( hb_dvd_t * d, hb_title_t *title, int chapter );
 static void          hb_dvdnav_stop( hb_dvd_t * d );
 static int           hb_dvdnav_seek( hb_dvd_t * d, float f );
@@ -26,7 +26,8 @@ static int           hb_dvdnav_read( hb_dvd_t * d, hb_buffer_t * b );
 static int           hb_dvdnav_chapter( hb_dvd_t * d );
 static void          hb_dvdnav_close( hb_dvd_t ** _d );
 static int           hb_dvdnav_angle_count( hb_dvd_t * d );
-static void          hb_dvdnav_set_angle( hb_dvd_t * e, int angle );
+static void          hb_dvdnav_set_angle( hb_dvd_t * d, int angle );
+static int           hb_dvdnav_main_feature( hb_dvd_t * d, hb_list_t * list_title );
 
 hb_dvd_func_t hb_dvdnav_func =
 {
@@ -41,7 +42,8 @@ hb_dvd_func_t hb_dvdnav_func =
     hb_dvdnav_read,
     hb_dvdnav_chapter,
     hb_dvdnav_angle_count,
-    hb_dvdnav_set_angle
+    hb_dvdnav_set_angle,
+    hb_dvdnav_main_feature
 };
 
 // there can be at most 999 PGCs per title. round that up to the nearest
@@ -287,7 +289,7 @@ PttDuration(ifo_handle_t *ifo, int ttn, int pttn, int *blocks, int *last_pgcn)
 /***********************************************************************
  * hb_dvdnav_title_scan
  **********************************************************************/
-static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
+static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t, uint64_t min_duration )
 {
 
     hb_dvdnav_t * d = &(e->dvdnav);
@@ -307,6 +309,7 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
     hb_log( "scan: scanning title %d", t );
 
     title = hb_title_init( d->path, t );
+    title->type = HB_DVD_TYPE;
     if (dvdnav_get_title_string(d->dvdnav, &name) == DVDNAV_STATUS_OK)
     {
         strncpy( title->name, name, sizeof( title->name ) );
@@ -412,10 +415,19 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
         }
     }
 
+    /* Get duration */
+    title->duration = longest;
+    title->hours    = title->duration / 90000 / 3600;
+    title->minutes  = ( ( title->duration / 90000 ) % 3600 ) / 60;
+    title->seconds  = ( title->duration / 90000 ) % 60;
+    hb_log( "scan: duration is %02d:%02d:%02d (%"PRId64" ms)",
+            title->hours, title->minutes, title->seconds,
+            title->duration / 90 );
+
     /* ignore titles under 10 seconds because they're often stills or
      * clips with no audio & our preview code doesn't currently handle
      * either of these. */
-    if( longest < 900000LL )
+    if( longest < min_duration )
     {
         hb_log( "scan: ignoring title (too short)" );
         goto fail;
@@ -453,20 +465,11 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
     title->cell_end = pgc->nr_of_cells - 1;
     title->block_end = pgc->cell_playback[title->cell_end].last_sector;
 
-    hb_log( "scan: vts=%d, ttn=%d, cells=%d->%d, blocks=%d->%d, "
-            "%d blocks", title->vts, title->ttn, title->cell_start,
+    hb_log( "scan: vts=%d, ttn=%d, cells=%d->%d, blocks=%"PRIu64"->%"PRIu64", "
+            "%"PRIu64" blocks", title->vts, title->ttn, title->cell_start,
             title->cell_end, title->block_start, title->block_end,
             title->block_count );
 
-    /* Get duration */
-    title->duration = longest;
-    title->hours    = title->duration / 90000 / 3600;
-    title->minutes  = ( ( title->duration / 90000 ) % 3600 ) / 60;
-    title->seconds  = ( title->duration / 90000 ) % 60;
-    hb_log( "scan: duration is %02d:%02d:%02d (%"PRId64" ms)",
-            title->hours, title->minutes, title->seconds,
-            title->duration / 90 );
-
     /* Detect languages */
     for( i = 0; i < ifo->vtsi_mat->nr_of_vts_audio_streams; i++ )
     {
@@ -588,10 +591,6 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
         hb_list_add( title->list_audio, audio );
     }
 
-    memcpy( title->palette,
-            ifo->vts_pgcit->pgci_srp[title_pgcn-1].pgc->palette,
-            16 * sizeof( uint32_t ) );
-
     /* Check for subtitles */
     for( i = 0; i < ifo->vtsi_mat->nr_of_vts_subp_streams; i++ )
     {
@@ -647,6 +646,10 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
         subtitle->config.dest   = RENDERSUB;  // By default render (burn-in) the VOBSUB.
 
         subtitle->type = lang_extension;
+        
+        memcpy( subtitle->palette,
+            ifo->vts_pgcit->pgci_srp[title_pgcn-1].pgc->palette,
+            16 * sizeof( uint32_t ) );
 
         switch( lang_extension )
         {  
@@ -779,7 +782,7 @@ static hb_title_t * hb_dvdnav_title_scan( hb_dvd_t * e, int t )
         chapter->minutes   = ( seconds % 3600 ) / 60;
         chapter->seconds   = seconds % 60;
 
-        hb_log( "scan: chap %d c=%d->%d, b=%d->%d (%d), %"PRId64" ms",
+        hb_log( "scan: chap %d c=%d->%d, b=%"PRIu64"->%"PRIu64" (%"PRIu64"), %"PRId64" ms",
                 chapter->index, chapter->cell_start, chapter->cell_end,
                 chapter->block_start, chapter->block_end,
                 chapter->block_count, chapter->duration / 90 );
@@ -817,6 +820,498 @@ cleanup:
 }
 
 /***********************************************************************
+ * hb_dvdnav_title_scan
+ **********************************************************************/
+static int find_title( hb_list_t * list_title, int title )
+{
+    int ii;
+
+    for ( ii = 0; ii < hb_list_count( list_title ); ii++ )
+    {
+        hb_title_t * hbtitle = hb_list_item( list_title, ii );
+        if ( hbtitle->index == title )
+            return ii;
+    }
+    return -1;
+}
+
+static void skip_some( dvdnav_t * dvdnav, int blocks )
+{
+    int ii;
+    int result, event, len;
+    uint8_t buf[HB_DVD_READ_BUFFER_SIZE];
+
+    for ( ii = 0; ii < blocks; ii++ )
+    {
+        result = dvdnav_get_next_block( dvdnav, buf, &event, &len );
+        if ( result == DVDNAV_STATUS_ERR )
+        {
+            hb_error("dvdnav: Read Error, %s", dvdnav_err_to_string(dvdnav));
+            return;
+        }
+        switch ( event )
+        {
+        case DVDNAV_BLOCK_OK:
+            break;
+
+        case DVDNAV_CELL_CHANGE:
+        {
+        } break;
+
+        case DVDNAV_STILL_FRAME:
+            dvdnav_still_skip( dvdnav );
+            break;
+
+        case DVDNAV_WAIT:
+            dvdnav_wait_skip( dvdnav );
+            break;
+
+        case DVDNAV_STOP:
+            return;
+
+        case DVDNAV_HOP_CHANNEL:
+            break;
+
+        case DVDNAV_NAV_PACKET:
+            break;
+
+        case DVDNAV_VTS_CHANGE:
+        {
+            dvdnav_vts_change_event_t *event;
+            event = (dvdnav_vts_change_event_t*)buf;
+            // Some discs initialize the vts with the "first play" item
+            // and some don't seem to.  So if we see it is uninitialized,
+            // set it.
+            if ( event->new_vtsN <= 0 )
+                result = dvdnav_title_play( dvdnav, 1 );
+        } break;
+
+        case DVDNAV_HIGHLIGHT:
+            break;
+
+        case DVDNAV_AUDIO_STREAM_CHANGE:
+            break;
+
+        case DVDNAV_SPU_STREAM_CHANGE:
+            break;
+
+        case DVDNAV_SPU_CLUT_CHANGE:
+            break;
+
+        case DVDNAV_NOP:
+            break;
+
+        default:
+            break;
+        }
+    }
+}
+
+static int try_button( dvdnav_t * dvdnav, int menu_id, int button, hb_list_t * list_title )
+{
+    int result, event, len;
+    uint8_t buf[HB_DVD_READ_BUFFER_SIZE];
+    int ii, jj;
+    int32_t cur_title, title, pgcn, pgn;
+    uint64_t longest_duration = 0;
+    int longest = -1;
+
+    pci_t *pci = dvdnav_get_current_nav_pci( dvdnav );
+    result = dvdnav_button_select_and_activate( dvdnav, pci, button + 1 );
+    if (result != DVDNAV_STATUS_OK)
+    {
+        hb_log("dvdnav_button_select_and_activate: %s", dvdnav_err_to_string(dvdnav));
+    }
+
+    result = dvdnav_current_title_program( dvdnav, &title, &pgcn, &pgn );
+    if (result != DVDNAV_STATUS_OK)
+        hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(dvdnav));
+
+    if ( title > 0 )
+    {
+        hb_title_t * hbtitle;
+        int index;
+        index = find_title( list_title, title );
+        hbtitle = hb_list_item( list_title, index );
+        if ( hbtitle != NULL )
+        {
+            if ( hbtitle->duration > longest_duration )
+            {
+                longest_duration = hbtitle->duration;
+                longest = title;
+            }
+        }
+        // If the duration is longer than 10min, assume
+        // this isn't garbage leading to something bigger.
+        if ( longest_duration / 90000 > 10 * 60 )
+        {
+            return longest;
+        }
+    }
+    cur_title = title;
+
+    for (jj = 0; jj < 5; jj++)
+    {
+        for (ii = 0; ii < 2000; ii++)
+        {
+            result = dvdnav_get_next_block( dvdnav, buf, &event, &len );
+            if ( result == DVDNAV_STATUS_ERR )
+            {
+                hb_error("dvdnav: Read Error, %s", dvdnav_err_to_string(dvdnav));
+                return 0;
+            }
+            switch ( event )
+            {
+            case DVDNAV_BLOCK_OK:
+                break;
+
+            case DVDNAV_CELL_CHANGE:
+            {
+                result = dvdnav_current_title_program( dvdnav, &title, &pgcn, &pgn );
+                if (result != DVDNAV_STATUS_OK)
+                    hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(dvdnav));
+
+                if ( title != cur_title && title > 0 )
+                {
+                    hb_title_t * hbtitle;
+                    int index;
+                    index = find_title( list_title, title );
+                    hbtitle = hb_list_item( list_title, index );
+                    if ( hbtitle != NULL )
+                    {
+                        if ( hbtitle->duration > longest_duration )
+                        {
+                            longest_duration = hbtitle->duration;
+                            longest = title;
+                        }
+                    }
+                    // If the duration is longer than 10min, assume
+                    // this isn't garbage leading to something bigger.
+                    if ( longest_duration / 90000 > 10 * 60 )
+                    {
+                        return longest;
+                    }
+                }
+                cur_title = title;
+                if (title > 0)
+                {
+                    result = dvdnav_next_pg_search( dvdnav );
+                    if ( result != DVDNAV_STATUS_OK )
+                    {
+                        return longest;
+                    }
+                }
+            } break;
+
+            case DVDNAV_STILL_FRAME:
+                dvdnav_still_skip( dvdnav );
+                break;
+
+            case DVDNAV_WAIT:
+                dvdnav_wait_skip( dvdnav );
+                break;
+
+            case DVDNAV_STOP:
+                return 0;
+
+            case DVDNAV_HOP_CHANNEL:
+                break;
+
+            case DVDNAV_NAV_PACKET:
+            {
+            } break;
+
+            case DVDNAV_VTS_CHANGE:
+            {
+                result = dvdnav_current_title_program( dvdnav, &title, &pgcn, &pgn );
+                if (result != DVDNAV_STATUS_OK)
+                    hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(dvdnav));
+
+                if ( title != cur_title && title > 0 )
+                {
+                    hb_title_t * hbtitle;
+                    int index;
+                    index = find_title( list_title, title );
+                    hbtitle = hb_list_item( list_title, index );
+                    if ( hbtitle != NULL )
+                    {
+                        if ( hbtitle->duration > longest_duration )
+                        {
+                            longest_duration = hbtitle->duration;
+                            longest = title;
+                        }
+                    }
+                    if ( longest_duration / 90000 > 10 * 60 )
+                    {
+                        return longest;
+                    }
+                }
+                cur_title = title;
+            } break;
+
+            case DVDNAV_HIGHLIGHT:
+                break;
+
+            case DVDNAV_AUDIO_STREAM_CHANGE:
+                break;
+
+            case DVDNAV_SPU_STREAM_CHANGE:
+                break;
+
+            case DVDNAV_SPU_CLUT_CHANGE:
+                break;
+
+            case DVDNAV_NOP:
+                break;
+
+            default:
+                break;
+            }
+        }
+        if (cur_title > 0)
+        {
+            // Some titles have long lead-ins. Try skipping it.
+            dvdnav_next_pg_search( dvdnav );
+        }
+    }
+    return longest;
+}
+
+static int try_menu( 
+    hb_dvdnav_t * d, 
+    hb_list_t * list_title, 
+    DVDMenuID_t menu, 
+    uint64_t fallback_duration )
+{
+    int result, event, len;
+    uint8_t buf[HB_DVD_READ_BUFFER_SIZE];
+    int ii, jj;
+    int32_t cur_title, title, pgcn, pgn;
+    uint64_t longest_duration = 0;
+    int longest = -1;
+
+
+    result = dvdnav_menu_call( d->dvdnav, menu );
+    if ( result != DVDNAV_STATUS_OK )
+    {
+        // Sometimes the "first play" item doesn't initialize the
+        // initial VTS. So do it here.
+        result = dvdnav_title_play( d->dvdnav, 1 );
+        result = dvdnav_menu_call( d->dvdnav, menu );
+        if ( result != DVDNAV_STATUS_OK )
+        {
+            hb_error("dvdnav: Can not set dvd menu, %s", dvdnav_err_to_string(d->dvdnav));
+            goto done;
+        }
+    }
+
+    result = dvdnav_current_title_program( d->dvdnav, &title, &pgcn, &pgn );
+    if (result != DVDNAV_STATUS_OK)
+        hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(d->dvdnav));
+
+    cur_title = title;
+
+    for (jj = 0; jj < 4; jj++)
+    {
+        for (ii = 0; ii < 4000; ii++)
+        {
+            result = dvdnav_get_next_block( d->dvdnav, buf, &event, &len );
+            if ( result == DVDNAV_STATUS_ERR )
+            {
+                hb_error("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
+                goto done;
+            }
+            switch ( event )
+            {
+            case DVDNAV_BLOCK_OK:
+                break;
+
+            case DVDNAV_CELL_CHANGE:
+            {
+                result = dvdnav_current_title_program( d->dvdnav, &title, &pgcn, &pgn );
+                if (result != DVDNAV_STATUS_OK)
+                    hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(d->dvdnav));
+                cur_title = title;
+            } break;
+
+            case DVDNAV_STILL_FRAME:
+                dvdnav_still_skip( d->dvdnav );
+                break;
+
+            case DVDNAV_WAIT:
+                dvdnav_wait_skip( d->dvdnav );
+                break;
+
+            case DVDNAV_STOP:
+                goto done;
+
+            case DVDNAV_HOP_CHANNEL:
+                break;
+
+            case DVDNAV_NAV_PACKET:
+            {
+                pci_t *pci = dvdnav_get_current_nav_pci( d->dvdnav );
+                int kk;
+                int buttons;
+                if ( pci == NULL ) break;
+
+                buttons = pci->hli.hl_gi.btn_ns;
+                if ( cur_title == 0 && buttons > 1 )
+                {
+                    int menu_title, menu_id;
+                    result = dvdnav_current_title_info( d->dvdnav, &menu_title, &menu_id );
+                    if (result != DVDNAV_STATUS_OK)
+                        hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(d->dvdnav));
+                    for (kk = 0; kk < buttons; kk++)
+                    {
+                        dvdnav_t *dvdnav_copy;
+
+                        result = dvdnav_dup( &dvdnav_copy, d->dvdnav );
+                        if (result != DVDNAV_STATUS_OK)
+                        {
+                            hb_log("dvdnav dup failed: %s", dvdnav_err_to_string(d->dvdnav));
+                            goto done;
+                        }
+                        title = try_button( dvdnav_copy, menu_id, kk, list_title );
+                        dvdnav_free_dup( dvdnav_copy );
+
+                        if ( title >= 0 )
+                        {
+                            hb_title_t * hbtitle;
+                            int index;
+                            index = find_title( list_title, title );
+                            hbtitle = hb_list_item( list_title, index );
+                            if ( hbtitle != NULL )
+                            {
+                                if ( hbtitle->duration > longest_duration )
+                                {
+                                    longest_duration = hbtitle->duration;
+                                    longest = title;
+                                    if ((float)fallback_duration * 0.75 < longest_duration)
+                                        goto done;
+                                }
+                            }
+                        }
+                    }
+                    goto done;
+                }
+                if ( cur_title == 0 && buttons == 1 )
+                {
+                    dvdnav_button_select_and_activate( d->dvdnav, pci, 1 );
+                }
+            } break;
+
+            case DVDNAV_VTS_CHANGE:
+            {
+                result = dvdnav_current_title_program( d->dvdnav, &title, &pgcn, &pgn );
+                if (result != DVDNAV_STATUS_OK)
+                    hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(d->dvdnav));
+                cur_title = title;
+            } break;
+
+            case DVDNAV_HIGHLIGHT:
+                break;
+
+            case DVDNAV_AUDIO_STREAM_CHANGE:
+                break;
+
+            case DVDNAV_SPU_STREAM_CHANGE:
+                break;
+
+            case DVDNAV_SPU_CLUT_CHANGE:
+                break;
+
+            case DVDNAV_NOP:
+                break;
+
+            default:
+                break;
+            }
+        }
+        // Sometimes the menu is preceeded by a intro that just
+        // gets restarted when hitting the menu button. So
+        // try skipping with the skip forward button.  Then
+        // try hitting the menu again.
+        if ( !(jj & 1) )
+            dvdnav_next_pg_search( d->dvdnav );
+        else
+            result = dvdnav_menu_call( d->dvdnav, menu );
+    }
+
+done:
+    return longest;
+}
+
+static int hb_dvdnav_main_feature( hb_dvd_t * e, hb_list_t * list_title )
+{
+    hb_dvdnav_t * d = &(e->dvdnav);
+    int longest_root;
+    int longest_title = 0;
+    int longest_fallback = 0;
+    int ii;
+    uint64_t longest_duration_root = 0;
+    uint64_t longest_duration_title = 0;
+    uint64_t longest_duration_fallback = 0;
+
+    for ( ii = 0; ii < hb_list_count( list_title ); ii++ )
+    {
+        hb_title_t * title = hb_list_item( list_title, ii );
+        if ( title->duration > longest_duration_fallback )
+        {
+            longest_duration_fallback = title->duration;
+            longest_fallback = title->index;
+        }
+    }
+
+    dvdnav_reset( d->dvdnav );
+    skip_some( d->dvdnav, 500 );
+
+    longest_root = try_menu( d, list_title, DVD_MENU_Root, longest_duration_fallback );
+    if ( longest_root >= 0 )
+    {
+        hb_title_t * hbtitle;
+        int index;
+        index = find_title( list_title, longest_root );
+        hbtitle = hb_list_item( list_title, index );
+        if ( hbtitle )
+            longest_duration_root = hbtitle->duration;
+    }
+    if ( longest_root < 0 || 
+         (float)longest_duration_fallback * 0.7 > longest_duration_root)
+    {
+        longest_title = try_menu( d, list_title, DVD_MENU_Title, longest_duration_fallback );
+        if ( longest_title >= 0 )
+        {
+            hb_title_t * hbtitle;
+            int index;
+            index = find_title( list_title, longest_title );
+            hbtitle = hb_list_item( list_title, index );
+            if ( hbtitle )
+                longest_duration_title = hbtitle->duration;
+        }
+    }
+
+    uint64_t longest_duration;
+    int longest;
+
+    if ( longest_duration_root > longest_duration_title )
+    {
+        longest_duration = longest_duration_root;
+        longest = longest_root;
+    }
+    else
+    {
+        longest_duration = longest_duration_title;
+        longest = longest_title;
+    }
+    if ((float)longest_duration_fallback * 0.7 > longest_duration)
+    {
+        longest = longest_fallback;
+    }
+    return longest;
+}
+
+/***********************************************************************
  * hb_dvdnav_start
  ***********************************************************************
  * Title and chapter start at 1
@@ -835,6 +1330,7 @@ static int hb_dvdnav_start( hb_dvd_t * e, hb_title_t *title, int c )
     {
         return 0;
     }
+    dvdnav_reset( d->dvdnav );
     chapter = hb_list_item( title->list_chapter, c - 1);
     if (chapter != NULL)
         result = dvdnav_program_play(d->dvdnav, t, chapter->pgcn, chapter->pgn);
@@ -882,24 +1378,35 @@ static int hb_dvdnav_seek( hb_dvd_t * e, float f )
     // XXX the current version of libdvdnav can't seek outside the current
     // PGC. Check if the place we're seeking to is in a different
     // PGC. Position there & adjust the offset if so.
+    uint64_t pgc_offset = 0;
+    uint64_t chap_offset = 0;
     hb_chapter_t *pgc_change = hb_list_item(d->list_chapter, 0 );
     for ( ii = 0; ii < hb_list_count( d->list_chapter ); ++ii )
     {
         hb_chapter_t *chapter = hb_list_item( d->list_chapter, ii );
+        uint64_t chap_len = chapter->block_end - chapter->block_start + 1;
 
         if ( chapter->pgcn != pgc_change->pgcn )
         {
             // this chapter's in a different pgc from the previous - note the
             // change so we can make sector offset's be pgc relative.
+            pgc_offset = chap_offset;
             pgc_change = chapter;
         }
-        if ( chapter->block_start <= sector && sector <= chapter->block_end )
+        if ( chap_offset <= sector && sector < chap_offset + chap_len )
         {
             // this chapter contains the sector we want - see if it's in a
             // different pgc than the one we're currently in.
             int32_t title, pgcn, pgn;
             if (dvdnav_current_title_program( d->dvdnav, &title, &pgcn, &pgn ) != DVDNAV_STATUS_OK)
                 hb_log("dvdnav cur pgcn err: %s", dvdnav_err_to_string(d->dvdnav));
+            // If we find ourselves in a new title, it means a title
+            // transition was made while reading data.  Jumping between
+            // titles can cause the vm to get into a bad state.  So
+            // reset the vm in this case.
+            if ( d->title != title )
+                dvdnav_reset( d->dvdnav );
+
             if ( d->title != title || chapter->pgcn != pgcn )
             {
                 // this chapter is in a different pgc - switch to it.
@@ -907,9 +1414,10 @@ static int hb_dvdnav_seek( hb_dvd_t * e, float f )
                     hb_log("dvdnav prog play err: %s", dvdnav_err_to_string(d->dvdnav));
             }
             // seek sectors are pgc-relative so remove the pgc start sector.
-            sector -= pgc_change->block_start;
+            sector -= pgc_offset;
             break;
         }
+        chap_offset += chap_len;
     }
 
     // dvdnav will not let you seek or poll current position
@@ -921,7 +1429,7 @@ static int hb_dvdnav_seek( hb_dvd_t * e, float f )
         result = dvdnav_get_next_block( d->dvdnav, buf, &event, &len );
         if ( result == DVDNAV_STATUS_ERR )
         {
-            hb_log("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
+            hb_error("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
             return 0;
         }
         switch ( event )
@@ -987,7 +1495,7 @@ static int hb_dvdnav_read( hb_dvd_t * e, hb_buffer_t * b )
         result = dvdnav_get_next_block( d->dvdnav, b->data, &event, &len );
         if ( result == DVDNAV_STATUS_ERR )
         {
-            hb_log("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
+            hb_error("dvdnav: Read Error, %s", dvdnav_err_to_string(d->dvdnav));
             if (dvdnav_sector_search(d->dvdnav, 1, SEEK_CUR) != DVDNAV_STATUS_OK)
             {
                 hb_error( "dvd: dvdnav_sector_search failed - %s",
@@ -995,14 +1503,13 @@ static int hb_dvdnav_read( hb_dvd_t * e, hb_buffer_t * b )
                 return 0;
             }
             error_count++;
-            if (error_count > 10)
+            if (error_count > 500)
             {
-                hb_log("dvdnav: Error, too many consecutive read errors");
+                hb_error("dvdnav: Error, too many consecutive read errors");
                 return 0;
             }
             continue;
         }
-        error_count = 0;
         switch ( event )
         {
         case DVDNAV_BLOCK_OK:
@@ -1014,6 +1521,7 @@ static int hb_dvdnav_read( hb_dvd_t * e, hb_buffer_t * b )
             if (chapter > 1)
                 b->new_chap = chapter;
             chapter = 0;
+            error_count = 0;
             return 1;
 
         case DVDNAV_NOP:
@@ -1082,6 +1590,16 @@ static int hb_dvdnav_read( hb_dvd_t * e, hb_buffer_t * b )
             * event can be used to query such information only when
             * necessary and update the decoding/displaying accordingly. 
             */
+            {
+                int tt = 0, pgcn = 0, pgn = 0;
+
+                dvdnav_current_title_program(d->dvdnav, &tt, &pgcn, &pgn);
+                if (tt != d->title)
+                {
+                    // Transition to another title signals that we are done.
+                    return 0;
+                }
+            }
             break;
 
         case DVDNAV_CELL_CHANGE:
diff --git a/libhb/encac3.c b/libhb/encac3.c
new file mode 100644 (file)
index 0000000..5c45b98
--- /dev/null
@@ -0,0 +1,257 @@
+/* $Id: encac3.c,v 1.23 2005/10/13 23:47:06 titer Exp $
+
+   This file is part of the HandBrake source code.
+   Homepage: <http://handbrake.fr/>.
+   It may be used under the terms of the GNU General Public License. */
+
+#include "hb.h"
+#include "hbffmpeg.h"
+#include "downmix.h"
+
+struct hb_work_private_s
+{
+    hb_job_t       * job;
+    AVCodecContext * context;
+
+    int              out_discrete_channels;
+    unsigned long    input_samples;
+    unsigned long    output_bytes;
+    hb_list_t      * list;
+    uint8_t        * buf;
+    int16_t        * samples;
+};
+
+int  encac3Init( hb_work_object_t *, hb_job_t * );
+int  encac3Work( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
+void encac3Close( hb_work_object_t * );
+
+#define AC3_SAMPLES_PER_FRAME 1536
+#define AC3_MAX_CODED_FRAME_SIZE 3840
+
+hb_work_object_t hb_encac3 =
+{
+    WORK_ENCAC3,
+    "AC-3 encoder (libavcodec)",
+    encac3Init,
+    encac3Work,
+    encac3Close
+};
+
+int encac3Init( hb_work_object_t * w, hb_job_t * job )
+{
+    AVCodec * codec;
+    AVCodecContext * context;
+    hb_audio_t * audio = w->audio;
+
+    hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
+    w->private_data = pv;
+
+    pv->job = job;
+
+    pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
+    pv->input_samples = AC3_SAMPLES_PER_FRAME * pv->out_discrete_channels;
+    pv->output_bytes = AC3_MAX_CODED_FRAME_SIZE;
+
+    pv->buf = malloc( pv->input_samples * sizeof( float ) );
+    pv->samples = malloc( pv->input_samples * sizeof( int16_t ) );
+
+    codec = avcodec_find_encoder( CODEC_ID_AC3 );
+    if( !codec )
+    {
+        hb_log( "encac3Init: avcodec_find_encoder "
+                "failed" );
+    }
+    context = avcodec_alloc_context();
+
+    context->channel_layout = CH_LAYOUT_STEREO;
+    switch( audio->config.out.mixdown )
+    {
+        case HB_AMIXDOWN_MONO:
+            context->channel_layout = CH_LAYOUT_MONO;
+            break;
+
+        case HB_AMIXDOWN_STEREO:
+        case HB_AMIXDOWN_DOLBY:
+        case HB_AMIXDOWN_DOLBYPLII:
+            context->channel_layout = CH_LAYOUT_STEREO;
+            break;
+
+        case HB_AMIXDOWN_6CH:
+            context->channel_layout = CH_LAYOUT_5POINT0|CH_LOW_FREQUENCY;
+            break;
+
+        default:
+            hb_log(" encac3Init: bad mixdown" );
+            break;
+    }
+
+    context->bit_rate = audio->config.out.bitrate * 1000;
+    context->sample_rate = audio->config.out.samplerate;
+    context->channels = pv->out_discrete_channels;
+
+    if( hb_avcodec_open( context, codec ) )
+    {
+        hb_log( "encac3Init: avcodec_open failed" );
+    }
+    pv->context = context;
+
+    pv->list = hb_list_init();
+
+    return 0;
+}
+
+/***********************************************************************
+ * Close
+ ***********************************************************************
+ *
+ **********************************************************************/
+void encac3Close( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+
+    if ( pv )
+    {
+        if( pv->context )
+        {
+            hb_deep_log( 2, "encac3: closing libavcodec" );
+            if ( pv->context->codec )
+                avcodec_flush_buffers( pv->context );
+            hb_avcodec_close( pv->context );
+        }
+
+        if ( pv->buf )
+        {
+            free( pv->buf );
+            pv->buf = NULL;
+        }
+
+        if ( pv->samples )
+        {
+            free( pv->samples );
+            pv->samples = NULL;
+        }
+
+        if ( pv->list )
+            hb_list_empty( &pv->list );
+
+        free( pv );
+        w->private_data = NULL;
+    }
+}
+
+static hb_buffer_t * Encode( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+    uint64_t pts, pos;
+    hb_audio_t * audio = w->audio;
+    hb_buffer_t * buf;
+    int ii;
+
+    if( hb_list_bytes( pv->list ) < pv->input_samples * sizeof( float ) )
+    {
+        return NULL;
+    }
+
+    hb_list_getbytes( pv->list, pv->buf, pv->input_samples * sizeof( float ),
+                      &pts, &pos);
+
+    hb_chan_map_t *map = NULL;
+    if ( audio->config.in.codec == HB_ACODEC_AC3 )
+    {
+        map = &hb_ac3_chan_map;
+    }
+    else if ( audio->config.in.codec == HB_ACODEC_DCA )
+    {
+        map = &hb_qt_chan_map;
+    }
+    if ( map )
+    {
+        int layout;
+        switch (audio->config.out.mixdown)
+        {
+            case HB_AMIXDOWN_MONO:
+                layout = HB_INPUT_CH_LAYOUT_MONO;
+                break;
+            case HB_AMIXDOWN_STEREO:
+            case HB_AMIXDOWN_DOLBY:
+            case HB_AMIXDOWN_DOLBYPLII:
+                layout = HB_INPUT_CH_LAYOUT_STEREO;
+                break;
+            case HB_AMIXDOWN_6CH:
+            default:
+                layout = HB_INPUT_CH_LAYOUT_3F2R | HB_INPUT_CH_LAYOUT_HAS_LFE;
+                break;
+        }
+        hb_layout_remap( map, &hb_smpte_chan_map, layout, 
+                        (float*)pv->buf, AC3_SAMPLES_PER_FRAME);
+    }
+    
+    for (ii = 0; ii < pv->input_samples; ii++)
+    {
+        pv->samples[ii] = (int16_t)((float*)pv->buf)[ii];
+    }
+
+    buf = hb_buffer_init( pv->output_bytes );
+    buf->size = avcodec_encode_audio( pv->context, buf->data, buf->alloc,
+                                          pv->samples );
+
+    buf->start = pts + 90000 * pos / pv->out_discrete_channels / sizeof( float ) / audio->config.out.samplerate;
+    buf->stop  = buf->start + 90000 * AC3_SAMPLES_PER_FRAME / audio->config.out.samplerate;
+
+    buf->frametype = HB_FRAME_AUDIO;
+
+    if ( !buf->size )
+    {
+        hb_buffer_close( &buf );
+        return Encode( w );
+    }
+    else if (buf->size < 0)
+    {
+        hb_log( "encac3: avcodec_encode_audio failed" );
+        hb_buffer_close( &buf );
+        return NULL;
+    }
+
+    return buf;
+}
+
+/***********************************************************************
+ * Work
+ ***********************************************************************
+ *
+ **********************************************************************/
+int encac3Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                    hb_buffer_t ** buf_out )
+{
+    hb_work_private_t * pv = w->private_data;
+    hb_buffer_t * in = *buf_in, * buf;
+
+    if ( in->size <= 0 )
+    {
+        /* EOF on input - send it downstream & say we're done */
+        *buf_out = in;
+        *buf_in = NULL;
+       return HB_WORK_DONE;
+    }
+
+    if ( pv->context == NULL || pv->context->codec == NULL )
+    {
+        // No encoder context. Nothing we can do.
+        return HB_WORK_OK;
+    }
+
+    hb_list_add( pv->list, in );
+    *buf_in = NULL;
+
+    *buf_out = buf = Encode( w );
+
+    while ( buf )
+    {
+        buf->next = Encode( w );
+        buf = buf->next;
+    }
+
+    return HB_WORK_OK;
+}
+
+
index 22eb286..eaf7b70 100644 (file)
@@ -115,14 +115,10 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
                 job->anamorphic.par_width, job->anamorphic.par_height );
     }
 
-    if( job->mux & ( HB_MUX_MP4 | HB_MUX_PSP ) )
+    if( job->mux & HB_MUX_MP4 )
     {
         context->flags |= CODEC_FLAG_GLOBAL_HEADER;
     }
-    if( job->mux & HB_MUX_PSP )
-    {
-        context->flags |= CODEC_FLAG_BITEXACT;
-    }
     if( job->grayscale )
     {
         context->flags |= CODEC_FLAG_GRAY;
@@ -164,7 +160,7 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
     }
     pv->context = context;
 
-    if( ( job->mux & ( HB_MUX_MP4 | HB_MUX_PSP ) ) && job->pass != 1 )
+    if( ( job->mux & HB_MUX_MP4 ) && job->pass != 1 )
     {
 #if 0
         /* Hem hem */
@@ -235,13 +231,22 @@ int encavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     // doesn't do the trick.  It must be set in the AVFrame.
     frame->quality = pv->context->global_quality;
 
-    /* Should be way too large */
-    buf = hb_video_buffer_init( job->width, job->height );
-    buf->size = avcodec_encode_video( pv->context, buf->data, buf->alloc,
-                                      frame );
-    buf->start = in->start;
-    buf->stop  = in->stop;
-    buf->frametype   = pv->context->coded_frame->key_frame ? HB_FRAME_KEY : HB_FRAME_REF;
+    if ( pv->context->codec )
+    {
+        /* Should be way too large */
+        buf = hb_video_buffer_init( job->width, job->height );
+        buf->size = avcodec_encode_video( pv->context, buf->data, buf->alloc,
+                                          frame );
+        buf->start = in->start;
+        buf->stop  = in->stop;
+        buf->frametype   = pv->context->coded_frame->key_frame ? HB_FRAME_KEY : HB_FRAME_REF;
+    }
+    else
+    {
+        buf = NULL;
+        
+        hb_error( "encavcodec: codec context has uninitialized codec; skipping frame" );
+    }
 
     av_free( frame );
 
index c955199..c4a5710 100644 (file)
@@ -18,8 +18,8 @@ struct hb_work_private_s
     uint8_t       * buf;
     uint8_t       * obuf;
     hb_list_t     * list;
-    int64_t         pts;
-    int64_t         framedur;
+    double          pts;
+    double          framedur;
        int             out_discrete_channels;
 };
 
@@ -97,7 +97,7 @@ int encfaacInit( hb_work_object_t * w, hb_job_t * job )
                             &pv->input_samples, &pv->output_bytes );
     pv->buf  = malloc( pv->input_samples * sizeof( float ) );
     pv->obuf = malloc( pv->output_bytes );
-    pv->framedur = 90000LL * pv->input_samples /
+    pv->framedur = 90000.0 * pv->input_samples /
                    ( audio->config.out.samplerate * pv->out_discrete_channels );
 
     cfg                = faacEncGetCurrentConfiguration( pv->faac );
index 027aa3a..955aca6 100644 (file)
@@ -28,7 +28,7 @@ struct hb_work_private_s
     /* LAME handle */
     lame_global_flags * lame;
 
-    int             done;
+    int             out_discrete_channels;
     unsigned long   input_samples;
     unsigned long   output_bytes;
     uint8_t       * buf;
@@ -41,6 +41,7 @@ int enclameInit( hb_work_object_t * w, hb_job_t * job )
 {
     hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
     hb_audio_t * audio = w->audio;
+
     w->private_data = pv;
 
     pv->job   = job;
@@ -48,12 +49,30 @@ int enclameInit( hb_work_object_t * w, hb_job_t * job )
     hb_log( "enclame: opening libmp3lame" );
 
     pv->lame = lame_init();
-    lame_set_brate( pv->lame, audio->config.out.bitrate );
+    // use ABR
+    lame_set_VBR( pv->lame, vbr_abr );
+    lame_set_VBR_mean_bitrate_kbps( pv->lame, audio->config.out.bitrate );
     lame_set_in_samplerate( pv->lame, audio->config.out.samplerate );
     lame_set_out_samplerate( pv->lame, audio->config.out.samplerate );
+
+    pv->out_discrete_channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
+    // Lame's default encoding mode is JOINT_STEREO.  This subtracts signal
+    // that is "common" to left and right (within some threshold) and encodes
+    // it separately.  This improves quality at low bitrates, but hurts 
+    // imaging (channel separation) at higher bitrates.  So if the bitrate
+    // is suffeciently high, use regular STEREO mode.
+    if ( pv->out_discrete_channels == 1 )
+    {
+        lame_set_mode( pv->lame, MONO );
+        lame_set_num_channels( pv->lame, 1 );
+    }
+    else if ( audio->config.out.bitrate >= 128 )
+    {
+        lame_set_mode( pv->lame, STEREO );
+    }
     lame_init_params( pv->lame );
 
-    pv->input_samples = 1152 * 2;
+    pv->input_samples = 1152 * pv->out_discrete_channels;
     pv->output_bytes = LAME_MAXMP3BUFFER;
     pv->buf  = malloc( pv->input_samples * sizeof( float ) );
 
@@ -89,9 +108,9 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     hb_work_private_t * pv = w->private_data;
     hb_audio_t * audio = w->audio;
     hb_buffer_t * buf;
-    int16_t samples_s16[1152 * 2];
+    float samples[2][1152];
     uint64_t pts, pos;
-       int      i;
+    int      i, j;
 
     if( hb_list_bytes( pv->list ) < pv->input_samples * sizeof( float ) )
     {
@@ -101,16 +120,23 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     hb_list_getbytes( pv->list, pv->buf, pv->input_samples * sizeof( float ),
                       &pts, &pos);
 
-    for( i = 0; i < 1152 * 2; i++ )
+    memset(samples, 0, 2*1152*sizeof(float));
+    for( i = 0; i < 1152; i++ )
     {
-        samples_s16[i] = ((float*) pv->buf)[i];
+        for( j = 0; j < pv->out_discrete_channels; j++ )
+        {
+            samples[j][i] = ((float *) pv->buf)[(pv->out_discrete_channels * i + j)];
+        }
     }
 
     buf        = hb_buffer_init( pv->output_bytes );
-    buf->start = pts + 90000 * pos / 2 / sizeof( float ) / audio->config.out.samplerate;
+    buf->start = pts + 90000 * pos / pv->out_discrete_channels / sizeof( float ) / audio->config.out.samplerate;
     buf->stop  = buf->start + 90000 * 1152 / audio->config.out.samplerate;
-    buf->size  = lame_encode_buffer_interleaved( pv->lame, samples_s16,
+    pv->pts = buf->stop;
+    buf->size  = lame_encode_buffer_float( 
+            pv->lame, samples[0], samples[1],
             1152, buf->data, LAME_MAXMP3BUFFER );
+
     buf->frametype   = HB_FRAME_AUDIO;
 
     if( !buf->size )
@@ -126,7 +152,6 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
         hb_buffer_close( &buf );
         return NULL;
     }
-
     return buf;
 }
 
@@ -139,33 +164,39 @@ int enclameWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                  hb_buffer_t ** buf_out )
 {
     hb_work_private_t * pv = w->private_data;
+    hb_audio_t * audio = w->audio;
     hb_buffer_t * in = *buf_in;
     hb_buffer_t * buf;
 
     if ( (*buf_in)->size <= 0 )
     {
         /* EOF on input - send it downstream & say we're done */
-        if ( pv->done )
+
+        buf = hb_buffer_init( pv->output_bytes );
+        buf->size = lame_encode_flush( pv->lame, buf->data, LAME_MAXMP3BUFFER );
+        buf->start = pv->pts;
+        buf->stop  = buf->start + 90000 * 1152 / audio->config.out.samplerate;
+        buf->frametype   = HB_FRAME_AUDIO;
+        if( buf->size <= 0 )
+        {
+            hb_buffer_close( &buf );
+        }
+
+        // Add the flushed data
+        *buf_out = buf;
+
+        // Add the eof
+        if ( buf )
         {
-            *buf_out = *buf_in;
-            *buf_in = NULL;
-            return HB_WORK_DONE;
+            buf->next = in;
         }
         else
         {
-            pv->done = 1;
-            hb_fifo_push( w->fifo_in, in);
-            *buf_in = NULL;
-
-            buf = hb_buffer_init( pv->output_bytes );
-            buf->size = lame_encode_flush( pv->lame, buf->data, LAME_MAXMP3BUFFER );
-            if( buf->size <= 0 )
-            {
-                hb_buffer_close( &buf );
-            }
-            *buf_out = buf;
-            return HB_WORK_OK;
+            *buf_out = in;
         }
+
+        *buf_in = NULL;
+        return HB_WORK_DONE;
     }
 
     hb_list_add( pv->list, *buf_in );
index ce27ea0..f483a09 100644 (file)
@@ -68,6 +68,12 @@ int encvorbisInit( hb_work_object_t * w, hb_job_t * job )
     }
 
     /* init */
+    for( i = 0; i < 3; i++ )
+    {
+        // Zero vorbis headers so that we don't crash in mk_laceXiph
+        // when vorbis_encode_setup_managed fails.
+        memset( w->config->vorbis.headers[i], 0, sizeof( ogg_packet ) );
+    }
     vorbis_info_init( &pv->vi );
     if( vorbis_encode_setup_managed( &pv->vi, pv->out_discrete_channels,
           audio->config.out.samplerate, -1, 1000 * audio->config.out.bitrate, -1 ) )
index bd41839..270692c 100644 (file)
@@ -48,14 +48,13 @@ struct hb_work_private_s
     hb_job_t       * job;
     x264_t         * x264;
     x264_picture_t   pic_in;
-    uint8_t         *x264_allocated_pic;
+    uint8_t        * grey_data;
 
     uint32_t       frames_in;
     uint32_t       frames_out;
     uint32_t       frames_split; // number of frames we had to split
     int            chap_mark;   // saved chap mark when we're propagating it
     int64_t        last_stop;   // Debugging - stop time of previous input frame
-    int64_t        init_delay;
     int64_t        next_chap;
 
     struct {
@@ -86,59 +85,32 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
 
     x264_param_default( &param );
     
-    /* Default weightp to off for baseline,
-       overridable through x264 option strings. */
-    if( job->x264opts != NULL && *job->x264opts != '\0' )
-    {
-        char *x264opts, *x264opts_start;
-    
-        x264opts = x264opts_start = strdup(job->x264opts);
-    
-        while( x264opts_start && *x264opts )
-        {
-            char *name = x264opts;
-            char *value;
-    
-            x264opts += strcspn( x264opts, ":" );
-            if( *x264opts )
-            {
-                *x264opts = 0;
-                x264opts++;
-            }
-    
-            value = strchr( name, '=' );
-            if( value )
-            {
-                *value = 0;
-                value++;
-            }
-    
-            /*
-               When B-frames are enabled, the max frame count increments
-               by 1 (regardless of the number of B-frames). If you don't
-               change the duration of the video track when you mux, libmp4
-               barfs.  So, check if the x264opts aren't using B-frames, and
-               when they aren't, set the boolean job->areBframes as false.
-             */
-            if( !( strcmp( name, "bframes" ) ) )
-            {
-                if( atoi( value ) == 0 )
-                {
-                    param.analyse.i_weighted_pred = X264_WEIGHTP_NONE;
-                }
-            }
-        }
-    }
-    
     /* Enable metrics */
     param.analyse.b_psnr = 1;
     param.analyse.b_ssim = 1;
+
+    /* QuickTime has trouble with very low QPs (resulting in visual artifacts).
+     * Known to affect QuickTime 7, QuickTime X and iTunes.
+     * Testing shows that a qpmin of 3 works.
+     */
+    param.rc.i_qp_min = 3;
     
     param.i_threads    = ( hb_get_cpu_count() * 3 / 2 );
     param.i_width      = job->width;
     param.i_height     = job->height;
     param.i_fps_num    = job->vrate;
     param.i_fps_den    = job->vrate_base;
+    if ( job->cfr == 1 )
+    {
+        param.i_timebase_num   = 0;
+        param.i_timebase_den   = 0;
+        param.b_vfr_input = 0;
+    }
+    else
+    {
+        param.i_timebase_num   = 1;
+        param.i_timebase_den   = 90000;
+    }
 
     /* Disable annexb. Inserts size into nal header instead of start code */
     param.b_annexb     = 0;
@@ -154,36 +126,17 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
                we still want the same keyframe intervals as the 1st pass,
                so the 1st pass stats won't conflict on frame decisions.    */
             hb_interjob_t * interjob = hb_interjob_get( job->h );
-            param.i_keyint_min     = ( interjob->vrate / interjob->vrate_base ) + 1;
-            param.i_keyint_max = ( 10 * interjob->vrate / interjob->vrate_base ) + 1;
+            param.i_keyint_max = 10 * (int)( (double)interjob->vrate / (double)interjob->vrate_base + 0.5 );
         }
         else
         {
-            int fps = job->vrate / job->vrate_base;
-
-            /* adjust +1 when fps has remainder to bump
+            /* adjust +0.5 for when fps has remainder to bump
                { 23.976, 29.976, 59.94 } to { 24, 30, 60 } */
-            if (job->vrate % job->vrate_base)
-                fps += 1;
-
-            param.i_keyint_min = fps;
-            param.i_keyint_max = fps * 10;
+            param.i_keyint_max = 10 * (int)( (double)job->vrate / (double)job->vrate_base + 0.5 );
         }
-        
-        hb_log("encx264: keyint-min: %i, keyint-max: %i", param.i_keyint_min, param.i_keyint_max);
     }
 
     param.i_log_level  = X264_LOG_INFO;
-    if( job->h264_level )
-    {
-        param.b_cabac     = 0;
-        param.i_level_idc = job->h264_level;
-        hb_log( "encx264: encoding at level %i",
-                param.i_level_idc );
-    }
-
-    /* B-frames are on by default.*/
-    job->areBframes = 1;
     
     /*
                This section passes the string x264opts to libx264 for parsing into
@@ -226,45 +179,6 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
                 value++;
             }
 
-            /*
-               When B-frames are enabled, the max frame count increments
-               by 1 (regardless of the number of B-frames). If you don't
-               change the duration of the video track when you mux, libmp4
-               barfs.  So, check if the x264opts aren't using B-frames, and
-               when they aren't, set the boolean job->areBframes as false.
-             */
-            if( !( strcmp( name, "bframes" ) ) )
-            {
-                if( atoi( value ) == 0 )
-                {
-                    job->areBframes = 0;
-                }
-            }
-
-            /* Note b-pyramid here, so the initial delay can be doubled */
-            if( !( strcmp( name, "b-pyramid" ) ) )
-            {
-                if( value != NULL )
-                {
-                    if( atoi( value ) > 0 )
-                    {
-                        job->areBframes = 2;
-                    }
-                }
-                else
-                {
-                    job->areBframes = 2;
-                }
-                if( value == NULL || !strcmp( value, "1" ) )
-                {
-                    value = "normal";
-                }
-                else if( !strcmp( value, "0" ) )
-                {
-                    value = "none";
-                }
-            }
-
             /* Here's where the strings are passed to libx264 for parsing. */
             ret = x264_param_parse( &param, name, value );
 
@@ -276,6 +190,47 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
         }
         free(x264opts_start);
     }
+    
+    /* B-frames are on by default.*/
+    job->areBframes = 1;
+    
+    if( param.i_bframe && param.i_bframe_pyramid )
+    {
+        /* Note b-pyramid here, so the initial delay can be doubled */
+        job->areBframes = 2;
+    }
+    else if( !param.i_bframe )
+    {
+        /*
+         When B-frames are enabled, the max frame count increments
+         by 1 (regardless of the number of B-frames). If you don't
+         change the duration of the video track when you mux, libmp4
+         barfs.  So, check if the x264opts aren't using B-frames, and
+         when they aren't, set the boolean job->areBframes as false.
+         */
+        job->areBframes = 0;
+    }
+    
+    if( param.i_keyint_min != X264_KEYINT_MIN_AUTO || param.i_keyint_max != 250 )
+    {
+        int min_auto;
+
+        if ( param.i_fps_num / param.i_fps_den < param.i_keyint_max / 10 )
+            min_auto = param.i_fps_num / param.i_fps_den;
+        else
+            min_auto = param.i_keyint_max / 10;
+
+        char min[40], max[40];
+        param.i_keyint_min == X264_KEYINT_MIN_AUTO ? 
+            snprintf( min, 40, "auto (%d)", min_auto ) : 
+            snprintf( min, 40, "%d", param.i_keyint_min );
+
+        param.i_keyint_max == X264_KEYINT_MAX_INFINITE ? 
+            snprintf( max, 40, "infinite" ) : 
+            snprintf( max, 40, "%d", param.i_keyint_max );
+
+        hb_log( "encx264: min-keyint: %s, keyint: %s", min, max );
+    }
 
     /* set up the VUI color model & gamma to match what the COLR atom
      * set in muxmp4.c says. See libhb/muxmp4.c for notes. */
@@ -358,56 +313,27 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
     x264_encoder_headers( pv->x264, &nal, &nal_count );
 
     /* Sequence Parameter Set */
-    memcpy(w->config->h264.sps, nal[1].p_payload + 4, nal[1].i_payload - 4);
-    w->config->h264.sps_length = nal[1].i_payload - 4;
+    memcpy(w->config->h264.sps, nal[0].p_payload + 4, nal[0].i_payload - 4);
+    w->config->h264.sps_length = nal[0].i_payload - 4;
 
     /* Picture Parameter Set */
-    memcpy(w->config->h264.pps, nal[2].p_payload + 4, nal[2].i_payload - 4);
-    w->config->h264.pps_length = nal[2].i_payload - 4;
+    memcpy(w->config->h264.pps, nal[1].p_payload + 4, nal[1].i_payload - 4);
+    w->config->h264.pps_length = nal[1].i_payload - 4;
 
-    x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
-                        job->width, job->height );
+    x264_picture_init( &pv->pic_in );
 
+    pv->pic_in.img.i_csp = X264_CSP_I420;
+    pv->pic_in.img.i_plane = 3;
+    pv->pic_in.img.i_stride[0] = job->width;
     pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
-    pv->x264_allocated_pic = pv->pic_in.img.plane[0];
 
-    if (job->areBframes)
+    if( job->grayscale )
     {
-        /* Basic initDelay value is the clockrate divided by the FPS
-           -- the length of one frame in clockticks.                  */
-        pv->init_delay = 90000. / ((double)job->vrate / (double)job->vrate_base);
-
-        /* 23.976-length frames are 3753.75 ticks long on average but the DVD
-           creates that average rate by repeating 59.95 fields so the max
-           frame size is actually 4504.5 (3 field times). The field durations
-           are computed based on quantized times (see below) so we need an extra
-           two ticks to account for the rounding. */
-        if (pv->init_delay == 3753)
-            pv->init_delay = 4507;
-
-        /* frame rates are not exact in the DVD 90KHz PTS clock (they are
-           exact in the DVD 27MHz system clock but we never see that) so the
-           rates computed above are all +-1 due to quantization. Worst case
-           is when a clock-rounded-down frame is adjacent to a rounded-up frame
-           which makes one of the frames 2 ticks longer than the nominal
-           frame time. */
-        pv->init_delay += 2;
-
-        /* For VFR, libhb sees the FPS as 29.97, but the longest frames
-           will use the duration of frames running at 23.976fps instead.
-           Since detelecine occasionally makes mistakes and since we have
-           to deal with some really horrible timing jitter from mkvs and
-           mp4s encoded with low resolution clocks, make the delay very
-           conservative if we're not doing CFR. */
-        if ( job->cfr != 1 )
-        {
-            pv->init_delay *= 2;
-        }
-
-        /* The delay is 1 frames for regular b-frames, 2 for b-pyramid. */
-        pv->init_delay *= job->areBframes;
+        int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
+        pv->grey_data = malloc( uvsize );
+        memset( pv->grey_data, 0x80, uvsize );
+        pv->pic_in.img.plane[1] = pv->pic_in.img.plane[2] = pv->grey_data;
     }
-    w->config->h264.init_delay = pv->init_delay;
 
     return 0;
 }
@@ -421,12 +347,7 @@ void encx264Close( hb_work_object_t * w )
         hb_log( "encx264: %u frames had to be split (%u in, %u out)",
                 pv->frames_split, pv->frames_in, pv->frames_out );
     }
-    /*
-     * Patch the x264 allocated data back in so that x264 can free it
-     * we have been using our own buffers during the encode to avoid copying.
-     */
-    pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
-    x264_picture_clean( &pv->pic_in );
+    free( pv->grey_data );
     x264_encoder_close( pv->x264 );
     free( pv );
     w->private_data = NULL;
@@ -466,6 +387,11 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
     int64_t duration  = get_frame_duration( pv, pic_out->i_pts );
     buf->start = pic_out->i_pts;
     buf->stop  = pic_out->i_pts + duration;
+    buf->renderOffset = pic_out->i_dts;
+    if ( !w->config->h264.init_delay && pic_out->i_dts < 0 )
+    {
+        w->config->h264.init_delay = -pic_out->i_dts;
+    }
 
     /* Encode all the NALs we were given into buf.
        NOTE: This code assumes one video frame per NAL (but there can
@@ -482,16 +408,6 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
             continue;
         }
 
-        if( job->mux & HB_MUX_AVI )
-        {
-            if( nal[i].i_ref_idc == NAL_PRIORITY_HIGHEST )
-            {
-                buf->frametype = HB_FRAME_KEY;
-            }
-            buf->size += size;
-            continue;
-        }
-
         /* H.264 in .mp4 or .mkv */
         switch( nal[i].i_type )
         {
@@ -581,13 +497,7 @@ static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
     pv->pic_in.img.plane[0] = in->data;
 
     int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
-    if( job->grayscale )
-    {
-        /* XXX x264 has currently no option for grayscale encoding */
-        memset( pv->pic_in.img.plane[1], 0x80, uvsize );
-        memset( pv->pic_in.img.plane[2], 0x80, uvsize );
-    }
-    else
+    if( !job->grayscale )
     {
         /* Point x264 at our buffers (Y)UV data */
         pv->pic_in.img.plane[1] = in->data + job->width * job->height;
@@ -613,7 +523,6 @@ static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
     {
         pv->pic_in.i_type = X264_TYPE_AUTO;
     }
-    pv->pic_in.i_qpplus1 = 0;
 
     /* XXX this is temporary debugging code to check that the upstream
      * modules (render & sync) have generated a continuous, self-consistent
@@ -663,10 +572,12 @@ int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
         x264_nal_t *nal;
         hb_buffer_t *last_buf = NULL;
 
-        while (1)
+        while ( x264_encoder_delayed_frames( pv->x264 ) )
         {
             x264_encoder_encode( pv->x264, &nal, &i_nal, NULL, &pic_out );
-            if ( i_nal <= 0 )
+            if ( i_nal == 0 )
+                continue;
+            if ( i_nal < 0 )
                 break;
 
             hb_buffer_t *buf = nal_encode( w, &pic_out, i_nal, nal );
@@ -692,62 +603,7 @@ int encx264Work( hb_work_object_t * w, hb_buffer_t ** buf_in,
 
     // Not EOF - encode the packet & wrap it in a NAL
     ++pv->frames_in;
-
-    // if we're re-ordering frames, check if this frame is too large to reorder
-    if ( pv->init_delay && in->stop - in->start > pv->init_delay )
-    {
-        // This frame's duration is larger than the time allotted for b-frame
-        // reordering. That means that if it's used as a reference the decoder
-        // won't be able to move it early enough to render it in correct
-        // sequence & the playback will have odd jumps & twitches. To make
-        // sure this doesn't happen we pretend this frame is multiple
-        // frames, each with duration <= init_delay. Since each of these
-        // new frames contains the same image the visual effect is identical
-        // to the original but the resulting stream can now be coded without
-        // error. We take advantage of the fact that x264 buffers frame
-        // data internally to feed the same image into the encoder multiple
-        // times, just changing its start & stop times each time.
-        ++pv->frames_split;
-        int64_t orig_stop = in->stop;
-        int64_t new_stop = in->start;
-        hb_buffer_t *last_buf = NULL;
-
-        // We want to spread the new frames uniformly over the total time
-        // so that we don't end up with a very short frame at the end.
-        // In the number of pieces calculation we add in init_delay-1 to
-        // round up but not add an extra piece if the frame duration is
-        // a multiple of init_delay. The final increment of frame_dur is
-        // to restore the bits that got truncated by the divide on the
-        // previous line. If we don't do this we end up with an extra tiny
-        // frame at the end whose duration is npieces-1.
-        int64_t frame_dur = orig_stop - new_stop;
-        int64_t npieces = ( frame_dur + pv->init_delay - 1 ) / pv->init_delay;
-        frame_dur /= npieces;
-        ++frame_dur;
-
-        while ( in->start < orig_stop )
-        {
-            new_stop += frame_dur;
-            if ( new_stop > orig_stop )
-                new_stop = orig_stop;
-            in->stop = new_stop;
-            hb_buffer_t *buf = x264_encode( w, in );
-            if ( buf )
-            {
-                ++pv->frames_out;
-                if ( last_buf == NULL )
-                    *buf_out = buf;
-                else
-                    last_buf->next = buf;
-                last_buf = buf;
-            }
-            in->start = new_stop;
-        }
-    }
-    else
-    {
-        ++pv->frames_out;
-        *buf_out = x264_encode( w, in );
-    }
+    ++pv->frames_out;
+    *buf_out = x264_encode( w, in );
     return HB_WORK_OK;
 }
index 48f6459..a29e846 100644 (file)
 #include <malloc.h>
 #endif
 
+#define FIFO_TIMEOUT 200
+
 /* Fifo */
 struct hb_fifo_s
 {
     hb_lock_t    * lock;
+    hb_cond_t    * cond_full;
+    int            wait_full;
+    hb_cond_t    * cond_empty;
+    int            wait_empty;
     uint32_t       capacity;
+    uint32_t       thresh;
     uint32_t       size;
     uint32_t       buffer_size;
     hb_buffer_t  * first;
@@ -51,7 +58,7 @@ void hb_buffer_pool_init( void )
     int i;
     for ( i = 10; i < 26; ++i )
     {
-        buffers.pool[i] = hb_fifo_init(BUFFER_POOL_MAX_ELEMENTS);
+        buffers.pool[i] = hb_fifo_init(BUFFER_POOL_MAX_ELEMENTS, 1);
         buffers.pool[i]->buffer_size = 1 << i;
     }
     /* requests smaller than 2^10 are satisfied from the 2^10 pool. */
@@ -195,14 +202,19 @@ void hb_buffer_close( hb_buffer_t ** _b )
         return;
     }
     /* either the pool is full or this size doesn't use a pool - free the buf */
-    if( b->data )
+    while( b )
     {
-        free( b->data );
-        hb_lock(buffers.lock);
-        buffers.allocated -= b->alloc;
-        hb_unlock(buffers.lock);
+        hb_buffer_t * next = b->next;
+        if( b->data )
+        {
+            free( b->data );
+            hb_lock(buffers.lock);
+            buffers.allocated -= b->alloc;
+            hb_unlock(buffers.lock);
+        }
+        free( b );
+        b = next;
     }
-    free( b );
     *_b = NULL;
 }
 
@@ -215,16 +227,36 @@ void hb_buffer_copy_settings( hb_buffer_t * dst, const hb_buffer_t * src )
     dst->flags     = src->flags;
 }
 
-hb_fifo_t * hb_fifo_init( int capacity )
+hb_fifo_t * hb_fifo_init( int capacity, int thresh )
 {
     hb_fifo_t * f;
-    f           = calloc( sizeof( hb_fifo_t ), 1 );
-    f->lock     = hb_lock_init();
-    f->capacity = capacity;
+    f             = calloc( sizeof( hb_fifo_t ), 1 );
+    f->lock       = hb_lock_init();
+    f->cond_full  = hb_cond_init();
+    f->cond_empty = hb_cond_init();
+    f->capacity   = capacity;
+    f->thresh     = thresh;
     f->buffer_size = 0;
     return f;
 }
 
+int hb_fifo_size_bytes( hb_fifo_t * f )
+{
+    int ret = 0;
+    hb_buffer_t * link;
+
+    hb_lock( f->lock );
+    link = f->first;
+    while ( link )
+    {
+        ret += link->size;
+        link = link->next;
+    }
+    hb_unlock( f->lock );
+
+    return ret;
+}
+
 int hb_fifo_size( hb_fifo_t * f )
 {
     int ret;
@@ -258,6 +290,35 @@ float hb_fifo_percent_full( hb_fifo_t * f )
     return ret;
 }
 
+hb_buffer_t * hb_fifo_get_wait( hb_fifo_t * f )
+{
+    hb_buffer_t * b;
+
+    hb_lock( f->lock );
+    if( f->size < 1 )
+    {
+        f->wait_empty = 1;
+        hb_cond_timedwait( f->cond_empty, f->lock, FIFO_TIMEOUT );
+        if( f->size < 1 )
+        {
+            hb_unlock( f->lock );
+            return NULL;
+        }
+    }
+    b         = f->first;
+    f->first  = b->next;
+    b->next   = NULL;
+    f->size  -= 1;
+    if( f->wait_full && f->size == f->capacity - f->thresh )
+    {
+        f->wait_full = 0;
+        hb_cond_signal( f->cond_full );
+    }
+    hb_unlock( f->lock );
+
+    return b;
+}
+
 hb_buffer_t * hb_fifo_get( hb_fifo_t * f )
 {
     hb_buffer_t * b;
@@ -272,6 +333,32 @@ hb_buffer_t * hb_fifo_get( hb_fifo_t * f )
     f->first  = b->next;
     b->next   = NULL;
     f->size  -= 1;
+    if( f->wait_full && f->size == f->capacity - f->thresh )
+    {
+        f->wait_full = 0;
+        hb_cond_signal( f->cond_full );
+    }
+    hb_unlock( f->lock );
+
+    return b;
+}
+
+hb_buffer_t * hb_fifo_see_wait( hb_fifo_t * f )
+{
+    hb_buffer_t * b;
+
+    hb_lock( f->lock );
+    if( f->size < 1 )
+    {
+        f->wait_empty = 1;
+        hb_cond_timedwait( f->cond_empty, f->lock, FIFO_TIMEOUT );
+        if( f->size < 1 )
+        {
+            hb_unlock( f->lock );
+            return NULL;
+        }
+    }
+    b = f->first;
     hb_unlock( f->lock );
 
     return b;
@@ -309,6 +396,57 @@ hb_buffer_t * hb_fifo_see2( hb_fifo_t * f )
     return b;
 }
 
+int hb_fifo_full_wait( hb_fifo_t * f )
+{
+    int result;
+
+    hb_lock( f->lock );
+    if( f->size >= f->capacity )
+    {
+        f->wait_full = 1;
+        hb_cond_timedwait( f->cond_full, f->lock, FIFO_TIMEOUT );
+    }
+    result = ( f->size < f->capacity );
+    hb_unlock( f->lock );
+    return result;
+}
+
+void hb_fifo_push_wait( hb_fifo_t * f, hb_buffer_t * b )
+{
+    if( !b )
+    {
+        return;
+    }
+
+    hb_lock( f->lock );
+    if( f->size >= f->capacity )
+    {
+        f->wait_full = 1;
+        hb_cond_timedwait( f->cond_full, f->lock, FIFO_TIMEOUT );
+    }
+    if( f->size > 0 )
+    {
+        f->last->next = b;
+    }
+    else
+    {
+        f->first = b;
+    }
+    f->last  = b;
+    f->size += 1;
+    while( f->last->next )
+    {
+        f->size += 1;
+        f->last  = f->last->next;
+    }
+    if( f->wait_empty && f->size >= f->thresh )
+    {
+        f->wait_empty = 0;
+        hb_cond_signal( f->cond_empty );
+    }
+    hb_unlock( f->lock );
+}
+
 void hb_fifo_push( hb_fifo_t * f, hb_buffer_t * b )
 {
     if( !b )
@@ -332,6 +470,11 @@ void hb_fifo_push( hb_fifo_t * f, hb_buffer_t * b )
         f->size += 1;
         f->last  = f->last->next;
     }
+    if( f->wait_empty && f->size >= f->thresh )
+    {
+        f->wait_empty = 0;
+        hb_cond_signal( f->cond_empty );
+    }
     hb_unlock( f->lock );
 }
 
@@ -384,7 +527,25 @@ void hb_fifo_close( hb_fifo_t ** _f )
     }
 
     hb_lock_close( &f->lock );
+    hb_cond_close( &f->cond_empty );
+    hb_cond_close( &f->cond_full );
     free( f );
 
     *_f = NULL;
 }
+
+void hb_fifo_flush( hb_fifo_t * f )
+{
+    hb_buffer_t * b;
+
+    while( ( b = hb_fifo_get( f ) ) )
+    {
+        hb_buffer_close( &b );
+    }
+    hb_lock( f->lock );
+    hb_cond_signal( f->cond_empty );
+    hb_cond_signal( f->cond_full );
+    hb_unlock( f->lock );
+
+}
+
index 34fe53b..da09ea0 100644 (file)
@@ -1,8 +1,20 @@
 #include "hb.h"
 #include "hbffmpeg.h"
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#if defined( SYS_MINGW )
+#include <io.h>
+#if defined( PTW32_STATIC_LIB )
+#include <pthread.h>
+#endif
+#endif
 
 struct hb_handle_s
 {
+    int            id;
+    
     /* The "Check for update" thread */
     int            build;
     char           version[32];
@@ -38,6 +50,7 @@ struct hb_handle_s
     /* For MacGui active queue
        increments each time the scan thread completes*/
     int            scanCount;
+    volatile int   scan_die;
     
     /* Stash of persistent data between jobs, for stuff
        like correcting frame count and framerate estimates
@@ -48,8 +61,11 @@ struct hb_handle_s
 
 hb_lock_t *hb_avcodec_lock;
 hb_work_object_t * hb_objects = NULL;
+int hb_instance_counter = 0;
+int hb_process_initialized = 0;
 
 static void thread_func( void * );
+hb_title_t * hb_get_title_by_index( hb_handle_t *, int );
 
 void hb_avcodec_init()
 {
@@ -66,6 +82,50 @@ int hb_avcodec_open(AVCodecContext *avctx, AVCodec *codec)
     return ret;
 }
 
+int hb_av_find_stream_info(AVFormatContext *ic)
+{
+    int ret;
+    hb_lock( hb_avcodec_lock );
+    ret = av_find_stream_info( ic );
+    hb_unlock( hb_avcodec_lock );
+    return ret;
+}
+
+struct SwsContext*
+hb_sws_get_context(int srcW, int srcH, enum PixelFormat srcFormat,
+                   int dstW, int dstH, enum PixelFormat dstFormat,
+                   int flags)
+{
+    struct SwsContext * ctx;
+
+#if 0
+    // sws_getContext is being depricated.  But it appears that
+    // the new method isn't quite wrung out yet.  So when it is
+    // this code should be fixed up and enabled.
+    ctx = sws_alloc_context();
+    if ( ctx )
+    {
+        av_set_int(ctx, "srcw", srcW);
+        av_set_int(ctx, "srch", srcH);
+        av_set_int(ctx, "src_format", srcFormat);
+        av_set_int(ctx, "dstw", dstW);
+        av_set_int(ctx, "dsth", dstH);
+        av_set_int(ctx, "dst_format", dstFormat);
+        av_set_int(ctx, "sws_flags", flags);
+
+        if (sws_init_context(ctx, NULL, NULL) < 0) {
+            fprintf(stderr, "Cannot initialize resampling context\n");
+            sws_freeContext(ctx);
+            ctx = NULL;
+        } 
+    }
+#else
+    ctx = sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, 
+                         flags, NULL, NULL, NULL);
+#endif
+    return ctx;
+}
+
 int hb_avcodec_close(AVCodecContext *avctx)
 {
     int ret;
@@ -75,6 +135,99 @@ int hb_avcodec_close(AVCodecContext *avctx)
     return ret;
 }
 
+int hb_ff_layout_xlat(int64_t ff_channel_layout, int channels)
+{
+    int hb_layout;
+
+    switch (ff_channel_layout)
+    {
+        case CH_LAYOUT_MONO:
+            hb_layout = HB_INPUT_CH_LAYOUT_MONO;
+            break;
+        case CH_LAYOUT_STEREO:
+            hb_layout = HB_INPUT_CH_LAYOUT_STEREO;
+            break;
+        case CH_LAYOUT_SURROUND:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F;
+            break;
+        case CH_LAYOUT_4POINT0:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F1R;
+            break;
+        case CH_LAYOUT_2_2:
+            hb_layout = HB_INPUT_CH_LAYOUT_2F2R;
+            break;
+        case CH_LAYOUT_QUAD:
+            hb_layout = HB_INPUT_CH_LAYOUT_2F2R;
+            break;
+        case CH_LAYOUT_5POINT0:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R;
+            break;
+        case CH_LAYOUT_5POINT1:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE;
+            break;
+        case CH_LAYOUT_5POINT0_BACK:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R;
+            break;
+        case CH_LAYOUT_5POINT1_BACK:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE;
+            break;
+        case CH_LAYOUT_7POINT0:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F4R;
+            break;
+        case CH_LAYOUT_7POINT1:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE;
+            break;
+        case CH_LAYOUT_STEREO_DOWNMIX:
+            hb_layout = HB_INPUT_CH_LAYOUT_STEREO;
+            break;
+        default:
+            hb_layout = HB_INPUT_CH_LAYOUT_STEREO;
+            break;
+    }
+    // Now make sure the chosen layout agrees with the number of channels
+    // ffmpeg tells us there are.  It seems ffmpeg is sometimes confused
+    // about this. So we will make a best guess based on the number
+    // of channels.
+    int chans = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT( hb_layout );
+    if ( chans == channels )
+    {
+        return hb_layout;
+    }
+    hb_log( "Channels reported by ffmpeg (%d) != computed layout channels (%d).", channels, chans );
+    switch (channels)
+    {
+        case 1:
+            hb_layout = HB_INPUT_CH_LAYOUT_MONO;
+            break;
+        case 2:
+            hb_layout = HB_INPUT_CH_LAYOUT_STEREO;
+            break;
+        case 3:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F;
+            break;
+        case 4:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F1R;
+            break;
+        case 5:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R;
+            break;
+        case 6:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F2R|HB_INPUT_CH_LAYOUT_HAS_LFE;
+            break;
+        case 7:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F4R;
+            break;
+        case 8:
+            hb_layout = HB_INPUT_CH_LAYOUT_3F4R|HB_INPUT_CH_LAYOUT_HAS_LFE;
+            break;
+        default:
+            hb_log("Unsupported number of audio channels (%d).\n", channels);
+            hb_layout = 0;
+            break;
+    }
+    return hb_layout;
+}
+
 /**
  * Registers work objects, by adding the work object to a liked list.
  * @param w Handle to hb_work_object_t to register.
@@ -86,6 +239,45 @@ void hb_register( hb_work_object_t * w )
 }
 
 /**
+ * Ensures that the process has been initialized.
+ */
+static void process_init()
+{
+    if (!hb_process_initialized)
+    {
+#if defined( SYS_MINGW ) && defined( PTW32_STATIC_LIB )
+        pthread_win32_process_attach_np();
+#endif
+
+#if defined( _WIN32 ) || defined( __MINGW32__ )
+        setvbuf( stdout, NULL, _IONBF, 0 );
+        setvbuf( stderr, NULL, _IONBF, 0 );
+#endif
+        hb_process_initialized = 1;
+    }
+    
+}
+
+void (*hb_log_callback)(const char* message);
+static void redirect_thread_func(void *);
+
+#if defined( SYS_MINGW )
+#define pipe(phandles)  _pipe (phandles, 4096, _O_BINARY)
+#endif
+
+/**
+ * Registers the given function as a logger. All logs will be passed to it.
+ * @param log_cb The function to register as a logger.
+ */
+void hb_register_logger( void (*log_cb)(const char* message) )
+{
+    process_init();
+
+    hb_log_callback = log_cb;
+    hb_thread_init("ioredirect", redirect_thread_func, NULL, HB_NORMAL_PRIORITY);
+}
+
+/**
  * libhb initialization routine.
  * @param verbose HB_DEBUG_NONE or HB_DEBUG_ALL.
  * @param update_check signals libhb to check for updated version from HandBrake website.
@@ -93,6 +285,8 @@ void hb_register( hb_work_object_t * w )
  */
 hb_handle_t * hb_init( int verbose, int update_check )
 {
+    process_init();
+
     hb_handle_t * h = calloc( sizeof( hb_handle_t ), 1 );
     uint64_t      date;
 
@@ -100,7 +294,9 @@ hb_handle_t * hb_init( int verbose, int update_check )
     global_verbosity_level = verbose;
     if( verbose )
         putenv( "HB_DEBUG=1" );
-
+    
+    h->id = hb_instance_counter++;
+    
     /* Check for an update on the website if asked to */
     h->build = -1;
 
@@ -157,12 +353,16 @@ hb_handle_t * hb_init( int verbose, int update_check )
     h->die         = 0;
     h->main_thread = hb_thread_init( "libhb", thread_func, h,
                                      HB_NORMAL_PRIORITY );
-    hb_register( &hb_sync );
+    hb_register( &hb_sync_video );
+    hb_register( &hb_sync_audio );
        hb_register( &hb_decmpeg2 );
        hb_register( &hb_decvobsub );
     hb_register( &hb_encvobsub );
     hb_register( &hb_deccc608 );
     hb_register( &hb_decsrtsub );
+    hb_register( &hb_decutf8sub );
+    hb_register( &hb_dectx3gsub );
+    hb_register( &hb_decssasub );
        hb_register( &hb_render );
        hb_register( &hb_encavcodec );
        hb_register( &hb_encx264 );
@@ -177,10 +377,12 @@ hb_handle_t * hb_init( int verbose, int update_check )
        hb_register( &hb_encfaac );
        hb_register( &hb_enclame );
        hb_register( &hb_encvorbis );
+       hb_register( &hb_muxer );
 #ifdef __APPLE__
        hb_register( &hb_encca_aac );
 #endif
-
+       hb_register( &hb_encac3 );
+    
     return h;
 }
 
@@ -202,6 +404,8 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
         putenv( "HB_DEBUG=1" );
     }
 
+    h->id = hb_instance_counter++;
+
     /* Check for an update on the website if asked to */
     h->build = -1;
 
@@ -254,12 +458,16 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
     h->main_thread = hb_thread_init( "libhb", thread_func, h,
                                      HB_NORMAL_PRIORITY );
 
-    hb_register( &hb_sync );
+    hb_register( &hb_sync_video );
+    hb_register( &hb_sync_audio );
        hb_register( &hb_decmpeg2 );
        hb_register( &hb_decvobsub );
     hb_register( &hb_encvobsub );
     hb_register( &hb_deccc608 );
     hb_register( &hb_decsrtsub );
+    hb_register( &hb_decutf8sub );
+    hb_register( &hb_dectx3gsub );
+    hb_register( &hb_decssasub );
        hb_register( &hb_render );
        hb_register( &hb_encavcodec );
        hb_register( &hb_encx264 );
@@ -274,9 +482,11 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
        hb_register( &hb_encfaac );
        hb_register( &hb_enclame );
        hb_register( &hb_encvorbis );
+       hb_register( &hb_muxer );
 #ifdef __APPLE__
        hb_register( &hb_encca_aac );
 #endif
+       hb_register( &hb_encac3 );
 
        return h;
 }
@@ -322,7 +532,7 @@ int hb_check_update( hb_handle_t * h, char ** version )
 void hb_set_cpu_count( hb_handle_t * h, int cpu_count )
 {
     cpu_count    = MAX( 1, cpu_count );
-    cpu_count    = MIN( cpu_count, 8 );
+    cpu_count    = MIN( cpu_count, 64 );
     h->cpu_count = cpu_count;
 }
 
@@ -340,7 +550,7 @@ void hb_remove_previews( hb_handle_t * h )
     struct dirent * entry;
 
     memset( dirname, 0, 1024 );
-    hb_get_tempory_directory( h, dirname );
+    hb_get_temporary_directory( dirname );
     dir = opendir( dirname );
     if (dir == NULL) return;
 
@@ -354,7 +564,7 @@ void hb_remove_previews( hb_handle_t * h )
         for( i = 0; i < count; i++ )
         {
             title = hb_list_item( h->list_title, i );
-            len = snprintf( filename, 1024, "%" PRIxPTR, (intptr_t) title );
+            len = snprintf( filename, 1024, "%d_%d", h->id, title->index );
             if (strncmp(entry->d_name, filename, len) == 0)
             {
                 snprintf( filename, 1024, "%s/%s", dirname, entry->d_name );
@@ -375,10 +585,12 @@ void hb_remove_previews( hb_handle_t * h )
  * @param store_previews Whether or not to write previews to disk.
  */
 void hb_scan( hb_handle_t * h, const char * path, int title_index,
-              int preview_count, int store_previews )
+              int preview_count, int store_previews, uint64_t min_duration )
 {
     hb_title_t * title;
 
+    h->scan_die = 0;
+
     /* Clean up from previous scan */
     hb_remove_previews( h );
     while( ( title = hb_list_item( h->list_title, 0 ) ) )
@@ -388,8 +600,9 @@ void hb_scan( hb_handle_t * h, const char * path, int title_index,
     }
 
     hb_log( "hb_scan: path=%s, title_index=%d", path, title_index );
-    h->scan_thread = hb_scan_init( h, path, title_index, h->list_title,
-                                   preview_count, store_previews );
+    h->scan_thread = hb_scan_init( h, &h->scan_die, path, title_index, 
+                                   h->list_title, preview_count, 
+                                   store_previews, min_duration );
 }
 
 /**
@@ -405,9 +618,27 @@ hb_list_t * hb_get_titles( hb_handle_t * h )
 /**
  * Create preview image of desired title a index of picture.
  * @param h Handle to hb_handle_t.
+ * @param title_index Index of the title to get the preview for (1-based).
+ * @param picture Index in title.
+ * @param buffer Handle to buffer were image will be drawn.
+ */
+void hb_get_preview_by_index( hb_handle_t * h, int title_index, int picture, uint8_t * buffer )
+{
+    hb_title_t * title;
+
+    title = hb_get_title_by_index( h, title_index );
+    if ( title != NULL )
+    {
+        hb_get_preview( h, title, picture, buffer );
+    } 
+}
+
+/**
+ * Create preview image of desired title a index of picture.
+ * @param h Handle to hb_handle_t.
  * @param title Handle to hb_title_t of desired title.
  * @param picture Index in title.
- * @param buffer Handle to buufer were inage will be drawn.
+ * @param buffer Handle to buffer were image will be drawn.
  */
 void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
                      uint8_t * buffer )
@@ -420,19 +651,20 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     AVPicture            pic_in, pic_preview, pic_deint, pic_crop, pic_scale;
     struct SwsContext  * context;
     int                  i;
+    int                  deint_width = ((title->width + 7) >> 3) << 3;
     int                  rgb_width = ((job->width + 7) >> 3) << 3;
     int                  preview_size;
 
     swsflags = SWS_LANCZOS | SWS_ACCURATE_RND;
 
     buf1 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
-    buf2 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
+    buf2 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, deint_width, title->height ) );
     buf3 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, rgb_width, job->height ) );
     buf4 = av_malloc( avpicture_get_size( PIX_FMT_RGB32, rgb_width, job->height ) );
     avpicture_fill( &pic_in, buf1, PIX_FMT_YUV420P,
                     title->width, title->height );
     avpicture_fill( &pic_deint, buf2, PIX_FMT_YUV420P,
-                    title->width, title->height );
+                    deint_width, title->height );
     avpicture_fill( &pic_scale, buf3, PIX_FMT_YUV420P,
                     rgb_width, job->height );
     avpicture_fill( &pic_preview, buf4, PIX_FMT_RGB32,
@@ -442,8 +674,8 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
 
     memset( filename, 0, 1024 );
 
-    hb_get_tempory_filename( h, filename, "%" PRIxPTR "%d",
-                             (intptr_t) title, picture );
+    hb_get_tempory_filename( h, filename, "%d_%d_%d",
+                             h->id, title->index, picture );
 
     file = fopen( filename, "rb" );
     if( !file )
@@ -468,11 +700,11 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     }
 
     // Get scaling context
-    context = sws_getContext(title->width  - (job->crop[2] + job->crop[3]),
+    context = hb_sws_get_context(title->width  - (job->crop[2] + job->crop[3]),
                              title->height - (job->crop[0] + job->crop[1]),
                              PIX_FMT_YUV420P,
                              job->width, job->height, PIX_FMT_YUV420P,
-                             swsflags, NULL, NULL, NULL);
+                             swsflags);
 
     // Scale
     sws_scale(context,
@@ -484,9 +716,9 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     sws_freeContext( context );
 
     // Get preview context
-    context = sws_getContext(rgb_width, job->height, PIX_FMT_YUV420P,
+    context = hb_sws_get_context(rgb_width, job->height, PIX_FMT_YUV420P,
                               rgb_width, job->height, PIX_FMT_RGB32,
-                              swsflags, NULL, NULL, NULL);
+                              swsflags);
 
     // Create preview
     sws_scale(context,
@@ -609,13 +841,13 @@ int hb_detect_comb( hb_buffer_t * buf, int width, int height, int color_equal, i
     if( average_cc > threshold )
     {
 #if 0
-            hb_log("Average %i combed (Threshold %i) %i/%i/%i | PTS: %lld (%fs) %s", average_cc, threshold, cc[0], cc[1], cc[2], buf->start, (float)buf->start / 90000, (buf->flags & 16) ? "Film" : "Video" );
+            hb_log("Average %i combed (Threshold %i) %i/%i/%i | PTS: %"PRId64" (%fs) %s", average_cc, threshold, cc[0], cc[1], cc[2], buf->start, (float)buf->start / 90000, (buf->flags & 16) ? "Film" : "Video" );
 #endif
         return 1;
     }
 
 #if 0
-    hb_log("SKIPPED Average %i combed (Threshold %i) %i/%i/%i | PTS: %lld (%fs) %s", average_cc, threshold, cc[0], cc[1], cc[2], buf->start, (float)buf->start / 90000, (buf->flags & 16) ? "Film" : "Video" );
+    hb_log("SKIPPED Average %i combed (Threshold %i) %i/%i/%i | PTS: %"PRId64" (%fs) %s", average_cc, threshold, cc[0], cc[1], cc[2], buf->start, (float)buf->start / 90000, (buf->flags & 16) ? "Film" : "Video" );
 #endif
 
     /* Reaching this point means no combing detected. */
@@ -626,11 +858,31 @@ int hb_detect_comb( hb_buffer_t * buf, int width, int height, int color_equal, i
 /**
  * Calculates job width and height for anamorphic content,
  *
+ * @param h Instance handle
+ * @param title_index Index of the title/job to inspect (1-based).
+ * @param output_width Pointer to returned storage width
+ * @param output_height Pointer to returned storage height
+ * @param output_par_width Pointer to returned pixel width
+ * @param output_par_height Pointer to returned pixel height
+ */
+void hb_set_anamorphic_size_by_index( hb_handle_t * h, int title_index,
+        int *output_width, int *output_height,
+        int *output_par_width, int *output_par_height )
+{
+    hb_title_t * title;
+    title = hb_get_title_by_index( h, title_index );
+    
+    hb_set_anamorphic_size( title->job, output_width, output_height, output_par_width, output_par_height );
+}
+
+/**
+ * Calculates job width and height for anamorphic content,
+ *
  * @param job Handle to hb_job_t
  * @param output_width Pointer to returned storage width
  * @param output_height Pointer to returned storage height
  * @param output_par_width Pointer to returned pixel width
param output_par_height Pointer to returned pixel height
* @param output_par_height Pointer to returned pixel height
  */
 void hb_set_anamorphic_size( hb_job_t * job,
         int *output_width, int *output_height,
@@ -641,7 +893,7 @@ void hb_set_anamorphic_size( hb_job_t * job,
     int cropped_width = title->width - job->crop[2] - job->crop[3] ;
     int cropped_height = title->height - job->crop[0] - job->crop[1] ;
     double storage_aspect = (double)cropped_width / (double)cropped_height;
-    int mod = job->anamorphic.modulus ? job->anamorphic.modulus : 16;
+    int mod = job->modulus ? job->modulus : 16;
     double aspect = title->aspect;
     
     int pixel_aspect_width  = job->anamorphic.par_width;
@@ -702,14 +954,21 @@ void hb_set_anamorphic_size( hb_job_t * job,
         - 3: Power user anamorphic, specify everything
     */
     int width, height;
+    int maxWidth, maxHeight;
+
+    maxWidth = MULTIPLE_MOD_DOWN( job->maxWidth, mod );
+    maxHeight = MULTIPLE_MOD_DOWN( job->maxHeight, mod );
+
     switch( job->anamorphic.mode )
     {
         case 1:
             /* Strict anamorphic */
-            *output_width = cropped_width;
-            *output_height = cropped_height;
-            *output_par_width = title->pixel_aspect_width;
-            *output_par_height = title->pixel_aspect_height;
+            *output_width  = MULTIPLE_MOD( cropped_width, 2 );
+            *output_height = MULTIPLE_MOD( cropped_height, 2 );
+            // adjust the source PAR for new width/height
+            // new PAR = source PAR * ( old width / new_width ) * ( new_height / old_height )
+            pixel_aspect_width = title->pixel_aspect_width * cropped_width * (*output_height);            
+            pixel_aspect_height = title->pixel_aspect_height * (*output_width) * cropped_height;
         break;
 
         case 2:
@@ -728,33 +987,30 @@ void hb_set_anamorphic_size( hb_job_t * job,
                If not, set job height to job width divided by storage aspect.
             */
 
-            if ( job->maxWidth && (job->maxWidth < job->width) )
-                width = job->maxWidth;
-
             /* Time to get picture width that divide cleanly.*/
             width  = MULTIPLE_MOD( width, mod);
 
-            /* Verify these new dimensions don't violate max height and width settings */
-            if ( job->maxWidth && (job->maxWidth < job->width) )
-                width = job->maxWidth;
+            if ( maxWidth && (maxWidth < job->width) )
+                width = maxWidth;
 
+            /* Verify these new dimensions don't violate max height and width settings */
             height = ((double)width / storage_aspect) + 0.5;
-            
-            if ( job->maxHeight && (job->maxHeight < height) )
-                height = job->maxHeight;
 
             /* Time to get picture height that divide cleanly.*/
             height = MULTIPLE_MOD( height, mod);
-
-            /* Verify these new dimensions don't violate max height and width settings */
-            if ( job->maxHeight && (job->maxHeight < height) )
-                height = job->maxHeight;
+            
+            if ( maxHeight && (maxHeight < height) )
+            {
+                height = maxHeight;
+                width = ((double)height * storage_aspect) + 0.5;
+                width  = MULTIPLE_MOD( width, mod);
+            }
 
             /* The film AR is the source's display width / cropped source height.
                The output display width is the output height * film AR.
                The output PAR is the output display width / output storage width. */
-            pixel_aspect_width = height * source_display_width / cropped_height;
-            pixel_aspect_height = width;
+            pixel_aspect_width = height * cropped_width * pixel_aspect_width;
+            pixel_aspect_height = width * cropped_height * pixel_aspect_height;
 
             /* Pass the results back to the caller */
             *output_width = width;
@@ -766,28 +1022,42 @@ void hb_set_anamorphic_size( hb_job_t * job,
                - Set everything based on specified values */
             
             /* Use specified storage dimensions */
+            storage_aspect = (double)job->width / (double)job->height;
             width = job->width;
             height = job->height;
             
-            /* Bind to max dimensions */
-            if( job->maxWidth && width > job->maxWidth )
-                width = job->maxWidth;
-            if( job->maxHeight && height > job->maxHeight )
-                height = job->maxHeight;
-            
             /* Time to get picture dimensions that divide cleanly.*/
             width  = MULTIPLE_MOD( width, mod);
             height = MULTIPLE_MOD( height, mod);
             
-            /* Verify we're still within max dimensions */
-            if( job->maxWidth && width > job->maxWidth )
-                width = job->maxWidth - (mod/2);
-            if( job->maxHeight && height > job->maxHeight )
-                height = job->maxHeight - (mod/2);
-                
-            /* Re-ensure we have picture dimensions that divide cleanly. */
-            width  = MULTIPLE_MOD( width, mod );
-            height = MULTIPLE_MOD( height, mod );
+            /* Bind to max dimensions */
+            if( maxWidth && width > maxWidth )
+            {
+                width = maxWidth;
+                // If we are keeping the display aspect, then we are going
+                // to be modifying the PAR anyway.  So it's preferred
+                // to let the width/height stray some from the original
+                // requested storage aspect.
+                //
+                // But otherwise, PAR and DAR will change the least
+                // if we stay as close as possible to the requested
+                // storage aspect.
+                if ( !job->anamorphic.keep_display_aspect )
+                {
+                    height = ((double)width / storage_aspect) + 0.5;
+                    height = MULTIPLE_MOD( height, mod);
+                }
+            }
+            if( maxHeight && height > maxHeight )
+            {
+                height = maxHeight;
+                // Ditto, see comment above
+                if ( !job->anamorphic.keep_display_aspect )
+                {
+                    width = ((double)height * storage_aspect) + 0.5;
+                    width  = MULTIPLE_MOD( width, mod);
+                }
+            }
             
             /* That finishes the storage dimensions. On to display. */            
             if( job->anamorphic.dar_width && job->anamorphic.dar_height )
@@ -946,6 +1216,53 @@ hb_job_t * hb_current_job( hb_handle_t * h )
 }
 
 /**
+ * Applies information from the given job to the official job instance.
+ * @param h Handle to hb_handle_t.
+ * @param title_index Index of the title to apply the chapter name to (1-based).
+ * @param chapter The chapter to apply the name to (1-based).
+ * @param job Job information to apply.
+ */
+void hb_set_chapter_name( hb_handle_t * h, int title_index, int chapter_index, const char * chapter_name )
+{
+    hb_title_t * title;
+    title = hb_get_title_by_index( h, title_index );
+    
+    hb_chapter_t * chapter = hb_list_item( title->list_chapter, chapter_index - 1 );
+    
+    strncpy(chapter->title, chapter_name, 1023);
+    chapter->title[1023] = '\0';
+}
+
+/**
+ * Applies information from the given job to the official job instance.
+ * Currently only applies information needed for anamorphic size calculation and previews.
+ * @param h Handle to hb_handle_t.
+ * @param title_index Index of the title to apply the job information to (1-based).
+ * @param job Job information to apply.
+ */
+void hb_set_job( hb_handle_t * h, int title_index, hb_job_t * job )
+{
+       int i;
+
+    hb_title_t * title;
+    title = hb_get_title_by_index( h, title_index );
+    
+    hb_job_t * job_target = title->job;
+    
+    job_target->deinterlace = job->deinterlace;
+    job_target->width = job->width;
+    job_target->height = job->height;
+    job_target->maxWidth = job->maxWidth;
+    job_target->maxHeight = job->maxHeight;
+    for (i = 0; i < 4; i++)
+    {
+        job_target->crop[i] = job->crop[i];
+    }
+       
+    job_target->anamorphic = job->anamorphic;
+}
+
+/**
  * Adds a job to the job list.
  * @param h Handle to hb_handle_t.
  * @param job Handle to hb_job_t.
@@ -957,6 +1274,7 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
     hb_chapter_t  * chapter,  * chapter_copy;
     hb_audio_t    * audio;
     hb_subtitle_t * subtitle, * subtitle_copy;
+    hb_attachment_t * attachment;
     int             i;
     char            audio_lang[4];
 
@@ -1004,7 +1322,6 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
 
     /* Copy the audio track(s) we want */
     title_copy->list_audio = hb_list_init();
-
     for( i = 0; i < hb_list_count(job->list_audio); i++ )
     {
         if( ( audio = hb_list_item( job->list_audio, i ) ) )
@@ -1013,7 +1330,18 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
         }
     }
 
+    /* Initialize subtitle list - filled out further below */
     title_copy->list_subtitle = hb_list_init();
+    
+    /* Copy all the attachments */
+    title_copy->list_attachment = hb_list_init();
+    for( i = 0; i < hb_list_count(title->list_attachment); i++ )
+    {
+        if( ( attachment = hb_list_item( title->list_attachment, i ) ) )
+        {
+            hb_list_add( title_copy->list_attachment, hb_attachment_copy(attachment) );
+        }
+    }
 
     /*
      * The following code is confusing, there are two ways in which
@@ -1238,6 +1566,66 @@ void hb_stop( hb_handle_t * h )
 }
 
 /**
+ * Stops the conversion process.
+ * @param h Handle to hb_handle_t.
+ */
+void hb_scan_stop( hb_handle_t * h )
+{
+    h->scan_die = 1;
+
+    h->job_count = hb_count(h);
+    h->job_count_permanent = 0;
+
+    hb_resume( h );
+}
+
+/**
+ * Gets a filter object with the given type and settings.
+ * @param filter_id The type of filter to get.
+ * @param settings The filter settings to use.
+ * @returns The requested filter object.
+ */
+hb_filter_object_t * hb_get_filter_object(int filter_id, const char * settings)
+{
+    if (filter_id == HB_FILTER_ROTATE)
+    {
+        hb_filter_rotate.settings = (char*)settings;
+        return &hb_filter_rotate;
+    }
+
+    if (filter_id == HB_FILTER_DETELECINE)
+    {
+        hb_filter_detelecine.settings = (char*)settings;
+        return &hb_filter_detelecine;
+    }
+
+    if (filter_id == HB_FILTER_DECOMB)
+    {
+        hb_filter_decomb.settings = (char*)settings;
+        return &hb_filter_decomb;
+    }
+
+    if (filter_id == HB_FILTER_DEINTERLACE)
+    {
+        hb_filter_deinterlace.settings = (char*)settings;
+        return &hb_filter_deinterlace;
+    }
+
+    if (filter_id == HB_FILTER_DEBLOCK)
+    {
+        hb_filter_deblock.settings = (char*)settings;
+        return &hb_filter_deblock;
+    }
+
+    if (filter_id == HB_FILTER_DENOISE)
+    {
+        hb_filter_denoise.settings = (char*)settings;
+        return &hb_filter_denoise;
+    }
+    return NULL;
+}
+
+/**
  * Returns the state of the conversion process.
  * @param h Handle to hb_handle_t.
  * @param s Handle to hb_state_t which to copy the state data.
@@ -1281,6 +1669,7 @@ void hb_close( hb_handle_t ** _h )
     hb_title_t * title;
 
     h->die = 1;
+    
     hb_thread_close( &h->main_thread );
 
     while( ( title = hb_list_item( h->list_title, 0 ) ) )
@@ -1298,9 +1687,41 @@ void hb_close( hb_handle_t ** _h )
     hb_list_close( &h->jobs );
     hb_lock_close( &h->state_lock );
     hb_lock_close( &h->pause_lock );
+
     free( h );
     *_h = NULL;
+}
 
+/**
+ * Cleans up libhb at a process level. Call before the app closes. Removes preview directory.
+ */
+void hb_global_close()
+{
+    char dirname[1024];
+    DIR * dir;
+    struct dirent * entry;
+    
+    /* Find and remove temp folder */
+    memset( dirname, 0, 1024 );
+    hb_get_temporary_directory( dirname );
+
+    dir = opendir( dirname );
+    if (dir)
+    {
+        while( ( entry = readdir( dir ) ) )
+        {
+            char filename[1024];
+            if( entry->d_name[0] == '.' )
+            {
+                continue;
+            }
+            memset( filename, 0, 1024 );
+            snprintf( filename, 1023, "%s/%s", dirname, entry->d_name );
+            unlink( filename );
+        }
+        closedir( dir );
+        rmdir( dirname );
+    }
 }
 
 /**
@@ -1313,14 +1734,12 @@ static void thread_func( void * _h )
 {
     hb_handle_t * h = (hb_handle_t *) _h;
     char dirname[1024];
-    DIR * dir;
-    struct dirent * entry;
 
     h->pid = getpid();
 
     /* Create folder for temporary files */
     memset( dirname, 0, 1024 );
-    hb_get_tempory_directory( h, dirname );
+    hb_get_temporary_directory( dirname );
 
     hb_mkdir( dirname );
 
@@ -1340,8 +1759,24 @@ static void thread_func( void * _h )
         {
             hb_thread_close( &h->scan_thread );
 
-            hb_log( "libhb: scan thread found %d valid title(s)",
-                    hb_list_count( h->list_title ) );
+            if ( h->scan_die )
+            {
+                hb_title_t * title;
+
+                hb_remove_previews( h );
+                while( ( title = hb_list_item( h->list_title, 0 ) ) )
+                {
+                    hb_list_rem( h->list_title, title );
+                    hb_title_close( &title );
+                }
+
+                hb_log( "hb_scan: canceled" );
+            }
+            else
+            {
+                hb_log( "libhb: scan thread found %d valid title(s)",
+                        hb_list_count( h->list_title ) );
+            }
             hb_lock( h->state_lock );
             h->state.state = HB_STATE_SCANDONE; //originally state.state
                        hb_unlock( h->state_lock );
@@ -1371,29 +1806,40 @@ static void thread_func( void * _h )
         hb_snooze( 50 );
     }
 
+    if( h->scan_thread )
+    {
+        hb_scan_stop( h );
+        hb_thread_close( &h->scan_thread );
+    }
     if( h->work_thread )
     {
         hb_stop( h );
         hb_thread_close( &h->work_thread );
     }
+    hb_remove_previews( h );
+}
 
-    /* Remove temp folder */
-    dir = opendir( dirname );
-    if (dir)
+/**
+ * Redirects stderr to the registered callback
+ * function.
+ * @param _data Unused.
+ */
+static void redirect_thread_func(void * _data)
+{
+    int pfd[2];
+    pipe(pfd);
+#if defined( SYS_MINGW )
+    // dup2 doesn't work on windows for some stupid reason
+    stderr->_file = pfd[1];
+#else
+    dup2(pfd[1], /*stderr*/ 2);
+#endif
+    FILE * log_f = fdopen(pfd[0], "rb");
+    
+    char line_buffer[500];
+    while(fgets(line_buffer, 500, log_f) != NULL)
     {
-        while( ( entry = readdir( dir ) ) )
-        {
-            char filename[1024];
-            if( entry->d_name[0] == '.' )
-            {
-                continue;
-            }
-            memset( filename, 0, 1024 );
-            snprintf( filename, 1023, "%s/%s", dirname, entry->d_name );
-            unlink( filename );
-        }
-        closedir( dir );
-        rmdir( dirname );
+        hb_log_callback(line_buffer);
     }
 }
 
@@ -1407,6 +1853,39 @@ int hb_get_pid( hb_handle_t * h )
 }
 
 /**
+ * Returns the id for the given instance.
+ * @param h Handle to hb_handle_t
+ * @returns The ID for the given instance
+ */
+int hb_get_instance_id( hb_handle_t * h )
+{
+    return h->id;
+}
+
+/**
+ * Returns the title with the given title index.
+ * @param h Handle to hb_handle_t
+ * @param title_index the index of the title to get
+ * @returns The requested title
+ */
+hb_title_t * hb_get_title_by_index( hb_handle_t * h, int title_index )
+{
+    hb_title_t * title;
+    int i;
+       int count = hb_list_count( h->list_title );
+    for (i = 0; i < count; i++)
+    {
+        title = hb_list_item( h->list_title, i );
+        if (title->index == title_index)
+        {
+            return title;
+        }
+    }
+    
+    return NULL;
+}
+
+/**
  * Sets the current state.
  * @param h Handle to hb_handle_t
  * @param s Handle to new hb_state_t
@@ -1416,7 +1895,8 @@ void hb_set_state( hb_handle_t * h, hb_state_t * s )
     hb_lock( h->pause_lock );
     hb_lock( h->state_lock );
     memcpy( &h->state, s, sizeof( hb_state_t ) );
-    if( h->state.state == HB_STATE_WORKING )
+    if( h->state.state == HB_STATE_WORKING ||
+        h->state.state == HB_STATE_SEARCHING )
     {
         /* XXX Hack */
         if (h->job_count < 1)
index 234d4b5..6de2fcb 100644 (file)
@@ -14,6 +14,7 @@ extern "C" {
 #define HB_DEBUG_NONE 0
 #define HB_DEBUG_ALL  1
 void          hb_register( hb_work_object_t * );
+void          hb_register_logger( void (*log_cb)(const char* message) );
 hb_handle_t * hb_init( int verbose, int update_check );
 hb_handle_t * hb_init_dl ( int verbose, int update_check ); // hb_init for use with dylib
 
@@ -41,7 +42,10 @@ void          hb_dvd_set_dvdnav( int enable );
    a VOB file. If title_index is 0, scan all titles. */
 void          hb_scan( hb_handle_t *, const char * path,
                        int title_index, int preview_count,
-                       int store_previews );
+                       int store_previews, uint64_t min_duration );
+void          hb_scan_stop( hb_handle_t * );
+hb_filter_object_t * hb_get_filter_object(int filter_id, const char * settings);
+uint64_t      hb_first_duration( hb_handle_t * );
 
 /* hb_get_titles()
    Returns the list of valid titles detected by the latest scan. */
@@ -52,16 +56,22 @@ hb_list_t   * hb_get_titles( hb_handle_t * );
    Taken from Thomas Oestreich's 32detect filter in the Transcode project.  */
 int hb_detect_comb( hb_buffer_t * buf, int width, int height, int color_equal, int color_diff, int threshold, int prog_equal, int prog_diff, int prog_threshold );
 
+void          hb_get_preview_by_index( hb_handle_t *, int, int, uint8_t * );
 void          hb_get_preview( hb_handle_t *, hb_title_t *, int,
                               uint8_t * );
 void          hb_set_size( hb_job_t *, double ratio, int pixels );
+void          hb_set_anamorphic_size_by_index( hb_handle_t *, int,
+                int *output_width, int *output_height,
+                int *output_par_width, int *output_par_height );
 void          hb_set_anamorphic_size( hb_job_t *,
                 int *output_width, int *output_height,
-                int *output_par_width, int *output_par_height);
+                int *output_par_width, int *output_par_height );
 
 /* Handling jobs */
 int           hb_count( hb_handle_t * );
 hb_job_t *    hb_job( hb_handle_t *, int );
+void          hb_set_chapter_name( hb_handle_t *, int, int, const char * );
+void          hb_set_job( hb_handle_t *, int, hb_job_t * );
 void          hb_add( hb_handle_t *, hb_job_t * );
 void          hb_rem( hb_handle_t *, hb_job_t * );
 
@@ -98,6 +108,14 @@ int hb_get_scancount( hb_handle_t * );
    Aborts all current jobs if any, frees memory. */
 void          hb_close( hb_handle_t ** );
 
+/* hb_global_close()
+   Performs final cleanup for the process. */
+void          hb_global_close();
+
+/* hb_get_instance_id()
+   Return the unique instance id of an libhb instance created by hb_init. */
+int hb_get_instance_id( hb_handle_t * h );
+
 #ifdef __cplusplus
 }
 #endif
index e0a7634..9953aa7 100644 (file)
@@ -9,3 +9,9 @@
 void hb_avcodec_init(void);
 int hb_avcodec_open( AVCodecContext *, struct AVCodec * );
 int hb_avcodec_close( AVCodecContext * );
+int hb_av_find_stream_info(AVFormatContext *ic);
+int hb_ff_layout_xlat(int64_t ff_layout, int channels);
+struct SwsContext*
+hb_sws_get_context(int srcW, int srcH, enum PixelFormat srcFormat,
+                   int dstW, int dstH, enum PixelFormat dstFormat,
+                   int flags);
index 9a03074..335c9a8 100644 (file)
@@ -38,19 +38,38 @@ void hb_set_state( hb_handle_t *, hb_state_t * );
 /***********************************************************************
  * fifo.c
  **********************************************************************/
+/*
+ * Holds a packet of data that is moving through the transcoding process.
+ * 
+ * May have metadata associated with it via extra fields
+ * that are conditionally used depending on the type of packet.
+ */
 struct hb_buffer_s
 {
-    int           size;
-    int           alloc;
-    uint8_t *     data;
-    int           cur;
-
+    int           size;     // size of this packet
+    int           alloc;    // used internally by the packet allocator (hb_buffer_init)
+    uint8_t *     data;     // packet data
+    int           cur;      // used internally by packet lists (hb_list_t)
+
+    /*
+     * Corresponds to the order that this packet was read from the demuxer.
+     * 
+     * It is important that video decoder work-objects pass this value through
+     * from their input packets to the output packets they generate. Otherwise
+     * RENDERSUB subtitles (especially VOB subtitles) will break.
+     * 
+     * Subtitle decoder work-objects that output a renderable subtitle
+     * format (ex: PICTURESUB) must also be careful to pass the sequence number
+     * through for the same reason.
+     */
     int64_t       sequence;
 
-    int           id;
-    int64_t       start;
-    int64_t       stop;
-    int           new_chap;
+    enum { AUDIO_BUF, VIDEO_BUF, SUBTITLE_BUF, OTHER_BUF } type;
+
+    int           id;           // ID of the track that the packet comes from
+    int64_t       start;        // Video and subtitle packets: start time of frame/subtitle
+    int64_t       stop;         // Video and subtitle packets: stop time of frame/subtitle
+    int           new_chap;     // Video packets: if non-zero, is the index of the chapter whose boundary was crossed
 
 #define HB_FRAME_IDR    0x01
 #define HB_FRAME_I      0x02
@@ -66,13 +85,21 @@ struct hb_buffer_s
     /* Holds the output PTS from x264, for use by b-frame offsets in muxmp4.c */
     int64_t     renderOffset;
 
+    // PICTURESUB subtitle packets:
+    //   Location and size of the subpicture.
     int           x;
     int           y;
     int           width;
     int           height;
+    hb_buffer_t * next_subpicture;
 
+    // Video packets (after processing by the hb_sync_video work-object):
+    //   A (copy of a) PICTURESUB subtitle packet that needs to be burned into this video packet by the hb_render work-object.
+    //   Subtitles that are simply passed thru are NOT attached to the associated video packets.
     hb_buffer_t * sub;
 
+    // Packets in a list:
+    //   the next packet in the list
     hb_buffer_t * next;
 };
 
@@ -85,16 +112,22 @@ void          hb_buffer_close( hb_buffer_t ** );
 void          hb_buffer_copy_settings( hb_buffer_t * dst,
                                        const hb_buffer_t * src );
 
-hb_fifo_t   * hb_fifo_init();
+hb_fifo_t   * hb_fifo_init( int capacity, int thresh );
 int           hb_fifo_size( hb_fifo_t * );
+int           hb_fifo_size_bytes( hb_fifo_t * );
 int           hb_fifo_is_full( hb_fifo_t * );
 float         hb_fifo_percent_full( hb_fifo_t * f );
 hb_buffer_t * hb_fifo_get( hb_fifo_t * );
+hb_buffer_t * hb_fifo_get_wait( hb_fifo_t * );
 hb_buffer_t * hb_fifo_see( hb_fifo_t * );
+hb_buffer_t * hb_fifo_see_wait( hb_fifo_t * );
 hb_buffer_t * hb_fifo_see2( hb_fifo_t * );
 void          hb_fifo_push( hb_fifo_t *, hb_buffer_t * );
+void          hb_fifo_push_wait( hb_fifo_t *, hb_buffer_t * );
+int           hb_fifo_full_wait( hb_fifo_t * f );
 void          hb_fifo_push_head( hb_fifo_t *, hb_buffer_t * );
 void          hb_fifo_close( hb_fifo_t ** );
+void          hb_fifo_flush( hb_fifo_t * f );
 
 // this routine gets a buffer for an uncompressed YUV420 video frame
 // with dimensions width x height.
@@ -131,18 +164,24 @@ static inline void hb_buffer_swap_copy( hb_buffer_t *src, hb_buffer_t *dst )
  * Threads: update.c, scan.c, work.c, reader.c, muxcommon.c
  **********************************************************************/
 hb_thread_t * hb_update_init( int * build, char * version );
-hb_thread_t * hb_scan_init( hb_handle_t *, const char * path,
-                            int title_index, hb_list_t * list_title,
-                            int preview_count, int store_previews );
+hb_thread_t * hb_scan_init( hb_handle_t *, volatile int * die, 
+                            const char * path, int title_index, 
+                            hb_list_t * list_title, int preview_count, 
+                            int store_previews, uint64_t min_duration );
 hb_thread_t * hb_work_init( hb_list_t * jobs, int cpu_count,
                             volatile int * die, int * error, hb_job_t ** job );
 hb_thread_t  * hb_reader_init( hb_job_t * );
-hb_thread_t  * hb_muxer_init( hb_job_t * );
+hb_work_object_t * hb_muxer_init( hb_job_t * );
 hb_work_object_t * hb_get_work( int );
 hb_work_object_t * hb_codec_decoder( int );
 hb_work_object_t * hb_codec_encoder( int );
 
 /***********************************************************************
+ * sync.c
+ **********************************************************************/
+hb_work_object_t * hb_sync_init( hb_job_t * job );
+
+/***********************************************************************
  * mpegdemux.c
  **********************************************************************/
 typedef struct {
@@ -166,14 +205,25 @@ extern const hb_muxer_t hb_demux[];
 extern void decmetadata( hb_title_t *title );
 
 /***********************************************************************
+ * batch.c
+ **********************************************************************/
+typedef struct hb_batch_s hb_batch_t;
+
+hb_batch_t  * hb_batch_init( char * path );
+void          hb_batch_close( hb_batch_t ** _d );
+int           hb_batch_title_count( hb_batch_t * d );
+hb_title_t  * hb_batch_title_scan( hb_batch_t * d, int t );
+
+/***********************************************************************
  * dvd.c
  **********************************************************************/
+typedef struct hb_bd_s hb_bd_t;
 typedef union  hb_dvd_s hb_dvd_t;
 typedef struct hb_stream_s hb_stream_t;
 
 hb_dvd_t *   hb_dvd_init( char * path );
 int          hb_dvd_title_count( hb_dvd_t * );
-hb_title_t * hb_dvd_title_scan( hb_dvd_t *, int title );
+hb_title_t * hb_dvd_title_scan( hb_dvd_t *, int title, uint64_t min_duration );
 int          hb_dvd_start( hb_dvd_t *, hb_title_t *title, int chapter );
 void         hb_dvd_stop( hb_dvd_t * );
 int          hb_dvd_seek( hb_dvd_t *, float );
@@ -183,19 +233,44 @@ int          hb_dvd_is_break( hb_dvd_t * d );
 void         hb_dvd_close( hb_dvd_t ** );
 int          hb_dvd_angle_count( hb_dvd_t * d );
 void         hb_dvd_set_angle( hb_dvd_t * d, int angle );
-
+int          hb_dvd_main_feature( hb_dvd_t * d, hb_list_t * list_title );
+
+hb_bd_t     * hb_bd_init( char * path );
+int           hb_bd_title_count( hb_bd_t * d );
+hb_title_t  * hb_bd_title_scan( hb_bd_t * d, int t, uint64_t min_duration );
+int           hb_bd_start( hb_bd_t * d, hb_title_t *title );
+void          hb_bd_stop( hb_bd_t * d );
+int           hb_bd_seek( hb_bd_t * d, float f );
+int           hb_bd_seek_pts( hb_bd_t * d, uint64_t pts );
+int           hb_bd_seek_chapter( hb_bd_t * d, int chapter );
+int           hb_bd_read( hb_bd_t * d, hb_buffer_t * b );
+int           hb_bd_chapter( hb_bd_t * d );
+void          hb_bd_close( hb_bd_t ** _d );
+void          hb_bd_set_angle( hb_bd_t * d, int angle );
+int           hb_bd_main_feature( hb_bd_t * d, hb_list_t * list_title );
+
+hb_stream_t * hb_bd_stream_open( hb_title_t *title );
 hb_stream_t * hb_stream_open( char * path, hb_title_t *title );
 void            hb_stream_close( hb_stream_t ** );
 hb_title_t * hb_stream_title_scan( hb_stream_t *);
 int          hb_stream_read( hb_stream_t *, hb_buffer_t *);
 int          hb_stream_seek( hb_stream_t *, float );
+int          hb_stream_seek_ts( hb_stream_t * stream, int64_t ts );
 int          hb_stream_seek_chapter( hb_stream_t *, int );
 int          hb_stream_chapter( hb_stream_t * );
 
+int          hb_ts_decode_pkt( hb_stream_t *stream, const uint8_t * pkt, hb_buffer_t *obuf );
+
 
 void       * hb_ffmpeg_context( int codec_param );
 void       * hb_ffmpeg_avstream( int codec_param );
 
+#define STR4_TO_UINT32(p) \
+    ((((const uint8_t*)(p))[0] << 24) | \
+     (((const uint8_t*)(p))[1] << 16) | \
+     (((const uint8_t*)(p))[2] <<  8) | \
+      ((const uint8_t*)(p))[3])
+
 /***********************************************************************
  * Work objects
  **********************************************************************/
@@ -255,11 +330,15 @@ union hb_esconfig_u
 
 enum
 {
-    WORK_SYNC = 1,
+    WORK_SYNC_VIDEO = 1,
+    WORK_SYNC_AUDIO,
     WORK_DECMPEG2,
     WORK_DECCC608,
     WORK_DECVOBSUB,
     WORK_DECSRTSUB,
+    WORK_DECUTF8SUB,
+    WORK_DECTX3GSUB,
+    WORK_DECSSASUB,
     WORK_ENCVOBSUB,
     WORK_RENDER,
     WORK_ENCAVCODEC,
@@ -275,7 +354,9 @@ enum
     WORK_ENCFAAC,
     WORK_ENCLAME,
     WORK_ENCVORBIS,
-    WORK_ENC_CA_AAC
+    WORK_ENC_CA_AAC,
+    WORK_ENCAC3,
+    WORK_MUX
 };
 
 enum
@@ -284,9 +365,21 @@ enum
     FILTER_DEBLOCK,
     FILTER_DENOISE,
     FILTER_DETELECINE,
-    FILTER_DECOMB
+    FILTER_DECOMB,
+    FILTER_ROTATE
 };
 
+// Picture flags used by filters
+#ifndef PIC_FLAG_REPEAT_FIRST_FIELD
+#define PIC_FLAG_REPEAT_FIRST_FIELD 256
+#endif
+#ifndef PIC_FLAG_TOP_FIELD_FIRST
+#define PIC_FLAG_TOP_FIELD_FIRST 8
+#endif
+#ifndef PIC_FLAG_PROGRESSIVE_FRAME
+#define PIC_FLAG_PROGRESSIVE_FRAME 16
+#endif
+
 extern hb_work_object_t * hb_objects;
 
 #define HB_WORK_IDLE     0
index f3da3c0..6518bcc 100644 (file)
@@ -1,6 +1,6 @@
-__deps__ := A52DEC BZIP2 FAAC FAAD2 FFMPEG LAME LIBDCA \
-    LIBDVDREAD LIBDVDNAV LIBICONV LIBMKV LIBOGG LIBSAMPLERATE LIBTHEORA LIBVORBIS \
-    MP4V2 MPEG2DEC PTHREADW32 X264 ZLIB
+__deps__ := A52DEC BZIP2 FAAC FAAD2 FFMPEG FONTCONFIG FREETYPE LAME LIBASS LIBDCA \
+    LIBDVDREAD LIBDVDNAV LIBICONV LIBMKV LIBOGG LIBSAMPLERATE LIBTHEORA LIBVORBIS LIBXML2 \
+    MP4V2 MPEG2DEC PTHREADW32 X264 ZLIB LIBBLURAY
 
 $(eval $(call import.MODULE.defs,LIBHB,libhb,$(__deps__)))
 $(eval $(call import.GCC,LIBHB))
@@ -34,6 +34,9 @@ LIBHB.out += $(LIBHB.a)
 
 ###############################################################################
 
+ifeq (1,$(FEATURE.ff.mpeg2))
+LIBHB.GCC.D += USE_FF_MPEG2
+endif
 LIBHB.GCC.D += __LIBHB__ USE_PTHREAD
 LIBHB.GCC.I += $(LIBHB.build/) $(CONTRIB.build/)include
 
@@ -46,6 +49,7 @@ else ifeq ($(BUILD.system),linux)
     LIBHB.GCC.D += SYS_LINUX _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64
 else ifeq ($(BUILD.system),mingw)
     LIBHB.GCC.D += SYS_MINGW PTW32_STATIC_LIB
+       LIBHB.GCC.args.extra.dylib++ += -Wl,--enable-auto-import -static
 else ifeq ($(BUILD.system),solaris)
     LIBHB.GCC.D += SYS_SunOS _LARGEFILE_SOURCE _FILE_OFFSET_BITS=64
 else
@@ -88,12 +92,39 @@ LIBHB.dll = $(LIBHB.build/)hb.dll
 LIBHB.lib = $(LIBHB.build/)hb.lib
 
 LIBHB.dll.libs = $(foreach n, \
-        a52 bz2 avcodec avformat avutil dca dvdnav dvdread faac faad iconv mkv mpeg2 mp3lame mp4v2 \
-        ogg pthreadGC2 samplerate swscale theora vorbis vorbisenc x264 z, \
+        a52 ass avcore avcodec avformat avutil dca dvdnav dvdread faac faad fontconfig freetype mkv mpeg2 mp3lame mp4v2 \
+        ogg samplerate swscale theora vorbis vorbisenc x264 xml2 bluray, \
         $(CONTRIB.build/)lib/lib$(n).a )
 
-LIBHB.GCC.args.extra.dylib++ = -Wl,--out-implib,$(LIBHB.lib)
+ifneq ($(HAS.iconv),1)
+LIBHB.dll.libs += $(CONTRIB.build/)lib/libiconv.a
+else
+    LIBHB.GCC.l += iconv
+endif
+
+ifneq ($(HAS.pthread),1)
+LIBHB.dll.libs += $(CONTRIB.build/)lib/libpthreadGC2.a
+else
+    LIBHB.GCC.l += pthreadGC2
+endif
+
+ifneq ($(HAS.bz2),1)
+LIBHB.dll.libs += $(CONTRIB.build/)lib/libbz2.a
+else
+    LIBHB.GCC.l += bz2
+endif
+
+ifneq ($(HAS.libz),1)
+LIBHB.dll.libs += $(CONTRIB.build/)lib/libz.a
+else
+    LIBHB.GCC.l += z
+endif
+
+LIBHB.GCC.args.extra.dylib++ += -Wl,--out-implib,$(LIBHB.lib)
 LIBHB.GCC.l += iberty ws2_32
+ifeq ($(HAS.dlfcn),1)
+    LIBHB.GCC.l += dl
+endif
 LIBHB.out += $(LIBHB.dll) $(LIBHB.lib)
 
 endif
index 1f39df1..f47b442 100644 (file)
@@ -6,6 +6,8 @@
 
 #include "hb.h"
 
+#define MAX_BUFFERING (1024*1024*50)
+
 struct hb_mux_object_s
 {
     HB_MUX_COMMON;
@@ -21,30 +23,40 @@ typedef struct
 
 typedef struct
 {
-    hb_fifo_t     * fifo;
     hb_mux_data_t * mux_data;
     uint64_t        frames;
     uint64_t        bytes;
     mux_fifo_t      mf;
+    int             buffered_size;
 } hb_track_t;
 
 typedef struct
 {
-    hb_job_t    *job;
-    double      pts;        // end time of next muxing chunk
-    double      interleave; // size (in 90KHz ticks) of media chunks we mux
-    uint32_t    ntracks;    // total number of tracks we're muxing
-    uint32_t    eof;        // bitmask of track with eof
-    uint32_t    rdy;        // bitmask of tracks ready to output
-    uint32_t    allEof;     // valid bits in eof (all tracks)
-    uint32_t    allRdy;     // valid bits in rdy (audio & video tracks)
-    hb_track_t  *track[32]; // array of tracks to mux ('ntrack' elements)
-                            // NOTE- this array could be dynamically allocated
-                            // but the eof & rdy logic has to be changed to
-                            // handle more than 32 tracks anyway so we keep
-                            // it simple and fast.
+    hb_lock_t       * mutex;
+    int               ref;
+    int               done;
+    hb_mux_object_t * m;
+    double            pts;        // end time of next muxing chunk
+    double            interleave; // size in 90KHz ticks of media chunks we mux
+    uint32_t          ntracks;    // total number of tracks we're muxing
+    uint32_t          eof;        // bitmask of track with eof
+    uint32_t          rdy;        // bitmask of tracks ready to output
+    uint32_t          allEof;     // valid bits in eof (all tracks)
+    uint32_t          allRdy;     // valid bits in rdy (audio & video tracks)
+    hb_track_t      * track[32];  // array of tracks to mux ('ntrack' elements)
+                                  // NOTE- this array could be dynamically 
+                                  // allocated but the eof & rdy logic has to 
+                                  // be changed to handle more than 32 tracks 
+                                  // anyway so we keep it simple and fast.
 } hb_mux_t;
 
+struct hb_work_private_s
+{
+    hb_job_t * job;
+    int        track;
+    hb_mux_t * mux;
+};
+
 // The muxer handles two different kinds of media: Video and audio tracks
 // are continuous: once they start they generate continuous, consecutive
 // sequence of bufs until they end. The muxer will time align all continuous
@@ -73,7 +85,7 @@ typedef struct
 // routine OutputTrackChunk). 'is_continuous' must be 1 for an audio or video
 // track and 0 otherwise (see above).
 
-static void add_mux_track( hb_mux_t *mux, hb_fifo_t *fifo, hb_mux_data_t *mux_data,
+static void add_mux_track( hb_mux_t *mux, hb_mux_data_t *mux_data,
                            int is_continuous )
 {
     int max_tracks = sizeof(mux->track) / sizeof(*(mux->track));
@@ -84,7 +96,6 @@ static void add_mux_track( hb_mux_t *mux, hb_fifo_t *fifo, hb_mux_data_t *mux_da
     }
 
     hb_track_t *track = calloc( sizeof( hb_track_t ), 1 );
-    track->fifo = fifo;
     track->mux_data = mux_data;
     track->mf.flen = 8;
     track->mf.fifo = calloc( sizeof(track->mf.fifo[0]), track->mf.flen );
@@ -95,10 +106,24 @@ static void add_mux_track( hb_mux_t *mux, hb_fifo_t *fifo, hb_mux_data_t *mux_da
     mux->allRdy |= is_continuous << t;
 }
 
-static void mf_push( hb_track_t *track, hb_buffer_t *buf )
+static int mf_full( hb_track_t * track )
 {
+    if ( track->buffered_size > MAX_BUFFERING )
+        return 1;
+
+    return 0;
+}
+
+static void mf_push( hb_mux_t * mux, int tk, hb_buffer_t *buf )
+{
+    hb_track_t * track = mux->track[tk];
     uint32_t mask = track->mf.flen - 1;
     uint32_t in = track->mf.in;
+
+    if ( track->buffered_size > MAX_BUFFERING )
+    {
+        mux->rdy = mux->allRdy;
+    }
     if ( ( ( in + 1 ) & mask ) == ( track->mf.out & mask ) )
     {
         // fifo is full - expand it to double the current size.
@@ -127,6 +152,7 @@ static void mf_push( hb_track_t *track, hb_buffer_t *buf )
     }
     track->mf.fifo[in & mask] = buf;
     track->mf.in = in + 1;
+    track->buffered_size += buf->alloc;
 }
 
 static hb_buffer_t *mf_pull( hb_track_t *track )
@@ -137,6 +163,8 @@ static hb_buffer_t *mf_pull( hb_track_t *track )
         // the fifo isn't empty
         b = track->mf.fifo[track->mf.out & (track->mf.flen - 1)];
         ++track->mf.out;
+
+        track->buffered_size -= b->alloc;
     }
     return b;
 }
@@ -147,46 +175,18 @@ static hb_buffer_t *mf_peek( hb_track_t *track )
                 NULL : track->mf.fifo[track->mf.out & (track->mf.flen - 1)];
 }
 
-static void MoveToInternalFifos( hb_mux_t *mux )
+static void MoveToInternalFifos( int tk, hb_mux_t *mux, hb_buffer_t * buf )
 {
-    int i;
-    int discard = mux->job->pass != 0 && mux->job->pass != 2;
-
-    for( i = 0; i < mux->ntracks; ++i )
+    // move all the buffers on the track's fifo to our internal
+    // fifo so that (a) we don't deadlock in the reader and
+    // (b) we can control how data from multiple tracks is
+    // interleaved in the output file.
+    mf_push( mux, tk, buf );
+    if ( buf->stop >= mux->pts )
     {
-        if ( ( mux->eof & (1 << i) ) == 0 )
-        {
-            hb_track_t *track = mux->track[i];
-            hb_buffer_t *buf;
-            
-            // move all the buffers on the track's fifo to our internal
-            // fifo so that (a) we don't deadlock in the reader and
-            // (b) we can control how data from multiple tracks is
-            // interleaved in the output file.
-            while ( ( buf = hb_fifo_get( track->fifo ) ) )
-            {
-                if ( buf->size <= 0 )
-                {
-                    // EOF - mark this track as done
-                    hb_buffer_close( &buf );
-                    mux->eof |= ( 1 << i );
-                    mux->rdy |= ( 1 << i );
-                    continue;
-                }
-                if ( discard )
-                {
-                    hb_buffer_close( &buf );
-                    continue;
-                }
-                mf_push( track, buf );
-                if ( buf->stop >= mux->pts )
-                {
-                    // buffer is past our next interleave point so
-                    // note that this track is ready to be output.
-                    mux->rdy |= ( 1 << i );
-                }
-            }
-        }
+        // buffer is past our next interleave point so
+        // note that this track is ready to be output.
+        mux->rdy |= ( 1 << tk );
     }
 }
 
@@ -196,203 +196,342 @@ static void OutputTrackChunk( hb_mux_t *mux, hb_track_t *track, hb_mux_object_t
 
     while ( ( buf = mf_peek( track ) ) != NULL && buf->start < mux->pts )
     {
-        m->mux( m, track->mux_data, mf_pull( track ) );
+        buf = mf_pull( track );
         track->frames += 1;
         track->bytes  += buf->size;
-        hb_buffer_close( &buf );
+        m->mux( m, track->mux_data, buf );
     }
 }
 
-static void MuxerFunc( void * _mux )
+static int muxWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                     hb_buffer_t ** buf_out )
 {
-    hb_mux_t    * mux = _mux;
-    hb_job_t    * job = mux->job;
-    hb_title_t  * title = job->title;
+    hb_work_private_t * pv = w->private_data;
+    hb_job_t    * job = pv->job;
+    hb_mux_t    * mux = pv->mux;
     hb_track_t  * track;
     int           i;
-    hb_mux_object_t * m = NULL;
-
-    // set up to interleave track data in blocks of 1 video frame time.
-    // (the best case for buffering and playout latency). The container-
-    // specific muxers can reblock this into bigger chunks if necessary.
-    mux->interleave = 90000. * (double)job->vrate_base / (double)job->vrate;
-    mux->pts = mux->interleave;
+    hb_buffer_t * buf = *buf_in;
 
-    /* Get a real muxer */
-    if( job->pass == 0 || job->pass == 2)
+    hb_lock( mux->mutex );
+    if ( mux->done )
     {
-        switch( job->mux )
-        {
-        case HB_MUX_MP4:
-        case HB_MUX_PSP:
-        case HB_MUX_IPOD:
-            m = hb_mux_mp4_init( job );
-            break;
-        case HB_MUX_AVI:
-            m = hb_mux_avi_init( job );
-            break;
-        case HB_MUX_OGM:
-            m = hb_mux_ogm_init( job );
-            break;
-        case HB_MUX_MKV:
-            m = hb_mux_mkv_init( job );
-            break;
-        default:
-            hb_error( "No muxer selected, exiting" );
-            *job->die = 1;
-        }
-        /* Create file, write headers */
-        if( m )
-        {
-            m->init( m );
-        }
+        hb_unlock( mux->mutex );
+        return HB_WORK_DONE;
     }
 
-    /* Build list of fifos we're interested in */
-
-    add_mux_track( mux, job->fifo_mpeg4, job->mux_data, 1 );
-
-    for( i = 0; i < hb_list_count( title->list_audio ); i++ )
+    if ( buf->size <= 0 )
     {
-        hb_audio_t  *audio = hb_list_item( title->list_audio, i );
-        add_mux_track( mux, audio->priv.fifo_out, audio->priv.mux_data, 1 );
+        // EOF - mark this track as done
+        hb_buffer_close( &buf );
+        mux->eof |= ( 1 << pv->track );
+        mux->rdy |= ( 1 << pv->track );
     }
-
-    for( i = 0; i < hb_list_count( title->list_subtitle ); i++ )
+    else if ( ( job->pass != 0 && job->pass != 2 ) ||
+              ( mux->eof & (1 << pv->track) ) )
     {
-        hb_subtitle_t  *subtitle = hb_list_item( title->list_subtitle, i );
-
-        if (subtitle->config.dest != PASSTHRUSUB)
-            continue;
-        add_mux_track( mux, subtitle->fifo_out, subtitle->mux_data, 0 );
+        hb_buffer_close( &buf );
+    }
+    else
+    {
+        MoveToInternalFifos( pv->track, mux, buf );
     }
+    *buf_in = NULL;
 
-    // The following 'while' is the main muxing loop.
+    if ( ( mux->rdy & mux->allRdy ) != mux->allRdy )
+    {
+        hb_unlock( mux->mutex );
+        return HB_WORK_OK;
+    }
 
-    int thread_sleep_interval = 50;
-    while( !*job->die )
+    int more = mux->rdy;
+    // all tracks have at least 'interleave' ticks of data. Output
+    // all that we can in 'interleave' size chunks.
+    while ( (( mux->rdy & mux->allRdy ) == mux->allRdy && more) ||
+            ( mux->eof == mux->allEof ) ) 
     {
-        MoveToInternalFifos( mux );
-        if ( ( mux->rdy & mux->allRdy ) != mux->allRdy )
+        more = 0;
+        for ( i = 0; i < mux->ntracks; ++i )
         {
-            hb_snooze( thread_sleep_interval );
-            continue;
+            track = mux->track[i];
+            OutputTrackChunk( mux, track, mux->m );
+            if ( mf_full( track ) )
+            {
+                // If the track's fifo is still full, advance
+                // the currint interleave point and try again.
+                mux->rdy = mux->allRdy;
+                break;
+            }
+
+            // if the track is at eof or still has data that's past
+            // our next interleave point then leave it marked as rdy.
+            // Otherwise clear rdy.
+            if ( ( mux->eof & (1 << i) ) == 0 &&
+                 ( track->mf.out == track->mf.in ||
+                   track->mf.fifo[(track->mf.in-1) & (track->mf.flen-1)]->stop
+                     < mux->pts + mux->interleave ) )
+            {
+                mux->rdy &=~ ( 1 << i );
+            }
+            if ( track->mf.out != track->mf.in )
+            {
+                more |= ( 1 << i );
+            }
         }
 
-        // all tracks have at least 'interleave' ticks of data. Output
-        // all that we can in 'interleave' size chunks.
-        while ( ( mux->rdy & mux->allRdy ) == mux->allRdy )
+        // if all the tracks are at eof we're just purging their
+        // remaining data -- keep going until all internal fifos are empty.
+        if ( mux->eof == mux->allEof )
         {
             for ( i = 0; i < mux->ntracks; ++i )
             {
-                track = mux->track[i];
-                OutputTrackChunk( mux, track, m );
-
-                // if the track is at eof or still has data that's past
-                // our next interleave point then leave it marked as rdy.
-                // Otherwise clear rdy.
-                if ( ( mux->eof & (1 << i) ) == 0 &&
-                     ( track->mf.out == track->mf.in ||
-                       track->mf.fifo[(track->mf.in-1) & (track->mf.flen-1)]->stop
-                         < mux->pts + mux->interleave ) )
+                if ( mux->track[i]->mf.out != mux->track[i]->mf.in )
                 {
-                    mux->rdy &=~ ( 1 << i );
+                    break;
                 }
             }
-
-            // if all the tracks are at eof we're just purging their
-            // remaining data -- keep going until all internal fifos are empty.
-            if ( mux->eof == mux->allEof )
+            if ( i >= mux->ntracks )
             {
-                for ( i = 0; i < mux->ntracks; ++i )
-                {
-                    if ( mux->track[i]->mf.out != mux->track[i]->mf.in )
-                    {
-                        break;
-                    }
-                }
-                if ( i >= mux->ntracks )
-                {
-                    goto finished;
-                }
+                mux->done = 1;
+                hb_unlock( mux->mutex );
+                return HB_WORK_DONE;
             }
-            mux->pts += mux->interleave;
         }
+        mux->pts += mux->interleave;
     }
+    hb_unlock( mux->mutex );
+    return HB_WORK_OK;
+}
 
-    // we're all done muxing -- print final stats and cleanup.
-finished:
-    if( job->pass == 0 || job->pass == 2 )
-    {
-        struct stat sb;
-        uint64_t bytes_total, frames_total;
+void muxClose( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+    hb_mux_t    * mux = pv->mux;
+    hb_job_t    * job = pv->job;
+    hb_track_t  * track;
+    int           i;
 
-        /* Update the UI */
-        hb_state_t state;
-        state.state = HB_STATE_MUXING;
-        state.param.muxing.progress = 0;
-        hb_set_state( job->h, &state );
+    hb_lock( mux->mutex );
+    if ( --mux->ref == 0 )
+    {
+        // Update state before closing muxer.  Closing the muxer
+        // may initiate optimization which can take a while and
+        // we want the muxing state to be visible while this is
+        // happening.
+        if( job->pass == 0 || job->pass == 2 )
+        {
+            /* Update the UI */
+            hb_state_t state;
+            state.state = HB_STATE_MUXING;
+            state.param.muxing.progress = 0;
+            hb_set_state( job->h, &state );
+        }
 
-        if( m )
+        if( mux->m )
         {
-            m->end( m );
+            mux->m->end( mux->m );
+            free( mux->m );
         }
 
-        if( !stat( job->file, &sb ) )
+        // we're all done muxing -- print final stats and cleanup.
+        if( job->pass == 0 || job->pass == 2 )
         {
-            hb_deep_log( 2, "mux: file size, %"PRId64" bytes", (uint64_t) sb.st_size );
+            struct stat sb;
+            uint64_t bytes_total, frames_total;
 
-            bytes_total  = 0;
-            frames_total = 0;
-            for( i = 0; i < mux->ntracks; ++i )
+            if( !stat( job->file, &sb ) )
             {
-                track = mux->track[i];
-                hb_log( "mux: track %d, %"PRId64" frames, %"PRId64" bytes, %.2f kbps, fifo %d",
-                        i, track->frames, track->bytes,
-                        90000.0 * track->bytes / mux->pts / 125,
-                        track->mf.flen );
-                if( !i && ( job->vquality < 0.0 || job->vquality > 1.0 ) )
+                hb_deep_log( 2, "mux: file size, %"PRId64" bytes", (uint64_t) sb.st_size );
+
+                bytes_total  = 0;
+                frames_total = 0;
+                for( i = 0; i < mux->ntracks; ++i )
                 {
-                    /* Video */
-                    hb_deep_log( 2, "mux: video bitrate error, %+"PRId64" bytes",
-                            (int64_t)(track->bytes - mux->pts * job->vbitrate * 125 / 90000) );
+                    track = mux->track[i];
+                    hb_log( "mux: track %d, %"PRId64" frames, %"PRId64" bytes, %.2f kbps, fifo %d",
+                            i, track->frames, track->bytes,
+                            90000.0 * track->bytes / mux->pts / 125,
+                            track->mf.flen );
+                    if( !i && ( job->vquality < 0.0 || job->vquality > 1.0 ) )
+                    {
+                        /* Video */
+                        hb_deep_log( 2, "mux: video bitrate error, %+"PRId64" bytes",
+                                (int64_t)(track->bytes - mux->pts * job->vbitrate * 125 / 90000) );
+                    }
+                    bytes_total  += track->bytes;
+                    frames_total += track->frames;
                 }
-                bytes_total  += track->bytes;
-                frames_total += track->frames;
-            }
 
-            if( bytes_total && frames_total )
+                if( bytes_total && frames_total )
+                {
+                    hb_deep_log( 2, "mux: overhead, %.2f bytes per frame",
+                            (float) ( sb.st_size - bytes_total ) /
+                            frames_total );
+                }
+            }
+        }
+    
+        for( i = 0; i < mux->ntracks; ++i )
+        {
+            hb_buffer_t * b;
+            track = mux->track[i];
+            while ( (b = mf_pull( track )) != NULL )
+            {
+                hb_buffer_close( &b );
+            }
+            if( track->mux_data )
             {
-                hb_deep_log( 2, "mux: overhead, %.2f bytes per frame",
-                        (float) ( sb.st_size - bytes_total ) /
-                        frames_total );
+                free( track->mux_data );
+                free( track->mf.fifo );
             }
+            free( track );
         }
+        hb_unlock( mux->mutex );
+        hb_lock_close( &mux->mutex );
+        free( mux );
     }
-    
-    if( m )
+    else
+    {
+        hb_unlock( mux->mutex );
+    }
+    free( pv );
+    w->private_data = NULL;
+}
+
+static void mux_loop( void * _w )
+{
+    hb_work_object_t  * w = _w;
+    hb_work_private_t * pv = w->private_data;
+    hb_job_t          * job = pv->job;
+    hb_buffer_t       * buf_in;
+
+    while ( !*job->die && w->status != HB_WORK_DONE )
     {
-        free( m );
+        buf_in = hb_fifo_get_wait( w->fifo_in );
+        if ( pv->mux->done )
+            break;
+        if ( buf_in == NULL )
+            continue;
+        if ( *job->die )
+        {
+            if( buf_in )
+            {
+                hb_buffer_close( &buf_in );
+            }
+            break;
+        }
+
+        w->status = w->work( w, &buf_in, NULL );
+        if( buf_in )
+        {
+            hb_buffer_close( &buf_in );
+        }
     }
+}
+
+hb_work_object_t * hb_muxer_init( hb_job_t * job )
+{
+    hb_title_t  * title = job->title;
+    int           i;
+    hb_mux_t    * mux = calloc( sizeof( hb_mux_t ), 1 );
+    hb_work_object_t  * w;
+    hb_work_object_t  * muxer;
 
-    for( i = 0; i < mux->ntracks; ++i )
+    mux->mutex = hb_lock_init();
+
+    // set up to interleave track data in blocks of 1 video frame time.
+    // (the best case for buffering and playout latency). The container-
+    // specific muxers can reblock this into bigger chunks if necessary.
+    mux->interleave = 90000. * (double)job->vrate_base / (double)job->vrate;
+    mux->pts = mux->interleave;
+
+    /* Get a real muxer */
+    if( job->pass == 0 || job->pass == 2)
     {
-        track = mux->track[i];
-        if( track->mux_data )
+        switch( job->mux )
+        {
+        case HB_MUX_MP4:
+            mux->m = hb_mux_mp4_init( job );
+            break;
+        case HB_MUX_MKV:
+            mux->m = hb_mux_mkv_init( job );
+            break;
+        default:
+            hb_error( "No muxer selected, exiting" );
+            *job->die = 1;
+            return NULL;
+        }
+        /* Create file, write headers */
+        if( mux->m )
         {
-            free( track->mux_data );
-            free( track->mf.fifo );
+            mux->m->init( mux->m );
         }
-        free( track );
     }
 
-    free( mux );
+    /* Initialize the work objects that will receive fifo data */
+
+    muxer = hb_get_work( WORK_MUX );
+    muxer->private_data = calloc( sizeof( hb_work_private_t ), 1 );
+    muxer->private_data->job = job;
+    muxer->private_data->mux = mux;
+    mux->ref++;
+    muxer->private_data->track = mux->ntracks;
+    muxer->fifo_in = job->fifo_mpeg4;
+    add_mux_track( mux, job->mux_data, 1 );
+    muxer->done = &muxer->private_data->mux->done;
+
+    for( i = 0; i < hb_list_count( title->list_audio ); i++ )
+    {
+        hb_audio_t  *audio = hb_list_item( title->list_audio, i );
+
+        w = hb_get_work( WORK_MUX );
+        w->private_data = calloc( sizeof( hb_work_private_t ), 1 );
+        w->private_data->job = job;
+        w->private_data->mux = mux;
+        mux->ref++;
+        w->private_data->track = mux->ntracks;
+        w->fifo_in = audio->priv.fifo_out;
+        add_mux_track( mux, audio->priv.mux_data, 1 );
+        w->done = &job->done;
+        hb_list_add( job->list_work, w );
+        w->thread = hb_thread_init( w->name, mux_loop, w, HB_NORMAL_PRIORITY );
+    }
+
+    for( i = 0; i < hb_list_count( title->list_subtitle ); i++ )
+    {
+        hb_subtitle_t  *subtitle = hb_list_item( title->list_subtitle, i );
+
+        if (subtitle->config.dest != PASSTHRUSUB)
+            continue;
+
+        w = hb_get_work( WORK_MUX );
+        w->private_data = calloc( sizeof( hb_work_private_t ), 1 );
+        w->private_data->job = job;
+        w->private_data->mux = mux;
+        mux->ref++;
+        w->private_data->track = mux->ntracks;
+        w->fifo_in = subtitle->fifo_out;
+        add_mux_track( mux, subtitle->mux_data, 0 );
+        w->done = &job->done;
+        hb_list_add( job->list_work, w );
+        w->thread = hb_thread_init( w->name, mux_loop, w, HB_NORMAL_PRIORITY );
+    }
+    return muxer;
 }
 
-hb_thread_t * hb_muxer_init( hb_job_t * job )
+// muxInit does nothing because the muxer has a special initializer
+// that takes care of initializing all muxer work objects
+static int muxInit( hb_work_object_t * w, hb_job_t * job )
 {
-    hb_mux_t * mux = calloc( sizeof( hb_mux_t ), 1 );
-    mux->job = job;
-    return hb_thread_init( "muxer", MuxerFunc, mux,
-                           HB_NORMAL_PRIORITY );
+    return 0;
 }
+
+hb_work_object_t hb_muxer =
+{
+    WORK_MUX,
+    "Muxer",
+    muxInit,
+    muxWork,
+    muxClose
+};
+
index f179cb7..073b39f 100644 (file)
@@ -34,27 +34,6 @@ struct hb_mux_data_s
     int       sub_format;
 };
 
-static int yuv2rgb(int yuv)
-{
-    double y, Cr, Cb;
-    int r, g, b;
-
-    y =  (yuv >> 16) & 0xff;
-    Cb = (yuv >>  8) & 0xff;
-    Cr = (yuv      ) & 0xff;
-
-    r = 1.164 * (y - 16)                      + 2.018 * (Cb - 128);
-    g = 1.164 * (y - 16) - 0.813 * (Cr - 128) - 0.391 * (Cb - 128);
-    b = 1.164 * (y - 16) + 1.596 * (Cr - 128);
-    r = (r < 0) ? 0 : r;
-    g = (g < 0) ? 0 : g;
-    b = (b < 0) ? 0 : b;
-    r = (r > 255) ? 255 : r;
-    g = (g > 255) ? 255 : g;
-    b = (b > 255) ? 255 : b;
-    return (r << 16) | (g << 8) | b;
-}
-
 /**********************************************************************
  * MKVInit
  **********************************************************************
@@ -188,11 +167,13 @@ static int MKVInit( hb_mux_object_t * m )
         switch (audio->config.out.codec)
         {
             case HB_ACODEC_DCA:
+            case HB_ACODEC_DCA_PASS:
                 track->codecPrivate = NULL;
                 track->codecPrivateSize = 0;
                 track->codecID = MK_ACODEC_DTS;
                 break;
             case HB_ACODEC_AC3:
+            case HB_ACODEC_AC3_PASS:
                 track->codecPrivate = NULL;
                 track->codecPrivateSize = 0;
                 track->codecID = MK_ACODEC_AC3;
@@ -249,8 +230,8 @@ static int MKVInit( hb_mux_object_t * m )
         track->trackType = MK_TRACK_AUDIO;
         track->language = audio->config.lang.iso639_2;
         track->extra.audio.samplingFreq = (float)audio->config.out.samplerate;
-        if (audio->config.out.codec == HB_ACODEC_AC3 ||
-            audio->config.out.codec == HB_ACODEC_DCA)
+        if (audio->config.out.codec == HB_ACODEC_AC3_PASS ||
+            audio->config.out.codec == HB_ACODEC_DCA_PASS)
         {
             track->extra.audio.channels = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT(audio->config.in.channel_layout);
         }
@@ -296,9 +277,9 @@ static int MKVInit( hb_mux_object_t * m )
             case PICTURESUB:
                 track->codecID = MK_SUBTITLE_VOBSUB;
                 for (j = 0; j < 16; j++)
-                    rgb[j] = yuv2rgb(title->palette[j]);
+                    rgb[j] = hb_yuv2rgb(subtitle->palette[j]);
                 len = snprintf(subidx, 2048, subidx_fmt, 
-                        title->width, title->height,
+                        subtitle->width, subtitle->height,
                         0, 0, "OFF",
                         rgb[0], rgb[1], rgb[2], rgb[3],
                         rgb[4], rgb[5], rgb[6], rgb[7],
@@ -399,6 +380,7 @@ static int MKVMux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
             }
             mk_addFrameData(m->file, mux_data->track, op->packet, op->bytes);
             mk_setFrameFlags(m->file, mux_data->track, timecode, 1, 0);
+            hb_buffer_close( &buf );
             return 0;
         }
     }
@@ -424,6 +406,7 @@ static int MKVMux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
             mk_setFrameFlags(m->file, mux_data->track, timecode, 1, duration);
         }
         mk_flushFrame(m->file, mux_data->track);
+        hb_buffer_close( &buf );
         return 0;
     }
     else
@@ -442,6 +425,7 @@ static int MKVMux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
             }
             mk_addFrameData(m->file, mux_data->track, op->packet, op->bytes);
             mk_setFrameFlags(m->file, mux_data->track, timecode, 1, 0);
+            hb_buffer_close( &buf );
             return 0;
         }
     }
@@ -457,6 +441,7 @@ static int MKVMux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
                        mux_data == job->mux_data) ? 
                             (buf->frametype == HB_FRAME_IDR) : 
                             ((buf->frametype & HB_FRAME_KEY) != 0)), 0 );
+    hb_buffer_close( &buf );
     return 0;
 }
 
index 1264f9b..7cd4e0f 100644 (file)
@@ -20,8 +20,7 @@ struct hb_mux_object_s
 
     int64_t sum_dur;    // sum of video frame durations so far
 
-    // bias to keep render offsets in ctts atom positive (set up by encx264)
-    int64_t init_delay;
+    hb_buffer_t *delay_buf;
 
     /* Chapter state information for muxing */
     MP4TrackId chapter_track;
@@ -64,6 +63,14 @@ static int MP4TuneTrackDurationPerChunk( hb_mux_object_t* m, MP4TrackId trackId
     return 1;
 }
 
+static const uint16_t ac3_sample_rate_tab[3] = { 48000, 44100, 32000 };
+/* possible bitrates */
+static const uint16_t ac3_bitrate_tab[19] = {
+    32, 40, 48, 56, 64, 80, 96, 112, 128,
+    160, 192, 224, 256, 320, 384, 448, 512, 576, 640
+};  
+
+
 /**********************************************************************
  * MP4Init
  **********************************************************************
@@ -141,13 +148,11 @@ static int MP4Init( hb_mux_object_t * m )
         MP4AddH264PictureParameterSet( m->file, mux_data->track,
                 job->config.h264.pps, job->config.h264.pps_length );
 
-               if( job->h264_level == 30 || job->ipod_atom)
+               if( job->ipod_atom )
                {
                        hb_deep_log( 2, "muxmp4: adding iPod atom");
                        MP4AddIPodUUID(m->file, mux_data->track);
                }
-
-        m->init_delay = job->config.h264.init_delay;
     }
     else /* FFmpeg or XviD */
     {
@@ -228,106 +233,138 @@ static int MP4Init( hb_mux_object_t * m )
         mux_data = calloc(1, sizeof( hb_mux_data_t ) );
         audio->priv.mux_data = mux_data;
 
-        if( audio->config.out.codec == HB_ACODEC_AC3 )
+        if( audio->config.out.codec == HB_ACODEC_AC3_PASS )
         {
-            uint8_t fscod = 0;
             uint8_t bsid = audio->config.in.version;
             uint8_t bsmod = audio->config.in.mode;
             uint8_t acmod = audio->config.flags.ac3 & 0x7;
             uint8_t lfeon = (audio->config.flags.ac3 & A52_LFE) ? 1 : 0;
             uint8_t bit_rate_code = 0;
+            int ii, jj;
+            int freq = audio->config.in.samplerate;
+            int bitrate = audio->config.in.bitrate;
+            int sr_shift, sr_code;
 
-            /*
-             * Rewrite AC3 information into correct format for dac3 atom
-             */
-            switch( audio->config.in.samplerate )
+            for (ii = 0; ii < 3; ii++)
             {
-            case 48000:
-                fscod = 0;
-                break;
-            case 44100:
-                fscod = 1;
-                break;
-            case 32000:
-                fscod = 2;
-                break;
-            default:
-                /*
-                 * Error value, tells decoder to not decode this audio.
-                 */
-                fscod = 3;
-                break;
+                for (jj = 0; jj < 3; jj++)
+                {
+                    if ((ac3_sample_rate_tab[jj] >> ii) == freq)
+                    {
+                        goto rate_found1;
+                    }
+                }
+            }
+            hb_error("Unknown AC3 samplerate");
+            ii = jj = 0;
+rate_found1:
+            sr_shift = ii;
+            sr_code = jj;
+            for (ii = 0; ii < 19; ii++)
+            {
+                if ((ac3_bitrate_tab[ii] >> sr_shift)*1000 == bitrate)
+                    break;
+            }
+            if ( ii >= 19 )
+            {
+                hb_error("Unknown AC3 bitrate");
+                ii = 0;
+            }
+            bit_rate_code = ii;
+
+            mux_data->track = MP4AddAC3AudioTrack(
+                m->file,
+                audio->config.in.samplerate, 
+                sr_code,
+                bsid,
+                bsmod,
+                acmod,
+                lfeon,
+                bit_rate_code);
+
+            /* Tune track chunk duration */
+            MP4TuneTrackDurationPerChunk( m, mux_data->track );
+
+            if (audio->config.out.name == NULL) {
+                MP4SetTrackBytesProperty(
+                    m->file, mux_data->track,
+                    "udta.name.value",
+                    (const uint8_t*)"Surround", strlen("Surround"));
+            }
+            else {
+                MP4SetTrackBytesProperty(
+                    m->file, mux_data->track,
+                    "udta.name.value",
+                    (const uint8_t*)(audio->config.out.name),
+                    strlen(audio->config.out.name));
             }
+        }
+        else if( audio->config.out.codec == HB_ACODEC_AC3 )
+        {
+            uint8_t bsid = 8;
+            uint8_t bsmod = 0;
+            uint8_t acmod = 2;
+            uint8_t lfeon = 0;
+            uint8_t bit_rate_code = 0;
+            int ii, jj;
+            int freq = audio->config.out.samplerate;
+            int bitrate = audio->config.out.bitrate;
+            int sr_shift, sr_code;
 
-            switch( audio->config.in.bitrate )
+            for (ii = 0; ii < 3; ii++)
+            {
+                for (jj = 0; jj < 3; jj++)
+                {
+                    if ((ac3_sample_rate_tab[jj] >> ii) == freq)
+                    {
+                        goto rate_found2;
+                    }
+                }
+            }
+            hb_error("Unknown AC3 samplerate");
+            ii = jj = 0;
+rate_found2:
+            sr_shift = ii;
+            sr_code = jj;
+            bsid = 8 + ii;
+            for (ii = 0; ii < 19; ii++)
+            {
+                if ((ac3_bitrate_tab[ii] >> sr_shift) == bitrate)
+                    break;
+            }
+            if ( ii >= 19 )
             {
-            case 32000:
-                bit_rate_code = 0;
-                break;
-            case 40000:
-                bit_rate_code = 1;
-                break;
-            case 48000:
-                bit_rate_code = 2;
-                break;
-            case 56000:
-                bit_rate_code = 3;
-                break;
-            case 64000:
-                bit_rate_code = 4;
-                break;
-            case 80000:
-                bit_rate_code = 5;
-                break;
-            case 96000:
-                bit_rate_code = 6;
-                break;
-            case 112000:
-                bit_rate_code = 7;
-                break;
-            case 128000:
-                bit_rate_code = 8;
-                break;
-            case 160000:
-                bit_rate_code = 9;
-                break;
-            case 192000:
-                bit_rate_code = 10;
-                break;
-            case 224000:
-                bit_rate_code = 11;
-                break;
-            case 256000:
-                bit_rate_code = 12;
-                break;
-            case 320000:
-                bit_rate_code = 13;
-                break;
-            case 384000:
-                bit_rate_code = 14;
-                break;
-            case 448000:
-                bit_rate_code = 15;
-                break;
-            case 512000:
-                bit_rate_code = 16;
-                break;
-            case 576000:
-                bit_rate_code = 17;
-                break;
-            case 640000:
-                bit_rate_code = 18;
-                break;
-            default:
                 hb_error("Unknown AC3 bitrate");
-                bit_rate_code = 0;
-                break;
+                ii = 0;
+            }
+            bit_rate_code = ii;
+
+            switch( audio->config.out.mixdown )
+            {
+                case HB_AMIXDOWN_MONO:
+                    acmod = 1;
+                    break;
+
+                case HB_AMIXDOWN_STEREO:
+                case HB_AMIXDOWN_DOLBY:
+                case HB_AMIXDOWN_DOLBYPLII:
+                    acmod = 2;
+                    break;
+
+                case HB_AMIXDOWN_6CH:
+                    acmod = 7;
+                    lfeon = 1;
+                    break;
+
+                default:
+                    hb_log(" MP4Init: bad mixdown" );
+                    break;
             }
 
             mux_data->track = MP4AddAC3AudioTrack(
                 m->file,
                 audio->config.out.samplerate, 
-                fscod,
+                sr_code,
                 bsid,
                 bsmod,
                 acmod,
@@ -350,7 +387,10 @@ static int MP4Init( hb_mux_object_t * m )
                     (const uint8_t*)(audio->config.out.name),
                     strlen(audio->config.out.name));
             }
-        } else {
+        } 
+        else if( audio->config.out.codec == HB_ACODEC_FAAC ||
+                 audio->config.out.codec == HB_ACODEC_CA_AAC ) 
+        {
             mux_data->track = MP4AddAudioTrack(
                 m->file,
                 audio->config.out.samplerate, 1024, MP4_MPEG4_AUDIO_TYPE );
@@ -379,6 +419,32 @@ static int MP4Init( hb_mux_object_t * m )
 
             /* Set the correct number of channels for this track */
              MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.minf.stbl.stsd.mp4a.channels", (uint16_t)HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown));
+        } else if( audio->config.out.codec == HB_ACODEC_LAME ) {
+            mux_data->track = MP4AddAudioTrack(
+                m->file,
+                audio->config.out.samplerate, 1152, MP4_MPEG2_AUDIO_TYPE );
+
+            /* Tune track chunk duration */
+            MP4TuneTrackDurationPerChunk( m, mux_data->track );
+
+            if (audio->config.out.name == NULL) {
+                MP4SetTrackBytesProperty(
+                    m->file, mux_data->track,
+                    "udta.name.value",
+                    (const uint8_t*)"Stereo", strlen("Stereo"));
+            }
+            else {
+                MP4SetTrackBytesProperty(
+                    m->file, mux_data->track,
+                    "udta.name.value",
+                    (const uint8_t*)(audio->config.out.name),
+                    strlen(audio->config.out.name));
+            }
+
+            MP4SetAudioProfileLevel( m->file, 0x0F );
+
+            /* Set the correct number of channels for this track */
+             MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.minf.stbl.stsd.mp4a.channels", (uint16_t)HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown));
         }
 
         /* Set the language for this track */
@@ -496,6 +562,46 @@ static int MP4Init( hb_mux_object_t * m )
                 MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_DISABLED | TRACK_IN_MOVIE));
             }
         }
+        else if( subtitle && subtitle->format == PICTURESUB && 
+            subtitle->config.dest == PASSTHRUSUB )
+        {
+            mux_data = calloc(1, sizeof( hb_mux_data_t ) );
+            subtitle->mux_data = mux_data;
+            mux_data->subtitle = 1;
+            mux_data->sub_format = subtitle->format;
+
+            mux_data->track = MP4AddSubpicTrack( m->file, 90000, subtitle->width, subtitle->height );
+
+            MP4SetTrackLanguage(m->file, mux_data->track, subtitle->iso639_2);
+
+            /* Tune track chunk duration */
+            MP4TuneTrackDurationPerChunk( m, mux_data->track );
+            uint8_t palette[16][4];
+            int ii;
+            for ( ii = 0; ii < 16; ii++ )
+            {
+                palette[ii][0] = 0;
+                palette[ii][1] = (subtitle->palette[ii] >> 16) & 0xff;
+                palette[ii][2] = (subtitle->palette[ii] >> 8) & 0xff;
+                palette[ii][3] = (subtitle->palette[ii]) & 0xff;
+            }
+            if (!(MP4SetTrackESConfiguration( m->file, mux_data->track,
+                    (uint8_t*)palette, 16 * 4 )))
+            {
+                hb_error("muxmp4.c: MP4SetTrackESConfiguration failed!");
+                *job->die = 1;
+                return 0;
+            }
+            if ( !subtitle_default || subtitle->config.default_track ) {
+                /* Enable the default subtitle track */
+                MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_ENABLED | TRACK_IN_MOVIE));
+                subtitle_default = 1;
+            }
+            else
+            {
+                MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_DISABLED | TRACK_IN_MOVIE));
+            }
+        }
     }
 
     if (job->chapter_markers)
@@ -774,25 +880,37 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
     hb_job_t * job = m->job;
     int64_t duration;
     int64_t offset = 0;
+    hb_buffer_t *tmp;
 
     if( mux_data == job->mux_data )
     {
         /* Video */
 
-        // if there are b-frames compute the render offset
-        // (we'll need it for both the video frame & the chapter track)
-        if ( m->init_delay )
+        if( job->vcodec == HB_VCODEC_X264 )
         {
-            offset = buf->start + m->init_delay - m->sum_dur;
-            if ( offset < 0 )
+            if ( buf && buf->start < buf->renderOffset )
             {
-                hb_log("MP4Mux: illegal render offset %"PRId64", start %"PRId64","
-                       "stop %"PRId64", sum_dur %"PRId64,
-                       offset, buf->start, buf->stop, m->sum_dur );
-                offset = 0;
+                hb_log("MP4Mux: PTS %"PRId64" < DTS %"PRId64,
+                       buf->start, buf->renderOffset );
+                buf->renderOffset = buf->start;
             }
         }
 
+        // We delay muxing video by one frame so that we can calculate
+        // the dts to dts duration of the frames.
+        tmp = buf;
+        buf = m->delay_buf;
+        m->delay_buf = tmp;
+
+        if ( !buf )
+            return 0;
+
+        if( job->vcodec == HB_VCODEC_X264 )
+        {
+            // x264 supplies us with DTS, so offset is PTS - DTS
+            offset = buf->start - buf->renderOffset;
+        }
+
         /* Add the sample before the new frame.
            It is important that this be calculated prior to the duration
            of the new video sample, as we want to sync to right after it.
@@ -824,10 +942,54 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
             }
         }
 
-        // We're getting the frames in decode order but the timestamps are
-        // for presentation so we have to use durations and effectively
-        // compute a DTS.
-        duration = buf->stop - buf->start;
+        if( job->vcodec == HB_VCODEC_X264 )
+        {
+            // x264 supplies us with DTS
+            if ( m->delay_buf )
+            {
+                duration = m->delay_buf->renderOffset - buf->renderOffset;
+            }
+            else
+            {
+                duration = buf->stop - m->sum_dur;
+                // Due to how libx264 generates DTS, it's possible for the
+                // above calculation to be negative. 
+                //
+                // x264 generates DTS by rearranging PTS in this sequence:
+                // pts0 - delay, pts1 - delay, pts2 - delay, pts1, pts2, pts3...
+                //
+                // where delay == pts2.  This guarantees that DTS <= PTS for
+                // any frame, but also generates this sequence of durations:
+                // d0 + d1 + d0 + d1 + d2 + d3 ... + d(N-2)
+                // 
+                // so the sum up to the last frame is:
+                // sum_dur = d0 + d1 + d0 + d1 + d2 + d3 ... + d(N-3)
+                //
+                // while the original total duration of the video was:
+                // duration = d0 + d1 + d2 + d3 ... + d(N)
+                //
+                // Note that if d0 + d1 != d(N-1) + d(N), the total
+                // length of the video changes since d(N-1) and d(N) are
+                // replaced by d0 and d1 in the final duration sum.
+                //
+                // To keep the total length of the video the same as the source
+                // we try to make 
+                // d(N-2) = duration - sum_dur
+                //
+                // But if d0 + d1 >= d(N-1) + d(N), the above calculation
+                // results in a nagative value and we need to fix it.
+                if ( duration <= 0 )
+                    duration = 90000. / ((double)job->vrate / (double)job->vrate_base);
+            }
+        }
+        else
+        {
+            // We're getting the frames in decode order but the timestamps are
+            // for presentation so we have to use durations and effectively
+            // compute a DTS.
+            duration = buf->stop - buf->start;
+        }
+
         if ( duration <= 0 )
         {
             /* We got an illegal mp4/h264 duration. This shouldn't
@@ -968,6 +1130,39 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
 
             mux_data->sum_dur += (buf->stop - buf->start);
         }
+        else if( mux_data->sub_format == PICTURESUB )
+        {
+            /* Write an empty sample */
+            if ( mux_data->sum_dur < buf->start )
+            {
+                uint8_t empty[2] = {0,0};
+                if( !MP4WriteSample( m->file,
+                                    mux_data->track,
+                                    empty,
+                                    2,
+                                    buf->start - mux_data->sum_dur,
+                                    0,
+                                    1 ))
+                {
+                    hb_error("Failed to write to output file, disk full?");
+                    *job->die = 1;
+                } 
+                mux_data->sum_dur += buf->start - mux_data->sum_dur;
+            }
+            if( !MP4WriteSample( m->file,
+                                 mux_data->track,
+                                 buf->data,
+                                 buf->size,
+                                 buf->stop - buf->start,
+                                 0,
+                                 1 ))
+            {
+                hb_error("Failed to write to output file, disk full?");
+                *job->die = 1;
+            }
+
+            mux_data->sum_dur += (buf->stop - buf->start);
+        }
     }
     else
     {
@@ -986,7 +1181,7 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data,
             *job->die = 1;
         }
     }
-
+    hb_buffer_close( &buf );
 
     return 0;
 }
@@ -996,6 +1191,10 @@ static int MP4End( hb_mux_object_t * m )
     hb_job_t   * job   = m->job;
     hb_title_t * title = job->title;
 
+    // Flush the delayed frame
+    if ( m->delay_buf )
+        MP4Mux( m, job->mux_data, NULL );
+
     /* Write our final chapter marker */
     if( m->job->chapter_markers )
     {
@@ -1016,11 +1215,11 @@ static int MP4End( hb_mux_object_t * m )
         }
     }
 
-    if (job->areBframes)
+    if ( job->config.h264.init_delay )
     {
            // Insert track edit to get A/V back in sync.  The edit amount is
            // the init_delay.
-           int64_t edit_amt = m->init_delay;
+           int64_t edit_amt = job->config.h264.init_delay;
            MP4AddTrackEdit(m->file, 1, MP4_INVALID_EDIT_ID, edit_amt,
                            MP4GetTrackDuration(m->file, 1), 0);
             if ( m->job->chapter_markers )
index 5012104..762559c 100644 (file)
@@ -146,7 +146,7 @@ int encCoreAudioInit( hb_work_object_t * w, hb_job_t * job )
         }
     }
 
-    if( audio->config.out.mixdown == HB_AMIXDOWN_6CH && audio->config.in.codec == HB_ACODEC_AC3 )
+    if( ( audio->config.out.mixdown == HB_AMIXDOWN_6CH ) && ( audio->config.in.codec == HB_ACODEC_AC3) )
     {
         SInt32 channelMap[6] = { 2, 1, 3, 4, 5, 0 };
         AudioConverterSetProperty( pv->converter, kAudioConverterChannelMap,
@@ -251,10 +251,11 @@ static OSStatus inInputDataProc( AudioConverterRef converter, UInt32 *npackets,
                           void *userdata )
 {
     hb_work_private_t *pv = userdata;
-    pv->ibytes = hb_list_bytes( pv->list );
 
-    if( pv->ibytes == 0 ) {
+    if( pv->ibytes == 0 )
+    {
         *npackets = 0;
+        hb_log( "CoreAudio: no data to use in inInputDataProc" );
         return noErr;
     }
 
@@ -262,11 +263,20 @@ static OSStatus inInputDataProc( AudioConverterRef converter, UInt32 *npackets,
         free( pv->buf );
 
     uint64_t pts, pos;
-    pv->ibytes = buffers->mBuffers[0].mDataByteSize = MIN( *npackets * pv->isamplesiz, pv->ibytes );
-    buffers->mBuffers[0].mData = pv->buf = malloc( buffers->mBuffers[0].mDataByteSize );
+    buffers->mBuffers[0].mDataByteSize = MIN( *npackets * pv->isamplesiz, pv->ibytes );
+    buffers->mBuffers[0].mData = pv->buf = calloc(1 , buffers->mBuffers[0].mDataByteSize );
 
-    hb_list_getbytes( pv->list, buffers->mBuffers[0].mData,
-                      buffers->mBuffers[0].mDataByteSize, &pts, &pos );
+    if( hb_list_bytes( pv->list ) >= buffers->mBuffers[0].mDataByteSize )
+    {
+        hb_list_getbytes( pv->list, buffers->mBuffers[0].mData,
+                          buffers->mBuffers[0].mDataByteSize, &pts, &pos );
+    }
+    else
+    {
+        hb_log( "CoreAudio: Not enought data, exiting inInputDataProc" );
+        *npackets = 0;
+        return 1;
+    }
 
     *npackets = buffers->mBuffers[0].mDataByteSize / pv->isamplesiz;
 
@@ -274,8 +284,11 @@ static OSStatus inInputDataProc( AudioConverterRef converter, UInt32 *npackets,
     float *fdata = buffers->mBuffers[0].mData;
     int i;
 
-    for( i = 0; i < *npackets * pv->nchannels; i++ )
+    for( i = 0; i < *npackets * pv->nchannels; i++ ) {
         fdata[i] = fdata[i] / 32768.f;
+    }
+
+    pv->ibytes -= buffers->mBuffers[0].mDataByteSize;
 
     return noErr;
 }
@@ -291,7 +304,7 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     UInt32 npackets = 1;
 
     /* check if we need more data */
-    if( hb_list_bytes( pv->list ) < pv->isamples * pv->isamplesiz )
+    if( ( pv->ibytes = hb_list_bytes( pv->list ) ) < pv->isamples * pv->isamplesiz )
         return NULL;
 
     hb_buffer_t * obuf;
@@ -304,11 +317,16 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     obuflist.mBuffers[0].mDataByteSize = obuf->size;
     obuflist.mBuffers[0].mData = obuf->data;
 
-    AudioConverterFillComplexBuffer( pv->converter, inInputDataProc, pv, 
+    OSStatus err = AudioConverterFillComplexBuffer( pv->converter, inInputDataProc, pv, 
                                      &npackets, &obuflist, &odesc );
-
-    if( odesc.mDataByteSize == 0 )
+    if( err ) {
+        hb_log( "CoreAudio: Not enough data" );
         return NULL;
+    }
+    if( odesc.mDataByteSize == 0 || npackets == 0 ) {
+        return NULL;
+        hb_log( "CoreAudio: 0 packets returned " );
+    }
 
     obuf->start = pv->pts;
     pv->pts += 90000LL * pv->isamples / pv->osamplerate;
@@ -319,6 +337,45 @@ static hb_buffer_t * Encode( hb_work_object_t * w )
     return obuf;
 }
 
+static hb_buffer_t *Flush( hb_work_object_t *w, hb_buffer_t *bufin )
+{
+    hb_work_private_t *pv = w->private_data;
+
+    // pad whatever data we have out to four input frames.
+    int nbytes = hb_list_bytes( pv->list );
+    int pad = pv->isamples * pv->isamplesiz - nbytes;
+    if ( pad > 0 )
+    {
+        hb_buffer_t *tmp = hb_buffer_init( pad );
+        memset( tmp->data, 0, pad );
+        hb_list_add( pv->list, tmp );
+    }
+
+    hb_buffer_t *bufout = NULL, *buf = NULL;
+    while ( hb_list_bytes( pv->list ) >= pv->isamples * pv->isamplesiz )
+    {
+        hb_buffer_t *b = Encode( w );
+        if ( b )
+        {
+            if ( bufout == NULL )
+            {
+                bufout = b;
+            }
+            else
+            {
+                buf->next = b;
+            }
+            buf = b;
+        }
+    }
+    // add the eof marker to the end of our buf chain
+    if ( buf )
+        buf->next = bufin;
+    else
+        bufout = bufin;
+    return bufout;
+}
+
 /***********************************************************************
  * Work
  ***********************************************************************
@@ -332,8 +389,9 @@ int encCoreAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
 
     if( (*buf_in)->size <= 0 )
     {
-        // EOF on input - send it downstream & say we're done
-        *buf_out = *buf_in;
+        // EOF on input. Finish encoding what we have buffered then send
+        // it & the eof downstream.
+        *buf_out = Flush( w, *buf_in );
         *buf_in = NULL;
         return HB_WORK_DONE;
     }
index 1200386..64aad0e 100644 (file)
 #include <machine/cpu.h>
 #endif
 
+#ifdef SYS_MINGW
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#endif
+
 #ifdef SYS_CYGWIN
 #include <windows.h>
 #endif
 #include <time.h>
 #include <sys/time.h>
 
-
-#ifdef SYS_MINGW
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#endif
-
 #if defined( SYS_LINUX )
 #include <linux/cdrom.h>
 #include <fcntl.h>
@@ -65,6 +64,7 @@
 #endif
 
 #include <stddef.h>
+#include <unistd.h>
 
 #include "hb.h"
 
@@ -219,15 +219,15 @@ int hb_get_cpu_count()
 #endif
 
     cpu_count = MAX( 1, cpu_count );
-    cpu_count = MIN( cpu_count, 8 );
+    cpu_count = MIN( cpu_count, 64 );
 
     return cpu_count;
 }
 
 /************************************************************************
- * Get a tempory directory for HB
+ * Get a temporary directory for HB
  ***********************************************************************/
-void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
+void hb_get_temporary_directory( char path[512] )
 {
     char base[512];
 
@@ -251,7 +251,7 @@ void hb_get_tempory_directory( hb_handle_t * h, char path[512] )
     if( base[strlen(base)-1] == '/' )
         base[strlen(base)-1] = '\0';
 
-    snprintf( path, 512, "%s/hb.%d", base, hb_get_pid( h ) );
+    snprintf( path, 512, "%s/hb.%d", base, getpid() );
 }
 
 /************************************************************************
@@ -262,7 +262,7 @@ void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
 {
     va_list args;
 
-    hb_get_tempory_directory( h, name );
+    hb_get_temporary_directory( name );
     strcat( name, "/" );
 
     va_start( args, fmt );
@@ -604,6 +604,35 @@ void hb_cond_wait( hb_cond_t * c, hb_lock_t * lock )
 #endif
 }
 
+void hb_clock_gettime( struct timespec *tp )
+{
+    struct timeval tv;
+    time_t sec;
+
+    sec = time( NULL );
+    gettimeofday( &tv, NULL );
+    tp->tv_sec = tv.tv_sec;
+    tp->tv_nsec = tv.tv_usec * 1000;
+}
+
+void hb_cond_timedwait( hb_cond_t * c, hb_lock_t * lock, int msec )
+{
+#if defined( SYS_BEOS )
+    c->thread = find_thread( NULL );
+    release_sem( lock->sem );
+    suspend_thread( c->thread );
+    acquire_sem( lock->sem );
+    c->thread = -1;
+#elif USE_PTHREAD
+    struct timespec ts;
+    hb_clock_gettime(&ts);
+    ts.tv_nsec += (msec % 1000) * 1000000;
+    ts.tv_sec += msec / 1000 + (ts.tv_nsec / 1000000000);
+    ts.tv_nsec %= 1000000000;
+    pthread_cond_timedwait( &c->cond, &lock->mutex, &ts );
+#endif
+}
+
 void hb_cond_signal( hb_cond_t * c )
 {
 #if defined( SYS_BEOS )
@@ -628,6 +657,13 @@ void hb_cond_signal( hb_cond_t * c )
 #endif
 }
 
+void hb_cond_broadcast( hb_cond_t * c )
+{
+#if USE_PTHREAD
+    pthread_cond_broadcast( &c->cond );
+#endif
+}
+
 /************************************************************************
  * Network
  ***********************************************************************/
@@ -710,3 +746,29 @@ void hb_net_close( hb_net_t ** _n )
     *_n = NULL;
 }
 
+#ifdef SYS_MINGW
+char *strtok_r(char *s, const char *delim, char **save_ptr) 
+{
+    char *token;
+
+    if (s == NULL) s = *save_ptr;
+
+    /* Scan leading delimiters.  */
+    s += strspn(s, delim);
+    if (*s == '\0') return NULL;
+
+    /* Find the end of the token.  */
+    token = s;
+    s = strpbrk(token, delim);
+    if (s == NULL)
+        /* This token finishes the string.  */
+        *save_ptr = strchr(token, '\0');
+    else {
+        /* Terminate the token and make *SAVE_PTR point past it.  */
+        *s = '\0';
+        *save_ptr = s + 1;
+    }
+
+    return token;
+}
+#endif
index 0f3697f..7b743c4 100644 (file)
@@ -7,12 +7,21 @@
 #ifndef HB_PORTS_H
 #define HB_PORTS_H
 
+#if defined(_WIN32)
+#define DIR_SEP_STR "\\"
+#else
+#define DIR_SEP_STR "/"
+#endif
+
 /************************************************************************
  * Utils
  ***********************************************************************/
 uint64_t hb_get_date();
 void     hb_snooze( int delay );
 int      hb_get_cpu_count();
+#ifdef SYS_MINGW
+char *strtok_r(char *s, const char *delim, char **save_ptr);
+#endif
 
 #ifdef __LIBHB__
 
@@ -24,9 +33,9 @@ int      hb_get_cpu_count();
 int hb_dvd_region(char *device, int *region_mask);
 
 /************************************************************************
- * Files utils
+ * File utils
  ***********************************************************************/
-void hb_get_tempory_directory( hb_handle_t * h, char path[512] );
+void hb_get_temporary_directory( char path[512] );
 void hb_get_tempory_filename( hb_handle_t *, char name[1024],
                               char * fmt, ... );
 void hb_mkdir( char * name );
@@ -74,7 +83,9 @@ typedef struct hb_cond_s hb_cond_t;
 
 hb_cond_t * hb_cond_init();
 void        hb_cond_wait( hb_cond_t *, hb_lock_t * );
+void        hb_cond_timedwait( hb_cond_t * c, hb_lock_t * lock, int msec );
 void        hb_cond_signal( hb_cond_t * );
+void        hb_cond_broadcast( hb_cond_t * c );
 void        hb_cond_close( hb_cond_t ** );
 
 /************************************************************************
index 1dda826..7835354 100644 (file)
@@ -12,6 +12,7 @@ typedef struct
     int64_t last;   // last timestamp seen on this stream
     int id;         // stream id
     int is_audio;   // != 0 if this is an audio stream
+    int valid;      // Stream timing is not valid until next scr.
 } stream_timing_t;
 
 typedef struct
@@ -20,6 +21,7 @@ typedef struct
     hb_title_t   * title;
     volatile int * die;
 
+    hb_bd_t      * bd;
     hb_dvd_t     * dvd;
     hb_stream_t  * stream;
 
@@ -31,6 +33,9 @@ typedef struct
     uint8_t        st_slots;        // size (in slots) of stream_timing array
     uint8_t        saw_video;       // != 0 if we've seen video
     uint8_t        saw_audio;       // != 0 if we've seen audio
+
+    int            start_found;     // found pts_to_start point
+    uint64_t       st_first;
 } hb_reader_t;
 
 /***********************************************************************
@@ -38,6 +43,7 @@ typedef struct
  **********************************************************************/
 static void        ReaderFunc( void * );
 static hb_fifo_t ** GetFifoForId( hb_job_t * job, int id );
+static void UpdateState( hb_reader_t  * r, int64_t start);
 
 /***********************************************************************
  * hb_reader_init
@@ -61,23 +67,26 @@ hb_thread_t * hb_reader_init( hb_job_t * job )
     r->stream_timing[0].average = 90000. * (double)job->vrate_base /
                                            (double)job->vrate;
     r->stream_timing[0].last = -r->stream_timing[0].average;
+    r->stream_timing[0].valid = 1;
     r->stream_timing[1].id = -1;
 
+    if ( !job->pts_to_start )
+        r->start_found = 1;
+
     return hb_thread_init( "reader", ReaderFunc, r,
                            HB_NORMAL_PRIORITY );
 }
 
 static void push_buf( const hb_reader_t *r, hb_fifo_t *fifo, hb_buffer_t *buf )
 {
-    while( !*r->die && !r->job->done && hb_fifo_is_full( fifo ) )
+    while ( !*r->die && !r->job->done )
     {
-        /*
-         * Loop until the incoming fifo is ready to receive
-         * this buffer.
-         */
-        hb_snooze( 50 );
+        if ( hb_fifo_full_wait( fifo ) )
+        {
+            hb_fifo_push( fifo, buf );
+            break;
+        }
     }
-    hb_fifo_push( fifo, buf );
 }
 
 static int is_audio( hb_reader_t *r, int id )
@@ -118,7 +127,7 @@ static stream_timing_t *find_st( hb_reader_t *r, const hb_buffer_t *buf )
 
 // find or create the per-stream timing state for 'buf'
 
-static stream_timing_t *id_to_st( hb_reader_t *r, const hb_buffer_t *buf )
+static stream_timing_t *id_to_st( hb_reader_t *r, const hb_buffer_t *buf, int valid )
 {
     stream_timing_t *st = r->stream_timing;
     while ( st->id != buf->id && st->id != -1)
@@ -141,15 +150,13 @@ static stream_timing_t *id_to_st( hb_reader_t *r, const hb_buffer_t *buf )
         }
         st->id = buf->id;
         st->average = 30.*90.;
-        if ( r->saw_video )
-            st->last = buf->renderOffset - st->average;
-        else
-            st->last = -st->average;
+        st->last = -st->average;
         if ( ( st->is_audio = is_audio( r, buf->id ) ) != 0 )
         {
             r->saw_audio = 1;
         }
         st[1].id = -1;
+        st->valid = valid;
     }
     return st;
 }
@@ -159,10 +166,15 @@ static stream_timing_t *id_to_st( hb_reader_t *r, const hb_buffer_t *buf )
 
 static void update_ipt( hb_reader_t *r, const hb_buffer_t *buf )
 {
-    stream_timing_t *st = id_to_st( r, buf );
+    stream_timing_t *st = id_to_st( r, buf, 1 );
     double dt = buf->renderOffset - st->last;
-    st->average += ( dt - st->average ) * (1./32.);
-    st->last = buf->renderOffset;
+    // Protect against spurious bad timestamps
+    if ( dt > -5 * 90000LL && dt < 5 * 90000LL )
+    {
+        st->average += ( dt - st->average ) * (1./32.);
+        st->last = buf->renderOffset;
+    }
+    st->valid = 1;
 }
 
 // use the per-stream state associated with 'buf' to compute a new scr_offset
@@ -171,12 +183,27 @@ static void update_ipt( hb_reader_t *r, const hb_buffer_t *buf )
 
 static void new_scr_offset( hb_reader_t *r, hb_buffer_t *buf )
 {
-    stream_timing_t *st = id_to_st( r, buf );
-    int64_t nxt = st->last + st->average;
+    stream_timing_t *st = id_to_st( r, buf, 1 );
+    int64_t last;
+    if ( !st->valid )
+    {
+        // !valid means we've not received any previous data
+        // for this stream.  There is no 'last' packet time.
+        // So approximate it with video's last time.
+        last = r->stream_timing[0].last;
+        st->valid = 1;
+    }
+    else
+    {
+        last = st->last;
+    }
+    int64_t nxt = last + st->average;
     r->scr_offset = buf->renderOffset - nxt;
-    buf->renderOffset = nxt;
+    // This log is handy when you need to debug timing problems...
+    //hb_log("id %x last %ld avg %g nxt %ld renderOffset %ld scr_offset %ld",
+    //    buf->id, last, st->average, nxt, buf->renderOffset, r->scr_offset);
     r->scr_changes = r->demux.scr_changes;
-    st->last = buf->renderOffset;
+    st->last = nxt;
 }
 
 /***********************************************************************
@@ -194,15 +221,58 @@ static void ReaderFunc( void * _r )
     int            chapter = -1;
     int            chapter_end = r->job->chapter_end;
 
-    if( !( r->dvd = hb_dvd_init( r->title->dvd ) ) )
+    if ( r->title->type == HB_BD_TYPE )
     {
-        if ( !( r->stream = hb_stream_open( r->title->dvd, r->title ) ) )
+        if ( !( r->bd = hb_bd_init( r->title->path ) ) )
+            return;
+    }
+    else if ( r->title->type == HB_DVD_TYPE )
+    {
+        if ( !( r->dvd = hb_dvd_init( r->title->path ) ) )
+            return;
+    }
+    else if ( r->title->type == HB_STREAM_TYPE )
+    {
+        if ( !( r->stream = hb_stream_open( r->title->path, r->title ) ) )
+            return;
+    }
+    else
+    {
+        // Unknown type, should never happen
+        return;
+    }
+
+    hb_buffer_t *ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
+    if (r->bd)
+    {
+        if( !hb_bd_start( r->bd, r->title ) )
+        {
+            hb_bd_close( &r->bd );
+            hb_buffer_close( &ps );
+            return;
+        }
+        if ( r->job->start_at_preview )
+        {
+            // XXX code from DecodePreviews - should go into its own routine
+            hb_bd_seek( r->bd, (float)r->job->start_at_preview /
+                         ( r->job->seek_points ? ( r->job->seek_points + 1.0 ) : 11.0 ) );
+        }
+        else if ( r->job->pts_to_start )
         {
-          return;
+            hb_bd_seek_pts( r->bd, r->job->pts_to_start );
+            r->job->pts_to_start = 0;
+            r->start_found = 1;
+        }
+        else
+        {
+            hb_bd_seek_chapter( r->bd, r->job->chapter_start );
+        }
+        if (r->job->angle > 1)
+        {
+            hb_bd_set_angle( r->bd, r->job->angle - 1 );
         }
     }
-
-    if (r->dvd)
+    else if (r->dvd)
     {
         /*
          * XXX this code is a temporary hack that should go away if/when
@@ -226,6 +296,7 @@ static void ReaderFunc( void * _r )
         if( !hb_dvd_start( r->dvd, r->title, start ) )
         {
             hb_dvd_close( &r->dvd );
+            hb_buffer_close( &ps );
             return;
         }
         if (r->job->angle)
@@ -248,6 +319,28 @@ static void ReaderFunc( void * _r )
                         ( r->job->seek_points ? ( r->job->seek_points + 1.0 ) : 11.0 ) );
 
     } 
+    else if ( r->stream && r->job->pts_to_start )
+    {
+        int64_t pts_to_start = r->job->pts_to_start;
+        
+        // Find out what the first timestamp of the stream is
+        // and then seek to the appropriate offset from it
+        if ( hb_stream_read( r->stream, ps ) )
+        {
+            if ( ps->start > 0 )
+                pts_to_start += ps->start;
+        }
+        
+        if ( hb_stream_seek_ts( r->stream, pts_to_start ) >= 0 )
+        {
+            // Seek takes us to the nearest I-frame before the timestamp
+            // that we want.  So we will retrieve the start time of the
+            // first packet we get, subtract that from pts_to_start, and
+            // inspect the reset of the frames in sync.
+            r->start_found = 2;
+            r->job->pts_to_start = pts_to_start;
+        }
+    } 
     else if( r->stream )
     {
         /*
@@ -271,11 +364,12 @@ static void ReaderFunc( void * _r )
     }
 
     list  = hb_list_init();
-    hb_buffer_t *ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
 
     while( !*r->die && !r->job->done )
     {
-        if (r->dvd)
+        if (r->bd)
+            chapter = hb_bd_chapter( r->bd );
+        else if (r->dvd)
             chapter = hb_dvd_chapter( r->dvd );
         else if (r->stream)
             chapter = hb_stream_chapter( r->stream );
@@ -292,7 +386,14 @@ static void ReaderFunc( void * _r )
             break;
         }
 
-        if (r->dvd)
+        if (r->bd)
+        {
+          if( !hb_bd_read( r->bd, ps ) )
+          {
+              break;
+          }
+        }
+        else if (r->dvd)
         {
           if( !hb_dvd_read( r->dvd, ps ) )
           {
@@ -305,6 +406,21 @@ static void ReaderFunc( void * _r )
           {
             break;
           }
+          if ( r->start_found == 2 )
+          {
+            // We will inspect the timestamps of each frame in sync
+            // to skip from this seek point to the timestamp we
+            // want to start at.
+            if ( ps->start > 0 && ps->start < r->job->pts_to_start )
+            {
+                r->job->pts_to_start -= ps->start;
+            }
+            else if ( ps->start >= r->job->pts_to_start )
+            {
+                r->job->pts_to_start = 0;
+                r->start_found = 1;
+            }
+          }
         }
 
         if( r->job->indepth_scan )
@@ -336,7 +452,7 @@ static void ReaderFunc( void * _r )
             hb_list_rem( list, buf );
             fifos = GetFifoForId( r->job, buf->id );
 
-            if ( fifos && ! r->saw_video )
+            if ( fifos && ! r->saw_video && !r->job->indepth_scan )
             {
                 // The first data packet with a PTS from an audio or video stream
                 // that we're decoding defines 'time zero'. Discard packets until
@@ -348,7 +464,7 @@ static void ReaderFunc( void * _r )
                     r->scr_changes = r->demux.scr_changes - 1;
                     // create a stream state if we don't have one so the
                     // offset will get computed correctly.
-                    id_to_st( r, buf );
+                    id_to_st( r, buf, 1 );
                     r->saw_video = 1;
                     hb_log( "reader: first SCR %"PRId64" id %d DTS %"PRId64,
                             r->demux.last_scr, buf->id, buf->renderOffset );
@@ -362,78 +478,69 @@ static void ReaderFunc( void * _r )
             {
                 if ( buf->renderOffset != -1 )
                 {
-                    if ( r->scr_changes == r->demux.scr_changes )
-                    {
-                        // This packet is referenced to the same SCR as the last.
-                        // Adjust timestamp to remove the System Clock Reference
-                        // offset then update the average inter-packet time
-                        // for this stream.
-                        buf->renderOffset -= r->scr_offset;
-                        update_ipt( r, buf );
-                    }
-                    else
+                    if ( r->scr_changes != r->demux.scr_changes )
                     {
                         // This is the first audio or video packet after an SCR
                         // change. Compute a new scr offset that would make this
-                        // packet follow the last of this stream with the correct
-                        // average spacing.
-                        stream_timing_t *st = find_st( r, buf );
-
-                        if ( st )
+                        // packet follow the last of this stream with the 
+                        // correct average spacing.
+                        stream_timing_t *st = id_to_st( r, buf, 0 );
+
+                        // if this is the video stream and we don't have
+                        // audio yet or this is an audio stream
+                        // generate a new scr
+                        if ( st->is_audio ||
+                             ( st == r->stream_timing && !r->saw_audio ) )
                         {
-                            // if this is the video stream and we don't have
-                            // audio yet or this is an audio stream
-                            // generate a new scr
-                            if ( st->is_audio ||
-                                 ( st == r->stream_timing && !r->saw_audio ) )
-                            {
-                                new_scr_offset( r, buf );
-                            }
-                            else
-                            {
-                                // defer the scr change until we get some
-                                // audio since audio has a timestamp per
-                                // frame but video & subtitles don't. Clear
-                                // the timestamps so the decoder will generate
-                                // them from the frame durations.
-                                if ( st != r->stream_timing )
-                                {
-                                    // not a video stream so it's probably
-                                    // subtitles - the best we can do is to
-                                    // line it up with the last video packet.
-                                    buf->start = r->stream_timing->last;
-                                }
-                                else
-                                {
-                                    buf->start = -1;
-                                    buf->renderOffset = -1;
-                                }
-                            }
+                            new_scr_offset( r, buf );
                         }
                         else
                         {
-                            // we got a new scr at the same time as the first
-                            // packet of a stream we've never seen before. We
-                            // have no idea what the timing should be so toss
-                            // this buffer & wait for a stream we've already seen.
-                            // add stream to list of streams we have seen
-                            id_to_st( r, buf );
-                            hb_buffer_close( &buf );
-                            continue;
+                            // defer the scr change until we get some
+                            // audio since audio has a timestamp per
+                            // frame but video & subtitles don't. Clear
+                            // the timestamps so the decoder will generate
+                            // them from the frame durations.
+                            buf->start = -1;
+                            buf->renderOffset = -1;
                         }
                     }
                 }
                 if ( buf->start != -1 )
                 {
+                    int64_t start = buf->start - r->scr_offset;
+                    if ( !r->start_found )
+                        UpdateState( r, start );
+
+                    if ( !r->start_found &&
+                        start >= r->job->pts_to_start )
+                    {
+                        // pts_to_start point found
+                        r->start_found = 1;
+                    }
+                    // This log is handy when you need to debug timing problems
+                    //hb_log("id %x scr_offset %ld start %ld --> %ld", 
+                    //        buf->id, r->scr_offset, buf->start, 
+                    //        buf->start - r->scr_offset);
                     buf->start -= r->scr_offset;
-                    if ( r->job->pts_to_stop && buf->start > r->job->pts_to_stop )
+                }
+                if ( buf->renderOffset != -1 )
+                {
+                    if ( r->scr_changes == r->demux.scr_changes )
                     {
-                        // we're doing a subset of the input and we've hit the
-                        // stopping point.
-                        hb_buffer_close( &buf );
-                        goto done;
+                        // This packet is referenced to the same SCR as the last.
+                        // Adjust timestamp to remove the System Clock Reference
+                        // offset then update the average inter-packet time
+                        // for this stream.
+                        buf->renderOffset -= r->scr_offset;
+                        update_ipt( r, buf );
                     }
                 }
+                if ( !r->start_found )
+                {
+                    hb_buffer_close( &buf );
+                    continue;
+                }
 
                 buf->sequence = r->sequence++;
                 /* if there are mutiple output fifos, send a copy of the
@@ -456,27 +563,34 @@ static void ReaderFunc( void * _r )
         }
     }
 
-  done:
     // send empty buffers downstream to video & audio decoders to signal we're done.
-    push_buf( r, r->job->fifo_mpeg2, hb_buffer_init(0) );
-
-    hb_audio_t *audio;
-    for( n = 0; ( audio = hb_list_item( r->job->title->list_audio, n ) ); ++n )
+    if( !*r->die && !r->job->done )
     {
-        if ( audio->priv.fifo_in )
-            push_buf( r, audio->priv.fifo_in, hb_buffer_init(0) );
-    }
+        push_buf( r, r->job->fifo_mpeg2, hb_buffer_init(0) );
 
-    hb_subtitle_t *subtitle;
-    for( n = 0; ( subtitle = hb_list_item( r->job->title->list_subtitle, n ) ); ++n )
-    {
-        if ( subtitle->fifo_in && subtitle->source == VOBSUB)
-            push_buf( r, subtitle->fifo_in, hb_buffer_init(0) );
+        hb_audio_t *audio;
+        for( n = 0; (audio = hb_list_item( r->job->title->list_audio, n)); ++n )
+        {
+            if ( audio->priv.fifo_in )
+                push_buf( r, audio->priv.fifo_in, hb_buffer_init(0) );
+        }
+
+        hb_subtitle_t *subtitle;
+        for( n = 0; (subtitle = hb_list_item( r->job->title->list_subtitle, n)); ++n )
+        {
+            if ( subtitle->fifo_in && subtitle->source == VOBSUB)
+                push_buf( r, subtitle->fifo_in, hb_buffer_init(0) );
+        }
     }
 
     hb_list_empty( &list );
     hb_buffer_close( &ps );
-    if (r->dvd)
+    if (r->bd)
+    {
+        hb_bd_stop( r->bd );
+        hb_bd_close( &r->bd );
+    }
+    else if (r->dvd)
     {
         hb_dvd_stop( r->dvd );
         hb_dvd_close( &r->dvd );
@@ -501,6 +615,46 @@ static void ReaderFunc( void * _r )
     _r = NULL;
 }
 
+static void UpdateState( hb_reader_t  * r, int64_t start)
+{
+    hb_state_t state;
+    uint64_t now;
+    double avg;
+
+    now = hb_get_date();
+    if( !r->st_first )
+    {
+        r->st_first = now;
+    }
+
+#define p state.param.working
+    state.state = HB_STATE_SEARCHING;
+    p.progress  = (float) start / (float) r->job->pts_to_start;
+    if( p.progress > 1.0 )
+    {
+        p.progress = 1.0;
+    }
+    if (now > r->st_first)
+    {
+        int eta;
+
+        avg = 1000.0 * (double)start / (now - r->st_first);
+        eta = ( r->job->pts_to_start - start ) / avg;
+        p.hours   = eta / 3600;
+        p.minutes = ( eta % 3600 ) / 60;
+        p.seconds = eta % 60;
+    }
+    else
+    {
+        p.rate_avg = 0.0;
+        p.hours    = -1;
+        p.minutes  = -1;
+        p.seconds  = -1;
+    }
+#undef p
+
+    hb_set_state( r->job->h, &state );
+}
 /***********************************************************************
  * GetFifoForId
  ***********************************************************************
index a4943b7..8c7e9a2 100644 (file)
@@ -472,8 +472,14 @@ int renderWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                 pv->dropped_frames++;
 
                 /* Pop the frame's subtitle and dispose of it. */
-                hb_buffer_t * subtitles = hb_fifo_get( pv->subtitle_queue );
-                hb_buffer_close( &subtitles );
+                hb_buffer_t * subpicture_list = hb_fifo_get( pv->subtitle_queue );
+                hb_buffer_t * subpicture;
+                hb_buffer_t * subpicture_next;
+                for ( subpicture = subpicture_list; subpicture; subpicture = subpicture_next )
+                {
+                    subpicture_next = subpicture->next_subpicture;
+                    hb_buffer_close( &subpicture );
+                }
                 buf_tmp_in = NULL;
                 break;
             }
@@ -500,10 +506,13 @@ int renderWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     /* Apply subtitles */
     if( buf_tmp_in )
     {
-        hb_buffer_t * subtitles = hb_fifo_get( pv->subtitle_queue );
-        if( subtitles )
+        hb_buffer_t * subpicture_list = hb_fifo_get( pv->subtitle_queue );
+        hb_buffer_t * subpicture;
+        hb_buffer_t * subpicture_next;
+        for ( subpicture = subpicture_list; subpicture; subpicture = subpicture_next )
         {
-            ApplySub( job, buf_tmp_in, &subtitles );
+            subpicture_next = subpicture->next_subpicture;
+            ApplySub( job, buf_tmp_in, &subpicture );
         }
     }
 
@@ -712,16 +721,16 @@ int renderInit( hb_work_object_t * w, hb_job_t * job )
     if( job->crop[0] || job->crop[1] || job->crop[2] || job->crop[3] ||
         job->width != title->width || job->height != title->height )
     {
-        pv->context = sws_getContext(title->width  - (job->crop[2] + job->crop[3]),
+        pv->context = hb_sws_get_context(title->width  - (job->crop[2] + job->crop[3]),
                                      title->height - (job->crop[0] + job->crop[1]),
                                      PIX_FMT_YUV420P,
                                      job->width, job->height, PIX_FMT_YUV420P,
-                                     swsflags, NULL, NULL, NULL);
+                                     swsflags);
     }
 
     /* Setup FIFO queue for subtitle cache */
-    pv->subtitle_queue = hb_fifo_init( 8 );
-    pv->delay_queue = hb_fifo_init( 8 );
+    pv->subtitle_queue = hb_fifo_init( 8, 1 );
+    pv->delay_queue = hb_fifo_init( 8, 1 );
 
     /* VFR IVTC needs a bunch of time-keeping variables to track
       how many frames are dropped, how many are extended, what the
diff --git a/libhb/rotate.c b/libhb/rotate.c
new file mode 100644 (file)
index 0000000..efa825a
--- /dev/null
@@ -0,0 +1,387 @@
+
+#include "hb.h"
+#include "hbffmpeg.h"
+//#include "mpeg2dec/mpeg2.h"
+
+#define MODE_DEFAULT     3
+// Mode 1: Flip vertically (y0 becomes yN and yN becomes y0)
+// Mode 2: Flip horizontally (x0 becomes xN and xN becomes x0)
+// Mode 3: Flip both horizontally and vertically (modes 1 and 2 combined)
+
+typedef struct rotate_arguments_s {
+    uint8_t **dst;
+    int stop;
+} rotate_arguments_t;
+
+struct hb_filter_private_s
+{
+    int              pix_fmt;
+    int              width[3];
+    int              height[3];
+
+    int              mode;
+
+    int              ref_stride[3];
+
+    int              cpu_count;
+
+    hb_thread_t    ** rotate_threads;        // Threads for Rotate - one per CPU
+    hb_lock_t      ** rotate_begin_lock;     // Thread has work
+    hb_lock_t      ** rotate_complete_lock;  // Thread has completed work
+    rotate_arguments_t *rotate_arguments;     // Arguments to thread for work
+
+    AVPicture        pic_in;
+    AVPicture        pic_out;
+    hb_buffer_t *    buf_out;
+    hb_buffer_t *    buf_settings;
+};
+
+hb_filter_private_t * hb_rotate_init( int pix_fmt,
+                                           int width,
+                                           int height,
+                                           char * settings );
+
+int hb_rotate_work( hb_buffer_t * buf_in,
+                         hb_buffer_t ** buf_out,
+                         int pix_fmt,
+                         int width,
+                         int height,
+                         hb_filter_private_t * pv );
+
+void hb_rotate_close( hb_filter_private_t * pv );
+
+hb_filter_object_t hb_filter_rotate =
+{
+    FILTER_ROTATE,
+    "Rotate (flips image axes)",
+    NULL,
+    hb_rotate_init,
+    hb_rotate_work,
+    hb_rotate_close,
+};
+
+
+static void rotate_filter_line( uint8_t *dst,
+                               uint8_t *cur,
+                               int plane,
+                               hb_filter_private_t * pv )
+{
+
+    int w = pv->width[plane];
+
+    int x;
+    for( x = 0; x < w; x++)
+    {
+        if( pv->mode & 2 )
+        {
+            dst[x] = cur[w-x-1];
+        }
+        else
+        {
+            dst[x] = cur[x];
+        }
+    }
+}
+
+typedef struct rotate_thread_arg_s {
+    hb_filter_private_t *pv;
+    int segment;
+} rotate_thread_arg_t;
+
+/*
+ * rotate this segment of all three planes in a single thread.
+ */
+void rotate_filter_thread( void *thread_args_v )
+{
+    rotate_arguments_t *rotate_work = NULL;
+    hb_filter_private_t * pv;
+    int run = 1;
+    int plane;
+    int segment, segment_start, segment_stop;
+    rotate_thread_arg_t *thread_args = thread_args_v;
+    uint8_t **dst;
+    int y, w, h, ref_stride;
+
+
+    pv = thread_args->pv;
+    segment = thread_args->segment;
+
+    hb_log("Rotate thread started for segment %d", segment);
+
+    while( run )
+    {
+        /*
+         * Wait here until there is work to do. hb_lock() blocks until
+         * render releases it to say that there is more work to do.
+         */
+        hb_lock( pv->rotate_begin_lock[segment] );
+
+        rotate_work = &pv->rotate_arguments[segment];
+
+        if( rotate_work->stop )
+        {
+            /*
+             * No more work to do, exit this thread.
+             */
+            run = 0;
+            continue;
+        } 
+
+        if( rotate_work->dst == NULL )
+        {
+            hb_error( "Thread started when no work available" );
+            hb_snooze(500);
+            continue;
+        }
+        
+        /*
+         * Process all three planes, but only this segment of it.
+         */
+        for( plane = 0; plane < 3; plane++)
+        {
+
+            dst = rotate_work->dst;
+            w = pv->width[plane];
+            h = pv->height[plane];
+            ref_stride = pv->ref_stride[plane];
+            segment_start = ( h / pv->cpu_count ) * segment;
+            if( segment == pv->cpu_count - 1 )
+            {
+                /*
+                 * Final segment
+                 */
+                segment_stop = h;
+            } else {
+                segment_stop = ( h / pv->cpu_count ) * ( segment + 1 );
+            }
+
+            for( y = segment_start; y < segment_stop; y++ )
+            {
+                uint8_t * cur;
+                
+                if( pv->mode & 1 )
+                {
+                    cur  = &pv->pic_in.data[plane][(h-y-1)*pv->pic_in.linesize[plane]];
+                }
+                else
+                {
+                    cur  = &pv->pic_in.data[plane][(y)*pv->pic_in.linesize[plane]];
+                }
+                uint8_t *dst2 = &dst[plane][y*w];
+
+                rotate_filter_line( dst2, 
+                                   cur, 
+                                   plane, 
+                                   pv );
+            }
+        }
+        /*
+         * Finished this segment, let everyone know.
+         */
+        hb_unlock( pv->rotate_complete_lock[segment] );
+    }
+    free( thread_args_v );
+}
+
+
+/*
+ * threaded rotate - each thread rptates a single segment of all
+ * three planes. Where a segment is defined as the frame divided by
+ * the number of CPUs.
+ *
+ * This function blocks until the frame is rotated.
+ */
+static void rotate_filter( uint8_t ** dst,
+                          hb_filter_private_t * pv )
+{
+
+    int segment;
+    
+    for( segment = 0; segment < pv->cpu_count; segment++ )
+    {  
+        /*
+         * Setup the work for this plane.
+         */
+        pv->rotate_arguments[segment].dst = dst;
+
+        /*
+         * Let the thread for this plane know that we've setup work 
+         * for it by releasing the begin lock (ensuring that the
+         * complete lock is already locked so that we block when
+         * we try to lock it again below).
+         */
+        hb_lock( pv->rotate_complete_lock[segment] );
+        hb_unlock( pv->rotate_begin_lock[segment] );
+    }
+
+    /*
+     * Wait until all three threads have completed by trying to get
+     * the complete lock that we locked earlier for each thread, which
+     * will block until that thread has completed the work on that
+     * plane.
+     */
+    for( segment = 0; segment < pv->cpu_count; segment++ )
+    {
+        hb_lock( pv->rotate_complete_lock[segment] );
+        hb_unlock( pv->rotate_complete_lock[segment] );
+    }
+
+    /*
+     * Entire frame is now rotated.
+     */
+}
+
+
+hb_filter_private_t * hb_rotate_init( int pix_fmt,
+                                           int width,
+                                           int height,
+                                           char * settings )
+{
+    if( pix_fmt != PIX_FMT_YUV420P )
+    {
+        return 0;
+    }
+
+    hb_filter_private_t * pv = calloc( 1, sizeof(struct hb_filter_private_s) );
+
+    pv->pix_fmt = pix_fmt;
+
+    pv->width[0]  = width;
+    pv->height[0] = height;
+    pv->width[1]  = pv->width[2]  = width >> 1;
+    pv->height[1] = pv->height[2] = height >> 1;
+
+    pv->buf_out = hb_video_buffer_init( width, height );
+    pv->buf_settings = hb_buffer_init( 0 );
+
+    pv->mode     = MODE_DEFAULT;
+
+    pv->ref_stride[0] = pv->width[0];
+    pv->ref_stride[1] = pv->width[1];
+    pv->ref_stride[2] = pv->width[2];
+    
+    if( settings )
+    {
+        sscanf( settings, "%d",
+                &pv->mode );
+    }
+
+    pv->cpu_count = hb_get_cpu_count();
+
+
+    /*
+     * Create threads and locks.
+     */
+    pv->rotate_threads = malloc( sizeof( hb_thread_t* ) * pv->cpu_count );
+    pv->rotate_begin_lock = malloc( sizeof( hb_lock_t * ) * pv->cpu_count );
+    pv->rotate_complete_lock = malloc( sizeof( hb_lock_t * ) * pv->cpu_count );
+    pv->rotate_arguments = malloc( sizeof( rotate_arguments_t ) * pv->cpu_count );
+
+    int i;
+    for( i = 0; i < pv->cpu_count; i++ )
+    {
+        rotate_thread_arg_t *thread_args;
+    
+        thread_args = malloc( sizeof( rotate_thread_arg_t ) );
+    
+        if( thread_args ) {
+            thread_args->pv = pv;
+            thread_args->segment = i;
+    
+            pv->rotate_begin_lock[i] = hb_lock_init();
+            pv->rotate_complete_lock[i] = hb_lock_init();
+    
+            /*
+             * Important to start off with the threads locked waiting
+             * on input.
+             */
+            hb_lock( pv->rotate_begin_lock[i] );
+    
+            pv->rotate_arguments[i].stop = 0;
+            pv->rotate_arguments[i].dst = NULL;
+            
+            pv->rotate_threads[i] = hb_thread_init( "rotate_filter_segment",
+                                                   rotate_filter_thread,
+                                                   thread_args,
+                                                   HB_NORMAL_PRIORITY );
+        } else {
+            hb_error( "rotate could not create threads" );
+        }
+    }
+
+    return pv;
+}
+
+void hb_rotate_close( hb_filter_private_t * pv )
+{
+    if( !pv )
+    {
+        return;
+    }
+
+    /* Cleanup frame buffers */
+    if( pv->buf_out )
+    {
+        hb_buffer_close( &pv->buf_out );
+    }
+    if (pv->buf_settings )
+    {
+        hb_buffer_close( &pv->buf_settings );
+    }
+
+    int i;
+    for( i = 0; i < pv->cpu_count; i++)
+    {
+        /*
+         * Tell each rotate thread to stop, and then cleanup.
+         */
+        pv->rotate_arguments[i].stop = 1;
+        hb_unlock(  pv->rotate_begin_lock[i] );
+    
+        hb_thread_close( &pv->rotate_threads[i] );
+        hb_lock_close( &pv->rotate_begin_lock[i] );
+        hb_lock_close( &pv->rotate_complete_lock[i] );
+    }
+    
+    /*
+     * free memory for rotate structs
+     */
+    free( pv->rotate_threads );
+    free( pv->rotate_begin_lock );
+    free( pv->rotate_complete_lock );
+    free( pv->rotate_arguments );
+
+    free( pv );
+}
+
+int hb_rotate_work( hb_buffer_t * buf_in,
+                         hb_buffer_t ** buf_out,
+                         int pix_fmt,
+                         int width,
+                         int height,
+                         hb_filter_private_t * pv )
+{
+    if( !pv ||
+        pix_fmt != pv->pix_fmt ||
+        width   != pv->width[0] ||
+        height  != pv->height[0] )
+    {
+        return FILTER_FAILED;
+    }
+
+    avpicture_fill( &pv->pic_in, buf_in->data,
+                    pix_fmt, width, height );
+
+    avpicture_fill( &pv->pic_out, pv->buf_out->data,
+                        pix_fmt, width, height );
+
+    //do stuff here
+    rotate_filter( pv->pic_out.data, pv );
+    hb_buffer_copy_settings( pv->buf_out, buf_in );
+    
+    *buf_out = pv->buf_out;
+    
+    return FILTER_OK;
+}
+
+
index 74cc52a..901551f 100644 (file)
@@ -5,6 +5,7 @@
    It may be used under the terms of the GNU General Public License. */
 
 #include "hb.h"
+#include "hbffmpeg.h"
 #include "a52dec/a52.h"
 #include "dca.h"
 
 
 typedef struct
 {
-    hb_handle_t * h;
+    hb_handle_t  * h;
+    volatile int * die;
 
-    char        * path;
-    int           title_index;
-    hb_list_t   * list_title;
+    char         * path;
+    int            title_index;
+    hb_list_t    * list_title;
 
-    hb_dvd_t    * dvd;
-       hb_stream_t * stream;
-       
-    int           preview_count;
-    int           store_previews;
+    hb_bd_t      * bd;
+    hb_dvd_t     * dvd;
+    hb_stream_t  * stream;
+    hb_batch_t   * batch;
+
+    int            preview_count;
+    int            store_previews;
+
+    uint64_t       min_title_duration;
 
 } hb_scan_t;
 
@@ -43,19 +49,22 @@ static const char *aspect_to_string( double aspect )
     return arstr;
 }
 
-hb_thread_t * hb_scan_init( hb_handle_t * handle, const char * path,
-                            int title_index, hb_list_t * list_title,
-                            int preview_count, int store_previews )
+hb_thread_t * hb_scan_init( hb_handle_t * handle, volatile int * die,
+                            const char * path, int title_index, 
+                            hb_list_t * list_title, int preview_count, 
+                            int store_previews, uint64_t min_duration )
 {
     hb_scan_t * data = calloc( sizeof( hb_scan_t ), 1 );
 
     data->h            = handle;
+    data->die          = die;
     data->path         = strdup( path );
     data->title_index  = title_index;
     data->list_title   = list_title;
     
     data->preview_count  = preview_count;
     data->store_previews = store_previews;
+    data->min_title_duration = min_duration;
     
     return hb_thread_init( "scan", ScanFunc, data, HB_NORMAL_PRIORITY );
 }
@@ -65,13 +74,35 @@ static void ScanFunc( void * _data )
     hb_scan_t  * data = (hb_scan_t *) _data;
     hb_title_t * title;
     int          i;
+    int          feature = 0;
 
-       data->dvd = NULL;
-       data->stream = NULL;
+    data->bd = NULL;
+    data->dvd = NULL;
+    data->stream = NULL;
 
     /* Try to open the path as a DVD. If it fails, try as a file */
-    hb_log( "scan: trying to open with libdvdread" );
-    if( ( data->dvd = hb_dvd_init( data->path ) ) )
+    if( ( data->bd = hb_bd_init( data->path ) ) )
+    {
+        hb_log( "scan: BD has %d title(s)",
+                hb_bd_title_count( data->bd ) );
+        if( data->title_index )
+        {
+            /* Scan this title only */
+            hb_list_add( data->list_title, hb_bd_title_scan( data->bd,
+                         data->title_index, 0 ) );
+        }
+        else
+        {
+            /* Scan all titles */
+            for( i = 0; i < hb_bd_title_count( data->bd ); i++ )
+            {
+                hb_list_add( data->list_title, hb_bd_title_scan( data->bd, 
+                             i + 1, data->min_title_duration ) );
+            }
+            feature = hb_bd_main_feature( data->bd, data->list_title );
+        }
+    }
+    else if( ( data->dvd = hb_dvd_init( data->path ) ) )
     {
         hb_log( "scan: DVD has %d title(s)",
                 hb_dvd_title_count( data->dvd ) );
@@ -79,15 +110,42 @@ static void ScanFunc( void * _data )
         {
             /* Scan this title only */
             hb_list_add( data->list_title, hb_dvd_title_scan( data->dvd,
-                            data->title_index ) );
+                            data->title_index, 0 ) );
         }
         else
         {
             /* Scan all titles */
             for( i = 0; i < hb_dvd_title_count( data->dvd ); i++ )
             {
-                hb_list_add( data->list_title,
-                             hb_dvd_title_scan( data->dvd, i + 1 ) );
+                hb_list_add( data->list_title, hb_dvd_title_scan( data->dvd, 
+                            i + 1, data->min_title_duration ) );
+            }
+            feature = hb_dvd_main_feature( data->dvd, data->list_title );
+        }
+    }
+    else if ( ( data->batch = hb_batch_init( data->path ) ) )
+    {
+        if( data->title_index )
+        {
+            /* Scan this title only */
+            title = hb_batch_title_scan( data->batch, data->title_index );
+            if ( title )
+            {
+                hb_list_add( data->list_title, title );
+            }
+        }
+        else
+        {
+            /* Scan all titles */
+            for( i = 0; i < hb_batch_title_count( data->batch ); i++ )
+            {
+                hb_title_t * title;
+
+                title = hb_batch_title_scan( data->batch, i + 1 );
+                if ( title != NULL )
+                {
+                    hb_list_add( data->list_title, title );
+                }
             }
         }
     }
@@ -107,13 +165,19 @@ static void ScanFunc( void * _data )
         hb_state_t state;
         hb_audio_t * audio;
 
+        if ( *data->die )
+        {
+            goto finish;
+        }
         title = hb_list_item( data->list_title, i );
 
 #define p state.param.scanning
         /* Update the UI */
         state.state   = HB_STATE_SCANNING;
         p.title_cur   = title->index;
-        p.title_count = data->dvd ? hb_dvd_title_count( data->dvd ) : hb_list_count(data->list_title);
+        p.title_count = data->dvd ? hb_dvd_title_count( data->dvd ) : 
+                        data->bd ? hb_bd_title_count( data->bd ) :
+                                   hb_list_count(data->list_title);
         hb_set_state( data->h, &state );
 #undef p
 
@@ -138,9 +202,30 @@ static void ScanFunc( void * _data )
                 free( audio );
                 continue;
             }
+            if ( audio->priv.scan_cache )
+            {
+                hb_fifo_flush( audio->priv.scan_cache );
+                hb_fifo_close( &audio->priv.scan_cache );
+            }
             j++;
         }
 
+        if ( data->dvd || data->bd )
+        {
+            // The subtitle width and height needs to be set to the 
+            // title widht and height for DVDs.  title width and
+            // height don't get set until we decode previews, so
+            // we can't set subtitle width/height till we get here.
+            for( j = 0; j < hb_list_count( title->list_subtitle ); j++ )
+            {
+                hb_subtitle_t *subtitle = hb_list_item( title->list_subtitle, j );
+                if ( subtitle->source == VOBSUB )
+                {
+                    subtitle->width = title->width;
+                    subtitle->height = title->height;
+                }
+            }
+        }
         i++;
     }
 
@@ -154,6 +239,7 @@ static void ScanFunc( void * _data )
         title->job = job;
 
         job->title = title;
+        job->feature = feature;
 
         /* Set defaults settings */
         job->chapter_start = 1;
@@ -202,14 +288,24 @@ static void ScanFunc( void * _data )
         job->mux = HB_MUX_MP4;
     }
 
+finish:
+
+    if( data->bd )
+    {
+        hb_bd_close( &data->bd );
+    }
     if( data->dvd )
     {
         hb_dvd_close( &data->dvd );
     }
-       if (data->stream)
-       {
-               hb_stream_close(&data->stream);
-       }
+    if (data->stream)
+    {
+        hb_stream_close(&data->stream);
+    }
+    if( data->batch )
+    {
+        hb_batch_close( &data->batch );
+    }
     free( data->path );
     free( data );
     _data = NULL;
@@ -377,11 +473,20 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
 
     hb_log( "scan: decoding previews for title %d", title->index );
 
-    if (data->dvd)
+    if (data->bd)
+    {
+        hb_bd_start( data->bd, title );
+        hb_log( "scan: title angle(s) %d", title->angle_count );
+    }
+    else if (data->dvd)
+    {
+        hb_dvd_start( data->dvd, title, 1 );
+        title->angle_count = hb_dvd_angle_count( data->dvd );
+        hb_log( "scan: title angle(s) %d", title->angle_count );
+    }
+    else if (data->batch)
     {
-      hb_dvd_start( data->dvd, title, 1 );
-      title->angle_count = hb_dvd_angle_count( data->dvd );
-      hb_log( "scan: title angle(s) %d", title->angle_count );
+        data->stream = hb_stream_open( title->path, title );
     }
 
     for( i = 0; i < data->preview_count; i++ )
@@ -390,9 +495,20 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
         FILE * file_preview;
         char   filename[1024];
 
+        if ( *data->die )
+        {
+            return 0;
+        }
+        if (data->bd)
+        {
+            if( !hb_bd_seek( data->bd, (float) ( i + 1 ) / ( data->preview_count + 1.0 ) ) )
+          {
+              continue;
+          }
+        }
         if (data->dvd)
         {
-          if( !hb_dvd_seek( data->dvd, (float) ( i + 1 ) / ( data->preview_count + 1.0 ) ) )
+            if( !hb_dvd_seek( data->dvd, (float) ( i + 1 ) / ( data->preview_count + 1.0 ) ) )
           {
               continue;
           }
@@ -411,6 +527,13 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
         hb_deep_log( 2, "scan: preview %d", i + 1 );
 
         int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2;
+#if defined(USE_FF_MPEG2)
+        if (vcodec == WORK_DECMPEG2)
+        {
+            vcodec = WORK_DECAVCODECV;
+            title->video_codec_param = CODEC_ID_MPEG2VIDEO;
+        }
+#endif
         hb_work_object_t *vid_decoder = hb_get_work( vcodec );
         vid_decoder->codec_param = title->video_codec_param;
         vid_decoder->title = title;
@@ -430,10 +553,26 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
             {
                 vidskip = (double)title->rate / (double)title->rate_base + 0.5;
             }
+            // If it's a BD, we can relax this a bit. Since seeks will
+            // at least get us to a recovery point.
+            if (data->bd)
+                vidskip = 4;
         }
 
         for( j = 0; j < 10240 ; j++ )
         {
+            if (data->bd)
+            {
+              if( !hb_bd_read( data->bd, buf_ps ) )
+              {
+                  if ( vid_buf )
+                  {
+                    break;
+                  }
+                  hb_log( "Warning: Could not read data for preview %d, skipped", i + 1 );
+                  goto skip_preview;
+              }
+            }
             if (data->dvd)
             {
               if( !hb_dvd_read( data->dvd, buf_ps ) )
@@ -470,13 +609,19 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
                     {
                         // we're dropping frames to get the video decoder in sync
                         // when the video stream doesn't contain IDR frames
-                        hb_buffer_close( &vid_buf );
-                        vid_buf = NULL;
+                        while (vid_buf && --vidskip >= 0)
+                        {
+                            hb_buffer_t * next = vid_buf->next;
+                            vid_buf->next = NULL;
+                            hb_buffer_close( &vid_buf );
+                            vid_buf = next;
+                        }
                     }
                 }
-                else if( ! AllAudioOK( title ) )
+                else if( ! AllAudioOK( title ) ) 
                 {
                     LookForAudio( title, buf_es );
+                    buf_es = NULL;
                 }
                 if ( buf_es )
                     hb_buffer_close( &buf_es );
@@ -501,6 +646,10 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
              * Could not fill vid_info, don't continue and try to use vid_info
              * in this case.
              */
+            if (vid_buf)
+            {
+                hb_buffer_close( &vid_buf );
+            }
             vid_decoder->close( vid_decoder );
             free( vid_decoder );
             continue;
@@ -570,8 +719,8 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
         
         if( data->store_previews )
         {
-            hb_get_tempory_filename( data->h, filename, "%" PRIxPTR "%d",
-                                     (intptr_t)title, i );
+            hb_get_tempory_filename( data->h, filename, "%d_%d_%d",
+                                     hb_get_instance_id(data->h), title->index, i );
 
             file_preview = fopen( filename, "wb" );
             if( file_preview )
@@ -659,8 +808,24 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
         ++npreviews;
 
 skip_preview:
-        if ( vid_buf )
+        /* Make sure we found audio rates and bitrates */
+        for( j = 0; j < hb_list_count( title->list_audio ); j++ )
+        {
+            hb_audio_t * audio = hb_list_item( title->list_audio, j );
+            if ( audio->priv.scan_cache )
+            {
+                hb_fifo_flush( audio->priv.scan_cache );
+            }
+        }
+        if (vid_buf)
+        {
             hb_buffer_close( &vid_buf );
+        }
+    }
+
+    if ( data->batch && data->stream )
+    {
+        hb_stream_close( &data->stream );
     }
 
     if ( npreviews )
@@ -745,6 +910,8 @@ skip_preview:
         hb_buffer_close( &buf_es );
     }
     hb_list_close( &list_es );
+    if (data->bd)
+      hb_bd_stop( data->bd );
     if (data->dvd)
       hb_dvd_stop( data->dvd );
 
@@ -786,9 +953,21 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
     if( !audio || audio->config.in.bitrate != 0 )
     {
         /* not found or already done */
+        hb_buffer_close( &b );
         return;
     }
 
+    if ( audio->priv.scan_cache == NULL )
+        audio->priv.scan_cache = hb_fifo_init( 16, 16 );
+
+    if ( hb_fifo_size_bytes( audio->priv.scan_cache ) >= 4096 )
+    {
+        hb_buffer_t * tmp;
+        tmp = hb_fifo_get( audio->priv.scan_cache );
+        hb_buffer_close( &tmp );
+    }
+    hb_fifo_push( audio->priv.scan_cache, b );
+
     hb_work_object_t *w = hb_codec_decoder( audio->config.in.codec );
 
     if ( w == NULL || w->bsinfo == NULL )
@@ -801,6 +980,7 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
     hb_work_info_t info;
     w->audio = audio;
     w->codec_param = audio->config.in.codec_param;
+    b = hb_fifo_see( audio->priv.scan_cache );
     int ret = w->bsinfo( w, b, &info );
     if ( ret < 0 )
     {
@@ -814,6 +994,9 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
         /* didn't find any info */
         return;
     }
+    hb_fifo_flush( audio->priv.scan_cache );
+    hb_fifo_close( &audio->priv.scan_cache );
+
     audio->config.in.samplerate = info.rate;
     audio->config.in.bitrate = info.bitrate;
     audio->config.in.channel_layout = info.channel_layout;
@@ -854,7 +1037,10 @@ static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
     if ( w )
         free( w );
 
+    hb_fifo_flush( audio->priv.scan_cache );
+    hb_fifo_close( &audio->priv.scan_cache );
     hb_list_rem( title->list_audio, audio );
+    return;
 }
 
 /*
index 538353e..7d9b016 100644 (file)
  *
  * Entries with a worker proc id of 0 or a kind of 'U' indicate that HB
  * doesn't handle the stream type.
+ * N - Not used
+ * U - Unknown (to be determined by further processing)
+ * A - Audio
+ * V - Video
+ * P - PCR
  */
+typedef enum { N, U, A, V, P } kind_t;
 typedef struct {
-    enum { N, U, A, V } kind; /* not handled / unknown / audio / video */
+    kind_t kind; /* not handled / unknown / audio / video */
     int codec;          /* HB worker object id of codec */
     int codec_param;    /* param for codec (usually ffmpeg codec id) */
     const char* name;   /* description of type */
@@ -59,14 +65,14 @@ static const stream2codec_t st2codec[256] = {
 
     st(0x1b, V, WORK_DECAVCODECV,  CODEC_ID_H264,  "H.264"),
 
-    st(0x80, N, 0,                 0,              "DigiCipher II Video"),
+    st(0x80, N, HB_ACODEC_MPGA,    CODEC_ID_PCM_BLURAY, "DigiCipher II Video"),
     st(0x81, A, HB_ACODEC_AC3,     0,              "AC-3"),
     st(0x82, A, HB_ACODEC_DCA,     0,              "HDMV DTS"),
-    st(0x83, A, HB_ACODEC_LPCM,    0,              "LPCM"),
-    st(0x84, A, 0,                 0,              "SDDS"),
+    st(0x83, A, HB_ACODEC_LPCM,    0,              "LPCM/TrueHD"),
+    st(0x84, A, 0,                 0,              "SDDS/EAC3"),
     st(0x85, U, 0,                 0,              "ATSC Program ID"),
     st(0x86, A, HB_ACODEC_DCA,     0,              "DTS-HD"),
-    st(0x87, A, 0,                 0,              "E-AC-3"),
+    st(0x87, A, HB_ACODEC_MPGA,    CODEC_ID_EAC3,  "EAC3"),
 
     st(0x8a, A, HB_ACODEC_DCA,     0,              "DTS"),
 
@@ -88,9 +94,7 @@ typedef enum {
     ffmpeg
 } hb_stream_type_t;
 
-#define kMaxNumberVideoPIDS 1
-#define kMaxNumberAudioPIDS 31
-#define kMaxNumberDecodeStreams (kMaxNumberVideoPIDS+kMaxNumberAudioPIDS)
+#define kMaxNumberDecodeStreams 32
 #define kMaxNumberPMTStreams 32
 
 
@@ -127,20 +131,19 @@ struct hb_stream_s
      * we learn during the initial scan but cache so it can be
      * reused during the conversion read.
      */
-    uint8_t ts_number_video_pids;
-    uint8_t ts_number_audio_pids;
+    uint8_t ts_number_pids;
     uint8_t ts_flags;           // stream characteristics:
 #define         TS_HAS_PCR  (1 << 0)    // at least one PCR seen
 #define         TS_HAS_RAP  (1 << 1)    // Random Access Point bit seen
 #define         TS_HAS_RSEI (1 << 2)    // "Restart point" SEI seen
     uint8_t ts_IDRs;            // # IDRs found during duration scan
 
-    int16_t ts_video_pids[kMaxNumberVideoPIDS];
-    int16_t ts_audio_pids[kMaxNumberAudioPIDS];
+    int16_t ts_pids[kMaxNumberDecodeStreams];
 
     uint32_t ts_format_id[kMaxNumberDecodeStreams];
 #define TS_FORMAT_ID_AC3 (('A' << 24) | ('C' << 16) | ('-' << 8) | '3')
     uint8_t ts_stream_type[kMaxNumberDecodeStreams];
+    kind_t  ts_stream_kind[kMaxNumberDecodeStreams];
     uint8_t ts_multiplexed[kMaxNumberDecodeStreams];
 
     char    *path;
@@ -158,7 +161,7 @@ struct hb_stream_s
         int flags;
         int rate;
         int bitrate;
-    } a52_info[kMaxNumberAudioPIDS];
+    } a52_info[kMaxNumberDecodeStreams];
 
     struct
     {
@@ -177,8 +180,8 @@ struct hb_stream_s
         int section_length;
         int program_number;
         unsigned int PCR_PID;
+        uint32_t reg_desc;
         int program_info_length;
-        unsigned char *progam_info_descriptor_data;
         struct
         {
             unsigned char stream_type;
@@ -198,7 +201,7 @@ static void hb_ts_stream_find_pids(hb_stream_t *stream);
 static int hb_ts_stream_decode(hb_stream_t *stream, hb_buffer_t *obuf);
 static void hb_ts_stream_reset(hb_stream_t *stream);
 static hb_audio_t *hb_ts_stream_set_audio_id_and_codec(hb_stream_t *stream,
-                                                       int aud_pid_index);
+                                                       int idx);
 static void hb_ps_stream_find_audio_ids(hb_stream_t *stream, hb_title_t *title);
 static off_t align_to_next_packet(hb_stream_t *stream);
 
@@ -207,6 +210,7 @@ static void ffmpeg_close( hb_stream_t *d );
 static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream );
 static int ffmpeg_read( hb_stream_t *stream, hb_buffer_t *buf );
 static int ffmpeg_seek( hb_stream_t *stream, float frac );
+static int ffmpeg_seek_ts( hb_stream_t *stream, int64_t ts );
 
 /*
  * streams have a bunch of state that's learned during the scan. We don't
@@ -287,6 +291,33 @@ static void ts_warn( hb_stream_t *stream, char *log, ... )
     va_end( args );
 }
 
+static kind_t ts_stream_kind( hb_stream_t *stream, int curstream )
+{
+    return st2codec[stream->ts_stream_type[curstream]].kind;
+}
+
+static int index_of_pid(hb_stream_t *stream, int pid)
+{
+    int i;
+
+    for ( i = 0; i < stream->ts_number_pids; ++i )
+        if ( pid == stream->ts_pids[i] )
+            return i;
+
+    return -1;
+}
+
+static int index_of_video(hb_stream_t *stream)
+{
+    int i;
+
+    for ( i = 0; i < stream->ts_number_pids; ++i )
+        if ( V == stream->ts_stream_kind[i] )
+            return i;
+
+    return -1;
+}
+
 static void ts_err( hb_stream_t *stream, int curstream, char *log, ... )
 {
     va_list args;
@@ -351,11 +382,56 @@ static int hb_stream_check_for_ts(const uint8_t *buf)
     return 0;
 }
 
-static int hb_stream_check_for_ps(const uint8_t *buf)
+static int hb_stream_check_for_ps(hb_stream_t *stream)
 {
-    // program streams should start with a PACK then some other mpeg start
-    // code (usually a SYS but that might be missing if we only have a clip).
-    return check_ps_sync(buf) && check_ps_sc(buf);
+    uint8_t buf[2048*4];
+    uint8_t sc_buf[4];
+    int pos = 0;
+    int hits = 0;
+
+    fseek(stream->file_handle, 0, SEEK_SET);
+
+    // program streams should start with a PACK then some other mpeg start 
+    // code (usually a SYS but that might be missing if we only have a clip). 
+    while (pos < 512 * 1024)
+    {
+        int offset;
+
+        if ( fread(buf, 1, sizeof(buf), stream->file_handle) != sizeof(buf) )
+            return 0;
+
+        for ( offset = 0; offset < 8*1024-27; ++offset )
+        {
+            if ( check_ps_sync( &buf[offset] ) && check_ps_sc( &buf[offset] ) )
+            {
+                int pes_offset, prev, data_len;
+                uint8_t sid;
+
+                if ( ++hits == 3 )
+                    return 1;
+                pes_offset = 14 + (buf[13] & 0x7);
+                sid = buf[pes_offset+3];
+                data_len = (buf[pes_offset+4] << 8) + buf[pes_offset+5];
+                if ( data_len && sid > 0xba && sid < 0xf9 )
+                {
+                    prev = ftell( stream->file_handle );
+                    pos = pes_offset + 6 + data_len + prev;
+                    fseek( stream->file_handle, pos, SEEK_SET );
+                    if ( fread(sc_buf, 1, 4, stream->file_handle) != 4 )
+                        return 0;
+                    if (sc_buf[0] == 0x00 && sc_buf[1] == 0x00 && 
+                        sc_buf[2] == 0x01)
+                    {
+                        return 1;
+                    }
+                    fseek( stream->file_handle, prev, SEEK_SET );
+                }
+            }
+        }
+        fseek( stream->file_handle, -27, SEEK_CUR );
+        pos = ftell( stream->file_handle );
+    }
+    return 0;
 }
 
 static int hb_stream_check_for_dvd_ps(const uint8_t *buf)
@@ -382,7 +458,7 @@ static int hb_stream_get_type(hb_stream_t *stream)
             stream->packetsize = psize;
             stream->hb_stream_type = transport;
             hb_ts_stream_init(stream);
-            if ( !stream->ts_number_video_pids || !stream->ts_number_audio_pids )
+            if ( index_of_video( stream ) < 0 )
             {
                 return 0;
             }
@@ -394,7 +470,7 @@ static int hb_stream_get_type(hb_stream_t *stream)
             stream->hb_stream_type = dvd_program;
             return 1;
         }
-        if ( hb_stream_check_for_ps(buf) != 0 )
+        if ( hb_stream_check_for_ps(stream) != 0 )
         {
             hb_log("file is MPEG Program Stream");
             stream->hb_stream_type = program;
@@ -409,24 +485,24 @@ static void hb_stream_delete_dynamic( hb_stream_t *d )
     if( d->file_handle )
     {
         fclose( d->file_handle );
-               d->file_handle = NULL;
+        d->file_handle = NULL;
     }
 
-       int i=0;
+    int i=0;
 
     if ( d->ts_packet )
     {
         free( d->ts_packet );
         d->ts_packet = NULL;
     }
-       for (i = 0; i < kMaxNumberDecodeStreams; i++)
-       {
-               if (d->ts_buf[i])
-               {
-                       hb_buffer_close(&(d->ts_buf[i]));
-                       d->ts_buf[i] = NULL;
-               }
-       }
+    for (i = 0; i < kMaxNumberDecodeStreams; i++)
+    {
+        if (d->ts_buf[i])
+        {
+            hb_buffer_close(&(d->ts_buf[i]));
+            d->ts_buf[i] = NULL;
+        }
+    }
 }
 
 static void hb_stream_delete( hb_stream_t *d )
@@ -436,16 +512,16 @@ static void hb_stream_delete( hb_stream_t *d )
     free( d );
 }
 
-static int audio_inactive( hb_stream_t *stream, int indx )
+static int audio_inactive( hb_stream_t *stream, int idx )
 {
-    int aud_indx = indx - 1;
+    int pid = stream->ts_pids[idx];
 
-    if ( stream->ts_audio_pids[aud_indx] < 0 )
+    if ( pid < 0 )
     {
         // PID declared inactive by hb_stream_title_scan
         return 1;
     }
-    if ( stream->ts_audio_pids[aud_indx] == stream->pmt_info.PCR_PID )
+    if ( pid == stream->pmt_info.PCR_PID )
     {
         // PCR PID is always active
         return 0;
@@ -457,13 +533,14 @@ static int audio_inactive( hb_stream_t *stream, int indx )
     for ( i = 0; i < hb_list_count( stream->title->list_audio ); ++i )
     {
         hb_audio_t *audio = hb_list_item( stream->title->list_audio, i );
-        if ( audio->id == indx )
+        if ( audio->id == pid )
         {
             return 0;
         }
     }
+
     // not in the title's audio list - declare the PID inactive
-    stream->ts_audio_pids[aud_indx] = -stream->ts_audio_pids[aud_indx];
+    stream->ts_pids[idx] = -stream->ts_pids[idx];
     return 1;
 }
 
@@ -511,17 +588,18 @@ hb_stream_t * hb_stream_open( char *path, hb_title_t *title )
         {
             d->ts_packet = malloc( d->packetsize );
 
-            int i = 0;
-            for ( ; i < d->ts_number_video_pids + d->ts_number_audio_pids; i++)
+            int i;
+            for ( i = 0; i < d->ts_number_pids; i++)
             {
-                if ( i && audio_inactive( d, i ) )
+                if ( d->ts_stream_kind[i] == A &&
+                     audio_inactive( d, i ) )
                 {
                     // this PID isn't wanted (we don't have a codec for it
                     // or scan didn't find audio parameters)
                     continue;
                 }
                 d->ts_buf[i] = hb_buffer_init(d->packetsize);
-                               d->ts_buf[i]->size = 0;
+                d->ts_buf[i]->size = 0;
             }
             hb_stream_seek( d, 0. );
         }
@@ -547,7 +625,7 @@ hb_stream_t * hb_stream_open( char *path, hb_title_t *title )
             return d;
         }
         fclose( d->file_handle );
-               d->file_handle = NULL;
+        d->file_handle = NULL;
         if ( ffmpeg_open( d, title ) )
         {
             return d;
@@ -566,6 +644,97 @@ hb_stream_t * hb_stream_open( char *path, hb_title_t *title )
     return NULL;
 }
 
+hb_stream_t * hb_bd_stream_open( hb_title_t *title )
+{
+    int ii;
+
+    hb_stream_t *d = calloc( sizeof( hb_stream_t ), 1 );
+    if ( d == NULL )
+    {
+        hb_log( "hb_bd_stream_open: can't allocate space for stream state" );
+        return NULL;
+    }
+
+    for (ii = 0; ii < kMaxNumberDecodeStreams; ii++)
+    {
+        d->ts_streamcont[ii] = -1;
+        d->ts_pids[ii] = -1;
+    }
+
+    d->file_handle = NULL;
+    d->title = title;
+    d->path = NULL;
+    d->ts_packet = NULL;
+
+    d->ts_number_pids = 0;
+    d->ts_pids[0] = title->video_id;
+    d->ts_stream_type[0] = title->video_stream_type;
+    d->ts_stream_kind[0] = V;
+    d->ts_number_pids++;
+
+    hb_audio_t * audio;
+    for ( ii = 0; ( audio = hb_list_item( title->list_audio, ii ) ); ++ii )
+    {
+        d->ts_pids[d->ts_number_pids] = audio->id;
+        d->ts_stream_type[d->ts_number_pids] = audio->config.in.stream_type;
+        d->ts_stream_kind[d->ts_number_pids] = A;
+
+        if ( d->ts_stream_type[d->ts_number_pids] == 0x83 &&
+             title->reg_desc == STR4_TO_UINT32("HDMV") )
+        {
+            // This is an interleaved TrueHD/AC-3 stream and the esid of
+            // the AC-3 is 0x76
+            d->ts_multiplexed[d->ts_number_pids] = 0x76;
+            d->ts_stream_type[d->ts_number_pids] = 0x81;
+        }
+        if ( d->ts_stream_type[d->ts_number_pids] == 0x86 &&
+             title->reg_desc == STR4_TO_UINT32("HDMV") )
+        {
+            // This is an interleaved DTS-HD/DTS stream and the esid of
+            // the DTS is 0x71
+            d->ts_multiplexed[d->ts_number_pids] = 0x71;
+            d->ts_stream_type[d->ts_number_pids] = 0x82;
+        }
+        if ( d->ts_stream_type[d->ts_number_pids] == 0x84 &&
+             title->reg_desc == STR4_TO_UINT32("HDMV") )
+        {
+            // EAC3 audio in bluray has an stype of 0x84
+            // which conflicts with SDDS
+            // To distinguish, Bluray streams have a reg_desc of HDMV
+            d->ts_stream_type[d->ts_number_pids] = 0x87;
+        }
+
+        d->ts_number_pids++;
+    }
+
+    d->ts_flags = TS_HAS_RAP;
+    // When scanning, title->job == NULL.  We don't need to wait for
+    // a PCR when scanning. In fact, it trips us up on the first
+    // preview of every title since we would have to read quite a
+    // lot of data before finding the PCR.
+    if (title->pcr_pid != 0xFFFF && title->job)
+    {
+        if ( index_of_pid( d, title->pcr_pid ) < 0 )
+        {
+            // BD PCR PID is specified to always be 0x1001
+            d->ts_pids[d->ts_number_pids] = 0x1001;
+            d->ts_stream_kind[d->ts_number_pids] = P;
+            d->ts_number_pids++;
+        }
+    }
+
+    d->packetsize = 192;
+    d->hb_stream_type = transport;
+
+    for ( ii = 0; ii < d->ts_number_pids; ii++ )
+    {
+        d->ts_buf[ii] = hb_buffer_init(d->packetsize);
+        d->ts_buf[ii]->size = 0;
+    }
+
+    return d;
+}
+
 /***********************************************************************
  * hb_stream_close
  ***********************************************************************
@@ -618,28 +787,14 @@ void hb_stream_close( hb_stream_t ** _d )
  * by setting its PID to an invalid value so no packet will match it. (We can't
  * move any of the entries since the index of the entry is used as the id
  * of the media stream for HB. */
-static void hb_stream_delete_audio_entry(hb_stream_t *stream, int indx)
+static void hb_stream_delete_entry(hb_stream_t *stream, int indx)
 {
-    if ( stream->ts_audio_pids[indx] > 0 )
+    if ( stream->ts_pids[indx] > 0 )
     {
-        stream->ts_audio_pids[indx] = -stream->ts_audio_pids[indx];
+        stream->ts_pids[indx] = -stream->ts_pids[indx];
     }
 }
 
-static int index_of_pid(int pid, hb_stream_t *stream)
-{
-    int i;
-
-    if ( pid == stream->ts_video_pids[0] )
-        return 0;
-
-    for ( i = 0; i < stream->ts_number_audio_pids; ++i )
-        if ( pid == stream->ts_audio_pids[i] )
-            return i + 1;
-
-    return -1;
-}
-
 /***********************************************************************
  * hb_ps_stream_title_scan
  ***********************************************************************
@@ -647,20 +802,21 @@ static int index_of_pid(int pid, hb_stream_t *stream)
  **********************************************************************/
 hb_title_t * hb_stream_title_scan(hb_stream_t *stream)
 {
-       if ( stream->hb_stream_type == ffmpeg )
+    if ( stream->hb_stream_type == ffmpeg )
         return ffmpeg_title_scan( stream );
 
     // 'Barebones Title'
     hb_title_t *aTitle = hb_title_init( stream->path, 0 );
+    aTitle->type = HB_STREAM_TYPE;
     aTitle->index = 1;
 
-       // Copy part of the stream path to the title name
-       char *sep = strrchr(stream->path, '/');
-       if (sep)
-               strcpy(aTitle->name, sep+1);
-       char *dot_term = strrchr(aTitle->name, '.');
-       if (dot_term)
-               *dot_term = '\0';
+    // Copy part of the stream path to the title name
+    char *sep = strrchr(stream->path, '/');
+    if (sep)
+        strcpy(aTitle->name, sep+1);
+    char *dot_term = strrchr(aTitle->name, '.');
+    if (dot_term)
+        *dot_term = '\0';
 
     // Height, width,  rate and aspect ratio information is filled in when the previews are built
 
@@ -683,33 +839,48 @@ hb_title_t * hb_stream_title_scan(hb_stream_t *stream)
     //   the elementary stream is an audio type.
     // - For program streams read the first 4MB and take every unique
     //   audio stream we find.
-       if (stream->hb_stream_type == transport)
-       {
+    if (stream->hb_stream_type == transport)
+    {
         int i;
 
-        for (i=0; i < stream->ts_number_audio_pids; i++)
+        for (i=0; i < stream->ts_number_pids; i++)
         {
             hb_audio_t *audio = hb_ts_stream_set_audio_id_and_codec(stream, i);
-            if (audio->config.in.codec)
-                hb_list_add( aTitle->list_audio, audio );
-            else
+            if ( audio )
             {
-                free(audio);
-                hb_stream_delete_audio_entry(stream, i);
+                hb_list_add( aTitle->list_audio, audio );
             }
         }
 
         // make sure we're grabbing the PCR PID
-        if ( index_of_pid( stream->pmt_info.PCR_PID, stream ) < 0 )
+        if ( index_of_pid( stream, stream->pmt_info.PCR_PID ) < 0 )
         {
-            stream->ts_audio_pids[stream->ts_number_audio_pids++] =
-                stream->pmt_info.PCR_PID;
+            stream->ts_pids[stream->ts_number_pids] = stream->pmt_info.PCR_PID;
+            stream->ts_stream_kind[stream->ts_number_pids] = P;
+            stream->ts_number_pids++;
+        }
+
+        for (i = 0; i < stream->ts_number_pids; i++)
+        {
+            kind_t kind = stream->ts_stream_kind[i];
+
+            if ( kind == N || kind == U )
+            {
+                hb_stream_delete_entry(stream, i);
+            }
         }
 
         // set the video id, codec & muxer
-        aTitle->video_id = 0;
-        aTitle->video_codec = st2codec[stream->ts_stream_type[0]].codec;
-        aTitle->video_codec_param = st2codec[stream->ts_stream_type[0]].codec_param;
+        int idx = index_of_video( stream );
+        if ( idx < 0 )
+        {
+            hb_title_close( &aTitle );
+            return NULL;
+        }
+
+        aTitle->video_id = stream->ts_pids[idx];
+        aTitle->video_codec = st2codec[stream->ts_stream_type[idx]].codec;
+        aTitle->video_codec_param = st2codec[stream->ts_stream_type[idx]].codec_param;
         aTitle->demuxer = HB_MPEG2_TS_DEMUXER;
 
         if ( ( stream->ts_flags & TS_HAS_PCR ) == 0 )
@@ -722,13 +893,13 @@ hb_title_t * hb_stream_title_scan(hb_stream_t *stream)
             hb_log( "transport stream doesn't seem to have video IDR frames" );
             aTitle->flags |= HBTF_NO_IDR;
         }
-       }
+    }
     else
     {
         hb_ps_stream_find_audio_ids(stream, aTitle);
     }
 
-  return aTitle;
+    return aTitle;
 }
 
 /*
@@ -1026,7 +1197,8 @@ static struct pts_pos hb_sample_pts(hb_stream_t *stream, uint64_t fpos)
         const uint8_t *buf;
         fseeko( stream->file_handle, fpos, SEEK_SET );
         align_to_next_packet( stream );
-        buf = hb_ts_stream_getPEStype( stream, stream->ts_video_pids[0] );
+        int pid = stream->ts_pids[index_of_video(stream)];
+        buf = hb_ts_stream_getPEStype( stream, pid );
         if ( buf == NULL )
         {
             hb_log("hb_sample_pts: couldn't find video packet near %"PRIu64, fpos);
@@ -1104,7 +1276,7 @@ static double compute_stream_rate( struct pts_pos *pp, int n )
             {
                 *rp = ((double)( pp[j].pts - pp[i].pts )) /
                       ((double)( pp[j].pos - pp[i].pos ));
-                               ++rp;
+                ++rp;
             }
         }
     }
@@ -1146,7 +1318,7 @@ static void hb_stream_duration(hb_stream_t *stream, hb_title_t *inTitle)
  **********************************************************************/
 int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b )
 {
-       if ( src_stream->hb_stream_type == ffmpeg )
+    if ( src_stream->hb_stream_type == ffmpeg )
     {
         return ffmpeg_read( src_stream, b );
     }
@@ -1190,6 +1362,37 @@ int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b )
                 ep = b->data + b->alloc;
             }
             *cp++ = c;
+            // Non-video streams can emulate start codes, so we need
+            // to inspect PES packets and skip over their data
+            // sections to avoid mis-detection of the next pack header.
+            if ( ( strt_code >> 8 ) == 0x000001 &&
+                 ( strt_code & 0xff ) >= 0xbb )
+            {
+                int len = 0;
+                c = getc_unlocked( src_stream->file_handle );
+                if ( c == EOF )
+                    break;
+                len = c << 8;
+                c = getc_unlocked( src_stream->file_handle );
+                if ( c == EOF )
+                    break;
+                len |= c;
+                if ( cp+len+2 > ep )
+                {
+                    // need to expand the buffer
+                    int curSize = cp - b->data;
+                    if ( curSize * 2 > curSize+len+2 )
+                        hb_buffer_realloc( b, curSize * 2 );
+                    else
+                        hb_buffer_realloc( b, curSize + len + 2 );
+                    cp = b->data + curSize;
+                    ep = b->data + b->alloc;
+                }
+                *cp++ = len >> 8;
+                *cp++ = len & 0xff;
+                fread( cp, 1, len, src_stream->file_handle );
+                cp += len;
+            }
         }
         funlockfile( src_stream->file_handle );
 
@@ -1199,13 +1402,22 @@ int hb_stream_read( hb_stream_t * src_stream, hb_buffer_t * b )
         if ( c != EOF )
         {
             fseeko( src_stream->file_handle, -4, SEEK_CUR );
-            b->size -= 4;
+            // Only 3 of the 4 bytes read were added to the buffer.
+            b->size -= 3;
         }
         return 1;
     }
     return hb_ts_stream_decode( src_stream, b );
 }
 
+int64_t ffmpeg_initial_timestamp( hb_stream_t * stream )
+{
+    AVStream *s = stream->ffmpeg_ic->streams[stream->ffmpeg_video_id];
+    if ( s->nb_index_entries < 1 )
+        return 0;
+
+    return s->index_entries[0].timestamp;
+}
 int hb_stream_seek_chapter( hb_stream_t * stream, int chapter_num )
 {
 
@@ -1231,7 +1443,7 @@ int hb_stream_seek_chapter( hb_stream_t * stream, int chapter_num )
     stream->chapter = chapter_num - 1;
     stream->chapter_end = sum_dur;
 
-    int64_t pos = ( ( ( sum_dur - chapter->duration ) * AV_TIME_BASE ) / 90000 );
+    int64_t pos = ( ( ( sum_dur - chapter->duration ) * AV_TIME_BASE ) / 90000 ) + ffmpeg_initial_timestamp( stream );
 
     hb_deep_log( 2, "Seeking to chapter %d: starts %"PRId64", ends %"PRId64", AV pos %"PRId64,
                  chapter_num, sum_dur - chapter->duration, sum_dur, pos);
@@ -1240,6 +1452,17 @@ int hb_stream_seek_chapter( hb_stream_t * stream, int chapter_num )
     {
         av_seek_frame( stream->ffmpeg_ic, -1, pos, 0);
     }
+    else
+    {
+        // ffmpeg has a bug that causes the first PTS after
+        // av_find_stream_info() is called to be incorrect.
+        // av_find_stream_info is called whenever opening a file
+        // with ffmpeg.  av_seek_frame clears the condition
+        // that causes the problem. since hb_stream_seek_chapter
+        // is called before we start reading, make sure
+        // we do a seek here.
+        av_seek_frame( stream->ffmpeg_ic, -1, ffmpeg_initial_timestamp( stream ), AVSEEK_FLAG_BACKWARD );
+    }
     return 1;
 }
 
@@ -1261,7 +1484,7 @@ int hb_stream_chapter( hb_stream_t * src_stream )
  **********************************************************************/
 int hb_stream_seek( hb_stream_t * stream, float f )
 {
-       if ( stream->hb_stream_type == ffmpeg )
+    if ( stream->hb_stream_type == ffmpeg )
     {
         return ffmpeg_seek( stream, f );
     }
@@ -1308,6 +1531,15 @@ int hb_stream_seek( hb_stream_t * stream, float f )
     return 1;
 }
 
+int hb_stream_seek_ts( hb_stream_t * stream, int64_t ts )
+{
+    if ( stream->hb_stream_type == ffmpeg )
+    {
+        return ffmpeg_seek_ts( stream, ts );
+    }
+    return -1;
+}
+
 static const char* make_upper( const char* s )
 {
     static char name[8];
@@ -1362,6 +1594,18 @@ static void set_audio_description( hb_audio_t *audio, iso639_lang_t *lang )
               sizeof( audio->config.lang.description ), "%s (%s)",
               strlen(lang->native_name) ? lang->native_name : lang->eng_name,
               codec_name );
+
+    if (audio->config.in.codec == HB_ACODEC_FFMPEG)
+    {
+        int layout = audio->config.in.channel_layout;
+        char *desc = audio->config.lang.description +
+                        strlen( audio->config.lang.description );
+        sprintf( desc, " (%d.%d ch)",
+                 HB_INPUT_CH_LAYOUT_GET_DISCRETE_FRONT_COUNT(layout) +
+                     HB_INPUT_CH_LAYOUT_GET_DISCRETE_REAR_COUNT(layout),
+                 HB_INPUT_CH_LAYOUT_GET_DISCRETE_LFE_COUNT(layout) );
+    }
+
     snprintf( audio->config.lang.simple, sizeof( audio->config.lang.simple ), "%s",
               strlen(lang->native_name) ? lang->native_name : lang->eng_name );
     snprintf( audio->config.lang.iso639_2, sizeof( audio->config.lang.iso639_2 ),
@@ -1369,33 +1613,51 @@ static void set_audio_description( hb_audio_t *audio, iso639_lang_t *lang )
 }
 
 static hb_audio_t *hb_ts_stream_set_audio_id_and_codec(hb_stream_t *stream,
-                                                       int aud_pid_index)
+                                                       int idx)
 {
     off_t cur_pos = ftello(stream->file_handle);
-    hb_audio_t *audio = calloc( sizeof( hb_audio_t ), 1 );
+    hb_audio_t *audio = NULL;
     const uint8_t *buf;
+    kind_t kind;
+    uint8_t stype = 0;
+
+    kind = stream->ts_stream_kind[idx];
+
+    if ( kind != A && kind != U && kind != N )
+    {
+        // Not audio
+        return NULL;
+    }
+    stype = stream->ts_stream_type[idx];
 
     fseeko(stream->file_handle, 0, SEEK_SET);
     align_to_next_packet(stream);
-    buf = hb_ts_stream_getPEStype(stream, stream->ts_audio_pids[aud_pid_index]);
+
+    buf = hb_ts_stream_getPEStype(stream, stream->ts_pids[idx]);
 
     /* check that we found a PES header */
-    uint8_t stype = 0;
     if (buf && buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01)
     {
-        stype = stream->ts_stream_type[1 + aud_pid_index];
-
         // 0xbd ("private stream 1") is the normal container for non-ISO
         // media - AC3/DCA/PCM/etc.
         if ( buf[3] == 0xbd )
         {
-            if ( st2codec[stype].kind == U )
+            if ( kind == U )
             {
                 // XXX assume unknown stream types are AC-3 (if they're not
                 // audio we'll find that out during the scan but if they're
                 // some other type of audio we'll end up ignoring them).
                 stype = 0x81;
-                stream->ts_stream_type[1 + aud_pid_index] = 0x81;
+                stream->ts_stream_type[idx] = 0x81;
+                kind = A;
+            }
+            if ( stype == 0x80 && 
+                 stream->pmt_info.reg_desc == STR4_TO_UINT32("HDMV") )
+            {
+                // LPCM audio in bluray have an stype of 0x80
+                // 0x80 is used for other DigiCipher normally
+                // To distinguish, Bluray streams have a reg_desc of HDMV
+                kind = A;
             }
         }
         else if ( buf[3] == 0xfd )
@@ -1408,21 +1670,33 @@ static hb_audio_t *hb_ts_stream_set_audio_id_and_codec(hb_stream_t *stream,
             // distinguish them. So we have to check if that's happening and
             // if so tell the runtime what esid we want.
             if ( st2codec[stype].kind == A && stype == 0x83 &&
-                 stream->ts_format_id[1 + aud_pid_index] == TS_FORMAT_ID_AC3 )
+                 stream->ts_format_id[idx] == TS_FORMAT_ID_AC3 )
             {
                 // This is an interleaved TrueHD/AC-3 stream and the esid of
                 // the AC-3 is 0x76
-                stream->ts_multiplexed[1 + aud_pid_index] = 0x76;
+                stream->ts_multiplexed[idx] = 0x76;
                 stype = 0x81;
-                stream->ts_stream_type[1 + aud_pid_index] = 0x81;
+                stream->ts_stream_type[idx] = 0x81;
+                kind = A;
             }
             if ( st2codec[stype].kind == A && stype == 0x86 )
             {
                 // This is an interleaved DTS-HD/DTS stream and the esid of
                 // the DTS is 0x71
-                stream->ts_multiplexed[1 + aud_pid_index] = 0x71;
+                stream->ts_multiplexed[idx] = 0x71;
                 stype = 0x82;
-                stream->ts_stream_type[1 + aud_pid_index] = 0x82;
+                stream->ts_stream_type[idx] = 0x82;
+                kind = A;
+            }
+            if ( stype == 0x84 && 
+                 stream->pmt_info.reg_desc == STR4_TO_UINT32("HDMV") )
+            {
+                // EAC3 audio in bluray has an stype of 0x84
+                // which conflicts with SDDS
+                // To distinguish, Bluray streams have a reg_desc of HDMV
+                stype = 0x87;
+                stream->ts_stream_type[idx] = 0x87;
+                kind = A;
             }
         }
         else if ((buf[3] & 0xe0) == 0xc0)
@@ -1433,43 +1707,51 @@ static hb_audio_t *hb_ts_stream_set_audio_id_and_codec(hb_stream_t *stream,
             {
                 // XXX assume unknown stream types are MPEG audio
                 stype = 0x03;
-                stream->ts_stream_type[1 + aud_pid_index] = 0x03;
+                stream->ts_stream_type[idx] = 0x03;
+                kind = A;
             }
         }
         else
         {
             stype = 0;
+            kind = N;
         }
     }
+
     // if we found an audio stream type & HB has a codec that can decode it
     // finish configuring the audio so we'll add it to the title's list.
-    if ( st2codec[stype].kind == A && st2codec[stype].codec )
+    if ( kind == A && st2codec[stype].codec )
     {
-        audio->id = 1 + aud_pid_index;
+        audio = calloc( sizeof( hb_audio_t ), 1 );
+
+        stream->ts_stream_kind[idx] = A;
+        audio->id = stream->ts_pids[idx];
         audio->config.in.codec = st2codec[stype].codec;
         audio->config.in.codec_param = st2codec[stype].codec_param;
-               set_audio_description( audio,
-                  lang_for_code( stream->a52_info[aud_pid_index].lang_code ) );
+        set_audio_description( audio,
+                  lang_for_code( stream->a52_info[idx].lang_code ) );
         hb_log("transport stream pid 0x%x (type 0x%x) may be %s audio (id 0x%x)",
-               stream->ts_audio_pids[aud_pid_index],
+               stream->ts_pids[idx],
                stype, st2codec[stype].name, audio->id);
+
     }
     else
     {
         if ( buf )
         {
             hb_log("transport stream pid 0x%x (type 0x%x, substream 0x%x) "
-                    "isn't audio", stream->ts_audio_pids[aud_pid_index],
-                    stream->ts_stream_type[1 + aud_pid_index], buf[3]);
+                    "isn't audio", stream->ts_pids[idx],
+                    stream->ts_stream_type[idx], buf[3]);
         }
         else
         {
             hb_log("transport stream pid 0x%x (type 0x%x) isn't audio",
-                    stream->ts_audio_pids[aud_pid_index],
-                    stream->ts_stream_type[1 + aud_pid_index]);
+                    stream->ts_pids[idx],
+                    stream->ts_stream_type[idx]);
         }
-       }
+    }
     fseeko(stream->file_handle, cur_pos, SEEK_SET);
+
     return audio;
 }
 
@@ -1562,29 +1844,24 @@ static void hb_ps_stream_find_audio_ids(hb_stream_t *stream, hb_title_t *title)
 
 static void hb_ts_stream_init(hb_stream_t *stream)
 {
-       int i;
+    int i;
 
-       for (i=0; i < kMaxNumberDecodeStreams; i++)
-       {
-               stream->ts_streamcont[i] = -1;
-       }
-       stream->ts_video_pids[0] = -1;
-    for ( i = 0; i < stream->ts_number_audio_pids; i++ )
+    for (i=0; i < kMaxNumberDecodeStreams; i++)
     {
-        stream-> ts_audio_pids[i] = -1;
+        stream->ts_streamcont[i] = -1;
+        stream-> ts_pids[i] = -1;
     }
-
     stream->ts_packet = malloc( stream->packetsize );
 
-       // Find the audio and video pids in the stream
-       hb_ts_stream_find_pids(stream);
+    // Find the audio and video pids in the stream
+    hb_ts_stream_find_pids(stream);
 
-       for (i = 0; i < stream->ts_number_video_pids + stream->ts_number_audio_pids; i++)
-       {
+    for (i = 0; i < stream->ts_number_pids; i++)
+    {
         // demuxing buffer for TS to PS conversion
-               stream->ts_buf[i] = hb_buffer_init(stream->packetsize);
-               stream->ts_buf[i]->size = 0;
-       }
+        stream->ts_buf[i] = hb_buffer_init(stream->packetsize);
+        stream->ts_buf[i]->size = 0;
+    }
 }
 
 #define MAX_HOLE 208*80
@@ -1592,35 +1869,45 @@ static void hb_ts_stream_init(hb_stream_t *stream)
 static off_t align_to_next_packet(hb_stream_t *stream)
 {
     uint8_t buf[MAX_HOLE];
-       off_t pos = 0;
+    off_t pos = 0;
     off_t start = ftello(stream->file_handle);
+    off_t orig;
 
     if ( start >= stream->packetsize ) {
         start -= stream->packetsize;
         fseeko(stream->file_handle, start, SEEK_SET);
     }
+    orig = start;
 
-    if (fread(buf, sizeof(buf), 1, stream->file_handle) == 1)
-       {
-        const uint8_t *bp = buf;
-        int i;
-
-        for ( i = sizeof(buf); --i >= 0; ++bp )
+    while (1)
+    {
+        if (fread(buf, sizeof(buf), 1, stream->file_handle) == 1)
         {
-            if ( have_ts_sync( bp, stream->packetsize ) )
+            const uint8_t *bp = buf;
+            int i;
+
+            for ( i = sizeof(buf) - 8 * stream->packetsize; --i >= 0; ++bp )
             {
+                if ( have_ts_sync( bp, stream->packetsize ) )
+                {
+                    break;
+                }
+            }
+            if ( i >= 0 )
+            {
+                pos = ( bp - buf ) - stream->packetsize + 188;
                 break;
             }
+            fseeko(stream->file_handle, -8 * stream->packetsize, SEEK_CUR);
+            start = ftello(stream->file_handle);
         }
-        if ( i >= 0 )
+        else
         {
-            pos = ( bp - buf ) - stream->packetsize + 188;
-            if ( pos < 0 )
-                pos = 0;
+            return 0;
         }
-       }
+    }
     fseeko(stream->file_handle, start+pos, SEEK_SET);
-       return pos;
+    return start - orig + pos;
 }
 
 
@@ -1631,53 +1918,53 @@ typedef struct {
 } bitbuf_t;
 
 static const unsigned int bitmask[] = {
-       0x0,0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff,
-       0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff,0xffff,
-       0x1ffff,0x3ffff,0x7ffff,0xfffff,0x1fffff,0x3fffff,0x7fffff,0xffffff,
-       0x1ffffff,0x3ffffff,0x7ffffff,0xfffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff};
+    0x0,0x1,0x3,0x7,0xf,0x1f,0x3f,0x7f,0xff,
+    0x1ff,0x3ff,0x7ff,0xfff,0x1fff,0x3fff,0x7fff,0xffff,
+    0x1ffff,0x3ffff,0x7ffff,0xfffff,0x1fffff,0x3fffff,0x7fffff,0xffffff,
+    0x1ffffff,0x3ffffff,0x7ffffff,0xfffffff,0x1fffffff,0x3fffffff,0x7fffffff,0xffffffff};
 
 static inline void set_buf(bitbuf_t *bb, uint8_t* buf, int bufsize, int clear)
 {
-       bb->pos = 0;
-       bb->buf = buf;
-       bb->val = (bb->buf[0] << 24) | (bb->buf[1] << 16) |
+    bb->pos = 0;
+    bb->buf = buf;
+    bb->val = (bb->buf[0] << 24) | (bb->buf[1] << 16) |
               (bb->buf[2] << 8) | bb->buf[3];
-       if (clear)
-               memset(bb->buf, 0, bufsize);
+    if (clear)
+        memset(bb->buf, 0, bufsize);
 }
 
 static inline int buf_size(bitbuf_t *bb)
 {
-       return bb->pos >> 3;
+    return bb->pos >> 3;
 }
 
 static inline unsigned int get_bits(bitbuf_t *bb, int bits)
 {
-       unsigned int val;
-       int left = 32 - (bb->pos & 31);
+    unsigned int val;
+    int left = 32 - (bb->pos & 31);
 
-       if (bits < left)
-       {
-               val = (bb->val >> (left - bits)) & bitmask[bits];
-               bb->pos += bits;
-       }
-       else
-       {
-               val = (bb->val & bitmask[left]) << (bits - left);
-               bb->pos += left;
-               bits -= left;
+    if (bits < left)
+    {
+        val = (bb->val >> (left - bits)) & bitmask[bits];
+        bb->pos += bits;
+    }
+    else
+    {
+        val = (bb->val & bitmask[left]) << (bits - left);
+        bb->pos += left;
+        bits -= left;
 
-               int pos = bb->pos >> 3;
-               bb->val = (bb->buf[pos] << 24) | (bb->buf[pos + 1] << 16) | (bb->buf[pos + 2] << 8) | bb->buf[pos + 3];
+        int pos = bb->pos >> 3;
+        bb->val = (bb->buf[pos] << 24) | (bb->buf[pos + 1] << 16) | (bb->buf[pos + 2] << 8) | bb->buf[pos + 3];
 
-               if (bits > 0)
-               {
-                       val |= (bb->val >> (32 - bits)) & bitmask[bits];
-                       bb->pos += bits;
-               }
-       }
+        if (bits > 0)
+        {
+            val |= (bb->val >> (32 - bits)) & bitmask[bits];
+            bb->pos += bits;
+        }
+    }
 
-       return val;
+    return val;
 }
 
 // extract what useful information we can from the elementary stream
@@ -1695,7 +1982,7 @@ static void decode_element_descriptors(hb_stream_t* stream, int esindx,
         switch (dp[0])
         {
             case 5:    // Registration descriptor
-                stream->ts_format_id[esindx+1] = (dp[2] << 24) | (dp[3] << 16) |
+                stream->ts_format_id[esindx] = (dp[2] << 24) | (dp[3] << 16) |
                                                (dp[4] << 8)  | dp[5];
                 break;
 
@@ -1704,7 +1991,11 @@ static void decode_element_descriptors(hb_stream_t* stream, int esindx,
                 break;
 
             case 0x6a:  // DVB AC-3 descriptor
-                stream->ts_stream_type[esindx+1] = 0x81;
+                stream->ts_stream_type[esindx] = 0x81;
+                break;
+
+            case 0x7a:  // DVB EAC-3 descriptor
+                stream->ts_stream_type[esindx] = 0x87;
                 break;
 
             default:
@@ -1722,7 +2013,7 @@ static const char *stream_type_name (uint8_t stream_type)
 int decode_program_map(hb_stream_t* stream)
 {
     bitbuf_t bb;
-       set_buf(&bb, stream->pmt_info.tablebuf, stream->pmt_info.tablepos, 0);
+    set_buf(&bb, stream->pmt_info.tablebuf, stream->pmt_info.tablepos, 0);
 
     get_bits(&bb, 8);  // table_id
     get_bits(&bb, 4);
@@ -1737,22 +2028,44 @@ int decode_program_map(hb_stream_t* stream)
     get_bits(&bb, 8);  // section_number
     get_bits(&bb, 8);  // last_section_number
     get_bits(&bb, 3);
-    unsigned int PCR_PID = get_bits(&bb, 13);
-    stream->pmt_info.PCR_PID = PCR_PID;
+    stream->pmt_info.PCR_PID = get_bits(&bb, 13);
     get_bits(&bb, 4);
-    unsigned int program_info_length = get_bits(&bb, 12);
+    int program_info_length = get_bits(&bb, 12);
     stream->pmt_info.program_info_length = program_info_length;
 
-       int i=0;
-       unsigned char *descriptor_buf = (unsigned char *) malloc(program_info_length);
-       for (i = 0; i < program_info_length; i++)
-       {
-         descriptor_buf[i] = get_bits(&bb, 8);
-       }
+    int i;
+    for (i = 0; i < program_info_length - 2; )
+    {
+        uint8_t tag, len;
+        tag = get_bits(&bb, 8);
+        len = get_bits(&bb, 8);
+        i += 2;
+        if ( i + len > program_info_length )
+        {
+            break;
+        }
+        if (tag == 0x05 && len >= 4)
+        {
+            // registration descriptor
+            stream->pmt_info.reg_desc = get_bits(&bb, 32);
+            i += 4;
+            len -= 4;
+        }
+        int j;
+        for ( j = 0; j < len; j++ )
+        {
+            get_bits(&bb, 8);
+        }
+        i += len;
+    }
+    for ( ; i < program_info_length; i++ )
+    {
+        get_bits(&bb, 8);
+    }
 
-       int cur_pos =  9 /* data after the section length field*/ + program_info_length;
-       int done_reading_stream_types = 0;
-       while (!done_reading_stream_types)
+    int cur_pos =  9 /* data after the section length field*/ + program_info_length;
+    int done_reading_stream_types = 0;
+    while (!done_reading_stream_types)
     {
         unsigned char stream_type = get_bits(&bb, 8);
         get_bits(&bb, 3);
@@ -1767,38 +2080,27 @@ int decode_program_map(hb_stream_t* stream)
             ES_info_buf[i] = get_bits(&bb, 8);
         }
 
-
-        if ( index_of_pid( elementary_PID, stream ) < 0 )
+        if ( index_of_pid( stream, elementary_PID ) < 0 )
         {
-            // don't have this pid yet
-            if (stream->ts_number_video_pids == 0 && 
-                st2codec[stream_type].kind == V )
-            {
-                stream->ts_video_pids[0] = elementary_PID;
-                stream->ts_stream_type[0] = stream_type;
-                stream->ts_number_video_pids = 1;
-            }
-            else
+            // Defined audio stream types are 0x81 for AC-3/A52 audio 
+            // and 0x03 for mpeg audio. But content producers seem to 
+            // use other values (0x04 and 0x06 have both been observed) 
+            // so at this point we say everything that isn't a video 
+            // pid is audio then at the end of hb_stream_title_scan 
+            // we'll figure out which are really audio by looking at 
+            // the PES headers.
+            i = stream->ts_number_pids;
+            if (i < kMaxNumberDecodeStreams)
             {
-                // Defined audio stream types are 0x81 for AC-3/A52 audio 
-                // and 0x03 for mpeg audio. But content producers seem to 
-                // use other values (0x04 and 0x06 have both been observed) 
-                // so at this point we say everything that isn't a video 
-                // pid is audio then at the end of hb_stream_title_scan 
-                // we'll figure out which are really audio by looking at 
-                // the PES headers.
-                i = stream->ts_number_audio_pids;
-                if (i < kMaxNumberAudioPIDS)
+                stream->ts_pids[i] = elementary_PID;
+                stream->ts_stream_type[i] = stream_type;
+                if (ES_info_length > 0)
                 {
-                    stream->ts_audio_pids[i] = elementary_PID;
-                    stream->ts_stream_type[1 + i] = stream_type;
-                    if (ES_info_length > 0)
-                    {
-                        decode_element_descriptors(stream, i, ES_info_buf,
-                                                ES_info_length);
-                    }
-                    ++stream->ts_number_audio_pids;
+                    decode_element_descriptors(stream, i, ES_info_buf,
+                                            ES_info_length);
                 }
+                stream->ts_stream_kind[i] = ts_stream_kind(stream, i);
+                ++stream->ts_number_pids;
             }
         }
 
@@ -1810,8 +2112,7 @@ int decode_program_map(hb_stream_t* stream)
             done_reading_stream_types = 1;
     }
 
-       free(descriptor_buf);
-       return 1;
+    return 1;
 }
 
 static int build_program_map(const uint8_t *buf, hb_stream_t *stream)
@@ -1835,26 +2136,26 @@ static int build_program_map(const uint8_t *buf, hb_stream_t *stream)
     // Get pointer length - only valid in packets with a start flag
     int pointer_len = 0;
 
-       if (start)
-       {
-               pointer_len = buf[4 + adapt_len] + 1;
-               stream->pmt_info.tablepos = 0;
-       }
-       // Get Continuity Counter
-       int continuity_counter = buf[3] & 0x0f;
-       if (!start && (stream->pmt_info.current_continuity_counter + 1 != continuity_counter))
-       {
-               hb_log("build_program_map - Continuity Counter %d out of sequence - expected %d", continuity_counter, stream->pmt_info.current_continuity_counter+1);
-               return 0;
-       }
-       stream->pmt_info.current_continuity_counter = continuity_counter;
-       stream->pmt_info.reading |= start;
+    if (start)
+    {
+        pointer_len = buf[4 + adapt_len] + 1;
+        stream->pmt_info.tablepos = 0;
+    }
+    // Get Continuity Counter
+    int continuity_counter = buf[3] & 0x0f;
+    if (!start && (stream->pmt_info.current_continuity_counter + 1 != continuity_counter))
+    {
+        hb_log("build_program_map - Continuity Counter %d out of sequence - expected %d", continuity_counter, stream->pmt_info.current_continuity_counter+1);
+        return 0;
+    }
+    stream->pmt_info.current_continuity_counter = continuity_counter;
+    stream->pmt_info.reading |= start;
 
     // Add the payload for this packet to the current buffer
-       int amount_to_copy = 184 - adapt_len - pointer_len;
+    int amount_to_copy = 184 - adapt_len - pointer_len;
     if (stream->pmt_info.reading && (amount_to_copy > 0))
     {
-                       stream->pmt_info.tablebuf = realloc(stream->pmt_info.tablebuf, stream->pmt_info.tablepos + amount_to_copy);
+            stream->pmt_info.tablebuf = realloc(stream->pmt_info.tablebuf, stream->pmt_info.tablepos + amount_to_copy);
 
             memcpy(stream->pmt_info.tablebuf + stream->pmt_info.tablepos, buf + 4 + adapt_len + pointer_len, amount_to_copy);
             stream->pmt_info.tablepos += amount_to_copy;
@@ -1937,9 +2238,9 @@ static int decode_PAT(const uint8_t *buf, hb_stream_t *stream)
                     bitbuf_t bb;
                     set_buf(&bb, tablebuf + pos, tablepos - pos, 0);
 
-                    unsigned char section_id   = get_bits(&bb, 8);
+                    unsigned char section_id    = get_bits(&bb, 8);
                     get_bits(&bb, 4);
-                    unsigned int section_len   = get_bits(&bb, 12);
+                    unsigned int section_len    = get_bits(&bb, 12);
                     get_bits(&bb, 16); // transport_id
                     get_bits(&bb, 2);
                     get_bits(&bb, 5);  // version_num
@@ -1955,11 +2256,11 @@ static int decode_PAT(const uint8_t *buf, hb_stream_t *stream)
                           section_len -= 5;    // Already read transport stream ID, version num, section num, and last section num
                           section_len -= 4;   // Ignore the CRC
                           int curr_pos = 0;
-                                                 stream->ts_number_pat_entries = 0;
+                          stream->ts_number_pat_entries = 0;
                           while ((curr_pos < section_len) && (stream->ts_number_pat_entries < kMaxNumberPMTStreams))
                           {
                             unsigned int pkt_program_num = get_bits(&bb, 16);
-                                                       stream->pat_info[stream->ts_number_pat_entries].program_number = pkt_program_num;
+                            stream->pat_info[stream->ts_number_pat_entries].program_number = pkt_program_num;
 
                             get_bits(&bb, 3);  // Reserved
                             if (pkt_program_num == 0)
@@ -1972,7 +2273,7 @@ static int decode_PAT(const uint8_t *buf, hb_stream_t *stream)
                                 stream->pat_info[stream->ts_number_pat_entries].program_map_PID = pkt_program_map_PID;
                             }
                             curr_pos += 4;
-                                                       stream->ts_number_pat_entries++;
+                            stream->ts_number_pat_entries++;
                           }
                         }
                         break;
@@ -2005,72 +2306,78 @@ static void hb_ts_stream_find_pids(hb_stream_t *stream)
     fseeko(stream->file_handle, fsize >> 1, SEEK_SET);
     align_to_next_packet(stream);
 
-       // Read the Transport Stream Packets (188 bytes each) looking at first for PID 0 (the PAT PID), then decode that
-       // to find the program map PID and then decode that to get the list of audio and video PIDs
+    // Read the Transport Stream Packets (188 bytes each) looking at first for PID 0 (the PAT PID), then decode that
+    // to find the program map PID and then decode that to get the list of audio and video PIDs
 
-       for (;;)
-       {
+    for (;;)
+    {
         const uint8_t *buf = next_packet( stream );
 
         if ( buf == NULL )
         {
-                       hb_log("hb_ts_stream_find_pids - end of file");
-                       break;
-               }
+            hb_log("hb_ts_stream_find_pids - end of file");
+            break;
+        }
 
-               // Get pid
-               int pid = (((buf[1] & 0x1F) << 8) | buf[2]) & 0x1FFF;
+        // Get pid
+        int pid = (((buf[1] & 0x1F) << 8) | buf[2]) & 0x1FFF;
 
         if ((pid == 0x0000) && (stream->ts_number_pat_entries == 0))
-               {
-                 decode_PAT(buf, stream);
-                 continue;
-               }
-
-               int pat_index = 0;
-               for (pat_index = 0; pat_index < stream->ts_number_pat_entries; pat_index++)
-               {
-                       // There are some streams where the PAT table has multiple entries as if their are
-                       // multiple programs in the same transport stream, and yet there's actually only one
-                       // program really in the stream. This seems to be true for transport streams that
-                       // originate in the HDHomeRun but have been output by EyeTV's export utility. What I think
-                       // is happening is that the HDHomeRun is sending the entire transport stream as broadcast,
-                       // but the EyeTV is only recording a single (selected) program number and not rewriting the
-                       // PAT info on export to match what's actually on the stream.
-                       // Until we have a way of handling multiple programs per transport stream elegantly we'll match
-                       // on the first pat entry for which we find a matching program map PID.  The ideal solution would
-                       // be to build a title choice popup from the PAT program number details and then select from
-                       // their - but right now the API's not capable of that.
+        {
+          decode_PAT(buf, stream);
+          continue;
+        }
+
+        int pat_index = 0;
+        for (pat_index = 0; pat_index < stream->ts_number_pat_entries; pat_index++)
+        {
+            // There are some streams where the PAT table has multiple entries as if their are
+            // multiple programs in the same transport stream, and yet there's actually only one
+            // program really in the stream. This seems to be true for transport streams that
+            // originate in the HDHomeRun but have been output by EyeTV's export utility. What I think
+            // is happening is that the HDHomeRun is sending the entire transport stream as broadcast,
+            // but the EyeTV is only recording a single (selected) program number and not rewriting the
+            // PAT info on export to match what's actually on the stream.
+            // Until we have a way of handling multiple programs per transport stream elegantly we'll match
+            // on the first pat entry for which we find a matching program map PID.  The ideal solution would
+            // be to build a title choice popup from the PAT program number details and then select from
+            // their - but right now the API's not capable of that.
             if (stream->pat_info[pat_index].program_number != 0 &&
                 pid == stream->pat_info[pat_index].program_map_PID)
-                       {
-                         if (build_program_map(buf, stream) > 0)
-                               break;
-                       }
-               }
-               // Keep going  until we have a complete set of PIDs
-               if ((stream->ts_number_video_pids > 0) && (stream->ts_number_audio_pids > 0))
-                 break;
-       }
-
-       hb_log("hb_ts_stream_find_pids - found the following PIDS");
-       hb_log("    Video PIDS : ");
+            {
+              if (build_program_map(buf, stream) > 0)
+                break;
+            }
+        }
+        // Keep going  until we have a complete set of PIDs
+        if ( index_of_video( stream ) >= 0 )
+          break;
+    }
+
+    hb_log("hb_ts_stream_find_pids - found the following PIDS");
+    hb_log("    Video PIDS : ");
     int i;
-       for (i=0; i < stream->ts_number_video_pids; i++)
-       {
-        hb_log( "      0x%x type %s (0x%x)", 
-                stream->ts_video_pids[i],
-                stream_type_name(stream->ts_stream_type[i]),
-                stream->ts_stream_type[i]);
-       }
-       hb_log("    Audio PIDS : ");
-       for (i = 0; i < stream->ts_number_audio_pids; i++)
-       {
-        hb_log( "      0x%x type %s (0x%x)", 
-                stream->ts_audio_pids[i],
-                stream_type_name(stream->ts_stream_type[i+1]),
-                stream->ts_stream_type[i+1] );
-       }
+    for (i=0; i < stream->ts_number_pids; i++)
+    {
+        if ( stream->ts_stream_kind[i] == V )
+        {
+            hb_log( "      0x%x type %s (0x%x)", 
+                    stream->ts_pids[i],
+                    stream_type_name(stream->ts_stream_type[i]),
+                    stream->ts_stream_type[i]);
+        }
+    }
+    hb_log("    Audio PIDS : ");
+    for (i = 0; i < stream->ts_number_pids; i++)
+    {
+        if ( stream->ts_stream_kind[i] != V )
+        {
+            hb_log( "      0x%x type %s (0x%x)", 
+                    stream->ts_pids[i],
+                    stream_type_name(stream->ts_stream_type[i]),
+                    stream->ts_stream_type[i] );
+        }
+    }
  }
 
 
@@ -2103,7 +2410,21 @@ static void generate_output_data(hb_stream_t *stream, int curstream)
     hb_buffer_t *buf = stream->fwrite_buf;
     uint8_t *tdat = stream->ts_buf[curstream]->data;
 
-    buf->id = curstream;
+    buf->id = stream->ts_pids[curstream];
+    switch (stream->ts_stream_kind[curstream])
+    {
+        case A:
+            buf->type = AUDIO_BUF;
+            break;
+
+        case V:
+            buf->type = VIDEO_BUF;
+            break;
+
+        default:
+            buf->type = OTHER_BUF;
+            break;
+    }
 
     // check if this packet was referenced to an older pcr and if that
     // pcr was significantly different than the one we're using now.
@@ -2177,7 +2498,7 @@ static void hb_ts_stream_append_pkt(hb_stream_t *stream, int idx, const uint8_t
  ***********************************************************************
  *
  **********************************************************************/
-static int hb_ts_stream_decode( hb_stream_t *stream, hb_buffer_t *obuf )
+int hb_ts_decode_pkt( hb_stream_t *stream, const uint8_t * pkt, hb_buffer_t *obuf )
 {
     /*
      * stash the output buffer pointer in our stream so we don't have to
@@ -2186,272 +2507,287 @@ static int hb_ts_stream_decode( hb_stream_t *stream, hb_buffer_t *obuf )
     obuf->size = 0;
     stream->fwrite_buf = obuf;
 
-       // spin until we get a packet of data from some stream or hit eof
-       while ( 1 )
-       {
-        int curstream;
+    int video_index = index_of_video(stream);
 
-        const uint8_t *buf = next_packet(stream);
-        if ( buf == NULL )
-        {
-            // end of file - we didn't finish filling our ps write buffer
-            // so just discard the remainder (the partial buffer is useless)
-            hb_log("hb_ts_stream_decode - eof");
-            return 0;
-               }
+    int curstream;
 
-        /* This next section validates the packet */
+    /* This next section validates the packet */
 
-               // Get pid and use it to find stream state.
-               int pid = ((buf[1] & 0x1F) << 8) | buf[2];
-        if ( ( curstream = index_of_pid( pid, stream ) ) < 0 )
-            continue;
+    // Get pid and use it to find stream state.
+    int pid = ((pkt[1] & 0x1F) << 8) | pkt[2];
+    if ( ( curstream = index_of_pid( stream, pid ) ) < 0 )
+    {
+        return 0;
+    }
 
-               // Get error
-               int errorbit = (buf[1] & 0x80) != 0;
-               if (errorbit)
-               {
-                       ts_err( stream, curstream,  "packet error bit set");
-                       continue;
-               }
-
-               // Get adaption header info
-               int adaption = (buf[3] & 0x30) >> 4;
-               int adapt_len = 0;
-               if (adaption == 0)
-               {
-                       ts_err( stream, curstream,  "adaptation code 0");
-                       continue;
-               }
-               else if (adaption == 0x2)
-                       adapt_len = 184;
-               else if (adaption == 0x3)
-               {
-                       adapt_len = buf[4] + 1;
-                       if (adapt_len > 184)
-                       {
-                               ts_err( stream, curstream,  "invalid adapt len %d", adapt_len);
-                continue;
-                       }
-               }
+    // Get error
+    int errorbit = (pkt[1] & 0x80) != 0;
+    if (errorbit)
+    {
+        ts_err( stream, curstream,  "packet error bit set");
+        return 0;
+    }
 
-        if ( adapt_len > 0 )
+    // Get adaption header info
+    int adaption = (pkt[3] & 0x30) >> 4;
+    int adapt_len = 0;
+    if (adaption == 0)
+    {
+        ts_err( stream, curstream,  "adaptation code 0");
+        return 0;
+    }
+    else if (adaption == 0x2)
+        adapt_len = 184;
+    else if (adaption == 0x3)
+    {
+        adapt_len = pkt[4] + 1;
+        if (adapt_len > 184)
         {
-            if ( buf[5] & 0x40 )
-            {
-                // found a random access point
-            }
-            // if there's an adaptation header & PCR_flag is set
-            // get the PCR (Program Clock Reference)
-            if ( adapt_len > 7 && ( buf[5] & 0x10 ) != 0 )
-            {
-                stream->ts_pcr = ( (uint64_t)buf[6] << (33 - 8) ) |
-                                 ( (uint64_t)buf[7] << (33 - 16) ) |
-                                 ( (uint64_t)buf[8] << (33 - 24) ) |
-                                 ( (uint64_t)buf[9] << (33 - 32) ) |
-                                 ( buf[10] >> 7 );
-                ++stream->ts_pcr_in;
-                stream->ts_found_pcr = 1;
-            }
+            ts_err( stream, curstream,  "invalid adapt len %d", adapt_len);
+            return 0;
         }
+    }
 
-        // If we don't have a PCR yet but the stream has PCRs just loop
-        // so we don't process anything until we have a clock reference.
-        // Unfortunately the HD Home Run appears to null out the PCR so if
-        // we didn't detect a PCR during scan keep going and we'll use
-        // the video stream DTS for the PCR.
-
-        if ( !stream->ts_found_pcr && ( stream->ts_flags & TS_HAS_PCR ) )
+    if ( adapt_len > 0 )
+    {
+        if ( pkt[5] & 0x40 )
         {
-            continue;
+            // found a random access point
         }
+        // if there's an adaptation header & PCR_flag is set
+        // get the PCR (Program Clock Reference)
+        if ( adapt_len > 7 && ( pkt[5] & 0x10 ) != 0 )
+        {
+            stream->ts_pcr = ( (uint64_t)pkt[6] << (33 - 8) ) |
+                             ( (uint64_t)pkt[7] << (33 - 16) ) |
+                             ( (uint64_t)pkt[8] << (33 - 24) ) |
+                             ( (uint64_t)pkt[9] << (33 - 32) ) |
+                             ( pkt[10] >> 7 );
+            ++stream->ts_pcr_in;
+            stream->ts_found_pcr = 1;
+            stream->ts_flags |= TS_HAS_PCR;
+        }
+    }
 
-               // Get continuity
-        // Continuity only increments for adaption values of 0x3 or 0x01
-        // and is not checked for start packets.
+    // If we don't have a PCR yet but the stream has PCRs just loop
+    // so we don't process anything until we have a clock reference.
+    // Unfortunately the HD Home Run appears to null out the PCR so if
+    // we didn't detect a PCR during scan keep going and we'll use
+    // the video stream DTS for the PCR.
 
-               int start = (buf[1] & 0x40) != 0;
+    if ( !stream->ts_found_pcr && ( stream->ts_flags & TS_HAS_PCR ) )
+    {
+        return 0;
+    }
 
-        if ( (adaption & 0x01) != 0 )
-               {
-            int continuity = (buf[3] & 0xF);
-            if ( continuity == stream->ts_streamcont[curstream] )
-            {
-                // Spliced transport streams can have duplicate 
-                // continuity counts at the splice boundary.
-                // Test to see if the packet is really a duplicate
-                // by comparing packet summaries to see if they
-                // match.
-                uint8_t summary[8];
-
-                summary[0] = adaption;
-                summary[1] = adapt_len;
-                if (adapt_len + 4 + 6 + 9 <= 188)
-                {
-                    memcpy(&summary[2], buf+4+adapt_len+9, 6);
-                }
-                else
-                {
-                    memset(&summary[2], 0, 6);
-                }
-                if ( memcmp( summary, stream->ts_pkt_summary[curstream], 8 ) == 0 )
-                {
-                    // we got a duplicate packet (usually used to introduce
-                    // a PCR when one is needed). The only thing that can
-                    // change in the dup is the PCR which we grabbed above
-                    // so ignore the rest.
-                    continue;
-                }
-            }
-            if ( !start && (stream->ts_streamcont[curstream] != -1) &&
-                 !stream->ts_skipbad[curstream] &&
-                 (continuity != ( (stream->ts_streamcont[curstream] + 1) & 0xf ) ) )
-                       {
-                               ts_err( stream, curstream,  "continuity error: got %d expected %d",
-                        (int)continuity,
-                        (stream->ts_streamcont[curstream] + 1) & 0xf );
-                stream->ts_streamcont[curstream] = continuity;
-                continue;
-            }
-            stream->ts_streamcont[curstream] = continuity;
+    // Get continuity
+    // Continuity only increments for adaption values of 0x3 or 0x01
+    // and is not checked for start packets.
+
+    int start = (pkt[1] & 0x40) != 0;
 
-            // Save a summary of this packet for later duplicate
-            // testing.  The summary includes some header information
-            // and payload bytes.  Should be enough to detect 
-            // non-duplicates.
-            stream->ts_pkt_summary[curstream][0] = adaption;
-            stream->ts_pkt_summary[curstream][1] = adapt_len;
+    if ( (adaption & 0x01) != 0 )
+    {
+        int continuity = (pkt[3] & 0xF);
+        if ( continuity == stream->ts_streamcont[curstream] )
+        {
+            // Spliced transport streams can have duplicate 
+            // continuity counts at the splice boundary.
+            // Test to see if the packet is really a duplicate
+            // by comparing packet summaries to see if they
+            // match.
+            uint8_t summary[8];
+
+            summary[0] = adaption;
+            summary[1] = adapt_len;
             if (adapt_len + 4 + 6 + 9 <= 188)
             {
-                memcpy(&stream->ts_pkt_summary[curstream][2], 
-                        buf+4+adapt_len+9, 6);
+                memcpy(&summary[2], pkt+4+adapt_len+9, 6);
             }
             else
             {
-                memset(&stream->ts_pkt_summary[curstream][2], 0, 6);
+                memset(&summary[2], 0, 6);
+            }
+            if ( memcmp( summary, stream->ts_pkt_summary[curstream], 8 ) == 0 )
+            {
+                // we got a duplicate packet (usually used to introduce
+                // a PCR when one is needed). The only thing that can
+                // change in the dup is the PCR which we grabbed above
+                // so ignore the rest.
+                return 0;
             }
         }
+        if ( !start && (stream->ts_streamcont[curstream] != -1) &&
+             !stream->ts_skipbad[curstream] &&
+             (continuity != ( (stream->ts_streamcont[curstream] + 1) & 0xf ) ) )
+        {
+            ts_err( stream, curstream,  "continuity error: got %d expected %d",
+                    (int)continuity,
+                    (stream->ts_streamcont[curstream] + 1) & 0xf );
+            stream->ts_streamcont[curstream] = continuity;
+            return 0;
+        }
+        stream->ts_streamcont[curstream] = continuity;
 
-        /* If we get here the packet is valid - process its data */
-
-        if ( start )
+        // Save a summary of this packet for later duplicate
+        // testing.  The summary includes some header information
+        // and payload bytes.  Should be enough to detect 
+        // non-duplicates.
+        stream->ts_pkt_summary[curstream][0] = adaption;
+        stream->ts_pkt_summary[curstream][1] = adapt_len;
+        if (adapt_len + 4 + 6 + 9 <= 188)
+        {
+            memcpy(&stream->ts_pkt_summary[curstream][2], 
+                    pkt+4+adapt_len+9, 6);
+        }
+        else
         {
-            // Found a random access point (now we can start a frame/audio packet..)
+            memset(&stream->ts_pkt_summary[curstream][2], 0, 6);
+        }
+    }
 
-            if ( stream->need_keyframe )
-            {
-                // we're looking for the first video frame because we're
-                // doing random access during 'scan'
-                if ( curstream != 0 || !isIframe( stream, buf, adapt_len ) )
-                {
-                    // not the video stream or didn't find an I frame
-                    // but we'll only wait 255 video frames for an I frame.
-                    if ( curstream != 0 || ++stream->need_keyframe )
-                    {
-                        continue;
-                    }
-                }
-                stream->need_keyframe = 0;
-            }
+    /* If we get here the packet is valid - process its data */
 
-                       // If we were skipping a bad packet, start fresh on this new PES packet..
-                       if (stream->ts_skipbad[curstream] == 1)
-                       {
-                               stream->ts_skipbad[curstream] = 0;
-                       }
+    if ( start )
+    {
+        // Found a random access point (now we can start a frame/audio packet..)
 
-                       if ( curstream == 0 )
+        if ( stream->need_keyframe )
+        {
+            // we're looking for the first video frame because we're
+            // doing random access during 'scan'
+            if ( curstream != video_index || !isIframe( stream, pkt, adapt_len ) )
             {
-                ++stream->frames;
-
-                // if we don't have a pcr yet use the dts from this frame
-                if ( !stream->ts_found_pcr )
+                // not the video stream or didn't find an I frame
+                // but we'll only wait 255 video frames for an I frame.
+                if ( curstream != video_index || ++stream->need_keyframe )
                 {
-                    // PES must begin with an mpeg start code & contain
-                    // a DTS or PTS.
-                    const uint8_t *pes = buf + adapt_len + 4;
-                    if ( pes[0] != 0x00 || pes[1] != 0x00 || pes[2] != 0x01 ||
-                         ( pes[7] >> 6 ) == 0 )
-                    {
-                        continue;
-                    }
-                    // if we have a dts use it otherwise use the pts
-                    stream->ts_pcr = pes_timestamp( pes + ( pes[7] & 0x40? 14 : 9 ) );
-                    ++stream->ts_pcr_in;
+                    return 0;
                 }
             }
+            stream->need_keyframe = 0;
+        }
+
+        // If we were skipping a bad packet, start fresh on this new PES packet..
+        if (stream->ts_skipbad[curstream] == 1)
+        {
+            stream->ts_skipbad[curstream] = 0;
+        }
+
+        if ( curstream == video_index )
+        {
+            ++stream->frames;
 
-            // if this is a multiplexed stream make sure this is the
-            // substream we want.
-            if ( stream->ts_multiplexed[curstream] )
+            // if we don't have a pcr yet use the dts from this frame
+            if ( !stream->ts_found_pcr )
             {
                 // PES must begin with an mpeg start code & contain
                 // a DTS or PTS.
-                const uint8_t *pes = buf + adapt_len + 4;
+                const uint8_t *pes = pkt + adapt_len + 4;
                 if ( pes[0] != 0x00 || pes[1] != 0x00 || pes[2] != 0x01 ||
-                     pes[3] != 0xfd )
+                     ( pes[7] >> 6 ) == 0 )
                 {
-                    stream->ts_skipbad[curstream] = 1;
-                    continue;
-                }
-                // the last byte of the header is the extension id. see if
-                // it's the one we want.
-                if ( pes[pes[8]+8] != stream->ts_multiplexed[curstream] )
-                {
-                    stream->ts_skipbad[curstream] = 1;
-                    continue;
+                    return 0;
                 }
+                // if we have a dts use it otherwise use the pts
+                stream->ts_pcr = pes_timestamp( pes + ( pes[7] & 0x40?14:9 ) );
+                ++stream->ts_pcr_in;
             }
+        }
 
-            // If we have some data already on this stream, turn it into
-            // a program stream packet. Then add the payload for this
-            // packet to the current pid's buffer.
-            if ( stream->ts_pos[curstream] )
+        // if this is a multiplexed stream make sure this is the
+        // substream we want.
+        if ( stream->ts_multiplexed[curstream] )
+        {
+            // PES must begin with an mpeg start code & contain
+            // a DTS or PTS.
+            const uint8_t *pes = pkt + adapt_len + 4;
+            if ( pes[0] != 0x00 || pes[1] != 0x00 || pes[2] != 0x01 ||
+                 pes[3] != 0xfd )
             {
-                // we have to ship the old packet before updating the pcr
-                // since the packet we've been accumulating is referenced
-                // to the old pcr.
-                generate_output_data(stream, curstream);
-
-                // remember the pcr that was in effect when we started
-                // this packet.
-                stream->ts_buf[curstream]->cur = stream->ts_pcr_in;
-                hb_ts_stream_append_pkt(stream, curstream, buf + 4 + adapt_len,
-                                        184 - adapt_len);
-                return 1;
+                stream->ts_skipbad[curstream] = 1;
+                return 0;
+            }
+            // the last byte of the header is the extension id. see if
+            // it's the one we want.
+            if ( pes[pes[8]+8] != stream->ts_multiplexed[curstream] )
+            {
+                stream->ts_skipbad[curstream] = 1;
+                return 0;
             }
-            // remember the pcr that was in effect when we started this packet.
-            stream->ts_buf[curstream]->cur = stream->ts_pcr_in;
         }
 
-               // Add the payload for this packet to the current buffer
-               if (!stream->ts_skipbad[curstream] && (184 - adapt_len) > 0)
-               {
-            hb_ts_stream_append_pkt(stream, curstream, buf + 4 + adapt_len,
+        // If we have some data already on this stream, turn it into
+        // a program stream packet. Then add the payload for this
+        // packet to the current pid's buffer.
+        if ( stream->ts_pos[curstream] )
+        {
+            // we have to ship the old packet before updating the pcr
+            // since the packet we've been accumulating is referenced
+            // to the old pcr.
+            generate_output_data(stream, curstream);
+
+            // remember the pcr that was in effect when we started
+            // this packet.
+            stream->ts_buf[curstream]->cur = stream->ts_pcr_in;
+            hb_ts_stream_append_pkt(stream, curstream, pkt + 4 + adapt_len,
                                     184 - adapt_len);
-            // see if we've hit the end of this PES packet
-            const uint8_t *pes = stream->ts_buf[curstream]->data;
-            int len = ( pes[4] << 8 ) + pes[5] + 6;
-            if ( len > 6 && stream->ts_pos[curstream] == len &&
-                 pes[0] == 0x00 && pes[1] == 0x00 && pes[2] == 0x01 )
-            {
-                generate_output_data(stream, curstream);
-                return 1;
-            }
-               }
-       }
+            return 1;
+        }
+        // remember the pcr that was in effect when we started this packet.
+        stream->ts_buf[curstream]->cur = stream->ts_pcr_in;
+    }
+
+    // Add the payload for this packet to the current buffer
+    if (!stream->ts_skipbad[curstream] && (184 - adapt_len) > 0)
+    {
+        hb_ts_stream_append_pkt(stream, curstream, pkt + 4 + adapt_len,
+                                184 - adapt_len);
+        // see if we've hit the end of this PES packet
+        const uint8_t *pes = stream->ts_buf[curstream]->data;
+        int len = ( pes[4] << 8 ) + pes[5] + 6;
+        if ( len > 6 && stream->ts_pos[curstream] == len &&
+             pes[0] == 0x00 && pes[1] == 0x00 && pes[2] == 0x01 )
+        {
+            generate_output_data(stream, curstream);
+            return 1;
+        }
+    }
+    return 0;
+}
+
+static int hb_ts_stream_decode( hb_stream_t *stream, hb_buffer_t *obuf )
+{
+    // spin until we get a packet of data from some stream or hit eof
+    while ( 1 )
+    {
+        const uint8_t *buf = next_packet(stream);
+        if ( buf == NULL )
+        {
+            // end of file - we didn't finish filling our ps write buffer
+            // so just discard the remainder (the partial buffer is useless)
+            hb_log("hb_ts_stream_decode - eof");
+            return 0;
+        }
+
+        if (hb_ts_decode_pkt( stream, buf, obuf ))
+        {
+            return 1;
+        }
+    }
+    return 0;
 }
 
 static void hb_ts_stream_reset(hb_stream_t *stream)
 {
-       int i;
+    int i;
 
-       for (i=0; i < kMaxNumberDecodeStreams; i++)
-       {
-               stream->ts_pos[i] = 0;
-               stream->ts_skipbad[i] = 1;
-               stream->ts_streamcont[i] = -1;
-       }
+    for (i=0; i < kMaxNumberDecodeStreams; i++)
+    {
+        stream->ts_pos[i] = 0;
+        stream->ts_skipbad[i] = 1;
+        stream->ts_streamcont[i] = -1;
+    }
 
     stream->need_keyframe = 0;
 
@@ -2557,6 +2893,9 @@ static void ffmpeg_remap_stream( hb_stream_t *stream, hb_title_t *title )
 
 void *hb_ffmpeg_context( int codec_param )
 {
+    if ( ffmpeg_streams == NULL )
+        return NULL;
+
     int slot = codec_param & (ffmpeg_sl_size - 1);
     int stream_index = codec_param >> ffmpeg_sl_bits;
     return ffmpeg_streams[slot]->ffmpeg_ic->streams[stream_index]->codec;
@@ -2564,6 +2903,9 @@ void *hb_ffmpeg_context( int codec_param )
 
 void *hb_ffmpeg_avstream( int codec_param )
 {
+    if ( ffmpeg_streams == NULL )
+        return NULL;
+
     int slot = codec_param & (ffmpeg_sl_size - 1);
     int stream_index = codec_param >> ffmpeg_sl_bits;
     return ffmpeg_streams[slot]->ffmpeg_ic->streams[stream_index];
@@ -2585,7 +2927,7 @@ static int ffmpeg_open( hb_stream_t *stream, hb_title_t *title )
     {
         return 0;
     }
-    if ( av_find_stream_info( ic ) < 0 )
+    if ( hb_av_find_stream_info( ic ) < 0 )
         goto fail;
 
     stream->ffmpeg_ic = ic;
@@ -2651,24 +2993,20 @@ static void add_ffmpeg_audio( hb_title_t *title, hb_stream_t *stream, int id )
 {
     AVStream *st = stream->ffmpeg_ic->streams[id];
     AVCodecContext *codec = st->codec;
+    AVMetadataTag *tag;
+    int layout;
 
     // scan will ignore any audio without a bitrate. Since we've already
     // typed the audio in order to determine its codec we set up the audio
     // paramters here.
+    layout = hb_ff_layout_xlat( codec->channel_layout, codec->channels );
+    if ( !layout )
+    {
+        // Unsupported layout
+        return;
+    }
     if ( codec->bit_rate || codec->sample_rate )
     {
-        static const int chan2layout[] = {
-            HB_INPUT_CH_LAYOUT_MONO,  // We should allow no audio really.
-            HB_INPUT_CH_LAYOUT_MONO,   
-            HB_INPUT_CH_LAYOUT_STEREO,
-            HB_INPUT_CH_LAYOUT_2F1R,   
-            HB_INPUT_CH_LAYOUT_2F2R,
-            HB_INPUT_CH_LAYOUT_3F2R,   
-            HB_INPUT_CH_LAYOUT_4F2R,
-            HB_INPUT_CH_LAYOUT_STEREO, 
-            HB_INPUT_CH_LAYOUT_STEREO,
-        };
-
         hb_audio_t *audio = calloc( 1, sizeof(*audio) );;
 
         audio->id = id;
@@ -2687,30 +3025,252 @@ static void add_ffmpeg_audio( hb_title_t *title, hb_stream_t *stream, int id )
 
             audio->config.in.bitrate = codec->bit_rate? codec->bit_rate : 1;
             audio->config.in.samplerate = codec->sample_rate;
-            audio->config.in.channel_layout = chan2layout[codec->channels & 7];
+            audio->config.in.channel_layout = layout;
         }
 
-        set_audio_description( audio, lang_for_code2( st->language ) );
+        tag = av_metadata_get( st->metadata, "language", NULL, 0 );
+        set_audio_description( audio, 
+            lang_for_code2( tag ? tag->value : "und" ) );
 
         hb_list_add( title->list_audio, audio );
     }
 }
 
+/*
+ * Format:
+ *   MkvVobSubtitlePrivateData = ( Line )*
+ *   Line = FieldName ':' ' ' FieldValue '\n'
+ *   FieldName = [^:]+
+ *   FieldValue = [^\n]+
+ * 
+ * The line of interest is:
+ *   PaletteLine = "palette" ':' ' ' RRGGBB ( ',' ' ' RRGGBB )*
+ * 
+ * More information on the format at:
+ *   http://www.matroska.org/technical/specs/subtitles/images.html
+ */
+static int ffmpeg_parse_vobsub_extradata_mkv( AVCodecContext *codec, hb_subtitle_t *subtitle )
+{
+    // lines = (string) codec->extradata;
+    char *lines = malloc( codec->extradata_size + 1 );
+    if ( lines == NULL )
+        return 1;
+    memcpy( lines, codec->extradata, codec->extradata_size );
+    lines[codec->extradata_size] = '\0';
+    
+    uint32_t rgb[16];
+    int gotPalette = 0;
+    int gotDimensions = 0;
+    
+    char *curLine, *curLine_parserData;
+    for ( curLine = strtok_r( lines, "\n", &curLine_parserData );
+          curLine;
+          curLine = strtok_r( NULL, "\n", &curLine_parserData ) )
+    {
+        if (!gotPalette)
+        {
+            int numElementsRead = sscanf(curLine, "palette: "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x, "
+                "%06x, %06x, %06x, %06x",
+                &rgb[0],  &rgb[1],  &rgb[2],  &rgb[3],
+                &rgb[4],  &rgb[5],  &rgb[6],  &rgb[7],
+                &rgb[8],  &rgb[9],  &rgb[10], &rgb[11],
+                &rgb[12], &rgb[13], &rgb[14], &rgb[15]);
+
+            if (numElementsRead == 16) {
+                gotPalette = 1;
+            }
+        }
+        if (!gotDimensions)
+        {
+            int numElementsRead = sscanf(curLine, "size: %dx%d",
+                &subtitle->width, &subtitle->height);
+
+            if (numElementsRead == 2) {
+                gotDimensions = 1;
+            }
+        }
+        if (gotPalette && gotDimensions)
+            break;
+    }
+
+    if (subtitle->width == 0 || subtitle->height == 0)
+    {
+        subtitle->width = 720;
+        subtitle->height = 480;
+    }
+    
+    free( lines );
+    
+    if ( gotPalette )
+    {
+        int i;
+        for (i=0; i<16; i++)
+            subtitle->palette[i] = hb_rgb2yuv(rgb[i]);
+        return 0;
+    }
+    else
+    {
+        return 1;
+    }
+}
+
+/*
+ * Format: 8-bit {0,Y,Cb,Cr} x 16
+ */
+static int ffmpeg_parse_vobsub_extradata_mp4( AVCodecContext *codec, hb_subtitle_t *subtitle )
+{
+    if ( codec->extradata_size != 4*16 )
+        return 1;
+    
+    int i, j;
+    for ( i=0, j=0; i<16; i++, j+=4 )
+    {
+        subtitle->palette[i] = 
+            codec->extradata[j+1] << 16 |   // Y
+            codec->extradata[j+2] << 8  |   // Cb
+            codec->extradata[j+3] << 0;     // Cr
+    }
+    if (codec->width <= 0 || codec->height <= 0)
+    {
+        subtitle->width = 720;
+        subtitle->height = 480;
+    }
+    else
+    {
+        subtitle->width = codec->width;
+        subtitle->height = codec->height;
+    }
+    return 0;
+}
+
+/*
+ * Parses the 'subtitle->palette' information from the specific VOB subtitle track's private data.
+ * Returns 0 if successful or 1 if parsing failed or was incomplete.
+ */
+static int ffmpeg_parse_vobsub_extradata( AVCodecContext *codec, hb_subtitle_t *subtitle )
+{
+    // XXX: Better if we actually chose the correct parser based on the input container
+    return
+        ffmpeg_parse_vobsub_extradata_mkv( codec, subtitle ) &&
+        ffmpeg_parse_vobsub_extradata_mp4( codec, subtitle );
+}
+
+static void add_ffmpeg_subtitle( hb_title_t *title, hb_stream_t *stream, int id )
+{
+    AVStream *st = stream->ffmpeg_ic->streams[id];
+    AVCodecContext *codec = st->codec;
+    
+    hb_subtitle_t *subtitle = calloc( 1, sizeof(*subtitle) );
+    
+    subtitle->id = id;
+    
+    switch ( codec->codec_id )
+    {
+        case CODEC_ID_DVD_SUBTITLE:
+            subtitle->format = PICTURESUB;
+            subtitle->source = VOBSUB;
+            subtitle->config.dest = RENDERSUB;  // By default render (burn-in) the VOBSUB.
+            if ( ffmpeg_parse_vobsub_extradata( codec, subtitle ) )
+                hb_log( "add_ffmpeg_subtitle: malformed extradata for VOB subtitle track; "
+                        "subtitle colors likely to be wrong" );
+            break;
+        case CODEC_ID_TEXT:
+            subtitle->format = TEXTSUB;
+            subtitle->source = UTF8SUB;
+            subtitle->config.dest = PASSTHRUSUB;
+            break;
+        case CODEC_ID_MOV_TEXT: // TX3G
+            subtitle->format = TEXTSUB;
+            subtitle->source = TX3GSUB;
+            subtitle->config.dest = PASSTHRUSUB;
+            break;
+        case CODEC_ID_SSA:
+            subtitle->format = TEXTSUB;
+            subtitle->source = SSASUB;
+            subtitle->config.dest = PASSTHRUSUB;
+            break;
+        default:
+            hb_log( "add_ffmpeg_subtitle: unknown subtitle stream type: 0x%x", (int) codec->codec_id );
+            free(subtitle);
+            return;
+    }
+    
+    AVMetadataTag *tag;
+    iso639_lang_t *language;
+
+    tag = av_metadata_get( st->metadata, "language", NULL, 0 );
+    language = lang_for_code2( tag ? tag->value : "und" );
+    strcpy( subtitle->lang, language->eng_name );
+    strncpy( subtitle->iso639_2, language->iso639_2, 4 );
+    
+    // Copy the extradata for the subtitle track
+    subtitle->extradata = malloc( codec->extradata_size );
+    memcpy( subtitle->extradata, codec->extradata, codec->extradata_size );
+    subtitle->extradata_size = codec->extradata_size;
+    
+    hb_list_add(title->list_subtitle, subtitle);
+}
+
+static char *get_ffmpeg_metadata_value( AVMetadata *m, char *key )
+{
+    AVMetadataTag *tag = NULL;
+    while ( (tag = av_metadata_get(m, "", tag, AV_METADATA_IGNORE_SUFFIX)) )
+    {
+        if ( !strcmp( key, tag->key ) )
+        {
+            return tag->value;
+        }
+    }
+    return NULL;
+}
+
+static void add_ffmpeg_attachment( hb_title_t *title, hb_stream_t *stream, int id )
+{
+    AVStream *st = stream->ffmpeg_ic->streams[id];
+    AVCodecContext *codec = st->codec;
+    
+    enum attachtype type;
+    switch ( codec->codec_id )
+    {
+        case CODEC_ID_TTF:
+            type = FONT_TTF_ATTACH;
+            break;
+        default:
+            // Ignore unrecognized attachment type
+            return;
+    }
+    
+    hb_attachment_t *attachment = calloc( 1, sizeof(*attachment) );
+    
+    // Copy the attachment name and data
+    attachment->type = type;
+    attachment->name = strdup( get_ffmpeg_metadata_value( st->metadata, "filename" ) );
+    attachment->data = malloc( codec->extradata_size );
+    memcpy( attachment->data, codec->extradata, codec->extradata_size );
+    attachment->size = codec->extradata_size;
+    
+    hb_list_add(title->list_attachment, attachment);
+}
+
 static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream )
 {
     AVFormatContext *ic = stream->ffmpeg_ic;
 
     // 'Barebones Title'
     hb_title_t *title = hb_title_init( stream->path, 0 );
+    title->type = HB_STREAM_TYPE;
     title->index = 1;
 
-       // Copy part of the stream path to the title name
-       char *sep = strrchr(stream->path, '/');
-       if (sep)
-               strcpy(title->name, sep+1);
-       char *dot_term = strrchr(title->name, '.');
-       if (dot_term)
-               *dot_term = '\0';
+    // Copy part of the stream path to the title name
+    char *sep = strrchr(stream->path, '/');
+    if (sep)
+        strcpy(title->name, sep+1);
+    char *dot_term = strrchr(title->name, '.');
+    if (dot_term)
+        *dot_term = '\0';
 
     uint64_t dur = ic->duration * 90000 / AV_TIME_BASE;
     title->duration = dur;
@@ -2729,6 +3289,13 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream )
              avcodec_find_decoder( ic->streams[i]->codec->codec_id ) &&
              title->video_codec == 0 )
         {
+            AVCodecContext *context = ic->streams[i]->codec;
+            if ( context->pix_fmt != PIX_FMT_YUV420P &&
+                 !sws_isSupportedInput( context->pix_fmt ) )
+            {
+                hb_log( "ffmpeg_title_scan: Unsupported color space" );
+                continue;
+            }
             title->video_id = i;
             stream->ffmpeg_video_id = i;
 
@@ -2744,6 +3311,14 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream )
         {
             add_ffmpeg_audio( title, stream, i );
         }
+        else if ( ic->streams[i]->codec->codec_type == CODEC_TYPE_SUBTITLE )
+        {
+            add_ffmpeg_subtitle( title, stream, i );
+        }
+        else if ( ic->streams[i]->codec->codec_type == CODEC_TYPE_ATTACHMENT )
+        {
+            add_ffmpeg_attachment( title, stream, i );
+        }
     }
 
     title->container_name = strdup( ic->iformat->name );
@@ -2758,6 +3333,7 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream )
         for( i = 0; i < ic->nb_chapters; i++ )
             if( ( m = ic->chapters[i] ) != NULL )
             {
+                AVMetadataTag *tag;
                 hb_chapter_t * chapter;
                 chapter = calloc( sizeof( hb_chapter_t ), 1 );
                 chapter->index    = i+1;
@@ -2766,7 +3342,8 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream )
                 chapter->hours    = chapter->duration / 90000 / 3600;
                 chapter->minutes  = ( ( chapter->duration / 90000 ) % 3600 ) / 60;
                 chapter->seconds  = ( chapter->duration / 90000 ) % 60;
-                strcpy( chapter->title, m->title );
+                tag = av_metadata_get( m->metadata, "title", NULL, 0 );
+                strcpy( chapter->title, tag ? tag->value : "" );
                 hb_deep_log( 2, "Added chapter %i, name='%s', dur=%"PRIu64", (%02i:%02i:%02i)",
                             chapter->index, chapter->title,
                             chapter->duration, chapter->hours,
@@ -2855,6 +3432,12 @@ static int ffmpeg_read( hb_stream_t *stream, hb_buffer_t *buf )
   again:
     if ( ( err = av_read_frame( stream->ffmpeg_ic, stream->ffmpeg_pkt )) < 0 )
     {
+        // av_read_frame can return EAGAIN.  In this case, it expects
+        // to be called again to get more data.
+        if ( err == AVERROR(EAGAIN) )
+        {
+            goto again;
+        }
         // XXX the following conditional is to handle avi files that
         // use M$ 'packed b-frames' and occasionally have negative
         // sizes for the null frames these require.
@@ -2927,6 +3510,38 @@ static int ffmpeg_read( hb_stream_t *stream, hb_buffer_t *buf )
     {
         buf->start = buf->renderOffset;
     }
+    else if ( buf->renderOffset == -1 && buf->start >= 0 )
+    {
+        buf->renderOffset = buf->start;
+    }
+    
+    /* 
+     * Fill out buf->stop for subtitle packets
+     * 
+     * libavcodec's MKV demuxer stores the duration of UTF-8 subtitles (CODEC_ID_TEXT)
+     * in the 'convergence_duration' field for some reason.
+     * 
+     * Other subtitles' durations are stored in the 'duration' field.
+     * 
+     * VOB subtitles (CODEC_ID_DVD_SUBTITLE) do not have their duration stored in
+     * either field. This is not a problem because the VOB decoder can extract this
+     * information from the packet payload itself.
+     * 
+     * SSA subtitles (CODEC_ID_SSA) do not have their duration stored in
+     * either field. This is not a problem because the SSA decoder can extract this
+     * information from the packet payload itself.
+     */
+    enum CodecID ffmpeg_pkt_codec = stream->ffmpeg_ic->streams[stream->ffmpeg_pkt->stream_index]->codec->codec_id;
+    if ( ffmpeg_pkt_codec == CODEC_ID_TEXT ) {
+        int64_t ffmpeg_pkt_duration = stream->ffmpeg_pkt->convergence_duration;
+        int64_t buf_duration = av_to_hb_pts( ffmpeg_pkt_duration, tsconv );
+        buf->stop = buf->start + buf_duration;
+    }
+    if ( ffmpeg_pkt_codec == CODEC_ID_MOV_TEXT ) {
+        int64_t ffmpeg_pkt_duration = stream->ffmpeg_pkt->duration;
+        int64_t buf_duration = av_to_hb_pts( ffmpeg_pkt_duration, tsconv );
+        buf->stop = buf->start + buf_duration;
+    }
 
     /*
      * Check to see whether this video buffer is on a chapter
@@ -2977,3 +3592,16 @@ static int ffmpeg_seek( hb_stream_t *stream, float frac )
     }
     return 1;
 }
+
+// Assumes that we are always seeking forward
+static int ffmpeg_seek_ts( hb_stream_t *stream, int64_t ts )
+{
+    AVFormatContext *ic = stream->ffmpeg_ic;
+    int64_t pos;
+
+    pos = ts * AV_TIME_BASE / 90000 + ffmpeg_initial_timestamp( stream );
+    stream->need_keyframe = 1;
+    // Seek to the nearest timestamp before that requested where
+    // there is an I-frame
+    return av_seek_frame( ic, -1, pos, AVSEEK_FLAG_BACKWARD );
+}
index 94b8411..b44765e 100644 (file)
 
 typedef struct
 {
-    hb_audio_t * audio;
+    hb_lock_t * mutex;
+    int         ref;        /* Reference count to tell us when it's unused */
+    int         count_frames;
+    int64_t     audio_pts_slip;
+    int64_t     video_pts_slip;
+    int64_t     pts_offset;
+
+    /* Frame based point-to-point support */
+    int64_t     audio_pts_thresh;
+    int         start_found;
+    hb_cond_t * next_frame;
+    int         pts_count;
+    int64_t   * first_pts;
+} hb_sync_common_t;
 
-    int64_t      next_start;    /* start time of next output frame */
-    int64_t      next_pts;      /* start time of next input frame */
-    int64_t      first_drop;    /* PTS of first 'went backwards' frame dropped */
-    int          drop_count;    /* count of 'time went backwards' drops */
+typedef struct
+{
+    int          index;
+    double       next_start;   /* start time of next output frame */
+    int64_t      first_drop;   /* PTS of first 'went backwards' frame dropped */
+    int          drop_count;   /* count of 'time went backwards' drops */
 
     /* Raw */
     SRC_STATE  * state;
@@ -32,75 +47,99 @@ typedef struct
     /* AC-3 */
     int          ac3_size;
     uint8_t    * ac3_buf;
-
 } hb_sync_audio_t;
 
-struct hb_work_private_s
+typedef struct
 {
-    hb_job_t * job;
-    int        busy;            // bitmask with one bit for each active input
-                                // (bit 0 = video; 1 = audio 0, 2 = audio 1, ...
-                                // appropriate bit is cleared when input gets
-                                // an eof buf. syncWork returns done when all
-                                // bits are clear.
     /* Video */
-    int64_t pts_offset;
-    int64_t next_start;         /* start time of next output frame */
-    int64_t next_pts;           /* start time of next input frame */
-    int64_t first_drop;         /* PTS of first 'went backwards' frame dropped */
-    int drop_count;             /* count of 'time went backwards' drops */
-    int drops;                  /* frames dropped to make a cbr video stream */
-    int dups;                   /* frames duplicated to make a cbr video stream */
-    int video_sequence;
-    int count_frames;
-    int count_frames_max;
-    int chap_mark;              /* to propagate chapter mark across a drop */
-    hb_buffer_t * cur; /* The next picture to process */
-
-    /* Audio */
-    hb_sync_audio_t sync_audio[8];
-    int64_t audio_passthru_slip;
-    int64_t video_pts_slip;
+    int        first_frame;
+    int64_t    pts_skip;
+    int64_t    next_start;    /* start time of next output frame */
+    int64_t    first_drop;    /* PTS of first 'went backwards' frame dropped */
+    int        drop_count;    /* count of 'time went backwards' drops */
+    int        drops;         /* frames dropped to make a cbr video stream */
+    int        dups;          /* frames duplicated to make a cbr video stream */
+    int        video_sequence;
+    int        count_frames_max;
+    int        chap_mark;     /* to propagate chapter mark across a drop */
+    hb_buffer_t * cur;        /* The next picture to process */
 
     /* Statistics */
-    uint64_t st_counts[4];
-    uint64_t st_dates[4];
-    uint64_t st_first;
+    uint64_t   st_counts[4];
+    uint64_t   st_dates[4];
+    uint64_t   st_first;
+} hb_sync_video_t;
+
+struct hb_work_private_s
+{
+    hb_job_t * job;
+    hb_sync_common_t * common;
+    union
+    {
+        hb_sync_video_t video;
+        hb_sync_audio_t audio;
+    } type;
 };
 
 /***********************************************************************
  * Local prototypes
  **********************************************************************/
-static void InitAudio( hb_work_object_t * w, int i );
-static void SyncVideo( hb_work_object_t * w );
-static void SyncAudio( hb_work_object_t * w, int i );
-static void InsertSilence( hb_work_object_t * w, int i, int64_t d );
+static void getPtsOffset( hb_work_object_t * w );
+static int  checkPtsOffset( hb_work_object_t * w );
+static void InitAudio( hb_job_t * job, hb_sync_common_t * common, int i );
+static void InsertSilence( hb_work_object_t * w, int64_t d );
 static void UpdateState( hb_work_object_t * w );
+static void UpdateSearchState( hb_work_object_t * w, int64_t start );
+static hb_buffer_t * OutputAudioFrame( hb_audio_t *audio, hb_buffer_t *buf,
+                                       hb_sync_audio_t *sync );
 
 /***********************************************************************
  * hb_work_sync_init
  ***********************************************************************
  * Initialize the work object
  **********************************************************************/
-int syncInit( hb_work_object_t * w, hb_job_t * job )
+hb_work_object_t * hb_sync_init( hb_job_t * job )
 {
-    hb_title_t       * title = job->title;
-    hb_chapter_t     * chapter;
-    int                i;
-    uint64_t           duration;
+    hb_title_t        * title = job->title;
+    hb_chapter_t      * chapter;
+    int                 i;
+    uint64_t            duration;
     hb_work_private_t * pv;
+    hb_sync_video_t   * sync;
+    hb_work_object_t  * w;
+    hb_work_object_t  * ret = NULL;
 
     pv = calloc( 1, sizeof( hb_work_private_t ) );
+    sync = &pv->type.video;
+    pv->common = calloc( 1, sizeof( hb_sync_common_t ) );
+    pv->common->ref++;
+    pv->common->mutex = hb_lock_init();
+    pv->common->audio_pts_thresh = -1;
+    pv->common->next_frame = hb_cond_init();
+    pv->common->pts_count = 1;
+    if ( job->frame_to_start || job->pts_to_start )
+    {
+        pv->common->start_found = 0;
+    }
+    else
+    {
+        pv->common->start_found = 1;
+    }
+
+    ret = w = hb_get_work( WORK_SYNC_VIDEO );
     w->private_data = pv;
+    w->fifo_in = job->fifo_raw;
+    w->fifo_out = job->fifo_sync;
 
     pv->job            = job;
-    pv->pts_offset     = INT64_MIN;
+    pv->common->pts_offset   = INT64_MIN;
+    sync->first_frame = 1;
 
     if( job->pass == 2 )
     {
         /* We already have an accurate frame count from pass 1 */
         hb_interjob_t * interjob = hb_interjob_get( job->h );
-        pv->count_frames_max = interjob->frame_count;
+        sync->count_frames_max = interjob->frame_count;
     }
     else
     {
@@ -125,72 +164,76 @@ int syncInit( hb_work_object_t * w, hb_job_t * job )
             duration += 90000;
             /* 1 second safety so we're sure we won't miss anything */
         }
-        pv->count_frames_max = duration * title->rate / title->rate_base / 90000;
+        sync->count_frames_max = duration * title->rate / title->rate_base / 90000;
     }
 
-    hb_log( "sync: expecting %d video frames", pv->count_frames_max );
-    pv->busy |= 1;
+    hb_log( "sync: expecting %d video frames", sync->count_frames_max );
 
     /* Initialize libsamplerate for every audio track we have */
     if ( ! job->indepth_scan )
     {
-        for( i = 0; i < hb_list_count( title->list_audio ) && i < 8; i++ )
+        for( i = 0; i < hb_list_count( title->list_audio ); i++ )
         {
-            pv->busy |= ( 1 << (i + 1) );
-            InitAudio( w, i );
+            InitAudio( job, pv->common, i );
         }
     }
+    pv->common->first_pts = malloc( sizeof(int64_t) * pv->common->pts_count );
+    for ( i = 0; i < pv->common->pts_count; i++ )
+        pv->common->first_pts[i] = INT64_MAX;
 
-    return 0;
+    return ret;
 }
 
 /***********************************************************************
- * Close
+ * Close Video
  ***********************************************************************
  *
  **********************************************************************/
-void syncClose( hb_work_object_t * w )
+void syncVideoClose( hb_work_object_t * w )
 {
     hb_work_private_t * pv = w->private_data;
     hb_job_t          * job   = pv->job;
-    hb_title_t        * title = job->title;
-    hb_audio_t        * audio = NULL;
-    int i;
+    hb_sync_video_t   * sync = &pv->type.video;
+
+    // Wake up audio sync if it's still waiting on condition.
+    pv->common->pts_offset = 0;
+    pv->common->start_found = 1;
+    hb_cond_broadcast( pv->common->next_frame );
 
-    if( pv->cur )
+    if( sync->cur )
     {
-        hb_buffer_close( &pv->cur );
+        hb_buffer_close( &sync->cur );
     }
 
     hb_log( "sync: got %d frames, %d expected",
-            pv->count_frames, pv->count_frames_max );
+            pv->common->count_frames, sync->count_frames_max );
 
     /* save data for second pass */
     if( job->pass == 1 )
     {
         /* Preserve frame count for better accuracy in pass 2 */
         hb_interjob_t * interjob = hb_interjob_get( job->h );
-        interjob->frame_count = pv->count_frames;
+        interjob->frame_count = pv->common->count_frames;
         interjob->last_job = job->sequence_id;
-        interjob->total_time = pv->next_start;
+        interjob->total_time = sync->next_start;
     }
 
-    if (pv->drops || pv->dups )
+    if (sync->drops || sync->dups )
     {
-        hb_log( "sync: %d frames dropped, %d duplicated", pv->drops, pv->dups );
+        hb_log( "sync: %d frames dropped, %d duplicated", 
+                sync->drops, sync->dups );
     }
 
-    for( i = 0; i < hb_list_count( title->list_audio ); i++ )
+    hb_lock( pv->common->mutex );
+    if ( --pv->common->ref == 0 )
     {
-        audio = hb_list_item( title->list_audio, i );
-        if( audio->config.out.codec == HB_ACODEC_AC3 )
-        {
-            free( pv->sync_audio[i].ac3_buf );
-        }
-        else
-        {
-            src_delete( pv->sync_audio[i].state );
-        }
+        hb_unlock( pv->common->mutex );
+        hb_lock_close( &pv->common->mutex );
+        free( pv->common );
+    }
+    else
+    {
+        hb_unlock( pv->common->mutex );
     }
 
     free( pv );
@@ -198,123 +241,176 @@ void syncClose( hb_work_object_t * w )
 }
 
 /***********************************************************************
- * Work
+ * syncVideoWork
  ***********************************************************************
- * The root routine of this work abject
- *
- * The way this works is that we are syncing the audio to the PTS of
- * the last video that we processed. That's why we skip the audio sync
- * if we haven't got a valid PTS from the video yet.
  *
  **********************************************************************/
-int syncWork( hb_work_object_t * w, hb_buffer_t ** unused1,
-              hb_buffer_t ** unused2 )
+static hb_buffer_t * copy_subtitle( hb_buffer_t * src );
+
+int syncVideoWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
+              hb_buffer_t ** buf_out )
 {
+    hb_buffer_t * cur, * next, * sub = NULL;
     hb_work_private_t * pv = w->private_data;
+    hb_job_t          * job = pv->job;
+    hb_subtitle_t     * subtitle;
+    hb_sync_video_t   * sync = &pv->type.video;
     int i;
+    int64_t start, next_start;
 
-    if ( pv->busy & 1 )
-        SyncVideo( w );
+    *buf_out = NULL;
+    next = *buf_in;
+    *buf_in = NULL;
 
-    for( i = 0; i < hb_list_count( pv->job->title->list_audio ); i++ )
+    /* Wait till we can determine the initial pts of all streams */
+    if( next->size != 0 && pv->common->pts_offset == INT64_MIN )
     {
-        if ( pv->busy & ( 1 << (i + 1) ) )
-            SyncAudio( w, i );
+        pv->common->first_pts[0] = next->start;
+        hb_lock( pv->common->mutex );
+        while( pv->common->pts_offset == INT64_MIN )
+        {
+            // Full fifos will make us wait forever, so get the
+            // pts offset from the available streams if full
+            if ( hb_fifo_is_full( job->fifo_raw ) )
+            {
+                getPtsOffset( w );
+                hb_cond_broadcast( pv->common->next_frame );
+            }
+            else if ( checkPtsOffset( w ) )
+                hb_cond_broadcast( pv->common->next_frame );
+            else
+                hb_cond_timedwait( pv->common->next_frame, pv->common->mutex, 200 );
+        }
+        hb_unlock( pv->common->mutex );
     }
 
-    return ( pv->busy? HB_WORK_OK : HB_WORK_DONE );
-}
-
-hb_work_object_t hb_sync =
-{
-    WORK_SYNC,
-    "Synchronization",
-    syncInit,
-    syncWork,
-    syncClose
-};
-
-static void InitAudio( hb_work_object_t * w, int i )
-{
-    hb_work_private_t * pv = w->private_data;
-    hb_job_t        * job   = pv->job;
-    hb_title_t      * title = job->title;
-    hb_sync_audio_t * sync;
-
-    sync        = &pv->sync_audio[i];
-    sync->audio = hb_list_item( title->list_audio, i );
+    hb_lock( pv->common->mutex );
+    next_start = next->start - pv->common->video_pts_slip;
+    hb_unlock( pv->common->mutex );
 
-    if( sync->audio->config.out.codec == HB_ACODEC_AC3 )
+    /* Wait for start of point-to-point encoding */
+    if( !pv->common->start_found )
     {
-        /* Have a silent AC-3 frame ready in case we have to fill a
-           gap */
-        AVCodec        * codec;
-        AVCodecContext * c;
-        short          * zeros;
-
-        codec = avcodec_find_encoder( CODEC_ID_AC3 );
-        c     = avcodec_alloc_context();
-
-        c->bit_rate    = sync->audio->config.in.bitrate;
-        c->sample_rate = sync->audio->config.in.samplerate;
-        c->channels    = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT( sync->audio->config.in.channel_layout );
+        hb_sync_video_t   * sync = &pv->type.video;
 
-        if( hb_avcodec_open( c, codec ) < 0 )
+        if( next->size == 0 )
         {
-            hb_log( "sync: avcodec_open failed" );
-            return;
+            *buf_out = next;
+            pv->common->start_found = 1;
+            hb_cond_broadcast( pv->common->next_frame );
+
+            /*
+             * Push through any subtitle EOFs in case they 
+             * were not synced through.
+             */
+            for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+            {
+                subtitle = hb_list_item( job->list_subtitle, i );
+                if( subtitle->config.dest == PASSTHRUSUB )
+                {
+                    if( subtitle->source == VOBSUB ) 
+                        hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) );
+                    else
+                        hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
+                }
+            }
+            return HB_WORK_DONE;
         }
+        if ( pv->common->count_frames < job->frame_to_start ||
+             next->start < job->pts_to_start )
+        {
+            // Flush any subtitles that have pts prior to the
+            // current frame
+            for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+            {
+                subtitle = hb_list_item( job->list_subtitle, i );
+                while( ( sub = hb_fifo_see( subtitle->fifo_raw ) ) )
+                {
+                    if ( sub->start > next->start )
+                        break;
+                    sub = hb_fifo_get( subtitle->fifo_raw );
+                    hb_buffer_close( &sub );
+                }
+            }
+            hb_lock( pv->common->mutex );
+            // Tell the audio threads what must be dropped
+            pv->common->audio_pts_thresh = next_start + pv->common->video_pts_slip;
+            hb_cond_broadcast( pv->common->next_frame );
+            hb_unlock( pv->common->mutex );
 
-        zeros          = calloc( AC3_SAMPLES_PER_FRAME *
-                                 sizeof( short ) * c->channels, 1 );
-        sync->ac3_size = sync->audio->config.in.bitrate * AC3_SAMPLES_PER_FRAME /
-                             sync->audio->config.in.samplerate / 8;
-        sync->ac3_buf  = malloc( sync->ac3_size );
+            UpdateSearchState( w, next_start );
+            hb_buffer_close( &next );
 
-        if( avcodec_encode_audio( c, sync->ac3_buf, sync->ac3_size,
-                                  zeros ) != sync->ac3_size )
-        {
-            hb_log( "sync: avcodec_encode_audio failed" );
+            return HB_WORK_OK;
         }
-
-        free( zeros );
-        hb_avcodec_close( c );
-        av_free( c );
+        hb_lock( pv->common->mutex );
+        pv->common->audio_pts_thresh = 0;
+        pv->common->audio_pts_slip += next_start;
+        pv->common->video_pts_slip += next_start;
+        next_start = 0;
+        pv->common->start_found = 1;
+        pv->common->count_frames = 0;
+        hb_cond_broadcast( pv->common->next_frame );
+        hb_unlock( pv->common->mutex );
+        sync->st_first = 0;
     }
-    else
+
+    if( !sync->cur )
     {
-        /* Initialize libsamplerate */
-        int error;
-        sync->state             = src_new( SRC_SINC_MEDIUM_QUALITY, HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(sync->audio->config.out.mixdown), &error );
-        sync->data.end_of_input = 0;
-    }
-}
+        sync->cur = next;
+        if( sync->cur->size == 0 )
+        {
+            /* we got an end-of-stream as our first video packet? 
+             * Feed it downstream & signal that we're done. 
+             */
+            *buf_out = hb_buffer_init( 0 );
 
-/***********************************************************************
- * SyncVideo
- ***********************************************************************
- *
- **********************************************************************/
-static void SyncVideo( hb_work_object_t * w )
-{
-    hb_work_private_t * pv = w->private_data;
-    hb_buffer_t * cur, * next, * sub = NULL;
-    hb_job_t * job = pv->job;
-    hb_subtitle_t *subtitle;
-    int i;
-    int64_t pts_skip;
+            pv->common->start_found = 1;
+            hb_cond_broadcast( pv->common->next_frame );
 
-    if( !pv->cur && !( pv->cur = hb_fifo_get( job->fifo_raw ) ) )
-    {
-        /* We haven't even got a frame yet */
-        return;
+            /*
+             * Push through any subtitle EOFs in case they 
+             * were not synced through.
+             */
+            for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+            {
+                subtitle = hb_list_item( job->list_subtitle, i );
+                if( subtitle->config.dest == PASSTHRUSUB )
+                {
+                    if( subtitle->source == VOBSUB ) 
+                        hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) );
+                    else
+                        hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
+                }
+            }
+            return HB_WORK_DONE;
+        }
+        return HB_WORK_OK;
     }
-    cur = pv->cur;
-    pts_skip = 0;
-    if( cur->size == 0 )
+    cur = sync->cur;
+    /* At this point we have a frame to process. Let's check
+        1) if we will be able to push into the fifo ahead
+        2) if the next frame is there already, since we need it to
+           compute the duration of the current frame*/
+    if( next->size == 0 )
     {
-        /* we got an end-of-stream. Feed it downstream & signal that we're done. */
-        hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );
+        hb_buffer_close( &next );
+
+        cur->start = sync->next_start;
+        cur->stop = cur->start + 90000. / ((double)job->vrate / (double)job->vrate_base);
+
+        /* Make sure last frame is reflected in frame count */
+        pv->common->count_frames++;
+
+        /* Push the frame to the renderer */
+        hb_fifo_push( job->fifo_sync, cur );
+        sync->cur = NULL;
+
+        /* we got an end-of-stream. Feed it downstream & signal that
+         * we're done. Note that this means we drop the final frame of
+         * video (we don't know its duration). On DVDs the final frame
+         * is often strange and dropping it seems to be a good idea. */
+        *buf_out = hb_buffer_init( 0 );
 
         /*
          * Push through any subtitle EOFs in case they were not synced through.
@@ -324,432 +420,784 @@ static void SyncVideo( hb_work_object_t * w )
             subtitle = hb_list_item( job->list_subtitle, i );
             if( subtitle->config.dest == PASSTHRUSUB )
             {
-                hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
+                if( subtitle->source == VOBSUB ) 
+                    hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) );
+                else
+                    hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
             }
         }
-
-        pv->busy &=~ 1;
-        return;
+        pv->common->start_found = 1;
+        hb_cond_broadcast( pv->common->next_frame );
+        return HB_WORK_DONE;
     }
 
-    /* At this point we have a frame to process. Let's check
-        1) if we will be able to push into the fifo ahead
-        2) if the next frame is there already, since we need it to
-           compute the duration of the current frame*/
-    while( !hb_fifo_is_full( job->fifo_sync ) &&
-           ( next = hb_fifo_see( job->fifo_raw ) ) )
+    /* Check for end of point-to-point frame encoding */
+    if( job->frame_to_stop && pv->common->count_frames > job->frame_to_stop )
     {
-        hb_buffer_t * buf_tmp;
+        // Drop an empty buffer into our output to ensure that things
+        // get flushed all the way out.
+        hb_buffer_close( &sync->cur );
+        hb_buffer_close( &next );
+        *buf_out = hb_buffer_init( 0 );
+        hb_log( "sync: reached %d frames, exiting early",
+                pv->common->count_frames );
 
-        if( next->size == 0 )
+        /*
+         * Push through any subtitle EOFs in case they were not synced through.
+         */
+        for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
         {
-            /* we got an end-of-stream. Feed it downstream & signal that
-             * we're done. Note that this means we drop the final frame of
-             * video (we don't know its duration). On DVDs the final frame
-             * is often strange and dropping it seems to be a good idea. */
-            hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );
-
-            /*
-             * Push through any subtitle EOFs in case they were not synced through.
-             */
-            for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+            subtitle = hb_list_item( job->list_subtitle, i );
+            if( subtitle->config.dest == PASSTHRUSUB )
             {
-                subtitle = hb_list_item( job->list_subtitle, i );
-                if( subtitle->config.dest == PASSTHRUSUB )
-                {
+                if( subtitle->source == VOBSUB ) 
+                    hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) );
+                else
                     hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
-                }
-            }
-            pv->busy &=~ 1;
-            return;
-        }
-        if( pv->pts_offset == INT64_MIN )
-        {
-            /* This is our first frame */
-            pv->pts_offset = 0;
-            if ( cur->start != 0 )
-            {
-                /*
-                 * The first pts from a dvd should always be zero but
-                 * can be non-zero with a transport or program stream since
-                 * we're not guaranteed to start on an IDR frame. If we get
-                 * a non-zero initial PTS extend its duration so it behaves
-                 * as if it started at zero so that our audio timing will
-                 * be in sync.
-                 */
-                hb_log( "sync: first pts is %"PRId64, cur->start );
-                cur->start = 0;
             }
         }
+        return HB_WORK_DONE;
+    }
+
+    hb_lock( pv->common->mutex );
+    start = cur->start - pv->common->video_pts_slip;
+    hb_unlock( pv->common->mutex );
+
+    /* Check for end of point-to-point pts encoding */
+    if( job->pts_to_stop && sync->next_start >= job->pts_to_stop )
+    {
+        // Drop an empty buffer into our output to ensure that things
+        // get flushed all the way out.
+        hb_log( "sync: reached pts %"PRId64", exiting early", start );
+        hb_buffer_close( &sync->cur );
+        hb_buffer_close( &next );
+        *buf_out = hb_buffer_init( 0 );
 
         /*
-         * since the first frame is always 0 and the upstream reader code
-         * is taking care of adjusting for pts discontinuities, we just have
-         * to deal with the next frame's start being in the past. This can
-         * happen when the PTS is adjusted after data loss but video frame
-         * reordering causes some frames with the old clock to appear after
-         * the clock change. This creates frames that overlap in time which
-         * looks to us like time going backward. The downstream muxing code
-         * can deal with overlaps of up to a frame time but anything larger
-         * we handle by dropping frames here.
+         * Push through any subtitle EOFs in case they were not synced through.
          */
-        if ( (int64_t)( next->start - pv->video_pts_slip - cur->start ) <= 0 )
+        for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
         {
-            if ( pv->first_drop == 0 )
-            {
-                pv->first_drop = next->start;
-            }
-            ++pv->drop_count;
-            if (next->start - cur->start > 0)
-            {
-                pts_skip += next->start - cur->start;
-                pv->video_pts_slip -= next->start - cur->start;
-            }
-            buf_tmp = hb_fifo_get( job->fifo_raw );
-            if ( buf_tmp->new_chap )
+            subtitle = hb_list_item( job->list_subtitle, i );
+            if( subtitle->config.dest == PASSTHRUSUB )
             {
-                // don't drop a chapter mark when we drop the buffer
-                pv->chap_mark = buf_tmp->new_chap;
+                if( subtitle->source == VOBSUB ) 
+                    hb_fifo_push( subtitle->fifo_sync, hb_buffer_init( 0 ) );
+                else
+                    hb_fifo_push( subtitle->fifo_out, hb_buffer_init( 0 ) );
             }
-            hb_buffer_close( &buf_tmp );
-            continue;
         }
-        if ( pv->first_drop )
+        return HB_WORK_DONE;
+    }
+
+    if( sync->first_frame )
+    {
+        /* This is our first frame */
+        if ( start > 0 )
         {
-            hb_log( "sync: video time didn't advance - dropped %d frames "
-                    "(delta %d ms, current %"PRId64", next %"PRId64", dur %d)",
-                    pv->drop_count, (int)( cur->start - pv->first_drop ) / 90,
-                    cur->start, next->start, (int)( next->start - cur->start ) );
-            pv->first_drop = 0;
-            pv->drop_count = 0;
+            /*
+             * The first pts from a dvd should always be zero but
+             * can be non-zero with a transport or program stream since
+             * we're not guaranteed to start on an IDR frame. If we get
+             * a non-zero initial PTS extend its duration so it behaves
+             * as if it started at zero so that our audio timing will
+             * be in sync.
+             */
+            hb_log( "sync: first pts is %"PRId64, start );
+            start = 0;
         }
+        sync->first_frame = 0;
+    }
 
-        /*
-         * Track the video sequence number localy so that we can sync the audio
-         * to it using the sequence number as well as the PTS.
-         */
-        pv->video_sequence = cur->sequence;
+    /*
+     * since the first frame is always 0 and the upstream reader code
+     * is taking care of adjusting for pts discontinuities, we just have
+     * to deal with the next frame's start being in the past. This can
+     * happen when the PTS is adjusted after data loss but video frame
+     * reordering causes some frames with the old clock to appear after
+     * the clock change. This creates frames that overlap in time which
+     * looks to us like time going backward. The downstream muxing code
+     * can deal with overlaps of up to a frame time but anything larger
+     * we handle by dropping frames here.
+     */
+    if ( next_start - start <= 0 )
+    {
+        if ( sync->first_drop == 0 )
+        {
+            sync->first_drop = next_start;
+        }
+        ++sync->drop_count;
+        if ( next->new_chap )
+        {
+            // don't drop a chapter mark when we drop the buffer
+            sync->chap_mark = next->new_chap;
+        }
+        hb_buffer_close( &next );
+        return HB_WORK_OK;
+    }
+    if ( sync->first_drop )
+    {
+        hb_log( "sync: video time didn't advance - dropped %d frames "
+                "(delta %d ms, current %"PRId64", next %"PRId64", dur %d)",
+                sync->drop_count, (int)( start - sync->first_drop ) / 90,
+                start, next_start, (int)( next_start - start ) );
+        sync->first_drop = 0;
+        sync->drop_count = 0;
+    }
+
+    /*
+     * Track the video sequence number localy so that we can sync the audio
+     * to it using the sequence number as well as the PTS.
+     */
+    sync->video_sequence = cur->sequence;
+
+    /*
+     * Look for a subtitle for this frame.
+     *
+     * If found then it will be tagged onto a video buffer of the correct time and 
+     * sent in to the render pipeline. This only needs to be done for VOBSUBs which
+     * get rendered, other types of subtitles can just sit in their raw_queue until
+     * delt with at muxing.
+     */
+    for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+    {
+        int64_t sub_start, sub_stop, duration;
+        subtitle = hb_list_item( job->list_subtitle, i );
 
         /*
-         * Look for a subtitle for this frame.
-         *
-         * If found then it will be tagged onto a video buffer of the correct time and 
-         * sent in to the render pipeline. This only needs to be done for VOBSUBs which
-         * get rendered, other types of subtitles can just sit in their raw_queue until
-         * delt with at muxing.
+         * Rewrite timestamps on subtitles that need it (on raw queue).
          */
-        for( i = 0; i < hb_list_count( job->list_subtitle ); i++)
+        // NOTE: It's probably fine to use this logic for passthru VOBSUBs as well,
+        //       but I am currently preserving backwards compatibility with the old
+        //       VOBSUB behavior, which uses the more complex logic following this if-statement.
+        if( subtitle->config.dest == PASSTHRUSUB && subtitle->source != VOBSUB )
         {
-            subtitle = hb_list_item( job->list_subtitle, i );
-
             /*
-             * Rewrite timestamps on subtitles that need it (on raw queue).
+             * Rewrite timestamps on subtitles that came from Closed Captions
+             * since they are using the MPEG2 timestamps.
              */
-            if( subtitle->source == CC608SUB ||
-                subtitle->source == CC708SUB ||
-                subtitle->source == SRTSUB )
+            while( ( sub = hb_fifo_see( subtitle->fifo_raw ) ) )
             {
+                hb_lock( pv->common->mutex );
+                sub_start = sub->start - pv->common->video_pts_slip;
+                hb_unlock( pv->common->mutex );
+                duration = sub->stop - sub->start;
+                sub_stop = sub_start + duration;
+
                 /*
-                 * Rewrite timestamps on subtitles that came from Closed Captions
-                 * since they are using the MPEG2 timestamps.
+                 * Rewrite the timestamps as and when the video
+                 * (cur->start) reaches the same timestamp as a
+                 * closed caption (sub->start).
+                 *
+                 * What about discontinuity boundaries - not delt
+                 * with here - Van?
+                 *
+                 * Bypass the sync fifo altogether.
                  */
-                while( ( sub = hb_fifo_see( subtitle->fifo_raw ) ) )
+                if( sub->size <= 0 )
                 {
+                    sub = hb_fifo_get( subtitle->fifo_raw );
+                    hb_fifo_push( subtitle->fifo_out, sub );
+                    sub = NULL;
+                    break;
+                } else {
                     /*
-                     * Rewrite the timestamps as and when the video
-                     * (cur->start) reaches the same timestamp as a
-                     * closed caption (sub->start).
+                     * Sync the subtitles to the incoming video, and use
+                     * the matching converted video timestamp.
                      *
-                     * What about discontinuity boundaries - not delt
-                     * with here - Van?
+                     * Note that it doesn't appear that we need to convert 
+                     * timestamps, I guess that they were already correct,
+                     * so just push them through for rendering.
                      *
-                     * Bypass the sync fifo altogether.
                      */
-                    if( sub->size <= 0 )
+                    if( sub_start <= start )
                     {
                         sub = hb_fifo_get( subtitle->fifo_raw );
+                        sub->start = sub_start;
+                        sub->stop = sub_stop;
                         hb_fifo_push( subtitle->fifo_out, sub );
+                    } else {
+                        // sub too early. Leave it in the fifo.
                         sub = NULL;
                         break;
-                    } else {
-                        /*
-                         * Sync the subtitles to the incoming video, and use
-                         * the matching converted video timestamp.
-                         *
-                         * Note that it doesn't appear that we need to convert 
-                         * timestamps, I guess that they were already correct,
-                         * so just push them through for rendering.
-                         *
-                         */
-                        if( sub->start < cur->start )
-                        {
-                            sub = hb_fifo_get( subtitle->fifo_raw );
-                            hb_fifo_push( subtitle->fifo_out, sub );
-                        } else {
-                            sub = NULL;
-                            break;
-                        }
                     }
                 }
             }
+            
+            continue;
+        }
 
-            if( subtitle->source == VOBSUB ) 
+        // For rendered subtitles (and, for backward compatibility, passthru VOBSUBs),
+        // delay pushing subtitle packets through the pipeline until the video catches up
+        if( subtitle->config.dest == RENDERSUB || subtitle->source == VOBSUB ) 
+        {
+            hb_buffer_t * sub2;
+            while( ( sub = hb_fifo_see( subtitle->fifo_raw ) ) )
             {
-                hb_buffer_t * sub2;
-                while( ( sub = hb_fifo_see( subtitle->fifo_raw ) ) )
+                if( sub->size == 0 )
                 {
-                    if( sub->size == 0 )
-                    {
-                        /*
-                         * EOF, pass it through immediately.
-                         */
-                        break;
-                    }
+                    /*
+                     * EOF, pass it through immediately.
+                     */
+                    break;
+                }
 
-                    /* If two subtitles overlap, make the first one stop
-                       when the second one starts */
-                    sub2 = hb_fifo_see2( subtitle->fifo_raw );
-                    if( sub2 && sub->stop > sub2->start )
-                    {
-                        sub->stop = sub2->start;
-                    }
-                    
-                    // hb_log("0x%x: video seq: %lld  subtitle sequence: %lld",
-                    //       sub, cur->sequence, sub->sequence);
-                    
-                    if( sub->sequence > cur->sequence )
+                hb_lock( pv->common->mutex );
+                sub_start = sub->start - pv->common->video_pts_slip;
+                hb_unlock( pv->common->mutex );
+                duration = sub->stop - sub->start;
+                sub_stop = sub_start + duration;
+
+                /* If two subtitles overlap, make the first one stop
+                   when the second one starts */
+                sub2 = hb_fifo_see2( subtitle->fifo_raw );
+                if( sub2 && sub->stop > sub2->start )
+                {
+                    sub->stop = sub2->start;
+                }
+                
+                // hb_log("0x%x: video seq: %"PRId64" subtitle sequence: %"PRId64,
+                //       sub, cur->sequence, sub->sequence);
+                
+                if( sub->sequence > cur->sequence )
+                {
+                    /*
+                     * The video is behind where we are, so wait until
+                     * it catches up to the same reader point on the
+                     * DVD. Then our PTS should be in the same region
+                     * as the video.
+                     */
+                    sub = NULL;
+                    break;
+                }
+                
+                if( sub_stop > start ) 
+                {
+                    /*
+                     * The stop time is in the future, so fall through
+                     * and we'll deal with it in the next block of
+                     * code.
+                     */
+
+                    /*
+                     * There is a valid subtitle, is it time to display it?
+                     */
+                    if( sub_stop > sub_start)
                     {
                         /*
-                         * The video is behind where we are, so wait until
-                         * it catches up to the same reader point on the
-                         * DVD. Then our PTS should be in the same region
-                         * as the video.
+                         * Normal subtitle which ends after it starts, 
+                         * check to see that the current video is between 
+                         * the start and end.
                          */
-                        sub = NULL;
-                        break;
+                        if( start > sub_start &&
+                            start < sub_stop )
+                        {
+                            /*
+                            * We should be playing this, so leave the
+                            * subtitle in place.
+                            *
+                            * fall through to display
+                            */
+                        }
+                        else
+                        {
+                            /*
+                             * Defer until the play point is within 
+                             * the subtitle
+                             */
+                            sub = NULL;
+                        }
                     }
-                    
-                    if( sub->stop > cur->start ) {
-                        /*
-                         * The stop time is in the future, so fall through
-                         * and we'll deal with it in the next block of
-                         * code.
-                         */
-
+                    else
+                    {
                         /*
-                         * There is a valid subtitle, is it time to display it?
+                         * The end of the subtitle is less than the start, 
+                         * this is a sign of a PTS discontinuity.
                          */
-                        if( sub->stop > sub->start)
+                        if( sub_start > start )
                         {
                             /*
-                             * Normal subtitle which ends after it starts, 
-                             * check to see that the current video is between 
-                             * the start and end.
+                             * we haven't reached the start time yet, or
+                             * we have jumped backwards after having
+                             * already started this subtitle.
                              */
-                            if( cur->start > sub->start &&
-                                cur->start < sub->stop )
+                            if( start < sub_stop )
                             {
                                 /*
-                                * We should be playing this, so leave the
-                                * subtitle in place.
-                                *
-                                * fall through to display
-                                */
-                                if( ( sub->stop - sub->start ) < ( 2 * 90000 ) )
-                                {
-                                    /*
-                                     * Subtitle is on for less than three 
-                                     * seconds, extend the time that it is 
-                                     * displayed to make it easier to read. 
-                                     * Make it 3 seconds or until the next
-                                     * subtitle is displayed.
-                                     *
-                                     * This is in response to Indochine which 
-                                     * only displays subs for 1 second - 
-                                     * too fast to read.
-                                     */
-                                    sub->stop = sub->start + ( 2 * 90000 );
-                                
-                                    sub2 = hb_fifo_see2( subtitle->fifo_raw );
-                                
-                                    if( sub2 && sub->stop > sub2->start )
-                                    {
-                                        sub->stop = sub2->start;
-                                    }
-                                }
+                                 * We have jumped backwards and so should
+                                 * continue displaying this subtitle.
+                                 *
+                                 * fall through to display.
+                                 */
                             }
                             else
                             {
                                 /*
-                                 * Defer until the play point is within 
-                                 * the subtitle
+                                 * Defer until the play point is 
+                                 * within the subtitle
                                  */
                                 sub = NULL;
                             }
-                        }
-                        else
-                        {
+                        } else {
                             /*
-                             * The end of the subtitle is less than the start, 
-                             * this is a sign of a PTS discontinuity.
-                             */
-                            if( sub->start > cur->start )
-                            {
-                                /*
-                                 * we haven't reached the start time yet, or
-                                 * we have jumped backwards after having
-                                 * already started this subtitle.
-                                 */
-                                if( cur->start < sub->stop )
-                                {
-                                    /*
-                                     * We have jumped backwards and so should
-                                     * continue displaying this subtitle.
-                                     *
-                                     * fall through to display.
-                                     */
-                                }
-                                else
-                                {
-                                    /*
-                                     * Defer until the play point is 
-                                     * within the subtitle
-                                     */
-                                    sub = NULL;
-                                }
-                            } else {
-                                /*
-                                * Play this subtitle as the start is 
-                                * greater than our video point.
-                                *
-                                * fall through to display/
-                                */
-                            }
+                            * Play this subtitle as the start is 
+                            * greater than our video point.
+                            *
+                            * fall through to display/
+                            */
                         }
-                       break;
                     }
-                    else
-                    {
+                       break;
+                }
+                else
+                {
                     
-                        /*
-                         * The subtitle is older than this picture, trash it
-                         */
-                        sub = hb_fifo_get( subtitle->fifo_raw );
-                        hb_buffer_close( &sub );
-                    }
+                    /*
+                     * The subtitle is older than this picture, trash it
+                     */
+                    sub = hb_fifo_get( subtitle->fifo_raw );
+                    hb_buffer_close( &sub );
                 }
-                
-                /* If we have a subtitle for this picture, copy it */
-                /* FIXME: we should avoid this memcpy */
-                if( sub )
+            }
+            
+            /* If we have a subtitle for this picture, copy it */
+            if( sub )
+            {
+                if( sub->size > 0 )
                 {
-                    if( sub->size > 0 )
+                    if( subtitle->config.dest == RENDERSUB )
                     {
-                        if( subtitle->config.dest == RENDERSUB )
+                        // Only allow one subtitle to be showing at once; ignore others
+                        if ( cur->sub == NULL )
                         {
-                            if ( cur->sub == NULL )
-                            {
-                                /*
-                                 * Tack onto the video buffer for rendering
-                                 */
-                                cur->sub         = hb_buffer_init( sub->size );
-                                cur->sub->x      = sub->x;
-                                cur->sub->y      = sub->y;
-                                cur->sub->width  = sub->width;
-                                cur->sub->height = sub->height;
-                                memcpy( cur->sub->data, sub->data, sub->size ); 
-                            }
-                        } else {
                             /*
-                             * Pass-Through, pop it off of the raw queue, 
+                             * Tack onto the video buffer for rendering
                              */
-                            sub = hb_fifo_get( subtitle->fifo_raw );
-                            hb_fifo_push( subtitle->fifo_sync, sub );
+                            /* FIXME: we should avoid this memcpy */
+                            cur->sub = copy_subtitle( sub );
+                            cur->sub->start = sub_start;
+                            cur->sub->stop = sub_stop;
+                            
+                            // Leave the subtitle on the raw queue
+                            // (until it no longer needs to be displayed)
                         }
                     } else {
                         /*
-                        * EOF - consume for rendered, else pass through
-                        */
-                        if( subtitle->config.dest == RENDERSUB )
-                        {
-                            sub = hb_fifo_get( subtitle->fifo_raw );
-                            hb_buffer_close( &sub );
-                        } else {
-                            sub = hb_fifo_get( subtitle->fifo_raw );
-                            hb_fifo_push( subtitle->fifo_out, sub );
-                        }
+                         * Pass-Through, pop it off of the raw queue, 
+                         */
+                        sub = hb_fifo_get( subtitle->fifo_raw );
+                        sub->start = sub_start;
+                        sub->stop = sub_stop;
+                        hb_fifo_push( subtitle->fifo_sync, sub );
+                    }
+                } else {
+                    /*
+                    * EOF - consume for rendered, else pass through
+                    */
+                    if( subtitle->config.dest == RENDERSUB )
+                    {
+                        sub = hb_fifo_get( subtitle->fifo_raw );
+                        hb_buffer_close( &sub );
+                    } else {
+                        sub = hb_fifo_get( subtitle->fifo_raw );
+                        sub->start = sub_start;
+                        sub->stop = sub_stop;
+                        hb_fifo_push( subtitle->fifo_sync, sub );
                     }
                 }
             }
-        } // end subtitles
+        }
+    } // end subtitles
+
+    /*
+     * Adjust the pts of the current frame so that it's contiguous
+     * with the previous frame. The start time of the current frame
+     * has to be the end time of the previous frame and the stop
+     * time has to be the start of the next frame.  We don't
+     * make any adjustments to the source timestamps other than removing
+     * the clock offsets (which also removes pts discontinuities).
+     * This means we automatically encode at the source's frame rate.
+     * MP2 uses an implicit duration (frames end when the next frame
+     * starts) but more advanced containers like MP4 use an explicit
+     * duration. Since we're looking ahead one frame we set the
+     * explicit stop time from the start time of the next frame.
+     */
+    *buf_out = cur;
+    sync->cur = cur = next;
+    cur->sub = NULL;
+    int64_t duration = next_start - start;
+    sync->pts_skip = 0;
+    if ( duration <= 0 )
+    {
+        hb_log( "sync: invalid video duration %"PRId64", start %"PRId64", next %"PRId64"",
+                duration, start, next_start );
+    }
+
+    (*buf_out)->start = sync->next_start;
+    sync->next_start += duration;
+    (*buf_out)->stop = sync->next_start;
+
+    if ( sync->chap_mark )
+    {
+        // we have a pending chapter mark from a recent drop - put it on this
+        // buffer (this may make it one frame late but we can't do any better).
+        (*buf_out)->new_chap = sync->chap_mark;
+        sync->chap_mark = 0;
+    }
+
+    /* Update UI */
+    UpdateState( w );
+
+    return HB_WORK_OK;
+}
+
+static hb_buffer_t * copy_subtitle( hb_buffer_t * src_list )
+{
+    hb_buffer_t * dst_list = NULL;
+    
+    hb_buffer_t * src;
+    hb_buffer_t * dst;
+    hb_buffer_t ** dst_ptr = &dst_list;
+    for ( src = src_list, dst_ptr = &dst_list;
+          src;
+          src = src->next_subpicture, dst_ptr = &dst->next_subpicture )
+    {
+        (*dst_ptr)  = hb_buffer_init( src->size );
+        dst         = (*dst_ptr); 
+        dst->x      = src->x;
+        dst->y      = src->y;
+        dst->width  = src->width;
+        dst->height = src->height;
+        memcpy( dst->data, src->data, src->size );
+    }
+    
+    return dst_list;
+}
+
+// sync*Init does nothing because sync has a special initializer
+// that takes care of initializing video and all audio tracks
+int syncVideoInit( hb_work_object_t * w, hb_job_t * job)
+{
+    return 0;
+}
 
+hb_work_object_t hb_sync_video =
+{
+    WORK_SYNC_VIDEO,
+    "Video Synchronization",
+    syncVideoInit,
+    syncVideoWork,
+    syncVideoClose
+};
+
+/***********************************************************************
+ * Close Audio
+ ***********************************************************************
+ *
+ **********************************************************************/
+void syncAudioClose( hb_work_object_t * w )
+{
+    hb_work_private_t * pv    = w->private_data;
+    hb_sync_audio_t   * sync  = &pv->type.audio;
+
+    if( w->audio->config.out.codec == HB_ACODEC_AC3_PASS )
+    {
+        free( sync->ac3_buf );
+    }
+    else
+    {
+        src_delete( sync->state );
+    }
+
+    hb_lock( pv->common->mutex );
+    if ( --pv->common->ref == 0 )
+    {
+        hb_unlock( pv->common->mutex );
+        hb_lock_close( &pv->common->mutex );
+        free( pv->common );
+    }
+    else
+    {
+        hb_unlock( pv->common->mutex );
+    }
+
+    free( pv );
+    w->private_data = NULL;
+}
+
+int syncAudioInit( hb_work_object_t * w, hb_job_t * job)
+{
+    return 0;
+}
+
+/***********************************************************************
+ * SyncAudio
+ ***********************************************************************
+ *
+ **********************************************************************/
+static int syncAudioWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
+                       hb_buffer_t ** buf_out )
+{
+    hb_work_private_t * pv = w->private_data;
+    hb_job_t        * job = pv->job;
+    hb_sync_audio_t * sync = &pv->type.audio;
+    hb_buffer_t     * buf;
+    int64_t start;
+
+    *buf_out = NULL;
+    buf = *buf_in;
+    *buf_in = NULL;
+    /* if the next buffer is an eof send it downstream */
+    if ( buf->size <= 0 )
+    {
+        hb_buffer_close( &buf );
+        *buf_out = hb_buffer_init( 0 );
+        return HB_WORK_DONE;
+    }
+
+    /* Wait till we can determine the initial pts of all streams */
+    if( pv->common->pts_offset == INT64_MIN )
+    {
+        pv->common->first_pts[sync->index+1] = buf->start;
+        hb_lock( pv->common->mutex );
+        while( pv->common->pts_offset == INT64_MIN )
+        {
+            // Full fifos will make us wait forever, so get the
+            // pts offset from the available streams if full
+            if (hb_fifo_is_full(w->fifo_in))
+            {
+                getPtsOffset( w );
+                hb_cond_broadcast( pv->common->next_frame );
+            }
+            else if ( checkPtsOffset( w ) )
+                hb_cond_broadcast( pv->common->next_frame );
+            else
+                hb_cond_timedwait( pv->common->next_frame, pv->common->mutex, 200 );
+        }
+        hb_unlock( pv->common->mutex );
+    }
+
+    /* Wait for start frame if doing point-to-point */
+    hb_lock( pv->common->mutex );
+    start = buf->start - pv->common->audio_pts_slip;
+    while ( !pv->common->start_found )
+    {
+        if ( pv->common->audio_pts_thresh < 0 )
+        {
+            // I would initialize this in hb_sync_init, but 
+            // job->pts_to_start can be modified by reader 
+            // after hb_sync_init is called.
+            pv->common->audio_pts_thresh = job->pts_to_start;
+        }
+        if ( buf->start < pv->common->audio_pts_thresh )
+        {
+            hb_buffer_close( &buf );
+            hb_unlock( pv->common->mutex );
+            return HB_WORK_OK;
+        }
+        while ( !pv->common->start_found && 
+                buf->start >= pv->common->audio_pts_thresh )
+        {
+            hb_cond_timedwait( pv->common->next_frame, pv->common->mutex, 200 );
+        }
+        start = buf->start - pv->common->audio_pts_slip;
+    }
+    if ( start < 0 )
+    {
+        hb_buffer_close( &buf );
+        hb_unlock( pv->common->mutex );
+        return HB_WORK_OK;
+    }
+    hb_unlock( pv->common->mutex );
+
+    if( job->frame_to_stop && pv->common->count_frames >= job->frame_to_stop )
+    {
+        hb_buffer_close( &buf );
+        *buf_out = hb_buffer_init( 0 );
+        return HB_WORK_DONE;
+    }
+
+    if( job->pts_to_stop && sync->next_start >= job->pts_to_stop )
+    {
+        hb_buffer_close( &buf );
+        *buf_out = hb_buffer_init( 0 );
+        return HB_WORK_DONE;
+    }
+
+    if ( start - sync->next_start < 0 )
+    {
+        // audio time went backwards.
+        // If our output clock is more than a half frame ahead of the
+        // input clock drop this frame to move closer to sync.
+        // Otherwise drop frames until the input clock matches the output clock.
+        if ( sync->first_drop || sync->next_start - start > 90*15 )
+        {
+            // Discard data that's in the past.
+            if ( sync->first_drop == 0 )
+            {
+                sync->first_drop = sync->next_start;
+            }
+            ++sync->drop_count;
+            hb_buffer_close( &buf );
+            return HB_WORK_OK;
+        }
+    }
+    if ( sync->first_drop )
+    {
+        // we were dropping old data but input buf time is now current
+        hb_log( "sync: audio %d time went backwards %d ms, dropped %d frames "
+                "(next %"PRId64", current %"PRId64")", w->audio->id,
+                (int)( sync->next_start - sync->first_drop ) / 90,
+                sync->drop_count, sync->first_drop, (int64_t)sync->next_start );
+        sync->first_drop = 0;
+        sync->drop_count = 0;
+    }
+    if ( start - sync->next_start >= (90 * 70) )
+    {
+        if ( start - sync->next_start > (90000LL * 60) )
+        {
+            // there's a gap of more than a minute between the last
+            // frame and this. assume we got a corrupted timestamp
+            // and just drop the next buf.
+            hb_log( "sync: %d minute time gap in audio %d - dropping buf"
+                    "  start %"PRId64", next %"PRId64,
+                    (int)((start - sync->next_start) / (90000*60)),
+                    w->audio->id, start, (int64_t)sync->next_start );
+            hb_buffer_close( &buf );
+            return HB_WORK_OK;
+        }
         /*
-         * Adjust the pts of the current frame so that it's contiguous
-         * with the previous frame. The start time of the current frame
-         * has to be the end time of the previous frame and the stop
-         * time has to be the start of the next frame.  We don't
-         * make any adjustments to the source timestamps other than removing
-         * the clock offsets (which also removes pts discontinuities).
-         * This means we automatically encode at the source's frame rate.
-         * MP2 uses an implicit duration (frames end when the next frame
-         * starts) but more advanced containers like MP4 use an explicit
-         * duration. Since we're looking ahead one frame we set the
-         * explicit stop time from the start time of the next frame.
+         * there's a gap of at least 70ms between the last
+         * frame we processed & the next. Fill it with silence.
+         * Or in the case of DCA, skip some frames from the
+         * other streams.
          */
-        buf_tmp = cur;
-        pv->cur = cur = hb_fifo_get( job->fifo_raw );
-        cur->sub = NULL;
-        pv->next_pts = cur->start;
-        int64_t duration = cur->start - pts_skip - buf_tmp->start;
-        pts_skip = 0;
-        if ( duration <= 0 )
+        if( w->audio->config.out.codec == HB_ACODEC_DCA_PASS )
         {
-            hb_log( "sync: invalid video duration %"PRId64", start %"PRId64", next %"PRId64"",
-                    duration, buf_tmp->start, next->start );
+            hb_log( "sync: audio gap %d ms. Skipping frames. Audio %d"
+                    "  start %"PRId64", next %"PRId64,
+                    (int)((start - sync->next_start) / 90),
+                    w->audio->id, start, (int64_t)sync->next_start );
+            hb_lock( pv->common->mutex );
+            pv->common->audio_pts_slip += (start - sync->next_start);
+            pv->common->video_pts_slip += (start - sync->next_start);
+            hb_unlock( pv->common->mutex );
+            *buf_out = buf;
+            return HB_WORK_OK;
         }
+        hb_log( "sync: adding %d ms of silence to audio %d"
+                "  start %"PRId64", next %"PRId64,
+                (int)((start - sync->next_start) / 90),
+                w->audio->id, start, (int64_t)sync->next_start );
+        InsertSilence( w, start - sync->next_start );
+    }
 
-        buf_tmp->start = pv->next_start;
-        pv->next_start += duration;
-        buf_tmp->stop = pv->next_start;
+    /*
+     * When we get here we've taken care of all the dups and gaps in the
+     * audio stream and are ready to inject the next input frame into
+     * the output stream.
+     */
+    *buf_out = OutputAudioFrame( w->audio, buf, sync );
+    return HB_WORK_OK;
+}
+
+hb_work_object_t hb_sync_audio =
+{
+    WORK_SYNC_AUDIO,
+    "AudioSynchronization",
+    syncAudioInit,
+    syncAudioWork,
+    syncAudioClose
+};
+
+static void InitAudio( hb_job_t * job, hb_sync_common_t * common, int i )
+{
+    hb_work_object_t  * w;
+    hb_work_private_t * pv;
+    hb_title_t        * title = job->title;
+    hb_sync_audio_t   * sync;
 
-        if ( pv->chap_mark )
+    pv = calloc( 1, sizeof( hb_work_private_t ) );
+    sync = &pv->type.audio;
+    sync->index = i;
+    pv->job    = job;
+    pv->common = common;
+    pv->common->ref++;
+    pv->common->pts_count++;
+
+    w = hb_get_work( WORK_SYNC_AUDIO );
+    w->private_data = pv;
+    w->audio = hb_list_item( title->list_audio, i );
+    w->fifo_in = w->audio->priv.fifo_raw;
+
+    if( w->audio->config.out.codec == HB_ACODEC_AC3_PASS ||
+        w->audio->config.out.codec == HB_ACODEC_DCA_PASS )
+    {
+        w->fifo_out = w->audio->priv.fifo_out;
+    }
+    else
+    {
+        w->fifo_out = w->audio->priv.fifo_sync;
+    }
+
+    if( w->audio->config.out.codec == HB_ACODEC_AC3_PASS )
+    {
+        /* Have a silent AC-3 frame ready in case we have to fill a
+           gap */
+        AVCodec        * codec;
+        AVCodecContext * c;
+        short          * zeros;
+
+        codec = avcodec_find_encoder( CODEC_ID_AC3 );
+        c     = avcodec_alloc_context();
+
+        c->bit_rate    = w->audio->config.in.bitrate;
+        c->sample_rate = w->audio->config.in.samplerate;
+        c->channels    = HB_INPUT_CH_LAYOUT_GET_DISCRETE_COUNT( w->audio->config.in.channel_layout );
+
+        if( hb_avcodec_open( c, codec ) < 0 )
         {
-            // we have a pending chapter mark from a recent drop - put it on this
-            // buffer (this may make it one frame late but we can't do any better).
-            buf_tmp->new_chap = pv->chap_mark;
-            pv->chap_mark = 0;
+            hb_log( "sync: avcodec_open failed" );
+            return;
         }
 
-        /* Push the frame to the renderer */
-        hb_fifo_push( job->fifo_sync, buf_tmp );
+        zeros          = calloc( AC3_SAMPLES_PER_FRAME *
+                                 sizeof( short ) * c->channels, 1 );
+        sync->ac3_size = w->audio->config.in.bitrate * AC3_SAMPLES_PER_FRAME /
+                             w->audio->config.in.samplerate / 8;
+        sync->ac3_buf  = malloc( sync->ac3_size );
 
-        /* Update UI */
-        UpdateState( w );
-        
-        if( job->frame_to_stop && pv->count_frames > job->frame_to_stop )
+        if( avcodec_encode_audio( c, sync->ac3_buf, sync->ac3_size,
+                                  zeros ) != sync->ac3_size )
         {
-            // Drop an empty buffer into our output to ensure that things
-            // get flushed all the way out.
-            hb_fifo_push( job->fifo_sync, hb_buffer_init( 0 ) );
-            pv->busy &=~ 1;
-            hb_log( "sync: reached %d frames, exiting early (%i busy)",
-                    pv->count_frames, pv->busy );
-            return;
+            hb_log( "sync: avcodec_encode_audio failed" );
         }
+
+        free( zeros );
+        hb_avcodec_close( c );
+        av_free( c );
     }
+    else
+    {
+        /* Initialize libsamplerate */
+        int error;
+        sync->state = src_new( SRC_SINC_MEDIUM_QUALITY, 
+            HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(
+                w->audio->config.out.mixdown), &error );
+        sync->data.end_of_input = 0;
+    }
+    hb_list_add( job->list_work, w );
 }
 
-static void OutputAudioFrame( hb_job_t *job, hb_audio_t *audio, hb_buffer_t *buf,
-                              hb_sync_audio_t *sync, hb_fifo_t *fifo, int i )
+static hb_buffer_t * OutputAudioFrame( hb_audio_t *audio, hb_buffer_t *buf,
+                                       hb_sync_audio_t *sync )
 {
-    int64_t start = sync->next_start;
-    int64_t duration = buf->stop - buf->start;
-
-    sync->next_pts += duration;
+    int64_t start = (int64_t)sync->next_start;
+    double duration = buf->stop - buf->start;
 
     if( audio->config.in.samplerate == audio->config.out.samplerate ||
-        audio->config.out.codec == HB_ACODEC_AC3 ||
-        audio->config.out.codec == HB_ACODEC_DCA )
+        audio->config.out.codec == HB_ACODEC_AC3_PASS ||
+        audio->config.out.codec == HB_ACODEC_DCA_PASS )
     {
         /*
          * If we don't have to do sample rate conversion or this audio is 
@@ -788,148 +1236,25 @@ static void OutputAudioFrame( hb_job_t *job, hb_audio_t *audio, hb_buffer_t *buf
         if( src_process( sync->state, &sync->data ) )
         {
             /* XXX If this happens, we're screwed */
-            hb_log( "sync: audio %d src_process failed", i );
+            hb_log( "sync: audio %d src_process failed", audio->id );
         }
         hb_buffer_close( &buf_raw );
 
         buf->size = sync->data.output_frames_gen * channel_count;
-        duration = ( sync->data.output_frames_gen * 90000 ) /
+        duration = (double)( sync->data.output_frames_gen * 90000 ) /
                    audio->config.out.samplerate;
     }
     buf->frametype = HB_FRAME_AUDIO;
     buf->start = start;
-    buf->stop  = start + duration;
-    sync->next_start = start + duration;
-    hb_fifo_push( fifo, buf );
-}
-
-/***********************************************************************
- * SyncAudio
- ***********************************************************************
- *
- **********************************************************************/
-static void SyncAudio( hb_work_object_t * w, int i )
-{
-    hb_work_private_t * pv = w->private_data;
-    hb_job_t        * job = pv->job;
-    hb_sync_audio_t * sync = &pv->sync_audio[i];
-    hb_audio_t      * audio = sync->audio;
-    hb_buffer_t     * buf;
-    hb_fifo_t       * fifo;
-    int64_t start;
-
-    if( audio->config.out.codec == HB_ACODEC_AC3 ||
-        audio->config.out.codec == HB_ACODEC_DCA )
-    {
-        fifo = audio->priv.fifo_out;
-    }
-    else
-    {
-        fifo = audio->priv.fifo_sync;
-    }
-
-    while( !hb_fifo_is_full( fifo ) && ( buf = hb_fifo_see( audio->priv.fifo_raw ) ) )
-    {
-        start = buf->start - pv->audio_passthru_slip;
-        /* if the next buffer is an eof send it downstream */
-        if ( buf->size <= 0 )
-        {
-            buf = hb_fifo_get( audio->priv.fifo_raw );
-            hb_fifo_push( fifo, buf );
-            pv->busy &=~ (1 << (i + 1) );
-            return;
-        }
-        if( job->frame_to_stop && pv->count_frames >= job->frame_to_stop )
-        {
-            hb_fifo_push( fifo, hb_buffer_init(0) );
-            pv->busy &=~ (1 << (i + 1) );
-            return;
-        }
-        if ( (int64_t)( start - sync->next_pts ) < 0 )
-        {
-            // audio time went backwards.
-            // If our output clock is more than a half frame ahead of the
-            // input clock drop this frame to move closer to sync.
-            // Otherwise drop frames until the input clock matches the output clock.
-            if ( sync->first_drop || sync->next_start - start > 90*15 )
-            {
-                // Discard data that's in the past.
-                if ( sync->first_drop == 0 )
-                {
-                    sync->first_drop = sync->next_pts;
-                }
-                ++sync->drop_count;
-                buf = hb_fifo_get( audio->priv.fifo_raw );
-                hb_buffer_close( &buf );
-                continue;
-            }
-            sync->next_pts = start;
-        }
-        if ( sync->first_drop )
-        {
-            // we were dropping old data but input buf time is now current
-            hb_log( "sync: audio %d time went backwards %d ms, dropped %d frames "
-                    "(next %"PRId64", current %"PRId64")", i,
-                    (int)( sync->next_pts - sync->first_drop ) / 90,
-                    sync->drop_count, sync->first_drop, sync->next_pts );
-            sync->first_drop = 0;
-            sync->drop_count = 0;
-            sync->next_pts = start;
-        }
-        if ( start - sync->next_pts >= (90 * 70) )
-        {
-            if ( start - sync->next_pts > (90000LL * 60) )
-            {
-                // there's a gap of more than a minute between the last
-                // frame and this. assume we got a corrupted timestamp
-                // and just drop the next buf.
-                hb_log( "sync: %d minute time gap in audio %d - dropping buf"
-                        "  start %"PRId64", next %"PRId64,
-                        (int)((start - sync->next_pts) / (90000*60)),
-                        i, start, sync->next_pts );
-                buf = hb_fifo_get( audio->priv.fifo_raw );
-                hb_buffer_close( &buf );
-                continue;
-            }
-            /*
-             * there's a gap of at least 70ms between the last
-             * frame we processed & the next. Fill it with silence.
-             * Or in the case of DCA, skip some frames from the
-             * other streams.
-             */
-            if( sync->audio->config.out.codec == HB_ACODEC_DCA )
-            {
-                hb_log( "sync: audio gap %d ms. Skipping frames. Audio %d"
-                        "  start %"PRId64", next %"PRId64,
-                        (int)((start - sync->next_pts) / 90),
-                        i, start, sync->next_pts );
-                pv->audio_passthru_slip += (start - sync->next_pts);
-                pv->video_pts_slip += (start - sync->next_pts);
-                return;
-            }
-            hb_log( "sync: adding %d ms of silence to audio %d"
-                    "  start %"PRId64", next %"PRId64,
-                    (int)((start - sync->next_pts) / 90),
-                    i, start, sync->next_pts );
-            InsertSilence( w, i, start - sync->next_pts );
-            return;
-        }
-
-        /*
-         * When we get here we've taken care of all the dups and gaps in the
-         * audio stream and are ready to inject the next input frame into
-         * the output stream.
-         */
-        buf = hb_fifo_get( audio->priv.fifo_raw );
-        OutputAudioFrame( job, audio, buf, sync, fifo, i );
-    }
+    sync->next_start += duration;
+    buf->stop  = (int64_t)sync->next_start;
+    return buf;
 }
 
-static void InsertSilence( hb_work_object_t * w, int i, int64_t duration )
+static void InsertSilence( hb_work_object_t * w, int64_t duration )
 {
     hb_work_private_t * pv = w->private_data;
-    hb_job_t        *job = pv->job;
-    hb_sync_audio_t *sync = &pv->sync_audio[i];
+    hb_sync_audio_t *sync = &pv->type.audio;
     hb_buffer_t     *buf;
     hb_fifo_t       *fifo;
 
@@ -938,72 +1263,74 @@ static void InsertSilence( hb_work_object_t * w, int i, int64_t duration )
     // of the AC3 frame duration we will truncate or round up depending on
     // which minimizes the timing error.
     const int frame_dur = ( 90000 * AC3_SAMPLES_PER_FRAME ) /
-                          sync->audio->config.in.samplerate;
+                          w->audio->config.in.samplerate;
     int frame_count = ( duration + (frame_dur >> 1) ) / frame_dur;
 
     while ( --frame_count >= 0 )
     {
-        if( sync->audio->config.out.codec == HB_ACODEC_AC3 )
+        if( w->audio->config.out.codec == HB_ACODEC_AC3_PASS )
         {
             buf        = hb_buffer_init( sync->ac3_size );
-            buf->start = sync->next_pts;
+            buf->start = sync->next_start;
             buf->stop  = buf->start + frame_dur;
             memcpy( buf->data, sync->ac3_buf, buf->size );
-            fifo = sync->audio->priv.fifo_out;
+            fifo = w->audio->priv.fifo_out;
         }
         else
         {
             buf = hb_buffer_init( AC3_SAMPLES_PER_FRAME * sizeof( float ) *
                                      HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(
-                                         sync->audio->config.out.mixdown) );
-            buf->start = sync->next_pts;
+                                         w->audio->config.out.mixdown) );
+            buf->start = sync->next_start;
             buf->stop  = buf->start + frame_dur;
             memset( buf->data, 0, buf->size );
-            fifo = sync->audio->priv.fifo_sync;
+            fifo = w->audio->priv.fifo_sync;
         }
-        OutputAudioFrame( job, sync->audio, buf, sync, fifo, i );
+        buf = OutputAudioFrame( w->audio, buf, sync );
+        hb_fifo_push( fifo, buf );
     }
 }
 
 static void UpdateState( hb_work_object_t * w )
 {
     hb_work_private_t * pv = w->private_data;
+    hb_sync_video_t   * sync = &pv->type.video;
     hb_state_t state;
 
-    if( !pv->count_frames )
+    if( !pv->common->count_frames )
     {
-        pv->st_first = hb_get_date();
+        sync->st_first = hb_get_date();
         pv->job->st_pause_date = -1;
         pv->job->st_paused = 0;
     }
-    pv->count_frames++;
+    pv->common->count_frames++;
 
-    if( hb_get_date() > pv->st_dates[3] + 1000 )
+    if( hb_get_date() > sync->st_dates[3] + 1000 )
     {
-        memmove( &pv->st_dates[0], &pv->st_dates[1],
+        memmove( &sync->st_dates[0], &sync->st_dates[1],
                  3 * sizeof( uint64_t ) );
-        memmove( &pv->st_counts[0], &pv->st_counts[1],
+        memmove( &sync->st_counts[0], &sync->st_counts[1],
                  3 * sizeof( uint64_t ) );
-        pv->st_dates[3]  = hb_get_date();
-        pv->st_counts[3] = pv->count_frames;
+        sync->st_dates[3]  = hb_get_date();
+        sync->st_counts[3] = pv->common->count_frames;
     }
 
 #define p state.param.working
     state.state = HB_STATE_WORKING;
-    p.progress  = (float) pv->count_frames / (float) pv->count_frames_max;
+    p.progress  = (float) pv->common->count_frames / (float) sync->count_frames_max;
     if( p.progress > 1.0 )
     {
         p.progress = 1.0;
     }
     p.rate_cur   = 1000.0 *
-        (float) ( pv->st_counts[3] - pv->st_counts[0] ) /
-        (float) ( pv->st_dates[3] - pv->st_dates[0] );
-    if( hb_get_date() > pv->st_first + 4000 )
+        (float) ( sync->st_counts[3] - sync->st_counts[0] ) /
+        (float) ( sync->st_dates[3] - sync->st_dates[0] );
+    if( hb_get_date() > sync->st_first + 4000 )
     {
         int eta;
-        p.rate_avg = 1000.0 * (float) pv->st_counts[3] /
-            (float) ( pv->st_dates[3] - pv->st_first - pv->job->st_paused);
-        eta = (float) ( pv->count_frames_max - pv->st_counts[3] ) /
+        p.rate_avg = 1000.0 * (float) sync->st_counts[3] /
+            (float) ( sync->st_dates[3] - sync->st_first - pv->job->st_paused);
+        eta = (float) ( sync->count_frames_max - sync->st_counts[3] ) /
             p.rate_avg;
         p.hours   = eta / 3600;
         p.minutes = ( eta % 3600 ) / 60;
@@ -1020,3 +1347,92 @@ static void UpdateState( hb_work_object_t * w )
 
     hb_set_state( pv->job->h, &state );
 }
+
+static void UpdateSearchState( hb_work_object_t * w, int64_t start )
+{
+    hb_work_private_t * pv = w->private_data;
+    hb_sync_video_t   * sync = &pv->type.video;
+    hb_state_t state;
+    uint64_t now;
+    double avg;
+
+    now = hb_get_date();
+    if( !pv->common->count_frames )
+    {
+        sync->st_first = now;
+        pv->job->st_pause_date = -1;
+        pv->job->st_paused = 0;
+    }
+    pv->common->count_frames++;
+
+#define p state.param.working
+    state.state = HB_STATE_SEARCHING;
+    if ( pv->job->frame_to_start )
+        p.progress  = (float) pv->common->count_frames / 
+                      (float) pv->job->frame_to_start;
+    else if ( pv->job->pts_to_start )
+        p.progress  = (float) start / (float) pv->job->pts_to_start;
+    else
+        p.progress = 0;
+    if( p.progress > 1.0 )
+    {
+        p.progress = 1.0;
+    }
+    if (now > sync->st_first)
+    {
+        int eta;
+
+        if ( pv->job->frame_to_start )
+        {
+            avg = 1000.0 * (double)pv->common->count_frames / (now - sync->st_first);
+            eta = ( pv->job->frame_to_start - pv->common->count_frames ) / avg;
+        }
+        else if ( pv->job->pts_to_start )
+        {
+            avg = 1000.0 * (double)start / (now - sync->st_first);
+            eta = ( pv->job->pts_to_start - start ) / avg;
+        }
+        p.hours   = eta / 3600;
+        p.minutes = ( eta % 3600 ) / 60;
+        p.seconds = eta % 60;
+    }
+    else
+    {
+        p.rate_avg = 0.0;
+        p.hours    = -1;
+        p.minutes  = -1;
+        p.seconds  = -1;
+    }
+#undef p
+
+    hb_set_state( pv->job->h, &state );
+}
+
+static void getPtsOffset( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+    int           i ;
+    int64_t       first_pts = INT64_MAX;
+
+    for( i = 0; i < pv->common->pts_count; i++ )
+    {
+        if ( pv->common->first_pts[i] < first_pts )
+            first_pts = pv->common->first_pts[i];
+    }
+    pv->common->video_pts_slip = pv->common->audio_pts_slip = pv->common->pts_offset = first_pts;
+    return;
+}
+
+static int checkPtsOffset( hb_work_object_t * w )
+{
+    hb_work_private_t * pv = w->private_data;
+    int           i ;
+
+    for( i = 0; i < pv->common->pts_count; i++ )
+    {
+        if ( pv->common->first_pts[i] == INT64_MAX )
+            return 0;
+    }
+    getPtsOffset( w );
+    return 1;
+}
index 2209b15..5944286 100644 (file)
@@ -23,7 +23,10 @@ static void work_func();
 static void do_job( hb_job_t *, int cpu_count );
 static void work_loop( void * );
 
-#define FIFO_CPU_MULT 8
+#define FIFO_LARGE 32
+#define FIFO_LARGE_WAKE 16
+#define FIFO_SMALL 16
+#define FIFO_SMALL_WAKE 15
 
 /**
  * Allocates work object and launches work thread with work_func.
@@ -46,6 +49,24 @@ hb_thread_t * hb_work_init( hb_list_t * jobs, int cpu_count,
     return hb_thread_init( "work", work_func, work, HB_LOW_PRIORITY );
 }
 
+static void InitWorkState( hb_handle_t * h )
+{
+    hb_state_t state;
+
+    state.state = HB_STATE_WORKING;
+#define p state.param.working
+    p.progress  = 0.0;
+    p.rate_cur  = 0.0;
+    p.rate_avg  = 0.0;
+    p.hours     = -1;
+    p.minutes   = -1;
+    p.seconds   = -1; 
+#undef p
+
+    hb_set_state( h, &state );
+
+}
+
 /**
  * Iterates through job list and calls do_job for each job.
  * @param _work Handle work object.
@@ -62,6 +83,7 @@ static void work_func( void * _work )
         hb_list_rem( work->jobs, job );
         job->die = work->die;
         *(work->current_job) = job;
+        InitWorkState( job->h );
         do_job( job, work->cpu_count );
         *(work->current_job) = NULL;
     }
@@ -106,7 +128,8 @@ hb_work_object_t * hb_codec_encoder( int codec )
         case HB_ACODEC_FAAC:   return hb_get_work( WORK_ENCFAAC );
         case HB_ACODEC_LAME:   return hb_get_work( WORK_ENCLAME );
         case HB_ACODEC_VORBIS: return hb_get_work( WORK_ENCVORBIS );
-        case HB_ACODEC_CA_AAC:  return hb_get_work( WORK_ENC_CA_AAC );
+        case HB_ACODEC_CA_AAC: return hb_get_work( WORK_ENC_CA_AAC );
+        case HB_ACODEC_AC3:    return hb_get_work( WORK_ENCAC3 );
     }
     return NULL;
 }
@@ -125,7 +148,7 @@ void hb_display_job_info( hb_job_t * job )
     hb_log("job configuration:");
     hb_log( " * source");
     
-    hb_log( "   + %s", title->dvd );
+    hb_log( "   + %s", title->path );
 
     hb_log( "   + title %d, chapter(s) %d to %d", title->index,
             job->chapter_start, job->chapter_end );
@@ -160,17 +183,9 @@ void hb_display_job_info( hb_job_t * job )
                 hb_log( "     + custom color matrix: %s", job->color_matrix == 1 ? "ITU Bt.601 (SD)" : "ITU Bt.709 (HD)");
             break;
 
-        case HB_MUX_AVI:
-            hb_log("   + container: AVI");
-            break;
-
         case HB_MUX_MKV:
             hb_log("   + container: Matroska (.mkv)");
             break;
-
-        case HB_MUX_OGM:
-            hb_log("   + conttainer: Ogg Media (.ogm)");
-            break;
     }
 
     if( job->chapter_markers )
@@ -209,13 +224,9 @@ void hb_display_job_info( hb_job_t * job )
         {
             hb_log( "     + keeping source display aspect ratio"); 
         }
-        if( job->anamorphic.modulus != 16 )
-        {
-            hb_log( "     + modulus: %i", job->anamorphic.modulus ); 
-        }
-        hb_log( "     + storage dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d",
+        hb_log( "     + storage dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d, mod %i",
                     title->width, title->height, job->width, job->height,
-                    job->crop[0], job->crop[1], job->crop[2], job->crop[3] );
+                    job->crop[0], job->crop[1], job->crop[2], job->crop[3], job->modulus );
         if( job->anamorphic.itu_par )
         {
             hb_log( "     + using ITU pixel aspect ratio values"); 
@@ -226,9 +237,9 @@ void hb_display_job_info( hb_job_t * job )
     }
     else
     {
-        hb_log( "   + dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d",
+        hb_log( "   + dimensions: %d * %d -> %d * %d, crop %d/%d/%d/%d, mod %i",
                 title->width, title->height, job->width, job->height,
-                job->crop[0], job->crop[1], job->crop[2], job->crop[3] );
+                job->crop[0], job->crop[1], job->crop[2], job->crop[3], job->modulus );
     }
 
     if ( job->grayscale )
@@ -287,12 +298,24 @@ void hb_display_job_info( hb_job_t * job )
 
         if( subtitle )
         {
-            hb_log( " * subtitle track %i, %s (id %x) %s [%s] -> %s ", subtitle->track, subtitle->lang, subtitle->id,
-                    subtitle->format == PICTURESUB ? "Picture" : "Text",
-                    subtitle->source == VOBSUB ? "VOBSUB" : 
-                    ((subtitle->source == CC608SUB ||
-                      subtitle->source == CC708SUB) ? "CC" : "SRT"),
-                    subtitle->config.dest == RENDERSUB ? "Render/Burn in" : "Pass-Through");
+            if( subtitle->source == SRTSUB )
+            {
+                /* For SRT, print offset and charset too */
+                hb_log( " * subtitle track %i, %s (id %x) %s [%s] -> %s%s, offset: %"PRId64", charset: %s",
+                        subtitle->track, subtitle->lang, subtitle->id, "Text", "SRT", "Pass-Through",
+                        subtitle->config.default_track ? ", Default" : "",
+                        subtitle->config.offset, subtitle->config.src_codeset );
+            }
+            else
+            {
+                hb_log( " * subtitle track %i, %s (id %x) %s [%s] -> %s%s%s", subtitle->track, subtitle->lang, subtitle->id,
+                        subtitle->format == PICTURESUB ? "Picture" : "Text",
+                        hb_subsource_name( subtitle->source ),
+                        job->indepth_scan ? "Foreign Audio Search" :
+                        subtitle->config.dest == RENDERSUB ? "Render/Burn in" : "Pass-Through",
+                        subtitle->config.force ? ", Forced Only" : "",
+                        subtitle->config.default_track ? ", Default" : "" );
+            }
         }
     }
 
@@ -314,7 +337,7 @@ void hb_display_job_info( hb_job_t * job )
                 hb_log( "     + bitrate: %d kbps, samplerate: %d Hz", audio->config.in.bitrate / 1000, audio->config.in.samplerate );
             }
 
-            if( (audio->config.out.codec != HB_ACODEC_AC3) && (audio->config.out.codec != HB_ACODEC_DCA) )
+            if( (audio->config.out.codec != HB_ACODEC_AC3_PASS) && (audio->config.out.codec != HB_ACODEC_DCA_PASS) )
             {
                 for (j = 0; j < hb_audio_mixdowns_count; j++)
                 {
@@ -325,22 +348,24 @@ void hb_display_job_info( hb_job_t * job )
                 }
             }
 
-            if ( audio->config.out.dynamic_range_compression && (audio->config.out.codec != HB_ACODEC_AC3) && (audio->config.out.codec != HB_ACODEC_DCA))
+            if ( audio->config.out.dynamic_range_compression && (audio->config.out.codec != HB_ACODEC_AC3_PASS) && (audio->config.out.codec != HB_ACODEC_DCA_PASS))
             {
                 hb_log("   + dynamic range compression: %f", audio->config.out.dynamic_range_compression);
             }
             
-            if( (audio->config.out.codec == HB_ACODEC_AC3) || (audio->config.out.codec == HB_ACODEC_DCA) )
+            if( (audio->config.out.codec == HB_ACODEC_AC3_PASS) || (audio->config.out.codec == HB_ACODEC_DCA_PASS) )
             {
-                hb_log( "   + %s passthrough", (audio->config.out.codec == HB_ACODEC_AC3) ?
+                hb_log( "   + %s passthrough", (audio->config.out.codec == HB_ACODEC_AC3_PASS) ?
                     "AC3" : "DCA" );
             }
             else
             {
-                hb_log( "   + encoder: %s", ( audio->config.out.codec == HB_ACODEC_FAAC ) ?
-                    "faac" : ( ( audio->config.out.codec == HB_ACODEC_LAME ) ?
-                    "lame" : ( ( audio->config.out.codec == HB_ACODEC_CA_AAC ) ?
-                              "ca_aac" : "vorbis"  ) ) );
+                hb_log( "   + encoder: %s", 
+                    ( audio->config.out.codec == HB_ACODEC_FAAC ) ?  "faac" : 
+                    ( ( audio->config.out.codec == HB_ACODEC_LAME ) ?  "lame" : 
+                    ( ( audio->config.out.codec == HB_ACODEC_CA_AAC ) ?  "ca_aac" : 
+                    ( ( audio->config.out.codec == HB_ACODEC_AC3 ) ?  "ffac3" : 
+                    "vorbis"  ) ) ) );
                 hb_log( "     + bitrate: %d kbps, samplerate: %d Hz", audio->config.out.bitrate, audio->config.out.samplerate );            
             }
         }
@@ -366,7 +391,6 @@ void correct_framerate( hb_job_t * job )
     job->vrate = job->vrate_base * ( (double)real_frames * 90000 / interjob->total_time );
 }
 
-
 /**
  * Job initialization rountine.
  * Initializes fifos.
@@ -383,10 +407,13 @@ static void do_job( hb_job_t * job, int cpu_count )
     hb_title_t    * title;
     int             i, j;
     hb_work_object_t * w;
+    hb_work_object_t * sync;
+    hb_work_object_t * muxer;
     hb_interjob_t * interjob;
 
     hb_audio_t   * audio;
     hb_subtitle_t * subtitle;
+    hb_attachment_t * attachment;
     unsigned int subtitle_highest = 0;
     unsigned int subtitle_highest_id = 0;
     unsigned int subtitle_lowest = -1;
@@ -422,6 +449,7 @@ static void do_job( hb_job_t * job, int cpu_count )
                 job->anamorphic.par_width >>= 1;
                 job->anamorphic.par_height >>= 1;
             }
+            hb_reduce( &job->anamorphic.par_width, &job->anamorphic.par_height, job->anamorphic.par_width, job->anamorphic.par_height );
         }
     }
     
@@ -443,35 +471,204 @@ static void do_job( hb_job_t * job, int cpu_count )
         hb_log( "New dimensions %i * %i", job->width, job->height );
     }
 
-    if( job->mux & HB_MUX_AVI )
-    {
-        // The concept of variable frame rate video was a bit too advanced
-        // for Microsoft so AVI doesn't support it. Since almost all dvd
-        // video is VFR we have to convert it to constant frame rate to
-        // put it in an AVI container. So duplicate, drop and
-        // otherwise trash video frames to appease the gods of Redmond.
-        job->cfr = 1;
-    }
-
     if ( job->cfr == 0 )
     {
         /* Ensure we're using "Same as source" FPS */
         job->vrate_base = title->rate_base;
     }
 
-    job->fifo_mpeg2  = hb_fifo_init( 256 );
-    job->fifo_raw    = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-    job->fifo_sync   = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-    job->fifo_render = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-    job->fifo_mpeg4  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+    job->fifo_mpeg2  = hb_fifo_init( FIFO_LARGE, FIFO_LARGE_WAKE );
+    job->fifo_raw    = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+    job->fifo_sync   = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+    job->fifo_render = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+    job->fifo_mpeg4  = hb_fifo_init( FIFO_LARGE, FIFO_LARGE_WAKE );
+
+    /*
+     * Audio fifos must be initialized before sync
+     */
+    if( !job->indepth_scan )
+    {
+    // if we are doing passthru, and the input codec is not the same as the output
+    // codec, then remove this audio from the job. If we're not doing passthru and
+    // the input codec is the 'internal' ffmpeg codec, make sure that only one
+    // audio references that audio stream since the codec context is specific to
+    // the audio id & multiple copies of the same stream will garble the audio
+    // or cause aborts.
+    uint8_t aud_id_uses[MAX_STREAMS];
+    memset( aud_id_uses, 0, sizeof(aud_id_uses) );
+    for( i = 0; i < hb_list_count( title->list_audio ); )
+    {
+        audio = hb_list_item( title->list_audio, i );
+        if( ( ( audio->config.out.codec == HB_ACODEC_AC3_PASS ) && ( audio->config.in.codec != HB_ACODEC_AC3 ) ) ||
+            ( ( audio->config.out.codec == HB_ACODEC_DCA_PASS ) && ( audio->config.in.codec != HB_ACODEC_DCA ) ) )
+        {
+            hb_log( "Passthru requested and input codec is not the same as output codec for track %d",
+                    audio->config.out.track );
+            hb_list_rem( title->list_audio, audio );
+            free( audio );
+            continue;
+        }
+        if( audio->config.out.codec != HB_ACODEC_AC3_PASS && 
+            audio->config.out.codec != HB_ACODEC_DCA_PASS &&
+            audio->config.out.samplerate > 48000 )
+        {
+            hb_log( "Sample rate %d not supported.  Down-sampling to 48kHz.",
+                    audio->config.out.samplerate );
+            audio->config.out.samplerate = 48000;
+        }
+        if( audio->config.out.codec == HB_ACODEC_AC3 && 
+            audio->config.out.bitrate > 640 )
+        {
+            hb_log( "Bitrate %d not supported.  Reducing to 640Kbps.",
+                    audio->config.out.bitrate );
+            audio->config.out.bitrate = 640;
+        }
+        if ( audio->config.in.codec == HB_ACODEC_FFMPEG )
+        {
+            if ( aud_id_uses[audio->id] )
+            {
+                hb_log( "Multiple decodes of audio id %d, removing track %d",
+                        audio->id, audio->config.out.track );
+                hb_list_rem( title->list_audio, audio );
+                free( audio );
+                continue;
+            }
+            ++aud_id_uses[audio->id];
+        }
+        /* Adjust output track number, in case we removed one.
+         * Output tracks sadly still need to be in sequential order.
+         */
+        audio->config.out.track = i++;
+    }
+
+    int requested_mixdown = 0;
+    int requested_mixdown_index = 0;
+    int best_mixdown = 0;
+    int requested_bitrate = 0;
+    int best_bitrate = 0;
+
+    for( i = 0; i < hb_list_count( title->list_audio ); i++ )
+    {
+        audio = hb_list_item( title->list_audio, i );
+
+        best_mixdown = hb_get_best_mixdown( audio->config.out.codec,
+                                            audio->config.in.channel_layout, 0 );
+
+        /* sense-check the current mixdown options */
+
+        /* sense-check the requested mixdown */
+        if( audio->config.out.mixdown == 0 &&
+            !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+        {
+            /*
+             * Mixdown wasn't specified and this is not pass-through,
+             * set a default mixdown
+             */
+            audio->config.out.mixdown = hb_get_default_mixdown( audio->config.out.codec,
+                                                                audio->config.in.channel_layout );
+            for (j = 0; j < hb_audio_mixdowns_count; j++)
+            {
+                if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown)
+                {
+                    hb_log("work: mixdown not specified, track %i setting mixdown %s", i, hb_audio_mixdowns[j].human_readable_name);
+                    break;
+                }
+            }
+        }
+
+        /* log the requested mixdown */
+        for (j = 0; j < hb_audio_mixdowns_count; j++) {
+            if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
+                requested_mixdown = audio->config.out.mixdown;
+                requested_mixdown_index = j;
+                break;
+            }
+        }
+
+        if ( !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+        {
+            if ( audio->config.out.mixdown > best_mixdown )
+            {
+                audio->config.out.mixdown = best_mixdown;
+            }
+        }
+
+        if ( audio->config.out.mixdown != requested_mixdown )
+        {
+            /* log the output mixdown */
+            for (j = 0; j < hb_audio_mixdowns_count; j++)
+            {
+                if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown)
+                {
+                    hb_log("work: sanitizing track %i mixdown %s to %s", i, hb_audio_mixdowns[requested_mixdown_index].human_readable_name, hb_audio_mixdowns[j].human_readable_name);
+                    break;
+                }
+            }
+        }
+        
+        /* sense-check the current bitrates */
+        
+        /* sense-check the requested bitrate */
+        if( audio->config.out.bitrate == 0 &&
+            !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+        {
+            /*
+             * Bitrate wasn't specified and this is not pass-through,
+             * set a default bitrate
+             */
+            audio->config.out.bitrate = hb_get_default_audio_bitrate( audio->config.out.codec,
+                                                                      audio->config.out.samplerate,
+                                                                      audio->config.out.mixdown );
+            
+            hb_log( "work: bitrate not specified, track %d setting bitrate %d",
+                    i, audio->config.out.bitrate );
+        }
+        
+        /* log the requested bitrate */
+        requested_bitrate = audio->config.out.bitrate;
+        best_bitrate = hb_get_best_audio_bitrate( audio->config.out.codec, 
+                                                  audio->config.out.bitrate,
+                                                  audio->config.out.samplerate,
+                                                  audio->config.out.mixdown );
+        
+        if ( !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+        {
+            if ( audio->config.out.bitrate != best_bitrate )
+            {
+                audio->config.out.bitrate = best_bitrate;
+            }
+        }
+        
+        if ( audio->config.out.bitrate != requested_bitrate )
+        {
+            /* log the output bitrate */
+            hb_log( "work: sanitizing track %d audio bitrate %d to %d", 
+                    i, requested_bitrate, audio->config.out.bitrate);
+        }
+
+        if (audio->config.out.codec == HB_ACODEC_VORBIS)
+            audio->priv.config.vorbis.language = audio->config.lang.simple;
 
+        /* set up the audio work structures */
+        audio->priv.fifo_in   = hb_fifo_init( FIFO_LARGE, FIFO_LARGE_WAKE );
+        audio->priv.fifo_raw  = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+        audio->priv.fifo_sync = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+        audio->priv.fifo_out  = hb_fifo_init( FIFO_LARGE, FIFO_LARGE_WAKE );
+    }
+
+    }
     /* Synchronization */
-    hb_list_add( job->list_work, ( w = hb_get_work( WORK_SYNC ) ) );
-    w->fifo_in  = NULL;
-    w->fifo_out = NULL;
+    sync = hb_sync_init( job );
 
     /* Video decoder */
     int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2;
+#if defined(USE_FF_MPEG2)
+    if (vcodec == WORK_DECMPEG2)
+    {
+        vcodec = WORK_DECAVCODECV;
+        title->video_codec_param = CODEC_ID_MPEG2VIDEO;
+    }
+#endif
     hb_list_add( job->list_work, ( w = hb_get_work( vcodec ) ) );
     w->codec_param = title->video_codec_param;
     w->fifo_in  = job->fifo_mpeg2;
@@ -480,7 +677,10 @@ static void do_job( hb_job_t * job, int cpu_count )
     /* Video renderer */
     hb_list_add( job->list_work, ( w = hb_get_work( WORK_RENDER ) ) );
     w->fifo_in  = job->fifo_sync;
-    w->fifo_out = job->fifo_render;
+    if( !job->indepth_scan )
+        w->fifo_out = job->fifo_render;
+    else
+        w->fifo_out = NULL;
 
     if( !job->indepth_scan )
     {
@@ -507,6 +707,7 @@ static void do_job( hb_job_t * job, int cpu_count )
 
     /*
      * Look for the scanned subtitle in the existing subtitle list
+     * select_subtitle implies that we did a scan.
      */
     if ( !job->indepth_scan && interjob->select_subtitle &&
          ( job->pass == 0 || job->pass == 2 ) )
@@ -514,8 +715,6 @@ static void do_job( hb_job_t * job, int cpu_count )
         /*
          * Disable forced subtitles if we didn't find any in the scan
          * so that we display normal subtitles instead.
-         *
-         * select_subtitle implies that we did a scan.
          */
         if( interjob->select_subtitle->config.force && 
             interjob->select_subtitle->forced_hits == 0 )
@@ -529,16 +728,19 @@ static void do_job( hb_job_t * job, int cpu_count )
             if( subtitle )
             {
                 /*
-                * Disable forced subtitles if we didn't find any in the scan
-                * so that we display normal subtitles instead.
-                *
-                * select_subtitle implies that we did a scan.
+                * Remove the scanned subtitle from the subtitle list if
+                * it would result in an identical duplicate subtitle track
+                * or an emty track (forced and no forced hits).
                 */
-                if( interjob->select_subtitle->id == subtitle->id )
+                if( ( interjob->select_subtitle->id == subtitle->id ) &&
+                    ( ( interjob->select_subtitle->forced_hits == 0 &&
+                        subtitle->config.force ) ||
+                    ( subtitle->config.force == interjob->select_subtitle->config.force ) ) )
                 {
                     *subtitle = *(interjob->select_subtitle);
                     free( interjob->select_subtitle );
                     interjob->select_subtitle = NULL;
+                    break;
                 }
             }
         }
@@ -564,10 +766,10 @@ static void do_job( hb_job_t * job, int cpu_count )
 
         if( subtitle )
         {
-            subtitle->fifo_in   = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-            subtitle->fifo_raw  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-            subtitle->fifo_sync = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-            subtitle->fifo_out  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+            subtitle->fifo_in   = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+            subtitle->fifo_raw  = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+            subtitle->fifo_sync = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
+            subtitle->fifo_out  = hb_fifo_init( FIFO_SMALL, FIFO_SMALL_WAKE );
 
             if( (!job->indepth_scan || job->select_subtitle_config.force) && 
                 subtitle->source == VOBSUB ) {
@@ -598,6 +800,31 @@ static void do_job( hb_job_t * job, int cpu_count )
                 w->subtitle = subtitle;
                 hb_list_add( job->list_work, w );
             }
+            
+            if( !job->indepth_scan && subtitle->source == UTF8SUB )
+            {
+                w = hb_get_work( WORK_DECUTF8SUB );
+                w->fifo_in  = subtitle->fifo_in;
+                w->fifo_out = subtitle->fifo_raw;
+                hb_list_add( job->list_work, w );
+            }
+            
+            if( !job->indepth_scan && subtitle->source == TX3GSUB )
+            {
+                w = hb_get_work( WORK_DECTX3GSUB );
+                w->fifo_in  = subtitle->fifo_in;
+                w->fifo_out = subtitle->fifo_raw;
+                hb_list_add( job->list_work, w );
+            }
+            
+            if( !job->indepth_scan && subtitle->source == SSASUB )
+            {
+                w = hb_get_work( WORK_DECSSASUB );
+                w->fifo_in  = subtitle->fifo_in;
+                w->fifo_out = subtitle->fifo_raw;
+                w->subtitle = subtitle;
+                hb_list_add( job->list_work, w );
+            }
 
             if( !job->indepth_scan && 
                 subtitle->format == PICTURESUB
@@ -618,255 +845,57 @@ static void do_job( hb_job_t * job, int cpu_count )
 
     if( !job->indepth_scan )
     {
-    // if we are doing passthru, and the input codec is not the same as the output
-    // codec, then remove this audio from the job. If we're not doing passthru and
-    // the input codec is the 'internal' ffmpeg codec, make sure that only one
-    // audio references that audio stream since the codec context is specific to
-    // the audio id & multiple copies of the same stream will garble the audio
-    // or cause aborts.
-    uint8_t aud_id_uses[MAX_STREAMS];
-    memset( aud_id_uses, 0, sizeof(aud_id_uses) );
-    for( i = 0; i < hb_list_count( title->list_audio ); )
-    {
-        audio = hb_list_item( title->list_audio, i );
-        if( ( ( audio->config.out.codec == HB_ACODEC_AC3 ) && ( audio->config.in.codec != HB_ACODEC_AC3 ) ) ||
-            ( ( audio->config.out.codec == HB_ACODEC_DCA ) && ( audio->config.in.codec != HB_ACODEC_DCA ) ) )
-        {
-            hb_log( "Passthru requested and input codec is not the same as output codec for track %d",
-                    audio->config.out.track );
-            hb_list_rem( title->list_audio, audio );
-            free( audio );
-            continue;
-        }
-        if ( audio->config.in.codec == HB_ACODEC_FFMPEG )
-        {
-            if ( aud_id_uses[audio->id] )
-            {
-                hb_log( "Multiple decodes of audio id %d, removing track %d",
-                        audio->id, audio->config.out.track );
-                hb_list_rem( title->list_audio, audio );
-                free( audio );
-                continue;
-            }
-            ++aud_id_uses[audio->id];
-        }
-        /* Adjust output track number, in case we removed one.
-         * Output tracks sadly still need to be in sequential order.
-         */
-        audio->config.out.track = i++;
-    }
-
-    int requested_mixdown = 0;
-    int requested_mixdown_index = 0;
-
-    for( i = 0; i < hb_list_count( title->list_audio ); i++ )
-    {
-        audio = hb_list_item( title->list_audio, i );
-
-        if( audio->config.out.codec != audio->config.in.codec )
-        {
-            /* sense-check the current mixdown options */
-
-            /* log the requested mixdown */
-            for (j = 0; j < hb_audio_mixdowns_count; j++) {
-                if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
-                    requested_mixdown = audio->config.out.mixdown;
-                    requested_mixdown_index = j;
-                }
-            }
-
-            /* sense-check the requested mixdown */
-
-            if( audio->config.out.mixdown == 0 &&
-                audio->config.out.codec != HB_ACODEC_AC3 && 
-                audio->config.out.codec != HB_ACODEC_DCA )
-            {
-                /*
-                 * Mixdown wasn't specified and this is not pass-through,
-                 * set a default mixdown of stereo.
-                 */
-                audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
-            }
-
-            // Here we try to sanitize the audio input to output mapping.
-            // Constraints are:
-            //   1. only the AC3 & DCA decoder libraries currently support mixdown
-            //   2. the lame encoder library only supports stereo.
-            // So if the encoder is lame we need the output to be stereo (or multichannel
-            // matrixed into stereo like dpl). If the decoder is not AC3 or DCA the
-            // encoder has to handle the input format since we can't do a mixdown.
-#define CAN_MIXDOWN(a) ( a->config.in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA) )
-#define STEREO_ONLY(a) ( a->config.out.codec & HB_ACODEC_LAME )
-
-            switch (audio->config.in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
-            {
-                // stereo input or something not handled below
-                default:
-                case HB_INPUT_CH_LAYOUT_STEREO:
-                    // mono gets mixed up to stereo & more than stereo gets mixed down
-                    if ( STEREO_ONLY( audio ) ||
-                         audio->config.out.mixdown > HB_AMIXDOWN_STEREO)
-                    {
-                        audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
-                    }
-                    break;
-
-                // mono input
-                case HB_INPUT_CH_LAYOUT_MONO:
-                    if ( STEREO_ONLY( audio ) )
-                    {
-                        if ( !CAN_MIXDOWN( audio ) )
-                        {
-                            // XXX we're hosed - we can't mix up & lame can't handle
-                            // the input format. The user shouldn't be able to make
-                            // this choice. It's too late to do anything about it now
-                            // so complain in the log & let things abort in lame.
-                            hb_log( "ERROR - can't use lame mp3 audio output with "
-                                    "mono audio stream %x - output will be messed up",
-                                    audio->id );
-                        }
-                        audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
-                    }
-                    else
-                    {
-                        // everything else passes through
-                        audio->config.out.mixdown = HB_AMIXDOWN_MONO;
-                    }
-                    break;
-
-                // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
-                // the A52 flags don't allow for a way to distinguish between DPL1 and
-                // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
-                case HB_INPUT_CH_LAYOUT_DOLBY:
-                    if ( STEREO_ONLY( audio ) || !CAN_MIXDOWN( audio ) ||
-                         audio->config.out.mixdown > HB_AMIXDOWN_DOLBY )
-                    {
-                        audio->config.out.mixdown = HB_AMIXDOWN_DOLBY;
-                    }
-                    break;
-
-                // 4 channel discrete
-                case HB_INPUT_CH_LAYOUT_2F2R:
-                case HB_INPUT_CH_LAYOUT_3F1R:
-                    if ( CAN_MIXDOWN( audio ) )
-                    {
-                        if ( STEREO_ONLY( audio ) ||
-                             audio->config.out.mixdown > HB_AMIXDOWN_DOLBY )
-                        {
-                            audio->config.out.mixdown = HB_AMIXDOWN_DOLBY;
-                        }
-                    }
-                    else
-                    {
-                        // XXX we can't mixdown & don't have any way to specify
-                        // 4 channel discrete output so we're hosed.
-                        hb_log( "ERROR - can't handle 4 channel discrete audio stream "
-                                "%x - output will be messed up", audio->id );
-                    }
-                    break;
-
-                // 5 or 6 channel discrete
-                case HB_INPUT_CH_LAYOUT_3F2R:
-                    if ( CAN_MIXDOWN( audio ) )
-                    {
-                        if ( STEREO_ONLY( audio ) )
-                        {
-                            if ( audio->config.out.mixdown < HB_AMIXDOWN_STEREO )
-                            {
-                                audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
-                            }
-                            else if ( audio->config.out.mixdown > HB_AMIXDOWN_DOLBYPLII )
-                            {
-                                audio->config.out.mixdown = HB_AMIXDOWN_DOLBYPLII;
-                            }
-                        }
-                        else if ( ! ( audio->config.in.channel_layout &
-                                        HB_INPUT_CH_LAYOUT_HAS_LFE ) )
-                        {
-                            // we don't do 5 channel discrete so mixdown to DPLII
-                            audio->config.out.mixdown = HB_AMIXDOWN_DOLBYPLII;
-                        }
-                    }
-                    else if ( ! ( audio->config.in.channel_layout &
-                                        HB_INPUT_CH_LAYOUT_HAS_LFE ) )
-                    {
-                        // XXX we can't mixdown & don't have any way to specify
-                        // 5 channel discrete output so we're hosed.
-                        hb_log( "ERROR - can't handle 5 channel discrete audio stream "
-                                "%x - output will be messed up", audio->id );
-                    }
-                    else
-                    {
-                        // we can't mixdown so force 6 channel discrete
-                        audio->config.out.mixdown = HB_AMIXDOWN_6CH;
-                    }
-                    break;
-            }
-
-            /* log the output mixdown */
-            for (j = 0; j < hb_audio_mixdowns_count; j++) {
-                if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
-                    if ( audio->config.out.mixdown != requested_mixdown )
-                    {
-                        hb_log("work: sanitizing track %i mixdown %s to %s", i, hb_audio_mixdowns[requested_mixdown_index].human_readable_name, hb_audio_mixdowns[j].human_readable_name);
-                    }
-                    break;
-                }
-            }
-        }
-
-        if (audio->config.out.codec == HB_ACODEC_VORBIS)
-            audio->priv.config.vorbis.language = audio->config.lang.simple;
-
-        /* set up the audio work structures */
-        audio->priv.fifo_in   = hb_fifo_init( 32 );
-        audio->priv.fifo_raw  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-        audio->priv.fifo_sync = hb_fifo_init( 32 );
-        audio->priv.fifo_out  = hb_fifo_init( 8 * FIFO_CPU_MULT * cpu_count );
-
-
-        /*
-         * Audio Decoder Thread
-         */
-        if ( ( w = hb_codec_decoder( audio->config.in.codec ) ) == NULL )
+        for( i = 0; i < hb_list_count( title->list_audio ); i++ )
         {
-            hb_error("Invalid input codec: %d", audio->config.in.codec);
-            *job->die = 1;
-            goto cleanup;
-        }
-        w->fifo_in  = audio->priv.fifo_in;
-        w->fifo_out = audio->priv.fifo_raw;
-        w->config   = &audio->priv.config;
-        w->audio    = audio;
-        w->codec_param = audio->config.in.codec_param;
-
-        hb_list_add( job->list_work, w );
+            audio = hb_list_item( title->list_audio, i );
 
-        /*
-         * Audio Encoder Thread
-         */
-        if( audio->config.out.codec != HB_ACODEC_AC3 &&
-            audio->config.out.codec != HB_ACODEC_DCA )
-        {
             /*
-             * Add the encoder thread if not doing AC-3 pass through
-             */
-            if ( ( w = hb_codec_encoder( audio->config.out.codec ) ) == NULL )
+            * Audio Decoder Thread
+            */
+            if ( ( w = hb_codec_decoder( audio->config.in.codec ) ) == NULL )
             {
-                hb_error("Invalid audio codec: %#x", audio->config.out.codec);
-                w = NULL;
+                hb_error("Invalid input codec: %d", audio->config.in.codec);
                 *job->die = 1;
                 goto cleanup;
             }
-            w->fifo_in  = audio->priv.fifo_sync;
-            w->fifo_out = audio->priv.fifo_out;
+            w->fifo_in  = audio->priv.fifo_in;
+            w->fifo_out = audio->priv.fifo_raw;
             w->config   = &audio->priv.config;
             w->audio    = audio;
+            w->codec_param = audio->config.in.codec_param;
 
             hb_list_add( job->list_work, w );
+
+            /*
+            * Audio Encoder Thread
+            */
+            if( audio->config.out.codec != HB_ACODEC_AC3_PASS &&
+                audio->config.out.codec != HB_ACODEC_DCA_PASS )
+            {
+                /*
+                * Add the encoder thread if not doing AC-3 pass through
+                */
+                if ( ( w = hb_codec_encoder( audio->config.out.codec ) ) == NULL )
+                {
+                    hb_error("Invalid audio codec: %#x", audio->config.out.codec);
+                    w = NULL;
+                    *job->die = 1;
+                    goto cleanup;
+                }
+                w->fifo_in  = audio->priv.fifo_sync;
+                w->fifo_out = audio->priv.fifo_out;
+                w->config   = &audio->priv.config;
+                w->audio    = audio;
+
+                hb_list_add( job->list_work, w );
+            }
         }
     }
-
+    
+    if( job->chapter_markers && job->chapter_start == job->chapter_end )
+    {
+        job->chapter_markers = 0;
+        hb_log("work: only 1 chapter, disabling chapter markers");
     }
 
     /* Display settings */
@@ -879,7 +908,7 @@ static void do_job( hb_job_t * job, int cpu_count )
     job->done = 0;
 
     /* Launch processing threads */
-    for( i = 1; i < hb_list_count( job->list_work ); i++ )
+    for( i = 0; i < hb_list_count( job->list_work ); i++ )
     {
         w = hb_list_item( job->list_work, i );
         w->done = &job->done;
@@ -894,24 +923,70 @@ static void do_job( hb_job_t * job, int cpu_count )
                                     HB_LOW_PRIORITY );
     }
 
-    // The muxer requires track information that's set up by the encoder
-    // init routines so we have to init the muxer last.
-    job->muxer = job->indepth_scan? NULL : hb_muxer_init( job );
+    if ( job->indepth_scan )
+    {
+        muxer = NULL;
+        w = sync;
+        sync->done = &job->done;
+    }
+    else
+    {
+        sync->done = &job->done;
+        sync->thread_sleep_interval = 10;
+        if( sync->init( w, job ) )
+        {
+            hb_error( "Failure to initialise thread '%s'", w->name );
+            *job->die = 1;
+            goto cleanup;
+        }
+        sync->thread = hb_thread_init( sync->name, work_loop, sync,
+                                    HB_LOW_PRIORITY );
+
+        // The muxer requires track information that's set up by the encoder
+        // init routines so we have to init the muxer last.
+        muxer = hb_muxer_init( job );
+        w = muxer;
+    }
 
-    w = hb_list_item( job->list_work, 0 );
-    w->thread_sleep_interval = 10;
-    w->init( w, job );
-    while( !*job->die )
+    while ( !*job->die && !*w->done && w->status != HB_WORK_DONE )
     {
-        if ( ( w->status = w->work( w, NULL, NULL ) ) == HB_WORK_DONE )
+        hb_buffer_t      * buf_in, * buf_out;
+
+        buf_in = hb_fifo_get_wait( w->fifo_in );
+        if ( buf_in == NULL )
+            continue;
+        if ( *job->die )
         {
+            if( buf_in )
+            {
+                hb_buffer_close( &buf_in );
+            }
             break;
         }
-        hb_snooze( w->thread_sleep_interval );
+
+        buf_out = NULL;
+        w->status = w->work( w, &buf_in, &buf_out );
+
+        if( buf_in )
+        {
+            hb_buffer_close( &buf_in );
+        }
+        if ( buf_out && w->fifo_out == NULL )
+        {
+            hb_buffer_close( &buf_out );
+        }
+        if( buf_out )
+        {
+            while ( !*job->die )
+            {
+                if ( hb_fifo_full_wait( w->fifo_out ) )
+                {
+                    hb_fifo_push( w->fifo_out, buf_out );
+                    break;
+                }
+            }
+        }
     }
-    hb_list_rem( job->list_work, w );
-    w->close( w );
-    free( w );
 
     hb_handle_t * h = job->h;
     hb_state_t state;
@@ -919,11 +994,22 @@ static void do_job( hb_job_t * job, int cpu_count )
     
     hb_log("work: average encoding speed for job is %f fps", state.param.working.rate_avg);
 
+    job->done = 1;
+    if( muxer != NULL )
+    {
+        muxer->close( muxer );
+        free( muxer );
+
+        if( sync->thread != NULL )
+        {
+            hb_thread_close( &sync->thread );
+            sync->close( sync );
+        }
+        free( sync );
+    }
+
 cleanup:
     /* Stop the write thread (thread_close will block until the muxer finishes) */
-    if( job->muxer != NULL )
-        hb_thread_close( &job->muxer );
-
     job->done = 1;
 
     /* Close work objects */
@@ -1085,22 +1171,23 @@ static void work_loop( void * _w )
     hb_work_object_t * w = _w;
     hb_buffer_t      * buf_in, * buf_out;
 
-    while( !*w->done )
+    while( !*w->done && w->status != HB_WORK_DONE )
     {
-#if 0
-        hb_lock( job->pause );
-        hb_unlock( job->pause );
-#endif
-        if( hb_fifo_is_full( w->fifo_out ) ||
-//        if( (hb_fifo_percent_full( w->fifo_out ) > 0.8) ||
-            !( buf_in = hb_fifo_get( w->fifo_in ) ) )
-        {
-            hb_snooze( w->thread_sleep_interval );
-//                     w->thread_sleep_interval += 1;
+        buf_in = hb_fifo_get_wait( w->fifo_in );
+        if ( buf_in == NULL )
             continue;
+        if ( *w->done )
+        {
+            if( buf_in )
+            {
+                hb_buffer_close( &buf_in );
+            }
+            break;
         }
-//             w->thread_sleep_interval = MAX(1, (w->thread_sleep_interval - 1));
 
+        // Invalidate buf_out so that if there is no output
+        // we don't try to pass along junk.
+        buf_out = NULL;
         w->status = w->work( w, &buf_in, &buf_out );
 
         // Propagate any chapter breaks for the worker if and only if the
@@ -1111,7 +1198,7 @@ static void work_loop( void * _w )
         if( buf_in && buf_out && buf_in->new_chap && buf_in->start == buf_out->start)
         {
             // restore log below to debug chapter mark propagation problems
-            //hb_log("work %s: Copying Chapter Break @ %lld", w->name, buf_in->start);
+            //hb_log("work %s: Copying Chapter Break @ %"PRId64, w->name, buf_in->start);
             buf_out->new_chap = buf_in->new_chap;
         }
 
@@ -1119,9 +1206,28 @@ static void work_loop( void * _w )
         {
             hb_buffer_close( &buf_in );
         }
+        if ( buf_out && w->fifo_out == NULL )
+        {
+            hb_buffer_close( &buf_out );
+        }
         if( buf_out )
         {
-            hb_fifo_push( w->fifo_out, buf_out );
+            while ( !*w->done )
+            {
+                if ( hb_fifo_full_wait( w->fifo_out ) )
+                {
+                    hb_fifo_push( w->fifo_out, buf_out );
+                    break;
+                }
+            }
         }
     }
+    // Consume data in incoming fifo till job complete so that
+    // residual data does not stall the pipeline
+    while( !*w->done )
+    {
+        buf_in = hb_fifo_get_wait( w->fifo_in );
+        if ( buf_in != NULL )
+            hb_buffer_close( &buf_in );
+    }
 }
index 07a0272..7bdc3c3 100644 (file)
 #import "HBAdvancedController.h"
 #import "HBPreferencesController.h"
 #import "HBPresets.h"
+#import "HBAudioController.h"
+
+extern NSString *HBContainerChangedNotification;
+extern NSString *keyContainerTag;
+extern NSString *HBTitleChangedNotification;
+extern NSString *keyTitleTag;
 
 @class HBOutputPanelController;
 
@@ -77,10 +83,21 @@ BOOL                        fIsDragging;
     IBOutlet NSTextField         * fSrcAngleLabel;
     IBOutlet NSPopUpButton       * fSrcAnglePopUp;
     
+    /* Source start and end points */
+    IBOutlet NSPopUpButton       * fEncodeStartStopPopUp;
+    /* pts based start / stop */
+    IBOutlet NSTextField         * fSrcTimeStartEncodingField;
+    IBOutlet NSTextField         * fSrcTimeEndEncodingField;
+    /* frame based based start / stop */
+    IBOutlet NSTextField         * fSrcFrameStartEncodingField;
+    IBOutlet NSTextField         * fSrcFrameEndEncodingField;
+    
     IBOutlet NSTextField         * fSrcChapterField;
     IBOutlet NSPopUpButton       * fSrcChapterStartPopUp;
     IBOutlet NSTextField         * fSrcChapterToField;
     IBOutlet NSPopUpButton       * fSrcChapterEndPopUp;
+    
+    /* Source duration information */
     IBOutlet NSTextField         * fSrcDuration1Field;
     IBOutlet NSTextField         * fSrcDuration2Field;
        
@@ -100,6 +117,8 @@ BOOL                        fIsDragging;
     IBOutlet NSButton            * fDstMp4iPodFileCheck;
        
     /* Video box */
+    IBOutlet NSButton            * fFrameratePfrCheck;
+    
     IBOutlet NSTextField         * fVidRateField;
     IBOutlet NSPopUpButton       * fVidRatePopUp;
     IBOutlet NSTextField         * fVidEncoderField;
@@ -141,64 +160,15 @@ BOOL                        fIsDragging;
        HBSubtitles                  * fSubtitlesDelegate;
     IBOutlet NSButton            * fBrowseSrtFileButton;
     
-       
-    /* Audio box */
-    /* Track Labels */
-    IBOutlet NSTextField         * fAudSourceLabel;
-    IBOutlet NSTextField         * fAudCodecLabel;
-    IBOutlet NSTextField         * fAudMixdownLabel;
-    IBOutlet NSTextField         * fAudSamplerateLabel;
-    IBOutlet NSTextField         * fAudBitrateLabel;
-    IBOutlet NSTextField         * fAudDrcLabel;
-    
-    IBOutlet NSTextField         * fAudTrack1Label;
-    IBOutlet NSTextField         * fAudTrack2Label;
-    IBOutlet NSTextField         * fAudTrack3Label;
-    IBOutlet NSTextField         * fAudTrack4Label;
-    
-    /* Source Audio PopUps */
-    IBOutlet NSPopUpButton       * fAudLang1PopUp;
-    IBOutlet NSPopUpButton       * fAudLang2PopUp;
-    IBOutlet NSPopUpButton       * fAudLang3PopUp;
-    IBOutlet NSPopUpButton       * fAudLang4PopUp;
-    
-    /* Codec Popups */
-    IBOutlet NSPopUpButton       * fAudTrack1CodecPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack2CodecPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack3CodecPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack4CodecPopUp;
-    
-       /* Mixdown PopUps */
-       IBOutlet NSPopUpButton       * fAudTrack1MixPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack2MixPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack3MixPopUp;
-    IBOutlet NSPopUpButton       * fAudTrack4MixPopUp;
-       
-    /* Samplerate PopUps */
-       IBOutlet NSPopUpButton       * fAudTrack1RatePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack2RatePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack3RatePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack4RatePopUp;
-    
-    /* Bitrate PopUps */
-    IBOutlet NSPopUpButton       * fAudTrack1BitratePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack2BitratePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack3BitratePopUp;
-    IBOutlet NSPopUpButton       * fAudTrack4BitratePopUp;
-    
-    /* Dynamic Range Compression */
-    IBOutlet NSSlider            * fAudTrack1DrcSlider;
-    IBOutlet NSTextField         * fAudTrack1DrcField;
-    IBOutlet NSSlider            * fAudTrack2DrcSlider;
-    IBOutlet NSTextField         * fAudTrack2DrcField;
-    IBOutlet NSSlider            * fAudTrack3DrcSlider;
-    IBOutlet NSTextField         * fAudTrack3DrcField;
-    IBOutlet NSSlider            * fAudTrack4DrcSlider;
-    IBOutlet NSTextField         * fAudTrack4DrcField;
-    
+       /* New Audio box */
+       IBOutlet HBAudioController   * fAudioDelegate;
+           
     /* Chapters box */
     IBOutlet NSButton            * fCreateChapterMarkers;
     IBOutlet NSTableView         * fChapterTable;
+       IBOutlet NSButton            * fLoadChaptersButton;
+       IBOutlet NSButton            * fSaveChaptersButton;
+       IBOutlet NSTableColumn       * fChapterTableNameColumn;
        ChapterTitles                * fChapterTitlesDelegate;
        
     /* Bottom */
@@ -217,6 +187,10 @@ BOOL                        fIsDragging;
        IBOutlet NSTextField         * fPresetNewName;
        IBOutlet NSTextField         * fPresetNewDesc;
        IBOutlet NSPopUpButton       * fPresetNewPicSettingsPopUp;
+    IBOutlet NSTextField         * fPresetNewPicWidth;
+    IBOutlet NSTextField         * fPresetNewPicHeight;
+    IBOutlet NSBox               * fPresetNewPicWidthHeightBox;
+    
     IBOutlet NSButton            * fPresetNewPicFiltersCheck;
     IBOutlet NSButton            * fPresetNewFolderCheck;
        IBOutlet NSTextField         * fPresetSelectedDisplay;
@@ -232,7 +206,7 @@ BOOL                        fIsDragging;
        NSMutableDictionary          *presetUserDefault;// this is 2 in "Default" preset key
     NSMutableDictionary          *presetUserDefaultParent;
     NSMutableDictionary          *presetUserDefaultParentParent;
-    int                        presetCurrentBuiltInCount; // keeps track of the current number of built in presets
+    int                           presetCurrentBuiltInCount; // keeps track of the current number of built in presets
     IBOutlet NSPanel             * fAddPresetPanel;
        
     /* NSOutline View for the presets */
@@ -245,7 +219,8 @@ BOOL                        fIsDragging;
     hb_handle_t                  * fHandle;
     
     /* Queue variables */
-    hb_handle_t              * fQueueEncodeLibhb;           // libhb for HB Encoding
+    int                          hbInstanceNum; //stores the number of HandBrake instances currently running
+    hb_handle_t                  * fQueueEncodeLibhb;           // libhb for HB Encoding
        hb_title_t                   * fTitle;
     hb_title_t                   * fQueueEncodeTitle;
     int                          fEncodingQueueItem;     // corresponds to the index of fJobGroups encoding item
@@ -254,6 +229,9 @@ BOOL                        fIsDragging;
     int                          fCanceledCount;
     int                          fWorkingCount;
     
+    int                          fqueueEditRescanItemNum; // queue array item to be reloaded into the main window
+    int                          pidNum; // The pid number for this instance
+    NSString                     * currentQueueEncodeNameString;
     
     /* integer to set to determine the previous state
                of encode 0==idle, 1==encoding, 2==cancelled*/
@@ -263,11 +241,11 @@ BOOL                        fIsDragging;
     BOOL                           SuccessfulScan;
     BOOL                           applyQueueToScan;
        NSString                      * currentSource;
-    NSString                     * browsedSourceDisplayName;
+    NSString                      * browsedSourceDisplayName;
     
     double                         dockIconProgress;
 }
-
+- (int) getPidnum;
 - (IBAction) showAboutPanel:(id)sender;
 
 - (void) writeToActivityLog:(const char *) format, ...;
@@ -279,25 +257,23 @@ BOOL                        fIsDragging;
 - (void) performScan:(NSString *) scanPath scanTitleNum: (int) scanTitleNum;
 - (IBAction) showNewScan: (id) sender;
 
+
+- (IBAction) cancelScanning:(id)sender;
+
 - (void)     updateUI: (NSTimer *) timer;
 - (void)     enableUI: (bool) enable;
-
+- (IBAction) encodeStartStopPopUpChanged: (id) sender;
 - (IBAction) titlePopUpChanged: (id) sender;
 - (IBAction) chapterPopUpChanged: (id) sender;
+- (IBAction) startEndSecValueChanged: (id) sender;
+- (IBAction) startEndFrameValueChanged: (id) sender;
+
 
 - (IBAction) formatPopUpChanged: (id) sender;
 - (IBAction) videoEncoderPopUpChanged: (id) sender;
 - (IBAction) autoSetM4vExtension: (id) sender;
 - (IBAction) twoPassCheckboxChanged: (id) sender;
 - (IBAction) videoFrameRateChanged: (id) sender;
-- (IBAction) audioAddAudioTrackCodecs: (id)sender;
-- (IBAction) audioCodecsPopUpChanged: (id) sender;
-- (IBAction) setEnabledStateOfAudioMixdownControls: (id) sender;
-- (IBAction) addAllAudioTracksToPopUp: (id) sender;
-- (IBAction) selectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound;
-- (IBAction) audioTrackPopUpChanged: (id) sender;
-- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse;
-- (IBAction) audioTrackMixdownChanged: (id) sender;
 - (void) prepareJob;
 - (IBAction) browseFile: (id) sender;
 - (void)     browseFileDone: (NSSavePanel *) sheet
@@ -308,7 +284,6 @@ BOOL                        fIsDragging;
 - (IBAction) qualitySliderChanged: (id) sender;
 - (void) setupQualitySlider;
 
-- (IBAction) audioDRCSliderChanged: (id) sender;
 - (IBAction) browseImportSrtFile: (id) sender;
 - (void) browseImportSrtFileDone: (NSSavePanel *) sheet
                      returnCode: (int) returnCode contextInfo: (void *) contextInfo;
@@ -329,7 +304,11 @@ BOOL                        fIsDragging;
 - (void) performNewQueueScan:(NSString *) scanPath scanTitleNum: (int) scanTitleNum;
 - (void) processNewQueueEncode;
 - (void) clearQueueEncodedItems;
-- (IBAction)applyQueueSettings:(id)sender;
+/* Queue Editing */
+- (IBAction)applyQueueSettingsToMainWindow:(id)sender;
+- (IBAction)rescanQueueItemToMainWindow:(NSString *) scanPath scanTitleNum: (int) scanTitleNum selectedQueueItem: (int) selectedQueueItem;
+
+
 - (void) removeQueueFileItem:(int) queueItemToRemove;
 - (void) clearQueueAllItems;
 - (void)moveObjectsInQueueArray:(NSMutableArray *)array fromIndexes:(NSIndexSet *)indexSet toIndex:(NSUInteger)insertIndex;
@@ -395,6 +374,7 @@ BOOL                        fIsDragging;
 - (void) loadPresets;
 - (IBAction) customSettingUsed: (id) sender;
 - (IBAction) showAddPresetPanel: (id) sender;
+- (IBAction) addPresetPicDropdownChanged: (id) sender;
 - (IBAction) closeAddPresetPanel: (id) sender;
 - (NSDictionary *)createPreset;
 
@@ -413,7 +393,7 @@ BOOL                        fIsDragging;
 - (IBAction)getDefaultPresets:(id)sender;
 
 -(void)sendToMetaX:(NSString *) filePath;
-    // Growl methods
+// Growl methods
 - (NSDictionary *) registrationDictionaryForGrowl;
 -(void)showGrowlDoneNotification:(NSString *) filePath;
 - (IBAction)showDebugOutputPanel:(id)sender;
@@ -426,8 +406,18 @@ BOOL                        fIsDragging;
 
 - (int) hbInstances;
 
+// Chapter files methods
+- (IBAction) browseForChapterFile: (id) sender;
+- (void)     browseForChapterFileDone: (NSOpenPanel *) sheet
+                 returnCode: (int) returnCode contextInfo: (void *) contextInfo;
 
+- (IBAction) browseForChapterFileSave: (id) sender;
+- (void)     browseForChapterFileSaveDone: (NSSavePanel *) sheet
+                 returnCode: (int) returnCode contextInfo: (void *) contextInfo;
 
++ (unsigned int) maximumNumberOfAllowedAudioTracks;
+@property (nonatomic, readonly) BOOL hasValidPresetSelected; 
+- (IBAction) addAllAudioTracks: (id) sender;
 
 @end
 
index 7960b2d..aa0299b 100644 (file)
@@ -4,6 +4,7 @@
    Homepage: <http://handbrake.fr/>.
    It may be used under the terms of the GNU General Public License. */
 
+#include <dlfcn.h>
 #import "Controller.h"
 #import "HBOutputPanelController.h"
 #import "HBPreferencesController.h"
 #import "HBPresets.h"
 #import "HBPreviewController.h"
 
+unsigned int maximumNumberOfAllowedAudioTracks = 24;
+NSString *HBContainerChangedNotification = @"HBContainerChangedNotification";
+NSString *keyContainerTag = @"keyContainerTag";
+NSString *HBTitleChangedNotification = @"HBTitleChangedNotification";
+NSString *keyTitleTag = @"keyTitleTag";
+
 #define DragDropSimplePboardType       @"MyCustomOutlineViewPboardType"
 
 /* We setup the toolbar values here ShowPreviewIdentifier */
@@ -30,6 +37,8 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
  *******************************/
 @implementation HBController
 
++ (unsigned int) maximumNumberOfAllowedAudioTracks     {       return maximumNumberOfAllowedAudioTracks;       }
+
 - (id)init
 {
     self = [super init];
@@ -82,7 +91,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     fPreferencesController = [[HBPreferencesController alloc] init];
     /* Lets report the HandBrake version number here to the activity log and text log file */
     NSString *versionStringFull = [[NSString stringWithFormat: @"Handbrake Version: %@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]] stringByAppendingString: [NSString stringWithFormat: @" (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]];
-    [self writeToActivityLog: "%s", [versionStringFull UTF8String]];    
+    [self writeToActivityLog: "%s", [versionStringFull UTF8String]];
     
     return self;
 }
@@ -117,16 +126,58 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     [fSubtitlesTable setDelegate:fSubtitlesDelegate];
     [fSubtitlesTable setRowHeight:25.0];
     
+       /* setup the audio controller */
+       [fAudioDelegate setHBController: self];
+       [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(autoSetM4vExtension:) name: HBMixdownChangedNotification object: nil];
+
     [fPresetsOutlineView setAutosaveName:@"Presets View"];
     [fPresetsOutlineView setAutosaveExpandedItems:YES];
     
     dockIconProgress = 0;
-
+    
+    /* Init QueueFile .plist */
+    [self loadQueueFile];
+    /* Run hbInstances to get any info on other instances as well as set the
+     * pid number for this instance in the case of multi-instance encoding. */ 
+    hbInstanceNum = [self hbInstances];
+    
+    /* If we are a single instance it is safe to clean up the previews if there are any
+     * left over. This is a bit of a kludge but will prevent a build up of old instance
+     * live preview cruft. No danger of removing an active preview directory since they
+     * are created later in HBPreviewController if they don't exist at the moment a live
+     * preview encode is initiated. */
+    if (hbInstanceNum == 1)
+    {
+        NSString *PreviewDirectory = [NSString stringWithFormat:@"~/Library/Application Support/HandBrake/Previews"];
+        PreviewDirectory = [PreviewDirectory stringByExpandingTildeInPath];
+        NSError *error;
+        NSArray *files = [ [NSFileManager defaultManager]  contentsOfDirectoryAtPath: PreviewDirectory error: &error ];
+        for( NSString *file in files ) 
+        {
+            if( file != @"." && file != @".." ) 
+            {
+                [ [NSFileManager defaultManager] removeItemAtPath: [ PreviewDirectory stringByAppendingPathComponent: file ] error: &error ];
+                if( error ) 
+                { 
+                    //an error occurred...
+                    [self writeToActivityLog: "Could not remove existing preview at : %s",[file UTF8String] ];
+                }
+            }    
+        }
+        
+    }
+    
+     
+    
     /* Call UpdateUI every 1/2 sec */
+    
     [[NSRunLoop currentRunLoop] addTimer:[NSTimer
-                                          scheduledTimerWithTimeInterval:0.5 target:self
-                                          selector:@selector(updateUI:) userInfo:nil repeats:YES]
-                                 forMode:NSDefaultRunLoopMode];
+                                          scheduledTimerWithTimeInterval:0.5 
+                                          target:self
+                                          selector:@selector(updateUI:) 
+                                          userInfo:nil repeats:YES]
+                                          forMode:NSDefaultRunLoopMode];
+                             
 
     // Open debug output window now if it was visible when HB was closed
     if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"])
@@ -164,11 +215,11 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         /* We check to see if there is already another instance of hb running.
          * Note: hbInstances == 1 means we are the only instance of HandBrake.app
          */
-        if ([self hbInstances] > 1)
+        if (hbInstanceNum > 1)
         {
-        alertTitle = [NSString stringWithFormat:
-                         NSLocalizedString(@"There is already an instance of HandBrake running.", @"")];
-        NSBeginCriticalAlertSheet(
+            alertTitle = [NSString stringWithFormat:
+                          NSLocalizedString(@"There is already an instance of HandBrake running.", @"")];
+            NSBeginCriticalAlertSheet(
                                       alertTitle,
                                       NSLocalizedString(@"Reload Queue", nil),
                                       nil,
@@ -179,31 +230,48 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         }
         else
         {
-            if (fWorkingCount > 0)
+            if (fWorkingCount > 0 || fPendingCount > 0)
             {
-                alertTitle = [NSString stringWithFormat:
-                              NSLocalizedString(@"HandBrake Has Detected %d Previously Encoding Item and %d Pending Item(s) In Your Queue.", @""),
-                              fWorkingCount,fPendingCount];
+                if (fWorkingCount > 0)
+                {
+                    alertTitle = [NSString stringWithFormat:
+                                  NSLocalizedString(@"HandBrake Has Detected %d Previously Encoding Item(s) and %d Pending Item(s) In Your Queue.", @""),
+                                  fWorkingCount,fPendingCount];
+                }
+                else
+                {
+                    alertTitle = [NSString stringWithFormat:
+                                  NSLocalizedString(@"HandBrake Has Detected %d Pending Item(s) In Your Queue.", @""),
+                                  fPendingCount];
+                }
+                
+                NSBeginCriticalAlertSheet(
+                                          alertTitle,
+                                          NSLocalizedString(@"Reload Queue", nil),
+                                          nil,
+                                          NSLocalizedString(@"Empty Queue", nil),
+                                          fWindow, self,
+                                          nil, @selector(didDimissReloadQueue:returnCode:contextInfo:), nil,
+                                          NSLocalizedString(@" Do you want to reload them ?", nil));
             }
             else
             {
-                alertTitle = [NSString stringWithFormat:
-                              NSLocalizedString(@"HandBrake Has Detected %d Pending Item(s) In Your Queue.", @""),
-                              fPendingCount];
+                /* Since we addressed any pending or previously encoding items above, we go ahead and make sure the queue
+                 * is empty of any finished items or cancelled items */
+                [self clearQueueAllItems];
+                /* We show whichever open source window specified in LaunchSourceBehavior preference key */
+                if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"])
+                {
+                    [self browseSources:nil];
+                }
+                
+                if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source (Title Specific)"])
+                {
+                    [self browseSources:(id)fOpenSourceTitleMMenu];
+                }
             }
             
-            NSBeginCriticalAlertSheet(
-                                      alertTitle,
-                                      NSLocalizedString(@"Reload Queue", nil),
-                                      nil,
-                                      NSLocalizedString(@"Empty Queue", nil),
-                                      fWindow, self,
-                                      nil, @selector(didDimissReloadQueue:returnCode:contextInfo:), nil,
-                                      NSLocalizedString(@" Do you want to reload them ?", nil));
         }
-        
-        // call didDimissReloadQueue: (NSWindow *)sheet returnCode: (int)returnCode contextInfo: (void *)contextInfo
-        // right below to either clear the old queue or keep it loaded up.
     }
     else
     {
@@ -218,31 +286,67 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             [self browseSources:(id)fOpenSourceTitleMMenu];
         }
     }
+    currentQueueEncodeNameString = @"";
 }
 
+#pragma mark -
+#pragma mark Multiple Instances
+
+/* hbInstances checks to see if other instances of HB are running and also sets the pid for this instance for multi-instance queue encoding */
+ /* Note for now since we are in early phases of multi-instance I have put in quite a bit of logging. Can be removed as we see fit. */
 - (int) hbInstances
 {
     /* check to see if another instance of HandBrake.app is running */
     NSArray *runningAppDictionaries = [[NSWorkspace sharedWorkspace] launchedApplications];
-    NSDictionary *aDictionary;
+    NSDictionary *runningAppsDictionary;
     int hbInstances = 0;
-    for (aDictionary in runningAppDictionaries)
+    NSString * thisInstanceAppPath = [[NSBundle mainBundle] bundlePath];
+    NSString * runningInstanceAppPath;
+    int runningInstancePidNum;
+    [self writeToActivityLog: "hbInstances path to this instance: %s", [thisInstanceAppPath UTF8String]];
+    for (runningAppsDictionary in runningAppDictionaries)
        {
-        //     NSLog(@"Open App: %@", [aDictionary valueForKey:@"NSApplicationName"]);
-        
-        if ([[aDictionary valueForKey:@"NSApplicationName"] isEqualToString:@"HandBrake"])
+        if ([[runningAppsDictionary valueForKey:@"NSApplicationName"] isEqualToString:@"HandBrake"])
                {
+            /*Report the path to each active instances app path */
+            runningInstancePidNum = [[runningAppsDictionary valueForKey:@"NSApplicationProcessIdentifier"] intValue];
+            runningInstanceAppPath = [runningAppsDictionary valueForKey:@"NSApplicationPath"];
+            [self writeToActivityLog: "hbInstance found instance pidnum:%d at path: %s", runningInstancePidNum, [runningInstanceAppPath UTF8String]];
+            /* see if this is us by comparing the app path */
+            if ([runningInstanceAppPath isEqualToString: thisInstanceAppPath])
+            {
+                /* If so this is our pidnum */
+                [self writeToActivityLog: "hbInstance MATCH FOUND, our pidnum is:%d", runningInstancePidNum];
+                /* Get the PID number for this hb instance, used in multi instance encoding */
+                pidNum = runningInstancePidNum;
+                /* Report this pid to the activity log */
+                [self writeToActivityLog: "Pid for this instance:%d", pidNum];
+                /* Tell fQueueController what our pidNum is */
+                [fQueueController setPidNum:pidNum];
+            }
             hbInstances++;
-               }
-       }
+        }
+    }
     return hbInstances;
 }
 
+- (int) getPidnum
+{
+    return pidNum;
+}
+
+#pragma mark -
+
 - (void) didDimissReloadQueue: (NSWindow *)sheet returnCode: (int)returnCode contextInfo: (void *)contextInfo
 {
+    
+    [self writeToActivityLog: "didDimissReloadQueue number of hb instances:%d", hbInstanceNum];
     if (returnCode == NSAlertOtherReturn)
     {
+        [self writeToActivityLog: "didDimissReloadQueue NSAlertOtherReturn Chosen"];
         [self clearQueueAllItems];
+        
         /* We show whichever open source window specified in LaunchSourceBehavior preference key */
         if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"LaunchSourceBehavior"] isEqualToString: @"Open Source"])
         {
@@ -256,8 +360,10 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     }
     else
     {
-        if ([self hbInstances] == 1)
+        [self writeToActivityLog: "didDimissReloadQueue First Button Chosen"];
+        if (hbInstanceNum == 1)
         {
+            
             [self setQueueEncodingItemsAsPending];
         }
         [self showQueueWindow:NULL];
@@ -266,15 +372,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 - (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) app
 {
-    /* if we are in preview full screen mode, we need to go to
-     * windowed mode and release the display before we terminate.
-     * We do it here (instead of applicationWillTerminate) so we 
-     * release the displays and can then see the alerts below.
-     */
-    if ([fPictureController previewFullScreenMode] == YES)
-    {
-        [fPictureController previewGoWindowed:nil];
-    }
+
     
     hb_state_t s;
     hb_get_state( fQueueEncodeLibhb, &s );
@@ -313,7 +411,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 
 - (void)applicationWillTerminate:(NSNotification *)aNotification
 {
-    
+    [currentQueueEncodeNameString release];
     [browsedSourceDisplayName release];
     [outputPanel release];
        [fQueueController release];
@@ -321,15 +419,18 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     [fPictureController release];
     [fApplicationIcon release];
 
-       hb_close(&fHandle);
+    hb_close(&fHandle);
     hb_close(&fQueueEncodeLibhb);
+    hb_global_close();
+
 }
 
 
 - (void) awakeFromNib
 {
     [fWindow center];
-    [fWindow setExcludedFromWindowsMenu:YES];
+    [fWindow setExcludedFromWindowsMenu:NO];
+    
     [fAdvancedOptions setView:fAdvancedView];
     
     /* lets setup our presets drawer for drag and drop here */
@@ -344,9 +445,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     
     /* Init UserPresets .plist */
        [self loadPresets];
-    
-    /* Init QueueFile .plist */
-    [self loadQueueFile];
        
     fRipIndicatorShown = NO;  // initially out of view in the nib
     
@@ -382,6 +480,18 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     [fSrcAngleLabel setHidden:YES];
     [fSrcAnglePopUp setHidden:YES];
     
+    /* Setup the start / stop popup */
+    [fEncodeStartStopPopUp removeAllItems];
+    [fEncodeStartStopPopUp addItemWithTitle: @"Chapters"];
+    [fEncodeStartStopPopUp addItemWithTitle: @"Seconds"];
+    [fEncodeStartStopPopUp addItemWithTitle: @"Frames"];
+    /* Align the start / stop widgets with the chapter popups */
+    [fSrcTimeStartEncodingField setFrameOrigin:[fSrcChapterStartPopUp frame].origin];
+    [fSrcTimeEndEncodingField setFrameOrigin:[fSrcChapterEndPopUp frame].origin];
+    
+    [fSrcFrameStartEncodingField setFrameOrigin:[fSrcChapterStartPopUp frame].origin];
+    [fSrcFrameEndEncodingField setFrameOrigin:[fSrcChapterEndPopUp frame].origin];
+    
     /* Destination box*/
     NSMenuItem *menuItem;
     [fDstFormatPopUp removeAllItems];
@@ -414,7 +524,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     [fVidEncoderPopUp addItemWithTitle: @"FFmpeg"];
     
     
-    
     /* Video quality */
     [fVidTargetSizeField setIntValue: 700];
        [fVidBitrateField    setIntValue: 1000];
@@ -452,26 +561,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        
        /* Set Auto Crop to On at launch */
     [fPictureController setAutoCrop:YES];
-       
-       /* Audio bitrate */
-    [fAudTrack1BitratePopUp removeAllItems];
-    for( int i = 0; i < hb_audio_bitrates_count; i++ )
-    {
-        [fAudTrack1BitratePopUp addItemWithTitle:
-         [NSString stringWithUTF8String: hb_audio_bitrates[i].string]];
-        
-    }
-    [fAudTrack1BitratePopUp selectItemAtIndex: hb_audio_bitrates_default];
-       
-    /* Audio samplerate */
-    [fAudTrack1RatePopUp removeAllItems];
-    for( int i = 0; i < hb_audio_rates_count; i++ )
-    {
-        [fAudTrack1RatePopUp addItemWithTitle:
-         [NSString stringWithUTF8String: hb_audio_rates[i].string]];
-    }
-    [fAudTrack1RatePopUp selectItemAtIndex: hb_audio_rates_default];
-       
+               
     /* Bottom */
     [fStatusField setStringValue: @""];
     
@@ -487,8 +577,6 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        [self getDefaultPresets:nil];
        /* lets initialize the current successful scancount here to 0 */
        currentSuccessfulScanCount = 0;
-    
-    
 }
 
 - (void) enableUI: (bool) b
@@ -500,18 +588,11 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         fDstFormatField, fDstFormatPopUp, fDstFile1Field, fDstFile2Field,
         fDstBrowseButton, fVidRateField, fVidRatePopUp,fVidEncoderField, fVidEncoderPopUp, fVidQualityField,
         fPictureSizeField,fPictureCroppingField, fVideoFiltersField,fVidQualityMatrix, fSubField, fSubPopUp,
-        fAudSourceLabel, fAudCodecLabel, fAudMixdownLabel, fAudSamplerateLabel, fAudBitrateLabel,
-        fAudTrack1Label, fAudTrack2Label, fAudTrack3Label, fAudTrack4Label,
-        fAudLang1PopUp, fAudLang2PopUp, fAudLang3PopUp, fAudLang4PopUp,
-        fAudTrack1CodecPopUp, fAudTrack2CodecPopUp, fAudTrack3CodecPopUp, fAudTrack4CodecPopUp,
-        fAudTrack1MixPopUp, fAudTrack2MixPopUp, fAudTrack3MixPopUp, fAudTrack4MixPopUp,
-        fAudTrack1RatePopUp, fAudTrack2RatePopUp, fAudTrack3RatePopUp, fAudTrack4RatePopUp,
-        fAudTrack1BitratePopUp, fAudTrack2BitratePopUp, fAudTrack3BitratePopUp, fAudTrack4BitratePopUp,
-        fAudDrcLabel, fAudTrack1DrcSlider, fAudTrack1DrcField, fAudTrack2DrcSlider,
-        fAudTrack2DrcField, fAudTrack3DrcSlider, fAudTrack3DrcField, fAudTrack4DrcSlider,fAudTrack4DrcField,
         fQueueStatus,fPresetsAdd,fPresetsDelete,fSrcAngleLabel,fSrcAnglePopUp,
                fCreateChapterMarkers,fVidTurboPassCheck,fDstMp4LargeFileCheck,fSubForcedCheck,fPresetsOutlineView,
-    fAudDrcLabel,fDstMp4HttpOptFileCheck,fDstMp4iPodFileCheck,fVidQualityRFField,fVidQualityRFLabel};
+        fDstMp4HttpOptFileCheck,fDstMp4iPodFileCheck,fVidQualityRFField,fVidQualityRFLabel,
+        fEncodeStartStopPopUp,fSrcTimeStartEncodingField,fSrcTimeEndEncodingField,fSrcFrameStartEncodingField,
+        fSrcFrameEndEncodingField, fLoadChaptersButton, fSaveChaptersButton, fFrameratePfrCheck};
     
     for( unsigned i = 0;
         i < sizeof( controls ) / sizeof( NSControl * ); i++ )
@@ -530,19 +611,20 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         
     }
     
-       if (b) {
+       if (b) 
+    {
         
-        /* if we're enabling the interface, check if the audio mixdown controls need to be enabled or not */
-        /* these will have been enabled by the mass control enablement above anyway, so we're sense-checking it here */
-        [self setEnabledStateOfAudioMixdownControls:nil];
         /* we also call calculatePictureSizing here to sense check if we already have vfr selected */
         [self calculatePictureSizing:nil];
-        
-       } else {
+        /* Also enable the preview window hud controls */
+        [fPictureController enablePreviewHudControls];
+    }
+    else 
+    {
         
                [fPresetsOutlineView setEnabled: NO];
-        
-       }
+        [fPictureController disablePreviewHudControls];
+    }
     
     [self videoMatrixChanged:nil];
     [fAdvancedOptions enableUI:b];
@@ -754,7 +836,56 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         }
 #undef p
             
+            
 #define p s.param.working
+            
+        case HB_STATE_SEARCHING:
+               {
+            NSMutableString * string;
+            NSString * pass_desc;
+            
+            /* Update text field */
+            pass_desc = @"";
+            //string = [NSMutableString stringWithFormat: NSLocalizedString( @"Searching for start point: pass %d %@ of %d, %.2f %%", @"" ), p.job_cur, pass_desc, p.job_count, 100.0 * p.progress];
+            /* For now, do not announce "pass x of x for the search phase ... */
+            string = [NSMutableString stringWithFormat: NSLocalizedString( @"Searching for start point ... :  %.2f %%", @"" ), 100.0 * p.progress];
+            
+                       if( p.seconds > -1 )
+            {
+                [string appendFormat:
+                 NSLocalizedString( @" (ETA %02dh%02dm%02ds)", @"" ), p.hours, p.minutes, p.seconds];
+            }
+            
+            [fStatusField setStringValue: string];
+            /* Set the status string in fQueueController as well */
+            [fQueueController setQueueStatusString: string];
+            /* Update slider */
+            CGFloat progress_total = ( p.progress + p.job_cur - 1 ) / p.job_count;
+            [fRipIndicator setIndeterminate: NO];
+            [fRipIndicator setDoubleValue:100.0 * progress_total];
+            
+            // If progress bar hasn't been revealed at the bottom of the window, do
+            // that now. This code used to be in doRip. I moved it to here to handle
+            // the case where hb_start is called by HBQueueController and not from
+            // HBController.
+            if( !fRipIndicatorShown )
+            {
+                NSRect frame = [fWindow frame];
+                if( frame.size.width <= 591 )
+                    frame.size.width = 591;
+                frame.size.height += 36;
+                frame.origin.y -= 36;
+                [fWindow setFrame:frame display:YES animate:YES];
+                fRipIndicatorShown = YES;
+                
+            }
+            
+            /* Update dock icon */
+            /* Note not done yet */
+            break;  
+        }
+            
+            
         case HB_STATE_WORKING:
         {
             NSMutableString * string;
@@ -776,7 +907,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 pass_desc = @"";
             }
             
-                       string = [NSMutableString stringWithFormat: NSLocalizedString( @"Encoding: pass %d %@ of %d, %.2f %%", @"" ), p.job_cur, pass_desc, p.job_count, 100.0 * p.progress];
+                       string = [NSMutableString stringWithFormat: NSLocalizedString( @"Encoding: %@ \nPass %d %@ of %d, %.2f %%", @"" ), currentQueueEncodeNameString, p.job_cur, pass_desc, p.job_count, 100.0 * p.progress];
             
                        if( p.seconds > -1 )
             {
@@ -784,10 +915,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                  NSLocalizedString( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"" ),
                  p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds];
             }
-            
             [fStatusField setStringValue: string];
-            /* Set the status string in fQueueController as well */
-            [fQueueController setQueueStatusString: string];
+            [fQueueController setQueueStatusString:string];
+            
             /* Update slider */
             CGFloat progress_total = ( p.progress + p.job_cur - 1 ) / p.job_count;
             [fRipIndicator setIndeterminate: NO];
@@ -808,14 +938,14 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 fRipIndicatorShown = YES;
                 
             }
-
+            
             /* Update dock icon */
             if( dockIconProgress < 100.0 * progress_total )
             {
                 [self UpdateDockIcon: progress_total];
                 dockIconProgress += 5;
             }
-
+            
             break;
         }
 #undef p
@@ -886,62 +1016,39 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 pathOfFinishedEncode = [[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"DestinationPath"];
                 
                 /* Both the Growl Alert and Sending to MetaX can be done as encodes roll off the queue */
-                /* Growl alert */
-                [self showGrowlDoneNotification:pathOfFinishedEncode];
-                /* Send to MetaX */
-                [self sendToMetaX:pathOfFinishedEncode];
-                
-                /* since we have successfully completed an encode, we increment the queue counter */
-                [self incrementQueueItemDone:nil]; 
-                
-                /* all end of queue actions below need to be done after all queue encodes have finished 
-                 * and there are no pending jobs left to process
-                 */
-                if (fPendingCount == 0)
+                if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Growl Notification"] || 
+                    [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"])
                 {
-                    /* If Alert Window or Window and Growl has been selected */
-                    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] ||
-                       [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"] )
+                    /* If Play System Alert has been selected in Preferences */
+                    if( [[NSUserDefaults standardUserDefaults] boolForKey:@"AlertWhenDoneSound"] == YES )
                     {
-                        /*On Screen Notification*/
-                        int status;
                         NSBeep();
-                        status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake queue is done!", @"OK", nil, nil);
-                        [NSApp requestUserAttention:NSCriticalRequest];
-                    }
-                    
-                    /* If sleep has been selected */
-                    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"] )
-                    {
-                        /* Sleep */
-                        NSDictionary* errorDict;
-                        NSAppleEventDescriptor* returnDescriptor = nil;
-                        NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
-                                                       @"tell application \"Finder\" to sleep"];
-                        returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
-                        [scriptObject release];
-                    }
-                    /* If Shutdown has been selected */
-                    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"] )
-                    {
-                        /* Shut Down */
-                        NSDictionary* errorDict;
-                        NSAppleEventDescriptor* returnDescriptor = nil;
-                        NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
-                                                       @"tell application \"Finder\" to shut down"];
-                        returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
-                        [scriptObject release];
                     }
-                    
+                    [self showGrowlDoneNotification:pathOfFinishedEncode];
                 }
                 
+                /* Send to MetaX */
+                [self sendToMetaX:pathOfFinishedEncode];
                 
+                /* since we have successfully completed an encode, we increment the queue counter */
+                [self incrementQueueItemDone:currentQueueEncodeIndex]; 
+
             }
             
             break;
         }
     }
     
+    /* Since we can use multiple instance off of the same queue file it is imperative that we keep the QueueFileArray updated off of the QueueFile.plist
+     * so we go ahead and do it in this existing timer as opposed to using a new one */
+    
+    NSMutableArray * tempQueueArray = [[NSMutableArray alloc] initWithContentsOfFile:QueueFile];
+    [QueueFileArray setArray:tempQueueArray];
+    [tempQueueArray release]; 
+    /* Send Fresh QueueFileArray to fQueueController to update queue window */
+    [fQueueController setQueueArray: QueueFileArray];
+    [self getQueueStats];
+    
 }
 
 /* We use this to write messages to stderr from the macgui which show up in the activity window and log*/
@@ -1100,12 +1207,36 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         hb_state_t s;
         
         hb_get_state( fHandle, &s );
-        if (s.state == HB_STATE_SCANNING && ([ident isEqualToString: StartEncodingIdentifier] || [ident isEqualToString: AddToQueueIdentifier]))
-            return NO;
-        
+        if (s.state == HB_STATE_SCANNING)
+        {
+            
+            if ([ident isEqualToString: ChooseSourceIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Stop"]];
+                [toolbarItem setLabel: @"Cancel Scan"];
+                [toolbarItem setPaletteLabel: @"Cancel Scanning"];
+                [toolbarItem setToolTip: @"Cancel Scanning Source"];
+                return YES;
+            }
+            
+            if ([ident isEqualToString: StartEncodingIdentifier] || [ident isEqualToString: AddToQueueIdentifier])
+                return NO;
+        }
+        else
+        {
+            if ([ident isEqualToString: ChooseSourceIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Source"]];
+                [toolbarItem setLabel: @"Source"];
+                [toolbarItem setPaletteLabel: @"Source"];
+                [toolbarItem setToolTip: @"Choose Video Source"];
+                return YES;
+            }
+        }
+
         hb_get_state2( fQueueEncodeLibhb, &s );
         
-        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING)
+        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_SEARCHING || s.state == HB_STATE_MUXING)
         {
             if ([ident isEqualToString: StartEncodingIdentifier])
             {
@@ -1273,40 +1404,95 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 -(void)showGrowlDoneNotification:(NSString *) filePath
 {
     /* This end of encode action is called as each encode rolls off of the queue */
+    /* Setup the Growl stuff ... */
     NSString * finishedEncode = filePath;
     /* strip off the path to just show the file name */
     finishedEncode = [finishedEncode lastPathComponent];
-    if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Growl Notification"] || 
-        [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"])
-    {
-        NSString * growlMssg = [NSString stringWithFormat: @"your HandBrake encode %@ is done!",finishedEncode];
-        [GrowlApplicationBridge 
-         notifyWithTitle:@"Put down that cocktail..." 
-         description:growlMssg 
-         notificationName:SERVICE_NAME
-         iconData:nil 
-         priority:0 
-         isSticky:1 
-         clickContext:nil];
-    }
-    
+    NSString * growlMssg = [NSString stringWithFormat: @"your HandBrake encode %@ is done!",finishedEncode];
+    [GrowlApplicationBridge 
+     notifyWithTitle:@"Put down that cocktail..." 
+     description:growlMssg 
+     notificationName:SERVICE_NAME
+     iconData:nil 
+     priority:0 
+     isSticky:1 
+     clickContext:nil];
 }
 -(void)sendToMetaX:(NSString *) filePath
 {
     /* This end of encode action is called as each encode rolls off of the queue */
     if([[NSUserDefaults standardUserDefaults] boolForKey: @"sendToMetaX"] == YES)
     {
-        NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@", @"tell application \"MetaX\" to open (POSIX file \"", filePath, @"\")"]];
-        [myScript executeAndReturnError: nil];
-        [myScript release];
+        NSString *sendToApp = [[NSUserDefaults standardUserDefaults] objectForKey: @"SendCompletedEncodeToApp"];
+        if (![sendToApp isEqualToString:@"None"])
+        {
+            [self writeToActivityLog: "trying to send encode to: %s", [sendToApp UTF8String]];
+            NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@%@%@", @"tell application \"",sendToApp,@"\" to open (POSIX file \"", filePath, @"\")"]];
+            [myScript executeAndReturnError: nil];
+            [myScript release];
+        }
+        
+    }
+}
+
+- (void) queueCompletedAlerts
+{
+    /* If Play System Alert has been selected in Preferences */
+    if( [[NSUserDefaults standardUserDefaults] boolForKey:@"AlertWhenDoneSound"] == YES )
+    {
+        NSBeep();
+    }
+    
+    /* If Alert Window or Window and Growl has been selected */
+    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window"] ||
+       [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Alert Window And Growl"] )
+    {
+        /*On Screen Notification*/
+        int status;
+        status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake queue is done!", @"OK", nil, nil);
+        [NSApp requestUserAttention:NSCriticalRequest];
+    }
+    
+    /* If sleep has been selected */
+    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"] )
+    {
+        /* Sleep */
+        NSDictionary* errorDict;
+        NSAppleEventDescriptor* returnDescriptor = nil;
+        NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
+                                       @"tell application \"Finder\" to sleep"];
+        returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
+        [scriptObject release];
+    }
+    /* If Shutdown has been selected */
+    if( [[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"] )
+    {
+        /* Shut Down */
+        NSDictionary* errorDict;
+        NSAppleEventDescriptor* returnDescriptor = nil;
+        NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource:
+                                       @"tell application \"Finder\" to shut down"];
+        returnDescriptor = [scriptObject executeAndReturnError: &errorDict];
+        [scriptObject release];
     }
 }
+
 #pragma mark -
 #pragma mark Get New Source
 
 /*Opens the source browse window, called from Open Source widgets */
 - (IBAction) browseSources: (id) sender
 {
+    
+    hb_state_t s;
+    hb_get_state( fHandle, &s );
+    if (s.state == HB_STATE_SCANNING)
+    {
+        [self cancelScanning:nil];
+        return;
+    }
+    
+    
     NSOpenPanel * panel;
        
     panel = [NSOpenPanel openPanel];
@@ -1368,7 +1554,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             if ([[scanPath lastPathComponent] isEqualToString: @"VIDEO_TS"])
             {
                 /* If VIDEO_TS Folder is chosen, choose its parent folder for the source display name
-                 we have to use the title->dvd value so we get the proper name of the volume if a physical dvd is the source*/
+                 we have to use the title->path value so we get the proper name of the volume if a physical dvd is the source*/
                 displayTitlescanSourceName = [[scanPath stringByDeletingLastPathComponent] lastPathComponent];
             }
             else
@@ -1450,6 +1636,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                     /* make sure we remove any path extension as this can also be an '.mpg' file */
                     browsedSourceDisplayName = [[path lastPathComponent] retain];
                 }
+                applyQueueToScan = NO;
                 [self performScan:path scanTitleNum:0];
             }
 
@@ -1482,7 +1669,7 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 {
     [NSApp endSheet: fScanSrcTitlePanel];
     [fScanSrcTitlePanel orderOut: self];
-
+    
     if(sender == fScanSrcTitleOpenButton)
     {
         /* We setup the scan status in the main window to indicate a source title scan */
@@ -1492,8 +1679,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         [fScanIndicator startAnimation: nil];
                
         /* We use the performScan method to actually perform the specified scan passing the path and the title
-            * to be scanned
-            */
+         * to be scanned
+         */
+        applyQueueToScan = NO;
         [self performScan:[fScanSrcTitlePathField stringValue] scanTitleNum:[fScanSrcTitleNumField intValue]];
     }
 }
@@ -1501,10 +1689,10 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 /* Here we actually tell hb_scan to perform the source scan, using the path to source and title number*/
 - (void) performScan:(NSString *) scanPath scanTitleNum: (int) scanTitleNum
 {
-    /* set the bool applyQueueToScan so that we dont apply a queue setting to the final scan */
-    applyQueueToScan = NO;
+    
     /* use a bool to determine whether or not we can decrypt using vlc */
     BOOL cancelScanDecrypt = 0;
+    BOOL vlcFound = 0;
     NSString *path = scanPath;
     HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
     
@@ -1516,35 +1704,32 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
     [fSubtitlesDelegate resetWithTitle:nil];
     [fSubtitlesTable reloadData];
     
+       //      Notify anyone interested (audio controller) that there's no title
+       [[NSNotificationCenter defaultCenter] postNotification:
+        [NSNotification notificationWithName: HBTitleChangedNotification
+                                                                  object: self
+                                                                userInfo: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                       [NSData dataWithBytesNoCopy: &fTitle length: sizeof(fTitle) freeWhenDone: NO], keyTitleTag,
+                                                                                       nil]]];
+
     [self enableUI: NO];
     
     if( [detector isVideoDVD] )
     {
-        int hb_arch;
-#if defined( __LP64__ )
-        /* we are 64 bit */
-        hb_arch = 64;
-#else
-        /* we are 32 bit */
-        hb_arch = 32;
-#endif 
-        
-        
         // The chosen path was actually on a DVD, so use the raw block
         // device path instead.
         path = [detector devicePath];
         [self writeToActivityLog: "trying to open a physical dvd at: %s", [scanPath UTF8String]];
         
         /* lets check for vlc here to make sure we have a dylib available to use for decrypting */
-        NSString *vlcPath = @"/Applications/VLC.app/Contents/MacOS/lib/libdvdcss.2.dylib";
-        NSFileManager * fileManager = [NSFileManager defaultManager];
-           if ([fileManager fileExistsAtPath:vlcPath] == 0) 
-           {
-            /*vlc not found in /Applications so we set the bool to cancel scanning to 1 */
+        void *dvdcss = dlopen("libdvdcss.2.dylib", RTLD_LAZY);
+        if (dvdcss == NULL) 
+        {
+            /*compatible vlc not found, so we set the bool to cancel scanning to 1 */
             cancelScanDecrypt = 1;
             [self writeToActivityLog: "VLC app not found for decrypting physical dvd"];
             int status;
-            status = NSRunAlertPanel(@"HandBrake could not find VLC or your VLC is out of date.",@"Please download and install VLC media player in your /Applications folder if you wish to read encrypted DVDs.", @"Get VLC", @"Cancel Scan", @"Attempt Scan Anyway");
+            status = NSRunAlertPanel(@"HandBrake could not find VLC or your VLC is incompatible (Note: 32 bit vlc is not compatible with 64 bit HandBrake and vice-versa).",@"Please download and install VLC media player if you wish to read encrypted DVDs.", @"Get VLC", @"Cancel Scan", @"Attempt Scan Anyway");
             [NSApp requestUserAttention:NSCriticalRequest];
             
             if (status == NSAlertDefaultReturn)
@@ -1569,147 +1754,51 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
         {
             /* VLC was found in /Applications so all is well, we can carry on using vlc's libdvdcss.dylib for decrypting if needed */
             [self writeToActivityLog: "VLC app found for decrypting physical dvd"];
+            vlcFound = 1;
+            dlclose(dvdcss);
         }
-        /* test for architecture of the vlc app */
-        NSArray *vlc_architecturesArray = [[NSBundle bundleWithPath:@"/Applications/VLC.app"] executableArchitectures];
-        BOOL vlcIntel32bit = NO;
-        BOOL vlcIntel64bit = NO;
-        BOOL vlcPPC32bit = NO;
-        BOOL vlcPPC64bit = NO;
-        /* check the available architectures for vlc and note accordingly */
-        NSEnumerator *enumerator = [vlc_architecturesArray objectEnumerator];
-        id tempObject;
-        while (tempObject = [enumerator nextObject])
-        {
-            
-            if ([tempObject intValue] == NSBundleExecutableArchitectureI386)
-            {
-                vlcIntel32bit = YES;   
-            }
-            if ([tempObject intValue] == NSBundleExecutableArchitectureX86_64)
-            {
-                vlcIntel64bit = YES;   
-            }
-            if ([tempObject intValue] == NSBundleExecutableArchitecturePPC)
-            {
-                vlcPPC32bit = YES;   
-            }
-            if ([tempObject intValue] == NSBundleExecutableArchitecturePPC64)
-            {
-                vlcPPC64bit = YES;   
-            }
-            
-        }
-        /* Write vlc architecture findings to activity window */
-        if (vlcIntel32bit)
+    }
+    
+    if (cancelScanDecrypt == 0)
+    {
+        /* we actually pass the scan off to libhb here */
+        /* If there is no title number passed to scan, we use "0"
+         * which causes the default behavior of a full source scan
+         */
+        if (!scanTitleNum)
         {
-            [self writeToActivityLog: " 32-Bit VLC app found for decrypting physical dvd"];
+            scanTitleNum = 0;
         }
-        if (vlcIntel64bit)
+        if (scanTitleNum > 0)
         {
-            [self writeToActivityLog: " 64-Bit VLC app found for decrypting physical dvd"];
+            [self writeToActivityLog: "scanning specifically for title: %d", scanTitleNum];
         }
+        /* We use our advanced pref to determine how many previews to scan */
+        int hb_num_previews = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue];
+        /* We use our advanced pref to determine the minimum title length to use in seconds*/
+        uint64_t min_title_duration_seconds = 90000L * [[[NSUserDefaults standardUserDefaults] objectForKey:@"MinTitleScanSeconds"] intValue];
+        /* set title to NULL */
+        fTitle = NULL;
+        [self writeToActivityLog: "Minimum length of title for scan: %d", min_title_duration_seconds];
+        hb_scan( fHandle, [path UTF8String], scanTitleNum, hb_num_previews, 1 , min_title_duration_seconds );
+        [fSrcDVD2Field setStringValue:@"Scanning new source ..."];
+    }
+}
+
+- (IBAction) cancelScanning:(id)sender
+{
+    hb_scan_stop(fHandle);
+}
+
+- (IBAction) showNewScan:(id)sender
+{
+    hb_list_t  * list;
+       hb_title_t * title = NULL;
+       int feature_title=0; // Used to store the main feature title
+
+        list = hb_get_titles( fHandle );
         
-        
-        
-        if (hb_arch == 64 && !vlcIntel64bit && cancelScanDecrypt != 1)
-        {
-            
-            /* we are 64 bit */
-            
-            /* Appropriate VLC not found, so cancel */
-            cancelScanDecrypt = 1;
-            [self writeToActivityLog: "This version of HandBrake is 64 bit, 64 bit version of vlc not found, scan cancelled"];
-            /*On Screen Notification*/
-            int status;
-            NSBeep();
-            status = NSRunAlertPanel(@"This version of HandBrake is 64 bit, VLC found but not 64 bit!",@"", @"Cancel Scan", @"Attempt Scan Anyway", @"Get 64 bit VLC", nil);
-            [NSApp requestUserAttention:NSCriticalRequest];
-            
-            if (status == NSAlertDefaultReturn)
-            {
-                /* User chose to cancel the scan */
-                [self writeToActivityLog: "cannot open physical dvd VLC found but not 64 bit, scan cancelled"];
-                cancelScanDecrypt = 1;
-            }
-            else if (status == NSAlertDefaultReturn)
-            {
-                [self writeToActivityLog: "user overrode 64-bit warning trying to open physical dvd without proper decryption"];
-                cancelScanDecrypt = 0;
-            }
-            else
-            {
-                /* User chose to go download vlc (as they rightfully should) so we send them to the vlc site */
-                [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.videolan.org/vlc/download-macosx.html"]];
-            }
-            
-        }    
-        else if (hb_arch == 32 && !vlcIntel32bit && cancelScanDecrypt != 1)
-        {
-            /* we are 32 bit */
-            /* Appropriate VLC not found, so cancel */
-            cancelScanDecrypt = 1;
-            [self writeToActivityLog: "This version of HandBrake is 32 bit, 32 bit version of vlc not found, scan cancelled"];
-            /*On Screen Notification*/
-            int status;
-            NSBeep();
-            status = NSRunAlertPanel(@"This version of HandBrake is 32 bit, VLC found but not 32 bit!",@"", @"Cancel Scan", @"Attempt Scan Anyway", @"Get 32 bit VLC", nil);
-            [NSApp requestUserAttention:NSCriticalRequest];
-            
-            if (status == NSAlertDefaultReturn)
-            {
-                /* User chose to cancel the scan */
-                [self writeToActivityLog: "cannot open physical dvd VLC found but not 32 bit, scan cancelled"];
-                cancelScanDecrypt = 1;
-            }
-            else if (status == NSAlertDefaultReturn)
-            {
-                [self writeToActivityLog: "user overrode 32-bit warning trying to open physical dvd without proper decryption"];
-                cancelScanDecrypt = 0;
-            }
-            else
-            {
-                /* User chose to go download vlc (as they rightfully should) so we send them to the vlc site */
-                [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://www.videolan.org/vlc/download-macosx.html"]];
-            }
-            
-        } 
-    }
-    
-    if (cancelScanDecrypt == 0)
-    {
-        /* we actually pass the scan off to libhb here */
-        /* If there is no title number passed to scan, we use "0"
-         * which causes the default behavior of a full source scan
-         */
-        if (!scanTitleNum)
-        {
-            scanTitleNum = 0;
-        }
-        if (scanTitleNum > 0)
-        {
-            [self writeToActivityLog: "scanning specifically for title: %d", scanTitleNum];
-        }
-        /* We use our advance pref to determine how many previews to scan */
-        int hb_num_previews = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue];
-        /* set title to NULL */
-        //fTitle = NULL;
-        hb_scan( fHandle, [path UTF8String], scanTitleNum, hb_num_previews, 1 );
-        [fSrcDVD2Field setStringValue:@"Scanning new source ..."];
-    }
-}
-
-- (IBAction) showNewScan:(id)sender
-{
-    hb_list_t  * list;
-       hb_title_t * title;
-       int indxpri=0;    // Used to search the longuest title (default in combobox)
-       int longuestpri=0; // Used to search the longuest title (default in combobox)
-    
-
-        list = hb_get_titles( fHandle );
-        
-        if( !hb_list_count( list ) )
+        if( !hb_list_count( list ) )
         {
             /* We display a message if a valid dvd source was not chosen */
             [fSrcDVD2Field setStringValue: @"No Valid Source Found"];
@@ -1722,14 +1811,36 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             // Notify Subtitles that there's no title
             [fChapterTitlesDelegate resetWithTitle:nil];
             [fChapterTable reloadData];
+
+                       //      Notify anyone interested (audio controller) that there's no title
+                       [[NSNotificationCenter defaultCenter] postNotification:
+                        [NSNotification notificationWithName: HBTitleChangedNotification
+                                                                                  object: self
+                                                                                userInfo: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                                       [NSData dataWithBytesNoCopy: &fTitle length: sizeof(fTitle) freeWhenDone: NO], keyTitleTag,
+                                                                                                       nil]]];
         }
         else
         {
-            /* We increment the successful scancount here by one,
+            if (applyQueueToScan == YES)
+            {
+                /* we are a rescan of an existing queue item and need to apply the queued settings to the scan */
+                [self writeToActivityLog: "showNewScan: This is a queued item rescan"];
+                
+            }
+            else if (applyQueueToScan == NO)
+            {
+                [self writeToActivityLog: "showNewScan: This is a new source item scan"];
+            }
+            else
+            {
+                [self writeToActivityLog: "showNewScan: cannot grok scan status"];
+            }
+            
+              /* We increment the successful scancount here by one,
              which we use at the end of this function to tell the gui
              if this is the first successful scan since launch and whether
              or not we should set all settings to the defaults */
-            
             currentSuccessfulScanCount++;
             
             [[fWindow toolbar] validateVisibleItems];
@@ -1741,37 +1852,66 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                 
                 currentSource = [NSString stringWithUTF8String: title->name];
                 /*Set DVD Name at top of window with the browsedSourceDisplayName grokked right before -performScan */
+                if (!browsedSourceDisplayName)
+                {
+                    browsedSourceDisplayName = @"NoNameDetected";
+                }
                 [fSrcDVD2Field setStringValue:browsedSourceDisplayName];
                 
-                /* Use the dvd name in the default output field here
-                 May want to add code to remove blank spaces for some dvd names*/
+                // use the correct extension based on the container
+                int format = [fDstFormatPopUp indexOfSelectedItem];
+                char *ext = "mp4";
+                if (format == 1)
+                {
+                    ext = "mkv";
+                }
+                
+                /* If its a queue rescan for edit, get the queue item output path */
+                /* if not, its a new source scan. */
                 /* Check to see if the last destination has been set,use if so, if not, use Desktop */
-                if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"])
+                if (applyQueueToScan == YES)
+                {
+                    [fDstFile2Field setStringValue: [NSString stringWithFormat:@"%@", [[QueueFileArray objectAtIndex:fqueueEditRescanItemNum] objectForKey:@"DestinationPath"]]];
+                }
+                else if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"])
                 {
                     [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                                     @"%@/%@.mp4", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],[browsedSourceDisplayName stringByDeletingPathExtension]]];
+                                                     @"%@/%@.%s", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],[browsedSourceDisplayName stringByDeletingPathExtension],ext]];
                 }
                 else
                 {
                     [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                                     @"%@/Desktop/%@.mp4", NSHomeDirectory(),[browsedSourceDisplayName stringByDeletingPathExtension]]];
+                                                     @"%@/Desktop/%@.%s", NSHomeDirectory(),[browsedSourceDisplayName stringByDeletingPathExtension],ext]];
                 }
                 
+                // set m4v extension if necessary - do not override user-specified .mp4 extension
+                if (format == 0 && applyQueueToScan != YES)
+                {
+                    [self autoSetM4vExtension: sender];
+                }
                 
-                if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds)
+                /* See if this is the main feature according to libhb */
+                if (title->index == title->job->feature)
                 {
-                    longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds;
-                    indxpri=i;
+                    feature_title = i;
                 }
                 
                 [fSrcTitlePopUp addItemWithTitle: [NSString
-                                                   stringWithFormat: @"%d - %02dh%02dm%02ds",
-                                                   title->index, title->hours, title->minutes,
+                                                   stringWithFormat: @"%@ %d - %02dh%02dm%02ds",
+                                                   currentSource, title->index, title->hours, title->minutes,
                                                    title->seconds]];
             }
             
-            // Select the longuest title
-            [fSrcTitlePopUp selectItemAtIndex: indxpri];
+            /* if we are a stream, select the first title */
+            if (title->type == HB_STREAM_TYPE)
+            {
+                [fSrcTitlePopUp selectItemAtIndex: 0];
+            }
+            else
+            {
+                /* if not then select the main feature title */
+                [fSrcTitlePopUp selectItemAtIndex: feature_title];
+            }
             [self titlePopUpChanged:nil];
             
             SuccessfulScan = YES;
@@ -1780,6 +1920,8 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
             /* if its the initial successful scan after awakeFromNib */
             if (currentSuccessfulScanCount == 1)
             {
+                [self encodeStartStopPopUpChanged:nil];
+                
                 [self selectDefaultPreset:nil];
                 
                 // Open preview window now if it was visible when HB was closed
@@ -1791,6 +1933,13 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
                     [self showPicturePanel:nil];
                 
             }
+            if (applyQueueToScan == YES)
+            {
+                /* we are a rescan of an existing queue item and need to apply the queued settings to the scan */
+                [self writeToActivityLog: "showNewScan: calling applyQueueSettingsToMainWindow"];
+                [self applyQueueSettingsToMainWindow:nil];
+                
+            }
 
             
         }
@@ -1841,12 +1990,9 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
 - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
 {
     if( !flag ) {
-        [fWindow  makeKeyAndOrderFront:nil];
-                
-        return YES;
+        [fWindow makeKeyAndOrderFront:nil];
     }
-    
-    return NO;
+    return YES;
 }
 
 - (NSSize) drawerWillResizeContents:(NSDrawer *) drawer toSize:(NSSize) contentSize {
@@ -1863,53 +2009,38 @@ static NSString *        ChooseSourceIdentifier             = @"Choose Source It
        /*We define the location of the user presets file */
     QueueFile = @"~/Library/Application Support/HandBrake/Queue.plist";
        QueueFile = [[QueueFile stringByExpandingTildeInPath]retain];
-    /* We check for the presets.plist */
+    /* We check for the Queue.plist */
        if ([fileManager fileExistsAtPath:QueueFile] == 0)
        {
                [fileManager createFileAtPath:QueueFile contents:nil attributes:nil];
        }
-
+    
        QueueFileArray = [[NSMutableArray alloc] initWithContentsOfFile:QueueFile];
        /* lets check to see if there is anything in the queue file .plist */
     if (nil == QueueFileArray)
        {
         /* if not, then lets initialize an empty array */
                QueueFileArray = [[NSMutableArray alloc] init];
-        
-     /* Initialize our curQueueEncodeIndex to 0
-     * so we can use it to track which queue
-     * item is to be used to track our encodes */
-     /* NOTE: this should be changed if and when we
-      * are able to get the last unfinished encode
-      * in the case of a crash or shutdown */
-    
-       }
+    }
     else
     {
-    [self clearQueueEncodedItems];
+        /* ONLY clear out encoded items if we are single instance */
+        if (hbInstanceNum == 1)
+        {
+            [self clearQueueEncodedItems];
+        }
     }
-    currentQueueEncodeIndex = 0;
 }
 
 - (void)addQueueFileItem
 {
-        [QueueFileArray addObject:[self createQueueFileItem]];
-        [self saveQueueFileItem];
-
+    [QueueFileArray addObject:[self createQueueFileItem]];
+    [self saveQueueFileItem];
+    
 }
 
 - (void) removeQueueFileItem:(int) queueItemToRemove
 {
-   
-   /* Find out if the item we are removing is a cancelled (3) or a finished (0) item*/
-   if ([[[QueueFileArray objectAtIndex:queueItemToRemove] objectForKey:@"Status"] intValue] == 3 || [[[QueueFileArray objectAtIndex:queueItemToRemove] objectForKey:@"Status"] intValue] == 0)
-    {
-    /* Since we are removing a cancelled or finished item, WE need to decrement the currentQueueEncodeIndex
-     * by one to keep in sync with the queue array
-     */
-    currentQueueEncodeIndex--;
-    [self writeToActivityLog: "removeQueueFileItem: Removing a cancelled/finished encode, decrement currentQueueEncodeIndex to %d", currentQueueEncodeIndex];
-    }
     [QueueFileArray removeObjectAtIndex:queueItemToRemove];
     [self saveQueueFileItem];
 
@@ -1953,7 +2084,13 @@ fWorkingCount = 0;
                if ([[thisQueueDict objectForKey:@"Status"] intValue] == 1) // being encoded
                {
                        fWorkingCount++;
-            fEncodingQueueItem = i;    
+            fEncodingQueueItem = i;
+            /* check to see if we are the instance doing this encoding */
+            if ([thisQueueDict objectForKey:@"EncodingPID"] && [[thisQueueDict objectForKey:@"EncodingPID"] intValue] == pidNum)
+            {
+                currentQueueEncodeIndex = i;
+            }
+               
                }
         if ([[thisQueueDict objectForKey:@"Status"] intValue] == 2) // pending         
         {
@@ -1968,17 +2105,45 @@ fWorkingCount = 0;
 
     /* Set the queue status field in the main window */
     NSMutableString * string;
-    if (fPendingCount == 1)
+    if (fPendingCount == 0)
     {
-        string = [NSMutableString stringWithFormat: NSLocalizedString( @"%d encode pending in the queue", @"" ), fPendingCount];
+        string = [NSMutableString stringWithFormat: NSLocalizedString( @"No encode pending", @"" )];
+    }
+    else if (fPendingCount == 1)
+    {
+        string = [NSMutableString stringWithFormat: NSLocalizedString( @"%d encode pending", @"" ), fPendingCount];
     }
     else
     {
-        string = [NSMutableString stringWithFormat: NSLocalizedString( @"%d encode(s) pending in the queue", @"" ), fPendingCount];
+        string = [NSMutableString stringWithFormat: NSLocalizedString( @"%d encodes pending", @"" ), fPendingCount];
     }
     [fQueueStatus setStringValue:string];
 }
 
+/* Used to get the next pending queue item index and return it if found */
+- (int)getNextPendingQueueIndex
+{
+    /* initialize nextPendingIndex to -1, this value tells incrementQueueItemDone that there are no pending items in the queue */
+    int nextPendingIndex = -1;
+       BOOL nextPendingFound = NO;
+    NSEnumerator *enumerator = [QueueFileArray objectEnumerator];
+       id tempObject;
+    int i = 0;
+       while (tempObject = [enumerator nextObject])
+       {
+               NSDictionary *thisQueueDict = tempObject;
+        if ([[thisQueueDict objectForKey:@"Status"] intValue] == 2 && nextPendingFound == NO) // pending               
+        {
+                       nextPendingFound = YES;
+            nextPendingIndex = [QueueFileArray indexOfObject: tempObject];
+            [self writeToActivityLog: "getNextPendingQueueIndex next pending encode index is:%d", nextPendingIndex];
+               }
+        i++;
+       }
+    return nextPendingIndex;
+}
+
+
 /* This method will set any item marked as encoding back to pending
  * currently used right after a queue reload
  */
@@ -1991,15 +2156,19 @@ fWorkingCount = 0;
     /* we look here to see if the preset is we move on to the next one */
     while ( tempObject = [enumerator nextObject] )  
     {
-        /* If the queue item is marked as "encoding" (1)
-         * then change its status back to pending (2) which effectively
-         * puts it back into the queue to be encoded
-         */
-        if ([[tempObject objectForKey:@"Status"] intValue] == 1)
+        /* We want to keep any queue item that is pending or was previously being encoded */
+        if ([[tempObject objectForKey:@"Status"] intValue] == 1 || [[tempObject objectForKey:@"Status"] intValue] == 2)
         {
-            [tempObject setObject:[NSNumber numberWithInt: 2] forKey:@"Status"];
+            /* If the queue item is marked as "encoding" (1)
+             * then change its status back to pending (2) which effectively
+             * puts it back into the queue to be encoded
+             */
+            if ([[tempObject objectForKey:@"Status"] intValue] == 1)
+            {
+                [tempObject setObject:[NSNumber numberWithInt: 2] forKey:@"Status"];
+            }
+            [tempArray addObject:tempObject];
         }
-        [tempArray addObject:tempObject];
     }
     
     [QueueFileArray setArray:tempArray];
@@ -2075,13 +2244,38 @@ fWorkingCount = 0;
     [queueFileJob setObject:[NSNumber numberWithInt:2] forKey:@"Status"];
     /* Source and Destination Information */
     
-    [queueFileJob setObject:[NSString stringWithUTF8String: title->dvd] forKey:@"SourcePath"];
+    [queueFileJob setObject:[NSString stringWithUTF8String: title->path] forKey:@"SourcePath"];
     [queueFileJob setObject:[fSrcDVD2Field stringValue] forKey:@"SourceName"];
     [queueFileJob setObject:[NSNumber numberWithInt:title->index] forKey:@"TitleNumber"];
     [queueFileJob setObject:[NSNumber numberWithInt:[fSrcAnglePopUp indexOfSelectedItem] + 1] forKey:@"TitleAngle"];
-    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcChapterStartPopUp indexOfSelectedItem] + 1] forKey:@"ChapterStart"];
     
+    /* Determine and set a variable to tell hb what start and stop times to use ... chapters vs seconds */
+    if( [fEncodeStartStopPopUp indexOfSelectedItem] == 0 )
+    {
+        [queueFileJob setObject:[NSNumber numberWithInt:0] forKey:@"fEncodeStartStop"];    
+    }
+    else if ([fEncodeStartStopPopUp indexOfSelectedItem] == 1)
+    {
+        [queueFileJob setObject:[NSNumber numberWithInt:1] forKey:@"fEncodeStartStop"];   
+    }
+    else if ([fEncodeStartStopPopUp indexOfSelectedItem] == 2)
+    {
+        [queueFileJob setObject:[NSNumber numberWithInt:2] forKey:@"fEncodeStartStop"];
+    }
+    /* Chapter encode info */
+    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcChapterStartPopUp indexOfSelectedItem] + 1] forKey:@"ChapterStart"];
     [queueFileJob setObject:[NSNumber numberWithInt:[fSrcChapterEndPopUp indexOfSelectedItem] + 1] forKey:@"ChapterEnd"];
+    /* Time (pts) encode info */
+    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcTimeStartEncodingField intValue]] forKey:@"StartSeconds"];
+    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcTimeEndEncodingField intValue] - [fSrcTimeStartEncodingField intValue]] forKey:@"StopSeconds"];
+    /* Frame number encode info */
+    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcFrameStartEncodingField intValue]] forKey:@"StartFrame"];
+    [queueFileJob setObject:[NSNumber numberWithInt:[fSrcFrameEndEncodingField intValue] - [fSrcFrameStartEncodingField intValue]] forKey:@"StopFrame"];
+    
+    
+    /* The number of seek points equals the number of seconds announced in the title as that is our current granularity */
+    int title_duration_seconds = (title->hours * 3600) + (title->minutes * 60) + (title->seconds);
+    [queueFileJob setObject:[NSNumber numberWithInt:title_duration_seconds] forKey:@"SourceTotalSeconds"];
     
     [queueFileJob setObject:[fDstFile2Field stringValue] forKey:@"DestinationPath"];
     
@@ -2138,6 +2332,7 @@ fWorkingCount = 0;
        [queueFileJob setObject:[NSNumber numberWithFloat:[fVidQualityRFField floatValue]] forKey:@"VideoQualitySlider"];
     /* Framerate */
     [queueFileJob setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
+    [queueFileJob setObject:[NSNumber numberWithInt:[fFrameratePfrCheck state]] forKey:@"VideoFrameratePFR"];
     
        /* 2 Pass Encoding */
        [queueFileJob setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
@@ -2151,10 +2346,11 @@ fWorkingCount = 0;
        [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
        [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->keep_ratio] forKey:@"PictureKeepRatio"];
        [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->anamorphic.mode] forKey:@"PicturePAR"];
+    [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->modulus] forKey:@"PictureModulus"];
     /* if we are custom anamorphic, store the exact storage, par and display dims */
     if (fTitle->job->anamorphic.mode == 3)
     {
-        [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->anamorphic.modulus] forKey:@"PicturePARModulus"];
+        [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->modulus] forKey:@"PicturePARModulus"];
         
         [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PicturePARStorageWidth"];
         [queueFileJob setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PicturePARStorageHeight"];
@@ -2195,50 +2391,11 @@ fWorkingCount = 0;
     [queueFileJob setObject:[NSNumber numberWithInt:[fPictureController grayscale]] forKey:@"VideoGrayScale"];
     
     /*Audio*/
-    if ([fAudLang1PopUp indexOfSelectedItem] > 0)
-    {
-        [queueFileJob setObject:[NSNumber numberWithInt:[fAudLang1PopUp indexOfSelectedItem]] forKey:@"Audio1Track"];
-        [queueFileJob setObject:[fAudLang1PopUp titleOfSelectedItem] forKey:@"Audio1TrackDescription"];
-        [queueFileJob setObject:[fAudTrack1CodecPopUp titleOfSelectedItem] forKey:@"Audio1Encoder"];
-        [queueFileJob setObject:[fAudTrack1MixPopUp titleOfSelectedItem] forKey:@"Audio1Mixdown"];
-        [queueFileJob setObject:[fAudTrack1RatePopUp titleOfSelectedItem] forKey:@"Audio1Samplerate"];
-        [queueFileJob setObject:[fAudTrack1BitratePopUp titleOfSelectedItem] forKey:@"Audio1Bitrate"];
-        [queueFileJob setObject:[NSNumber numberWithFloat:[fAudTrack1DrcSlider floatValue]] forKey:@"Audio1TrackDRCSlider"];
-    }
-    if ([fAudLang2PopUp indexOfSelectedItem] > 0)
-    {
-        [queueFileJob setObject:[NSNumber numberWithInt:[fAudLang2PopUp indexOfSelectedItem]] forKey:@"Audio2Track"];
-        [queueFileJob setObject:[fAudLang2PopUp titleOfSelectedItem] forKey:@"Audio2TrackDescription"];
-        [queueFileJob setObject:[fAudTrack2CodecPopUp titleOfSelectedItem] forKey:@"Audio2Encoder"];
-        [queueFileJob setObject:[fAudTrack2MixPopUp titleOfSelectedItem] forKey:@"Audio2Mixdown"];
-        [queueFileJob setObject:[fAudTrack2RatePopUp titleOfSelectedItem] forKey:@"Audio2Samplerate"];
-        [queueFileJob setObject:[fAudTrack2BitratePopUp titleOfSelectedItem] forKey:@"Audio2Bitrate"];
-        [queueFileJob setObject:[NSNumber numberWithFloat:[fAudTrack2DrcSlider floatValue]] forKey:@"Audio2TrackDRCSlider"];
-    }
-    if ([fAudLang3PopUp indexOfSelectedItem] > 0)
-    {
-        [queueFileJob setObject:[NSNumber numberWithInt:[fAudLang3PopUp indexOfSelectedItem]] forKey:@"Audio3Track"];
-        [queueFileJob setObject:[fAudLang3PopUp titleOfSelectedItem] forKey:@"Audio3TrackDescription"];
-        [queueFileJob setObject:[fAudTrack3CodecPopUp titleOfSelectedItem] forKey:@"Audio3Encoder"];
-        [queueFileJob setObject:[fAudTrack3MixPopUp titleOfSelectedItem] forKey:@"Audio3Mixdown"];
-        [queueFileJob setObject:[fAudTrack3RatePopUp titleOfSelectedItem] forKey:@"Audio3Samplerate"];
-        [queueFileJob setObject:[fAudTrack3BitratePopUp titleOfSelectedItem] forKey:@"Audio3Bitrate"];
-        [queueFileJob setObject:[NSNumber numberWithFloat:[fAudTrack3DrcSlider floatValue]] forKey:@"Audio3TrackDRCSlider"];
-    }
-    if ([fAudLang4PopUp indexOfSelectedItem] > 0)
-    {
-        [queueFileJob setObject:[NSNumber numberWithInt:[fAudLang4PopUp indexOfSelectedItem]] forKey:@"Audio4Track"];
-        [queueFileJob setObject:[fAudLang4PopUp titleOfSelectedItem] forKey:@"Audio4TrackDescription"];
-        [queueFileJob setObject:[fAudTrack4CodecPopUp titleOfSelectedItem] forKey:@"Audio4Encoder"];
-        [queueFileJob setObject:[fAudTrack4MixPopUp titleOfSelectedItem] forKey:@"Audio4Mixdown"];
-        [queueFileJob setObject:[fAudTrack4RatePopUp titleOfSelectedItem] forKey:@"Audio4Samplerate"];
-        [queueFileJob setObject:[fAudTrack4BitratePopUp titleOfSelectedItem] forKey:@"Audio4Bitrate"];
-        [queueFileJob setObject:[NSNumber numberWithFloat:[fAudTrack4DrcSlider floatValue]] forKey:@"Audio4TrackDRCSlider"];
-    }
+       [fAudioDelegate prepareAudioForQueueFileJob: queueFileJob];     
     
        /* Subtitles*/
-    NSMutableArray *subtitlesArray = [[NSMutableArray alloc] init];
-    [queueFileJob setObject:[NSArray arrayWithArray: [fSubtitlesDelegate getSubtitleArray: subtitlesArray]] forKey:@"SubtitleList"];
+    NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesDelegate getSubtitleArray] copyItems:YES];
+    [queueFileJob setObject:[NSArray arrayWithArray: subtitlesArray] forKey:@"SubtitleList"];
     [subtitlesArray autorelease];
 
     /* Now we go ahead and set the "job->values in the plist for passing right to fQueueEncodeLibhb */
@@ -2275,41 +2432,7 @@ fWorkingCount = 0;
        [queueFileJob setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
     
     
-    /*Audio*/
-    if ([fAudLang1PopUp indexOfSelectedItem] > 0)
-    {
-        //[queueFileJob setObject:[fAudTrack1CodecPopUp indexOfSelectedItem] forKey:@"JobAudio1Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack1CodecPopUp selectedItem] tag]] forKey:@"JobAudio1Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack1MixPopUp selectedItem] tag]] forKey:@"JobAudio1Mixdown"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack1RatePopUp selectedItem] tag]] forKey:@"JobAudio1Samplerate"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack1BitratePopUp selectedItem] tag]] forKey:@"JobAudio1Bitrate"];
-     }
-    if ([fAudLang2PopUp indexOfSelectedItem] > 0)
-    {
-        //[queueFileJob setObject:[fAudTrack1CodecPopUp indexOfSelectedItem] forKey:@"JobAudio2Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack2CodecPopUp selectedItem] tag]] forKey:@"JobAudio2Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack2MixPopUp selectedItem] tag]] forKey:@"JobAudio2Mixdown"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack2RatePopUp selectedItem] tag]] forKey:@"JobAudio2Samplerate"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack2BitratePopUp selectedItem] tag]] forKey:@"JobAudio2Bitrate"];
-    }
-    if ([fAudLang3PopUp indexOfSelectedItem] > 0)
-    {
-        //[queueFileJob setObject:[fAudTrack1CodecPopUp indexOfSelectedItem] forKey:@"JobAudio3Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack3CodecPopUp selectedItem] tag]] forKey:@"JobAudio3Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack3MixPopUp selectedItem] tag]] forKey:@"JobAudio3Mixdown"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack3RatePopUp selectedItem] tag]] forKey:@"JobAudio3Samplerate"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack3BitratePopUp selectedItem] tag]] forKey:@"JobAudio3Bitrate"];
-    }
-    if ([fAudLang4PopUp indexOfSelectedItem] > 0)
-    {
-        //[queueFileJob setObject:[fAudTrack1CodecPopUp indexOfSelectedItem] forKey:@"JobAudio4Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack4CodecPopUp selectedItem] tag]] forKey:@"JobAudio4Encoder"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack4MixPopUp selectedItem] tag]] forKey:@"JobAudio4Mixdown"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack4RatePopUp selectedItem] tag]] forKey:@"JobAudio4Samplerate"];
-        [queueFileJob setObject:[NSNumber numberWithInt:[[fAudTrack4BitratePopUp selectedItem] tag]] forKey:@"JobAudio4Bitrate"];
-    }
 
     /* we need to auto relase the queueFileJob and return it */
     [queueFileJob autorelease];
     return queueFileJob;
@@ -2355,54 +2478,61 @@ fWorkingCount = 0;
 
 - (void) incrementQueueItemDone:(int) queueItemDoneIndexNum
 {
-    int i = currentQueueEncodeIndex;
-    [[QueueFileArray objectAtIndex:i] setObject:[NSNumber numberWithInt:0] forKey:@"Status"];
+    /* Mark the encode just finished as done (status 0)*/
+    [[QueueFileArray objectAtIndex:currentQueueEncodeIndex] setObject:[NSNumber numberWithInt:0] forKey:@"Status"];
        
     /* We save all of the Queue data here */
     [self saveQueueFileItem];
-       /* We Reload the New Table data for presets */
-    //[fPresetsOutlineView reloadData];
 
     /* Since we have now marked a queue item as done
      * we can go ahead and increment currentQueueEncodeIndex 
      * so that if there is anything left in the queue we can
      * go ahead and move to the next item if we want to */
-    currentQueueEncodeIndex++ ;
-    [self writeToActivityLog: "incrementQueueItemDone currentQueueEncodeIndex is incremented to: %d", currentQueueEncodeIndex];
     int queueItems = [QueueFileArray count];
-    /* If we still have more items in our queue, lets go to the next one */
-    if (currentQueueEncodeIndex < queueItems)
-    {
-    [self writeToActivityLog: "incrementQueueItemDone currentQueueEncodeIndex is incremented to: %d", currentQueueEncodeIndex];
-    [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]];
+    /* Check to see if there are any more pending items in the queue */
+    int newQueueItemIndex = [self getNextPendingQueueIndex];
+    /* If we still have more pending items in our queue, lets go to the next one */
+    if (newQueueItemIndex >= 0 && newQueueItemIndex < queueItems)
+    {
+        /*Set our currentQueueEncodeIndex now to the newly found Pending encode as we own it */
+        currentQueueEncodeIndex = newQueueItemIndex;
+        /* now we mark the queue item as Status = 1 ( being encoded ) so another instance can not come along and try to scan it while we are scanning */
+        [[QueueFileArray objectAtIndex:currentQueueEncodeIndex] setObject:[NSNumber numberWithInt:1] forKey:@"Status"];
+        [self writeToActivityLog: "incrementQueueItemDone new pending items found: %d", currentQueueEncodeIndex];
+        [self saveQueueFileItem];
+        /* now we can go ahead and scan the new pending queue item */
+        [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]];
+
     }
     else
     {
-        [self writeToActivityLog: "incrementQueueItemDone the %d item queue is complete", currentQueueEncodeIndex - 1];
+        [self writeToActivityLog: "incrementQueueItemDone there are no more pending encodes"];
+        /*Since there are no more items to encode, go to queueCompletedAlerts for user specified alerts after queue completed*/
+        [self queueCompletedAlerts];
     }
 }
 
 /* Here we actually tell hb_scan to perform the source scan, using the path to source and title number*/
 - (void) performNewQueueScan:(NSString *) scanPath scanTitleNum: (int) scanTitleNum
 {
-   /* Tell HB to output a new activity log file for this encode */
+    /* Tell HB to output a new activity log file for this encode */
     [outputPanel startEncodeLog:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"DestinationPath"]];
     
+    /* We now flag the queue item as being owned by this instance of HB using the PID */
+    [[QueueFileArray objectAtIndex:currentQueueEncodeIndex] setObject:[NSNumber numberWithInt:pidNum] forKey:@"EncodingPID"];
+    /* Get the currentQueueEncodeNameString from the queue item to display in the status field */
+    currentQueueEncodeNameString = [[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"DestinationPath"] lastPathComponent]retain];
+    /* We save all of the Queue data here */
+    [self saveQueueFileItem];
     
-     /* use a bool to determine whether or not we can decrypt using vlc */
+    /* use a bool to determine whether or not we can decrypt using vlc */
     BOOL cancelScanDecrypt = 0;
     /* set the bool so that showNewScan knows to apply the appropriate queue
-    * settings as this is a queue rescan
-    */
-    applyQueueToScan = YES;
+     * settings as this is a queue rescan
+     */
     NSString *path = scanPath;
     HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
-
-        /*On Screen Notification*/
-        //int status;
-        //status = NSRunAlertPanel(@"HandBrake is now loading up a new queue item...",@"Would You Like to wait until you add another encode?", @"Cancel", @"Okay", nil);
-        //[NSApp requestUserAttention:NSCriticalRequest];
-
+    
     if( [detector isVideoDVD] )
     {
         // The chosen path was actually on a DVD, so use the raw block
@@ -2411,10 +2541,9 @@ fWorkingCount = 0;
         [self writeToActivityLog: "trying to open a physical dvd at: %s", [scanPath UTF8String]];
 
         /* lets check for vlc here to make sure we have a dylib available to use for decrypting */
-        NSString *vlcPath = @"/Applications/VLC.app";
-        NSFileManager * fileManager = [NSFileManager defaultManager];
-           if ([fileManager fileExistsAtPath:vlcPath] == 0) 
-           {
+        void *dvdcss = dlopen("libdvdcss.2.dylib", RTLD_LAZY);
+        if (dvdcss == NULL) 
+        {
             /*vlc not found in /Applications so we set the bool to cancel scanning to 1 */
             cancelScanDecrypt = 1;
             [self writeToActivityLog: "VLC app not found for decrypting physical dvd"];
@@ -2443,6 +2572,7 @@ fWorkingCount = 0;
         else
         {
             /* VLC was found in /Applications so all is well, we can carry on using vlc's libdvdcss.dylib for decrypting if needed */
+            dlclose(dvdcss);
             [self writeToActivityLog: "VLC app found for decrypting physical dvd"];
         }
     }
@@ -2462,311 +2592,29 @@ fWorkingCount = 0;
             [self writeToActivityLog: "scanning specifically for title: %d", scanTitleNum];
         }
         
-        [self writeToActivityLog: "performNewQueueScan currentQueueEncodeIndex is: %d", currentQueueEncodeIndex];
-        /* We use our advance pref to determine how many previews to scan */
-        int hb_num_previews = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue];
-        hb_scan( fQueueEncodeLibhb, [path UTF8String], scanTitleNum, hb_num_previews, 0 );
+        /* Only scan 10 previews before an encode - additional previews are only useful for autocrop and static previews,
+         * which are already taken care of at this point */
+        hb_scan( fQueueEncodeLibhb, [path UTF8String], scanTitleNum, 10, 0, 0 );
     }
 }
 
-/* This method was originally used to load up a new queue item in the gui and
- * then start processing it. However we now have modified -prepareJob and use a second
- * instance of libhb to do our actual encoding, therefor right now it is not required. 
- * Nonetheless I want to leave this in here
- * because basically its everything we need to be able to actually modify a pending queue
- * item in the gui and resave it. At least for now - dynaflash
- */
-
-- (IBAction)applyQueueSettings:(id)sender
+/* This assumes that we have re-scanned and loaded up a new queue item to send to libhb as fQueueEncodeLibhb */
+- (void) processNewQueueEncode
 {
-    NSMutableDictionary * queueToApply = [QueueFileArray objectAtIndex:currentQueueEncodeIndex];
-    hb_job_t * job = fTitle->job;
-    
-    /* Set title number and chapters */
-    /* since the queue only scans a single title, we really don't need to pick a title */
-    //[fSrcTitlePopUp selectItemAtIndex: [[queueToApply objectForKey:@"TitleNumber"] intValue] - 1];
-    
-    [fSrcChapterStartPopUp selectItemAtIndex: [[queueToApply objectForKey:@"ChapterStart"] intValue] - 1];
-    [fSrcChapterEndPopUp selectItemAtIndex: [[queueToApply objectForKey:@"ChapterEnd"] intValue] - 1];
-    
-    /* File Format */
-    [fDstFormatPopUp selectItemWithTitle:[queueToApply objectForKey:@"FileFormat"]];
-    [self formatPopUpChanged:nil];
-    
-    /* Chapter Markers*/
-    [fCreateChapterMarkers setState:[[queueToApply objectForKey:@"ChapterMarkers"] intValue]];
-    /* Allow Mpeg4 64 bit formatting +4GB file sizes */
-    [fDstMp4LargeFileCheck setState:[[queueToApply objectForKey:@"Mp4LargeFile"] intValue]];
-    /* Mux mp4 with http optimization */
-    [fDstMp4HttpOptFileCheck setState:[[queueToApply objectForKey:@"Mp4HttpOptimize"] intValue]];
-    
-    /* Video encoder */
-    /* We set the advanced opt string here if applicable*/
-    [fVidEncoderPopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoEncoder"]];
-    [fAdvancedOptions setOptions:[queueToApply objectForKey:@"x264Option"]];
-    
-    /* Lets run through the following functions to get variables set there */
-    [self videoEncoderPopUpChanged:nil];
-    /* Set the state of ipod compatible with Mp4iPodCompatible. Only for x264*/
-    [fDstMp4iPodFileCheck setState:[[queueToApply objectForKey:@"Mp4iPodCompatible"] intValue]];
-    [self calculateBitrate:nil];
-    
-    /* Video quality */
-    [fVidQualityMatrix selectCellAtRow:[[queueToApply objectForKey:@"VideoQualityType"] intValue] column:0];
-    
-    [fVidTargetSizeField setStringValue:[queueToApply objectForKey:@"VideoTargetSize"]];
-    [fVidBitrateField setStringValue:[queueToApply objectForKey:@"VideoAvgBitrate"]];
-    [fVidQualitySlider setFloatValue:[[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]];
-    
-    [self videoMatrixChanged:nil];
+    hb_list_t  * list  = hb_get_titles( fQueueEncodeLibhb );
+    hb_title_t * title = (hb_title_t *) hb_list_item( list,0 ); // is always zero since now its a single title scan
+    hb_job_t * job = title->job;
     
-    /* Video framerate */
-    /* For video preset video framerate, we want to make sure that Same as source does not conflict with the
-     detected framerate in the fVidRatePopUp so we use index 0*/
-    if ([[queueToApply objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"])
-    {
-        [fVidRatePopUp selectItemAtIndex: 0];
-    }
-    else
+    if( !hb_list_count( list ) )
     {
-        [fVidRatePopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoFramerate"]];
+        [self writeToActivityLog: "processNewQueueEncode WARNING nothing found in the title list"];
     }
     
-    /* 2 Pass Encoding */
-    [fVidTwoPassCheck setState:[[queueToApply objectForKey:@"VideoTwoPass"] intValue]];
-    [self twoPassCheckboxChanged:nil];
-    /* Turbo 1st pass for 2 Pass Encoding */
-    [fVidTurboPassCheck setState:[[queueToApply objectForKey:@"VideoTurboTwoPass"] intValue]];
-    
-    /*Audio*/
-    if ([queueToApply objectForKey:@"Audio1Track"] > 0)
-    {
-        if ([fAudLang1PopUp indexOfSelectedItem] == 0)
-        {
-            [fAudLang1PopUp selectItemAtIndex: 1];
-        }
-        [self audioTrackPopUpChanged: fAudLang1PopUp];
-        [fAudTrack1CodecPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio1Encoder"]];
-        [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
-        [fAudTrack1MixPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio1Mixdown"]];
-        /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-         * mixdown*/
-        if  ([fAudTrack1MixPopUp selectedItem] == nil)
-        {
-            [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
-        }
-        [fAudTrack1RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Samplerate"]];
-        /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-        if (![[queueToApply objectForKey:@"Audio1Encoder"] isEqualToString:@"AC3 Passthru"])
-        {
-            [fAudTrack1BitratePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio1Bitrate"]];
-        }
-        [fAudTrack1DrcSlider setFloatValue:[[queueToApply objectForKey:@"Audio1TrackDRCSlider"] floatValue]];
-        [self audioDRCSliderChanged: fAudTrack1DrcSlider];
-    }
-    if ([queueToApply objectForKey:@"Audio2Track"] > 0)
-    {
-        if ([fAudLang2PopUp indexOfSelectedItem] == 0)
-        {
-            [fAudLang2PopUp selectItemAtIndex: 1];
-        }
-        [self audioTrackPopUpChanged: fAudLang2PopUp];
-        [fAudTrack2CodecPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio2Encoder"]];
-        [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
-        [fAudTrack2MixPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio2Mixdown"]];
-        /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-         * mixdown*/
-        if  ([fAudTrack2MixPopUp selectedItem] == nil)
-        {
-            [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
-        }
-        [fAudTrack2RatePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio2Samplerate"]];
-        /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-        if (![[queueToApply objectForKey:@"Audio2Encoder"] isEqualToString:@"AC3 Passthru"])
-        {
-            [fAudTrack2BitratePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio2Bitrate"]];
-        }
-        [fAudTrack2DrcSlider setFloatValue:[[queueToApply objectForKey:@"Audio2TrackDRCSlider"] floatValue]];
-        [self audioDRCSliderChanged: fAudTrack2DrcSlider];
-    }
-    if ([queueToApply objectForKey:@"Audio3Track"] > 0)
-    {
-        if ([fAudLang3PopUp indexOfSelectedItem] == 0)
-        {
-            [fAudLang3PopUp selectItemAtIndex: 1];
-        }
-        [self audioTrackPopUpChanged: fAudLang3PopUp];
-        [fAudTrack3CodecPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio3Encoder"]];
-        [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
-        [fAudTrack3MixPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio3Mixdown"]];
-        /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-         * mixdown*/
-        if  ([fAudTrack3MixPopUp selectedItem] == nil)
-        {
-            [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
-        }
-        [fAudTrack3RatePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio3Samplerate"]];
-        /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-        if (![[queueToApply objectForKey:@"Audio3Encoder"] isEqualToString: @"AC3 Passthru"])
-        {
-            [fAudTrack3BitratePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio3Bitrate"]];
-        }
-        [fAudTrack3DrcSlider setFloatValue:[[queueToApply objectForKey:@"Audio3TrackDRCSlider"] floatValue]];
-        [self audioDRCSliderChanged: fAudTrack3DrcSlider];
-    }
-    if ([queueToApply objectForKey:@"Audio4Track"] > 0)
-    {
-        if ([fAudLang4PopUp indexOfSelectedItem] == 0)
-        {
-            [fAudLang4PopUp selectItemAtIndex: 1];
-        }
-        [self audioTrackPopUpChanged: fAudLang4PopUp];
-        [fAudTrack4CodecPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio4Encoder"]];
-        [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
-        [fAudTrack4MixPopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio4Mixdown"]];
-        /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-         * mixdown*/
-        if  ([fAudTrack4MixPopUp selectedItem] == nil)
-        {
-            [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
-        }
-        [fAudTrack4RatePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio4Samplerate"]];
-        /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-        if (![[chosenPreset objectForKey:@"Audio4Encoder"] isEqualToString:@"AC3 Passthru"])
-        {
-            [fAudTrack4BitratePopUp selectItemWithTitle:[queueToApply objectForKey:@"Audio4Bitrate"]];
-        }
-        [fAudTrack4DrcSlider setFloatValue:[[queueToApply objectForKey:@"Audio4TrackDRCSlider"] floatValue]];
-        [self audioDRCSliderChanged: fAudTrack4DrcSlider];
-    }
-    
-    
-    /*Subtitles*/
-    [fSubPopUp selectItemWithTitle:[queueToApply objectForKey:@"Subtitles"]];
-    /* Forced Subtitles */
-    [fSubForcedCheck setState:[[queueToApply objectForKey:@"SubtitlesForced"] intValue]];
-    
-    /* Picture Settings */
-    /* we check to make sure the presets width/height does not exceed the sources width/height */
-    if (fTitle->width < [[queueToApply objectForKey:@"PictureWidth"]  intValue] || fTitle->height < [[queueToApply objectForKey:@"PictureHeight"]  intValue])
-    {
-        /* if so, then we use the sources height and width to avoid scaling up */
-        job->width = fTitle->width;
-        job->height = fTitle->height;
-    }
-    else // source width/height is >= the preset height/width
-    {
-        /* we can go ahead and use the presets values for height and width */
-        job->width = [[queueToApply objectForKey:@"PictureWidth"]  intValue];
-        job->height = [[queueToApply objectForKey:@"PictureHeight"]  intValue];
-    }
-    job->keep_ratio = [[queueToApply objectForKey:@"PictureKeepRatio"]  intValue];
-    if (job->keep_ratio == 1)
-    {
-        hb_fix_aspect( job, HB_KEEP_WIDTH );
-        if( job->height > fTitle->height )
-        {
-            job->height = fTitle->height;
-            hb_fix_aspect( job, HB_KEEP_HEIGHT );
-        }
-    }
-    job->anamorphic.mode = [[queueToApply objectForKey:@"PicturePAR"]  intValue];
-    
-    
-    /* If Cropping is set to custom, then recall all four crop values from
-     when the preset was created and apply them */
-    if ([[queueToApply objectForKey:@"PictureAutoCrop"]  intValue] == 0)
-    {
-        [fPictureController setAutoCrop:NO];
-        
-        /* Here we use the custom crop values saved at the time the preset was saved */
-        job->crop[0] = [[queueToApply objectForKey:@"PictureTopCrop"]  intValue];
-        job->crop[1] = [[queueToApply objectForKey:@"PictureBottomCrop"]  intValue];
-        job->crop[2] = [[queueToApply objectForKey:@"PictureLeftCrop"]  intValue];
-        job->crop[3] = [[queueToApply objectForKey:@"PictureRightCrop"]  intValue];
-        
-    }
-    else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
-    {
-        [fPictureController setAutoCrop:YES];
-        /* Here we use the auto crop values determined right after scan */
-        job->crop[0] = AutoCropTop;
-        job->crop[1] = AutoCropBottom;
-        job->crop[2] = AutoCropLeft;
-        job->crop[3] = AutoCropRight;
-        
-    }
-    
-    /* Filters */
-    /* Deinterlace */
-    [fPictureController setDeinterlace:[[queueToApply objectForKey:@"PictureDeinterlace"] intValue]];
-    
-    /* Detelecine */
-    [fPictureController setDetelecine:[[queueToApply objectForKey:@"PictureDetelecine"] intValue]];
-    /* Denoise */
-    [fPictureController setDenoise:[[queueToApply objectForKey:@"PictureDenoise"] intValue]];
-    /* Deblock */
-    [fPictureController setDeblock:[[queueToApply objectForKey:@"PictureDeblock"] intValue]];
-    /* Decomb */
-    [fPictureController setDecomb:[[queueToApply objectForKey:@"PictureDecomb"] intValue]];
-    /* Grayscale */
-    [fPictureController setGrayscale:[[queueToApply objectForKey:@"VideoGrayScale"] intValue]];
-    
-    [self calculatePictureSizing:nil];
-    
-    
-    /* somehow we need to figure out a way to tie the queue item to a preset if it used one */
-    //[queueFileJob setObject:[fPresetSelectedDisplay stringValue] forKey:@"PresetName"];
-    //    [queueFileJob setObject:[NSNumber numberWithInt:[fPresetsOutlineView selectedRow]] forKey:@"PresetIndexNum"];
-    if ([queueToApply objectForKey:@"PresetIndexNum"]) // This item used a preset so insert that info
-       {
-               /* Deselect the currently selected Preset if there is one*/
-        //[fPresetsOutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:[[queueToApply objectForKey:@"PresetIndexNum"] intValue]] byExtendingSelection:NO];
-        //[self selectPreset:nil];
-               
-        //[fPresetsOutlineView selectRow:[[queueToApply objectForKey:@"PresetIndexNum"] intValue]];
-               /* Change UI to show "Custom" settings are being used */
-               //[fPresetSelectedDisplay setStringValue: [[queueToApply objectForKey:@"PresetName"] stringValue]];
-        
-               curUserPresetChosenNum = nil;
-       }
-    else
-    {
-        /* Deselect the currently selected Preset if there is one*/
-               [fPresetsOutlineView deselectRow:[fPresetsOutlineView selectedRow]];
-               /* Change UI to show "Custom" settings are being used */
-               [fPresetSelectedDisplay setStringValue: @"Custom"];
-        
-               //curUserPresetChosenNum = nil;
-    }
-    
-    /* We need to set this bool back to NO, in case the user wants to do a scan */
-    //applyQueueToScan = NO;
-    
-    /* so now we go ahead and process the new settings */
-    [self processNewQueueEncode];
-}
-
-
-
-/* This assumes that we have re-scanned and loaded up a new queue item to send to libhb as fQueueEncodeLibhb */
-- (void) processNewQueueEncode
-{
-    hb_list_t  * list  = hb_get_titles( fQueueEncodeLibhb );
-    hb_title_t * title = (hb_title_t *) hb_list_item( list,0 ); // is always zero since now its a single title scan
-    hb_job_t * job = title->job;
-    
-    if( !hb_list_count( list ) )
-    {
-        [self writeToActivityLog: "processNewQueueEncode WARNING nothing found in the title list"];
-    }
-    
-    NSMutableDictionary * queueToApply = [QueueFileArray objectAtIndex:currentQueueEncodeIndex];
-    [self writeToActivityLog: "Preset: %s", [[queueToApply objectForKey:@"PresetName"] UTF8String]];
-    [self writeToActivityLog: "processNewQueueEncode number of passes expected is: %d", ([[queueToApply objectForKey:@"VideoTwoPass"] intValue] + 1)];
-    job->file = [[queueToApply objectForKey:@"DestinationPath"] UTF8String];
-    //[self writeToActivityLog: "processNewQueueEncode sending to prepareJob"];
-    [self prepareJob];
+    NSMutableDictionary * queueToApply = [QueueFileArray objectAtIndex:currentQueueEncodeIndex];
+    [self writeToActivityLog: "Preset: %s", [[queueToApply objectForKey:@"PresetName"] UTF8String]];
+    [self writeToActivityLog: "processNewQueueEncode number of passes expected is: %d", ([[queueToApply objectForKey:@"VideoTwoPass"] intValue] + 1)];
+    job->file = [[queueToApply objectForKey:@"DestinationPath"] UTF8String];
+    [self prepareJob];
     
     /*
      * If scanning we need to do some extra setup of the job.
@@ -2840,85 +2688,399 @@ fWorkingCount = 0;
         free(subtitle);
     }
     
-    
     /* We should be all setup so let 'er rip */   
     [self doRip];
 }
 
 #pragma mark -
-#pragma mark Live Preview
-/* Note,this is much like prepareJob, but directly sets the job vars so Picture Preview
- * can encode to its temp preview directory and playback. This is *not* used for any actual user
- * encodes
- */
-- (void) prepareJobForPreview
-{
-    hb_list_t  * list  = hb_get_titles( fHandle );
-    hb_title_t * title = (hb_title_t *) hb_list_item( list,
-            [fSrcTitlePopUp indexOfSelectedItem] );
-    hb_job_t * job = title->job;
-    hb_audio_config_t * audio;
-    /* set job->angle for libdvdnav */
-    job->angle = [fSrcAnglePopUp indexOfSelectedItem] + 1;
-    /* Chapter selection */
-    job->chapter_start = [fSrcChapterStartPopUp indexOfSelectedItem] + 1;
-    job->chapter_end   = [fSrcChapterEndPopUp   indexOfSelectedItem] + 1;
-       
-    /* Format (Muxer) and Video Encoder */
-    job->mux = [[fDstFormatPopUp selectedItem] tag];
-    job->vcodec = [[fVidEncoderPopUp selectedItem] tag];
+#pragma mark Queue Item Editing
 
-    job->chapter_markers = 0;
-    
-       if( job->vcodec & HB_VCODEC_X264 )
-    {
-               
-               /* Below Sends x264 options to the core library if x264 is selected*/
-               /* Lets use this as per Nyx, Thanks Nyx!*/
-               job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */
-               /* For previews we ignore the turbo option for the first pass of two since we only use 1 pass */
-               strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
+/* Rescans the chosen queue item back into the main window */
+- (void)rescanQueueItemToMainWindow:(NSString *) scanPath scanTitleNum: (int) scanTitleNum selectedQueueItem: (int) selectedQueueItem
+{
+    fqueueEditRescanItemNum = selectedQueueItem;
+    [self writeToActivityLog: "rescanQueueItemToMainWindow: Re-scanning queue item at index:%d",fqueueEditRescanItemNum];
+    applyQueueToScan = YES;
+    /* Make sure we release the display name before reassigning it */
+    [browsedSourceDisplayName release];
+    /* Set the browsedSourceDisplayName for showNewScan */
+    browsedSourceDisplayName = [[[QueueFileArray objectAtIndex:fqueueEditRescanItemNum] objectForKey:@"SourceName"] retain];
+    [self performScan:scanPath scanTitleNum:scanTitleNum];
+}
 
-        
-    }
 
-    /* Video settings */
-   /* Set vfr to 0 as it's only on if using same as source in the framerate popup
-     * and detelecine is on, so we handle that in the logic below
-     */
-    job->vfr = 0;
-    if( [fVidRatePopUp indexOfSelectedItem] > 0 )
+/* We use this method after a queue item rescan for edit.
+ * it largely mirrors -selectPreset in terms of structure.
+ * Assumes that a queue item has been reloaded into the main window.
+ */
+- (IBAction)applyQueueSettingsToMainWindow:(id)sender
+{
+    NSMutableDictionary * queueToApply = [QueueFileArray objectAtIndex:fqueueEditRescanItemNum];
+    hb_job_t * job = fTitle->job;
+    if (queueToApply)
     {
-        /* a specific framerate has been chosen */
-        job->vrate      = 27000000;
-        job->vrate_base = hb_video_rates[[fVidRatePopUp indexOfSelectedItem]-1].rate;
-        /* We are not same as source so we set job->cfr to 1 
-         * to enable constant frame rate since user has specified
-         * a specific framerate*/
-        job->cfr = 1;
+        [self writeToActivityLog: "applyQueueSettingsToMainWindow: queue item found"];
+    }
+    /* Set title number and chapters */
+    /* since the queue only scans a single title, its already been selected in showNewScan
+       so do not try to reset it here. However if we do decide to do full source scans on
+       a queue edit rescan, we would need it. So leaving in for now but commenting out. */
+    //[fSrcTitlePopUp selectItemAtIndex: [[queueToApply objectForKey:@"TitleNumber"] intValue] - 1];
+    
+    [fSrcChapterStartPopUp selectItemAtIndex: [[queueToApply objectForKey:@"ChapterStart"] intValue] - 1];
+    [fSrcChapterEndPopUp selectItemAtIndex: [[queueToApply objectForKey:@"ChapterEnd"] intValue] - 1];
+    
+    /* File Format */
+    [fDstFormatPopUp selectItemWithTitle:[queueToApply objectForKey:@"FileFormat"]];
+    [self formatPopUpChanged:nil];
+    
+    /* Chapter Markers*/
+    [fCreateChapterMarkers setState:[[queueToApply objectForKey:@"ChapterMarkers"] intValue]];
+    /* Allow Mpeg4 64 bit formatting +4GB file sizes */
+    [fDstMp4LargeFileCheck setState:[[queueToApply objectForKey:@"Mp4LargeFile"] intValue]];
+    /* Mux mp4 with http optimization */
+    [fDstMp4HttpOptFileCheck setState:[[queueToApply objectForKey:@"Mp4HttpOptimize"] intValue]];
+    
+    /* Video encoder */
+    /* We set the advanced opt string here if applicable*/
+    [fVidEncoderPopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoEncoder"]];
+    [fAdvancedOptions setOptions:[queueToApply objectForKey:@"x264Option"]];
+    
+    /* Lets run through the following functions to get variables set there */
+    [self videoEncoderPopUpChanged:nil];
+    /* Set the state of ipod compatible with Mp4iPodCompatible. Only for x264*/
+    [fDstMp4iPodFileCheck setState:[[queueToApply objectForKey:@"Mp4iPodCompatible"] intValue]];
+    [self calculateBitrate:nil];
+    
+    /* Video quality */
+    [fVidQualityMatrix selectCellAtRow:[[queueToApply objectForKey:@"VideoQualityType"] intValue] column:0];
+    
+    [fVidTargetSizeField setStringValue:[queueToApply objectForKey:@"VideoTargetSize"]];
+    [fVidBitrateField setStringValue:[queueToApply objectForKey:@"VideoAvgBitrate"]];
+    /* Since we are now using RF Values for the slider, we detect if the preset uses an old quality float.
+     * So, check to see if the quality value is less than 1.0 which should indicate the old ".062" type
+     * quality preset. Caveat: in the case of x264, where the RF scale starts at 0, it would misinterpret
+     * a preset that uses 0.0 - 0.99 for RF as an old style preset. Not sure how to get around that one yet,
+     * though it should be a corner case since it would pretty much be a preset for lossless encoding. */
+    if ([[queueToApply objectForKey:@"VideoQualitySlider"] floatValue] < 1.0)
+    {
+        /* For the quality slider we need to convert the old percent's to the new rf scales */
+        float rf =  (([fVidQualitySlider maxValue] - [fVidQualitySlider minValue]) * [[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]);
+        [fVidQualitySlider setFloatValue:rf];
+        
     }
     else
     {
-        /* We are same as source (variable) */
-        job->vrate      = title->rate;
-        job->vrate_base = title->rate_base;
-        /* We are same as source so we set job->cfr to 0 
-         * to enable true same as source framerate */
-        job->cfr = 0;
-        /* If we are same as source and we have detelecine on, we need to turn on
-         * job->vfr
-         */
-        if ([fPictureController detelecine] == 1)
+        /* Since theora's qp value goes up from left to right, we can just set the slider float value */
+        if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_THEORA)
         {
-            job->vfr = 1;
+            [fVidQualitySlider setFloatValue:[[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]];
+        }
+        else
+        {
+            /* since ffmpeg and x264 use an "inverted" slider (lower qp/rf values indicate a higher quality) we invert the value on the slider */
+            [fVidQualitySlider setFloatValue:([fVidQualitySlider maxValue] + [fVidQualitySlider minValue]) - [[queueToApply objectForKey:@"VideoQualitySlider"] floatValue]];
         }
     }
-
-    switch( [fVidQualityMatrix selectedRow] )
+    
+    [self videoMatrixChanged:nil];
+        
+    /* Video framerate */
+    /* For video preset video framerate, we want to make sure that Same as source does not conflict with the
+     detected framerate in the fVidRatePopUp so we use index 0*/
+    if ([[queueToApply objectForKey:@"VideoFramerate"] isEqualToString:@"Same as source"])
     {
-        case 0:
-            /* Target size.
-               Bitrate should already have been calculated and displayed
+        [fVidRatePopUp selectItemAtIndex: 0];
+    }
+    else
+    {
+        [fVidRatePopUp selectItemWithTitle:[queueToApply objectForKey:@"VideoFramerate"]];
+    }
+    
+    /* 2 Pass Encoding */
+    [fVidTwoPassCheck setState:[[queueToApply objectForKey:@"VideoTwoPass"] intValue]];
+    [self twoPassCheckboxChanged:nil];
+    /* Turbo 1st pass for 2 Pass Encoding */
+    [fVidTurboPassCheck setState:[[queueToApply objectForKey:@"VideoTurboTwoPass"] intValue]];
+    
+    /*Audio*/
+    
+    
+    /* Now lets add our new tracks to the audio list here */
+       [fAudioDelegate addTracksFromQueue: queueToApply];
+    
+    /*Subtitles*/
+    /* Crashy crashy right now, working on it */
+    [fSubtitlesDelegate setNewSubtitles:[queueToApply objectForKey:@"SubtitleList"]];
+    [fSubtitlesTable reloadData];  
+    /* Picture Settings */
+    
+    /* If Cropping is set to custom, then recall all four crop values from
+     when the preset was created and apply them */
+    if ([[queueToApply objectForKey:@"PictureAutoCrop"]  intValue] == 0)
+    {
+        [fPictureController setAutoCrop:NO];
+        
+        /* Here we use the custom crop values saved at the time the preset was saved */
+        job->crop[0] = [[queueToApply objectForKey:@"PictureTopCrop"]  intValue];
+        job->crop[1] = [[queueToApply objectForKey:@"PictureBottomCrop"]  intValue];
+        job->crop[2] = [[queueToApply objectForKey:@"PictureLeftCrop"]  intValue];
+        job->crop[3] = [[queueToApply objectForKey:@"PictureRightCrop"]  intValue];
+        
+    }
+    else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
+    {
+        [fPictureController setAutoCrop:YES];
+        /* Here we use the auto crop values determined right after scan */
+        job->crop[0] = AutoCropTop;
+        job->crop[1] = AutoCropBottom;
+        job->crop[2] = AutoCropLeft;
+        job->crop[3] = AutoCropRight;
+        
+    }
+    
+    job->modulus = [[queueToApply objectForKey:@"PictureModulus"]  intValue];
+    
+    /* we check to make sure the presets width/height does not exceed the sources width/height */
+    if (fTitle->width < [[queueToApply objectForKey:@"PictureWidth"]  intValue] || fTitle->height < [[queueToApply objectForKey:@"PictureHeight"]  intValue])
+    {
+        /* if so, then we use the sources height and width to avoid scaling up */
+        //job->width = fTitle->width;
+        //job->height = fTitle->height;
+        [self revertPictureSizeToMax:nil];
+    }
+    else // source width/height is >= the preset height/width
+    {
+        /* we can go ahead and use the presets values for height and width */
+        job->width = [[queueToApply objectForKey:@"PictureWidth"]  intValue];
+        job->height = [[queueToApply objectForKey:@"PictureHeight"]  intValue];
+    }
+    job->keep_ratio = [[queueToApply objectForKey:@"PictureKeepRatio"]  intValue];
+    if (job->keep_ratio == 1)
+    {
+        hb_fix_aspect( job, HB_KEEP_WIDTH );
+        if( job->height > fTitle->height )
+        {
+            job->height = fTitle->height;
+            hb_fix_aspect( job, HB_KEEP_HEIGHT );
+        }
+    }
+    job->anamorphic.mode = [[queueToApply objectForKey:@"PicturePAR"]  intValue];
+    job->modulus = [[queueToApply objectForKey:@"PictureModulus"]  intValue];
+    
+    /* Filters */
+    
+    /* We only allow *either* Decomb or Deinterlace. So check for the PictureDecombDeinterlace key.
+     * also, older presets may not have this key, in which case we also check to see if that preset had  PictureDecomb
+     * specified, in which case we use decomb and ignore any possible Deinterlace settings as using both was less than
+     * sane.
+     */
+    [fPictureController setUseDecomb:1];
+    [fPictureController setDecomb:0];
+    [fPictureController setDeinterlace:0];
+    if ([[queueToApply objectForKey:@"PictureDecombDeinterlace"] intValue] == 1 || [[queueToApply objectForKey:@"PictureDecomb"] intValue] > 0)
+    {
+        /* we are using decomb */
+        /* Decomb */
+        if ([[queueToApply objectForKey:@"PictureDecomb"] intValue] > 0)
+        {
+            [fPictureController setDecomb:[[queueToApply objectForKey:@"PictureDecomb"] intValue]];
+            
+            /* if we are using "Custom" in the decomb setting, also set the custom string*/
+            if ([[queueToApply objectForKey:@"PictureDecomb"] intValue] == 1)
+            {
+                [fPictureController setDecombCustomString:[queueToApply objectForKey:@"PictureDecombCustom"]];    
+            }
+        }
+    }
+    else
+    {
+        /* We are using Deinterlace */
+        /* Deinterlace */
+        if ([[queueToApply objectForKey:@"PictureDeinterlace"] intValue] > 0)
+        {
+            [fPictureController setUseDecomb:0];
+            [fPictureController setDeinterlace:[[queueToApply objectForKey:@"PictureDeinterlace"] intValue]];
+            /* if we are using "Custom" in the deinterlace setting, also set the custom string*/
+            if ([[queueToApply objectForKey:@"PictureDeinterlace"] intValue] == 1)
+            {
+                [fPictureController setDeinterlaceCustomString:[queueToApply objectForKey:@"PictureDeinterlaceCustom"]];    
+            }
+        }
+    }
+    
+    
+    /* Detelecine */
+    if ([[queueToApply objectForKey:@"PictureDetelecine"] intValue] > 0)
+    {
+        [fPictureController setDetelecine:[[queueToApply objectForKey:@"PictureDetelecine"] intValue]];
+        /* if we are using "Custom" in the detelecine setting, also set the custom string*/
+        if ([[queueToApply objectForKey:@"PictureDetelecine"] intValue] == 1)
+        {
+            [fPictureController setDetelecineCustomString:[queueToApply objectForKey:@"PictureDetelecineCustom"]];    
+        }
+    }
+    else
+    {
+        [fPictureController setDetelecine:0];
+    }
+    
+    /* Denoise */
+    if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] > 0)
+    {
+        [fPictureController setDenoise:[[queueToApply objectForKey:@"PictureDenoise"] intValue]];
+        /* if we are using "Custom" in the denoise setting, also set the custom string*/
+        if ([[queueToApply objectForKey:@"PictureDenoise"] intValue] == 1)
+        {
+            [fPictureController setDenoiseCustomString:[queueToApply objectForKey:@"PictureDenoiseCustom"]];    
+        }
+    }
+    else
+    {
+        [fPictureController setDenoise:0];
+    }   
+    
+    /* Deblock */
+    if ([[queueToApply objectForKey:@"PictureDeblock"] intValue] == 1)
+    {
+        /* if its a one, then its the old on/off deblock, set on to 5*/
+        [fPictureController setDeblock:5];
+    }
+    else
+    {
+        /* use the settings intValue */
+        [fPictureController setDeblock:[[queueToApply objectForKey:@"PictureDeblock"] intValue]];
+    }
+    
+    if ([[queueToApply objectForKey:@"VideoGrayScale"] intValue] == 1)
+    {
+        [fPictureController setGrayscale:1];
+    }
+    else
+    {
+        [fPictureController setGrayscale:0];
+    }
+    
+    /* we call SetTitle: in fPictureController so we get an instant update in the Picture Settings window */
+    [fPictureController SetTitle:fTitle];
+    [self calculatePictureSizing:nil];
+    
+    /* somehow we need to figure out a way to tie the queue item to a preset if it used one */
+    //[queueFileJob setObject:[fPresetSelectedDisplay stringValue] forKey:@"PresetName"];
+    //[queueFileJob setObject:[NSNumber numberWithInt:[fPresetsOutlineView selectedRow]] forKey:@"PresetIndexNum"];
+    if ([queueToApply objectForKey:@"PresetIndexNum"]) // This item used a preset so insert that info
+       {
+               /* Deselect the currently selected Preset if there is one*/
+        //[fPresetsOutlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:[[queueToApply objectForKey:@"PresetIndexNum"] intValue]] byExtendingSelection:NO];
+        //[self selectPreset:nil];
+               
+        //[fPresetsOutlineView selectRow:[[queueToApply objectForKey:@"PresetIndexNum"] intValue]];
+               /* Change UI to show "Custom" settings are being used */
+               //[fPresetSelectedDisplay setStringValue: [[queueToApply objectForKey:@"PresetName"] stringValue]];
+        
+               curUserPresetChosenNum = nil;
+       }
+    else
+    {
+        /* Deselect the currently selected Preset if there is one*/
+               [fPresetsOutlineView deselectRow:[fPresetsOutlineView selectedRow]];
+               /* Change UI to show "Custom" settings are being used */
+               [fPresetSelectedDisplay setStringValue: @"Custom"];
+        
+               //curUserPresetChosenNum = nil;
+    }
+    
+    /* We need to set this bool back to NO, in case the user wants to do a scan */
+    //applyQueueToScan = NO;
+    
+    /* Not that source is loaded and settings applied, delete the queue item from the queue */
+    [self writeToActivityLog: "applyQueueSettingsToMainWindow: deleting queue item:%d",fqueueEditRescanItemNum];
+    [self removeQueueFileItem:fqueueEditRescanItemNum];
+}
+
+
+
+#pragma mark -
+#pragma mark Live Preview
+/* Note,this is much like prepareJob, but directly sets the job vars so Picture Preview
+ * can encode to its temp preview directory and playback. This is *not* used for any actual user
+ * encodes
+ */
+- (void) prepareJobForPreview
+{
+    hb_list_t  * list  = hb_get_titles( fHandle );
+    hb_title_t * title = (hb_title_t *) hb_list_item( list,
+            [fSrcTitlePopUp indexOfSelectedItem] );
+    hb_job_t * job = title->job;
+    hb_audio_config_t * audio;
+    /* set job->angle for libdvdnav */
+    job->angle = [fSrcAnglePopUp indexOfSelectedItem] + 1;
+    /* Chapter selection */
+    job->chapter_start = [fSrcChapterStartPopUp indexOfSelectedItem] + 1;
+    job->chapter_end   = [fSrcChapterEndPopUp   indexOfSelectedItem] + 1;
+       
+    /* Format (Muxer) and Video Encoder */
+    job->mux = [[fDstFormatPopUp selectedItem] tag];
+    job->vcodec = [[fVidEncoderPopUp selectedItem] tag];
+
+    job->chapter_markers = 0;
+    
+       if( job->vcodec & HB_VCODEC_X264 )
+    {
+               
+               /* Below Sends x264 options to the core library if x264 is selected*/
+               /* Lets use this as per Nyx, Thanks Nyx!*/
+               job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */
+               /* For previews we ignore the turbo option for the first pass of two since we only use 1 pass */
+               strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
+
+        
+    }
+
+    /* Video settings */
+   /* Set vfr to 0 as it's only on if using same as source in the framerate popup
+     * and detelecine is on, so we handle that in the logic below
+     */
+    job->vfr = 0;
+    if( [fVidRatePopUp indexOfSelectedItem] > 0 )
+    {
+        /* a specific framerate has been chosen */
+        job->vrate      = 27000000;
+        job->vrate_base = hb_video_rates[[fVidRatePopUp indexOfSelectedItem]-1].rate;
+        /* We are not same as source so we set job->cfr to 1 
+         * to enable constant frame rate since user has specified
+         * a specific framerate*/
+        if ([fFrameratePfrCheck state] == 1)
+        {
+            job->cfr = 2;
+        }
+        else
+        {
+            job->cfr = 1;
+        }
+    }
+    else
+    {
+        /* We are same as source (variable) */
+        job->vrate      = title->rate;
+        job->vrate_base = title->rate_base;
+        /* We are same as source so we set job->cfr to 0 
+         * to enable true same as source framerate */
+        job->cfr = 0;
+        /* If we are same as source and we have detelecine on, we need to turn on
+         * job->vfr
+         */
+        if ([fPictureController detelecine] == 1)
+        {
+            job->vfr = 1;
+        }
+    }
+
+    switch( [fVidQualityMatrix selectedRow] )
+    {
+        case 0:
+            /* Target size.
+               Bitrate should already have been calculated and displayed
                in fVidBitrateField, so let's just use it */
         case 1:
             job->vquality = -1.0;
@@ -2931,12 +3093,10 @@ fWorkingCount = 0;
     }
 
     /* Subtitle settings */
-    NSMutableArray *subtitlesArray = nil;
-    subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesDelegate getSubtitleArray: subtitlesArray]];
-    
+    NSMutableArray *subtitlesArray = [[NSMutableArray alloc] initWithArray:[fSubtitlesDelegate getSubtitleArray] copyItems:YES];
     
     
- int subtitle = nil;
+int subtitle = nil;
 int force;
 int burned;
 int def;
@@ -2973,23 +3133,18 @@ bool one_burned = FALSE;
                 [self writeToActivityLog: "Foreign Language Search: %d", 1];
                 
                 job->indepth_scan = 1;
-                if (burned == 1 || job->mux != HB_MUX_MP4)
+                
+                if (burned != 1)
                 {
-                    if (burned != 1 && job->mux == HB_MUX_MKV)
-                    {
-                        job->select_subtitle_config.dest = PASSTHRUSUB;
-                    }
-                    else
-                    {
-                        job->select_subtitle_config.dest = RENDERSUB;
-                    }
-                    
-                    job->select_subtitle_config.force = force;
-                    job->select_subtitle_config.default_track = def;
-                    
+                    job->select_subtitle_config.dest = PASSTHRUSUB;
+                }
+                else
+                {
+                    job->select_subtitle_config.dest = RENDERSUB;
                 }
                 
-                
+                job->select_subtitle_config.force = force;
+                job->select_subtitle_config.default_track = def;
             }
             else
             {
@@ -3023,8 +3178,10 @@ bool one_burned = FALSE;
                     sub_config.offset = [[tempObject objectForKey:@"subtitleTrackSrtOffset"] intValue];
                     
                     /* we need to srncpy file path and char code */
-                    strncpy(sub_config.src_filename, [[tempObject objectForKey:@"subtitleSourceSrtFilePath"] UTF8String], 128);
-                    strncpy(sub_config.src_codeset, [[tempObject objectForKey:@"subtitleTrackSrtCharCode"] UTF8String], 40);
+                    strncpy(sub_config.src_filename, [[tempObject objectForKey:@"subtitleSourceSrtFilePath"] UTF8String], 255);
+                    sub_config.src_filename[255] = 0;
+                    strncpy(sub_config.src_codeset, [[tempObject objectForKey:@"subtitleTrackSrtCharCode"] UTF8String], 39);
+                    sub_config.src_codeset[39] = 0;
                     
                     sub_config.force = 0;
                     sub_config.dest = PASSTHRUSUB;
@@ -3035,21 +3192,12 @@ bool one_burned = FALSE;
                 
                 if (subt != NULL)
                 {
-                    [self writeToActivityLog: "Setting Subtitle: %s", subt];
-
                     hb_subtitle_config_t sub_config = subt->config;
                     
-                    if (!burned && job->mux == HB_MUX_MKV && 
-                        subt->format == PICTURESUB)
+                    if ( !burned && subt->format == PICTURESUB )
                     {
                         sub_config.dest = PASSTHRUSUB;
                     }
-                    else if (!burned && job->mux == HB_MUX_MP4 && 
-                             subt->format == PICTURESUB)
-                    {
-                        // Skip any non-burned vobsubs when output is mp4
-                        continue;
-                    }
                     else if ( burned && subt->format == PICTURESUB )
                     {
                         // Only allow one subtitle to be burned into the video
@@ -3057,6 +3205,13 @@ bool one_burned = FALSE;
                             continue;
                         one_burned = TRUE;
                     }
+                    
+                    /* Besides VOBSUBS we can also burn in SSA text subs */
+                    if (subt->source == SSASUB && burned)
+                    {
+                        sub_config.dest = RENDERSUB;
+                    }
+                    
                     sub_config.force = force;
                     sub_config.default_track = def;
                     hb_subtitle_add( job, &sub_config, subtitle );
@@ -3073,83 +3228,7 @@ bool one_burned = FALSE;
     
     
     /* Audio tracks and mixdowns */
-    /* Lets make sure there arent any erroneous audio tracks in the job list, so lets make sure its empty*/
-    int audiotrack_count = hb_list_count(job->list_audio);
-    for( int i = 0; i < audiotrack_count;i++)
-    {
-        hb_audio_t * temp_audio = (hb_audio_t*) hb_list_item( job->list_audio, 0 );
-        hb_list_rem(job->list_audio, temp_audio);
-    }
-    /* Now lets add our new tracks to the audio list here */
-    if ([fAudLang1PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang1PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang1PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack1CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack1MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack1BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack1RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack1DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-    }  
-    if ([fAudLang2PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang2PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang2PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack2CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack2MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack2BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack2RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack2DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
-    
-    if ([fAudLang3PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang3PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang3PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack3CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack3MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack3BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack3RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack3DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
-
-    if ([fAudLang4PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang4PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang4PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack4CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack4MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack4BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack4RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack4DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
+       [fAudioDelegate prepareAudioForJob: job];
 
     
     
@@ -3176,6 +3255,7 @@ bool one_burned = FALSE;
     */
     
        /* Detelecine */
+    hb_filter_detelecine.settings = NULL;
     if ([fPictureController detelecine] == 1)
     {
         /* use a custom detelecine string */
@@ -3194,6 +3274,7 @@ bool one_burned = FALSE;
     {
         /* Decomb */
         /* we add the custom string if present */
+        hb_filter_decomb.settings = NULL;
         if ([fPictureController decomb] == 1)
         {
             /* use a custom decomb string */
@@ -3291,10 +3372,46 @@ bool one_burned = FALSE;
     hb_audio_config_t * audio;
     /* Title Angle for dvdnav */
     job->angle = [[queueToApply objectForKey:@"TitleAngle"] intValue];
-    /* Chapter selection */
-    job->chapter_start = [[queueToApply objectForKey:@"JobChapterStart"] intValue];
-    job->chapter_end   = [[queueToApply objectForKey:@"JobChapterEnd"] intValue];
+    
+    if([[queueToApply objectForKey:@"fEncodeStartStop"] intValue] == 0)
+    {
+        /* Chapter selection */
+        [self writeToActivityLog: "Start / Stop set to chapters"];
+        job->chapter_start = [[queueToApply objectForKey:@"JobChapterStart"] intValue];
+        job->chapter_end   = [[queueToApply objectForKey:@"JobChapterEnd"] intValue];
+    }
+    else if ([[queueToApply objectForKey:@"fEncodeStartStop"] intValue] == 1)
+    {
+        /* we are pts based start / stop */
+        [self writeToActivityLog: "Start / Stop set to seconds ..."];
+        
+        /* Point A to Point B. Time to time in seconds.*/
+        /* get the start seconds from the start seconds field */
+        int start_seconds = [[queueToApply objectForKey:@"StartSeconds"] intValue];
+        job->pts_to_start = start_seconds * 90000LL;
+        /* Stop seconds is actually the duration of encode, so subtract the end seconds from the start seconds */
+        int stop_seconds = [[queueToApply objectForKey:@"StopSeconds"] intValue];
+        job->pts_to_stop = stop_seconds * 90000LL;
+        
+    }
+    else if ([[queueToApply objectForKey:@"fEncodeStartStop"] intValue] == 2)
+    {
+        /* we are frame based start / stop */
+        [self writeToActivityLog: "Start / Stop set to frames ..."];
+        
+        /* Point A to Point B. Frame to frame */
+        /* get the start frame from the start frame field */
+        int start_frame = [[queueToApply objectForKey:@"StartFrame"] intValue];
+        job->frame_to_start = start_frame;
+        /* get the frame to stop on from the end frame field */
+        int stop_frame = [[queueToApply objectForKey:@"StopFrame"] intValue];
+        job->frame_to_stop = stop_frame;
+        
+    }
+
        
+        
+    
     /* Format (Muxer) and Video Encoder */
     job->mux = [[queueToApply objectForKey:@"JobFileFormatMux"] intValue];
     job->vcodec = [[queueToApply objectForKey:@"JobVideoEncoderVcodec"] intValue];
@@ -3393,13 +3510,14 @@ bool one_burned = FALSE;
     
     job->keep_ratio = [[queueToApply objectForKey:@"PictureKeepRatio"]  intValue];
     job->anamorphic.mode = [[queueToApply objectForKey:@"PicturePAR"]  intValue];
+    job->modulus = [[queueToApply objectForKey:@"PictureModulus"] intValue];
     if ([[queueToApply objectForKey:@"PicturePAR"]  intValue] == 3)
     {
         /* insert our custom values here for capuj */
         job->width = [[queueToApply objectForKey:@"PicturePARStorageWidth"]  intValue];
         job->height = [[queueToApply objectForKey:@"PicturePARStorageHeight"]  intValue];
         
-        job->anamorphic.modulus = [[queueToApply objectForKey:@"PicturePARModulus"] intValue];
+        job->modulus = [[queueToApply objectForKey:@"PicturePARModulus"] intValue];
         
         job->anamorphic.par_width = [[queueToApply objectForKey:@"PicturePARPixelWidth"]  intValue];
         job->anamorphic.par_height = [[queueToApply objectForKey:@"PicturePARPixelHeight"]  intValue];
@@ -3429,7 +3547,15 @@ bool one_burned = FALSE;
         /* We are not same as source so we set job->cfr to 1 
          * to enable constant frame rate since user has specified
          * a specific framerate*/
-        job->cfr = 1;
+        
+        if ([[queueToApply objectForKey:@"VideoFrameratePFR"] intValue] == 1)
+        {
+            job->cfr = 2;
+        }
+        else
+        {
+            job->cfr = 1;
+        }
     }
     else
     {
@@ -3511,22 +3637,18 @@ bool one_burned = FALSE;
                 [self writeToActivityLog: "Foreign Language Search: %d", 1];
                 
                 job->indepth_scan = 1;
-                if (burned == 1 || job->mux != HB_MUX_MP4)
+                
+                if (burned != 1)
                 {
-                    if (burned != 1 && job->mux == HB_MUX_MKV)
-                    {
-                        job->select_subtitle_config.dest = PASSTHRUSUB;
-                    }
-                    else
-                    {
-                        job->select_subtitle_config.dest = RENDERSUB;
-                    }
-                    
-                    job->select_subtitle_config.force = force;
-                    job->select_subtitle_config.default_track = def;
+                    job->select_subtitle_config.dest = PASSTHRUSUB;
+                }
+                else
+                {
+                    job->select_subtitle_config.dest = RENDERSUB;
                 }
                 
-                
+                job->select_subtitle_config.force = force;
+                job->select_subtitle_config.default_track = def;
             }
             else
             {
@@ -3560,9 +3682,7 @@ bool one_burned = FALSE;
                     sub_config.offset = [[tempObject objectForKey:@"subtitleTrackSrtOffset"] intValue];
                     
                     /* we need to srncpy file name and codeset */
-                    //sub_config.src_filename = [[tempObject objectForKey:@"subtitleSourceSrtFilePath"] UTF8String];
                     strncpy(sub_config.src_filename, [[tempObject objectForKey:@"subtitleSourceSrtFilePath"] UTF8String], 128);
-                    //sub_config.src_codeset = [[tempObject objectForKey:@"subtitleTrackSrtCharCode"] UTF8String];
                     strncpy(sub_config.src_codeset, [[tempObject objectForKey:@"subtitleTrackSrtCharCode"] UTF8String], 40);
                     
                     sub_config.force = 0;
@@ -3575,28 +3695,26 @@ bool one_burned = FALSE;
                 
                 if (subt != NULL)
                 {
-                    [self writeToActivityLog: "Setting Subtitle: %s", subt];
-
                     hb_subtitle_config_t sub_config = subt->config;
                     
-                    if (!burned && job->mux == HB_MUX_MKV && 
-                        subt->format == PICTURESUB)
+                    if ( !burned && subt->format == PICTURESUB )
                     {
                         sub_config.dest = PASSTHRUSUB;
                     }
-                    else if (!burned && job->mux == HB_MUX_MP4 && 
-                             subt->format == PICTURESUB)
-                    {
-                        // Skip any non-burned vobsubs when output is mp4
-                        continue;
-                    }
-                    else if ( burned && subt->format == PICTURESUB )
+                    else if ( burned  )
                     {
                         // Only allow one subtitle to be burned into the video
                         if (one_burned)
                             continue;
                         one_burned = TRUE;
                     }
+                    
+                    /* Besides VOBSUBS we can also burn in SSA text subs */
+                    if (subt->source == SSASUB && burned)
+                    {
+                        sub_config.dest = RENDERSUB;
+                    }
+
                     sub_config.force = force;
                     sub_config.default_track = def;
                     hb_subtitle_add( job, &sub_config, subtitle );
@@ -3619,75 +3737,25 @@ bool one_burned = FALSE;
         hb_list_rem(job->list_audio, temp_audio);
     }
     /* Now lets add our new tracks to the audio list here */
-    if ([[queueToApply objectForKey:@"Audio1Track"] intValue] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [[queueToApply objectForKey:@"Audio1Track"] intValue] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [[queueToApply objectForKey:@"Audio1Track"] intValue] - 1;
-        audio->out.codec = [[queueToApply objectForKey:@"JobAudio1Encoder"] intValue];
-        audio->out.mixdown = [[queueToApply objectForKey:@"JobAudio1Mixdown"] intValue];
-        audio->out.bitrate = [[queueToApply objectForKey:@"JobAudio1Bitrate"] intValue];
-        audio->out.samplerate = [[queueToApply objectForKey:@"JobAudio1Samplerate"] intValue];
-        audio->out.dynamic_range_compression = [[queueToApply objectForKey:@"Audio1TrackDRCSlider"] floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-    }  
-    if ([[queueToApply objectForKey:@"Audio2Track"] intValue] > 0)
-    {
-        
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [[queueToApply objectForKey:@"Audio2Track"] intValue] - 1;
-        [self writeToActivityLog: "prepareJob audiotrack 2 is: %d", audio->in.track];
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [[queueToApply objectForKey:@"Audio2Track"] intValue] - 1;
-        audio->out.codec = [[queueToApply objectForKey:@"JobAudio2Encoder"] intValue];
-        audio->out.mixdown = [[queueToApply objectForKey:@"JobAudio2Mixdown"] intValue];
-        audio->out.bitrate = [[queueToApply objectForKey:@"JobAudio2Bitrate"] intValue];
-        audio->out.samplerate = [[queueToApply objectForKey:@"JobAudio2Samplerate"] intValue];
-        audio->out.dynamic_range_compression = [[queueToApply objectForKey:@"Audio2TrackDRCSlider"] floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-    }
-    
-    if ([[queueToApply objectForKey:@"Audio3Track"] intValue] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [[queueToApply objectForKey:@"Audio3Track"] intValue] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [[queueToApply objectForKey:@"Audio3Track"] intValue] - 1;
-        audio->out.codec = [[queueToApply objectForKey:@"JobAudio3Encoder"] intValue];
-        audio->out.mixdown = [[queueToApply objectForKey:@"JobAudio3Mixdown"] intValue];
-        audio->out.bitrate = [[queueToApply objectForKey:@"JobAudio3Bitrate"] intValue];
-        audio->out.samplerate = [[queueToApply objectForKey:@"JobAudio3Samplerate"] intValue];
-        audio->out.dynamic_range_compression = [[queueToApply objectForKey:@"Audio3TrackDRCSlider"] floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);        
-    }
-    
-    if ([[queueToApply objectForKey:@"Audio4Track"] intValue] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [[queueToApply objectForKey:@"Audio4Track"] intValue] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [[queueToApply objectForKey:@"Audio4Track"] intValue] - 1;
-        audio->out.codec = [[queueToApply objectForKey:@"JobAudio4Encoder"] intValue];
-        audio->out.mixdown = [[queueToApply objectForKey:@"JobAudio4Mixdown"] intValue];
-        audio->out.bitrate = [[queueToApply objectForKey:@"JobAudio4Bitrate"] intValue];
-        audio->out.samplerate = [[queueToApply objectForKey:@"JobAudio4Samplerate"] intValue];
-        audio->out.dynamic_range_compression = [[queueToApply objectForKey:@"Audio4TrackDRCSlider"] floatValue];
-        
-        hb_audio_add( job, audio );
-        
-
-    }
+       for (unsigned int counter = 0; counter < maximumNumberOfAllowedAudioTracks; counter++) {
+               NSString *prefix = [NSString stringWithFormat: @"Audio%d", counter + 1];
+               if ([[queueToApply objectForKey: [prefix stringByAppendingString: @"Track"]] intValue] > 0) {
+                       audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
+                       hb_audio_config_init(audio);
+                       audio->in.track = [[queueToApply objectForKey: [prefix stringByAppendingString: @"Track"]] intValue] - 1;
+                       /* We go ahead and assign values to our audio->out.<properties> */
+                       audio->out.track = audio->in.track;
+                       audio->out.dynamic_range_compression = [[queueToApply objectForKey: [prefix stringByAppendingString: @"TrackDRCSlider"]] floatValue];
+                       prefix = [NSString stringWithFormat: @"JobAudio%d", counter + 1];
+                       audio->out.codec = [[queueToApply objectForKey: [prefix stringByAppendingString: @"Encoder"]] intValue];
+                       audio->out.mixdown = [[queueToApply objectForKey: [prefix stringByAppendingString: @"Mixdown"]] intValue];
+                       audio->out.bitrate = [[queueToApply objectForKey: [prefix stringByAppendingString: @"Bitrate"]] intValue];
+                       audio->out.samplerate = [[queueToApply objectForKey: [prefix stringByAppendingString: @"Samplerate"]] intValue];
+                       
+                       hb_audio_add( job, audio );
+                       free(audio);
+               }
+       }
     
     /* Filters */ 
     job->filters = hb_list_init();
@@ -3696,6 +3764,7 @@ bool one_burned = FALSE;
      * The order of the filters is critical
      */
     /* Detelecine */
+    hb_filter_detelecine.settings = NULL;
     if ([[queueToApply objectForKey:@"PictureDetelecine"] intValue] == 1)
     {
         /* use a custom detelecine string */
@@ -3712,6 +3781,7 @@ bool one_burned = FALSE;
     {
         /* Decomb */
         /* we add the custom string if present */
+        hb_filter_decomb.settings = NULL;
         if ([[queueToApply objectForKey:@"PictureDecomb"] intValue] == 1)
         {
             /* use a custom decomb string */
@@ -3796,7 +3866,7 @@ bool one_burned = FALSE;
 
 
 /* addToQueue: puts up an alert before ultimately calling doAddToQueue
-*/
+ */
 - (IBAction) addToQueue: (id) sender
 {
        /* We get the destination directory from the destination field here */
@@ -3846,7 +3916,7 @@ bool one_burned = FALSE;
     }
     else if (fileExistsInQueue == YES)
     {
-    NSBeginCriticalAlertSheet( NSLocalizedString( @"There is already a queue item for this destination.", @"" ),
+        NSBeginCriticalAlertSheet( NSLocalizedString( @"There is already a queue item for this destination.", @"" ),
                                   NSLocalizedString( @"Cancel", @"" ), NSLocalizedString( @"Overwrite", @"" ), nil, fWindow, self,
                                   @selector( overwriteAddToQueueAlertDone:returnCode:contextInfo: ),
                                   NULL, NULL, [NSString stringWithFormat:
@@ -3898,6 +3968,7 @@ bool one_burned = FALSE;
     // If there are pending jobs in the queue, then this is a rip the queue
     if (fPendingCount > 0)
     {
+        currentQueueEncodeIndex = [self getNextPendingQueueIndex];
         /* here lets start the queue with the first pending item */
         [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]]; 
         
@@ -3935,6 +4006,7 @@ bool one_burned = FALSE;
         }
         
         /* go right to processing the new queue encode */
+        currentQueueEncodeIndex = [self getNextPendingQueueIndex];
         [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]]; 
         
     }
@@ -3957,8 +4029,9 @@ bool one_burned = FALSE;
 
         NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
         [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
+        currentQueueEncodeIndex = [self getNextPendingQueueIndex];
         [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]]; 
-      
+
     }
 }
 
@@ -4072,23 +4145,29 @@ bool one_burned = FALSE;
     // and as always, save it in the queue .plist...
     /* We save all of the Queue data here */
     [self saveQueueFileItem];
-    // so now lets move to 
-    currentQueueEncodeIndex++ ;
+    
     // ... and see if there are more items left in our queue
     int queueItems = [QueueFileArray count];
     /* If we still have more items in our queue, lets go to the next one */
-    if (currentQueueEncodeIndex < queueItems)
-    {
-    [self writeToActivityLog: "doCancelCurrentJob currentQueueEncodeIndex is incremented to: %d", currentQueueEncodeIndex];
-    [self writeToActivityLog: "doCancelCurrentJob moving to the next job"];
-    
-    [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]];
+    /* Check to see if there are any more pending items in the queue */
+    int newQueueItemIndex = [self getNextPendingQueueIndex];
+    /* If we still have more pending items in our queue, lets go to the next one */
+    if (newQueueItemIndex >= 0 && newQueueItemIndex < queueItems)
+    {
+        /*Set our currentQueueEncodeIndex now to the newly found Pending encode as we own it */
+        currentQueueEncodeIndex = newQueueItemIndex;
+        /* now we mark the queue item as Status = 1 ( being encoded ) so another instance can not come along and try to scan it while we are scanning */
+        [[QueueFileArray objectAtIndex:currentQueueEncodeIndex] setObject:[NSNumber numberWithInt:1] forKey:@"Status"];
+        [self writeToActivityLog: "incrementQueueItemDone new pending items found: %d", currentQueueEncodeIndex];
+        [self saveQueueFileItem];
+        /* now we can go ahead and scan the new pending queue item */
+        [self performNewQueueScan:[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"SourcePath"] scanTitleNum:[[[QueueFileArray objectAtIndex:currentQueueEncodeIndex] objectForKey:@"TitleNumber"]intValue]];
+
     }
     else
     {
-        [self writeToActivityLog: "doCancelCurrentJob the item queue is complete"];
+        [self writeToActivityLog: "incrementQueueItemDone there are no more pending encodes"];
     }
-
 }
 
 - (void) doCancelCurrentJobAndStop
@@ -4136,6 +4215,28 @@ bool one_burned = FALSE;
     hb_title_t * title = (hb_title_t*)
         hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
 
+    /* If we are a stream type and a batch scan, grok the output file name from title->name upon title change */
+    if (title->type == HB_STREAM_TYPE && hb_list_count( list ) > 1 )
+    {
+        /* we set the default name according to the new title->name */
+        [fDstFile2Field setStringValue: [NSString stringWithFormat:
+                                         @"%@/%@.%@", [[fDstFile2Field stringValue] stringByDeletingLastPathComponent],
+                                         [NSString stringWithUTF8String: title->name],
+                                         [[fDstFile2Field stringValue] pathExtension]]];
+        
+        /* Change the source to read out the parent folder also */
+        [fSrcDVD2Field setStringValue:[NSString stringWithFormat:@"%@/%@", browsedSourceDisplayName,[NSString stringWithUTF8String: title->name]]];
+    }
+    
+    /* For point a to point b pts encoding, set the start and end fields to 0 and the title duration in seconds respectively */
+    int duration = (title->hours * 3600) + (title->minutes * 60) + (title->seconds);
+    [fSrcTimeStartEncodingField setStringValue: [NSString stringWithFormat: @"%d", 0]];
+    [fSrcTimeEndEncodingField setStringValue: [NSString stringWithFormat: @"%d", duration]];
+    /* For point a to point b frame encoding, set the start and end fields to 0 and the title duration * announced fps in seconds respectively */
+    [fSrcFrameStartEncodingField setStringValue: [NSString stringWithFormat: @"%d", 1]];
+    //[fSrcFrameEndEncodingField setStringValue: [NSString stringWithFormat: @"%d", ((title->hours * 3600) + (title->minutes * 60) + (title->seconds)) * 24]];
+    [fSrcFrameEndEncodingField setStringValue: [NSString stringWithFormat: @"%d", duration * (title->rate / title->rate_base)]];    
+    
     /* If Auto Naming is on. We create an output filename of dvd name - title number */
     if( [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultAutoNaming"] > 0 && ( hb_list_count( list ) > 1 ) )
        {
@@ -4145,7 +4246,10 @@ bool one_burned = FALSE;
             title->index,
                        [[fDstFile2Field stringValue] pathExtension]]]; 
        }
-
+    /* Update encode start / stop variables */
+     
+    
+    
     /* Update chapter popups */
     [fSrcChapterStartPopUp removeAllItems];
     [fSrcChapterEndPopUp   removeAllItems];
@@ -4210,7 +4314,15 @@ bool one_burned = FALSE;
     [fChapterTitlesDelegate resetWithTitle:title];
     [fChapterTable reloadData];
 
-   /* Lets make sure there arent any erroneous audio tracks in the job list, so lets make sure its empty*/
+       /* Update audio table */
+       [[NSNotificationCenter defaultCenter] postNotification:
+        [NSNotification notificationWithName: HBTitleChangedNotification
+                                                                  object: self
+                                                                userInfo: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                       [NSData dataWithBytesNoCopy: &fTitle length: sizeof(fTitle) freeWhenDone: NO], keyTitleTag,
+                                                                                       nil]]];
+       
+       /* Lets make sure there arent any erroneous audio tracks in the job list, so lets make sure its empty*/
     int audiotrack_count = hb_list_count(job->list_audio);
     for( int i = 0; i < audiotrack_count;i++)
     {
@@ -4218,25 +4330,7 @@ bool one_burned = FALSE;
         hb_list_rem(job->list_audio, temp_audio);
     }
 
-    /* Update audio popups */
-    [self addAllAudioTracksToPopUp: fAudLang1PopUp];
-    [self addAllAudioTracksToPopUp: fAudLang2PopUp];
-    [self addAllAudioTracksToPopUp: fAudLang3PopUp];
-    [self addAllAudioTracksToPopUp: fAudLang4PopUp];
-    /* search for the first instance of our prefs default language for track 1, and set track 2 to "none" */
-       NSString * audioSearchPrefix = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultLanguage"];
-        [self selectAudioTrackInPopUp: fAudLang1PopUp searchPrefixString: audioSearchPrefix selectIndexIfNotFound: 1];
-    [self selectAudioTrackInPopUp:fAudLang2PopUp searchPrefixString:nil selectIndexIfNotFound:0];
-    [self selectAudioTrackInPopUp:fAudLang3PopUp searchPrefixString:nil selectIndexIfNotFound:0];
-    [self selectAudioTrackInPopUp:fAudLang4PopUp searchPrefixString:nil selectIndexIfNotFound:0];
-
-       /* changing the title may have changed the audio channels on offer, */
-       /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-       [self audioTrackPopUpChanged: fAudLang1PopUp];
-       [self audioTrackPopUpChanged: fAudLang2PopUp];
-    [self audioTrackPopUpChanged: fAudLang3PopUp];
-    [self audioTrackPopUpChanged: fAudLang4PopUp];
-
+       
     [fVidRatePopUp selectItemAtIndex: 0];
 
     /* we run the picture size values through calculatePictureSizing to get all picture setting        information*/
@@ -4246,6 +4340,55 @@ bool one_burned = FALSE;
     [self selectPreset:nil];
 }
 
+- (IBAction) encodeStartStopPopUpChanged: (id) sender;
+{
+    if( [fEncodeStartStopPopUp isEnabled] )
+    {
+        /* We are chapters */
+        if( [fEncodeStartStopPopUp indexOfSelectedItem] == 0 )
+        {
+            [fSrcChapterStartPopUp  setHidden: NO];
+            [fSrcChapterEndPopUp  setHidden: NO];
+            
+            [fSrcTimeStartEncodingField  setHidden: YES];
+            [fSrcTimeEndEncodingField  setHidden: YES];
+            
+            [fSrcFrameStartEncodingField  setHidden: YES];
+            [fSrcFrameEndEncodingField  setHidden: YES];
+            
+               [self chapterPopUpChanged:nil];   
+        }
+        /* We are time based (seconds) */
+        else if ([fEncodeStartStopPopUp indexOfSelectedItem] == 1)
+        {
+            [fSrcChapterStartPopUp  setHidden: YES];
+            [fSrcChapterEndPopUp  setHidden: YES];
+            
+            [fSrcTimeStartEncodingField  setHidden: NO];
+            [fSrcTimeEndEncodingField  setHidden: NO];
+            
+            [fSrcFrameStartEncodingField  setHidden: YES];
+            [fSrcFrameEndEncodingField  setHidden: YES];
+            
+            [self startEndSecValueChanged:nil];
+        }
+        /* We are frame based */
+        else if ([fEncodeStartStopPopUp indexOfSelectedItem] == 2)
+        {
+            [fSrcChapterStartPopUp  setHidden: YES];
+            [fSrcChapterEndPopUp  setHidden: YES];
+            
+            [fSrcTimeStartEncodingField  setHidden: YES];
+            [fSrcTimeEndEncodingField  setHidden: YES];
+            
+            [fSrcFrameStartEncodingField  setHidden: NO];
+            [fSrcFrameEndEncodingField  setHidden: NO];
+            
+            [self startEndFrameValueChanged:nil];
+        }
+    }
+}
+
 - (IBAction) chapterPopUpChanged: (id) sender
 {
 
@@ -4274,7 +4417,7 @@ bool one_burned = FALSE;
     [fSrcDuration2Field setStringValue: [NSString stringWithFormat:
         @"%02lld:%02lld:%02lld", duration / 3600, ( duration / 60 ) % 60,
         duration % 60]];
-
+    
     [self calculateBitrate: sender];
     
     if ( [fSrcChapterStartPopUp indexOfSelectedItem] ==  [fSrcChapterEndPopUp indexOfSelectedItem] )
@@ -4289,6 +4432,33 @@ bool one_burned = FALSE;
     }
 }
 
+- (IBAction) startEndSecValueChanged: (id) sender
+{
+
+       int duration = [fSrcTimeEndEncodingField intValue] - [fSrcTimeStartEncodingField intValue];
+    [fSrcDuration2Field setStringValue: [NSString stringWithFormat:
+        @"%02d:%02d:%02d", duration / 3600, ( duration / 60 ) % 60,
+        duration % 60]];
+    
+    //[self calculateBitrate: sender];
+    
+}
+
+- (IBAction) startEndFrameValueChanged: (id) sender
+{
+    hb_list_t  * list  = hb_get_titles( fHandle );
+    hb_title_t * title = (hb_title_t*)
+    hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
+    
+    int duration = ([fSrcFrameEndEncodingField intValue] - [fSrcFrameStartEncodingField intValue]) / (title->rate / title->rate_base);
+    [fSrcDuration2Field setStringValue: [NSString stringWithFormat:
+                                         @"%02d:%02d:%02d", duration / 3600, ( duration / 60 ) % 60,
+                                         duration % 60]];
+    
+    //[self calculateBitrate: sender];
+}
+
+
 - (IBAction) formatPopUpChanged: (id) sender
 {
     NSString * string = [fDstFile2Field stringValue];
@@ -4350,6 +4520,15 @@ bool one_burned = FALSE;
     
     [fSubtitlesDelegate containerChanged:[[fDstFormatPopUp selectedItem] tag]];
     [fSubtitlesTable reloadData];
+       
+       /* post a notification for any interested observers to indicate that our video container has changed */
+       [[NSNotificationCenter defaultCenter] postNotification:
+        [NSNotification notificationWithName: HBContainerChangedNotification
+                                                                  object: self
+                                                                userInfo: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                       [NSNumber numberWithInt: [[fDstFormatPopUp selectedItem] tag]], keyContainerTag,
+                                                                                       nil]]];
+       
     /* if we have a previously selected vid encoder tag, then try to select it */
     if (selectedVidEncoderTag)
     {
@@ -4360,10 +4539,6 @@ bool one_burned = FALSE;
         [fVidEncoderPopUp selectItemAtIndex: 0];
     }
 
-    [self audioAddAudioTrackCodecs: fAudTrack1CodecPopUp];
-    [self audioAddAudioTrackCodecs: fAudTrack2CodecPopUp];
-    [self audioAddAudioTrackCodecs: fAudTrack3CodecPopUp];
-    [self audioAddAudioTrackCodecs: fAudTrack4CodecPopUp];
 
     if( format == 0 )
         [self autoSetM4vExtension: sender];
@@ -4373,10 +4548,6 @@ bool one_burned = FALSE;
     if( SuccessfulScan )
     {
         /* Add/replace to the correct extension */
-        [self audioTrackPopUpChanged: fAudLang1PopUp];
-        [self audioTrackPopUpChanged: fAudLang2PopUp];
-        [self audioTrackPopUpChanged: fAudLang3PopUp];
-        [self audioTrackPopUpChanged: fAudLang4PopUp];
 
         if( [fVidEncoderPopUp selectedItem] == nil )
         {
@@ -4402,9 +4573,8 @@ bool one_burned = FALSE;
 
     NSString * extension = @"mp4";
 
-    if( [[fAudTrack1CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack2CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
-                                                        [[fAudTrack3CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
-                                                        [[fAudTrack4CodecPopUp selectedItem] tag] == HB_ACODEC_AC3 ||
+       BOOL anyCodecAC3 = [fAudioDelegate anyCodecMatches: HB_ACODEC_AC3] || [fAudioDelegate anyCodecMatches: HB_ACODEC_AC3_PASS];
+       if (YES == anyCodecAC3 ||
                                                         [fCreateChapterMarkers state] == NSOnState ||
                                                         [[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultMpegName"] > 0 )
     {
@@ -4503,6 +4673,17 @@ the user is using "Custom" settings by determining the sender*/
 
 - (IBAction ) videoFrameRateChanged: (id) sender
 {
+    /* Hide and set the PFR Checkbox to OFF if we are set to Same as Source */
+    if ([fVidRatePopUp indexOfSelectedItem] == 0)
+    {
+        [fFrameratePfrCheck setHidden:YES];
+        [fFrameratePfrCheck setState:0];
+    }
+    else
+    {
+        [fFrameratePfrCheck setHidden:NO];
+    }
+    
     /* We call method method to calculatePictureSizing to error check detelecine*/
     [self calculatePictureSizing: sender];
 
@@ -4612,19 +4793,20 @@ the user is using "Custom" settings by determining the sender*/
     
     float sliderRfInverse = ([fVidQualitySlider maxValue] - [fVidQualitySlider floatValue]) + [fVidQualitySlider minValue];
     /* If the encoder is theora, use the float, otherwise use the inverse float*/
-    float sliderRfToPercent;
+    //float sliderRfToPercent;
     if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_THEORA)
     {
-        [fVidQualityRFField setStringValue: [NSString stringWithFormat: @"%.2f", [fVidQualitySlider floatValue]]];
-        sliderRfToPercent = [fVidQualityRFField floatValue] / ([fVidQualitySlider maxValue] - [fVidQualitySlider minValue]);   
+        [fVidQualityRFField setStringValue: [NSString stringWithFormat: @"%.2f", [fVidQualitySlider floatValue]]];   
     }
     else
     {
         [fVidQualityRFField setStringValue: [NSString stringWithFormat: @"%.2f", sliderRfInverse]];
-        sliderRfToPercent = ( ([fVidQualitySlider maxValue] - [fVidQualitySlider minValue])  - ([fVidQualityRFField floatValue] - [fVidQualitySlider minValue])) / ([fVidQualitySlider maxValue] - [fVidQualitySlider minValue]);
     }
-    [fVidConstantCell setTitle: [NSString stringWithFormat:
-                                 NSLocalizedString( @"Constant quality: %.2f %%", @"" ), 100 * sliderRfToPercent]];
+    /* Show a warning if x264 and rf 0 which is lossless */
+    if ([[fVidEncoderPopUp selectedItem] tag] == HB_VCODEC_X264 && sliderRfInverse == 0.0)
+    {
+        [fVidQualityRFField setStringValue: [NSString stringWithFormat: @"%.2f (Warning: Lossless)", sliderRfInverse]];
+    }
     
     [self customSettingUsed: sender];
 }
@@ -4659,82 +4841,7 @@ the user is using "Custom" settings by determining the sender*/
     job->mux = [[fDstFormatPopUp selectedItem] tag];
     
     /* Audio goes here */
-    int audiotrack_count = hb_list_count(job->list_audio);
-    for( int i = 0; i < audiotrack_count;i++)
-    {
-        hb_audio_t * temp_audio = (hb_audio_t*) hb_list_item( job->list_audio, 0 );
-        hb_list_rem(job->list_audio, temp_audio);
-    }
-    /* Now we need our audio info here for each track if applicable */
-    if ([fAudLang1PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang1PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang1PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack1CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack1MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack1BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack1RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack1DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-    }  
-    if ([fAudLang2PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang2PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang2PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack2CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack2MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack2BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack2RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack2DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
-    
-    if ([fAudLang3PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang3PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang3PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack3CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack3MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack3BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack3RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack3DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
-
-    if ([fAudLang4PopUp indexOfSelectedItem] > 0)
-    {
-        audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
-        hb_audio_config_init(audio);
-        audio->in.track = [fAudLang4PopUp indexOfSelectedItem] - 1;
-        /* We go ahead and assign values to our audio->out.<properties> */
-        audio->out.track = [fAudLang4PopUp indexOfSelectedItem] - 1;
-        audio->out.codec = [[fAudTrack4CodecPopUp selectedItem] tag];
-        audio->out.mixdown = [[fAudTrack4MixPopUp selectedItem] tag];
-        audio->out.bitrate = [[fAudTrack4BitratePopUp selectedItem] tag];
-        audio->out.samplerate = [[fAudTrack4RatePopUp selectedItem] tag];
-        audio->out.dynamic_range_compression = [fAudTrack4DrcField floatValue];
-        
-        hb_audio_add( job, audio );
-        free(audio);
-        
-    }
+       [fAudioDelegate prepareAudioForJob: job];
        
 [fVidBitrateField setIntValue: hb_calc_bitrate( job, [fVidTargetSizeField intValue] )];
 }
@@ -4775,8 +4882,14 @@ the user is using "Custom" settings by determining the sender*/
         fTitle->job->keep_ratio = 0;
        }
     
-    [fPictureSizeField setStringValue: [NSString stringWithFormat:@"Picture Size: %@", [fPictureController getPictureSizeInfoString]]];
-    
+    if (fTitle->job->anamorphic.mode != 1) // we are not strict so show the modulus
+       {
+        [fPictureSizeField setStringValue: [NSString stringWithFormat:@"Picture Size: %@, Modulus: %d", [fPictureController getPictureSizeInfoString], fTitle->job->modulus]];
+    }
+    else
+    {
+        [fPictureSizeField setStringValue: [NSString stringWithFormat:@"Picture Size: %@", [fPictureController getPictureSizeInfoString]]];
+    }
     NSString *picCropping;
     /* Set the display field for crop as per boolean */
        if (![fPictureController autoCrop])
@@ -4821,966 +4934,87 @@ the user is using "Custom" settings by determining the sender*/
         /* Deinterlace */
         if ([fPictureController deinterlace] > 0)
         {
-            fTitle->job->deinterlace  = 1;
-        }
-        else
-        {
-            fTitle->job->deinterlace  = 0;
-        }
-        
-        if ([fPictureController deinterlace] == 2)
-        {
-            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Fast)"];
-        }
-        else if ([fPictureController deinterlace] == 3)
-        {
-            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Slow)"];
-        }
-        else if ([fPictureController deinterlace] == 4)
-        {
-            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Slower)"];
-        }
-        else if ([fPictureController deinterlace] == 1)
-        {
-            videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Deinterlace (%@)",[fPictureController deinterlaceCustomString]]];
-        }
-       }
-    
-    
-    /* Denoise */
-       if ([fPictureController denoise] == 2)
-       {
-               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Weak)"];
-    }
-       else if ([fPictureController denoise] == 3)
-       {
-               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Medium)"];
-    }
-       else if ([fPictureController denoise] == 4)
-       {
-               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Strong)"];
-       }
-    else if ([fPictureController denoise] == 1)
-       {
-               videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Denoise (%@)",[fPictureController denoiseCustomString]]];
-       }
-    
-    /* Deblock */
-    if ([fPictureController deblock] > 0) 
-    {
-        videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Deblock (%d)",[fPictureController deblock]]];
-    }
-       
-    /* Grayscale */
-    if ([fPictureController grayscale]) 
-    {
-        videoFilters = [videoFilters stringByAppendingString:@" - Grayscale"];
-    }
-    [fVideoFiltersField setStringValue: [NSString stringWithFormat:@"Video Filters: %@", videoFilters]];
-    
-    //[fPictureController reloadStillPreview]; 
-}
-
-
-#pragma mark -
-#pragma mark - Audio and Subtitles
-- (IBAction) audioCodecsPopUpChanged: (id) sender
-{
-    
-    NSPopUpButton * audiotrackPopUp;
-    NSPopUpButton * sampleratePopUp;
-    NSPopUpButton * bitratePopUp;
-    NSPopUpButton * audiocodecPopUp;
-    if (sender == fAudTrack1CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang1PopUp;
-        audiocodecPopUp = fAudTrack1CodecPopUp;
-        sampleratePopUp = fAudTrack1RatePopUp;
-        bitratePopUp = fAudTrack1BitratePopUp;
-    }
-    else if (sender == fAudTrack2CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang2PopUp;
-        audiocodecPopUp = fAudTrack2CodecPopUp;
-        sampleratePopUp = fAudTrack2RatePopUp;
-        bitratePopUp = fAudTrack2BitratePopUp;
-    }
-    else if (sender == fAudTrack3CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang3PopUp;
-        audiocodecPopUp = fAudTrack3CodecPopUp;
-        sampleratePopUp = fAudTrack3RatePopUp;
-        bitratePopUp = fAudTrack3BitratePopUp;
-    }
-    else
-    {
-        audiotrackPopUp = fAudLang4PopUp;
-        audiocodecPopUp = fAudTrack4CodecPopUp;
-        sampleratePopUp = fAudTrack4RatePopUp;
-        bitratePopUp = fAudTrack4BitratePopUp;
-    }
-       
-    /* changing the codecs on offer may mean that we can / can't offer mono or 6ch, */
-       /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-    [self audioTrackPopUpChanged: audiotrackPopUp];
-    
-}
-
-- (IBAction) setEnabledStateOfAudioMixdownControls: (id) sender
-{
-    /* We will be setting the enabled/disabled state of each tracks audio controls based on
-     * the settings of the source audio for that track. We leave the samplerate and bitrate
-     * to audiotrackMixdownChanged
-     */
-    
-    /* We will first verify that a lower track number has been selected before enabling each track
-     * for example, make sure a track is selected for track 1 before enabling track 2, etc.
-     */
-    if ([fAudLang1PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudLang2PopUp setEnabled: NO];
-        [fAudLang2PopUp selectItemAtIndex: 0];
-    }
-    else
-    {
-        [fAudLang2PopUp setEnabled: YES];
-    }
-    
-    if ([fAudLang2PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudLang3PopUp setEnabled: NO];
-        [fAudLang3PopUp selectItemAtIndex: 0];
-    }
-    else
-    {
-        [fAudLang3PopUp setEnabled: YES];
-    }
-    if ([fAudLang3PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudLang4PopUp setEnabled: NO];
-        [fAudLang4PopUp selectItemAtIndex: 0];
-    }
-    else
-    {
-        [fAudLang4PopUp setEnabled: YES];
-    }
-    /* enable/disable the mixdown text and popupbutton for audio track 1 */
-    [fAudTrack1CodecPopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1MixPopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1RatePopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1BitratePopUp setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1DrcSlider setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack1DrcField setEnabled: ([fAudLang1PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    if ([fAudLang1PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudTrack1CodecPopUp removeAllItems];
-        [fAudTrack1MixPopUp removeAllItems];
-        [fAudTrack1RatePopUp removeAllItems];
-        [fAudTrack1BitratePopUp removeAllItems];
-        [fAudTrack1DrcSlider setFloatValue: 0.00];
-        [self audioDRCSliderChanged: fAudTrack1DrcSlider];
-    }
-    else if ([[fAudTrack1MixPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack1MixPopUp selectedItem] tag] == HB_ACODEC_DCA)
-    {
-        [fAudTrack1RatePopUp setEnabled: NO];
-        [fAudTrack1BitratePopUp setEnabled: NO];
-        [fAudTrack1DrcSlider setEnabled: NO];
-        [fAudTrack1DrcField setEnabled: NO];
-    }
-    
-    /* enable/disable the mixdown text and popupbutton for audio track 2 */
-    [fAudTrack2CodecPopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2MixPopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2RatePopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2BitratePopUp setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2DrcSlider setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack2DrcField setEnabled: ([fAudLang2PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    if ([fAudLang2PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudTrack2CodecPopUp removeAllItems];
-        [fAudTrack2MixPopUp removeAllItems];
-        [fAudTrack2RatePopUp removeAllItems];
-        [fAudTrack2BitratePopUp removeAllItems];
-        [fAudTrack2DrcSlider setFloatValue: 0.00];
-        [self audioDRCSliderChanged: fAudTrack2DrcSlider];
-    }
-    else if ([[fAudTrack2MixPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack2MixPopUp selectedItem] tag] == HB_ACODEC_DCA)
-    {
-        [fAudTrack2RatePopUp setEnabled: NO];
-        [fAudTrack2BitratePopUp setEnabled: NO];
-        [fAudTrack2DrcSlider setEnabled: NO];
-        [fAudTrack2DrcField setEnabled: NO];
-    }
-    
-    /* enable/disable the mixdown text and popupbutton for audio track 3 */
-    [fAudTrack3CodecPopUp setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack3MixPopUp setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack3RatePopUp setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack3BitratePopUp setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack3DrcSlider setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack3DrcField setEnabled: ([fAudLang3PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    if ([fAudLang3PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudTrack3CodecPopUp removeAllItems];
-        [fAudTrack3MixPopUp removeAllItems];
-        [fAudTrack3RatePopUp removeAllItems];
-        [fAudTrack3BitratePopUp removeAllItems];
-        [fAudTrack3DrcSlider setFloatValue: 0.00];
-        [self audioDRCSliderChanged: fAudTrack3DrcSlider];
-    }
-    else if ([[fAudTrack3MixPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack3MixPopUp selectedItem] tag] == HB_ACODEC_DCA)
-    {
-        [fAudTrack3RatePopUp setEnabled: NO];
-        [fAudTrack3BitratePopUp setEnabled: NO];
-        [fAudTrack3DrcSlider setEnabled: NO];
-        [fAudTrack3DrcField setEnabled: NO];
-    }
-    
-    /* enable/disable the mixdown text and popupbutton for audio track 4 */
-    [fAudTrack4CodecPopUp setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack4MixPopUp setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack4RatePopUp setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack4BitratePopUp setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack4DrcSlider setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    [fAudTrack4DrcField setEnabled: ([fAudLang4PopUp indexOfSelectedItem] == 0) ? NO : YES];
-    if ([fAudLang4PopUp indexOfSelectedItem] == 0)
-    {
-        [fAudTrack4CodecPopUp removeAllItems];
-        [fAudTrack4MixPopUp removeAllItems];
-        [fAudTrack4RatePopUp removeAllItems];
-        [fAudTrack4BitratePopUp removeAllItems];
-        [fAudTrack4DrcSlider setFloatValue: 0.00];
-        [self audioDRCSliderChanged: fAudTrack4DrcSlider];
-    }
-    else if ([[fAudTrack4MixPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[fAudTrack4MixPopUp selectedItem] tag] == HB_ACODEC_DCA)
-    {
-        [fAudTrack4RatePopUp setEnabled: NO];
-        [fAudTrack4BitratePopUp setEnabled: NO];
-        [fAudTrack4DrcSlider setEnabled: NO];
-        [fAudTrack4DrcField setEnabled: NO];
-    }
-    
-}
-
-- (IBAction) addAllAudioTracksToPopUp: (id) sender
-{
-
-    hb_list_t  * list  = hb_get_titles( fHandle );
-    hb_title_t * title = (hb_title_t*)
-        hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
-
-       hb_audio_config_t * audio;
-
-    [sender removeAllItems];
-    [sender addItemWithTitle: NSLocalizedString( @"None", @"" )];
-    for( int i = 0; i < hb_list_count( title->list_audio ); i++ )
-    {
-        audio = (hb_audio_config_t *) hb_list_audio_config_item( title->list_audio, i );
-        [[sender menu] addItemWithTitle:
-            [NSString stringWithUTF8String: audio->lang.description]
-            action: NULL keyEquivalent: @""];
-    }
-    [sender selectItemAtIndex: 0];
-
-}
-
-- (IBAction) selectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound
-{
-
-    /* this method can be used to find a language, or a language-and-source-format combination, by passing in the appropriate string */
-    /* e.g. to find the first French track, pass in an NSString * of "Francais" */
-    /* e.g. to find the first English 5.1 AC3 track, pass in an NSString * of "English (AC3) (5.1 ch)" */
-    /* if no matching track is found, then selectIndexIfNotFound is used to choose which track to select instead */
-
-       if (searchPrefixString)
-       {
-
-        for( int i = 0; i < [sender numberOfItems]; i++ )
-        {
-            /* Try to find the desired search string */
-            if ([[[sender itemAtIndex: i] title] hasPrefix:searchPrefixString])
-            {
-                [sender selectItemAtIndex: i];
-                return;
-            }
-        }
-        /* couldn't find the string, so select the requested "search string not found" item */
-        /* index of 0 means select the "none" item */
-        /* index of 1 means select the first audio track */
-        [sender selectItemAtIndex: selectIndexIfNotFound];
-       }
-    else
-    {
-        /* if no search string is provided, then select the selectIndexIfNotFound item */
-        [sender selectItemAtIndex: selectIndexIfNotFound];
-    }
-
-}
-- (IBAction) audioAddAudioTrackCodecs: (id)sender
-{
-    int format = [fDstFormatPopUp indexOfSelectedItem];
-    
-    /* setup pointers to the appropriate popups for the correct track */
-    NSPopUpButton * audiocodecPopUp;
-    NSPopUpButton * audiotrackPopUp;
-    if (sender == fAudTrack1CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang1PopUp;
-        audiocodecPopUp = fAudTrack1CodecPopUp;
-    }
-    else if (sender == fAudTrack2CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang2PopUp;
-        audiocodecPopUp = fAudTrack2CodecPopUp;
-    }
-    else if (sender == fAudTrack3CodecPopUp)
-    {
-        audiotrackPopUp = fAudLang3PopUp;
-        audiocodecPopUp = fAudTrack3CodecPopUp;
-    }
-    else
-    {
-        audiotrackPopUp = fAudLang4PopUp;
-        audiocodecPopUp = fAudTrack4CodecPopUp;
-    }
-    
-    [audiocodecPopUp removeAllItems];
-    /* Make sure "None" isnt selected in the source track */
-    if ([audiotrackPopUp indexOfSelectedItem] > 0)
-    {
-        [audiocodecPopUp setEnabled:YES];
-        NSMenuItem *menuItem;
-        /* We setup our appropriate popups for codecs and put the int value in the popup tag for easy retrieval */
-        switch( format )
-        {
-            case 0:
-                /* MP4 */
-                // FAAC
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (faac)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_FAAC];
-
-                // CA_AAC
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (CoreAudio)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_CA_AAC];
-
-                // AC3 Passthru
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AC3 Passthru" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_AC3];
-                break;
-                
-            case 1:
-                /* MKV */
-                // FAAC
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (faac)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_FAAC];
-                // CA_AAC
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AAC (CoreAudio)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_CA_AAC];
-                // AC3 Passthru
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AC3 Passthru" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_AC3];
-                // DTS Passthru
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"DTS Passthru" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_DCA];
-                // MP3
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"MP3 (lame)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_LAME];
-                // Vorbis
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"Vorbis (vorbis)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_VORBIS];
-                break;
-                
-            case 2: 
-                /* AVI */
-                // MP3
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"MP3 (lame)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_LAME];
-                // AC3 Passthru
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"AC3 Passthru" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_AC3];
-                break;
-                
-            case 3:
-                /* OGM */
-                // Vorbis
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"Vorbis (vorbis)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_VORBIS];
-                // MP3
-                menuItem = [[audiocodecPopUp menu] addItemWithTitle:@"MP3 (lame)" action: NULL keyEquivalent: @""];
-                [menuItem setTag: HB_ACODEC_LAME];
-                break;
-        }
-        [audiocodecPopUp selectItemAtIndex:0];
-    }
-    else
-    {
-        [audiocodecPopUp setEnabled:NO];
-    }
-}
-
-- (IBAction) audioTrackPopUpChanged: (id) sender
-{
-    /* utility function to call audioTrackPopUpChanged without passing in a mixdown-to-use */
-    [self audioTrackPopUpChanged: sender mixdownToUse: 0];
-}
-
-- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse
-{
-    
-    /* make sure we have a selected title before continuing */
-    if (fTitle == NULL) return;
-    /* if the sender is the lanaguage popup and there is nothing in the codec popup, lets call
-    * audioAddAudioTrackCodecs on the codec popup to populate it properly before moving on
-    */
-    if (sender == fAudLang1PopUp && [[fAudTrack1CodecPopUp menu] numberOfItems] == 0)
-    {
-        [self audioAddAudioTrackCodecs: fAudTrack1CodecPopUp];
-    }
-    if (sender == fAudLang2PopUp && [[fAudTrack2CodecPopUp menu] numberOfItems] == 0)
-    {
-        [self audioAddAudioTrackCodecs: fAudTrack2CodecPopUp];
-    }
-    if (sender == fAudLang3PopUp && [[fAudTrack3CodecPopUp menu] numberOfItems] == 0)
-    {
-        [self audioAddAudioTrackCodecs: fAudTrack3CodecPopUp];
-    }
-    if (sender == fAudLang4PopUp && [[fAudTrack4CodecPopUp menu] numberOfItems] == 0)
-    {
-        [self audioAddAudioTrackCodecs: fAudTrack4CodecPopUp];
-    }
-    
-    /* Now lets make the sender the appropriate Audio Track popup from this point on */
-    if (sender == fAudTrack1CodecPopUp || sender == fAudTrack1MixPopUp)
-    {
-        sender = fAudLang1PopUp;
-    }
-    if (sender == fAudTrack2CodecPopUp || sender == fAudTrack2MixPopUp)
-    {
-        sender = fAudLang2PopUp;
-    }
-    if (sender == fAudTrack3CodecPopUp || sender == fAudTrack3MixPopUp)
-    {
-        sender = fAudLang3PopUp;
-    }
-    if (sender == fAudTrack4CodecPopUp || sender == fAudTrack4MixPopUp)
-    {
-        sender = fAudLang4PopUp;
-    }
-    
-    /* pointer to this track's mixdown, codec, sample rate and bitrate NSPopUpButton's */
-    NSPopUpButton * mixdownPopUp;
-    NSPopUpButton * audiocodecPopUp;
-    NSPopUpButton * sampleratePopUp;
-    NSPopUpButton * bitratePopUp;
-    if (sender == fAudLang1PopUp)
-    {
-        mixdownPopUp = fAudTrack1MixPopUp;
-        audiocodecPopUp = fAudTrack1CodecPopUp;
-        sampleratePopUp = fAudTrack1RatePopUp;
-        bitratePopUp = fAudTrack1BitratePopUp;
-    }
-    else if (sender == fAudLang2PopUp)
-    {
-        mixdownPopUp = fAudTrack2MixPopUp;
-        audiocodecPopUp = fAudTrack2CodecPopUp;
-        sampleratePopUp = fAudTrack2RatePopUp;
-        bitratePopUp = fAudTrack2BitratePopUp;
-    }
-    else if (sender == fAudLang3PopUp)
-    {
-        mixdownPopUp = fAudTrack3MixPopUp;
-        audiocodecPopUp = fAudTrack3CodecPopUp;
-        sampleratePopUp = fAudTrack3RatePopUp;
-        bitratePopUp = fAudTrack3BitratePopUp;
-    }
-    else
-    {
-        mixdownPopUp = fAudTrack4MixPopUp;
-        audiocodecPopUp = fAudTrack4CodecPopUp;
-        sampleratePopUp = fAudTrack4RatePopUp;
-        bitratePopUp = fAudTrack4BitratePopUp;
-    }
-
-    /* get the index of the selected audio Track*/
-    int thisAudioIndex = [sender indexOfSelectedItem] - 1;
-
-    /* pointer for the hb_audio_s struct we will use later on */
-    hb_audio_config_t * audio;
-
-    int acodec;
-    /* check if the audio mixdown controls need their enabled state changing */
-    [self setEnabledStateOfAudioMixdownControls:nil];
-
-    if (thisAudioIndex != -1)
-    {
-
-        /* get the audio */
-        audio = (hb_audio_config_t *) hb_list_audio_config_item( fTitle->list_audio, thisAudioIndex );// Should "fTitle" be title and be setup ?
-
-        /* actually manipulate the proper mixdowns here */
-        /* delete the previous audio mixdown options */
-        [mixdownPopUp removeAllItems];
-
-        acodec = [[audiocodecPopUp selectedItem] tag];
-
-        if (audio != NULL)
-        {
-
-            /* find out if our selected output audio codec supports mono and / or 6ch */
-            /* we also check for an input codec of AC3 or DCA,
-             as they are the only libraries able to do the mixdown to mono / conversion to 6-ch */
-            /* audioCodecsSupportMono and audioCodecsSupport6Ch are the same for now,
-             but this may change in the future, so they are separated for flexibility */
-            int audioCodecsSupportMono =
-                    (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                    (acodec != HB_ACODEC_LAME);
-            int audioCodecsSupport6Ch =
-                    (audio->in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA)) &&
-                    (acodec != HB_ACODEC_LAME);
-            
-            /* check for AC-3 passthru */
-            if (audio->in.codec == HB_ACODEC_AC3 && acodec == HB_ACODEC_AC3)
-            {
-                
-            NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                 [NSString stringWithUTF8String: "AC3 Passthru"]
-                                               action: NULL keyEquivalent: @""];
-             [menuItem setTag: HB_ACODEC_AC3];   
-            }
-            else if (audio->in.codec == HB_ACODEC_DCA && acodec == HB_ACODEC_DCA)
-            {
-            NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                 [NSString stringWithUTF8String: "DTS Passthru"]
-                                               action: NULL keyEquivalent: @""];
-             [menuItem setTag: HB_ACODEC_DCA]; 
-            }
-            else
-            {
-                
-                /* add the appropriate audio mixdown menuitems to the popupbutton */
-                /* in each case, we set the new menuitem's tag to be the amixdown value for that mixdown,
-                 so that we can reference the mixdown later */
-                
-                /* keep a track of the min and max mixdowns we used, so we can select the best match later */
-                int minMixdownUsed = 0;
-                int maxMixdownUsed = 0;
-                
-                /* get the input channel layout without any lfe channels */
-                int layout = audio->in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK;
-                
-                /* do we want to add a mono option? */
-                if (audioCodecsSupportMono == 1)
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[0].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[0].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[0].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[0].amixdown);
-                }
-                
-                /* do we want to add a stereo option? */
-                /* offer stereo if we have a mono source and non-mono-supporting codecs, as otherwise we won't have a mixdown at all */
-                /* also offer stereo if we have a stereo-or-better source */
-                if ((layout == HB_INPUT_CH_LAYOUT_MONO && audioCodecsSupportMono == 0) || layout >= HB_INPUT_CH_LAYOUT_STEREO)
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[1].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[1].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[1].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[1].amixdown);
-                }
-                
-                /* do we want to add a dolby surround (DPL1) option? */
-                if (layout == HB_INPUT_CH_LAYOUT_3F1R || layout == HB_INPUT_CH_LAYOUT_3F2R || layout == HB_INPUT_CH_LAYOUT_DOLBY)
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[2].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[2].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[2].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[2].amixdown);
-                }
-                
-                /* do we want to add a dolby pro logic 2 (DPL2) option? */
-                if (layout == HB_INPUT_CH_LAYOUT_3F2R)
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[3].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[3].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[3].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[3].amixdown);
-                }
-                
-                /* do we want to add a 6-channel discrete option? */
-                if (audioCodecsSupport6Ch == 1 && layout == HB_INPUT_CH_LAYOUT_3F2R && (audio->in.channel_layout & HB_INPUT_CH_LAYOUT_HAS_LFE))
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[4].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: hb_audio_mixdowns[4].amixdown];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[4].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[4].amixdown);
-                }
-                
-                /* do we want to add an AC-3 passthrough option? */
-                if (audio->in.codec == HB_ACODEC_AC3 && acodec == HB_ACODEC_AC3) 
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[5].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: HB_ACODEC_AC3];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[5].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[5].amixdown);
-                }
-                
-                /* do we want to add a DTS Passthru option ? HB_ACODEC_DCA*/
-                if (audio->in.codec == HB_ACODEC_DCA && acodec == HB_ACODEC_DCA) 
-                {
-                    NSMenuItem *menuItem = [[mixdownPopUp menu] addItemWithTitle:
-                                            [NSString stringWithUTF8String: hb_audio_mixdowns[5].human_readable_name]
-                                                                          action: NULL keyEquivalent: @""];
-                    [menuItem setTag: HB_ACODEC_DCA];
-                    if (minMixdownUsed == 0) minMixdownUsed = hb_audio_mixdowns[5].amixdown;
-                    maxMixdownUsed = MAX(maxMixdownUsed, hb_audio_mixdowns[5].amixdown);
-                }
-                
-                /* auto-select the best mixdown based on our saved mixdown preference */
-                
-                /* for now, this is hard-coded to a "best" mixdown of HB_AMIXDOWN_DOLBYPLII */
-                /* ultimately this should be a prefs option */
-                int useMixdown;
-                
-                /* if we passed in a mixdown to use - in order to load a preset - then try and use it */
-                if (mixdownToUse > 0)
-                {
-                    useMixdown = mixdownToUse;
-                }
-                else
-                {
-                    useMixdown = HB_AMIXDOWN_DOLBYPLII;
-                }
-                
-                /* if useMixdown > maxMixdownUsed, then use maxMixdownUsed */
-                if (useMixdown > maxMixdownUsed)
-                { 
-                    useMixdown = maxMixdownUsed;
-                }
-                
-                /* if useMixdown < minMixdownUsed, then use minMixdownUsed */
-                if (useMixdown < minMixdownUsed)
-                { 
-                    useMixdown = minMixdownUsed;
-                }
-                
-                /* select the (possibly-amended) preferred mixdown */
-                [mixdownPopUp selectItemWithTag: useMixdown];
-
-            }
-            /* In the case of a source track that is not AC3 and the user tries to use AC3 Passthru (which does not work)
-             * we force the Audio Codec choice back to a workable codec. We use MP3 for avi and aac for all
-             * other containers.
-             */
-            if (audio->in.codec != HB_ACODEC_AC3 && [[audiocodecPopUp selectedItem] tag] == HB_ACODEC_AC3)
-            {
-                /* If we are using the avi container, we select MP3 as there is no aac available*/
-                if ([[fDstFormatPopUp selectedItem] tag] == HB_MUX_AVI)
-                {
-                    [audiocodecPopUp selectItemWithTag: HB_ACODEC_LAME];
-                }
-                else
-                {
-                    [audiocodecPopUp selectItemWithTag: HB_ACODEC_FAAC];
-                }
-            }
-            
-            /* In the case of a source track that is not DTS and the user tries to use DTS Passthru (which does not work)
-             * we force the Audio Codec choice back to a workable codec. We use MP3 for avi and aac for all
-             * other containers.
-             */
-            if (audio->in.codec != HB_ACODEC_DCA && [[audiocodecPopUp selectedItem] tag] == HB_ACODEC_DCA)
-            {
-                /* If we are using the avi container, we select MP3 as there is no aac available*/
-                if ([[fDstFormatPopUp selectedItem] tag] == HB_MUX_AVI)
-                {
-                    [audiocodecPopUp selectItemWithTag: HB_ACODEC_LAME];
-                }
-                else
-                {
-                    [audiocodecPopUp selectItemWithTag: HB_ACODEC_FAAC];
-                }
-            }
-            
-            /* Setup our samplerate and bitrate popups we will need based on mixdown */
-            [self audioTrackMixdownChanged: mixdownPopUp];            
-        }
-    
-    }
-    if( [fDstFormatPopUp indexOfSelectedItem] == 0 )
-    {
-        [self autoSetM4vExtension: sender];
-    }
-}
-
-- (IBAction) audioTrackMixdownChanged: (id) sender
-{
-    
-    int acodec;
-    /* setup pointers to all of the other audio track controls
-    * we will need later
-    */
-    NSPopUpButton * mixdownPopUp;
-    NSPopUpButton * sampleratePopUp;
-    NSPopUpButton * bitratePopUp;
-    NSPopUpButton * audiocodecPopUp;
-    NSPopUpButton * audiotrackPopUp;
-    NSSlider * drcSlider;
-    NSTextField * drcField;
-    if (sender == fAudTrack1MixPopUp)
-    {
-        audiotrackPopUp = fAudLang1PopUp;
-        audiocodecPopUp = fAudTrack1CodecPopUp;
-        mixdownPopUp = fAudTrack1MixPopUp;
-        sampleratePopUp = fAudTrack1RatePopUp;
-        bitratePopUp = fAudTrack1BitratePopUp;
-        drcSlider = fAudTrack1DrcSlider;
-        drcField = fAudTrack1DrcField;
-    }
-    else if (sender == fAudTrack2MixPopUp)
-    {
-        audiotrackPopUp = fAudLang2PopUp;
-        audiocodecPopUp = fAudTrack2CodecPopUp;
-        mixdownPopUp = fAudTrack2MixPopUp;
-        sampleratePopUp = fAudTrack2RatePopUp;
-        bitratePopUp = fAudTrack2BitratePopUp;
-        drcSlider = fAudTrack2DrcSlider;
-        drcField = fAudTrack2DrcField;
-    }
-    else if (sender == fAudTrack3MixPopUp)
-    {
-        audiotrackPopUp = fAudLang3PopUp;
-        audiocodecPopUp = fAudTrack3CodecPopUp;
-        mixdownPopUp = fAudTrack3MixPopUp;
-        sampleratePopUp = fAudTrack3RatePopUp;
-        bitratePopUp = fAudTrack3BitratePopUp;
-        drcSlider = fAudTrack3DrcSlider;
-        drcField = fAudTrack3DrcField;
-    }
-    else
-    {
-        audiotrackPopUp = fAudLang4PopUp;
-        audiocodecPopUp = fAudTrack4CodecPopUp;
-        mixdownPopUp = fAudTrack4MixPopUp;
-        sampleratePopUp = fAudTrack4RatePopUp;
-        bitratePopUp = fAudTrack4BitratePopUp;
-        drcSlider = fAudTrack4DrcSlider;
-        drcField = fAudTrack4DrcField;
-    }
-    acodec = [[audiocodecPopUp selectedItem] tag];
-    /* storage variable for the min and max bitrate allowed for this codec */
-    int minbitrate;
-    int maxbitrate;
-    
-    switch( acodec )
-    {
-        case HB_ACODEC_FAAC:
-            /* check if we have a 6ch discrete conversion in either audio track */
-            if ([[mixdownPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
-            {
-                /* FAAC has a minimum of 192 kbps for 6-channel discrete */
-                minbitrate = 192;
-                /* If either mixdown popup includes 6-channel discrete, then allow up to 448 kbps */
-                maxbitrate = 448;
-                break;
-            }
-            else
-            {
-                /* FAAC is happy using our min bitrate of 32 kbps for stereo or mono */
-                minbitrate = 32;
-                /* FAAC won't honour anything more than 160 for stereo, so let's not offer it */
-                /* note: haven't dealt with mono separately here, FAAC will just use the max it can */
-                maxbitrate = 160;
-                break;
-            }
-
-        case HB_ACODEC_CA_AAC:
-            /* check if we have a 6ch discrete conversion in either audio track */
-            if ([[mixdownPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
-            {
-                minbitrate = 128;
-                maxbitrate = 768;
-                break;
-            }
-            else
-            {
-                minbitrate = 64;
-                maxbitrate = 320;
-                break;
-            }
-
-            case HB_ACODEC_LAME:
-            /* Lame is happy using our min bitrate of 32 kbps */
-            minbitrate = 32;
-            /* Lame won't encode if the bitrate is higher than 320 kbps */
-            maxbitrate = 320;
-            break;
-            
-            case HB_ACODEC_VORBIS:
-            if ([[mixdownPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
-            {
-                /* Vorbis causes a crash if we use a bitrate below 192 kbps with 6 channel */
-                minbitrate = 192;
-                /* If either mixdown popup includes 6-channel discrete, then allow up to 384 kbps */
-                maxbitrate = 384;
-                break;
-            }
-            else
-            {
-                /* Vorbis causes a crash if we use a bitrate below 48 kbps */
-                minbitrate = 48;
-                /* Vorbis can cope with 384 kbps quite happily, even for stereo */
-                maxbitrate = 384;
-                break;
-            }
-            
-            default:
-            /* AC3 passthru disables the bitrate dropdown anyway, so we might as well just use the min and max bitrate */
-            minbitrate = 32;
-            maxbitrate = 384;
-            
-    }
-    
-    /* make sure we have a selected title before continuing */
-    if (fTitle == NULL) return;
-    /* get the audio so we can find out what input rates are*/
-    hb_audio_config_t * audio;
-    audio = (hb_audio_config_t *) hb_list_audio_config_item( fTitle->list_audio, [audiotrackPopUp indexOfSelectedItem] - 1 );
-    int inputbitrate = audio->in.bitrate / 1000;
-    int inputsamplerate = audio->in.samplerate;
-    
-    if ([[mixdownPopUp selectedItem] tag] != HB_ACODEC_AC3 && [[mixdownPopUp selectedItem] tag] != HB_ACODEC_DCA)
-    {
-        [bitratePopUp removeAllItems];
-        
-        for( int i = 0; i < hb_audio_bitrates_count; i++ )
+            fTitle->job->deinterlace  = 1;
+        }
+        else
         {
-            if (hb_audio_bitrates[i].rate >= minbitrate && hb_audio_bitrates[i].rate <= maxbitrate)
-            {
-                /* add a new menuitem for this bitrate */
-                NSMenuItem *menuItem = [[bitratePopUp menu] addItemWithTitle:
-                                        [NSString stringWithUTF8String: hb_audio_bitrates[i].string]
-                                                                      action: NULL keyEquivalent: @""];
-                /* set its tag to be the actual bitrate as an integer, so we can retrieve it later */
-                [menuItem setTag: hb_audio_bitrates[i].rate];
-            }
+            fTitle->job->deinterlace  = 0;
         }
         
-        /* select the default bitrate (but use 384 for 6-ch AAC) */
-        if ([[mixdownPopUp selectedItem] tag] == HB_AMIXDOWN_6CH)
+        if ([fPictureController deinterlace] == 2)
         {
-            [bitratePopUp selectItemWithTag: 384];
+            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Fast)"];
         }
-        else
+        else if ([fPictureController deinterlace] == 3)
         {
-            [bitratePopUp selectItemWithTag: hb_audio_bitrates[hb_audio_bitrates_default].rate];
+            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Slow)"];
         }
-    }
-    /* populate and set the sample rate popup */
-    /* Audio samplerate */
-    [sampleratePopUp removeAllItems];
-    /* we create a same as source selection (Auto) so that we can choose to use the input sample rate */
-    NSMenuItem *menuItem = [[sampleratePopUp menu] addItemWithTitle: @"Auto" action: NULL keyEquivalent: @""];
-    [menuItem setTag: inputsamplerate];
-    
-    for( int i = 0; i < hb_audio_rates_count; i++ )
-    {
-        NSMenuItem *menuItem = [[sampleratePopUp menu] addItemWithTitle:
-                                [NSString stringWithUTF8String: hb_audio_rates[i].string]
-                                                                 action: NULL keyEquivalent: @""];
-        [menuItem setTag: hb_audio_rates[i].rate];
-    }
-    /* We use the input sample rate as the default sample rate as downsampling just makes audio worse
-    * and there is no compelling reason to use anything else as default, though the users default
-    * preset will likely override any setting chosen here.
-    */
-    [sampleratePopUp selectItemWithTag: inputsamplerate];
+        else if ([fPictureController deinterlace] == 4)
+        {
+            videoFilters = [videoFilters stringByAppendingString:@" - Deinterlace (Slower)"];
+        }
+        else if ([fPictureController deinterlace] == 1)
+        {
+            videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Deinterlace (%@)",[fPictureController deinterlaceCustomString]]];
+        }
+       }
     
     
-    /* Since AC3 Pass Thru and DTS Pass Thru uses the input bitrate and sample rate, we get the input tracks
-    * bitrate and display it in the bitrate popup even though libhb happily ignores any bitrate input from
-    * the gui. We do this for better user feedback in the audio tab as well as the queue for the most part
-    */
-    if ([[mixdownPopUp selectedItem] tag] == HB_ACODEC_AC3 || [[mixdownPopUp selectedItem] tag] == HB_ACODEC_DCA)
-    {
-        
-        /* lets also set the bitrate popup to the input bitrate as thats what passthru will use */
-        [bitratePopUp removeAllItems];
-        NSMenuItem *menuItem = [[bitratePopUp menu] addItemWithTitle:
-                                [NSString stringWithFormat:@"%d", inputbitrate]
-                                                              action: NULL keyEquivalent: @""];
-        [menuItem setTag: inputbitrate];
-        /* For ac3 passthru we disable the sample rate and bitrate popups as well as the drc slider*/
-        [bitratePopUp setEnabled: NO];
-        [sampleratePopUp setEnabled: NO];
-        
-        [drcSlider setFloatValue: 0.00];
-        [self audioDRCSliderChanged: drcSlider];
-        [drcSlider setEnabled: NO];
-        [drcField setEnabled: NO];
-    }
-    else
-    {
-        [sampleratePopUp setEnabled: YES];
-        [bitratePopUp setEnabled: YES];
-        [drcSlider setEnabled: YES];
-        [drcField setEnabled: YES];
-    }
-[self calculateBitrate:nil];    
-}
-
-- (IBAction) audioDRCSliderChanged: (id) sender
-{
-    NSSlider * drcSlider;
-    NSTextField * drcField;
-    if (sender == fAudTrack1DrcSlider)
-    {
-        drcSlider = fAudTrack1DrcSlider;
-        drcField = fAudTrack1DrcField;
-    }
-    else if (sender == fAudTrack2DrcSlider)
-    {
-        drcSlider = fAudTrack2DrcSlider;
-        drcField = fAudTrack2DrcField;
+    /* Denoise */
+       if ([fPictureController denoise] == 2)
+       {
+               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Weak)"];
     }
-    else if (sender == fAudTrack3DrcSlider)
-    {
-        drcSlider = fAudTrack3DrcSlider;
-        drcField = fAudTrack3DrcField;
+       else if ([fPictureController denoise] == 3)
+       {
+               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Medium)"];
     }
-    else
+       else if ([fPictureController denoise] == 4)
+       {
+               videoFilters = [videoFilters stringByAppendingString:@" - Denoise (Strong)"];
+       }
+    else if ([fPictureController denoise] == 1)
+       {
+               videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Denoise (%@)",[fPictureController denoiseCustomString]]];
+       }
+    
+    /* Deblock */
+    if ([fPictureController deblock] > 0) 
     {
-        drcSlider = fAudTrack4DrcSlider;
-        drcField = fAudTrack4DrcField;
+        videoFilters = [videoFilters stringByAppendingString:[NSString stringWithFormat:@" - Deblock (%d)",[fPictureController deblock]]];
     }
-    
-    /* If we are between 0.0 and 1.0 on the slider, snap it to 1.0 */
-    if ([drcSlider floatValue] > 0.0 && [drcSlider floatValue] < 1.0)
+       
+    /* Grayscale */
+    if ([fPictureController grayscale]) 
     {
-        [drcSlider setFloatValue:1.0];
+        videoFilters = [videoFilters stringByAppendingString:@" - Grayscale"];
     }
+    [fVideoFiltersField setStringValue: [NSString stringWithFormat:@"Video Filters: %@", videoFilters]];
     
-    
-    [drcField setStringValue: [NSString stringWithFormat: @"%.2f", [drcSlider floatValue]]];
-    /* For now, do not call this until we have an intelligent way to determine audio track selections
-    * compared to presets
-    */
-    //[self customSettingUsed: sender];
+    //[fPictureController reloadStillPreview]; 
 }
 
+
+#pragma mark -
+#pragma mark - Audio and Subtitles
+
+
 #pragma mark -
 
+- (BOOL) hasValidPresetSelected
+
+{
+       return ([fPresetsOutlineView selectedRow] >= 0 && [[[fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]] objectForKey:@"Folder"] intValue] != 1);
+}
+
+//     This causes all audio tracks from the title to be used based on the current preset
+- (IBAction) addAllAudioTracks: (id) sender
+
+{
+       [fAudioDelegate addAllTracksFromPreset: [fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]]];
+       return;
+}
+
 - (IBAction) browseImportSrtFile: (id) sender
 {
 
@@ -5837,12 +5071,12 @@ the user is using "Custom" settings by determining the sender*/
 - (IBAction) openForums: (id) sender
 {
     [[NSWorkspace sharedWorkspace] openURL: [NSURL
-        URLWithString:@"http://handbrake.fr/forum/"]];
+        URLWithString:@"http://forum.handbrake.fr/"]];
 }
 - (IBAction) openUserGuide: (id) sender
 {
     [[NSWorkspace sharedWorkspace] openURL: [NSURL
-        URLWithString:@"http://handbrake.fr/trac/wiki/HandBrakeGuide"]];
+        URLWithString:@"http://trac.handbrake.fr/wiki/HandBrakeGuide"]];
 }
 
 /**
@@ -6128,6 +5362,14 @@ return YES;
     //}
 }
 
+- (void) outlineViewSelectionDidChange: (NSNotification *) ignored
+
+{
+       [self willChangeValueForKey: @"hasValidPresetSelected"];
+       [self didChangeValueForKey: @"hasValidPresetSelected"];
+       return;
+}
+
 #pragma mark -
 #pragma mark Preset Outline View Methods (dragging related)
 
@@ -6242,7 +5484,7 @@ return YES;
 - (IBAction)selectPreset:(id)sender
 {
     
-    if ([fPresetsOutlineView selectedRow] >= 0 && [[[fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]] objectForKey:@"Folder"] intValue] != 1)
+       if (YES == [self hasValidPresetSelected])
     {
         chosenPreset = [fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]];
         [fPresetSelectedDisplay setStringValue:[chosenPreset objectForKey:@"PresetName"]];
@@ -6326,7 +5568,9 @@ return YES;
         {
             [fVidRatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"VideoFramerate"]];
         }
-        
+        /* Set PFR */
+        [fFrameratePfrCheck setState:[[chosenPreset objectForKey:@"VideoFrameratePFR"] intValue]];
+        [self videoFrameRateChanged:nil];
         
         /* 2 Pass Encoding */
         [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
@@ -6336,293 +5580,7 @@ return YES;
         [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
         
         /*Audio*/
-        /* First we check to see if we are using the current audio track layout based on AudioList array */
-        if ([chosenPreset objectForKey:@"AudioList"])
-        {
-            
-            /* pointer to this track's mixdown, codec, sample rate and bitrate NSPopUpButton's */
-            NSPopUpButton * trackLangPopUp = nil;
-            NSPopUpButton * mixdownPopUp = nil;
-            NSPopUpButton * audiocodecPopUp = nil;
-            NSPopUpButton * sampleratePopUp = nil;
-            NSPopUpButton * bitratePopUp = nil;
-            NSSlider      * drcSlider = nil;
-            
-            
-            /* Populate the audio widgets based on the contents of the AudioList array */
-            int i = 0;
-            NSEnumerator *enumerator = [[chosenPreset objectForKey:@"AudioList"] objectEnumerator];
-            id tempObject;
-            while (tempObject = [enumerator nextObject])
-            {
-                i++;
-                if( i == 1 )
-                {
-                    trackLangPopUp = fAudLang1PopUp;
-                    mixdownPopUp = fAudTrack1MixPopUp;
-                    audiocodecPopUp = fAudTrack1CodecPopUp;
-                    sampleratePopUp = fAudTrack1RatePopUp;
-                    bitratePopUp = fAudTrack1BitratePopUp;
-                    drcSlider = fAudTrack1DrcSlider;
-                }
-                if( i == 2 )
-                {
-                    trackLangPopUp = fAudLang2PopUp;
-                    mixdownPopUp = fAudTrack2MixPopUp;
-                    audiocodecPopUp = fAudTrack2CodecPopUp;
-                    sampleratePopUp = fAudTrack2RatePopUp;
-                    bitratePopUp = fAudTrack2BitratePopUp;
-                    drcSlider = fAudTrack2DrcSlider;
-                }
-                if( i == 3 )
-                {
-                    trackLangPopUp = fAudLang3PopUp;
-                    mixdownPopUp = fAudTrack3MixPopUp;
-                    audiocodecPopUp = fAudTrack3CodecPopUp;
-                    sampleratePopUp = fAudTrack3RatePopUp;
-                    bitratePopUp = fAudTrack3BitratePopUp;
-                    drcSlider = fAudTrack3DrcSlider;
-                }
-                if( i == 4 )
-                {
-                    trackLangPopUp = fAudLang4PopUp;
-                    mixdownPopUp = fAudTrack4MixPopUp;
-                    audiocodecPopUp = fAudTrack4CodecPopUp;
-                    sampleratePopUp = fAudTrack4RatePopUp;
-                    bitratePopUp = fAudTrack4BitratePopUp;
-                    drcSlider = fAudTrack4DrcSlider;
-                }
-                
-                
-                if ([trackLangPopUp indexOfSelectedItem] == 0)
-                {
-                    [trackLangPopUp selectItemAtIndex: 1];
-                }
-                [self audioTrackPopUpChanged: trackLangPopUp];
-                [audiocodecPopUp selectItemWithTitle:[tempObject objectForKey:@"AudioEncoder"]];
-                /* check our pref for core audio and use it in place of faac if applicable */
-                if ([[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] == YES && 
-                    [[tempObject objectForKey:@"AudioEncoder"] isEqualToString: @"AAC (faac)"])
-                {
-                    [audiocodecPopUp selectItemWithTitle:@"AAC (CoreAudio)"];
-                }                    
-                
-                [self audioTrackPopUpChanged: audiocodecPopUp];
-                [mixdownPopUp selectItemWithTitle:[tempObject objectForKey:@"AudioMixdown"]];
-                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-                 * mixdown*/
-                if  ([mixdownPopUp selectedItem] == nil)
-                {
-                    [self audioTrackPopUpChanged: audiocodecPopUp];
-                }
-                [sampleratePopUp selectItemWithTitle:[tempObject objectForKey:@"AudioSamplerate"]];
-                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-                if (![[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"AC3 Passthru"])
-                {
-                    [bitratePopUp selectItemWithTitle:[tempObject objectForKey:@"AudioBitrate"]];
-                }
-                [drcSlider setFloatValue:[[tempObject objectForKey:@"AudioTrackDRCSlider"] floatValue]];
-                [self audioDRCSliderChanged: drcSlider];
-                
-                
-                /* If we are any track greater than 1 check to make sure we have a matching source codec is using ac3 passthru or dts passthru,
-                 * if not we will set the track to "None". Track 1 is allowed to mixdown to a suitable DPL2 mix if we cannot passthru */
-                
-                if( i > 1 )
-                {
-                    /* Check to see if the preset asks for a passhthru track (AC3 or DTS) and verify there is a matching source track if not, set the track to "None". */
-                    if (([[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"AC3 Passthru"] || [[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"DTS Passthru"])  && [trackLangPopUp indexOfSelectedItem] != 0)
-                    {
-                        hb_audio_config_t * audio;
-                        /* get the audio source audio codec */
-                        audio = (hb_audio_config_t *) hb_list_audio_config_item( fTitle->list_audio, [trackLangPopUp indexOfSelectedItem] - 1 );
-                        if (audio != NULL && [[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"AC3 Passthru"] && audio->in.codec != HB_ACODEC_AC3 ||
-                            [[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"DTS Passthru"] && audio->in.codec != HB_ACODEC_DCA )
-                        {
-                            /* We have a preset using ac3 passthru but no ac3 source audio, so set the track to "None" and bail */
-                            if ([[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"AC3 Passthru"])
-                            {
-                                [self writeToActivityLog: "Preset calls for AC3 Pass thru ..."];
-                            }
-                            if ([[tempObject objectForKey:@"AudioEncoder"] isEqualToString:@"DTS Passthru"])
-                            {
-                                [self writeToActivityLog: "Preset calls for DTS Pass thru ..."];
-                            }
-                            [self writeToActivityLog: "No matching source codec, setting track  %d to None", i];
-                            [trackLangPopUp selectItemAtIndex: 0];
-                            [self audioTrackPopUpChanged: trackLangPopUp]; 
-                        }   
-                    }
-                }
-            }
-            
-            /* We now cleanup any extra audio tracks that may have been previously set if we need to */
-            
-            if (i < 4)
-            {
-                [fAudLang4PopUp selectItemAtIndex: 0];
-                [self audioTrackPopUpChanged: fAudLang4PopUp];
-                
-                if (i < 3)
-                {
-                    [fAudLang3PopUp selectItemAtIndex: 0];
-                    [self audioTrackPopUpChanged: fAudLang3PopUp];
-                    
-                    if (i < 2)
-                    {
-                        [fAudLang2PopUp selectItemAtIndex: 0];
-                        [self audioTrackPopUpChanged: fAudLang2PopUp];
-                    }
-                }
-            }
-            
-        }
-        else
-        {
-            if ([chosenPreset objectForKey:@"Audio1Track"] > 0)
-            {
-                if ([fAudLang1PopUp indexOfSelectedItem] == 0)
-                {
-                    [fAudLang1PopUp selectItemAtIndex: 1];
-                }
-                [self audioTrackPopUpChanged: fAudLang1PopUp];
-                [fAudTrack1CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Encoder"]];
-                /* check our pref for core audio and use it in place of faac if applicable */
-                if ([[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] == YES && 
-                    [[chosenPreset objectForKey:@"Audio1Encoder"] isEqualToString: @"AAC (faac)"])
-                {
-                    [fAudTrack1CodecPopUp selectItemWithTitle:@"AAC (CoreAudio)"];
-                }
-                [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
-                [fAudTrack1MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Mixdown"]];
-                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-                 * mixdown*/
-                if  ([fAudTrack1MixPopUp selectedItem] == nil)
-                {
-                    [self audioTrackPopUpChanged: fAudTrack1CodecPopUp];
-                }
-                [fAudTrack1RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Samplerate"]];
-                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-                if (![[chosenPreset objectForKey:@"Audio1Encoder"] isEqualToString:@"AC3 Passthru"])
-                {
-                    [fAudTrack1BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio1Bitrate"]];
-                }
-                [fAudTrack1DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio1TrackDRCSlider"] floatValue]];
-                [self audioDRCSliderChanged: fAudTrack1DrcSlider];
-            }
-            
-            if ([chosenPreset objectForKey:@"Audio2Track"] > 0)
-            {
-                if ([fAudLang2PopUp indexOfSelectedItem] == 0)
-                {
-                    [fAudLang2PopUp selectItemAtIndex: 1];
-                }
-                [self audioTrackPopUpChanged: fAudLang2PopUp];
-                [fAudTrack2CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Encoder"]];
-                /* check our pref for core audio and use it in place of faac if applicable */
-                if ([[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] == YES && 
-                    [[chosenPreset objectForKey:@"Audio2Encoder"] isEqualToString: @"AAC (faac)"])
-                {
-                    [fAudTrack2CodecPopUp selectItemWithTitle:@"AAC (CoreAudio)"];
-                }
-                [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
-                [fAudTrack2MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Mixdown"]];
-                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-                 * mixdown*/
-                if  ([fAudTrack2MixPopUp selectedItem] == nil)
-                {
-                    [self audioTrackPopUpChanged: fAudTrack2CodecPopUp];
-                }
-                [fAudTrack2RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Samplerate"]];
-                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-                if (![[chosenPreset objectForKey:@"Audio2Encoder"] isEqualToString:@"AC3 Passthru"])
-                {
-                    [fAudTrack2BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio2Bitrate"]];
-                }
-                [fAudTrack2DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio2TrackDRCSlider"] floatValue]];
-                [self audioDRCSliderChanged: fAudTrack2DrcSlider];
-            }
-            if ([chosenPreset objectForKey:@"Audio3Track"] > 0)
-            {
-                if ([fAudLang3PopUp indexOfSelectedItem] == 0)
-                {
-                    [fAudLang3PopUp selectItemAtIndex: 1];
-                }
-                [self audioTrackPopUpChanged: fAudLang3PopUp];
-                [fAudTrack3CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Encoder"]];
-                /* check our pref for core audio and use it in place of faac if applicable */
-                if ([[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] == YES && 
-                    [[chosenPreset objectForKey:@"Audio3Encoder"] isEqualToString: @"AAC (faac)"])
-                {
-                    [fAudTrack3CodecPopUp selectItemWithTitle:@"AAC (CoreAudio)"];
-                }
-                [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
-                [fAudTrack3MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Mixdown"]];
-                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-                 * mixdown*/
-                if  ([fAudTrack3MixPopUp selectedItem] == nil)
-                {
-                    [self audioTrackPopUpChanged: fAudTrack3CodecPopUp];
-                }
-                [fAudTrack3RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Samplerate"]];
-                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-                if (![[chosenPreset objectForKey:@"Audio3Encoder"] isEqualToString: @"AC3 Passthru"])
-                {
-                    [fAudTrack3BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio3Bitrate"]];
-                }
-                [fAudTrack3DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio3TrackDRCSlider"] floatValue]];
-                [self audioDRCSliderChanged: fAudTrack3DrcSlider];
-            }
-            if ([chosenPreset objectForKey:@"Audio4Track"] > 0)
-            {
-                if ([fAudLang4PopUp indexOfSelectedItem] == 0)
-                {
-                    [fAudLang4PopUp selectItemAtIndex: 1];
-                }
-                [self audioTrackPopUpChanged: fAudLang4PopUp];
-                [fAudTrack4CodecPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Encoder"]];
-                /* check our pref for core audio and use it in place of faac if applicable */
-                if ([[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] == YES && 
-                    [[chosenPreset objectForKey:@"Audio4Encoder"] isEqualToString: @"AAC (faac)"])
-                {
-                    [fAudTrack4CodecPopUp selectItemWithTitle:@"AAC (CoreAudio)"];
-                }
-                [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
-                [fAudTrack4MixPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Mixdown"]];
-                /* check to see if the selections was available, if not, rerun audioTrackPopUpChanged using the codec to just set the default
-                 * mixdown*/
-                if  ([fAudTrack4MixPopUp selectedItem] == nil)
-                {
-                    [self audioTrackPopUpChanged: fAudTrack4CodecPopUp];
-                }
-                [fAudTrack4RatePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Samplerate"]];
-                /* We set the presets bitrate if it is *not* an AC3 track since that uses the input bitrate */
-                if (![[chosenPreset objectForKey:@"Audio4Encoder"] isEqualToString:@"AC3 Passthru"])
-                {
-                    [fAudTrack4BitratePopUp selectItemWithTitle:[chosenPreset objectForKey:@"Audio4Bitrate"]];
-                }
-                [fAudTrack4DrcSlider setFloatValue:[[chosenPreset objectForKey:@"Audio4TrackDRCSlider"] floatValue]];
-                [self audioDRCSliderChanged: fAudTrack4DrcSlider];
-            }
-            
-            /* We now cleanup any extra audio tracks that may have been previously set if we need to */
-            
-            if (![chosenPreset objectForKey:@"Audio2Track"] || [chosenPreset objectForKey:@"Audio2Track"] == 0)
-            {
-                [fAudLang2PopUp selectItemAtIndex: 0];
-                [self audioTrackPopUpChanged: fAudLang2PopUp];
-            }
-            if (![chosenPreset objectForKey:@"Audio3Track"] || [chosenPreset objectForKey:@"Audio3Track"] > 0)
-            {
-                [fAudLang3PopUp selectItemAtIndex: 0];
-                [self audioTrackPopUpChanged: fAudLang3PopUp];
-            }
-            if (![chosenPreset objectForKey:@"Audio4Track"] || [chosenPreset objectForKey:@"Audio4Track"] > 0)
-            {
-                [fAudLang4PopUp selectItemAtIndex: 0];
-                [self audioTrackPopUpChanged: fAudLang4PopUp];
-            }
-        }
+               [fAudioDelegate addTracksFromPreset: chosenPreset];
         
         /*Subtitles*/
         [fSubPopUp selectItemWithTitle:[chosenPreset objectForKey:@"Subtitles"]];
@@ -6666,7 +5624,16 @@ return YES;
                 
             }
             
-            
+            /* Set modulus */
+            if ([chosenPreset objectForKey:@"PictureModulus"])
+            {
+                job->modulus = [[chosenPreset objectForKey:@"PictureModulus"]  intValue];
+            }
+            else
+            {
+                job->modulus = 16;
+            }
+             
             /* Check to see if the objectForKey:@"UsesPictureSettings is 2 which is "Use Max for the source */
             if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
             {
@@ -6703,14 +5670,36 @@ return YES;
                 job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
                 if (job->keep_ratio == 1)
                 {
+                    int height = fTitle->height;
+
+                    if ( job->height && job->height < fTitle->height )
+                        height = job->height;
+
                     hb_fix_aspect( job, HB_KEEP_WIDTH );
-                    if( job->height > fTitle->height )
+                    // Make sure the resulting height is less than
+                    // the title height and less than the height
+                    // requested in the preset.
+                    if( job->height > height )
                     {
-                        job->height = fTitle->height;
+                        job->height = height;
                         hb_fix_aspect( job, HB_KEEP_HEIGHT );
                     }
                 }
                 job->anamorphic.mode = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
+                if ( job->anamorphic.mode > 0 )
+                {
+                    int w, h, par_w, par_h;
+
+                    job->anamorphic.par_width = fTitle->pixel_aspect_width;
+                    job->anamorphic.par_height = fTitle->pixel_aspect_height;
+                    job->maxWidth = job->width;
+                    job->maxHeight = job->height;
+                    hb_set_anamorphic_size( job, &w, &h, &par_w, &par_h );
+                    job->maxWidth = 0;
+                    job->maxHeight = 0;
+                    job->width = w;
+                    job->height = h;
+                }
                 
             }
             
@@ -6885,6 +5874,18 @@ return YES;
 }
 
 
+- (IBAction) addPresetPicDropdownChanged: (id) sender
+{
+    if ([fPresetNewPicSettingsPopUp indexOfSelectedItem] == 1)
+    {
+        [fPresetNewPicWidthHeightBox setHidden:NO];  
+    }
+    else
+    {
+        [fPresetNewPicWidthHeightBox setHidden:YES];
+    }
+}
+
 - (IBAction) showAddPresetPanel: (id) sender
 {
     /* Deselect the currently selected Preset if there is one*/
@@ -6893,7 +5894,7 @@ return YES;
     /* Populate the preset picture settings popup here */
     [fPresetNewPicSettingsPopUp removeAllItems];
     [fPresetNewPicSettingsPopUp addItemWithTitle:@"None"];
-    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Current"];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Custom"];
     [fPresetNewPicSettingsPopUp addItemWithTitle:@"Source Maximum (post source scan)"];
     [fPresetNewPicSettingsPopUp selectItemAtIndex: 0]; 
     /* Uncheck the preset use filters checkbox */
@@ -6903,6 +5904,12 @@ return YES;
     /* Erase info from the input fields*/
        [fPresetNewName setStringValue: @""];
        [fPresetNewDesc setStringValue: @""];
+    
+    /* Initialize custom height and width settings to current values */
+    
+       [fPresetNewPicWidth setStringValue: [NSString stringWithFormat:@"%d",fTitle->job->width]];
+       [fPresetNewPicHeight setStringValue: [NSString stringWithFormat:@"%d",fTitle->job->height]];
+    [self addPresetPicDropdownChanged:nil];
        /* Show the panel */
        [NSApp beginSheet:fAddPresetPanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
 }
@@ -7027,6 +6034,7 @@ return YES;
         {
             [preset setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
         }
+        [preset setObject:[NSNumber numberWithInt:[fFrameratePfrCheck state]] forKey:@"VideoFrameratePFR"];
         
         /* 2 Pass Encoding */
         [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
@@ -7034,13 +6042,14 @@ return YES;
         [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"];
         /*Picture Settings*/
         hb_job_t * job = fTitle->job;
+        
         /* Picture Sizing */
-        /* Use Max Picture settings for whatever the dvd is.*/
         [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-        [preset setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PictureWidth"];
-        [preset setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
+        [preset setObject:[NSNumber numberWithInt:[fPresetNewPicWidth intValue]] forKey:@"PictureWidth"];
+        [preset setObject:[NSNumber numberWithInt:[fPresetNewPicHeight intValue]] forKey:@"PictureHeight"];
         [preset setObject:[NSNumber numberWithInt:fTitle->job->keep_ratio] forKey:@"PictureKeepRatio"];
         [preset setObject:[NSNumber numberWithInt:fTitle->job->anamorphic.mode] forKey:@"PicturePAR"];
+        [preset setObject:[NSNumber numberWithInt:fTitle->job->modulus] forKey:@"PictureModulus"];
         
         /* Set crop settings here */
         [preset setObject:[NSNumber numberWithInt:[fPictureController autoCrop]] forKey:@"PictureAutoCrop"];
@@ -7064,62 +6073,7 @@ return YES;
         
         /*Audio*/
         NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
-        /* we actually call the methods for the nests here */
-        if ([fAudLang1PopUp indexOfSelectedItem] > 0)
-        {
-            NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
-            [audioTrack1Array setObject:[NSNumber numberWithInt:[fAudLang1PopUp indexOfSelectedItem]] forKey:@"AudioTrack"];
-            [audioTrack1Array setObject:[fAudLang1PopUp titleOfSelectedItem] forKey:@"AudioTrackDescription"];
-            [audioTrack1Array setObject:[fAudTrack1CodecPopUp titleOfSelectedItem] forKey:@"AudioEncoder"];
-            [audioTrack1Array setObject:[fAudTrack1MixPopUp titleOfSelectedItem] forKey:@"AudioMixdown"];
-            [audioTrack1Array setObject:[fAudTrack1RatePopUp titleOfSelectedItem] forKey:@"AudioSamplerate"];
-            [audioTrack1Array setObject:[fAudTrack1BitratePopUp titleOfSelectedItem] forKey:@"AudioBitrate"];
-            [audioTrack1Array setObject:[NSNumber numberWithFloat:[fAudTrack1DrcSlider floatValue]] forKey:@"AudioTrackDRCSlider"];
-            [audioTrack1Array autorelease];
-            [audioListArray addObject:audioTrack1Array];
-        }
-        
-        if ([fAudLang2PopUp indexOfSelectedItem] > 0)
-        {
-            NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
-            [audioTrack2Array setObject:[NSNumber numberWithInt:[fAudLang2PopUp indexOfSelectedItem]] forKey:@"AudioTrack"];
-            [audioTrack2Array setObject:[fAudLang2PopUp titleOfSelectedItem] forKey:@"AudioTrackDescription"];
-            [audioTrack2Array setObject:[fAudTrack2CodecPopUp titleOfSelectedItem] forKey:@"AudioEncoder"];
-            [audioTrack2Array setObject:[fAudTrack2MixPopUp titleOfSelectedItem] forKey:@"AudioMixdown"];
-            [audioTrack2Array setObject:[fAudTrack2RatePopUp titleOfSelectedItem] forKey:@"AudioSamplerate"];
-            [audioTrack2Array setObject:[fAudTrack2BitratePopUp titleOfSelectedItem] forKey:@"AudioBitrate"];
-            [audioTrack2Array setObject:[NSNumber numberWithFloat:[fAudTrack2DrcSlider floatValue]] forKey:@"AudioTrackDRCSlider"];
-            [audioTrack2Array autorelease];
-            [audioListArray addObject:audioTrack2Array];
-        }
-        
-        if ([fAudLang3PopUp indexOfSelectedItem] > 0)
-        {
-            NSMutableDictionary *audioTrack3Array = [[NSMutableDictionary alloc] init];
-            [audioTrack3Array setObject:[NSNumber numberWithInt:[fAudLang3PopUp indexOfSelectedItem]] forKey:@"AudioTrack"];
-            [audioTrack3Array setObject:[fAudLang3PopUp titleOfSelectedItem] forKey:@"AudioTrackDescription"];
-            [audioTrack3Array setObject:[fAudTrack3CodecPopUp titleOfSelectedItem] forKey:@"AudioEncoder"];
-            [audioTrack3Array setObject:[fAudTrack3MixPopUp titleOfSelectedItem] forKey:@"AudioMixdown"];
-            [audioTrack3Array setObject:[fAudTrack3RatePopUp titleOfSelectedItem] forKey:@"AudioSamplerate"];
-            [audioTrack3Array setObject:[fAudTrack3BitratePopUp titleOfSelectedItem] forKey:@"AudioBitrate"];
-            [audioTrack3Array setObject:[NSNumber numberWithFloat:[fAudTrack3DrcSlider floatValue]] forKey:@"AudioTrackDRCSlider"];
-            [audioTrack3Array autorelease];
-            [audioListArray addObject:audioTrack3Array];
-        }
-        
-        if ([fAudLang4PopUp indexOfSelectedItem] > 0)
-        {
-            NSMutableDictionary *audioTrack4Array = [[NSMutableDictionary alloc] init];
-            [audioTrack4Array setObject:[NSNumber numberWithInt:[fAudLang4PopUp indexOfSelectedItem]] forKey:@"AudioTrack"];
-            [audioTrack4Array setObject:[fAudLang4PopUp titleOfSelectedItem] forKey:@"AudioTrackDescription"];
-            [audioTrack4Array setObject:[fAudTrack4CodecPopUp titleOfSelectedItem] forKey:@"AudioEncoder"];
-            [audioTrack4Array setObject:[fAudTrack4MixPopUp titleOfSelectedItem] forKey:@"AudioMixdown"];
-            [audioTrack4Array setObject:[fAudTrack4RatePopUp titleOfSelectedItem] forKey:@"AudioSamplerate"];
-            [audioTrack4Array setObject:[fAudTrack4BitratePopUp titleOfSelectedItem] forKey:@"AudioBitrate"];
-            [audioTrack4Array setObject:[NSNumber numberWithFloat:[fAudTrack4DrcSlider floatValue]] forKey:@"AudioTrackDRCSlider"];
-            [audioTrack4Array autorelease];
-            [audioListArray addObject:audioTrack4Array];
-        }
+               [fAudioDelegate prepareAudioForPreset: audioListArray];
         
         
         [preset setObject:[NSMutableArray arrayWithArray: audioListArray] forKey:@"AudioList"];
@@ -7233,7 +6187,7 @@ return YES;
             /* now get and add selected presets to export */
             
         }
-        if ([fPresetsOutlineView selectedRow] >= 0 && [[[fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]] objectForKey:@"Folder"] intValue] != 1)
+               if (YES == [self hasValidPresetSelected])
         {
             [presetsToExport addObject:[fPresetsOutlineView itemAtRow:[fPresetsOutlineView selectedRow]]];
             [presetsToExport writeToFile:exportPresetsFile atomically:YES];
@@ -7598,6 +6552,154 @@ return YES;
     
 }
 
+#pragma mark -
+#pragma mark Chapter Files Import / Export
+
+- (IBAction) browseForChapterFile: (id) sender
+{
+       /* Open a panel to let the user choose the file */
+       NSOpenPanel * panel = [NSOpenPanel openPanel];
+       /* We get the current file name and path from the destination field here */
+       [panel beginSheetForDirectory: [NSString stringWithFormat:@"%@/",
+                                    [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"]]
+                             file: NULL
+                            types: [NSArray arrayWithObjects:@"csv",nil]
+                   modalForWindow: fWindow modalDelegate: self
+                   didEndSelector: @selector( browseForChapterFileDone:returnCode:contextInfo: )
+                      contextInfo: NULL];
+}
+
+- (void) browseForChapterFileDone: (NSOpenPanel *) sheet
+    returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    NSArray *chaptersArray; /* temp array for chapters */
+       NSMutableArray *chaptersMutableArray; /* temp array for chapters */
+    NSString *chapterName;     /* temp string from file */
+    int chapters, i;
+    
+    if( returnCode == NSOKButton )  /* if they click OK */
+    {  
+        chapterName = [[NSString alloc] initWithContentsOfFile:[sheet filename] encoding:NSUTF8StringEncoding error:NULL];
+        chaptersArray = [chapterName componentsSeparatedByString:@"\n"];
+        chaptersMutableArray= [chaptersArray mutableCopy];
+               chapters = [fChapterTitlesDelegate numberOfRowsInTableView:fChapterTable];
+        if ([chaptersMutableArray count] > 0)
+        { 
+        /* if last item is empty remove it */
+            if ([[chaptersMutableArray objectAtIndex:[chaptersArray count]-1] length] == 0)
+            {
+                [chaptersMutableArray removeLastObject];
+            }
+        }
+        /* if chapters in table is not equal to array count */
+        if ((unsigned int) chapters != [chaptersMutableArray count])
+        {
+            [sheet close];
+            [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file")
+                             defaultButton:NSLocalizedString(@"OK", @"OK")
+                           alternateButton:NULL 
+                               otherButton:NULL
+                 informativeTextWithFormat:NSLocalizedString(@"%d chapters expected, %d chapters found in %@", @"%d chapters expected, %d chapters found in %@"), 
+              chapters, [chaptersMutableArray count], [[sheet filename] lastPathComponent]] runModal];
+            return;
+        }
+               /* otherwise, go ahead and populate table with array */
+               for (i=0; i<chapters; i++)
+        {
+         
+            if([[chaptersMutableArray objectAtIndex:i] length] > 5)
+            { 
+                /* avoid a segfault */
+                /* Get the Range.location of the first comma in the line and then put everything after that into chapterTitle */
+                NSRange firstCommaRange = [[chaptersMutableArray objectAtIndex:i] rangeOfString:@","];
+                NSString *chapterTitle = [[chaptersMutableArray objectAtIndex:i] substringFromIndex:firstCommaRange.location + 1];
+                /* Since we store our chapterTitle commas as "\," for the cli, we now need to remove the escaping "\" from the title */
+                chapterTitle = [chapterTitle stringByReplacingOccurrencesOfString:@"\\," withString:@","];
+                [fChapterTitlesDelegate tableView:fChapterTable 
+                                   setObjectValue:chapterTitle
+                                   forTableColumn:fChapterTableNameColumn
+                                              row:i];
+            }
+            else 
+            {
+                [sheet close];
+                [[NSAlert alertWithMessageText:NSLocalizedString(@"Unable to load chapter file", @"Unable to load chapter file")
+                                 defaultButton:NSLocalizedString(@"OK", @"OK")
+                               alternateButton:NULL 
+                                   otherButton:NULL
+                     informativeTextWithFormat:NSLocalizedString(@"%@ was not formatted as expected.", @"%@ was not formatted as expected."), [[sheet filename] lastPathComponent]] runModal];   
+                [fChapterTable reloadData];
+                return;
+            }
+        }
+        [fChapterTable reloadData];
+    }
+}
+
+- (IBAction) browseForChapterFileSave: (id) sender
+{
+    NSSavePanel *panel = [NSSavePanel savePanel];
+    /* Open a panel to let the user save to a file */
+    [panel setAllowedFileTypes:[NSArray arrayWithObjects:@"csv",nil]];
+    [panel beginSheetForDirectory: [[fDstFile2Field stringValue] stringByDeletingLastPathComponent] 
+                             file: [[[[fDstFile2Field stringValue] lastPathComponent] stringByDeletingPathExtension] 
+                                     stringByAppendingString:@"-chapters.csv"]
+                   modalForWindow: fWindow 
+                    modalDelegate: self
+                   didEndSelector: @selector( browseForChapterFileSaveDone:returnCode:contextInfo: )
+                      contextInfo: NULL];
+}
+
+- (void) browseForChapterFileSaveDone: (NSSavePanel *) sheet
+    returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    NSString *chapterName;      /* pointer for string for later file-writing */
+    NSString *chapterTitle;
+    NSError *saveError = [[NSError alloc] init];
+    int chapters, i;    /* ints for the number of chapters in the table and the loop */
+    
+    if( returnCode == NSOKButton )   /* if they clicked OK */
+    {  
+        chapters = [fChapterTitlesDelegate numberOfRowsInTableView:fChapterTable];
+        chapterName = [NSString string];
+        for (i=0; i<chapters; i++)
+        {
+            /* put each chapter title from the table into the array */
+            if (i<9)
+            { /* if i is from 0 to 8 (chapters 1 to 9) add two leading zeros */
+                chapterName = [chapterName stringByAppendingFormat:@"00%d,",i+1];
+            }
+            else if (i<99)
+            { /* if i is from 9 to 98 (chapters 10 to 99) add one leading zero */
+                chapterName = [chapterName stringByAppendingFormat:@"0%d,",i+1];
+            }
+            else if (i<999)
+            { /* in case i is from 99 to 998 (chapters 100 to 999) no leading zeros */
+                chapterName = [chapterName stringByAppendingFormat:@"%d,",i+1];
+            }
+            
+            chapterTitle = [fChapterTitlesDelegate tableView:fChapterTable objectValueForTableColumn:fChapterTableNameColumn row:i];
+            /* escape any commas in the chapter name with "\," */
+            chapterTitle = [chapterTitle stringByReplacingOccurrencesOfString:@"," withString:@"\\,"];
+            chapterName = [chapterName stringByAppendingString:chapterTitle];
+            if (i+1 != chapters)
+            { /* if not the last chapter */
+                chapterName = [chapterName stringByAppendingString:@ "\n"];
+            }
+
+            
+        }
+        /* try to write it to where the user wanted */
+        if (![chapterName writeToFile:[sheet filename] 
+                           atomically:NO 
+                             encoding:NSUTF8StringEncoding 
+                                error:&saveError])
+        {
+            [sheet close];
+            [[NSAlert alertWithError:saveError] runModal];
+        }
+    }
+}
 
 @end
 
index 0d48266..eee243f 100644 (file)
@@ -2,13 +2,13 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
        <data>
                <int key="IBDocument.SystemTarget">1050</int>
-               <string key="IBDocument.SystemVersion">10B504</string>
-               <string key="IBDocument.InterfaceBuilderVersion">732</string>
-               <string key="IBDocument.AppKitVersion">1038.2</string>
-               <string key="IBDocument.HIToolboxVersion">437.00</string>
+               <string key="IBDocument.SystemVersion">10D573</string>
+               <string key="IBDocument.InterfaceBuilderVersion">788</string>
+               <string key="IBDocument.AppKitVersion">1038.29</string>
+               <string key="IBDocument.HIToolboxVersion">460.00</string>
                <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
                        <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-                       <string key="NS.object.0">732</string>
+                       <string key="NS.object.0">788</string>
                </object>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                       <object class="NSPopUpButton" id="502806021">
+                                       <object class="NSTextField" id="297485972">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{242, 275}, {61, 14}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="225631881">
+                                                       <int key="NSCellFlags">68288064</int>
+                                                       <int key="NSCellFlags2">272630784</int>
+                                                       <string key="NSContents">Analysis</string>
+                                                       <object class="NSFont" key="NSSupport" id="755377161">
+                                                               <string key="NSName">LucidaGrande-Bold</string>
+                                                               <double key="NSSize">11</double>
+                                                               <int key="NSfFlags">16</int>
+                                                       </object>
+                                                       <reference key="NSControlView" ref="297485972"/>
+                                                       <object class="NSColor" key="NSBackgroundColor" id="1006136775">
+                                                               <int key="NSColorSpace">6</int>
+                                                               <string key="NSCatalogName">System</string>
+                                                               <string key="NSColorName">controlColor</string>
+                                                               <object class="NSColor" key="NSColor">
+                                                                       <int key="NSColorSpace">3</int>
+                                                                       <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+                                                               </object>
+                                                       </object>
+                                                       <object class="NSColor" key="NSTextColor" id="555417541">
+                                                               <int key="NSColorSpace">6</int>
+                                                               <string key="NSCatalogName">System</string>
+                                                               <string key="NSColorName">controlTextColor</string>
+                                                               <object class="NSColor" key="NSColor" id="534207422">
+                                                                       <int key="NSColorSpace">3</int>
+                                                                       <bytes key="NSWhite">MAA</bytes>
+                                                               </object>
+                                                       </object>
+                                               </object>
+                                       </object>
+                                       <object class="NSTextField" id="120436311">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{-3, 275}, {66, 14}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="571635509">
+                                                       <int key="NSCellFlags">68288064</int>
+                                                       <int key="NSCellFlags2">272630784</int>
+                                                       <string key="NSContents">Encoding</string>
+                                                       <reference key="NSSupport" ref="755377161"/>
+                                                       <reference key="NSControlView" ref="120436311"/>
+                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
+                                                       <reference key="NSTextColor" ref="555417541"/>
+                                               </object>
+                                       </object>
+                                       <object class="NSTextField" id="933060176">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{-3, 128}, {91, 14}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="236903504">
+                                                       <int key="NSCellFlags">68288064</int>
+                                                       <int key="NSCellFlags2">272630784</int>
+                                                       <string key="NSContents">Psychovisual</string>
+                                                       <reference key="NSSupport" ref="755377161"/>
+                                                       <reference key="NSControlView" ref="933060176"/>
+                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
+                                                       <reference key="NSTextColor" ref="555417541"/>
+                                               </object>
+                                       </object>
+                                       <object class="NSPopUpButton" id="742215576">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{150, 264}, {84, 15}}</string>
+                                               <string key="NSFrame">{{120, 151}, {88, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
-                                               <object class="NSPopUpButtonCell" key="NSCell" id="928228060">
+                                               <object class="NSPopUpButtonCell" key="NSCell" id="821448906">
                                                        <int key="NSCellFlags">-2076049856</int>
-                                                       <int key="NSCellFlags2">264192</int>
+                                                       <int key="NSCellFlags2">264704</int>
                                                        <object class="NSFont" key="NSSupport" id="22">
                                                                <string key="NSName">LucidaGrande</string>
                                                                <double key="NSSize">9</double>
                                                                <int key="NSfFlags">3614</int>
                                                        </object>
-                                                       <reference key="NSControlView" ref="502806021"/>
+                                                       <reference key="NSControlView" ref="742215576"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
                                                        <reference key="NSAlternateImage" ref="22"/>
                                                        </object>
                                                        <int key="NSPeriodicDelay">400</int>
                                                        <int key="NSPeriodicInterval">75</int>
-                                                       <object class="NSMenuItem" key="NSMenuItem" id="675281532">
-                                                               <reference key="NSMenu" ref="302593572"/>
+                                                       <object class="NSMenuItem" key="NSMenuItem" id="1001978608">
+                                                               <reference key="NSMenu" ref="278489647"/>
                                                                <string key="NSTitle">Item1</string>
                                                                <string key="NSKeyEquiv"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <object class="NSCustomResource" key="NSOnImage" id="98535564">
+                                                               <object class="NSCustomResource" key="NSOnImage" id="934680330">
                                                                        <string key="NSClassName">NSImage</string>
                                                                        <string key="NSResourceName">NSMenuCheckmark</string>
                                                                </object>
-                                                               <object class="NSCustomResource" key="NSMixedImage" id="993852628">
+                                                               <object class="NSCustomResource" key="NSMixedImage" id="962234898">
                                                                        <string key="NSClassName">NSImage</string>
                                                                        <string key="NSResourceName">NSMenuMixedState</string>
                                                                </object>
                                                                <string key="NSAction">_popUpItemAction:</string>
+                                                               <reference key="NSTarget" ref="821448906"/>
+                                                       </object>
+                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                       <object class="NSMenu" key="NSMenu" id="278489647">
+                                                               <object class="NSMutableString" key="NSTitle">
+                                                                       <characters key="NS.bytes">OtherViews</characters>
+                                                               </object>
+                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                       <reference ref="1001978608"/>
+                                                                       <object class="NSMenuItem" id="101526218">
+                                                                               <reference key="NSMenu" ref="278489647"/>
+                                                                               <string key="NSTitle">Item2</string>
+                                                                               <string key="NSKeyEquiv"/>
+                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
+                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                               <reference key="NSTarget" ref="821448906"/>
+                                                                       </object>
+                                                                       <object class="NSMenuItem" id="447058849">
+                                                                               <reference key="NSMenu" ref="278489647"/>
+                                                                               <string key="NSTitle">Item3</string>
+                                                                               <string key="NSKeyEquiv"/>
+                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
+                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                               <reference key="NSTarget" ref="821448906"/>
+                                                                       </object>
+                                                               </object>
+                                                       </object>
+                                                       <int key="NSPreferredEdge">3</int>
+                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                       <bool key="NSAltersState">YES</bool>
+                                                       <int key="NSArrowPosition">1</int>
+                                               </object>
+                                       </object>
+                                       <object class="NSTextField" id="500710129">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{277, 107}, {116, 16}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="316938196">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">71434240</int>
+                                                       <string key="NSContents">Adaptive Quantization:</string>
+                                                       <object class="NSFont" key="NSSupport" id="826935898">
+                                                               <string key="NSName">LucidaGrande</string>
+                                                               <double key="NSSize">10</double>
+                                                               <int key="NSfFlags">2843</int>
+                                                       </object>
+                                                       <reference key="NSControlView" ref="500710129"/>
+                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
+                                                       <reference key="NSTextColor" ref="555417541"/>
+                                               </object>
+                                       </object>
+                                       <object class="NSSlider" id="938870755">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{398, 105}, {114, 16}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSSliderCell" key="NSCell" id="152220780">
+                                                       <int key="NSCellFlags">-2079981824</int>
+                                                       <int key="NSCellFlags2">262144</int>
+                                                       <string key="NSContents"/>
+                                                       <reference key="NSSupport" ref="22"/>
+                                                       <reference key="NSControlView" ref="938870755"/>
+                                                       <double key="NSMaxValue">1</double>
+                                                       <double key="NSMinValue">0.0</double>
+                                                       <double key="NSValue">0.0</double>
+                                                       <double key="NSAltIncValue">0.0</double>
+                                                       <int key="NSNumberOfTickMarks">11</int>
+                                                       <int key="NSTickMarkPosition">0</int>
+                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
+                                                       <bool key="NSVertical">NO</bool>
+                                               </object>
+                                       </object>
+                                       <object class="NSTextField" id="594030759">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{14, 170}, {102, 16}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="790451247">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">71434240</int>
+                                                       <string key="NSContents">Weighted P-Frames:</string>
+                                                       <reference key="NSSupport" ref="826935898"/>
+                                                       <reference key="NSControlView" ref="594030759"/>
+                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
+                                                       <reference key="NSTextColor" ref="555417541"/>
+                                               </object>
+                                       </object>
+                                       <object class="NSButton" id="390676982">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{118, 172}, {22, 16}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSButtonCell" key="NSCell" id="528921925">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">131072</int>
+                                                       <string key="NSContents"/>
+                                                       <object class="NSFont" key="NSSupport" id="26">
+                                                               <string key="NSName">LucidaGrande</string>
+                                                               <double key="NSSize">11</double>
+                                                               <int key="NSfFlags">3100</int>
+                                                       </object>
+                                                       <reference key="NSControlView" ref="390676982"/>
+                                                       <int key="NSButtonFlags">1211912703</int>
+                                                       <int key="NSButtonFlags2">2</int>
+                                                       <object class="NSButtonImageSource" key="NSAlternateImage" id="534293989">
+                                                               <string key="NSImageName">NSSwitch</string>
+                                                       </object>
+                                                       <string key="NSAlternateContents"/>
+                                                       <string key="NSKeyEquivalent"/>
+                                                       <int key="NSPeriodicDelay">200</int>
+                                                       <int key="NSPeriodicInterval">25</int>
+                                               </object>
+                                       </object>
+                                       <object class="NSPopUpButton" id="502806021">
+                                               <reference key="NSNextResponder" ref="738514360"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{120, 256}, {88, 15}}</string>
+                                               <reference key="NSSuperview" ref="738514360"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSPopUpButtonCell" key="NSCell" id="928228060">
+                                                       <int key="NSCellFlags">-2076049856</int>
+                                                       <int key="NSCellFlags2">264192</int>
+                                                       <reference key="NSSupport" ref="22"/>
+                                                       <reference key="NSControlView" ref="502806021"/>
+                                                       <int key="NSButtonFlags">109199615</int>
+                                                       <int key="NSButtonFlags2">1</int>
+                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <string key="NSAlternateContents"/>
+                                                       <object class="NSMutableString" key="NSKeyEquivalent">
+                                                               <characters key="NS.bytes"/>
+                                                       </object>
+                                                       <int key="NSPeriodicDelay">400</int>
+                                                       <int key="NSPeriodicInterval">75</int>
+                                                       <object class="NSMenuItem" key="NSMenuItem" id="675281532">
+                                                               <reference key="NSMenu" ref="302593572"/>
+                                                               <string key="NSTitle">Item1</string>
+                                                               <string key="NSKeyEquiv"/>
+                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                               <int key="NSState">1</int>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
+                                                               <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="928228060"/>
                                                        </object>
                                                        <bool key="NSMenuItemRespectAlignment">YES</bool>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="928228060"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="928228060"/>
                                                                        </object>
                                        <object class="NSTextField" id="496835891">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{20, 265}, {128, 13}}</string>
+                                               <string key="NSFrame">{{22, 254}, {94, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="621289166">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71434240</int>
                                                        <string key="NSContents">Reference Frames:</string>
-                                                       <object class="NSFont" key="NSSupport" id="826935898">
-                                                               <string key="NSName">LucidaGrande</string>
-                                                               <double key="NSSize">10</double>
-                                                               <int key="NSfFlags">2843</int>
-                                                       </object>
+                                                       <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="496835891"/>
-                                                       <object class="NSColor" key="NSBackgroundColor" id="1006136775">
-                                                               <int key="NSColorSpace">6</int>
-                                                               <string key="NSCatalogName">System</string>
-                                                               <string key="NSColorName">controlColor</string>
-                                                               <object class="NSColor" key="NSColor">
-                                                                       <int key="NSColorSpace">3</int>
-                                                                       <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
-                                                               </object>
-                                                       </object>
-                                                       <object class="NSColor" key="NSTextColor" id="555417541">
-                                                               <int key="NSColorSpace">6</int>
-                                                               <string key="NSCatalogName">System</string>
-                                                               <string key="NSColorName">controlTextColor</string>
-                                                               <object class="NSColor" key="NSColor" id="534207422">
-                                                                       <int key="NSColorSpace">3</int>
-                                                                       <bytes key="NSWhite">MAA</bytes>
-                                                               </object>
-                                                       </object>
+                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
+                                                       <reference key="NSTextColor" ref="555417541"/>
                                                </object>
                                        </object>
                                        <object class="NSTextField" id="444018704">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{94, 210}, {54, 17}}</string>
+                                               <string key="NSFrame">{{11, 233}, {105, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="660394934">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">B-Frames:</string>
+                                                       <string key="NSContents">Maximum B-Frames:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="444018704"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                        <object class="NSTextField" id="965170034">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{48, 179}, {100, 26}}</string>
+                                               <string key="NSFrame">{{293, 254}, {100, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="517356884">
                                        <object class="NSPopUpButton" id="463613064">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{150, 213}, {84, 15}}</string>
+                                               <string key="NSFrame">{{120, 235}, {88, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="67902101">
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="67902101"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="67902101"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="67902101"/>
                                                                        </object>
                                        <object class="NSPopUpButton" id="646401135">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{150, 191}, {84, 15}}</string>
+                                               <string key="NSFrame">{{397, 256}, {117, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="468935027">
                                                        <reference key="NSControlView" ref="646401135"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
-                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <object class="NSFont" key="NSAlternateImage" id="892021687">
+                                                               <string key="NSName">LucidaGrande</string>
+                                                               <double key="NSSize">9</double>
+                                                               <int key="NSfFlags">16</int>
+                                                       </object>
                                                        <string key="NSAlternateContents"/>
                                                        <object class="NSMutableString" key="NSKeyEquivalent">
                                                                <characters key="NS.bytes"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="468935027"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="468935027"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="468935027"/>
                                                                        </object>
                                        <object class="NSPopUpButton" id="1012635724">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{407, 243}, {83, 15}}</string>
+                                               <string key="NSFrame">{{397, 193}, {117, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="597433555">
                                                        <reference key="NSControlView" ref="1012635724"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
-                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <reference key="NSAlternateImage" ref="892021687"/>
                                                        <string key="NSAlternateContents"/>
                                                        <object class="NSMutableString" key="NSKeyEquivalent">
                                                                <characters key="NS.bytes"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="597433555"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="597433555"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="597433555"/>
                                                                        </object>
                                        <object class="NSTextField" id="34095372">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{426, 157}, {37, 17}}</string>
+                                               <string key="NSFrame">{{568, 233}, {37, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="368733355">
                                        <object class="NSTextField" id="677509567">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{564, 243}, {96, 13}}</string>
+                                               <string key="NSFrame">{{13, 107}, {103, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="652898624">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">No DCT-Decimate:</string>
+                                                       <string key="NSContents">No DCT Decimation:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="677509567"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                                        <reference key="NSTextColor" ref="555417541"/>
                                                </object>
                                        </object>
-                                       <object class="NSTextField" id="570675882">
+                                       <object class="NSTextField" id="862092551">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{578, 261}, {82, 17}}</string>
+                                               <string key="NSFrameSize">{700, 34}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
-                                               <object class="NSTextFieldCell" key="NSCell" id="622431002">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">No Fast-P-Skip:</string>
-                                                       <reference key="NSSupport" ref="826935898"/>
-                                                       <reference key="NSControlView" ref="570675882"/>
-                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
-                                                       <reference key="NSTextColor" ref="555417541"/>
-                                               </object>
-                                       </object>
-                                       <object class="NSBox" id="945084535">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{23, 233}, {210, 5}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <string key="NSOffsets">{0, 0}</string>
-                                               <object class="NSTextFieldCell" key="NSTitleCell">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">0</int>
-                                                       <string key="NSContents">Box</string>
-                                                       <object class="NSFont" key="NSSupport" id="1073480903">
-                                                               <string key="NSName">LucidaGrande</string>
-                                                               <double key="NSSize">13</double>
-                                                               <int key="NSfFlags">1044</int>
-                                                       </object>
-                                                       <object class="NSColor" key="NSBackgroundColor" id="431629906">
+                                               <object class="NSTextFieldCell" key="NSCell" id="456227852">
+                                                       <int key="NSCellFlags">-1805517311</int>
+                                                       <int key="NSCellFlags2">272760832</int>
+                                                       <string key="NSContents"/>
+                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSControlView" ref="862092551"/>
+                                                       <bool key="NSDrawsBackground">YES</bool>
+                                                       <object class="NSColor" key="NSBackgroundColor">
                                                                <int key="NSColorSpace">6</int>
                                                                <string key="NSCatalogName">System</string>
                                                                <string key="NSColorName">textBackgroundColor</string>
                                                                </object>
                                                        </object>
                                                        <object class="NSColor" key="NSTextColor">
-                                                               <int key="NSColorSpace">3</int>
-                                                               <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
-                                                       </object>
-                                               </object>
-                                               <int key="NSBorderType">3</int>
-                                               <int key="NSBoxType">2</int>
-                                               <int key="NSTitlePosition">0</int>
-                                               <bool key="NSTransparent">NO</bool>
-                                       </object>
-                                       <object class="NSBox" id="126101945">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 212}, {278, 5}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <string key="NSOffsets">{0, 0}</string>
-                                               <object class="NSTextFieldCell" key="NSTitleCell">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">0</int>
-                                                       <string key="NSContents">Box</string>
-                                                       <reference key="NSSupport" ref="1073480903"/>
-                                                       <reference key="NSBackgroundColor" ref="431629906"/>
-                                                       <object class="NSColor" key="NSTextColor">
-                                                               <int key="NSColorSpace">3</int>
-                                                               <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
-                                                       </object>
-                                               </object>
-                                               <int key="NSBorderType">3</int>
-                                               <int key="NSBoxType">2</int>
-                                               <int key="NSTitlePosition">0</int>
-                                               <bool key="NSTransparent">NO</bool>
-                                       </object>
-                                       <object class="NSTextField" id="862092551">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{20, 20}, {660, 44}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSTextFieldCell" key="NSCell" id="456227852">
-                                                       <int key="NSCellFlags">-1805517311</int>
-                                                       <int key="NSCellFlags2">272760832</int>
-                                                       <string key="NSContents"/>
-                                                       <object class="NSFont" key="NSSupport" id="26">
-                                                               <string key="NSName">LucidaGrande</string>
-                                                               <double key="NSSize">11</double>
-                                                               <int key="NSfFlags">3100</int>
-                                                       </object>
-                                                       <reference key="NSControlView" ref="862092551"/>
-                                                       <bool key="NSDrawsBackground">YES</bool>
-                                                       <reference key="NSBackgroundColor" ref="431629906"/>
-                                                       <object class="NSColor" key="NSTextColor">
                                                                <int key="NSColorSpace">6</int>
                                                                <string key="NSCatalogName">System</string>
                                                                <string key="NSColorName">textColor</string>
                                                        </object>
                                                </object>
                                        </object>
-                                       <object class="NSTextField" id="286114143">
+                                       <object class="NSPopUpButton" id="463632258">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{20, 244}, {128, 13}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSTextFieldCell" key="NSCell" id="19206206">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">Mixed References:</string>
-                                                       <reference key="NSSupport" ref="826935898"/>
-                                                       <reference key="NSControlView" ref="286114143"/>
-                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
-                                                       <reference key="NSTextColor" ref="555417541"/>
-                                               </object>
-                                       </object>
-                                       <object class="NSPopUpButton" id="463632258">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{407, 264}, {135, 15}}</string>
+                                               <string key="NSFrame">{{397, 214}, {117, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="1015322159">
                                                        <reference key="NSControlView" ref="463632258"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
-                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <reference key="NSAlternateImage" ref="892021687"/>
                                                        <string key="NSAlternateContents"/>
                                                        <object class="NSMutableString" key="NSKeyEquivalent">
                                                                <characters key="NS.bytes"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="1015322159"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1015322159"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1015322159"/>
                                                                        </object>
                                        <object class="NSTextField" id="501486901">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 265}, {142, 13}}</string>
+                                               <string key="NSFrame">{{258, 212}, {135, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="523579964">
                                        <object class="NSTextField" id="9309938">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 223}, {142, 13}}</string>
+                                               <string key="NSFrame">{{264, 170}, {129, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="625397549">
                                        <object class="NSPopUpButton" id="108597901">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{407, 222}, {83, 15}}</string>
+                                               <string key="NSFrame">{{397, 172}, {117, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="1015445713">
                                                        <reference key="NSControlView" ref="108597901"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
-                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <reference key="NSAlternateImage" ref="892021687"/>
                                                        <string key="NSAlternateContents"/>
                                                        <object class="NSMutableString" key="NSKeyEquivalent">
                                                                <characters key="NS.bytes"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="1015445713"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1015445713"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1015445713"/>
                                                                        </object>
                                        <object class="NSTextField" id="335373847">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 245}, {142, 13}}</string>
+                                               <string key="NSFrame">{{242, 191}, {151, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="492298910">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71434240</int>
-                                                       <string key="NSContents">Subpixel Motion Estimation:</string>
+                                                       <string key="NSContents">Subpixel ME &amp; Mode Decision:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="335373847"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                                        <reference key="NSTextColor" ref="555417541"/>
                                                </object>
                                        </object>
-                                       <object class="NSTextField" id="677007332">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{46, 144}, {102, 17}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSTextFieldCell" key="NSCell" id="288316749">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">Weighted B-Frames:</string>
-                                                       <reference key="NSSupport" ref="826935898"/>
-                                                       <reference key="NSControlView" ref="677007332"/>
-                                                       <reference key="NSBackgroundColor" ref="1006136775"/>
-                                                       <reference key="NSTextColor" ref="555417541"/>
-                                               </object>
-                                       </object>
                                        <object class="NSTextField" id="34260806">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{43, 126}, {105, 14}}</string>
+                                               <string key="NSFrame">{{11, 149}, {105, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="124098371">
                                        <object class="NSTextField" id="777985871">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{254, 127}, {151, 26}}</string>
+                                               <string key="NSFrame">{{248, 86}, {145, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="996811218">
                                        <object class="NSTextField" id="751714853">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{60, 165}, {88, 17}}</string>
+                                               <string key="NSFrame">{{281, 233}, {112, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="651032081">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71303168</int>
-                                                       <string key="NSContents">Direct Prediction:</string>
+                                                       <string key="NSContents">Adaptive Direct Mode:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="751714853"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                        <object class="NSPopUpButton" id="1028233887">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{150, 168}, {84, 15}}</string>
+                                               <string key="NSFrame">{{397, 235}, {117, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="96368274">
                                                        <reference key="NSControlView" ref="1028233887"/>
                                                        <int key="NSButtonFlags">109199615</int>
                                                        <int key="NSButtonFlags2">1</int>
-                                                       <reference key="NSAlternateImage" ref="22"/>
+                                                       <reference key="NSAlternateImage" ref="892021687"/>
                                                        <string key="NSAlternateContents"/>
                                                        <object class="NSMutableString" key="NSKeyEquivalent">
                                                                <characters key="NS.bytes"/>
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="96368274"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="96368274"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="96368274"/>
                                                                        </object>
                                        <object class="NSTextField" id="498769415">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{20, 67}, {231, 14}}</string>
+                                               <string key="NSFrame">{{-3, 42}, {221, 17}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="492969921">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">272629760</int>
                                                        <string key="NSContents">Current x264 Advanced Option String:</string>
-                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSSupport" ref="755377161"/>
                                                        <reference key="NSControlView" ref="498769415"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                                        <reference key="NSTextColor" ref="555417541"/>
                                        <object class="NSPopUpButton" id="130462646">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{618, 217}, {63, 15}}</string>
+                                               <string key="NSFrame">{{606, 109}, {96, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="1069442299">
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="1069442299"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1069442299"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="1069442299"/>
                                                                        </object>
                                        <object class="NSPopUpButton" id="497968468">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{618, 193}, {63, 15}}</string>
+                                               <string key="NSFrame">{{606, 88}, {96, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="691127886">
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="691127886"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="691127886"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="691127886"/>
                                                                        </object>
                                        <object class="NSTextField" id="529644976">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{554, 214}, {62, 17}}</string>
+                                               <string key="NSFrame">{{543, 107}, {62, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="343844477">
                                                        <reference key="NSTextColor" ref="555417541"/>
                                                </object>
                                        </object>
-                                       <object class="NSButton" id="977241029">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{148, 243}, {22, 16}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSButtonCell" key="NSCell" id="656145587">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents"/>
-                                                       <reference key="NSSupport" ref="26"/>
-                                                       <reference key="NSControlView" ref="977241029"/>
-                                                       <int key="NSButtonFlags">1211912703</int>
-                                                       <int key="NSButtonFlags2">2</int>
-                                                       <object class="NSButtonImageSource" key="NSAlternateImage" id="534293989">
-                                                               <string key="NSImageName">NSSwitch</string>
-                                                       </object>
-                                                       <string key="NSAlternateContents"/>
-                                                       <string key="NSKeyEquivalent"/>
-                                                       <int key="NSPeriodicDelay">200</int>
-                                                       <int key="NSPeriodicInterval">25</int>
-                                               </object>
-                                       </object>
-                                       <object class="NSButton" id="749948454">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{148, 147}, {22, 16}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSButtonCell" key="NSCell" id="98290860">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents"/>
-                                                       <reference key="NSSupport" ref="26"/>
-                                                       <reference key="NSControlView" ref="749948454"/>
-                                                       <int key="NSButtonFlags">1211912703</int>
-                                                       <int key="NSButtonFlags2">2</int>
-                                                       <reference key="NSAlternateImage" ref="534293989"/>
-                                                       <string key="NSAlternateContents"/>
-                                                       <string key="NSKeyEquivalent"/>
-                                                       <int key="NSPeriodicDelay">200</int>
-                                                       <int key="NSPeriodicInterval">25</int>
-                                               </object>
-                                       </object>
-                                       <object class="NSButton" id="1035779890">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{148, 126}, {22, 16}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSButtonCell" key="NSCell" id="773053098">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents"/>
-                                                       <reference key="NSSupport" ref="26"/>
-                                                       <reference key="NSControlView" ref="1035779890"/>
-                                                       <int key="NSButtonFlags">1211912703</int>
-                                                       <int key="NSButtonFlags2">2</int>
-                                                       <reference key="NSAlternateImage" ref="534293989"/>
-                                                       <string key="NSAlternateContents"/>
-                                                       <string key="NSKeyEquivalent"/>
-                                                       <int key="NSPeriodicDelay">200</int>
-                                                       <int key="NSPeriodicInterval">25</int>
-                                               </object>
-                                       </object>
-                                       <object class="NSButton" id="928128304">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{660, 264}, {22, 16}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <bool key="NSEnabled">YES</bool>
-                                               <object class="NSButtonCell" key="NSCell" id="1016156756">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents"/>
-                                                       <reference key="NSSupport" ref="26"/>
-                                                       <reference key="NSControlView" ref="928128304"/>
-                                                       <int key="NSButtonFlags">1211912703</int>
-                                                       <int key="NSButtonFlags2">2</int>
-                                                       <reference key="NSAlternateImage" ref="534293989"/>
-                                                       <string key="NSAlternateContents"/>
-                                                       <string key="NSKeyEquivalent"/>
-                                                       <int key="NSPeriodicDelay">200</int>
-                                                       <int key="NSPeriodicInterval">25</int>
-                                               </object>
-                                       </object>
                                        <object class="NSButton" id="140207359">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{660, 242}, {22, 16}}</string>
+                                               <string key="NSFrame">{{118, 109}, {22, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="401971973">
                                        <object class="NSPopUpButton" id="907540673">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{463, 161}, {83, 15}}</string>
+                                               <string key="NSFrame">{{606, 235}, {96, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="804220802">
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="804220802"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="804220802"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="804220802"/>
                                                                        </object>
                                                        <int key="NSArrowPosition">1</int>
                                                </object>
                                        </object>
-                                       <object class="NSBox" id="523657812">
-                                               <reference key="NSNextResponder" ref="738514360"/>
-                                               <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{263, 182}, {278, 5}}</string>
-                                               <reference key="NSSuperview" ref="738514360"/>
-                                               <string key="NSOffsets">{0, 0}</string>
-                                               <object class="NSTextFieldCell" key="NSTitleCell">
-                                                       <int key="NSCellFlags">67239424</int>
-                                                       <int key="NSCellFlags2">0</int>
-                                                       <string key="NSContents">Box</string>
-                                                       <reference key="NSSupport" ref="1073480903"/>
-                                                       <reference key="NSBackgroundColor" ref="431629906"/>
-                                                       <object class="NSColor" key="NSTextColor">
-                                                               <int key="NSColorSpace">3</int>
-                                                               <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
-                                                       </object>
-                                               </object>
-                                               <int key="NSBorderType">3</int>
-                                               <int key="NSBoxType">2</int>
-                                               <int key="NSTitlePosition">0</int>
-                                               <bool key="NSTransparent">NO</bool>
-                                       </object>
                                        <object class="NSPopUpButton" id="473093704">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{407, 192}, {63, 15}}</string>
+                                               <string key="NSFrame">{{606, 256}, {96, 15}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="572444645">
                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                <int key="NSState">1</int>
-                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                <reference key="NSTarget" ref="572444645"/>
                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="572444645"/>
                                                                        </object>
                                                                                <string key="NSKeyEquiv"/>
                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                <int key="NSMnemonicLoc">2147483647</int>
-                                                                               <reference key="NSOnImage" ref="98535564"/>
-                                                                               <reference key="NSMixedImage" ref="993852628"/>
+                                                                               <reference key="NSOnImage" ref="934680330"/>
+                                                                               <reference key="NSMixedImage" ref="962234898"/>
                                                                                <string key="NSAction">_popUpItemAction:</string>
                                                                                <reference key="NSTarget" ref="572444645"/>
                                                                        </object>
                                        <object class="NSTextField" id="516451639">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{358, 192}, {47, 14}}</string>
+                                               <string key="NSFrame">{{522, 254}, {83, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="562573539">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71434240</int>
-                                                       <string key="NSContents">Analysis:</string>
+                                                       <string key="NSContents">Partition Types:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="516451639"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                        <object class="NSButton" id="526934709">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{525, 192}, {22, 16}}</string>
+                                               <string key="NSFrame">{{118, 193}, {22, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="273314683">
                                        <object class="NSTextField" id="180296347">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{475, 193}, {50, 13}}</string>
+                                               <string key="NSFrame">{{36, 191}, {80, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="495611013">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71434240</int>
-                                                       <string key="NSContents">8x8 DCT:</string>
+                                                       <string key="NSContents">8x8 Transform:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="180296347"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                        <object class="NSButton" id="612818913">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{405, 160}, {22, 16}}</string>
+                                               <string key="NSFrame">{{118, 214}, {22, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="12489527">
                                        <object class="NSTextField" id="5114506">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{286, 162}, {119, 13}}</string>
+                                               <string key="NSFrame">{{-3, 212}, {119, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="894602850">
                                        <object class="NSSlider" id="734910001">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">268</int>
-                                               <string key="NSFrame">{{408, 137}, {96, 16}}</string>
+                                               <string key="NSFrame">{{398, 84}, {114, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSSliderCell" key="NSCell" id="737375773">
                                        <object class="NSTextField" id="149148764">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{306, 115}, {99, 14}}</string>
+                                               <string key="NSFrame">{{291, 65}, {102, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="950560055">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">71434240</int>
-                                                       <string key="NSContents">Psychovisual Trellis</string>
+                                                       <string key="NSContents">Psychovisual Trellis:</string>
                                                        <reference key="NSSupport" ref="826935898"/>
                                                        <reference key="NSControlView" ref="149148764"/>
                                                        <reference key="NSBackgroundColor" ref="1006136775"/>
                                        <object class="NSSlider" id="747005200">
                                                <reference key="NSNextResponder" ref="738514360"/>
                                                <int key="NSvFlags">268</int>
-                                               <string key="NSFrame">{{408, 113}, {96, 16}}</string>
+                                               <string key="NSFrame">{{398, 63}, {114, 16}}</string>
                                                <reference key="NSSuperview" ref="738514360"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSSliderCell" key="NSCell" id="148673163">
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optBPyramidSwitch</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="1035779890"/>
-                                       </object>
-                                       <int key="connectionID">205</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fX264optBPyramidLabel</string>
                                                <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="34260806"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optMixedRefsSwitch</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="977241029"/>
-                                       </object>
-                                       <int key="connectionID">216</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optMixedRefsLabel</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="286114143"/>
-                                       </object>
-                                       <int key="connectionID">217</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fX264optMERangePopUp</string>
                                                <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="108597901"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optNfpskipLabel</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="570675882"/>
-                                       </object>
-                                       <int key="connectionID">222</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optNfpskipSwitch</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="928128304"/>
-                                       </object>
-                                       <int key="connectionID">223</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fX264optNodctdcmtLabel</string>
                                                <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="677509567"/>
                                        <int key="connectionID">231</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optWeightBSwitch</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="749948454"/>
-                                       </object>
-                                       <int key="connectionID">232</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fX264optWeightBLabel</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="677007332"/>
-                                       </object>
-                                       <int key="connectionID">234</int>
-                               </object>
-                               <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
                                                <string key="label">X264AdvancedOptionsChanged:</string>
                                                <reference key="source" ref="674763238"/>
                                        <object class="IBActionConnection" key="connection">
                                                <string key="label">X264AdvancedOptionsChanged:</string>
                                                <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="977241029"/>
-                                       </object>
-                                       <int key="connectionID">236</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">X264AdvancedOptionsChanged:</string>
-                                               <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="463613064"/>
                                        </object>
                                        <int key="connectionID">237</int>
                                        <object class="IBActionConnection" key="connection">
                                                <string key="label">X264AdvancedOptionsChanged:</string>
                                                <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="749948454"/>
-                                       </object>
-                                       <int key="connectionID">239</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">X264AdvancedOptionsChanged:</string>
-                                               <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="1035779890"/>
-                                       </object>
-                                       <int key="connectionID">242</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">X264AdvancedOptionsChanged:</string>
-                                               <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="463632258"/>
                                        </object>
                                        <int key="connectionID">243</int>
                                        <object class="IBActionConnection" key="connection">
                                                <string key="label">X264AdvancedOptionsChanged:</string>
                                                <reference key="source" ref="674763238"/>
-                                               <reference key="destination" ref="928128304"/>
-                                       </object>
-                                       <int key="connectionID">251</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">X264AdvancedOptionsChanged:</string>
-                                               <reference key="source" ref="674763238"/>
                                                <reference key="destination" ref="140207359"/>
                                        </object>
                                        <int key="connectionID">252</int>
                                        </object>
                                        <int key="connectionID">406</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">X264AdvancedOptionsChanged:</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="390676982"/>
+                                       </object>
+                                       <int key="connectionID">411</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fX264optWeightPLabel</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="594030759"/>
+                                       </object>
+                                       <int key="connectionID">413</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fX264optWeightPSwitch</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="390676982"/>
+                                       </object>
+                                       <int key="connectionID">414</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">X264AdvancedOptionsChanged:</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="938870755"/>
+                                       </object>
+                                       <int key="connectionID">424</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fX264optAqSlider</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="938870755"/>
+                                       </object>
+                                       <int key="connectionID">425</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fX264optAqLabel</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="500710129"/>
+                                       </object>
+                                       <int key="connectionID">426</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">X264AdvancedOptionsChanged:</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="742215576"/>
+                                       </object>
+                                       <int key="connectionID">433</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fX264optBPyramidPopUp</string>
+                                               <reference key="source" ref="674763238"/>
+                                               <reference key="destination" ref="742215576"/>
+                                       </object>
+                                       <int key="connectionID">434</int>
+                               </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <object class="NSArray" key="orderedObjects">
                                                        <reference ref="444018704"/>
                                                        <reference ref="463613064"/>
                                                        <reference ref="1012635724"/>
-                                                       <reference ref="945084535"/>
-                                                       <reference ref="126101945"/>
-                                                       <reference ref="862092551"/>
-                                                       <reference ref="286114143"/>
                                                        <reference ref="463632258"/>
                                                        <reference ref="501486901"/>
                                                        <reference ref="9309938"/>
                                                        <reference ref="108597901"/>
                                                        <reference ref="335373847"/>
-                                                       <reference ref="677007332"/>
-                                                       <reference ref="751714853"/>
-                                                       <reference ref="1028233887"/>
-                                                       <reference ref="498769415"/>
-                                                       <reference ref="977241029"/>
-                                                       <reference ref="749948454"/>
-                                                       <reference ref="523657812"/>
-                                                       <reference ref="473093704"/>
-                                                       <reference ref="516451639"/>
-                                                       <reference ref="526934709"/>
+                                                       <reference ref="390676982"/>
+                                                       <reference ref="594030759"/>
+                                                       <reference ref="5114506"/>
+                                                       <reference ref="612818913"/>
                                                        <reference ref="180296347"/>
+                                                       <reference ref="526934709"/>
                                                        <reference ref="34260806"/>
-                                                       <reference ref="1035779890"/>
-                                                       <reference ref="570675882"/>
-                                                       <reference ref="928128304"/>
-                                                       <reference ref="677509567"/>
-                                                       <reference ref="140207359"/>
-                                                       <reference ref="130462646"/>
-                                                       <reference ref="529644976"/>
-                                                       <reference ref="497968468"/>
-                                                       <reference ref="612818913"/>
-                                                       <reference ref="5114506"/>
-                                                       <reference ref="34095372"/>
+                                                       <reference ref="473093704"/>
                                                        <reference ref="907540673"/>
-                                                       <reference ref="777985871"/>
-                                                       <reference ref="734910001"/>
-                                                       <reference ref="149148764"/>
+                                                       <reference ref="34095372"/>
+                                                       <reference ref="516451639"/>
                                                        <reference ref="747005200"/>
-                                                       <reference ref="965170034"/>
+                                                       <reference ref="149148764"/>
+                                                       <reference ref="734910001"/>
+                                                       <reference ref="777985871"/>
+                                                       <reference ref="938870755"/>
+                                                       <reference ref="500710129"/>
+                                                       <reference ref="742215576"/>
                                                        <reference ref="646401135"/>
+                                                       <reference ref="965170034"/>
+                                                       <reference ref="1028233887"/>
+                                                       <reference ref="751714853"/>
+                                                       <reference ref="933060176"/>
+                                                       <reference ref="297485972"/>
+                                                       <reference ref="120436311"/>
+                                                       <reference ref="862092551"/>
+                                                       <reference ref="529644976"/>
+                                                       <reference ref="497968468"/>
+                                                       <reference ref="130462646"/>
+                                                       <reference ref="140207359"/>
+                                                       <reference ref="677509567"/>
+                                                       <reference ref="498769415"/>
                                                </object>
                                                <reference key="parent" ref="0"/>
                                                <string key="objectName">x264</string>
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">25</int>
-                                               <reference key="object" ref="570675882"/>
+                                               <int key="objectID">30</int>
+                                               <reference key="object" ref="862092551"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="622431002"/>
+                                                       <reference ref="456227852"/>
                                                </object>
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">26</int>
-                                               <reference key="object" ref="945084535"/>
+                                               <int key="objectID">32</int>
+                                               <reference key="object" ref="463632258"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <object class="NSView" id="223117836">
-                                                               <nil key="NSNextResponder"/>
-                                                               <int key="NSvFlags">256</int>
-                                                               <string key="NSFrame">{{2, 2}, {125, 1}}</string>
-                                                       </object>
+                                                       <reference ref="1015322159"/>
                                                </object>
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">27</int>
-                                               <reference key="object" ref="223117836"/>
-                                               <reference key="parent" ref="945084535"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">28</int>
-                                               <reference key="object" ref="126101945"/>
+                                               <int key="objectID">37</int>
+                                               <reference key="object" ref="501486901"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <object class="NSView" id="793102985">
-                                                               <nil key="NSNextResponder"/>
-                                                               <int key="NSvFlags">256</int>
-                                                               <string key="NSFrame">{{2, 2}, {125, 1}}</string>
-                                                       </object>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">29</int>
-                                               <reference key="object" ref="793102985"/>
-                                               <reference key="parent" ref="126101945"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">30</int>
-                                               <reference key="object" ref="862092551"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="456227852"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">31</int>
-                                               <reference key="object" ref="286114143"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="19206206"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">32</int>
-                                               <reference key="object" ref="463632258"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1015322159"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">37</int>
-                                               <reference key="object" ref="501486901"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="523579964"/>
+                                                       <reference ref="523579964"/>
                                                </object>
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">45</int>
-                                               <reference key="object" ref="677007332"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="288316749"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">46</int>
                                                <reference key="object" ref="34260806"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">55</int>
-                                               <reference key="object" ref="498769415"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="492969921"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">56</int>
                                                <reference key="object" ref="130462646"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">67</int>
-                                               <reference key="object" ref="977241029"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="656145587"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">68</int>
-                                               <reference key="object" ref="749948454"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="98290860"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">71</int>
-                                               <reference key="object" ref="1035779890"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="773053098"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">72</int>
-                                               <reference key="object" ref="928128304"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1016156756"/>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">73</int>
                                                <reference key="object" ref="140207359"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="738514360"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">79</int>
-                                               <reference key="object" ref="523657812"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <object class="NSView" id="369510067">
-                                                               <nil key="NSNextResponder"/>
-                                                               <int key="NSvFlags">256</int>
-                                                               <string key="NSFrame">{{2, 2}, {125, 1}}</string>
-                                                       </object>
-                                               </object>
-                                               <reference key="parent" ref="738514360"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">80</int>
-                                               <reference key="object" ref="369510067"/>
-                                               <reference key="parent" ref="523657812"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">81</int>
                                                <reference key="object" ref="473093704"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="677509567"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">349</int>
-                                               <reference key="object" ref="622431002"/>
-                                               <reference key="parent" ref="570675882"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">350</int>
                                                <reference key="object" ref="456227852"/>
                                                <reference key="parent" ref="862092551"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">351</int>
-                                               <reference key="object" ref="19206206"/>
-                                               <reference key="parent" ref="286114143"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">352</int>
                                                <reference key="object" ref="1015322159"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="335373847"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">357</int>
-                                               <reference key="object" ref="288316749"/>
-                                               <reference key="parent" ref="677007332"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">358</int>
                                                <reference key="object" ref="124098371"/>
                                                <reference key="parent" ref="34260806"/>
                                                <reference key="parent" ref="1028233887"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">363</int>
-                                               <reference key="object" ref="492969921"/>
-                                               <reference key="parent" ref="498769415"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">364</int>
                                                <reference key="object" ref="1069442299"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="529644976"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">367</int>
-                                               <reference key="object" ref="656145587"/>
-                                               <reference key="parent" ref="977241029"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">368</int>
-                                               <reference key="object" ref="98290860"/>
-                                               <reference key="parent" ref="749948454"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">371</int>
-                                               <reference key="object" ref="773053098"/>
-                                               <reference key="parent" ref="1035779890"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">372</int>
-                                               <reference key="object" ref="1016156756"/>
-                                               <reference key="parent" ref="928128304"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">373</int>
                                                <reference key="object" ref="401971973"/>
                                                <reference key="parent" ref="140207359"/>
                                                <reference key="object" ref="84181884"/>
                                                <reference key="parent" ref="884041487"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">407</int>
+                                               <reference key="object" ref="390676982"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="528921925"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">408</int>
+                                               <reference key="object" ref="594030759"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="790451247"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">409</int>
+                                               <reference key="object" ref="790451247"/>
+                                               <reference key="parent" ref="594030759"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">410</int>
+                                               <reference key="object" ref="528921925"/>
+                                               <reference key="parent" ref="390676982"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">420</int>
+                                               <reference key="object" ref="938870755"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="152220780"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">421</int>
+                                               <reference key="object" ref="500710129"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="316938196"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">422</int>
+                                               <reference key="object" ref="316938196"/>
+                                               <reference key="parent" ref="500710129"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">423</int>
+                                               <reference key="object" ref="152220780"/>
+                                               <reference key="parent" ref="938870755"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">55</int>
+                                               <reference key="object" ref="498769415"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="492969921"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">363</int>
+                                               <reference key="object" ref="492969921"/>
+                                               <reference key="parent" ref="498769415"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">427</int>
+                                               <reference key="object" ref="742215576"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="821448906"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">428</int>
+                                               <reference key="object" ref="821448906"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="278489647"/>
+                                               </object>
+                                               <reference key="parent" ref="742215576"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">429</int>
+                                               <reference key="object" ref="278489647"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="1001978608"/>
+                                                       <reference ref="447058849"/>
+                                                       <reference ref="101526218"/>
+                                               </object>
+                                               <reference key="parent" ref="821448906"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">430</int>
+                                               <reference key="object" ref="1001978608"/>
+                                               <reference key="parent" ref="278489647"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">431</int>
+                                               <reference key="object" ref="447058849"/>
+                                               <reference key="parent" ref="278489647"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">432</int>
+                                               <reference key="object" ref="101526218"/>
+                                               <reference key="parent" ref="278489647"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">438</int>
+                                               <reference key="object" ref="933060176"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="236903504"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">439</int>
+                                               <reference key="object" ref="236903504"/>
+                                               <reference key="parent" ref="933060176"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">440</int>
+                                               <reference key="object" ref="120436311"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="571635509"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">441</int>
+                                               <reference key="object" ref="571635509"/>
+                                               <reference key="parent" ref="120436311"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">442</int>
+                                               <reference key="object" ref="297485972"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="225631881"/>
+                                               </object>
+                                               <reference key="parent" ref="738514360"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">443</int>
+                                               <reference key="object" ref="225631881"/>
+                                               <reference key="parent" ref="297485972"/>
+                                       </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
                                        <string>24.IBAttributePlaceholdersKey</string>
                                        <string>24.IBPluginDependency</string>
                                        <string>24.ImportedFromIB2</string>
-                                       <string>25.IBAttributePlaceholdersKey</string>
-                                       <string>25.IBPluginDependency</string>
-                                       <string>25.ImportedFromIB2</string>
+                                       <string>254.IBEditorWindowLastContentRect</string>
                                        <string>254.IBPluginDependency</string>
                                        <string>254.ImportedFromIB2</string>
                                        <string>254.editorWindowContentRectSynchronizationRect</string>
                                        <string>255.IBPluginDependency</string>
                                        <string>255.ImportedFromIB2</string>
-                                       <string>26.IBPluginDependency</string>
-                                       <string>26.ImportedFromIB2</string>
-                                       <string>27.IBPluginDependency</string>
-                                       <string>27.ImportedFromIB2</string>
-                                       <string>28.IBPluginDependency</string>
-                                       <string>28.ImportedFromIB2</string>
-                                       <string>29.IBPluginDependency</string>
-                                       <string>29.ImportedFromIB2</string>
                                        <string>30.IBPluginDependency</string>
                                        <string>30.ImportedFromIB2</string>
-                                       <string>31.IBAttributePlaceholdersKey</string>
-                                       <string>31.IBPluginDependency</string>
-                                       <string>31.ImportedFromIB2</string>
                                        <string>32.IBAttributePlaceholdersKey</string>
                                        <string>32.IBPluginDependency</string>
                                        <string>32.ImportedFromIB2</string>
                                        <string>346.IBPluginDependency</string>
                                        <string>347.IBPluginDependency</string>
                                        <string>348.IBPluginDependency</string>
-                                       <string>349.IBPluginDependency</string>
                                        <string>35.IBPluginDependency</string>
                                        <string>35.ImportedFromIB2</string>
                                        <string>350.IBPluginDependency</string>
-                                       <string>351.IBPluginDependency</string>
                                        <string>352.IBPluginDependency</string>
                                        <string>353.IBPluginDependency</string>
                                        <string>354.IBPluginDependency</string>
                                        <string>355.IBPluginDependency</string>
                                        <string>356.IBPluginDependency</string>
-                                       <string>357.IBPluginDependency</string>
                                        <string>358.IBPluginDependency</string>
                                        <string>36.IBPluginDependency</string>
                                        <string>36.ImportedFromIB2</string>
                                        <string>364.IBPluginDependency</string>
                                        <string>365.IBPluginDependency</string>
                                        <string>366.IBPluginDependency</string>
-                                       <string>367.IBPluginDependency</string>
-                                       <string>368.IBPluginDependency</string>
                                        <string>37.IBAttributePlaceholdersKey</string>
                                        <string>37.IBPluginDependency</string>
                                        <string>37.ImportedFromIB2</string>
-                                       <string>371.IBPluginDependency</string>
-                                       <string>372.IBPluginDependency</string>
                                        <string>373.IBPluginDependency</string>
                                        <string>374.IBPluginDependency</string>
                                        <string>375.IBPluginDependency</string>
                                        <string>402.ImportedFromIB2</string>
                                        <string>403.IBPluginDependency</string>
                                        <string>403.ImportedFromIB2</string>
+                                       <string>407.IBAttributePlaceholdersKey</string>
+                                       <string>407.IBPluginDependency</string>
+                                       <string>407.ImportedFromIB2</string>
+                                       <string>408.IBAttributePlaceholdersKey</string>
+                                       <string>408.IBPluginDependency</string>
+                                       <string>408.ImportedFromIB2</string>
+                                       <string>409.IBPluginDependency</string>
                                        <string>41.IBPluginDependency</string>
                                        <string>41.ImportedFromIB2</string>
+                                       <string>410.IBPluginDependency</string>
                                        <string>42.IBPluginDependency</string>
                                        <string>42.ImportedFromIB2</string>
+                                       <string>420.IBPluginDependency</string>
+                                       <string>421.IBAttributePlaceholdersKey</string>
+                                       <string>421.IBPluginDependency</string>
+                                       <string>421.ImportedFromIB2</string>
+                                       <string>422.IBPluginDependency</string>
+                                       <string>423.IBPluginDependency</string>
+                                       <string>427.IBAttributePlaceholdersKey</string>
+                                       <string>427.IBPluginDependency</string>
+                                       <string>427.ImportedFromIB2</string>
+                                       <string>428.IBPluginDependency</string>
+                                       <string>429.IBPluginDependency</string>
+                                       <string>429.ImportedFromIB2</string>
                                        <string>43.IBPluginDependency</string>
                                        <string>43.ImportedFromIB2</string>
+                                       <string>430.IBPluginDependency</string>
+                                       <string>430.ImportedFromIB2</string>
+                                       <string>431.IBPluginDependency</string>
+                                       <string>431.ImportedFromIB2</string>
+                                       <string>432.IBPluginDependency</string>
+                                       <string>432.ImportedFromIB2</string>
+                                       <string>438.IBPluginDependency</string>
+                                       <string>439.IBPluginDependency</string>
                                        <string>44.IBAttributePlaceholdersKey</string>
                                        <string>44.IBPluginDependency</string>
                                        <string>44.ImportedFromIB2</string>
-                                       <string>45.IBAttributePlaceholdersKey</string>
-                                       <string>45.IBPluginDependency</string>
-                                       <string>45.ImportedFromIB2</string>
+                                       <string>440.IBPluginDependency</string>
+                                       <string>441.IBPluginDependency</string>
+                                       <string>442.IBPluginDependency</string>
+                                       <string>443.IBPluginDependency</string>
                                        <string>46.IBAttributePlaceholdersKey</string>
                                        <string>46.IBPluginDependency</string>
                                        <string>46.ImportedFromIB2</string>
                                        <string>66.IBAttributePlaceholdersKey</string>
                                        <string>66.IBPluginDependency</string>
                                        <string>66.ImportedFromIB2</string>
-                                       <string>67.IBAttributePlaceholdersKey</string>
-                                       <string>67.IBPluginDependency</string>
-                                       <string>67.ImportedFromIB2</string>
-                                       <string>68.IBAttributePlaceholdersKey</string>
-                                       <string>68.IBPluginDependency</string>
-                                       <string>68.ImportedFromIB2</string>
                                        <string>7.IBPluginDependency</string>
                                        <string>7.ImportedFromIB2</string>
-                                       <string>71.IBAttributePlaceholdersKey</string>
-                                       <string>71.IBPluginDependency</string>
-                                       <string>71.ImportedFromIB2</string>
-                                       <string>72.IBAttributePlaceholdersKey</string>
-                                       <string>72.IBPluginDependency</string>
-                                       <string>72.ImportedFromIB2</string>
                                        <string>73.IBAttributePlaceholdersKey</string>
                                        <string>73.IBPluginDependency</string>
                                        <string>73.ImportedFromIB2</string>
                                        <string>77.ImportedFromIB2</string>
                                        <string>78.IBPluginDependency</string>
                                        <string>78.ImportedFromIB2</string>
-                                       <string>79.IBPluginDependency</string>
-                                       <string>79.ImportedFromIB2</string>
                                        <string>8.IBPluginDependency</string>
                                        <string>8.ImportedFromIB2</string>
-                                       <string>80.IBPluginDependency</string>
-                                       <string>80.ImportedFromIB2</string>
                                        <string>81.IBAttributePlaceholdersKey</string>
                                        <string>81.IBPluginDependency</string>
                                        <string>81.ImportedFromIB2</string>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <object class="NSMutableDictionary">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <reference key="dict.sortedKeys" ref="0"/>
-                                               <object class="NSMutableArray" key="dict.values">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                               </object>
-                                       </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
+                                       <string>{{0, 735}, {700, 290}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>{{42, 754}, {700, 290}}</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <object class="NSMutableDictionary">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <reference key="dict.sortedKeys" ref="0"/>
-                                               <object class="NSMutableArray" key="dict.values">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                               </object>
-                                       </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <object class="NSMutableDictionary">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <reference key="dict.sortedKeys" ref="0"/>
-                                               <object class="NSMutableArray" key="dict.values">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                               </object>
-                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>{{-21, 171}, {700, 290}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>{{692, 501}, {700, 290}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>{{113, 127}, {700, 290}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{692, 501}, {700, 290}}</string>
+                                       <object class="NSMutableDictionary">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <reference key="dict.sortedKeys" ref="0"/>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <object class="NSMutableDictionary">
-                                               <string key="NS.key.0">ToolTip</string>
-                                               <object class="IBToolTipAttribute" key="NS.object.0">
-                                                       <string key="name">ToolTip</string>
-                                                       <reference key="object" ref="1035779890"/>
-                                                       <string key="toolTip">B-frame pyramids are a High Profile feature. This means that if you enable it, YOUR VIDEO WILL NOT PLAY IN QUICKTIME. Pyramidal B-frames mean that B-frames don't just reference surrounding reference frames â€” instead, it also treats a previous B-frame as a reference, improving quality/lowering bitrate at the expense of complexity. Logically, to reference an earlier B-frame, you must tell x264 to use at least 2 B-frames.</string>
-                                               </object>
-                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                        </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1"/>
                                        <object class="NSMutableDictionary">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <reference key="dict.sortedKeys" ref="0"/>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">406</int>
+                       <int key="maxID">449</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                                                        <string>id</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>X264AdvancedOptionsAnimate:</string>
+                                                       <string>X264AdvancedOptionsChanged:</string>
+                                                       <string>X264AdvancedOptionsSet:</string>
+                                                       <string>X264AdvancedOptionsSetCurrentSettings:</string>
+                                                       <string>X264AdvancedOptionsStandardizeOptString:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">X264AdvancedOptionsAnimate:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">X264AdvancedOptionsChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">X264AdvancedOptionsSet:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">X264AdvancedOptionsSetCurrentSettings:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">X264AdvancedOptionsStandardizeOptString:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <object class="NSArray" key="dict.sortedKeys">
                                                        <string>fX264optAlphaDeblockPopUp</string>
                                                        <string>fX264optAnalyseLabel</string>
                                                        <string>fX264optAnalysePopUp</string>
+                                                       <string>fX264optAqLabel</string>
+                                                       <string>fX264optAqSlider</string>
                                                        <string>fX264optBAdaptLabel</string>
                                                        <string>fX264optBAdaptPopUp</string>
                                                        <string>fX264optBPyramidLabel</string>
-                                                       <string>fX264optBPyramidSwitch</string>
+                                                       <string>fX264optBPyramidPopUp</string>
                                                        <string>fX264optBetaDeblockPopUp</string>
                                                        <string>fX264optBframesLabel</string>
                                                        <string>fX264optBframesPopUp</string>
                                                        <string>fX264optDirectPredPopUp</string>
                                                        <string>fX264optMERangeLabel</string>
                                                        <string>fX264optMERangePopUp</string>
-                                                       <string>fX264optMixedRefsLabel</string>
-                                                       <string>fX264optMixedRefsSwitch</string>
                                                        <string>fX264optMotionEstLabel</string>
                                                        <string>fX264optMotionEstPopUp</string>
-                                                       <string>fX264optNfpskipLabel</string>
-                                                       <string>fX264optNfpskipSwitch</string>
                                                        <string>fX264optNodctdcmtLabel</string>
                                                        <string>fX264optNodctdcmtSwitch</string>
                                                        <string>fX264optPsyRDLabel</string>
                                                        <string>fX264optTrellisPopUp</string>
                                                        <string>fX264optView</string>
                                                        <string>fX264optViewTitleLabel</string>
-                                                       <string>fX264optWeightBLabel</string>
-                                                       <string>fX264optWeightBSwitch</string>
+                                                       <string>fX264optWeightPLabel</string>
+                                                       <string>fX264optWeightPSwitch</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>NSTextField</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
+                                                       <string>NSSlider</string>
+                                                       <string>NSTextField</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
-                                                       <string>NSButton</string>
+                                                       <string>NSPopUpButton</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSButton</string>
                                                        <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
                                                        <string>NSSlider</string>
                                                        <string>NSTextField</string>
                                                        <string>NSSlider</string>
                                                        <string>NSButton</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fDisplayX264Options</string>
+                                                       <string>fDisplayX264OptionsLabel</string>
+                                                       <string>fEmptyView</string>
+                                                       <string>fX264opt8x8dctLabel</string>
+                                                       <string>fX264opt8x8dctSwitch</string>
+                                                       <string>fX264optAlphaDeblockPopUp</string>
+                                                       <string>fX264optAnalyseLabel</string>
+                                                       <string>fX264optAnalysePopUp</string>
+                                                       <string>fX264optAqLabel</string>
+                                                       <string>fX264optAqSlider</string>
+                                                       <string>fX264optBAdaptLabel</string>
+                                                       <string>fX264optBAdaptPopUp</string>
+                                                       <string>fX264optBPyramidLabel</string>
+                                                       <string>fX264optBPyramidPopUp</string>
+                                                       <string>fX264optBetaDeblockPopUp</string>
+                                                       <string>fX264optBframesLabel</string>
+                                                       <string>fX264optBframesPopUp</string>
+                                                       <string>fX264optCabacLabel</string>
+                                                       <string>fX264optCabacSwitch</string>
+                                                       <string>fX264optDeblockLabel</string>
+                                                       <string>fX264optDirectPredLabel</string>
+                                                       <string>fX264optDirectPredPopUp</string>
+                                                       <string>fX264optMERangeLabel</string>
+                                                       <string>fX264optMERangePopUp</string>
+                                                       <string>fX264optMotionEstLabel</string>
+                                                       <string>fX264optMotionEstPopUp</string>
+                                                       <string>fX264optNodctdcmtLabel</string>
+                                                       <string>fX264optNodctdcmtSwitch</string>
+                                                       <string>fX264optPsyRDLabel</string>
+                                                       <string>fX264optPsyRDSlider</string>
+                                                       <string>fX264optPsyTrellisLabel</string>
+                                                       <string>fX264optPsyTrellisSlider</string>
+                                                       <string>fX264optRefLabel</string>
+                                                       <string>fX264optRefPopUp</string>
+                                                       <string>fX264optSubmeLabel</string>
+                                                       <string>fX264optSubmePopUp</string>
+                                                       <string>fX264optTrellisLabel</string>
+                                                       <string>fX264optTrellisPopUp</string>
+                                                       <string>fX264optView</string>
+                                                       <string>fX264optViewTitleLabel</string>
+                                                       <string>fX264optWeightPLabel</string>
+                                                       <string>fX264optWeightPSwitch</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fDisplayX264Options</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fDisplayX264OptionsLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fEmptyView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264opt8x8dctLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264opt8x8dctSwitch</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optAlphaDeblockPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optAnalyseLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optAnalysePopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optAqLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optAqSlider</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBAdaptLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBAdaptPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBPyramidLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBPyramidPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBetaDeblockPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBframesLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optBframesPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optCabacLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optCabacSwitch</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optDeblockLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optDirectPredLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optDirectPredPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optMERangeLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optMERangePopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optMotionEstLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optMotionEstPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optNodctdcmtLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optNodctdcmtSwitch</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optPsyRDLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optPsyRDSlider</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optPsyTrellisLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optPsyTrellisSlider</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optRefLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optRefPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optSubmeLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optSubmePopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optTrellisLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optTrellisPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optViewTitleLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optWeightPLabel</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fX264optWeightPSwitch</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBProjectSource</string>
                                                <string key="minorKey">HBAdvancedController.h</string>
                                        </object>
                                </object>
                        </object>
-                       <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+               </object>
+               <int key="IBDocument.localizationMode">0</int>
+               <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+                       <integer value="1050" key="NS.object.0"/>
+               </object>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+                       <integer value="3000" key="NS.object.0"/>
+               </object>
+               <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+               <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
+               <int key="IBDocument.defaultPropertyAccessControl">3</int>
+               <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+                       <bool key="EncodedWithXMLCoder">YES</bool>
+                       <object class="NSArray" key="dict.sortedKeys">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSActionCell</string>
-                                       <string key="superclassName">NSCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <string key="superclassName">NSResponder</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="698143150">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="211278098">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="802363589">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSApplication</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSBox</string>
-                                       <string key="superclassName">NSView</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSBox.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSButton</string>
-                                       <string key="superclassName">NSControl</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSButton.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSButtonCell</string>
-                                       <string key="superclassName">NSActionCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSCell</string>
-                                       <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSControl</string>
-                                       <string key="superclassName">NSView</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="990093763">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSFormatter</string>
-                                       <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSMenu</string>
-                                       <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="435556569">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSMenuItem</string>
-                                       <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="988534394">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSMenuItemCell</string>
-                                       <string key="superclassName">NSButtonCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSMenuItemCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <reference key="sourceIdentifier" ref="698143150"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <reference key="sourceIdentifier" ref="211278098"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <reference key="sourceIdentifier" ref="802363589"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <reference key="sourceIdentifier" ref="990093763"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <reference key="sourceIdentifier" ref="435556569"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="719781483">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">ImageKit.framework/Headers/IKImageBrowserView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">ImageKit.framework/Headers/IKSaveOptions.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">ImageKit.framework/Headers/ImageKitDeprecated.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">PDFKit.framework/Headers/PDFDocument.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">PDFKit.framework/Headers/PDFView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedAudioOutput.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedVideoOutput.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureFileOutput.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureVideoPreviewOutput.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTMovie.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QTKit.framework/Headers/QTMovieView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionParameterView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionPickerView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QuartzFilters.framework/Headers/QuartzFilterManager.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">QuickLookUI.framework/Headers/QLPreviewPanel.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSPopUpButton</string>
-                                       <string key="superclassName">NSButton</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSPopUpButton.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSPopUpButtonCell</string>
-                                       <string key="superclassName">NSMenuItemCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSPopUpButtonCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSResponder</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSResponder</string>
-                                       <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSSlider</string>
-                                       <string key="superclassName">NSControl</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSSlider.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSSliderCell</string>
-                                       <string key="superclassName">NSActionCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSSliderCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSTextField</string>
-                                       <string key="superclassName">NSControl</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSTextFieldCell</string>
-                                       <string key="superclassName">NSActionCell</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSView</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSView</string>
-                                       <reference key="sourceIdentifier" ref="988534394"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSView</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBFrameworkSource</string>
-                                               <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSView</string>
-                                       <string key="superclassName">NSResponder</string>
-                                       <reference key="sourceIdentifier" ref="719781483"/>
-                               </object>
+                               <string>NSMenuCheckmark</string>
+                               <string>NSMenuMixedState</string>
+                       </object>
+                       <object class="NSMutableArray" key="dict.values">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>{9, 8}</string>
+                               <string>{7, 2}</string>
                        </object>
                </object>
-               <int key="IBDocument.localizationMode">0</int>
-               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
-                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
-                       <integer value="1050" key="NS.object.0"/>
-               </object>
-               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
-                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
-                       <integer value="3000" key="NS.object.0"/>
-               </object>
-               <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
-               <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
-               <int key="IBDocument.defaultPropertyAccessControl">3</int>
        </data>
 </archive>
index e569119..15919d7 100644 (file)
@@ -1,15 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
        <data>
                <int key="IBDocument.SystemTarget">1050</int>
-               <string key="IBDocument.SystemVersion">9L30</string>
-               <string key="IBDocument.InterfaceBuilderVersion">677</string>
-               <string key="IBDocument.AppKitVersion">949.54</string>
-               <string key="IBDocument.HIToolboxVersion">353.00</string>
+               <string key="IBDocument.SystemVersion">10H574</string>
+               <string key="IBDocument.InterfaceBuilderVersion">732</string>
+               <string key="IBDocument.AppKitVersion">1038.35</string>
+               <string key="IBDocument.HIToolboxVersion">461.00</string>
+               <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+                       <string key="NS.object.0">732</string>
+               </object>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
-                       <integer value="57"/>
-                       <integer value="5196"/>
+                       <integer value="1478"/>
                </object>
                <object class="NSArray" key="IBDocument.PluginDependencies">
                        <bool key="EncodedWithXMLCoder">YES</bool>
@@ -17,7 +20,7 @@
                </object>
                <object class="NSMutableDictionary" key="IBDocument.Metadata">
                        <bool key="EncodedWithXMLCoder">YES</bool>
-                       <object class="NSArray" key="dict.sortedKeys">
+                       <object class="NSArray" key="dict.sortedKeys" id="0">
                                <bool key="EncodedWithXMLCoder">YES</bool>
                        </object>
                        <object class="NSMutableArray" key="dict.values">
                        <object class="NSWindowTemplate" id="192660081">
                                <int key="NSWindowStyleMask">4103</int>
                                <int key="NSWindowBacking">2</int>
-                               <string key="NSWindowRect">{{41, 580}, {760, 550}}</string>
+                               <string key="NSWindowRect">{{41, 574}, {754, 556}}</string>
                                <int key="NSWTFlags">1886912512</int>
                                <string key="NSWindowTitle">HandBrake</string>
                                <string key="NSWindowClass">NSWindow</string>
                                <object class="NSMutableString" key="NSViewClass">
                                        <characters key="NS.bytes">View</characters>
                                </object>
-                               <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSWindowContentMinSize">{213, 107}</string>
                                <object class="NSView" key="NSWindowView" id="168918359">
                                        <reference key="NSNextResponder"/>
@@ -57,7 +60,7 @@
                                                <object class="NSTextField" id="794651271">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{17, 8}, {588, 14}}</string>
+                                                       <string key="NSFrame">{{17, 0}, {551, 28}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="10523918">
@@ -66,7 +69,7 @@
                                                                <string type="base64-UTF8" key="NSContents">RE8gTk9UIFRSQU5TTEFURSBUSElTIE5JQiBGSUxFLAo</string>
                                                                <object class="NSFont" key="NSSupport" id="26">
                                                                        <string key="NSName">LucidaGrande</string>
-                                                                       <double key="NSSize">1.100000e+01</double>
+                                                                       <double key="NSSize">11</double>
                                                                        <int key="NSfFlags">3100</int>
                                                                </object>
                                                                <reference key="NSControlView" ref="794651271"/>
@@ -76,7 +79,7 @@
                                                                        <string key="NSColorName">controlColor</string>
                                                                        <object class="NSColor" key="NSColor" id="458742033">
                                                                                <int key="NSColorSpace">3</int>
-                                                                               <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+                                                                               <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
                                                                        </object>
                                                                </object>
                                                                <object class="NSColor" key="NSTextColor" id="701609070">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">1288</int>
                                                        <object class="NSPSMatrix" key="NSDrawMatrix"/>
-                                                       <string key="NSFrame">{{18, -20}, {721, 20}}</string>
+                                                       <string key="NSFrame">{{18, -28}, {724, 20}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <int key="NSpiFlags">16396</int>
-                                                       <double key="NSMaxValue">1.000000e+02</double>
+                                                       <double key="NSMaxValue">100</double>
                                                </object>
                                                <object class="NSTabView" id="712502892">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{13, 22}, {734, 343}}</string>
+                                                       <string key="NSFrame">{{13, 28}, {734, 343}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <object class="NSMutableArray" key="NSTabViewItems">
                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                <object class="NSTabViewItem" id="107038816">
                                                                        <string key="NSIdentifier">1</string>
                                                                        <object class="NSView" key="NSView" id="1053078401">
-                                                                               <nil key="NSNextResponder"/>
+                                                                               <reference key="NSNextResponder" ref="712502892"/>
                                                                                <int key="NSvFlags">256</int>
                                                                                <object class="NSMutableArray" key="NSSubviews">
                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <int key="NSCellFlags2">131072</int>
                                                                                                                <string key="NSContents">Average bitrate (kbps):</string>
                                                                                                                <reference key="NSSupport" ref="26"/>
-                                                                                                               <int key="NSTag">1</int>
                                                                                                                <reference key="NSControlView" ref="229000833"/>
+                                                                                                               <int key="NSTag">1</int>
                                                                                                                <int key="NSButtonFlags">1211912703</int>
                                                                                                                <int key="NSButtonFlags2">0</int>
                                                                                                                <reference key="NSAlternateImage" ref="860784734"/>
                                                                                                        <string key="NSContents">Radio</string>
                                                                                                        <object class="NSFont" key="NSSupport" id="273283760">
                                                                                                                <string key="NSName">LucidaGrande</string>
-                                                                                                               <double key="NSSize">1.300000e+01</double>
+                                                                                                               <double key="NSSize">13</double>
                                                                                                                <int key="NSfFlags">1044</int>
                                                                                                        </object>
                                                                                                        <int key="NSButtonFlags">1211912703</int>
                                                                                                        </object>
                                                                                                        <object class="NSFont" key="NSSupport" id="22">
                                                                                                                <string key="NSName">LucidaGrande</string>
-                                                                                                               <double key="NSSize">9.000000e+00</double>
+                                                                                                               <double key="NSSize">9</double>
                                                                                                                <int key="NSfFlags">3614</int>
                                                                                                        </object>
                                                                                                        <reference key="NSControlView" ref="239657287"/>
-                                                                                                       <double key="NSMaxValue">5.100000e+01</double>
-                                                                                                       <double key="NSMinValue">0.000000e+00</double>
-                                                                                                       <double key="NSValue">1.900000e+01</double>
-                                                                                                       <double key="NSAltIncValue">0.000000e+00</double>
+                                                                                                       <double key="NSMaxValue">51</double>
+                                                                                                       <double key="NSMinValue">0.0</double>
+                                                                                                       <double key="NSValue">19</double>
+                                                                                                       <double key="NSAltIncValue">0.0</double>
                                                                                                        <int key="NSNumberOfTickMarks">205</int>
                                                                                                        <int key="NSTickMarkPosition">1</int>
                                                                                                        <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
                                                                                        <object class="NSTextField" id="690304958">
                                                                                                <reference key="NSNextResponder" ref="1053078401"/>
                                                                                                <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{538, 211}, {56, 14}}</string>
+                                                                                               <string key="NSFrame">{{531, 211}, {169, 14}}</string>
                                                                                                <reference key="NSSuperview" ref="1053078401"/>
                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                <object class="NSTextFieldCell" key="NSCell" id="923732752">
                                                                                                        <object class="NSNumberFormatter" key="NSFormatter" id="580574518">
                                                                                                                <object class="NSMutableDictionary" key="NS.attributes">
                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <object class="NSMutableArray" key="dict.sortedKeys">
+                                                                                                                       <object class="NSArray" key="dict.sortedKeys">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                <string>allowsFloats</string>
                                                                                                                                <string>formatterBehavior</string>
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                <boolean value="YES"/>
                                                                                                                                <integer value="1040"/>
-                                                                                                                               <boolean value="NO" id="6"/>
+                                                                                                                               <boolean value="NO"/>
                                                                                                                                <object class="NSLocale">
                                                                                                                                        <string key="NS.identifier"/>
                                                                                                                                </object>
-                                                                                                                               <string type="base64-UTF8">LeKIng</string>
+                                                                                                                               <string>-∞</string>
                                                                                                                                <string/>
-                                                                                                                               <integer value="1" id="9"/>
-                                                                                                                               <string type="base64-UTF8">K+KIng</string>
+                                                                                                                               <integer value="1"/>
+                                                                                                                               <string>+∞</string>
                                                                                                                        </object>
                                                                                                                </object>
                                                                                                                <string key="NS.positiveformat">#,##0.###</string>
                                                                                                                <string key="NS.negativeformat">#,##0.###</string>
                                                                                                                <nil key="NS.positiveattrs"/>
                                                                                                                <nil key="NS.negativeattrs"/>
-                                                                                                               <object class="NSAttributedString" key="NS.zero">
-                                                                                                                       <nil key="NSString"/>
-                                                                                                               </object>
+                                                                                                               <nil key="NS.zero"/>
                                                                                                                <object class="NSAttributedString" key="NS.nil">
                                                                                                                        <string key="NSString"/>
                                                                                                                </object>
                                                                                                                        <string key="NSString">NaN</string>
                                                                                                                        <object class="NSDictionary" key="NSAttributes">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                               <object class="NSArray" key="dict.sortedKeys">
-                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                               </object>
+                                                                                                                               <reference key="dict.sortedKeys" ref="0"/>
                                                                                                                                <object class="NSMutableArray" key="dict.values">
                                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                </object>
                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                <object class="NSTextFieldCell" key="NSCell" id="936221726">
                                                                                                        <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">71434240</int>
+                                                                                                       <int key="NSCellFlags2">4325376</int>
                                                                                                        <string key="NSContents">RF:</string>
                                                                                                        <reference key="NSSupport" ref="26"/>
                                                                                                        <reference key="NSControlView" ref="323705695"/>
                                                                                        <object class="NSButton" id="1000247853">
                                                                                                <reference key="NSNextResponder" ref="1053078401"/>
                                                                                                <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{106, 208}, {124, 18}}</string>
+                                                                                               <string key="NSFrame">{{106, 183}, {124, 18}}</string>
                                                                                                <reference key="NSSuperview" ref="1053078401"/>
                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                <object class="NSButtonCell" key="NSCell" id="860863090">
                                                                                                        <int key="NSPeriodicInterval">25</int>
                                                                                                </object>
                                                                                        </object>
+                                                                                       <object class="NSButton" id="852146403">
+                                                                                               <reference key="NSNextResponder" ref="1053078401"/>
+                                                                                               <int key="NSvFlags">-2147483392</int>
+                                                                                               <string key="NSFrame">{{106, 206}, {148, 18}}</string>
+                                                                                               <reference key="NSSuperview" ref="1053078401"/>
+                                                                                               <bool key="NSEnabled">YES</bool>
+                                                                                               <object class="NSButtonCell" key="NSCell" id="409419177">
+                                                                                                       <int key="NSCellFlags">67239424</int>
+                                                                                                       <int key="NSCellFlags2">131072</int>
+                                                                                                       <string key="NSContents">Peak Framerate (VFR)</string>
+                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                       <reference key="NSControlView" ref="852146403"/>
+                                                                                                       <int key="NSButtonFlags">1211912703</int>
+                                                                                                       <int key="NSButtonFlags2">2</int>
+                                                                                                       <reference key="NSAlternateImage" ref="624832340"/>
+                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                       <int key="NSPeriodicDelay">200</int>
+                                                                                                       <int key="NSPeriodicInterval">25</int>
+                                                                                               </object>
+                                                                                       </object>
                                                                                        <object class="NSButton" id="447003158">
                                                                                                <reference key="NSNextResponder" ref="1053078401"/>
                                                                                                <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{123, 190}, {107, 16}}</string>
+                                                                                               <string key="NSFrame">{{123, 165}, {107, 16}}</string>
                                                                                                <reference key="NSSuperview" ref="1053078401"/>
                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                <object class="NSButtonCell" key="NSCell" id="1070893195">
                                                                                        </object>
                                                                                </object>
                                                                                <string key="NSFrame">{{10, 25}, {714, 305}}</string>
+                                                                               <reference key="NSSuperview" ref="712502892"/>
                                                                        </object>
                                                                        <string key="NSLabel">Video</string>
                                                                        <reference key="NSColor" ref="242973447"/>
                                                                                <int key="NSvFlags">256</int>
                                                                                <object class="NSMutableArray" key="NSSubviews">
                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                       <object class="NSTextField" id="198352083">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{5, 226}, {48, 14}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="93020318"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="51721961">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">71434240</int>
-                                                                                                       <string key="NSContents">Track 1:</string>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="198352083"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="641072930">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{54, 191}, {178, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="68754422"/>
-                                                                                               <int key="NSTag">1</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="442718934">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="641072930"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <object class="NSFont" key="NSAlternateImage" id="995413175">
-                                                                                                               <string key="NSName">LucidaGrande</string>
-                                                                                                               <double key="NSSize">1.100000e+01</double>
-                                                                                                               <int key="NSfFlags">16</int>
-                                                                                                       </object>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="484803315">
-                                                                                                               <reference key="NSMenu" ref="417760816"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="442718934"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="417760816">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="484803315"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="290434291">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{5, 196}, {48, 14}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="641072930"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="315823608">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">71434240</int>
-                                                                                                       <string key="NSContents">Track 2:</string>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="290434291"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="122023676">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{572, 248}, {80, 13}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="351922892"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="92788757">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">Bitrate (kbps)</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="122023676"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="351922892">
+                                                                                       <object class="NSView" id="577274772">
                                                                                                <reference key="NSNextResponder" ref="738554558"/>
                                                                                                <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{578, 221}, {66, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="569025834">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="351922892"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="53010878">
-                                                                                                               <reference key="NSMenu" ref="389043188"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="569025834"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="389043188">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                       <object class="NSScrollView" id="933946879">
+                                                                                                               <reference key="NSNextResponder" ref="577274772"/>
+                                                                                                               <int key="NSvFlags">268</int>
+                                                                                                               <object class="NSMutableArray" key="NSSubviews">
                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="53010878"/>
+                                                                                                                       <object class="NSClipView" id="528259747">
+                                                                                                                               <reference key="NSNextResponder" ref="933946879"/>
+                                                                                                                               <int key="NSvFlags">2304</int>
+                                                                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                       <object class="NSTableView" id="792464451">
+                                                                                                                                               <reference key="NSNextResponder" ref="528259747"/>
+                                                                                                                                               <int key="NSvFlags">256</int>
+                                                                                                                                               <string key="NSFrameSize">{678, 241}</string>
+                                                                                                                                               <reference key="NSSuperview" ref="528259747"/>
+                                                                                                                                               <bool key="NSEnabled">YES</bool>
+                                                                                                                                               <object class="NSTableHeaderView" key="NSHeaderView" id="146611085">
+                                                                                                                                                       <reference key="NSNextResponder" ref="230332532"/>
+                                                                                                                                                       <int key="NSvFlags">256</int>
+                                                                                                                                                       <string key="NSFrameSize">{678, 17}</string>
+                                                                                                                                                       <reference key="NSSuperview" ref="230332532"/>
+                                                                                                                                                       <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                               </object>
+                                                                                                                                               <object class="_NSCornerView" key="NSCornerView" id="727606062">
+                                                                                                                                                       <reference key="NSNextResponder" ref="933946879"/>
+                                                                                                                                                       <int key="NSvFlags">-2147483392</int>
+                                                                                                                                                       <string key="NSFrame">{{-26, 0}, {16, 17}}</string>
+                                                                                                                                                       <reference key="NSSuperview" ref="933946879"/>
+                                                                                                                                               </object>
+                                                                                                                                               <object class="NSMutableArray" key="NSTableColumns">
+                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                       <object class="NSTableColumn" id="33212493">
+                                                                                                                                                               <string key="NSIdentifier">track</string>
+                                                                                                                                                               <double key="NSWidth">170</double>
+                                                                                                                                                               <double key="NSMinWidth">40</double>
+                                                                                                                                                               <double key="NSMaxWidth">1000</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">2048</int>
+                                                                                                                                                                       <string key="NSContents">Track</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <object class="NSColor" key="NSBackgroundColor">
+                                                                                                                                                                               <int key="NSColorSpace">3</int>
+                                                                                                                                                                               <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <object class="NSColor" key="NSTextColor" id="188451177">
+                                                                                                                                                                               <int key="NSColorSpace">6</int>
+                                                                                                                                                                               <string key="NSCatalogName">System</string>
+                                                                                                                                                                               <string key="NSColorName">headerTextColor</string>
+                                                                                                                                                                               <reference key="NSColor" ref="544409939"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSPopUpButtonCell" key="NSDataCell" id="871837653">
+                                                                                                                                                                       <int key="NSCellFlags">-2076049856</int>
+                                                                                                                                                                       <int key="NSCellFlags2">133120</int>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                                                                       <object class="NSFont" key="NSAlternateImage" id="995413175">
+                                                                                                                                                                               <string key="NSName">LucidaGrande</string>
+                                                                                                                                                                               <double key="NSSize">11</double>
+                                                                                                                                                                               <int key="NSfFlags">16</int>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                                                                       <int key="NSPeriodicDelay">400</int>
+                                                                                                                                                                       <int key="NSPeriodicInterval">75</int>
+                                                                                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="677045788">
+                                                                                                                                                                               <reference key="NSMenu" ref="513335837"/>
+                                                                                                                                                                               <string key="NSTitle">Pop Up</string>
+                                                                                                                                                                               <string key="NSKeyEquiv"/>
+                                                                                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                                                                                                                               <int key="NSState">1</int>
+                                                                                                                                                                               <reference key="NSOnImage" ref="447995298"/>
+                                                                                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
+                                                                                                                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                                                                                                                               <reference key="NSTarget" ref="871837653"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                                                                                                                                       <object class="NSMenu" key="NSMenu" id="513335837">
+                                                                                                                                                                               <string key="NSTitle">OtherViews</string>
+                                                                                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                                                       <reference ref="677045788"/>
+                                                                                                                                                                               </object>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                                                                                                                                       <bool key="NSAltersState">YES</bool>
+                                                                                                                                                                       <int key="NSArrowPosition">2</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="200958136">
+                                                                                                                                                               <string key="NSIdentifier">codec</string>
+                                                                                                                                                               <double key="NSWidth">122</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">2048</int>
+                                                                                                                                                                       <string key="NSContents">Codec</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <object class="NSColor" key="NSBackgroundColor" id="1045207104">
+                                                                                                                                                                               <int key="NSColorSpace">6</int>
+                                                                                                                                                                               <string key="NSCatalogName">System</string>
+                                                                                                                                                                               <string key="NSColorName">headerColor</string>
+                                                                                                                                                                               <reference key="NSColor" ref="809784795"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSPopUpButtonCell" key="NSDataCell" id="4014313">
+                                                                                                                                                                       <int key="NSCellFlags">-2076049856</int>
+                                                                                                                                                                       <int key="NSCellFlags2">133120</int>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
+                                                                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                                                                       <int key="NSPeriodicDelay">400</int>
+                                                                                                                                                                       <int key="NSPeriodicInterval">75</int>
+                                                                                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="1058317103">
+                                                                                                                                                                               <reference key="NSMenu" ref="525066294"/>
+                                                                                                                                                                               <string key="NSTitle">Pop Up</string>
+                                                                                                                                                                               <string key="NSKeyEquiv"/>
+                                                                                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                                                                                                                               <int key="NSState">1</int>
+                                                                                                                                                                               <reference key="NSOnImage" ref="447995298"/>
+                                                                                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
+                                                                                                                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                                                                                                                               <reference key="NSTarget" ref="4014313"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                                                                                                                                       <object class="NSMenu" key="NSMenu" id="525066294">
+                                                                                                                                                                               <string key="NSTitle">OtherViews</string>
+                                                                                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                                                       <reference ref="1058317103"/>
+                                                                                                                                                                               </object>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                                                                                                                                       <bool key="NSAltersState">YES</bool>
+                                                                                                                                                                       <int key="NSArrowPosition">2</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <bool key="NSIsEditable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="590927656">
+                                                                                                                                                               <string key="NSIdentifier">mixdown</string>
+                                                                                                                                                               <double key="NSWidth">139</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">2048</int>
+                                                                                                                                                                       <string key="NSContents">Mixdown</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSPopUpButtonCell" key="NSDataCell" id="1037917692">
+                                                                                                                                                                       <int key="NSCellFlags">-2076049856</int>
+                                                                                                                                                                       <int key="NSCellFlags2">133120</int>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
+                                                                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                                                                       <int key="NSPeriodicDelay">400</int>
+                                                                                                                                                                       <int key="NSPeriodicInterval">75</int>
+                                                                                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="106742036">
+                                                                                                                                                                               <reference key="NSMenu" ref="966554680"/>
+                                                                                                                                                                               <string key="NSTitle">Pop Up</string>
+                                                                                                                                                                               <string key="NSKeyEquiv"/>
+                                                                                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                                                                                                                               <int key="NSState">1</int>
+                                                                                                                                                                               <reference key="NSOnImage" ref="447995298"/>
+                                                                                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
+                                                                                                                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                                                                                                                               <reference key="NSTarget" ref="1037917692"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                                                                                                                                       <object class="NSMenu" key="NSMenu" id="966554680">
+                                                                                                                                                                               <string key="NSTitle">OtherViews</string>
+                                                                                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                                                       <reference ref="106742036"/>
+                                                                                                                                                                               </object>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                                                                                                                                       <bool key="NSAltersState">YES</bool>
+                                                                                                                                                                       <int key="NSArrowPosition">2</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <bool key="NSIsEditable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="1063255">
+                                                                                                                                                               <string key="NSIdentifier">samplerate</string>
+                                                                                                                                                               <double key="NSWidth">68</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">2048</int>
+                                                                                                                                                                       <string key="NSContents">Samplerate</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSPopUpButtonCell" key="NSDataCell" id="257530638">
+                                                                                                                                                                       <int key="NSCellFlags">-2076049856</int>
+                                                                                                                                                                       <int key="NSCellFlags2">133120</int>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
+                                                                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                                                                       <int key="NSPeriodicDelay">400</int>
+                                                                                                                                                                       <int key="NSPeriodicInterval">75</int>
+                                                                                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="713274619">
+                                                                                                                                                                               <reference key="NSMenu" ref="640929469"/>
+                                                                                                                                                                               <string key="NSTitle">Pop Up</string>
+                                                                                                                                                                               <string key="NSKeyEquiv"/>
+                                                                                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                                                                                                                               <int key="NSState">1</int>
+                                                                                                                                                                               <reference key="NSOnImage" ref="447995298"/>
+                                                                                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
+                                                                                                                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                                                                                                                               <reference key="NSTarget" ref="257530638"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                                                                                                                                       <object class="NSMenu" key="NSMenu" id="640929469">
+                                                                                                                                                                               <string key="NSTitle">OtherViews</string>
+                                                                                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                                                       <reference ref="713274619"/>
+                                                                                                                                                                               </object>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                                                                                                                                       <bool key="NSAltersState">YES</bool>
+                                                                                                                                                                       <int key="NSArrowPosition">2</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <bool key="NSIsEditable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="596723553">
+                                                                                                                                                               <string key="NSIdentifier">bitrate</string>
+                                                                                                                                                               <double key="NSWidth">84</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">2048</int>
+                                                                                                                                                                       <string key="NSContents">Bitrate (kbps)</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSPopUpButtonCell" key="NSDataCell" id="238248766">
+                                                                                                                                                                       <int key="NSCellFlags">-2076049856</int>
+                                                                                                                                                                       <int key="NSCellFlags2">133120</int>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
+                                                                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                                                                       <int key="NSPeriodicDelay">400</int>
+                                                                                                                                                                       <int key="NSPeriodicInterval">75</int>
+                                                                                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="452766579">
+                                                                                                                                                                               <reference key="NSMenu" ref="764294190"/>
+                                                                                                                                                                               <string key="NSTitle">Pop Up</string>
+                                                                                                                                                                               <string key="NSKeyEquiv"/>
+                                                                                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
+                                                                                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
+                                                                                                                                                                               <int key="NSState">1</int>
+                                                                                                                                                                               <reference key="NSOnImage" ref="447995298"/>
+                                                                                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
+                                                                                                                                                                               <string key="NSAction">_popUpItemAction:</string>
+                                                                                                                                                                               <reference key="NSTarget" ref="238248766"/>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                                                                                                                                       <object class="NSMenu" key="NSMenu" id="764294190">
+                                                                                                                                                                               <string key="NSTitle">OtherViews</string>
+                                                                                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
+                                                                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                                                                       <reference ref="452766579"/>
+                                                                                                                                                                               </object>
+                                                                                                                                                                       </object>
+                                                                                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
+                                                                                                                                                                       <bool key="NSAltersState">YES</bool>
+                                                                                                                                                                       <int key="NSArrowPosition">2</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <bool key="NSIsEditable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="393032802">
+                                                                                                                                                               <string key="NSIdentifier">drc</string>
+                                                                                                                                                               <double key="NSWidth">46</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">134219776</int>
+                                                                                                                                                                       <string key="NSContents">DRC</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSSliderCell" key="NSDataCell" id="852982078">
+                                                                                                                                                                       <int key="NSCellFlags">-2079981824</int>
+                                                                                                                                                                       <int key="NSCellFlags2">131072</int>
+                                                                                                                                                                       <string key="NSContents"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <double key="NSMaxValue">4</double>
+                                                                                                                                                                       <double key="NSMinValue">0.0</double>
+                                                                                                                                                                       <double key="NSValue">0.0</double>
+                                                                                                                                                                       <double key="NSAltIncValue">0.0</double>
+                                                                                                                                                                       <int key="NSNumberOfTickMarks">16</int>
+                                                                                                                                                                       <int key="NSTickMarkPosition">0</int>
+                                                                                                                                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
+                                                                                                                                                                       <bool key="NSVertical">NO</bool>
+                                                                                                                                                                       <int key="NSSliderType">1</int>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <bool key="NSIsEditable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                                       <object class="NSTableColumn" id="581296833">
+                                                                                                                                                               <string key="NSIdentifier">drctext</string>
+                                                                                                                                                               <double key="NSWidth">28</double>
+                                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
+                                                                                                                                                               <object class="NSTableHeaderCell" key="NSHeaderCell">
+                                                                                                                                                                       <int key="NSCellFlags">75628096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">134219776</int>
+                                                                                                                                                                       <string key="NSContents"/>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <object class="NSTextFieldCell" key="NSDataCell" id="750418243">
+                                                                                                                                                                       <int key="NSCellFlags">337772096</int>
+                                                                                                                                                                       <int key="NSCellFlags2">272761856</int>
+                                                                                                                                                                       <string key="NSContents">Text</string>
+                                                                                                                                                                       <reference key="NSSupport" ref="26"/>
+                                                                                                                                                                       <reference key="NSControlView" ref="792464451"/>
+                                                                                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
+                                                                                                                                                                       <reference key="NSTextColor" ref="701609070"/>
+                                                                                                                                                               </object>
+                                                                                                                                                               <int key="NSResizingMask">3</int>
+                                                                                                                                                               <bool key="NSIsResizeable">YES</bool>
+                                                                                                                                                               <reference key="NSTableView" ref="792464451"/>
+                                                                                                                                                       </object>
+                                                                                                                                               </object>
+                                                                                                                                               <double key="NSIntercellSpacingWidth">3</double>
+                                                                                                                                               <double key="NSIntercellSpacingHeight">2</double>
+                                                                                                                                               <reference key="NSBackgroundColor" ref="809784795"/>
+                                                                                                                                               <object class="NSColor" key="NSGridColor" id="156710040">
+                                                                                                                                                       <int key="NSColorSpace">6</int>
+                                                                                                                                                       <string key="NSCatalogName">System</string>
+                                                                                                                                                       <string key="NSColorName">gridColor</string>
+                                                                                                                                                       <object class="NSColor" key="NSColor">
+                                                                                                                                                               <int key="NSColorSpace">3</int>
+                                                                                                                                                               <bytes key="NSWhite">MC41AA</bytes>
+                                                                                                                                                       </object>
+                                                                                                                                               </object>
+                                                                                                                                               <double key="NSRowHeight">25</double>
+                                                                                                                                               <int key="NSTvFlags">1379926016</int>
+                                                                                                                                               <reference key="NSDelegate"/>
+                                                                                                                                               <reference key="NSDataSource"/>
+                                                                                                                                               <int key="NSColumnAutoresizingStyle">4</int>
+                                                                                                                                               <int key="NSDraggingSourceMaskForLocal">15</int>
+                                                                                                                                               <int key="NSDraggingSourceMaskForNonLocal">0</int>
+                                                                                                                                               <bool key="NSAllowsTypeSelect">NO</bool>
+                                                                                                                                               <int key="NSTableViewDraggingDestinationStyle">0</int>
+                                                                                                                                       </object>
+                                                                                                                               </object>
+                                                                                                                               <string key="NSFrame">{{1, 17}, {678, 241}}</string>
+                                                                                                                               <reference key="NSSuperview" ref="933946879"/>
+                                                                                                                               <reference key="NSNextKeyView" ref="792464451"/>
+                                                                                                                               <reference key="NSDocView" ref="792464451"/>
+                                                                                                                               <object class="NSColor" key="NSBGColor" id="355843302">
+                                                                                                                                       <int key="NSColorSpace">6</int>
+                                                                                                                                       <string key="NSCatalogName">System</string>
+                                                                                                                                       <string key="NSColorName">controlBackgroundColor</string>
+                                                                                                                                       <reference key="NSColor" ref="458742033"/>
+                                                                                                                               </object>
+                                                                                                                               <int key="NScvFlags">4</int>
+                                                                                                                       </object>
+                                                                                                                       <object class="NSScroller" id="496546489">
+                                                                                                                               <reference key="NSNextResponder" ref="933946879"/>
+                                                                                                                               <int key="NSvFlags">-2147483392</int>
+                                                                                                                               <string key="NSFrame">{{-100, -100}, {15, 206}}</string>
+                                                                                                                               <reference key="NSSuperview" ref="933946879"/>
+                                                                                                                               <reference key="NSTarget" ref="933946879"/>
+                                                                                                                               <string key="NSAction">_doScroller:</string>
+                                                                                                                               <double key="NSCurValue">37</double>
+                                                                                                                               <double key="NSPercent">0.19473679999999999</double>
+                                                                                                                       </object>
+                                                                                                                       <object class="NSScroller" id="821562152">
+                                                                                                                               <reference key="NSNextResponder" ref="933946879"/>
+                                                                                                                               <int key="NSvFlags">-2147483392</int>
+                                                                                                                               <string key="NSFrame">{{-100, -100}, {685, 15}}</string>
+                                                                                                                               <reference key="NSSuperview" ref="933946879"/>
+                                                                                                                               <int key="NSsFlags">1</int>
+                                                                                                                               <reference key="NSTarget" ref="933946879"/>
+                                                                                                                               <string key="NSAction">_doScroller:</string>
+                                                                                                                               <double key="NSPercent">0.57142859999999995</double>
+                                                                                                                       </object>
+                                                                                                                       <object class="NSClipView" id="230332532">
+                                                                                                                               <reference key="NSNextResponder" ref="933946879"/>
+                                                                                                                               <int key="NSvFlags">2304</int>
+                                                                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                                       <reference ref="146611085"/>
+                                                                                                                               </object>
+                                                                                                                               <string key="NSFrame">{{1, 0}, {678, 17}}</string>
+                                                                                                                               <reference key="NSSuperview" ref="933946879"/>
+                                                                                                                               <reference key="NSNextKeyView" ref="146611085"/>
+                                                                                                                               <reference key="NSDocView" ref="146611085"/>
+                                                                                                                               <reference key="NSBGColor" ref="355843302"/>
+                                                                                                                               <int key="NScvFlags">4</int>
+                                                                                                                       </object>
+                                                                                                                       <reference ref="727606062"/>
                                                                                                                </object>
+                                                                                                               <string key="NSFrame">{{17, 17}, {680, 259}}</string>
+                                                                                                               <reference key="NSSuperview" ref="577274772"/>
+                                                                                                               <reference key="NSNextKeyView" ref="528259747"/>
+                                                                                                               <int key="NSsFlags">530</int>
+                                                                                                               <reference key="NSVScroller" ref="496546489"/>
+                                                                                                               <reference key="NSHScroller" ref="821562152"/>
+                                                                                                               <reference key="NSContentView" ref="528259747"/>
+                                                                                                               <reference key="NSHeaderClipView" ref="230332532"/>
+                                                                                                               <reference key="NSCornerView" ref="727606062"/>
+                                                                                                               <bytes key="NSScrollAmts">QSAAAEEgAABB2AAAQdgAAA</bytes>
                                                                                                        </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="64899409">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{362, 220}, {139, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="290434291"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="581778322">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="64899409"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="803452967">
-                                                                                                               <reference key="NSMenu" ref="142584693"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="581778322"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="142584693">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="803452967"/>
+                                                                                                       <object class="NSButton" id="883603583">
+                                                                                                               <reference key="NSNextResponder" ref="577274772"/>
+                                                                                                               <int key="NSvFlags">268</int>
+                                                                                                               <string key="NSFrame">{{16, 282}, {116, 16}}</string>
+                                                                                                               <reference key="NSSuperview" ref="577274772"/>
+                                                                                                               <bool key="NSEnabled">YES</bool>
+                                                                                                               <object class="NSButtonCell" key="NSCell" id="327570663">
+                                                                                                                       <int key="NSCellFlags">67239424</int>
+                                                                                                                       <int key="NSCellFlags2">134479872</int>
+                                                                                                                       <string key="NSContents">Add All Tracks</string>
+                                                                                                                       <reference key="NSSupport" ref="22"/>
+                                                                                                                       <reference key="NSControlView" ref="883603583"/>
+                                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                                       <int key="NSPeriodicDelay">200</int>
+                                                                                                                       <int key="NSPeriodicInterval">25</int>
                                                                                                                </object>
                                                                                                        </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="211624488">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{374, 250}, {81, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="64899409"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="109899703">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">Mixdown</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="211624488"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
                                                                                                </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="354208181">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{362, 191}, {139, 22}}</string>
+                                                                                               <string key="NSFrameSize">{714, 305}</string>
                                                                                                <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="592255786"/>
-                                                                                               <int key="NSTag">1</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="1011395150">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="354208181"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="909780825">
-                                                                                                               <reference key="NSMenu" ref="674797640"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="1011395150"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="674797640">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="909780825"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
                                                                                        </object>
-                                                                                       <object class="NSTextField" id="978534247">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{17, 279}, {79, 14}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="211433572">
-                                                                                                       <int key="NSCellFlags">67239488</int>
-                                                                                                       <int key="NSCellFlags2">272761856</int>
-                                                                                                       <string key="NSContents">Audio Tracks</string>
-                                                                                                       <object class="NSFont" key="NSSupport">
-                                                                                                               <string key="NSName">LucidaGrande-Bold</string>
-                                                                                                               <double key="NSSize">1.100000e+01</double>
-                                                                                                               <int key="NSfFlags">16</int>
-                                                                                                       </object>
-                                                                                                       <reference key="NSControlView" ref="978534247"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSBox" id="460286942">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
+                                                                               </object>
+                                                                               <string key="NSFrame">{{10, 25}, {714, 305}}</string>
+                                                                       </object>
+                                                                       <string key="NSLabel">Audio</string>
+                                                                       <reference key="NSColor" ref="242973447"/>
+                                                                       <reference key="NSTabView" ref="712502892"/>
+                                                               </object>
+                                                               <object class="NSTabViewItem" id="799016137">
+                                                                       <string key="NSIdentifier">3</string>
+                                                                       <object class="NSView" key="NSView" id="756255803">
+                                                                               <nil key="NSNextResponder"/>
+                                                                               <int key="NSvFlags">256</int>
+                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                       <object class="NSScrollView" id="596256174">
+                                                                                               <reference key="NSNextResponder" ref="756255803"/>
                                                                                                <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{104, 283}, {601, 5}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <string key="NSOffsets">{0, 0}</string>
-                                                                                               <object class="NSTextFieldCell" key="NSTitleCell">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">0</int>
-                                                                                                       <string key="NSContents">Box</string>
-                                                                                                       <reference key="NSSupport" ref="273283760"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="138233214"/>
-                                                                                                       <object class="NSColor" key="NSTextColor">
-                                                                                                               <int key="NSColorSpace">3</int>
-                                                                                                               <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
-                                                                                                       </object>
-                                                                                               </object>
-                                                                                               <int key="NSBorderType">3</int>
-                                                                                               <int key="NSBoxType">2</int>
-                                                                                               <int key="NSTitlePosition">0</int>
-                                                                                               <bool key="NSTransparent">NO</bool>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="68754422">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{90, 250}, {81, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="354208181"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="1013303839">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">Source</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="68754422"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="135824882">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{508, 221}, {64, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="122023676"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="47770866">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="135824882"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="122262864">
-                                                                                                               <reference key="NSMenu" ref="80517384"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="47770866"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="80517384">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="122262864"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="592255786">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{483, 245}, {101, 16}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="135824882"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="139205907">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">Samplerate (khz)</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="592255786"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="93020318">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{54, 221}, {178, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <reference key="NSNextKeyView" ref="211624488"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="555573644">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="93020318"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="16243588">
-                                                                                                               <reference key="NSMenu" ref="207945181"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="555573644"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="207945181">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="16243588"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="466865421">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{235, 221}, {122, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="546425857">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="466865421"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="780045253">
-                                                                                                               <reference key="NSMenu" ref="637766485"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="546425857"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="637766485">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="780045253"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="905865959">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{235, 191}, {122, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">1</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="597526693">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="905865959"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="839112264">
-                                                                                                               <reference key="NSMenu" ref="587264026"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="597526693"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="587264026">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="839112264"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="759329849">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{251, 250}, {81, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="989243685">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">Audio Codec</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="759329849"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="979512783">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{5, 167}, {48, 14}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="89611592">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">71434240</int>
-                                                                                                       <string key="NSContents">Track 3:</string>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="979512783"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="822590453">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{5, 139}, {48, 14}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="628539537">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">71434240</int>
-                                                                                                       <string key="NSContents">Track 4:</string>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="822590453"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="59505660">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{54, 162}, {178, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">2</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="62643522">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="59505660"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="1071907387">
-                                                                                                               <reference key="NSMenu" ref="906154976"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="62643522"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="906154976">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="1071907387"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="952272880">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{54, 132}, {178, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">3</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="995278067">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="952272880"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="867303619">
-                                                                                                               <reference key="NSMenu" ref="842863259"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="995278067"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="842863259">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="867303619"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="826012798">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{235, 162}, {122, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">2</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="539072481">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="826012798"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="249799590">
-                                                                                                               <reference key="NSMenu" ref="284493447"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="539072481"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="284493447">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="249799590"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="210973520">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{235, 132}, {122, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">3</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="908345921">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="210973520"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="899331996">
-                                                                                                               <reference key="NSMenu" ref="718591795"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="908345921"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="718591795">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="899331996"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="838524493">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{362, 162}, {139, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">2</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="273746940">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="838524493"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="903801986">
-                                                                                                               <reference key="NSMenu" ref="601838973"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="273746940"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="601838973">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="903801986"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="1068703394">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{362, 132}, {139, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">3</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="376486018">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="1068703394"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="775004825">
-                                                                                                               <reference key="NSMenu" ref="911510427"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="376486018"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="911510427">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="775004825"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="989777035">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{508, 191}, {64, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">1</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="98589714">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="989777035"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="1073059200">
-                                                                                                               <reference key="NSMenu" ref="843839970"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="98589714"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="843839970">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="1073059200"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="21683307">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{508, 162}, {64, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">2</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="27141415">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="21683307"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="848021411">
-                                                                                                               <reference key="NSMenu" ref="218736664"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="27141415"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="218736664">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="848021411"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="82044516">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{508, 132}, {64, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">3</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="828435207">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="82044516"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="306314205">
-                                                                                                               <reference key="NSMenu" ref="884417804"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="828435207"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="884417804">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="306314205"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="511205515">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{578, 191}, {66, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">1</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="631798512">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="511205515"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="395128474">
-                                                                                                               <reference key="NSMenu" ref="827185994"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="631798512"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="827185994">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="395128474"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="362406693">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{578, 162}, {66, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">2</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="494375275">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="362406693"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="509612152">
-                                                                                                               <reference key="NSMenu" ref="74387810"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="494375275"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="74387810">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="509612152"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSPopUpButton" id="596295285">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{578, 132}, {66, 22}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <int key="NSTag">3</int>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSPopUpButtonCell" key="NSCell" id="88657835">
-                                                                                                       <int key="NSCellFlags">-2076049856</int>
-                                                                                                       <int key="NSCellFlags2">132096</int>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="596295285"/>
-                                                                                                       <int key="NSButtonFlags">109199615</int>
-                                                                                                       <int key="NSButtonFlags2">1</int>
-                                                                                                       <reference key="NSAlternateImage" ref="995413175"/>
-                                                                                                       <string key="NSAlternateContents"/>
-                                                                                                       <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                                                               <characters key="NS.bytes"/>
-                                                                                                       </object>
-                                                                                                       <int key="NSPeriodicDelay">400</int>
-                                                                                                       <int key="NSPeriodicInterval">75</int>
-                                                                                                       <object class="NSMenuItem" key="NSMenuItem" id="425953784">
-                                                                                                               <reference key="NSMenu" ref="819464815"/>
-                                                                                                               <string key="NSTitle"/>
-                                                                                                               <string key="NSKeyEquiv"/>
-                                                                                                               <int key="NSKeyEquivModMask">1048576</int>
-                                                                                                               <int key="NSMnemonicLoc">2147483647</int>
-                                                                                                               <int key="NSState">1</int>
-                                                                                                               <reference key="NSOnImage" ref="447995298"/>
-                                                                                                               <reference key="NSMixedImage" ref="760317610"/>
-                                                                                                               <string key="NSAction">_popUpItemAction:</string>
-                                                                                                               <reference key="NSTarget" ref="88657835"/>
-                                                                                                       </object>
-                                                                                                       <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                                                                       <object class="NSMenu" key="NSMenu" id="819464815">
-                                                                                                               <object class="NSMutableString" key="NSTitle">
-                                                                                                                       <characters key="NS.bytes">OtherViews</characters>
-                                                                                                               </object>
-                                                                                                               <object class="NSMutableArray" key="NSMenuItems">
-                                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                       <reference ref="425953784"/>
-                                                                                                               </object>
-                                                                                                       </object>
-                                                                                                       <int key="NSPreferredEdge">3</int>
-                                                                                                       <bool key="NSUsesItemFromMenu">YES</bool>
-                                                                                                       <bool key="NSAltersState">YES</bool>
-                                                                                                       <int key="NSArrowPosition">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSSlider" id="861218370">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{658, 217}, {26, 31}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSSliderCell" key="NSCell" id="212633849">
-                                                                                                       <int key="NSCellFlags">-2079981824</int>
-                                                                                                       <int key="NSCellFlags2">131072</int>
-                                                                                                       <string key="NSContents"/>
-                                                                                                       <reference key="NSSupport" ref="26"/>
-                                                                                                       <reference key="NSControlView" ref="861218370"/>
-                                                                                                       <double key="NSMaxValue">4.000000e+00</double>
-                                                                                                       <double key="NSMinValue">0.000000e+00</double>
-                                                                                                       <double key="NSValue">0.000000e+00</double>
-                                                                                                       <double key="NSAltIncValue">0.000000e+00</double>
-                                                                                                       <int key="NSNumberOfTickMarks">16</int>
-                                                                                                       <int key="NSTickMarkPosition">0</int>
-                                                                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
-                                                                                                       <bool key="NSVertical">NO</bool>
-                                                                                                       <int key="NSSliderType">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSSlider" id="695663835">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{658, 187}, {26, 31}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSSliderCell" key="NSCell" id="198981160">
-                                                                                                       <int key="NSCellFlags">-2079981824</int>
-                                                                                                       <int key="NSCellFlags2">131072</int>
-                                                                                                       <string key="NSContents"/>
-                                                                                                       <object class="NSFont" key="NSSupport" id="478239882">
-                                                                                                               <string key="NSName">Helvetica</string>
-                                                                                                               <double key="NSSize">1.200000e+01</double>
-                                                                                                               <int key="NSfFlags">16</int>
-                                                                                                       </object>
-                                                                                                       <reference key="NSControlView" ref="695663835"/>
-                                                                                                       <double key="NSMaxValue">4.000000e+00</double>
-                                                                                                       <double key="NSMinValue">0.000000e+00</double>
-                                                                                                       <double key="NSValue">0.000000e+00</double>
-                                                                                                       <double key="NSAltIncValue">0.000000e+00</double>
-                                                                                                       <int key="NSNumberOfTickMarks">16</int>
-                                                                                                       <int key="NSTickMarkPosition">0</int>
-                                                                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
-                                                                                                       <bool key="NSVertical">NO</bool>
-                                                                                                       <int key="NSSliderType">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSSlider" id="229696812">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{658, 158}, {26, 31}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSSliderCell" key="NSCell" id="805488070">
-                                                                                                       <int key="NSCellFlags">-2079981824</int>
-                                                                                                       <int key="NSCellFlags2">131072</int>
-                                                                                                       <string key="NSContents"/>
-                                                                                                       <reference key="NSSupport" ref="478239882"/>
-                                                                                                       <reference key="NSControlView" ref="229696812"/>
-                                                                                                       <double key="NSMaxValue">4.000000e+00</double>
-                                                                                                       <double key="NSMinValue">0.000000e+00</double>
-                                                                                                       <double key="NSValue">0.000000e+00</double>
-                                                                                                       <double key="NSAltIncValue">0.000000e+00</double>
-                                                                                                       <int key="NSNumberOfTickMarks">16</int>
-                                                                                                       <int key="NSTickMarkPosition">0</int>
-                                                                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
-                                                                                                       <bool key="NSVertical">NO</bool>
-                                                                                                       <int key="NSSliderType">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSSlider" id="927860050">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{658, 128}, {26, 31}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSSliderCell" key="NSCell" id="1037957700">
-                                                                                                       <int key="NSCellFlags">-2079981824</int>
-                                                                                                       <int key="NSCellFlags2">131072</int>
-                                                                                                       <string key="NSContents"/>
-                                                                                                       <reference key="NSSupport" ref="478239882"/>
-                                                                                                       <reference key="NSControlView" ref="927860050"/>
-                                                                                                       <double key="NSMaxValue">4.000000e+00</double>
-                                                                                                       <double key="NSMinValue">0.000000e+00</double>
-                                                                                                       <double key="NSValue">0.000000e+00</double>
-                                                                                                       <double key="NSAltIncValue">0.000000e+00</double>
-                                                                                                       <int key="NSNumberOfTickMarks">16</int>
-                                                                                                       <int key="NSTickMarkPosition">0</int>
-                                                                                                       <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
-                                                                                                       <bool key="NSVertical">NO</bool>
-                                                                                                       <int key="NSSliderType">1</int>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="169748081">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{651, 249}, {40, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="366629849">
-                                                                                                       <int key="NSCellFlags">67239424</int>
-                                                                                                       <int key="NSCellFlags2">138674176</int>
-                                                                                                       <string key="NSContents">DRC</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="169748081"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="532012054">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{685, 227}, {26, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="750019806">
-                                                                                                       <int key="NSCellFlags">67239488</int>
-                                                                                                       <int key="NSCellFlags2">272892928</int>
-                                                                                                       <string key="NSContents">1.0</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="532012054"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="850861055">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{685, 197}, {26, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="539528192">
-                                                                                                       <int key="NSCellFlags">67239488</int>
-                                                                                                       <int key="NSCellFlags2">272892928</int>
-                                                                                                       <string key="NSContents">1.0</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="850861055"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="988102670">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{686, 168}, {26, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="477201006">
-                                                                                                       <int key="NSCellFlags">67239488</int>
-                                                                                                       <int key="NSCellFlags2">272892928</int>
-                                                                                                       <string key="NSContents">1.0</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="988102670"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                                       <object class="NSTextField" id="758473796">
-                                                                                               <reference key="NSNextResponder" ref="738554558"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <string key="NSFrame">{{685, 140}, {26, 11}}</string>
-                                                                                               <reference key="NSSuperview" ref="738554558"/>
-                                                                                               <bool key="NSEnabled">YES</bool>
-                                                                                               <object class="NSTextFieldCell" key="NSCell" id="941741345">
-                                                                                                       <int key="NSCellFlags">67239488</int>
-                                                                                                       <int key="NSCellFlags2">272892928</int>
-                                                                                                       <string key="NSContents">1.0</string>
-                                                                                                       <reference key="NSSupport" ref="22"/>
-                                                                                                       <reference key="NSControlView" ref="758473796"/>
-                                                                                                       <reference key="NSBackgroundColor" ref="242973447"/>
-                                                                                                       <reference key="NSTextColor" ref="701609070"/>
-                                                                                               </object>
-                                                                                       </object>
-                                                                               </object>
-                                                                               <string key="NSFrame">{{10, 25}, {714, 305}}</string>
-                                                                               <reference key="NSNextKeyView" ref="198352083"/>
-                                                                       </object>
-                                                                       <string key="NSLabel">Audio</string>
-                                                                       <reference key="NSColor" ref="242973447"/>
-                                                                       <reference key="NSTabView" ref="712502892"/>
-                                                               </object>
-                                                               <object class="NSTabViewItem" id="799016137">
-                                                                       <string key="NSIdentifier">3</string>
-                                                                       <object class="NSView" key="NSView" id="756255803">
-                                                                               <reference key="NSNextResponder" ref="712502892"/>
-                                                                               <int key="NSvFlags">256</int>
-                                                                               <object class="NSMutableArray" key="NSSubviews">
-                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                       <object class="NSScrollView" id="596256174">
-                                                                                               <reference key="NSNextResponder" ref="756255803"/>
-                                                                                               <int key="NSvFlags">268</int>
-                                                                                               <object class="NSMutableArray" key="NSSubviews">
-                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                       <object class="NSClipView" id="705918581">
-                                                                                                               <reference key="NSNextResponder" ref="596256174"/>
-                                                                                                               <int key="NSvFlags">2304</int>
-                                                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                               <object class="NSMutableArray" key="NSSubviews">
+                                                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                       <object class="NSClipView" id="705918581">
+                                                                                                               <reference key="NSNextResponder" ref="596256174"/>
+                                                                                                               <int key="NSvFlags">2304</int>
+                                                                                                               <object class="NSMutableArray" key="NSSubviews">
                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                        <object class="NSTableView" id="587237088">
                                                                                                                                <reference key="NSNextResponder" ref="705918581"/>
                                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                        <object class="NSTableColumn" id="274341565">
                                                                                                                                                <string key="NSIdentifier">track</string>
-                                                                                                                                               <double key="NSWidth">1.670000e+02</double>
-                                                                                                                                               <double key="NSMinWidth">4.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">1.000000e+03</double>
+                                                                                                                                               <double key="NSWidth">167</double>
+                                                                                                                                               <double key="NSMinWidth">40</double>
+                                                                                                                                               <double key="NSMaxWidth">1000</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                                                <int key="NSColorSpace">3</int>
                                                                                                                                                                <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
                                                                                                                                                        </object>
-                                                                                                                                                       <object class="NSColor" key="NSTextColor" id="188451177">
-                                                                                                                                                               <int key="NSColorSpace">6</int>
-                                                                                                                                                               <string key="NSCatalogName">System</string>
-                                                                                                                                                               <string key="NSColorName">headerTextColor</string>
-                                                                                                                                                               <reference key="NSColor" ref="544409939"/>
-                                                                                                                                                       </object>
+                                                                                                                                                       <reference key="NSTextColor" ref="188451177"/>
                                                                                                                                                </object>
                                                                                                                                                <object class="NSPopUpButtonCell" key="NSDataCell" id="426946554">
                                                                                                                                                        <int key="NSCellFlags">-2076049856</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="1033748386">
                                                                                                                                                <string key="NSIdentifier">forced</string>
-                                                                                                                                               <double key="NSWidth">7.500000e+01</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">75</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">134219776</int>
                                                                                                                                                        <string key="NSContents">Forced Only</string>
                                                                                                                                                        <reference key="NSSupport" ref="26"/>
-                                                                                                                                                       <object class="NSColor" key="NSBackgroundColor" id="1045207104">
-                                                                                                                                                               <int key="NSColorSpace">6</int>
-                                                                                                                                                               <string key="NSCatalogName">System</string>
-                                                                                                                                                               <string key="NSColorName">headerColor</string>
-                                                                                                                                                               <reference key="NSColor" ref="809784795"/>
-                                                                                                                                                       </object>
+                                                                                                                                                       <reference key="NSBackgroundColor" ref="1045207104"/>
                                                                                                                                                        <reference key="NSTextColor" ref="188451177"/>
                                                                                                                                                </object>
                                                                                                                                                <object class="NSButtonCell" key="NSDataCell" id="13236417">
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="362209136">
                                                                                                                                                <string key="NSIdentifier">burned</string>
-                                                                                                                                               <double key="NSWidth">6.500000e+01</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">65</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">134219776</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="270619684">
                                                                                                                                                <string key="NSIdentifier">default</string>
-                                                                                                                                               <double key="NSWidth">5.400000e+01</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">54</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">134219776</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="116912874">
                                                                                                                                                <string key="NSIdentifier">srt_lang</string>
-                                                                                                                                               <double key="NSWidth">1.120000e+02</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">112</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="180322215">
                                                                                                                                                <string key="NSIdentifier">srt_charcode</string>
-                                                                                                                                               <double key="NSWidth">1.230000e+02</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">123</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="526590234">
                                                                                                                                                <string key="NSIdentifier">srt_offset</string>
-                                                                                                                                               <double key="NSWidth">6.100000e+01</double>
-                                                                                                                                               <double key="NSMinWidth">1.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">3.402823e+38</double>
+                                                                                                                                               <double key="NSWidth">61</double>
+                                                                                                                                               <double key="NSMinWidth">10</double>
+                                                                                                                                               <double key="NSMaxWidth">3.4028229999999999e+38</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                                <reference key="NSTableView" ref="587237088"/>
                                                                                                                                        </object>
                                                                                                                                </object>
-                                                                                                                               <double key="NSIntercellSpacingWidth">3.000000e+00</double>
-                                                                                                                               <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+                                                                                                                               <double key="NSIntercellSpacingWidth">3</double>
+                                                                                                                               <double key="NSIntercellSpacingHeight">2</double>
                                                                                                                                <reference key="NSBackgroundColor" ref="809784795"/>
-                                                                                                                               <object class="NSColor" key="NSGridColor" id="156710040">
-                                                                                                                                       <int key="NSColorSpace">6</int>
-                                                                                                                                       <string key="NSCatalogName">System</string>
-                                                                                                                                       <string key="NSColorName">gridColor</string>
-                                                                                                                                       <object class="NSColor" key="NSColor">
-                                                                                                                                               <int key="NSColorSpace">3</int>
-                                                                                                                                               <bytes key="NSWhite">MC41AA</bytes>
-                                                                                                                                       </object>
-                                                                                                                               </object>
-                                                                                                                               <double key="NSRowHeight">1.700000e+01</double>
+                                                                                                                               <reference key="NSGridColor" ref="156710040"/>
+                                                                                                                               <double key="NSRowHeight">17</double>
                                                                                                                                <int key="NSTvFlags">1379926016</int>
+                                                                                                                               <reference key="NSDelegate"/>
+                                                                                                                               <reference key="NSDataSource"/>
                                                                                                                                <int key="NSColumnAutoresizingStyle">4</int>
                                                                                                                                <int key="NSDraggingSourceMaskForLocal">15</int>
                                                                                                                                <int key="NSDraggingSourceMaskForNonLocal">0</int>
                                                                                                                                <bool key="NSAllowsTypeSelect">NO</bool>
+                                                                                                                               <int key="NSTableViewDraggingDestinationStyle">0</int>
                                                                                                                        </object>
                                                                                                                </object>
                                                                                                                <string key="NSFrame">{{1, 17}, {678, 241}}</string>
                                                                                                                <reference key="NSSuperview" ref="596256174"/>
                                                                                                                <reference key="NSNextKeyView" ref="587237088"/>
                                                                                                                <reference key="NSDocView" ref="587237088"/>
-                                                                                                               <object class="NSColor" key="NSBGColor" id="355843302">
-                                                                                                                       <int key="NSColorSpace">6</int>
-                                                                                                                       <string key="NSCatalogName">System</string>
-                                                                                                                       <string key="NSColorName">controlBackgroundColor</string>
-                                                                                                                       <reference key="NSColor" ref="458742033"/>
-                                                                                                               </object>
+                                                                                                               <reference key="NSBGColor" ref="355843302"/>
                                                                                                                <int key="NScvFlags">4</int>
                                                                                                        </object>
                                                                                                        <object class="NSScroller" id="40751315">
                                                                                                                <reference key="NSSuperview" ref="596256174"/>
                                                                                                                <reference key="NSTarget" ref="596256174"/>
                                                                                                                <string key="NSAction">_doScroller:</string>
-                                                                                                               <double key="NSCurValue">3.700000e+01</double>
-                                                                                                               <double key="NSPercent">1.947368e-01</double>
+                                                                                                               <double key="NSCurValue">37</double>
+                                                                                                               <double key="NSPercent">0.19473679999999999</double>
                                                                                                        </object>
                                                                                                        <object class="NSScroller" id="892147391">
                                                                                                                <reference key="NSNextResponder" ref="596256174"/>
                                                                                                                <int key="NSsFlags">1</int>
                                                                                                                <reference key="NSTarget" ref="596256174"/>
                                                                                                                <string key="NSAction">_doScroller:</string>
-                                                                                                               <double key="NSPercent">5.714286e-01</double>
+                                                                                                               <double key="NSPercent">0.57142859999999995</double>
                                                                                                        </object>
                                                                                                        <object class="NSClipView" id="139191276">
                                                                                                                <reference key="NSNextResponder" ref="596256174"/>
                                                                                                <string key="NSFrame">{{17, 17}, {680, 259}}</string>
                                                                                                <reference key="NSSuperview" ref="756255803"/>
                                                                                                <reference key="NSNextKeyView" ref="705918581"/>
-                                                                                               <int key="NSsFlags">514</int>
+                                                                                               <int key="NSsFlags">530</int>
                                                                                                <reference key="NSVScroller" ref="40751315"/>
                                                                                                <reference key="NSHScroller" ref="892147391"/>
                                                                                                <reference key="NSContentView" ref="705918581"/>
                                                                                        </object>
                                                                                </object>
                                                                                <string key="NSFrame">{{10, 25}, {714, 305}}</string>
-                                                                               <reference key="NSSuperview" ref="712502892"/>
                                                                        </object>
                                                                        <string key="NSLabel">Subtitles</string>
                                                                        <reference key="NSColor" ref="242973447"/>
                                                                                                                        <object class="NSTableView" id="595654978">
                                                                                                                                <reference key="NSNextResponder" ref="272816362"/>
                                                                                                                                <int key="NSvFlags">256</int>
-                                                                                                                               <string key="NSFrameSize">{663, 233}</string>
+                                                                                                                               <string key="NSFrameSize">{663, 242}</string>
                                                                                                                                <reference key="NSSuperview" ref="272816362"/>
                                                                                                                                <reference key="NSNextKeyView" ref="1033243513"/>
                                                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                        <object class="NSTableColumn" id="77208310">
                                                                                                                                                <string key="NSIdentifier">1</string>
-                                                                                                                                               <double key="NSWidth">5.100000e+01</double>
-                                                                                                                                               <double key="NSMinWidth">4.000000e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">1.000000e+03</double>
+                                                                                                                                               <double key="NSWidth">51</double>
+                                                                                                                                               <double key="NSMinWidth">40</double>
+                                                                                                                                               <double key="NSMaxWidth">1000</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                        </object>
                                                                                                                                        <object class="NSTableColumn" id="932392163">
                                                                                                                                                <string key="NSIdentifier">2</string>
-                                                                                                                                               <double key="NSWidth">6.060000e+02</double>
-                                                                                                                                               <double key="NSMinWidth">7.721729e+01</double>
-                                                                                                                                               <double key="NSMaxWidth">1.000000e+03</double>
+                                                                                                                                               <double key="NSWidth">606</double>
+                                                                                                                                               <double key="NSMinWidth">77.217290000000006</double>
+                                                                                                                                               <double key="NSMaxWidth">1000</double>
                                                                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                                                                <reference key="NSTableView" ref="595654978"/>
                                                                                                                                        </object>
                                                                                                                                </object>
-                                                                                                                               <double key="NSIntercellSpacingWidth">3.000000e+00</double>
-                                                                                                                               <double key="NSIntercellSpacingHeight">2.000000e+00</double>
-                                                                                                                               <reference key="NSBackgroundColor" ref="809784795"/>
+                                                                                                                               <double key="NSIntercellSpacingWidth">3</double>
+                                                                                                                               <double key="NSIntercellSpacingHeight">2</double>
+                                                                                                                               <reference key="NSBackgroundColor" ref="355843302"/>
                                                                                                                                <reference key="NSGridColor" ref="156710040"/>
-                                                                                                                               <double key="NSRowHeight">1.700000e+01</double>
+                                                                                                                               <double key="NSRowHeight">17</double>
                                                                                                                                <int key="NSTvFlags">-700448768</int>
+                                                                                                                               <reference key="NSDelegate"/>
+                                                                                                                               <reference key="NSDataSource"/>
                                                                                                                                <int key="NSColumnAutoresizingStyle">4</int>
                                                                                                                                <int key="NSDraggingSourceMaskForLocal">15</int>
                                                                                                                                <int key="NSDraggingSourceMaskForNonLocal">0</int>
                                                                                                                                <bool key="NSAllowsTypeSelect">YES</bool>
+                                                                                                                               <int key="NSTableViewDraggingDestinationStyle">0</int>
                                                                                                                        </object>
                                                                                                                </object>
-                                                                                                               <string key="NSFrame">{{1, 17}, {663, 233}}</string>
+                                                                                                               <string key="NSFrame">{{1, 17}, {663, 242}}</string>
                                                                                                                <reference key="NSSuperview" ref="307620967"/>
                                                                                                                <reference key="NSNextKeyView" ref="595654978"/>
                                                                                                                <reference key="NSDocView" ref="595654978"/>
                                                                                                        <object class="NSScroller" id="1046880533">
                                                                                                                <reference key="NSNextResponder" ref="307620967"/>
                                                                                                                <int key="NSvFlags">256</int>
-                                                                                                               <string key="NSFrame">{{664, 17}, {15, 233}}</string>
+                                                                                                               <string key="NSFrame">{{664, 17}, {15, 242}}</string>
                                                                                                                <reference key="NSSuperview" ref="307620967"/>
                                                                                                                <reference key="NSNextKeyView" ref="712502892"/>
                                                                                                                <reference key="NSTarget" ref="307620967"/>
                                                                                                                <string key="NSAction">_doScroller:</string>
-                                                                                                               <double key="NSPercent">9.736842e-01</double>
+                                                                                                               <double key="NSPercent">0.9736842</double>
                                                                                                        </object>
                                                                                                        <object class="NSScroller" id="1033243513">
                                                                                                                <reference key="NSNextResponder" ref="307620967"/>
                                                                                                                <int key="NSsFlags">1</int>
                                                                                                                <reference key="NSTarget" ref="307620967"/>
                                                                                                                <string key="NSAction">_doScroller:</string>
-                                                                                                               <double key="NSPercent">9.904762e-01</double>
+                                                                                                               <double key="NSPercent">0.99047620000000003</double>
                                                                                                        </object>
                                                                                                        <object class="NSClipView" id="814110287">
                                                                                                                <reference key="NSNextResponder" ref="307620967"/>
                                                                                                        </object>
                                                                                                        <reference ref="393843623"/>
                                                                                                </object>
-                                                                                               <string key="NSFrame">{{17, 17}, {680, 251}}</string>
+                                                                                               <string key="NSFrame">{{17, 17}, {680, 260}}</string>
                                                                                                <reference key="NSSuperview" ref="440990725"/>
                                                                                                <reference key="NSNextKeyView" ref="272816362"/>
                                                                                                <int key="NSsFlags">18</int>
                                                                                        <object class="NSButton" id="262106913">
                                                                                                <reference key="NSNextResponder" ref="440990725"/>
                                                                                                <int key="NSvFlags">256</int>
-                                                                                               <string key="NSFrame">{{14, 274}, {151, 16}}</string>
+                                                                                               <string key="NSFrame">{{14, 283}, {151, 16}}</string>
                                                                                                <reference key="NSSuperview" ref="440990725"/>
                                                                                                <reference key="NSNextKeyView" ref="307620967"/>
                                                                                                <bool key="NSEnabled">YES</bool>
                                                                                                        <int key="NSPeriodicInterval">25</int>
                                                                                                </object>
                                                                                        </object>
+                                                                                       <object class="NSButton" id="959722284">
+                                                                                               <reference key="NSNextResponder" ref="440990725"/>
+                                                                                               <int key="NSvFlags">268</int>
+                                                                                               <string key="NSFrame">{{472, 283}, {107, 16}}</string>
+                                                                                               <reference key="NSSuperview" ref="440990725"/>
+                                                                                               <bool key="NSEnabled">YES</bool>
+                                                                                               <object class="NSButtonCell" key="NSCell" id="100898939">
+                                                                                                       <int key="NSCellFlags">67239424</int>
+                                                                                                       <int key="NSCellFlags2">134479872</int>
+                                                                                                       <string key="NSContents">Import Chapters ...</string>
+                                                                                                       <reference key="NSSupport" ref="22"/>
+                                                                                                       <reference key="NSControlView" ref="959722284"/>
+                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                       <int key="NSPeriodicDelay">200</int>
+                                                                                                       <int key="NSPeriodicInterval">25</int>
+                                                                                               </object>
+                                                                                       </object>
+                                                                                       <object class="NSButton" id="931485910">
+                                                                                               <reference key="NSNextResponder" ref="440990725"/>
+                                                                                               <int key="NSvFlags">268</int>
+                                                                                               <string key="NSFrame">{{592, 283}, {106, 16}}</string>
+                                                                                               <reference key="NSSuperview" ref="440990725"/>
+                                                                                               <bool key="NSEnabled">YES</bool>
+                                                                                               <object class="NSButtonCell" key="NSCell" id="843416672">
+                                                                                                       <int key="NSCellFlags">67239424</int>
+                                                                                                       <int key="NSCellFlags2">134479872</int>
+                                                                                                       <string key="NSContents">Export Chapters ...</string>
+                                                                                                       <reference key="NSSupport" ref="22"/>
+                                                                                                       <reference key="NSControlView" ref="931485910"/>
+                                                                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                                                                       <int key="NSButtonFlags2">129</int>
+                                                                                                       <string key="NSAlternateContents"/>
+                                                                                                       <string key="NSKeyEquivalent"/>
+                                                                                                       <int key="NSPeriodicDelay">200</int>
+                                                                                                       <int key="NSPeriodicInterval">25</int>
+                                                                                               </object>
+                                                                                       </object>
                                                                                </object>
                                                                                <string key="NSFrame">{{10, 25}, {714, 305}}</string>
                                                                                <reference key="NSNextKeyView" ref="262106913"/>
                                                                        <reference key="NSTabView" ref="712502892"/>
                                                                </object>
                                                        </object>
-                                                       <reference key="NSSelectedTabViewItem" ref="799016137"/>
+                                                       <reference key="NSSelectedTabViewItem" ref="107038816"/>
                                                        <reference key="NSFont" ref="26"/>
                                                        <int key="NSTvFlags">134217728</int>
                                                        <bool key="NSAllowTruncatedLabels">YES</bool>
                                                        <bool key="NSDrawsBackground">YES</bool>
                                                        <object class="NSMutableArray" key="NSSubviews">
                                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                                               <reference ref="756255803"/>
+                                                               <reference ref="1053078401"/>
                                                        </object>
                                                </object>
                                                <object class="NSTextField" id="586321835">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{20, 522}, {45, 14}}</string>
+                                                       <string key="NSFrame">{{20, 528}, {45, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="121574898">
                                                                <string key="NSContents">Source:</string>
                                                                <object class="NSFont" key="NSSupport" id="27">
                                                                        <string key="NSName">LucidaGrande-Bold</string>
-                                                                       <double key="NSSize">1.100000e+01</double>
+                                                                       <double key="NSSize">11</double>
                                                                        <int key="NSfFlags">3357</int>
                                                                </object>
                                                                <reference key="NSControlView" ref="586321835"/>
                                                <object class="NSTextField" id="806469067">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{39, 495}, {35, 14}}</string>
+                                                       <string key="NSFrame">{{17, 499}, {35, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="177567437">
                                                <object class="NSPopUpButton" id="766125203">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{76, 490}, {165, 22}}</string>
+                                                       <string key="NSFrame">{{55, 499}, {193, 15}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSPopUpButtonCell" key="NSCell" id="821198683">
                                                                <int key="NSCellFlags">-2076049856</int>
-                                                               <int key="NSCellFlags2">132096</int>
-                                                               <reference key="NSSupport" ref="26"/>
+                                                               <int key="NSCellFlags2">263168</int>
+                                                               <reference key="NSSupport" ref="22"/>
                                                                <reference key="NSControlView" ref="766125203"/>
                                                                <int key="NSButtonFlags">109199615</int>
                                                                <int key="NSButtonFlags2">1</int>
-                                                               <reference key="NSAlternateImage" ref="26"/>
+                                                               <object class="NSFont" key="NSAlternateImage" id="1010451086">
+                                                                       <string key="NSName">LucidaGrande</string>
+                                                                       <double key="NSSize">9</double>
+                                                                       <int key="NSfFlags">16</int>
+                                                               </object>
                                                                <string key="NSAlternateContents"/>
                                                                <object class="NSMutableString" key="NSKeyEquivalent">
                                                                        <characters key="NS.bytes"/>
                                                                <int key="NSArrowPosition">1</int>
                                                        </object>
                                                </object>
-                                               <object class="NSTextField" id="1053010160">
-                                                       <reference key="NSNextResponder" ref="168918359"/>
-                                                       <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{346, 495}, {65, 14}}</string>
-                                                       <reference key="NSSuperview" ref="168918359"/>
-                                                       <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSTextFieldCell" key="NSCell" id="17369297">
-                                                               <int key="NSCellFlags">67239424</int>
-                                                               <int key="NSCellFlags2">71303168</int>
-                                                               <string key="NSContents">Chapters:</string>
-                                                               <reference key="NSSupport" ref="26"/>
-                                                               <reference key="NSControlView" ref="1053010160"/>
-                                                               <reference key="NSBackgroundColor" ref="242973447"/>
-                                                               <reference key="NSTextColor" ref="701609070"/>
-                                                       </object>
-                                               </object>
-                                               <object class="NSPopUpButton" id="971754180">
+                                               <object class="NSPopUpButton" id="482831442">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{413, 490}, {65, 22}}</string>
+                                                       <string key="NSFrame">{{347, 498}, {77, 15}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSPopUpButtonCell" key="NSCell" id="286887304">
+                                                       <object class="NSPopUpButtonCell" key="NSCell" id="266952854">
                                                                <int key="NSCellFlags">-2076049856</int>
-                                                               <int key="NSCellFlags2">132096</int>
-                                                               <reference key="NSSupport" ref="26"/>
-                                                               <reference key="NSControlView" ref="971754180"/>
+                                                               <int key="NSCellFlags2">263168</int>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="482831442"/>
                                                                <int key="NSButtonFlags">109199615</int>
                                                                <int key="NSButtonFlags2">1</int>
-                                                               <reference key="NSAlternateImage" ref="26"/>
+                                                               <reference key="NSAlternateImage" ref="1010451086"/>
                                                                <string key="NSAlternateContents"/>
                                                                <object class="NSMutableString" key="NSKeyEquivalent">
                                                                        <characters key="NS.bytes"/>
                                                                </object>
                                                                <int key="NSPeriodicDelay">400</int>
                                                                <int key="NSPeriodicInterval">75</int>
-                                                               <object class="NSMenuItem" key="NSMenuItem" id="170826719">
-                                                                       <reference key="NSMenu" ref="493845446"/>
-                                                                       <string key="NSTitle"/>
-                                                                       <string key="NSKeyEquiv"/>
-                                                                       <int key="NSKeyEquivModMask">1048576</int>
-                                                                       <int key="NSMnemonicLoc">2147483647</int>
-                                                                       <int key="NSState">1</int>
-                                                                       <reference key="NSOnImage" ref="447995298"/>
-                                                                       <reference key="NSMixedImage" ref="760317610"/>
-                                                                       <string key="NSAction">_popUpItemAction:</string>
-                                                                       <reference key="NSTarget" ref="286887304"/>
-                                                               </object>
+                                                               <nil key="NSMenuItem"/>
                                                                <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                               <object class="NSMenu" key="NSMenu" id="493845446">
+                                                               <object class="NSMenu" key="NSMenu" id="289100177">
                                                                        <object class="NSMutableString" key="NSTitle">
                                                                                <characters key="NS.bytes">OtherViews</characters>
                                                                        </object>
                                                                        <object class="NSMutableArray" key="NSMenuItems">
                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                               <reference ref="170826719"/>
                                                                        </object>
                                                                </object>
+                                                               <int key="NSSelectedIndex">-1</int>
                                                                <int key="NSPreferredEdge">3</int>
                                                                <bool key="NSUsesItemFromMenu">YES</bool>
                                                                <bool key="NSAltersState">YES</bool>
                                                <object class="NSTextField" id="303369850">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{241, 492}, {46, 17}}</string>
+                                                       <string key="NSFrame">{{249, 496}, {46, 17}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="677126774">
                                                <object class="NSPopUpButton" id="460320725">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{286, 490}, {57, 22}}</string>
+                                                       <string key="NSFrame">{{297, 498}, {41, 15}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSPopUpButtonCell" key="NSCell" id="567459641">
                                                                <int key="NSCellFlags">-2076049856</int>
-                                                               <int key="NSCellFlags2">132096</int>
-                                                               <reference key="NSSupport" ref="26"/>
+                                                               <int key="NSCellFlags2">263168</int>
+                                                               <reference key="NSSupport" ref="22"/>
                                                                <reference key="NSControlView" ref="460320725"/>
                                                                <int key="NSButtonFlags">109199615</int>
                                                                <int key="NSButtonFlags2">1</int>
-                                                               <reference key="NSAlternateImage" ref="26"/>
+                                                               <reference key="NSAlternateImage" ref="1010451086"/>
                                                                <string key="NSAlternateContents"/>
                                                                <object class="NSMutableString" key="NSKeyEquivalent">
                                                                        <characters key="NS.bytes"/>
                                                                <int key="NSArrowPosition">1</int>
                                                        </object>
                                                </object>
-                                               <object class="NSPopUpButton" id="453345136">
-                                                       <reference key="NSNextResponder" ref="168918359"/>
-                                                       <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{532, 490}, {65, 22}}</string>
-                                                       <reference key="NSSuperview" ref="168918359"/>
-                                                       <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSPopUpButtonCell" key="NSCell" id="564669343">
-                                                               <int key="NSCellFlags">-2076049856</int>
-                                                               <int key="NSCellFlags2">132096</int>
-                                                               <reference key="NSSupport" ref="26"/>
-                                                               <reference key="NSControlView" ref="453345136"/>
-                                                               <int key="NSButtonFlags">109199615</int>
-                                                               <int key="NSButtonFlags2">1</int>
-                                                               <reference key="NSAlternateImage" ref="26"/>
-                                                               <string key="NSAlternateContents"/>
-                                                               <object class="NSMutableString" key="NSKeyEquivalent">
-                                                                       <characters key="NS.bytes"/>
-                                                               </object>
-                                                               <int key="NSPeriodicDelay">400</int>
-                                                               <int key="NSPeriodicInterval">75</int>
-                                                               <object class="NSMenuItem" key="NSMenuItem" id="1048999115">
-                                                                       <reference key="NSMenu" ref="27255767"/>
-                                                                       <string key="NSTitle"/>
-                                                                       <string key="NSKeyEquiv"/>
-                                                                       <int key="NSKeyEquivModMask">1048576</int>
-                                                                       <int key="NSMnemonicLoc">2147483647</int>
-                                                                       <int key="NSState">1</int>
-                                                                       <reference key="NSOnImage" ref="447995298"/>
-                                                                       <reference key="NSMixedImage" ref="760317610"/>
-                                                                       <string key="NSAction">_popUpItemAction:</string>
-                                                                       <reference key="NSTarget" ref="564669343"/>
-                                                               </object>
-                                                               <bool key="NSMenuItemRespectAlignment">YES</bool>
-                                                               <object class="NSMenu" key="NSMenu" id="27255767">
-                                                                       <object class="NSMutableString" key="NSTitle">
-                                                                               <characters key="NS.bytes">OtherViews</characters>
-                                                                       </object>
-                                                                       <object class="NSMutableArray" key="NSMenuItems">
-                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                               <reference ref="1048999115"/>
-                                                                       </object>
-                                                               </object>
-                                                               <int key="NSPreferredEdge">3</int>
-                                                               <bool key="NSUsesItemFromMenu">YES</bool>
-                                                               <bool key="NSAltersState">YES</bool>
-                                                               <int key="NSArrowPosition">1</int>
-                                                       </object>
-                                               </object>
-                                               <object class="NSTextField" id="200266929">
-                                                       <reference key="NSNextResponder" ref="168918359"/>
-                                                       <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{479, 494}, {51, 15}}</string>
-                                                       <reference key="NSSuperview" ref="168918359"/>
-                                                       <bool key="NSEnabled">YES</bool>
-                                                       <object class="NSTextFieldCell" key="NSCell" id="904849236">
-                                                               <int key="NSCellFlags">67239424</int>
-                                                               <int key="NSCellFlags2">138412032</int>
-                                                               <string key="NSContents">through</string>
-                                                               <reference key="NSSupport" ref="26"/>
-                                                               <reference key="NSControlView" ref="200266929"/>
-                                                               <reference key="NSBackgroundColor" ref="242973447"/>
-                                                               <reference key="NSTextColor" ref="701609070"/>
-                                                       </object>
-                                               </object>
                                                <object class="NSTextField" id="1023408378">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{27, 437}, {47, 17}}</string>
+                                                       <string key="NSFrame">{{5, 442}, {47, 17}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="834340599">
                                                <object class="NSTextField" id="713493964">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{612, 496}, {57, 14}}</string>
+                                                       <string key="NSFrame">{{615, 499}, {57, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="1038625481">
                                                <object class="NSTextField" id="955053416">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{677, 496}, {63, 14}}</string>
+                                                       <string key="NSFrame">{{672, 499}, {79, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="362196160">
                                                                <int key="NSCellFlags">67239424</int>
-                                                               <int key="NSCellFlags2">71303168</int>
+                                                               <int key="NSCellFlags2">4194304</int>
                                                                <string key="NSContents"/>
                                                                <reference key="NSSupport" ref="26"/>
                                                                <reference key="NSControlView" ref="955053416"/>
                                                <object class="NSTextField" id="138115732">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{20, 467}, {70, 14}}</string>
+                                                       <string key="NSFrame">{{20, 474}, {70, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="510160694">
                                                <object class="NSPopUpButton" id="732193996">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{76, 380}, {177, 22}}</string>
+                                                       <string key="NSFrame">{{76, 386}, {177, 22}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSPopUpButtonCell" key="NSCell" id="264217237">
                                                <object class="NSButton" id="210289606">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{655, 433}, {90, 28}}</string>
+                                                       <string key="NSFrame">{{649, 438}, {90, 28}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSButtonCell" key="NSCell" id="295879492">
                                                                <int key="NSCellFlags">67239424</int>
                                                                <int key="NSCellFlags2">134348800</int>
-                                                               <string type="base64-UTF8" key="NSContents">QnJvd3Nl4oCmA</string>
+                                                               <string key="NSContents">Browse…</string>
                                                                <reference key="NSSupport" ref="26"/>
                                                                <reference key="NSControlView" ref="210289606"/>
                                                                <int key="NSButtonFlags">-2038284033</int>
                                                                <int key="NSButtonFlags2">1</int>
-                                                               <reference key="NSAlternateImage" ref="26"/>
+                                                               <reference key="NSAlternateImage" ref="995413175"/>
                                                                <string key="NSAlternateContents"/>
                                                                <object class="NSMutableString" key="NSKeyEquivalent">
                                                                        <characters key="NS.bytes"/>
                                                <object class="NSBox" id="10346684">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{98, 471}, {642, 5}}</string>
+                                                       <string key="NSFrame">{{98, 478}, {642, 5}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <string key="NSOffsets">{0, 0}</string>
                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                <object class="NSTextField" id="854767306">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{70, 522}, {204, 14}}</string>
+                                                       <string key="NSFrame">{{70, 528}, {204, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="689580100">
                                                <object class="NSTextField" id="186223550">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{79, 438}, {573, 19}}</string>
+                                                       <string key="NSFrame">{{56, 443}, {573, 19}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="988599137">
                                                                <reference key="NSTextColor" ref="378140636"/>
                                                        </object>
                                                </object>
+                                               <object class="NSTextField" id="104002862">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{435, 483}, {54, 16}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSTextFieldCell" key="NSCell" id="371961838">
+                                                               <int key="NSCellFlags">-1804468671</int>
+                                                               <int key="NSCellFlags2">71566336</int>
+                                                               <string key="NSContents"/>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="104002862"/>
+                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                       </object>
+                                               </object>
+                                               <object class="NSTextField" id="398989741">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{492, 483}, {54, 16}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSTextFieldCell" key="NSCell" id="506346481">
+                                                               <int key="NSCellFlags">-1804468671</int>
+                                                               <int key="NSCellFlags2">71566336</int>
+                                                               <string key="NSContents"/>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="398989741"/>
+                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                       </object>
+                                               </object>
+                                               <object class="NSTextField" id="19055068">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{550, 483}, {54, 16}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSTextFieldCell" key="NSCell" id="778187711">
+                                                               <int key="NSCellFlags">-1804468671</int>
+                                                               <int key="NSCellFlags2">4457472</int>
+                                                               <string key="NSContents"/>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="19055068"/>
+                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                       </object>
+                                               </object>
+                                               <object class="NSTextField" id="164276139">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{612, 483}, {54, 16}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSTextFieldCell" key="NSCell" id="1039518079">
+                                                               <int key="NSCellFlags">-1804468671</int>
+                                                               <int key="NSCellFlags2">4457472</int>
+                                                               <string key="NSContents"/>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="164276139"/>
+                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                       </object>
+                                               </object>
                                                <object class="NSTextField" id="35106907">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{20, 412}, {96, 14}}</string>
+                                                       <string key="NSFrame">{{20, 418}, {96, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="293028864">
                                                <object class="NSBox" id="151388399">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{294, 416}, {446, 5}}</string>
+                                                       <string key="NSFrame">{{294, 422}, {446, 5}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <string key="NSOffsets">{0, 0}</string>
                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                <object class="NSTextField" id="574185541">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{124, 412}, {162, 14}}</string>
+                                                       <string key="NSFrame">{{124, 418}, {162, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="488791842">
                                                <object class="NSTextField" id="1007421233">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{536, 8}, {201, 14}}</string>
+                                                       <string key="NSFrame">{{562, 13}, {181, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="224806210">
                                                                <int key="NSCellFlags">67239424</int>
-                                                               <int key="NSCellFlags2">71303168</int>
+                                                               <int key="NSCellFlags2">71434240</int>
                                                                <string key="NSContents"/>
                                                                <reference key="NSSupport" ref="26"/>
                                                                <reference key="NSControlView" ref="1007421233"/>
                                                <object class="NSTextField" id="87961628">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{21, 385}, {53, 14}}</string>
+                                                       <string key="NSFrame">{{21, 391}, {53, 14}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="51600927">
                                                <object class="NSBox" id="454206717">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{279, 525}, {461, 5}}</string>
+                                                       <string key="NSFrame">{{279, 531}, {461, 5}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <string key="NSOffsets">{0, 0}</string>
                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">-2147482356</int>
                                                        <object class="NSPSMatrix" key="NSDrawMatrix"/>
-                                                       <string key="NSFrame">{{278, 524}, {463, 12}}</string>
+                                                       <string key="NSFrame">{{278, 530}, {463, 12}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <int key="NSpiFlags">16648</int>
-                                                       <double key="NSMaxValue">1.000000e+02</double>
+                                                       <double key="NSMaxValue">100</double>
                                                </object>
                                                <object class="NSButton" id="581806074">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{399, 383}, {141, 18}}</string>
+                                                       <string key="NSFrame">{{399, 389}, {141, 18}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSButtonCell" key="NSCell" id="832863281">
                                                <object class="NSButton" id="553453876">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{283, 383}, {102, 18}}</string>
+                                                       <string key="NSFrame">{{283, 389}, {102, 18}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSButtonCell" key="NSCell" id="294332300">
                                                <object class="NSButton" id="921877174">
                                                        <reference key="NSNextResponder" ref="168918359"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{541, 383}, {141, 18}}</string>
+                                                       <string key="NSFrame">{{541, 389}, {141, 18}}</string>
                                                        <reference key="NSSuperview" ref="168918359"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSButtonCell" key="NSCell" id="547085070">
                                                                <int key="NSPeriodicInterval">25</int>
                                                        </object>
                                                </object>
+                                               <object class="NSTextField" id="978025076">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{491, 498}, {56, 15}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSTextFieldCell" key="NSCell" id="138681808">
+                                                               <int key="NSCellFlags">67239424</int>
+                                                               <int key="NSCellFlags2">138412032</int>
+                                                               <string key="NSContents">through</string>
+                                                               <reference key="NSSupport" ref="26"/>
+                                                               <reference key="NSControlView" ref="978025076"/>
+                                                               <reference key="NSBackgroundColor" ref="242973447"/>
+                                                               <reference key="NSTextColor" ref="701609070"/>
+                                                       </object>
+                                               </object>
+                                               <object class="NSPopUpButton" id="971754180">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{434, 498}, {57, 15}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSPopUpButtonCell" key="NSCell" id="286887304">
+                                                               <int key="NSCellFlags">-2076049856</int>
+                                                               <int key="NSCellFlags2">263168</int>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="971754180"/>
+                                                               <int key="NSButtonFlags">109199615</int>
+                                                               <int key="NSButtonFlags2">1</int>
+                                                               <reference key="NSAlternateImage" ref="1010451086"/>
+                                                               <string key="NSAlternateContents"/>
+                                                               <object class="NSMutableString" key="NSKeyEquivalent">
+                                                                       <characters key="NS.bytes"/>
+                                                               </object>
+                                                               <int key="NSPeriodicDelay">400</int>
+                                                               <int key="NSPeriodicInterval">75</int>
+                                                               <object class="NSMenuItem" key="NSMenuItem" id="170826719">
+                                                                       <reference key="NSMenu" ref="493845446"/>
+                                                                       <string key="NSTitle"/>
+                                                                       <string key="NSKeyEquiv"/>
+                                                                       <int key="NSKeyEquivModMask">1048576</int>
+                                                                       <int key="NSMnemonicLoc">2147483647</int>
+                                                                       <int key="NSState">1</int>
+                                                                       <reference key="NSOnImage" ref="447995298"/>
+                                                                       <reference key="NSMixedImage" ref="760317610"/>
+                                                                       <string key="NSAction">_popUpItemAction:</string>
+                                                                       <reference key="NSTarget" ref="286887304"/>
+                                                               </object>
+                                                               <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                               <object class="NSMenu" key="NSMenu" id="493845446">
+                                                                       <object class="NSMutableString" key="NSTitle">
+                                                                               <characters key="NS.bytes">OtherViews</characters>
+                                                                       </object>
+                                                                       <object class="NSMutableArray" key="NSMenuItems">
+                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                               <reference ref="170826719"/>
+                                                                       </object>
+                                                               </object>
+                                                               <int key="NSPreferredEdge">3</int>
+                                                               <bool key="NSUsesItemFromMenu">YES</bool>
+                                                               <bool key="NSAltersState">YES</bool>
+                                                               <int key="NSArrowPosition">1</int>
+                                                       </object>
+                                               </object>
+                                               <object class="NSPopUpButton" id="453345136">
+                                                       <reference key="NSNextResponder" ref="168918359"/>
+                                                       <int key="NSvFlags">264</int>
+                                                       <string key="NSFrame">{{549, 498}, {57, 15}}</string>
+                                                       <reference key="NSSuperview" ref="168918359"/>
+                                                       <bool key="NSEnabled">YES</bool>
+                                                       <object class="NSPopUpButtonCell" key="NSCell" id="564669343">
+                                                               <int key="NSCellFlags">-2076049856</int>
+                                                               <int key="NSCellFlags2">263168</int>
+                                                               <reference key="NSSupport" ref="22"/>
+                                                               <reference key="NSControlView" ref="453345136"/>
+                                                               <int key="NSButtonFlags">109199615</int>
+                                                               <int key="NSButtonFlags2">1</int>
+                                                               <reference key="NSAlternateImage" ref="1010451086"/>
+                                                               <string key="NSAlternateContents"/>
+                                                               <object class="NSMutableString" key="NSKeyEquivalent">
+                                                                       <characters key="NS.bytes"/>
+                                                               </object>
+                                                               <int key="NSPeriodicDelay">400</int>
+                                                               <int key="NSPeriodicInterval">75</int>
+                                                               <object class="NSMenuItem" key="NSMenuItem" id="1048999115">
+                                                                       <reference key="NSMenu" ref="27255767"/>
+                                                                       <string key="NSTitle"/>
+                                                                       <string key="NSKeyEquiv"/>
+                                                                       <int key="NSKeyEquivModMask">1048576</int>
+                                                                       <int key="NSMnemonicLoc">2147483647</int>
+                                                                       <int key="NSState">1</int>
+                                                                       <reference key="NSOnImage" ref="447995298"/>
+                                                                       <reference key="NSMixedImage" ref="760317610"/>
+                                                                       <string key="NSAction">_popUpItemAction:</string>
+                                                                       <reference key="NSTarget" ref="564669343"/>
+                                                               </object>
+                                                               <bool key="NSMenuItemRespectAlignment">YES</bool>
+                                                               <object class="NSMenu" key="NSMenu" id="27255767">
+                                                                       <object class="NSMutableString" key="NSTitle">
+                                                                               <characters key="NS.bytes">OtherViews</characters>
+                                                                       </object>
+                                                                       <object class="NSMutableArray" key="NSMenuItems">
+                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                               <reference ref="1048999115"/>
+                                                                       </object>
+                                                               </object>
+                                                               <int key="NSPreferredEdge">3</int>
+                                                               <bool key="NSUsesItemFromMenu">YES</bool>
+                                                               <bool key="NSAltersState">YES</bool>
+                                                               <int key="NSArrowPosition">1</int>
+                                                       </object>
+                                               </object>
                                        </object>
-                                       <string key="NSFrameSize">{760, 550}</string>
+                                       <string key="NSFrameSize">{754, 556}</string>
                                        <reference key="NSSuperview"/>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
                                <string key="NSMinSize">{213, 129}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                        </object>
                        <object class="NSMenu" id="840340181">
                                <string key="NSTitle">MainMenu</string>
                                                                </object>
                                                                <object class="NSMenuItem" id="985983659">
                                                                        <reference key="NSMenu" ref="1035150210"/>
-                                                                       <string type="base64-UTF8" key="NSTitle">Q2hlY2sgZm9yIFVwZGF0ZXPigKY</string>
+                                                                       <string key="NSTitle">Check for Updates…</string>
                                                                        <string key="NSKeyEquiv"/>
                                                                        <int key="NSKeyEquivModMask">1048576</int>
                                                                        <int key="NSMnemonicLoc">2147483647</int>
                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                <object class="NSMenuItem" id="595836714">
                                                                        <reference key="NSMenu" ref="567182830"/>
-                                                                       <string type="base64-UTF8" key="NSTitle">T3BlbiBTb3VyY2XigKY</string>
+                                                                       <string key="NSTitle">Open Source…</string>
                                                                        <string key="NSKeyEquiv">o</string>
                                                                        <int key="NSKeyEquivModMask">1048576</int>
                                                                        <int key="NSMnemonicLoc">2147483647</int>
                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                        <object class="NSMenuItem" id="49300518">
                                                                                                <reference key="NSMenu" ref="1067858879"/>
-                                                                                               <string type="base64-UTF8" key="NSTitle">RmluZOKApg</string>
+                                                                                               <string key="NSTitle">Find…</string>
                                                                                                <string key="NSKeyEquiv">f</string>
                                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                                <int key="NSMnemonicLoc">2147483647</int>
                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                        <object class="NSMenuItem" id="981624971">
                                                                                                <reference key="NSMenu" ref="650155643"/>
-                                                                                               <string type="base64-UTF8" key="NSTitle">U3BlbGxpbmfigKY</string>
+                                                                                               <string key="NSTitle">Spelling…</string>
                                                                                                <string key="NSKeyEquiv">:</string>
                                                                                                <int key="NSKeyEquivModMask">1048576</int>
                                                                                                <int key="NSMnemonicLoc">2147483647</int>
                                <object class="NSMutableString" key="NSViewClass">
                                        <characters key="NS.bytes">View</characters>
                                </object>
-                               <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSWindowContentMinSize">{213, 107}</string>
                                <object class="NSView" key="NSWindowView" id="168254512">
                                        <nil key="NSNextResponder"/>
                                                        <int key="NSvFlags">256</int>
                                                        <object class="NSMutableSet" key="NSDragTypes">
                                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                                               <object class="NSMutableArray" key="set.sortedObjects">
+                                                               <object class="NSArray" key="set.sortedObjects">
                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                        <string>Apple PDF pasteboard type</string>
                                                                        <string>Apple PICT pasteboard type</string>
                                                                <int key="NSButtonFlags2">1</int>
                                                                <object class="NSFont" key="NSAlternateImage">
                                                                        <string key="NSName">Helvetica</string>
-                                                                       <double key="NSSize">1.300000e+01</double>
+                                                                       <double key="NSSize">13</double>
                                                                        <int key="NSfFlags">16</int>
                                                                </object>
                                                                <string key="NSAlternateContents"/>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
                                <string key="NSMinSize">{213, 129}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                        </object>
                        <object class="NSDrawer" id="972647787">
                                <nil key="NSNextResponder"/>
                                <string key="NSMinContentSize">{100, 50}</string>
                                <string key="NSMaxContentSize">{280, 550}</string>
                                <int key="NSPreferredEdge">2</int>
-                               <double key="NSLeadingOffset">0.000000e+00</double>
-                               <double key="NSTrailingOffset">1.500000e+01</double>
+                               <double key="NSLeadingOffset">0.0</double>
+                               <double key="NSTrailingOffset">15</double>
                                <nil key="NSParentWindow"/>
                                <nil key="NSDelegate"/>
                        </object>
                                                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                        <object class="NSTableColumn" id="658438499">
                                                                                                <string key="NSIdentifier">PresetName</string>
-                                                                                               <double key="NSWidth">2.440000e+02</double>
-                                                                                               <double key="NSMinWidth">4.000000e+01</double>
-                                                                                               <double key="NSMaxWidth">1.000000e+03</double>
+                                                                                               <double key="NSWidth">244</double>
+                                                                                               <double key="NSMinWidth">40</double>
+                                                                                               <double key="NSMaxWidth">1000</double>
                                                                                                <object class="NSTableHeaderCell" key="NSHeaderCell">
                                                                                                        <int key="NSCellFlags">75628096</int>
                                                                                                        <int key="NSCellFlags2">2048</int>
                                                                                                </object>
                                                                                        </object>
                                                                                </object>
-                                                                               <double key="NSIntercellSpacingWidth">3.000000e+00</double>
-                                                                               <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+                                                                               <double key="NSIntercellSpacingWidth">3</double>
+                                                                               <double key="NSIntercellSpacingHeight">2</double>
                                                                                <reference key="NSBackgroundColor" ref="809784795"/>
                                                                                <reference key="NSGridColor" ref="156710040"/>
-                                                                               <double key="NSRowHeight">1.400000e+01</double>
+                                                                               <double key="NSRowHeight">14</double>
                                                                                <int key="NSTvFlags">314572800</int>
+                                                                               <reference key="NSDelegate"/>
+                                                                               <reference key="NSDataSource"/>
                                                                                <int key="NSColumnAutoresizingStyle">4</int>
                                                                                <int key="NSDraggingSourceMaskForLocal">15</int>
                                                                                <int key="NSDraggingSourceMaskForNonLocal">0</int>
                                                                                <bool key="NSAllowsTypeSelect">YES</bool>
-                                                                               <float key="NSOutlineViewIndentationPerLevelKey">1.200000e+01</float>
+                                                                               <int key="NSTableViewDraggingDestinationStyle">0</int>
+                                                                               <float key="NSOutlineViewIndentationPerLevelKey">12</float>
                                                                        </object>
                                                                </object>
                                                                <string key="NSFrame">{{1, 1}, {247, 506}}</string>
                                                                <int key="NSsFlags">256</int>
                                                                <reference key="NSTarget" ref="33643505"/>
                                                                <string key="NSAction">_doScroller:</string>
-                                                               <double key="NSPercent">9.977012e-01</double>
+                                                               <double key="NSPercent">0.99770119999999995</double>
                                                        </object>
                                                        <object class="NSScroller" id="573337548">
                                                                <reference key="NSNextResponder" ref="33643505"/>
                                                                <int key="NSsFlags">1</int>
                                                                <reference key="NSTarget" ref="33643505"/>
                                                                <string key="NSAction">_doScroller:</string>
-                                                               <double key="NSPercent">9.945652e-01</double>
+                                                               <double key="NSPercent">0.99456520000000004</double>
                                                        </object>
                                                </object>
                                                <string key="NSFrame">{{4, 31}, {260, 508}}</string>
                                                        <string key="NSContents"/>
                                                        <object class="NSFont" key="NSSupport" id="575851035">
                                                                <string key="NSName">LucidaGrande-Bold</string>
-                                                               <double key="NSSize">1.300000e+01</double>
+                                                               <double key="NSSize">13</double>
                                                                <int key="NSfFlags">2072</int>
                                                        </object>
                                                        <reference key="NSControlView" ref="241719587"/>
                                <object class="NSMutableString" key="NSViewClass">
                                        <characters key="NS.bytes">View</characters>
                                </object>
-                               <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSWindowContentMinSize">{338, 232}</string>
                                <object class="NSView" key="NSWindowView" id="69290042">
                                        <nil key="NSNextResponder"/>
                                                                <int key="NSButtonFlags2">1</int>
                                                                <object class="NSFont" key="NSAlternateImage" id="212993004">
                                                                        <string key="NSName">LucidaGrande</string>
-                                                                       <double key="NSSize">1.300000e+01</double>
+                                                                       <double key="NSSize">13</double>
                                                                        <int key="NSfFlags">16</int>
                                                                </object>
                                                                <string key="NSAlternateContents"/>
                                                <object class="NSPopUpButton" id="167356719">
                                                        <reference key="NSNextResponder" ref="69290042"/>
                                                        <int key="NSvFlags">266</int>
-                                                       <string key="NSFrame">{{166, 183}, {155, 22}}</string>
+                                                       <string key="NSFrame">{{128, 193}, {193, 22}}</string>
                                                        <reference key="NSSuperview" ref="69290042"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSPopUpButtonCell" key="NSCell" id="17688962">
                                                <object class="NSTextField" id="31472093">
                                                        <reference key="NSNextResponder" ref="69290042"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{17, 187}, {147, 14}}</string>
+                                                       <string key="NSFrame">{{27, 195}, {99, 14}}</string>
                                                        <reference key="NSSuperview" ref="69290042"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="31665321">
                                                <object class="NSButton" id="1024752086">
                                                        <reference key="NSNextResponder" ref="69290042"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{166, 157}, {24, 18}}</string>
+                                                       <string key="NSFrame">{{128, 142}, {24, 18}}</string>
                                                        <reference key="NSSuperview" ref="69290042"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSButtonCell" key="NSCell" id="625635488">
                                                <object class="NSBox" id="988499754">
                                                        <reference key="NSNextResponder" ref="69290042"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{20, 130}, {298, 5}}</string>
+                                                       <string key="NSFrame">{{12, 120}, {298, 5}}</string>
                                                        <reference key="NSSuperview" ref="69290042"/>
                                                        <string key="NSOffsets">{0, 0}</string>
                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                <object class="NSTextField" id="59653352">
                                                        <reference key="NSNextResponder" ref="69290042"/>
                                                        <int key="NSvFlags">268</int>
-                                                       <string key="NSFrame">{{17, 159}, {147, 15}}</string>
+                                                       <string key="NSFrame">{{17, 144}, {109, 15}}</string>
                                                        <reference key="NSSuperview" ref="69290042"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="155469085">
                                                                <int key="NSCellFlags">67239424</int>
                                                                <int key="NSCellFlags2">71434240</int>
-                                                               <string key="NSContents">Use Current Picture Filters:</string>
+                                                               <string key="NSContents">Use Picture Filters:</string>
                                                                <reference key="NSSupport" ref="26"/>
                                                                <reference key="NSControlView" ref="59653352"/>
                                                                <reference key="NSBackgroundColor" ref="242973447"/>
                                                                <reference key="NSTextColor" ref="701609070"/>
                                                        </object>
                                                </object>
+                                               <object class="NSBox" id="277759901">
+                                                       <reference key="NSNextResponder" ref="69290042"/>
+                                                       <int key="NSvFlags">12</int>
+                                                       <object class="NSMutableArray" key="NSSubviews">
+                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                               <object class="NSView" id="956968044">
+                                                                       <reference key="NSNextResponder" ref="277759901"/>
+                                                                       <int key="NSvFlags">256</int>
+                                                                       <object class="NSMutableArray" key="NSSubviews">
+                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                               <object class="NSTextField" id="522324466">
+                                                                                       <reference key="NSNextResponder" ref="956968044"/>
+                                                                                       <int key="NSvFlags">266</int>
+                                                                                       <string key="NSFrame">{{11, 10}, {52, 16}}</string>
+                                                                                       <reference key="NSSuperview" ref="956968044"/>
+                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                       <object class="NSTextFieldCell" key="NSCell" id="862361869">
+                                                                                               <int key="NSCellFlags">-1804468671</int>
+                                                                                               <int key="NSCellFlags2">71566336</int>
+                                                                                               <string key="NSContents"/>
+                                                                                               <reference key="NSSupport" ref="22"/>
+                                                                                               <reference key="NSControlView" ref="522324466"/>
+                                                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                                                       </object>
+                                                                               </object>
+                                                                               <object class="NSTextField" id="358179065">
+                                                                                       <reference key="NSNextResponder" ref="956968044"/>
+                                                                                       <int key="NSvFlags">268</int>
+                                                                                       <string key="NSFrame">{{61, 10}, {29, 15}}</string>
+                                                                                       <reference key="NSSuperview" ref="956968044"/>
+                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                       <object class="NSTextFieldCell" key="NSCell" id="14541127">
+                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                               <int key="NSCellFlags2">138543104</int>
+                                                                                               <string key="NSContents">X</string>
+                                                                                               <reference key="NSSupport" ref="26"/>
+                                                                                               <reference key="NSControlView" ref="358179065"/>
+                                                                                               <reference key="NSBackgroundColor" ref="242973447"/>
+                                                                                               <reference key="NSTextColor" ref="701609070"/>
+                                                                                       </object>
+                                                                               </object>
+                                                                               <object class="NSTextField" id="525081109">
+                                                                                       <reference key="NSNextResponder" ref="956968044"/>
+                                                                                       <int key="NSvFlags">266</int>
+                                                                                       <string key="NSFrame">{{90, 10}, {52, 16}}</string>
+                                                                                       <reference key="NSSuperview" ref="956968044"/>
+                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                       <object class="NSTextFieldCell" key="NSCell" id="945554305">
+                                                                                               <int key="NSCellFlags">-1804468671</int>
+                                                                                               <int key="NSCellFlags2">4457472</int>
+                                                                                               <string key="NSContents"/>
+                                                                                               <reference key="NSSupport" ref="22"/>
+                                                                                               <reference key="NSControlView" ref="525081109"/>
+                                                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                                                               <reference key="NSTextColor" ref="378140636"/>
+                                                                                       </object>
+                                                                               </object>
+                                                                       </object>
+                                                                       <string key="NSFrameSize">{155, 32}</string>
+                                                                       <reference key="NSSuperview" ref="277759901"/>
+                                                               </object>
+                                                       </object>
+                                                       <string key="NSFrame">{{128, 163}, {155, 32}}</string>
+                                                       <reference key="NSSuperview" ref="69290042"/>
+                                                       <string key="NSOffsets">{0, 0}</string>
+                                                       <object class="NSTextFieldCell" key="NSTitleCell">
+                                                               <int key="NSCellFlags">67239424</int>
+                                                               <int key="NSCellFlags2">0</int>
+                                                               <string key="NSContents">Box</string>
+                                                               <reference key="NSSupport" ref="26"/>
+                                                               <reference key="NSBackgroundColor" ref="138233214"/>
+                                                               <object class="NSColor" key="NSTextColor">
+                                                                       <int key="NSColorSpace">3</int>
+                                                                       <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes>
+                                                               </object>
+                                                       </object>
+                                                       <reference key="NSContentView" ref="956968044"/>
+                                                       <int key="NSBorderType">0</int>
+                                                       <int key="NSBoxType">0</int>
+                                                       <int key="NSTitlePosition">0</int>
+                                                       <bool key="NSTransparent">NO</bool>
+                                               </object>
                                        </object>
                                        <string key="NSFrameSize">{338, 318}</string>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
                                <string key="NSMinSize">{338, 254}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                        </object>
                        <object class="NSWindowTemplate" id="687953568">
                                <int key="NSWindowStyleMask">1</int>
                                <object class="NSMutableString" key="NSViewClass">
                                        <characters key="NS.bytes">View</characters>
                                </object>
-                               <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSWindowContentMinSize">{213, 107}</string>
                                <object class="NSView" key="NSWindowView" id="867624722">
                                        <nil key="NSNextResponder"/>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
                                <string key="NSMinSize">{213, 129}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                        </object>
                        <object class="NSCustomObject" id="2258723">
                                <string key="NSClassName">HBController</string>
                        <object class="NSCustomObject" id="159095366">
                                <string key="NSClassName">SUUpdater</string>
                        </object>
+                       <object class="NSCustomObject" id="681233637">
+                               <string key="NSClassName">HBAudioController</string>
+                       </object>
+                       <object class="NSArrayController" id="141316080">
+                               <object class="NSMutableArray" key="NSDeclaredKeys">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <string>tracks</string>
+                                       <string>tracks.keyAudioTrackName</string>
+                                       <string>track</string>
+                                       <string>enabled</string>
+                                       <string>mixdownEnabled</string>
+                                       <string>drc</string>
+                                       <string>codecs</string>
+                                       <string>codecs.keyAudioCodecName</string>
+                                       <string>codec</string>
+                                       <string>mixdowns</string>
+                                       <string>mixdowns.keyAudioMixdownName</string>
+                                       <string>mixdown</string>
+                                       <string>sampleRates</string>
+                                       <string>sampleRates.keyAudioSampleRateName</string>
+                                       <string>sampleRate</string>
+                                       <string>bitRates</string>
+                                       <string>bitRates.keyAudioBitrateName</string>
+                                       <string>bitRate</string>
+                                       <string>AC3Enabled</string>
+                               </object>
+                               <bool key="NSEditable">YES</bool>
+                               <object class="_NSManagedProxy" key="_NSManagedProxy"/>
+                               <bool key="NSSelectsInsertedObjects">YES</bool>
+                               <bool key="NSFilterRestrictsInsertion">YES</bool>
+                               <bool key="NSClearsFilterPredicateOnInsertion">YES</bool>
+                       </object>
+                       <object class="NSUserDefaultsController" id="869523098">
+                               <bool key="NSSharedInstance">YES</bool>
+                       </object>
                </object>
                <object class="IBObjectContainer" key="IBDocument.Objects">
                        <object class="NSMutableArray" key="connectionRecords">
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudLang1PopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="93020318"/>
-                                       </object>
-                                       <int key="connectionID">1573</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudLang2PopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="641072930"/>
-                                       </object>
-                                       <int key="connectionID">1575</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fDstBrowseButton</string>
                                                <reference key="source" ref="2258723"/>
                                                <reference key="destination" ref="210289606"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fSrcChapterField</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="1053010160"/>
-                                       </object>
-                                       <int key="connectionID">1587</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fSrcChapterToField</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="200266929"/>
-                                       </object>
-                                       <int key="connectionID">1588</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fSrcDuration1Field</string>
                                                <reference key="source" ref="2258723"/>
                                                <reference key="destination" ref="713493964"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fVidQualityMatrix</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="229000833"/>
-                                       </object>
-                                       <int key="connectionID">1605</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
                                                <string key="label">fVidQualitySlider</string>
                                                <reference key="source" ref="2258723"/>
                                                <reference key="destination" ref="239657287"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">calculateBitrate:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="351922892"/>
-                                       </object>
-                                       <int key="connectionID">1620</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
                                                <string key="label">performFindPanelAction:</string>
                                                <reference key="source" ref="952684036"/>
                                                <reference key="destination" ref="793630765"/>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">customSettingUsed:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="135824882"/>
-                                       </object>
-                                       <int key="connectionID">1914</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
                                                <string key="label">addFactoryPresets:</string>
                                                <reference key="source" ref="2258723"/>
                                                <reference key="destination" ref="814047217"/>
                                        <int key="connectionID">1956</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1MixPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="64899409"/>
-                                       </object>
-                                       <int key="connectionID">1965</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2MixPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="354208181"/>
-                                       </object>
-                                       <int key="connectionID">1969</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="93020318"/>
-                                       </object>
-                                       <int key="connectionID">1974</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="641072930"/>
-                                       </object>
-                                       <int key="connectionID">1975</int>
-                               </object>
-                               <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
                                                <string key="label">openUserGuide:</string>
                                                <reference key="source" ref="2258723"/>
                                        <int key="connectionID">1986</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackMixdownChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="64899409"/>
-                                       </object>
-                                       <int key="connectionID">1987</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackMixdownChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="354208181"/>
-                                       </object>
-                                       <int key="connectionID">1988</int>
-                               </object>
-                               <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
                                                <string key="label">fCreateChapterMarkers</string>
                                                <reference key="source" ref="2258723"/>
                                        <int key="connectionID">4971</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1CodecPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="466865421"/>
-                                       </object>
-                                       <int key="connectionID">4990</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2CodecPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="905865959"/>
-                                       </object>
-                                       <int key="connectionID">4991</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudLang3PopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="59505660"/>
-                                       </object>
-                                       <int key="connectionID">5020</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudLang4PopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="952272880"/>
-                                       </object>
-                                       <int key="connectionID">5021</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3CodecPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="826012798"/>
-                                       </object>
-                                       <int key="connectionID">5022</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4CodecPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="210973520"/>
-                                       </object>
-                                       <int key="connectionID">5023</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3MixPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="838524493"/>
-                                       </object>
-                                       <int key="connectionID">5024</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4MixPopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="1068703394"/>
-                                       </object>
-                                       <int key="connectionID">5025</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="59505660"/>
-                                       </object>
-                                       <int key="connectionID">5026</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="952272880"/>
-                                       </object>
-                                       <int key="connectionID">5027</int>
-                               </object>
-                               <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
+                                               <string key="label">videoEncoderPopUpChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="466865421"/>
+                                               <reference key="destination" ref="12330413"/>
                                        </object>
-                                       <int key="connectionID">5036</int>
+                                       <int key="connectionID">5075</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
+                                               <string key="label">setDefaultPreset:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="905865959"/>
+                                               <reference key="destination" ref="950937431"/>
                                        </object>
-                                       <int key="connectionID">5037</int>
+                                       <int key="connectionID">5138</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
+                                               <string key="label">addFactoryPresets:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="826012798"/>
+                                               <reference key="destination" ref="583192244"/>
                                        </object>
-                                       <int key="connectionID">5038</int>
+                                       <int key="connectionID">5139</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackPopUpChanged:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="210973520"/>
-                                       </object>
-                                       <int key="connectionID">5039</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2RatePopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="989777035"/>
-                                       </object>
-                                       <int key="connectionID">5065</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3RatePopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="21683307"/>
-                                       </object>
-                                       <int key="connectionID">5066</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4RatePopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="82044516"/>
-                                       </object>
-                                       <int key="connectionID">5067</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2BitratePopUp</string>
+                                               <string key="label">autoSetM4vExtension:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="511205515"/>
+                                               <reference key="destination" ref="719511430"/>
                                        </object>
-                                       <int key="connectionID">5069</int>
+                                       <int key="connectionID">5152</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3BitratePopUp</string>
+                                               <string key="label">fPresetNewFolderCheck</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="362406693"/>
+                                               <reference key="destination" ref="786415813"/>
                                        </object>
-                                       <int key="connectionID">5070</int>
+                                       <int key="connectionID">5155</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4BitratePopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="596295285"/>
-                                       </object>
-                                       <int key="connectionID">5071</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackMixdownChanged:</string>
+                                               <string key="label">fVidEncoderField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="838524493"/>
+                                               <reference key="destination" ref="1064150725"/>
                                        </object>
-                                       <int key="connectionID">5072</int>
+                                       <int key="connectionID">5156</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioTrackMixdownChanged:</string>
+                                               <string key="label">showPreviewWindow:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="1068703394"/>
+                                               <reference key="destination" ref="157409278"/>
                                        </object>
-                                       <int key="connectionID">5073</int>
+                                       <int key="connectionID">5158</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">videoEncoderPopUpChanged:</string>
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fPictureSizeField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="12330413"/>
+                                               <reference key="destination" ref="987137669"/>
                                        </object>
-                                       <int key="connectionID">5075</int>
+                                       <int key="connectionID">5169</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudSourceLabel</string>
+                                               <string key="label">fPictureCroppingField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="68754422"/>
+                                               <reference key="destination" ref="690364175"/>
                                        </object>
-                                       <int key="connectionID">5076</int>
+                                       <int key="connectionID">5170</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudCodecLabel</string>
+                                               <string key="label">fVideoFiltersField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="759329849"/>
+                                               <reference key="destination" ref="503933842"/>
                                        </object>
-                                       <int key="connectionID">5077</int>
+                                       <int key="connectionID">5173</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudMixdownLabel</string>
+                                               <string key="label">fVidQualityRFField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="211624488"/>
+                                               <reference key="destination" ref="690304958"/>
                                        </object>
-                                       <int key="connectionID">5078</int>
+                                       <int key="connectionID">5176</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudSamplerateLabel</string>
+                                               <string key="label">fVidQualityRFLabel</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="592255786"/>
+                                               <reference key="destination" ref="323705695"/>
                                        </object>
-                                       <int key="connectionID">5079</int>
+                                       <int key="connectionID">5179</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudBitrateLabel</string>
+                                               <string key="label">fSrcAngleLabel</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="122023676"/>
+                                               <reference key="destination" ref="303369850"/>
                                        </object>
-                                       <int key="connectionID">5080</int>
+                                       <int key="connectionID">5186</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1Label</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">browseExportPresetFile:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="198352083"/>
+                                               <reference key="destination" ref="734454745"/>
                                        </object>
-                                       <int key="connectionID">5081</int>
+                                       <int key="connectionID">5191</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2Label</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">browseImportPresetFile:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="290434291"/>
+                                               <reference key="destination" ref="685593004"/>
                                        </object>
-                                       <int key="connectionID">5082</int>
+                                       <int key="connectionID">5193</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3Label</string>
+                                               <string key="label">fSubtitlesTable</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="979512783"/>
+                                               <reference key="destination" ref="587237088"/>
                                        </object>
-                                       <int key="connectionID">5083</int>
+                                       <int key="connectionID">5214</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4Label</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">showAboutPanel:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="822590453"/>
+                                               <reference key="destination" ref="218095211"/>
                                        </object>
-                                       <int key="connectionID">5084</int>
+                                       <int key="connectionID">5245</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1RatePopUp</string>
+                                               <string key="label">fBrowseSrtFileButton</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="135824882"/>
+                                               <reference key="destination" ref="377401502"/>
                                        </object>
-                                       <int key="connectionID">5085</int>
+                                       <int key="connectionID">5248</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1BitratePopUp</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">browseImportSrtFile:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="351922892"/>
+                                               <reference key="destination" ref="377401502"/>
                                        </object>
-                                       <int key="connectionID">5086</int>
+                                       <int key="connectionID">5249</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudDrcLabel</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="169748081"/>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">unhideAllApplications:</string>
+                                               <reference key="source" ref="952684036"/>
+                                               <reference key="destination" ref="750596130"/>
                                        </object>
-                                       <int key="connectionID">5109</int>
+                                       <int key="connectionID">5281</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1DrcSlider</string>
+                                               <string key="label">fSrcTimeStartEncodingField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="861218370"/>
+                                               <reference key="destination" ref="104002862"/>
                                        </object>
-                                       <int key="connectionID">5110</int>
+                                       <int key="connectionID">5507</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2DrcSlider</string>
+                                               <string key="label">fSrcTimeEndEncodingField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="695663835"/>
+                                               <reference key="destination" ref="19055068"/>
                                        </object>
-                                       <int key="connectionID">5111</int>
+                                       <int key="connectionID">5508</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3DrcSlider</string>
+                                               <string key="label">fVidQualityMatrix</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="229696812"/>
+                                               <reference key="destination" ref="229000833"/>
                                        </object>
-                                       <int key="connectionID">5112</int>
+                                       <int key="connectionID">5512</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4DrcSlider</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">encodeStartStopPopUpChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="927860050"/>
+                                               <reference key="destination" ref="482831442"/>
                                        </object>
-                                       <int key="connectionID">5113</int>
+                                       <int key="connectionID">5520</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack1DrcField</string>
+                                               <string key="label">fSrcFrameStartEncodingField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="532012054"/>
+                                               <reference key="destination" ref="398989741"/>
                                        </object>
-                                       <int key="connectionID">5114</int>
+                                       <int key="connectionID">5525</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack2DrcField</string>
+                                               <string key="label">fSrcFrameEndEncodingField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="850861055"/>
+                                               <reference key="destination" ref="164276139"/>
                                        </object>
-                                       <int key="connectionID">5115</int>
+                                       <int key="connectionID">5526</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack3DrcField</string>
+                                               <string key="label">fEncodeStartStopPopUp</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="988102670"/>
+                                               <reference key="destination" ref="482831442"/>
                                        </object>
-                                       <int key="connectionID">5116</int>
+                                       <int key="connectionID">5527</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fAudTrack4DrcField</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">startEndSecValueChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="758473796"/>
+                                               <reference key="destination" ref="104002862"/>
                                        </object>
-                                       <int key="connectionID">5117</int>
+                                       <int key="connectionID">5528</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioDRCSliderChanged:</string>
+                                               <string key="label">startEndSecValueChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="861218370"/>
+                                               <reference key="destination" ref="19055068"/>
                                        </object>
-                                       <int key="connectionID">5118</int>
+                                       <int key="connectionID">5529</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioDRCSliderChanged:</string>
+                                               <string key="label">startEndFrameValueChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="695663835"/>
+                                               <reference key="destination" ref="398989741"/>
                                        </object>
-                                       <int key="connectionID">5119</int>
+                                       <int key="connectionID">5530</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioDRCSliderChanged:</string>
+                                               <string key="label">startEndFrameValueChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="229696812"/>
+                                               <reference key="destination" ref="164276139"/>
                                        </object>
-                                       <int key="connectionID">5120</int>
+                                       <int key="connectionID">5531</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">audioDRCSliderChanged:</string>
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fSrcChapterToField</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="927860050"/>
+                                               <reference key="destination" ref="978025076"/>
                                        </object>
-                                       <int key="connectionID">5121</int>
+                                       <int key="connectionID">5532</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">setDefaultPreset:</string>
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fSrcAnglePopUp</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="950937431"/>
+                                               <reference key="destination" ref="460320725"/>
                                        </object>
-                                       <int key="connectionID">5138</int>
+                                       <int key="connectionID">5533</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">addFactoryPresets:</string>
+                                               <string key="label">browseForChapterFile:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="583192244"/>
+                                               <reference key="destination" ref="959722284"/>
                                        </object>
-                                       <int key="connectionID">5139</int>
+                                       <int key="connectionID">5538</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">autoSetM4vExtension:</string>
+                                               <string key="label">browseForChapterFileSave:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="719511430"/>
+                                               <reference key="destination" ref="931485910"/>
                                        </object>
-                                       <int key="connectionID">5152</int>
+                                       <int key="connectionID">5539</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fPresetNewFolderCheck</string>
+                                               <string key="label">fLoadChaptersButton</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="786415813"/>
+                                               <reference key="destination" ref="959722284"/>
                                        </object>
-                                       <int key="connectionID">5155</int>
+                                       <int key="connectionID">5540</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fVidEncoderField</string>
+                                               <string key="label">fSaveChaptersButton</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="1064150725"/>
+                                               <reference key="destination" ref="931485910"/>
                                        </object>
-                                       <int key="connectionID">5156</int>
+                                       <int key="connectionID">5541</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">showPreviewWindow:</string>
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fChapterTableNameColumn</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="157409278"/>
+                                               <reference key="destination" ref="932392163"/>
                                        </object>
-                                       <int key="connectionID">5158</int>
+                                       <int key="connectionID">5544</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fPictureSizeField</string>
+                                               <string key="label">fFrameratePfrCheck</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="987137669"/>
+                                               <reference key="destination" ref="852146403"/>
                                        </object>
-                                       <int key="connectionID">5169</int>
+                                       <int key="connectionID">5548</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fPictureCroppingField</string>
+                                               <string key="label">fPresetNewPicWidth</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="690364175"/>
+                                               <reference key="destination" ref="522324466"/>
                                        </object>
-                                       <int key="connectionID">5170</int>
+                                       <int key="connectionID">5668</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fVideoFiltersField</string>
+                                               <string key="label">fPresetNewPicHeight</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="503933842"/>
+                                               <reference key="destination" ref="525081109"/>
                                        </object>
-                                       <int key="connectionID">5173</int>
+                                       <int key="connectionID">5669</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fVidQualityRFField</string>
+                                               <string key="label">fPresetNewPicWidthHeightBox</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="690304958"/>
+                                               <reference key="destination" ref="277759901"/>
                                        </object>
-                                       <int key="connectionID">5176</int>
+                                       <int key="connectionID">5671</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fVidQualityRFLabel</string>
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">addPresetPicDropdownChanged:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="323705695"/>
+                                               <reference key="destination" ref="167356719"/>
                                        </object>
-                                       <int key="connectionID">5179</int>
+                                       <int key="connectionID">5672</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fSrcAngleLabel</string>
+                                               <string key="label">fAudioDelegate</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="303369850"/>
+                                               <reference key="destination" ref="681233637"/>
                                        </object>
-                                       <int key="connectionID">5186</int>
+                                       <int key="connectionID">5675</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fSrcAnglePopUp</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="460320725"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentArray: audioArray</string>
+                                               <reference key="source" ref="141316080"/>
+                                               <reference key="destination" ref="681233637"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="141316080"/>
+                                                       <reference key="NSDestination" ref="681233637"/>
+                                                       <string key="NSLabel">contentArray: audioArray</string>
+                                                       <string key="NSBinding">contentArray</string>
+                                                       <string key="NSKeyPath">audioArray</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5187</int>
+                                       <int key="connectionID">5679</int>
                                </object>
                                <object class="IBConnectionRecord">
                                        <object class="IBActionConnection" key="connection">
-                                               <string key="label">browseExportPresetFile:</string>
+                                               <string key="label">addAllAudioTracks:</string>
                                                <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="734454745"/>
+                                               <reference key="destination" ref="883603583"/>
                                        </object>
-                                       <int key="connectionID">5191</int>
+                                       <int key="connectionID">5709</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">browseImportPresetFile:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="685593004"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: hasValidPresetSelected</string>
+                                               <reference key="source" ref="883603583"/>
+                                               <reference key="destination" ref="2258723"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="883603583"/>
+                                                       <reference key="NSDestination" ref="2258723"/>
+                                                       <string key="NSLabel">enabled: hasValidPresetSelected</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">hasValidPresetSelected</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5711</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">content: arrangedObjects.tracks</string>
+                                               <reference key="source" ref="33212493"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="360596124">
+                                                       <reference key="NSSource" ref="33212493"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">content: arrangedObjects.tracks</string>
+                                                       <string key="NSBinding">content</string>
+                                                       <string key="NSKeyPath">arrangedObjects.tracks</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5726</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentValues: arrangedObjects.tracks.keyAudioTrackName</string>
+                                               <reference key="source" ref="33212493"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="418939407">
+                                                       <reference key="NSSource" ref="33212493"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">contentValues: arrangedObjects.tracks.keyAudioTrackName</string>
+                                                       <string key="NSBinding">contentValues</string>
+                                                       <string key="NSKeyPath">arrangedObjects.tracks.keyAudioTrackName</string>
+                                                       <reference key="NSPreviousConnector" ref="360596124"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5728</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">content: arrangedObjects.codecs</string>
+                                               <reference key="source" ref="200958136"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="561471240">
+                                                       <reference key="NSSource" ref="200958136"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">content: arrangedObjects.codecs</string>
+                                                       <string key="NSBinding">content</string>
+                                                       <string key="NSKeyPath">arrangedObjects.codecs</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5747</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentValues: arrangedObjects.codecs.keyAudioCodecName</string>
+                                               <reference key="source" ref="200958136"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="357206672">
+                                                       <reference key="NSSource" ref="200958136"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">contentValues: arrangedObjects.codecs.keyAudioCodecName</string>
+                                                       <string key="NSBinding">contentValues</string>
+                                                       <string key="NSKeyPath">arrangedObjects.codecs.keyAudioCodecName</string>
+                                                       <reference key="NSPreviousConnector" ref="561471240"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5749</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">content: arrangedObjects.mixdowns</string>
+                                               <reference key="source" ref="590927656"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="993421587">
+                                                       <reference key="NSSource" ref="590927656"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">content: arrangedObjects.mixdowns</string>
+                                                       <string key="NSBinding">content</string>
+                                                       <string key="NSKeyPath">arrangedObjects.mixdowns</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5754</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentValues: arrangedObjects.mixdowns.keyAudioMixdownName</string>
+                                               <reference key="source" ref="590927656"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="688037869">
+                                                       <reference key="NSSource" ref="590927656"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">contentValues: arrangedObjects.mixdowns.keyAudioMixdownName</string>
+                                                       <string key="NSBinding">contentValues</string>
+                                                       <string key="NSKeyPath">arrangedObjects.mixdowns.keyAudioMixdownName</string>
+                                                       <reference key="NSPreviousConnector" ref="993421587"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5193</int>
+                                       <int key="connectionID">5756</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fSubtitlesTable</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="587237088"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">content: arrangedObjects.sampleRates</string>
+                                               <reference key="source" ref="1063255"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="389021487">
+                                                       <reference key="NSSource" ref="1063255"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">content: arrangedObjects.sampleRates</string>
+                                                       <string key="NSBinding">content</string>
+                                                       <string key="NSKeyPath">arrangedObjects.sampleRates</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5214</int>
+                                       <int key="connectionID">5760</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">showAboutPanel:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="218095211"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentValues: arrangedObjects.sampleRates.keyAudioSampleRateName</string>
+                                               <reference key="source" ref="1063255"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="1059867876">
+                                                       <reference key="NSSource" ref="1063255"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">contentValues: arrangedObjects.sampleRates.keyAudioSampleRateName</string>
+                                                       <string key="NSBinding">contentValues</string>
+                                                       <string key="NSKeyPath">arrangedObjects.sampleRates.keyAudioSampleRateName</string>
+                                                       <reference key="NSPreviousConnector" ref="389021487"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5245</int>
+                                       <int key="connectionID">5762</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fBrowseSrtFileButton</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="377401502"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">content: arrangedObjects.bitRates</string>
+                                               <reference key="source" ref="596723553"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="526128549">
+                                                       <reference key="NSSource" ref="596723553"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">content: arrangedObjects.bitRates</string>
+                                                       <string key="NSBinding">content</string>
+                                                       <string key="NSKeyPath">arrangedObjects.bitRates</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5766</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">contentValues: arrangedObjects.bitRates.keyAudioBitrateName</string>
+                                               <reference key="source" ref="596723553"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector" id="614736310">
+                                                       <reference key="NSSource" ref="596723553"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">contentValues: arrangedObjects.bitRates.keyAudioBitrateName</string>
+                                                       <string key="NSBinding">contentValues</string>
+                                                       <string key="NSKeyPath">arrangedObjects.bitRates.keyAudioBitrateName</string>
+                                                       <reference key="NSPreviousConnector" ref="526128549"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5768</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.enabled</string>
+                                               <reference key="source" ref="200958136"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="200958136"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.enabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.enabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5774</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.enabled</string>
+                                               <reference key="source" ref="590927656"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="590927656"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.enabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.enabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5776</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.mixdownEnabled</string>
+                                               <reference key="source" ref="1063255"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="1063255"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.mixdownEnabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.mixdownEnabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5778</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.mixdownEnabled</string>
+                                               <reference key="source" ref="596723553"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="596723553"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.mixdownEnabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.mixdownEnabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5780</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">selectedObject: arrangedObjects.track</string>
+                                               <reference key="source" ref="33212493"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="33212493"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">selectedObject: arrangedObjects.track</string>
+                                                       <string key="NSBinding">selectedObject</string>
+                                                       <string key="NSKeyPath">arrangedObjects.track</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <reference key="NSPreviousConnector" ref="418939407"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5785</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">selectedObject: arrangedObjects.codec</string>
+                                               <reference key="source" ref="200958136"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="200958136"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">selectedObject: arrangedObjects.codec</string>
+                                                       <string key="NSBinding">selectedObject</string>
+                                                       <string key="NSKeyPath">arrangedObjects.codec</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <reference key="NSPreviousConnector" ref="357206672"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5786</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">selectedObject: arrangedObjects.mixdown</string>
+                                               <reference key="source" ref="590927656"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="590927656"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">selectedObject: arrangedObjects.mixdown</string>
+                                                       <string key="NSBinding">selectedObject</string>
+                                                       <string key="NSKeyPath">arrangedObjects.mixdown</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <reference key="NSPreviousConnector" ref="688037869"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5787</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">selectedObject: arrangedObjects.sampleRate</string>
+                                               <reference key="source" ref="1063255"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="1063255"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">selectedObject: arrangedObjects.sampleRate</string>
+                                                       <string key="NSBinding">selectedObject</string>
+                                                       <string key="NSKeyPath">arrangedObjects.sampleRate</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <reference key="NSPreviousConnector" ref="1059867876"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5788</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">selectedObject: arrangedObjects.bitRate</string>
+                                               <reference key="source" ref="596723553"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="596723553"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">selectedObject: arrangedObjects.bitRate</string>
+                                                       <string key="NSBinding">selectedObject</string>
+                                                       <string key="NSKeyPath">arrangedObjects.bitRate</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <reference key="NSPreviousConnector" ref="614736310"/>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5248</int>
+                                       <int key="connectionID">5789</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">browseImportSrtFile:</string>
-                                               <reference key="source" ref="2258723"/>
-                                               <reference key="destination" ref="377401502"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: arrangedObjects.drc</string>
+                                               <reference key="source" ref="393032802"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="393032802"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">value: arrangedObjects.drc</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">arrangedObjects.drc</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                               <object class="NSArray" key="dict.sortedKeys">
+                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                       <string>NSCreatesSortDescriptor</string>
+                                                                       <string>NSValidatesImmediately</string>
+                                                               </object>
+                                                               <object class="NSMutableArray" key="dict.values">
+                                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                       <boolean value="NO"/>
+                                                                       <boolean value="YES"/>
+                                                               </object>
+                                                       </object>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5249</int>
+                                       <int key="connectionID">5790</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">unhideAllApplications:</string>
-                                               <reference key="source" ref="952684036"/>
-                                               <reference key="destination" ref="750596130"/>
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: arrangedObjects.drc</string>
+                                               <reference key="source" ref="581296833"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="581296833"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">value: arrangedObjects.drc</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">arrangedObjects.drc</string>
+                                                       <object class="NSDictionary" key="NSOptions">
+                                                               <string key="NS.key.0">NSCreatesSortDescriptor</string>
+                                                               <boolean value="NO" key="NS.object.0"/>
+                                                       </object>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
                                        </object>
-                                       <int key="connectionID">5281</int>
+                                       <int key="connectionID">5791</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.AC3Enabled</string>
+                                               <reference key="source" ref="393032802"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="393032802"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.AC3Enabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.AC3Enabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5792</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">enabled: arrangedObjects.AC3Enabled</string>
+                                               <reference key="source" ref="581296833"/>
+                                               <reference key="destination" ref="141316080"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="581296833"/>
+                                                       <reference key="NSDestination" ref="141316080"/>
+                                                       <string key="NSLabel">enabled: arrangedObjects.AC3Enabled</string>
+                                                       <string key="NSBinding">enabled</string>
+                                                       <string key="NSKeyPath">arrangedObjects.AC3Enabled</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">5793</int>
                                </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">0</int>
-                                               <object class="NSArray" key="object" id="3896795">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                               </object>
+                                               <reference key="object" ref="0"/>
                                                <reference key="children" ref="411085004"/>
                                                <nil key="parent"/>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-2</int>
                                                <reference key="object" ref="1046316778"/>
-                                               <reference key="parent" ref="3896795"/>
-                                               <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+                                               <reference key="parent" ref="0"/>
+                                               <string key="objectName">File's Owner</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-1</int>
                                                <reference key="object" ref="952684036"/>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">First Responder</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-3</int>
                                                <reference key="object" ref="300550588"/>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">Application</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="168918359"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">MainWindow</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <reference ref="712502892"/>
                                                        <reference ref="586321835"/>
                                                        <reference ref="854767306"/>
-                                                       <reference ref="806469067"/>
-                                                       <reference ref="766125203"/>
-                                                       <reference ref="1053010160"/>
-                                                       <reference ref="971754180"/>
-                                                       <reference ref="453345136"/>
-                                                       <reference ref="200266929"/>
-                                                       <reference ref="1023408378"/>
-                                                       <reference ref="713493964"/>
-                                                       <reference ref="955053416"/>
-                                                       <reference ref="138115732"/>
                                                        <reference ref="87961628"/>
                                                        <reference ref="732193996"/>
-                                                       <reference ref="186223550"/>
-                                                       <reference ref="210289606"/>
-                                                       <reference ref="10346684"/>
                                                        <reference ref="35106907"/>
                                                        <reference ref="151388399"/>
                                                        <reference ref="574185541"/>
-                                                       <reference ref="1007421233"/>
                                                        <reference ref="519699512"/>
                                                        <reference ref="454206717"/>
                                                        <reference ref="581806074"/>
                                                        <reference ref="553453876"/>
                                                        <reference ref="921877174"/>
+                                                       <reference ref="806469067"/>
+                                                       <reference ref="766125203"/>
                                                        <reference ref="303369850"/>
                                                        <reference ref="460320725"/>
+                                                       <reference ref="453345136"/>
+                                                       <reference ref="978025076"/>
+                                                       <reference ref="971754180"/>
+                                                       <reference ref="482831442"/>
+                                                       <reference ref="104002862"/>
+                                                       <reference ref="19055068"/>
+                                                       <reference ref="713493964"/>
+                                                       <reference ref="955053416"/>
+                                                       <reference ref="398989741"/>
+                                                       <reference ref="164276139"/>
+                                                       <reference ref="1023408378"/>
+                                                       <reference ref="186223550"/>
+                                                       <reference ref="138115732"/>
+                                                       <reference ref="10346684"/>
+                                                       <reference ref="210289606"/>
+                                                       <reference ref="1007421233"/>
                                                </object>
                                                <reference key="parent" ref="192660081"/>
                                        </object>
                                                <reference key="object" ref="738554558"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="198352083"/>
-                                                       <reference ref="641072930"/>
-                                                       <reference ref="290434291"/>
-                                                       <reference ref="122023676"/>
-                                                       <reference ref="351922892"/>
-                                                       <reference ref="64899409"/>
-                                                       <reference ref="354208181"/>
-                                                       <reference ref="211624488"/>
-                                                       <reference ref="68754422"/>
-                                                       <reference ref="978534247"/>
-                                                       <reference ref="460286942"/>
-                                                       <reference ref="135824882"/>
-                                                       <reference ref="592255786"/>
-                                                       <reference ref="466865421"/>
-                                                       <reference ref="905865959"/>
-                                                       <reference ref="759329849"/>
-                                                       <reference ref="979512783"/>
-                                                       <reference ref="822590453"/>
-                                                       <reference ref="59505660"/>
-                                                       <reference ref="952272880"/>
-                                                       <reference ref="826012798"/>
-                                                       <reference ref="210973520"/>
-                                                       <reference ref="838524493"/>
-                                                       <reference ref="1068703394"/>
-                                                       <reference ref="989777035"/>
-                                                       <reference ref="21683307"/>
-                                                       <reference ref="82044516"/>
-                                                       <reference ref="511205515"/>
-                                                       <reference ref="362406693"/>
-                                                       <reference ref="596295285"/>
-                                                       <reference ref="861218370"/>
-                                                       <reference ref="695663835"/>
-                                                       <reference ref="229696812"/>
-                                                       <reference ref="927860050"/>
-                                                       <reference ref="169748081"/>
-                                                       <reference ref="532012054"/>
-                                                       <reference ref="850861055"/>
-                                                       <reference ref="988102670"/>
-                                                       <reference ref="758473796"/>
-                                                       <reference ref="93020318"/>
+                                                       <reference ref="577274772"/>
                                                </object>
                                                <reference key="parent" ref="157300012"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">1518</int>
-                                               <reference key="object" ref="93020318"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="555573644"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1521</int>
-                                               <reference key="object" ref="198352083"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="51721961"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1522</int>
-                                               <reference key="object" ref="641072930"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="442718934"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1525</int>
-                                               <reference key="object" ref="290434291"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="315823608"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1526</int>
-                                               <reference key="object" ref="122023676"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="92788757"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1527</int>
-                                               <reference key="object" ref="351922892"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="569025834"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1530</int>
-                                               <reference key="object" ref="135824882"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="47770866"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1533</int>
-                                               <reference key="object" ref="592255786"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="139205907"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1962</int>
-                                               <reference key="object" ref="64899409"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="581778322"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1966</int>
-                                               <reference key="object" ref="354208181"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1011395150"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1970</int>
-                                               <reference key="object" ref="211624488"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="109899703"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1972</int>
-                                               <reference key="object" ref="68754422"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1013303839"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">3075</int>
-                                               <reference key="object" ref="978534247"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="211433572"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">3077</int>
-                                               <reference key="object" ref="460286942"/>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">1477</int>
                                                <reference key="object" ref="107038816"/>
                                                <object class="NSMutableArray" key="children">
                                                        <reference ref="239657287"/>
                                                        <reference ref="690304958"/>
                                                        <reference ref="323705695"/>
+                                                       <reference ref="852146403"/>
                                                </object>
                                                <reference key="parent" ref="107038816"/>
                                        </object>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="307620967"/>
+                                                       <reference ref="931485910"/>
+                                                       <reference ref="959722284"/>
                                                        <reference ref="262106913"/>
                                                </object>
                                                <reference key="parent" ref="291470012"/>
                                                <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">1544</int>
-                                               <reference key="object" ref="1053010160"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="17369297"/>
-                                               </object>
-                                               <reference key="parent" ref="168918359"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">1545</int>
                                                <reference key="object" ref="971754180"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="286887304"/>
-                                               </object>
-                                               <reference key="parent" ref="168918359"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1548</int>
-                                               <reference key="object" ref="453345136"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="564669343"/>
+                                                       <reference ref="286887304"/>
                                                </object>
                                                <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">1551</int>
-                                               <reference key="object" ref="200266929"/>
+                                               <int key="objectID">1548</int>
+                                               <reference key="object" ref="453345136"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="904849236"/>
+                                                       <reference ref="564669343"/>
                                                </object>
                                                <reference key="parent" ref="168918359"/>
                                        </object>
                                                        <reference ref="692187614"/>
                                                        <reference ref="226787934"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">MainMenu</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                        <object class="IBObjectRecord">
                                                <int key="objectID">240</int>
                                                <reference key="object" ref="2258723"/>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">HBController</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="168254512"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">DonePanel</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                        <object class="IBObjectRecord">
                                                <int key="objectID">1841</int>
                                                <reference key="object" ref="972647787"/>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">PresetsDrawer</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <reference ref="699919504"/>
                                                        <reference ref="886184281"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">PresetsView</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="69290042"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">AddPresetPanel</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <reference ref="636581183"/>
                                                        <reference ref="586136427"/>
                                                        <reference ref="978853241"/>
-                                                       <reference ref="167356719"/>
                                                        <reference ref="343391844"/>
                                                        <reference ref="340554114"/>
                                                        <reference ref="511645357"/>
-                                                       <reference ref="31472093"/>
-                                                       <reference ref="1024752086"/>
                                                        <reference ref="5085381"/>
-                                                       <reference ref="988499754"/>
-                                                       <reference ref="59653352"/>
                                                        <reference ref="384547934"/>
                                                        <reference ref="786415813"/>
+                                                       <reference ref="167356719"/>
+                                                       <reference ref="277759901"/>
+                                                       <reference ref="988499754"/>
+                                                       <reference ref="59653352"/>
+                                                       <reference ref="31472093"/>
+                                                       <reference ref="1024752086"/>
                                                </object>
                                                <reference key="parent" ref="888992113"/>
                                        </object>
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="867624722"/>
                                                </object>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">SourceTitlePanel</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <reference key="parent" ref="794651271"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4847</int>
-                                               <reference key="object" ref="555573644"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="207945181"/>
-                                               </object>
-                                               <reference key="parent" ref="93020318"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4848</int>
-                                               <reference key="object" ref="51721961"/>
-                                               <reference key="parent" ref="198352083"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4849</int>
-                                               <reference key="object" ref="442718934"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="417760816"/>
-                                               </object>
-                                               <reference key="parent" ref="641072930"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4850</int>
-                                               <reference key="object" ref="315823608"/>
-                                               <reference key="parent" ref="290434291"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4851</int>
-                                               <reference key="object" ref="92788757"/>
-                                               <reference key="parent" ref="122023676"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4852</int>
-                                               <reference key="object" ref="569025834"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="389043188"/>
-                                               </object>
-                                               <reference key="parent" ref="351922892"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4853</int>
-                                               <reference key="object" ref="47770866"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="80517384"/>
-                                               </object>
-                                               <reference key="parent" ref="135824882"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4854</int>
-                                               <reference key="object" ref="139205907"/>
-                                               <reference key="parent" ref="592255786"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4857</int>
-                                               <reference key="object" ref="581778322"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="142584693"/>
-                                               </object>
-                                               <reference key="parent" ref="64899409"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4858</int>
-                                               <reference key="object" ref="1011395150"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="674797640"/>
-                                               </object>
-                                               <reference key="parent" ref="354208181"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4859</int>
-                                               <reference key="object" ref="109899703"/>
-                                               <reference key="parent" ref="211624488"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4860</int>
-                                               <reference key="object" ref="1013303839"/>
-                                               <reference key="parent" ref="68754422"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4862</int>
-                                               <reference key="object" ref="211433572"/>
-                                               <reference key="parent" ref="978534247"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">4872</int>
                                                <reference key="object" ref="200565868"/>
                                                <reference key="parent" ref="521019277"/>
                                                <reference key="parent" ref="766125203"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4909</int>
-                                               <reference key="object" ref="17369297"/>
-                                               <reference key="parent" ref="1053010160"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">4910</int>
                                                <reference key="object" ref="286887304"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="parent" ref="453345136"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4912</int>
-                                               <reference key="object" ref="904849236"/>
-                                               <reference key="parent" ref="200266929"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">4913</int>
                                                <reference key="object" ref="834340599"/>
                                                <reference key="parent" ref="1023408378"/>
                                                <reference key="parent" ref="932392163"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">1519</int>
-                                               <reference key="object" ref="207945181"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="16243588"/>
-                                               </object>
-                                               <reference key="parent" ref="555573644"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1520</int>
-                                               <reference key="object" ref="16243588"/>
-                                               <reference key="parent" ref="207945181"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1523</int>
-                                               <reference key="object" ref="417760816"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="484803315"/>
-                                               </object>
-                                               <reference key="parent" ref="442718934"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1524</int>
-                                               <reference key="object" ref="484803315"/>
-                                               <reference key="parent" ref="417760816"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1528</int>
-                                               <reference key="object" ref="389043188"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="53010878"/>
-                                               </object>
-                                               <reference key="parent" ref="569025834"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1529</int>
-                                               <reference key="object" ref="53010878"/>
-                                               <reference key="parent" ref="389043188"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1531</int>
-                                               <reference key="object" ref="80517384"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="122262864"/>
-                                               </object>
-                                               <reference key="parent" ref="47770866"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1532</int>
-                                               <reference key="object" ref="122262864"/>
-                                               <reference key="parent" ref="80517384"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1963</int>
-                                               <reference key="object" ref="142584693"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="803452967"/>
-                                               </object>
-                                               <reference key="parent" ref="581778322"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1964</int>
-                                               <reference key="object" ref="803452967"/>
-                                               <reference key="parent" ref="142584693"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1967</int>
-                                               <reference key="object" ref="674797640"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="909780825"/>
-                                               </object>
-                                               <reference key="parent" ref="1011395150"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">1968</int>
-                                               <reference key="object" ref="909780825"/>
-                                               <reference key="parent" ref="674797640"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">1510</int>
                                                <reference key="object" ref="605902924"/>
                                                <object class="NSMutableArray" key="children">
                                        <object class="IBObjectRecord">
                                                <int key="objectID">4963</int>
                                                <reference key="object" ref="159095366"/>
-                                               <reference key="parent" ref="3896795"/>
+                                               <reference key="parent" ref="0"/>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">4964</int>
                                                <reference key="parent" ref="921877174"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4980</int>
-                                               <reference key="object" ref="466865421"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="546425857"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4981</int>
-                                               <reference key="object" ref="546425857"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="637766485"/>
-                                               </object>
-                                               <reference key="parent" ref="466865421"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4982</int>
-                                               <reference key="object" ref="637766485"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="780045253"/>
-                                               </object>
-                                               <reference key="parent" ref="546425857"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4983</int>
-                                               <reference key="object" ref="780045253"/>
-                                               <reference key="parent" ref="637766485"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4984</int>
-                                               <reference key="object" ref="905865959"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="597526693"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4985</int>
-                                               <reference key="object" ref="597526693"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="587264026"/>
-                                               </object>
-                                               <reference key="parent" ref="905865959"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4986</int>
-                                               <reference key="object" ref="587264026"/>
+                                               <int key="objectID">5130</int>
+                                               <reference key="object" ref="886184281"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="839112264"/>
+                                                       <reference ref="492120702"/>
                                                </object>
-                                               <reference key="parent" ref="597526693"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4987</int>
-                                               <reference key="object" ref="839112264"/>
-                                               <reference key="parent" ref="587264026"/>
+                                               <reference key="parent" ref="621751818"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4988</int>
-                                               <reference key="object" ref="759329849"/>
+                                               <int key="objectID">5131</int>
+                                               <reference key="object" ref="492120702"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="989243685"/>
+                                                       <reference ref="717227898"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4989</int>
-                                               <reference key="object" ref="989243685"/>
-                                               <reference key="parent" ref="759329849"/>
+                                               <reference key="parent" ref="886184281"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4992</int>
-                                               <reference key="object" ref="979512783"/>
+                                               <int key="objectID">5132</int>
+                                               <reference key="object" ref="717227898"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="89611592"/>
+                                                       <reference ref="228547440"/>
+                                                       <reference ref="950937431"/>
+                                                       <reference ref="583192244"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">4993</int>
-                                               <reference key="object" ref="89611592"/>
-                                               <reference key="parent" ref="979512783"/>
+                                               <reference key="parent" ref="492120702"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4994</int>
-                                               <reference key="object" ref="822590453"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="628539537"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5133</int>
+                                               <reference key="object" ref="228547440"/>
+                                               <reference key="parent" ref="717227898"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4995</int>
-                                               <reference key="object" ref="628539537"/>
-                                               <reference key="parent" ref="822590453"/>
+                                               <int key="objectID">5134</int>
+                                               <reference key="object" ref="950937431"/>
+                                               <reference key="parent" ref="717227898"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4996</int>
-                                               <reference key="object" ref="59505660"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="62643522"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5135</int>
+                                               <reference key="object" ref="583192244"/>
+                                               <reference key="parent" ref="717227898"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4997</int>
-                                               <reference key="object" ref="62643522"/>
+                                               <int key="objectID">5153</int>
+                                               <reference key="object" ref="786415813"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="906154976"/>
+                                                       <reference ref="977106207"/>
                                                </object>
-                                               <reference key="parent" ref="59505660"/>
+                                               <reference key="parent" ref="69290042"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4998</int>
-                                               <reference key="object" ref="906154976"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1071907387"/>
-                                               </object>
-                                               <reference key="parent" ref="62643522"/>
+                                               <int key="objectID">5154</int>
+                                               <reference key="object" ref="977106207"/>
+                                               <reference key="parent" ref="786415813"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">4999</int>
-                                               <reference key="object" ref="1071907387"/>
-                                               <reference key="parent" ref="906154976"/>
+                                               <int key="objectID">5157</int>
+                                               <reference key="object" ref="157409278"/>
+                                               <reference key="parent" ref="919178355"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5000</int>
-                                               <reference key="object" ref="952272880"/>
+                                               <int key="objectID">5167</int>
+                                               <reference key="object" ref="987137669"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="995278067"/>
+                                                       <reference ref="537000521"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="1053078401"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5001</int>
-                                               <reference key="object" ref="995278067"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="842863259"/>
-                                               </object>
-                                               <reference key="parent" ref="952272880"/>
+                                               <int key="objectID">5168</int>
+                                               <reference key="object" ref="537000521"/>
+                                               <reference key="parent" ref="987137669"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5002</int>
-                                               <reference key="object" ref="842863259"/>
+                                               <int key="objectID">5171</int>
+                                               <reference key="object" ref="503933842"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="867303619"/>
+                                                       <reference ref="109092334"/>
                                                </object>
-                                               <reference key="parent" ref="995278067"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5003</int>
-                                               <reference key="object" ref="867303619"/>
-                                               <reference key="parent" ref="842863259"/>
+                                               <reference key="parent" ref="1053078401"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5004</int>
-                                               <reference key="object" ref="826012798"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="539072481"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5172</int>
+                                               <reference key="object" ref="109092334"/>
+                                               <reference key="parent" ref="503933842"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5005</int>
-                                               <reference key="object" ref="539072481"/>
+                                               <int key="objectID">5174</int>
+                                               <reference key="object" ref="690304958"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="284493447"/>
+                                                       <reference ref="923732752"/>
                                                </object>
-                                               <reference key="parent" ref="826012798"/>
+                                               <reference key="parent" ref="1053078401"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5006</int>
-                                               <reference key="object" ref="284493447"/>
+                                               <int key="objectID">5175</int>
+                                               <reference key="object" ref="923732752"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="249799590"/>
+                                                       <reference ref="580574518"/>
                                                </object>
-                                               <reference key="parent" ref="539072481"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5007</int>
-                                               <reference key="object" ref="249799590"/>
-                                               <reference key="parent" ref="284493447"/>
+                                               <reference key="parent" ref="690304958"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5008</int>
-                                               <reference key="object" ref="210973520"/>
+                                               <int key="objectID">5177</int>
+                                               <reference key="object" ref="323705695"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="908345921"/>
+                                                       <reference ref="936221726"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="1053078401"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5009</int>
-                                               <reference key="object" ref="908345921"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="718591795"/>
-                                               </object>
-                                               <reference key="parent" ref="210973520"/>
+                                               <int key="objectID">5178</int>
+                                               <reference key="object" ref="936221726"/>
+                                               <reference key="parent" ref="323705695"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5010</int>
-                                               <reference key="object" ref="718591795"/>
+                                               <int key="objectID">5180</int>
+                                               <reference key="object" ref="303369850"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="899331996"/>
+                                                       <reference ref="677126774"/>
                                                </object>
-                                               <reference key="parent" ref="908345921"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5011</int>
-                                               <reference key="object" ref="899331996"/>
-                                               <reference key="parent" ref="718591795"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5012</int>
-                                               <reference key="object" ref="838524493"/>
+                                               <int key="objectID">5181</int>
+                                               <reference key="object" ref="460320725"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="273746940"/>
+                                                       <reference ref="567459641"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5013</int>
-                                               <reference key="object" ref="273746940"/>
+                                               <int key="objectID">5182</int>
+                                               <reference key="object" ref="567459641"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="601838973"/>
+                                                       <reference ref="651682595"/>
                                                </object>
-                                               <reference key="parent" ref="838524493"/>
+                                               <reference key="parent" ref="460320725"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5014</int>
-                                               <reference key="object" ref="601838973"/>
+                                               <int key="objectID">5183</int>
+                                               <reference key="object" ref="651682595"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="903801986"/>
+                                                       <reference ref="62890346"/>
                                                </object>
-                                               <reference key="parent" ref="273746940"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5015</int>
-                                               <reference key="object" ref="903801986"/>
-                                               <reference key="parent" ref="601838973"/>
+                                               <reference key="parent" ref="567459641"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5016</int>
-                                               <reference key="object" ref="1068703394"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="376486018"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5184</int>
+                                               <reference key="object" ref="62890346"/>
+                                               <reference key="parent" ref="651682595"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5017</int>
-                                               <reference key="object" ref="376486018"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="911510427"/>
-                                               </object>
-                                               <reference key="parent" ref="1068703394"/>
+                                               <int key="objectID">5185</int>
+                                               <reference key="object" ref="677126774"/>
+                                               <reference key="parent" ref="303369850"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5018</int>
-                                               <reference key="object" ref="911510427"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="775004825"/>
-                                               </object>
-                                               <reference key="parent" ref="376486018"/>
+                                               <int key="objectID">5188</int>
+                                               <reference key="object" ref="734454745"/>
+                                               <reference key="parent" ref="112579544"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5019</int>
-                                               <reference key="object" ref="775004825"/>
-                                               <reference key="parent" ref="911510427"/>
+                                               <int key="objectID">5192</int>
+                                               <reference key="object" ref="685593004"/>
+                                               <reference key="parent" ref="112579544"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5040</int>
-                                               <reference key="object" ref="989777035"/>
+                                               <int key="objectID">5194</int>
+                                               <reference key="object" ref="799016137"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="98589714"/>
+                                                       <reference ref="756255803"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="712502892"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5041</int>
-                                               <reference key="object" ref="98589714"/>
+                                               <int key="objectID">5195</int>
+                                               <reference key="object" ref="756255803"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="843839970"/>
+                                                       <reference ref="596256174"/>
+                                                       <reference ref="377401502"/>
                                                </object>
-                                               <reference key="parent" ref="989777035"/>
+                                               <reference key="parent" ref="799016137"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5042</int>
-                                               <reference key="object" ref="843839970"/>
+                                               <int key="objectID">5196</int>
+                                               <reference key="object" ref="596256174"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1073059200"/>
+                                                       <reference ref="40751315"/>
+                                                       <reference ref="892147391"/>
+                                                       <reference ref="587237088"/>
+                                                       <reference ref="569585004"/>
                                                </object>
-                                               <reference key="parent" ref="98589714"/>
+                                               <reference key="parent" ref="756255803"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5043</int>
-                                               <reference key="object" ref="1073059200"/>
-                                               <reference key="parent" ref="843839970"/>
+                                               <int key="objectID">5197</int>
+                                               <reference key="object" ref="40751315"/>
+                                               <reference key="parent" ref="596256174"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5044</int>
-                                               <reference key="object" ref="21683307"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="27141415"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5198</int>
+                                               <reference key="object" ref="892147391"/>
+                                               <reference key="parent" ref="596256174"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5045</int>
-                                               <reference key="object" ref="27141415"/>
+                                               <int key="objectID">5199</int>
+                                               <reference key="object" ref="587237088"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="218736664"/>
+                                                       <reference ref="274341565"/>
+                                                       <reference ref="1033748386"/>
+                                                       <reference ref="362209136"/>
+                                                       <reference ref="270619684"/>
+                                                       <reference ref="116912874"/>
+                                                       <reference ref="180322215"/>
+                                                       <reference ref="526590234"/>
                                                </object>
-                                               <reference key="parent" ref="21683307"/>
+                                               <reference key="parent" ref="596256174"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5046</int>
-                                               <reference key="object" ref="218736664"/>
+                                               <int key="objectID">5201</int>
+                                               <reference key="object" ref="274341565"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="848021411"/>
+                                                       <reference ref="426946554"/>
                                                </object>
-                                               <reference key="parent" ref="27141415"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5047</int>
-                                               <reference key="object" ref="848021411"/>
-                                               <reference key="parent" ref="218736664"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5048</int>
-                                               <reference key="object" ref="82044516"/>
+                                               <int key="objectID">5215</int>
+                                               <reference key="object" ref="1033748386"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="828435207"/>
+                                                       <reference ref="13236417"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5049</int>
-                                               <reference key="object" ref="828435207"/>
+                                               <int key="objectID">5217</int>
+                                               <reference key="object" ref="362209136"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="884417804"/>
+                                                       <reference ref="704907857"/>
                                                </object>
-                                               <reference key="parent" ref="82044516"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5050</int>
-                                               <reference key="object" ref="884417804"/>
+                                               <int key="objectID">5219</int>
+                                               <reference key="object" ref="270619684"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="306314205"/>
+                                                       <reference ref="299034685"/>
                                                </object>
-                                               <reference key="parent" ref="828435207"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5051</int>
-                                               <reference key="object" ref="306314205"/>
-                                               <reference key="parent" ref="884417804"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5052</int>
-                                               <reference key="object" ref="511205515"/>
+                                               <int key="objectID">5225</int>
+                                               <reference key="object" ref="426946554"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="631798512"/>
+                                                       <reference ref="472498711"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="274341565"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5053</int>
-                                               <reference key="object" ref="631798512"/>
+                                               <int key="objectID">5226</int>
+                                               <reference key="object" ref="472498711"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="827185994"/>
+                                                       <reference ref="1026748451"/>
                                                </object>
-                                               <reference key="parent" ref="511205515"/>
+                                               <reference key="parent" ref="426946554"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5054</int>
-                                               <reference key="object" ref="827185994"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="395128474"/>
-                                               </object>
-                                               <reference key="parent" ref="631798512"/>
+                                               <int key="objectID">5227</int>
+                                               <reference key="object" ref="1026748451"/>
+                                               <reference key="parent" ref="472498711"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5055</int>
-                                               <reference key="object" ref="395128474"/>
-                                               <reference key="parent" ref="827185994"/>
+                                               <int key="objectID">5232</int>
+                                               <reference key="object" ref="13236417"/>
+                                               <reference key="parent" ref="1033748386"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5056</int>
-                                               <reference key="object" ref="362406693"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="494375275"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5233</int>
+                                               <reference key="object" ref="704907857"/>
+                                               <reference key="parent" ref="362209136"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5057</int>
-                                               <reference key="object" ref="494375275"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="74387810"/>
-                                               </object>
-                                               <reference key="parent" ref="362406693"/>
+                                               <int key="objectID">5234</int>
+                                               <reference key="object" ref="299034685"/>
+                                               <reference key="parent" ref="270619684"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5244</int>
+                                               <reference key="object" ref="569585004"/>
+                                               <reference key="parent" ref="596256174"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5058</int>
-                                               <reference key="object" ref="74387810"/>
+                                               <int key="objectID">5246</int>
+                                               <reference key="object" ref="377401502"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="509612152"/>
+                                                       <reference ref="206924163"/>
                                                </object>
-                                               <reference key="parent" ref="494375275"/>
+                                               <reference key="parent" ref="756255803"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5059</int>
-                                               <reference key="object" ref="509612152"/>
-                                               <reference key="parent" ref="74387810"/>
+                                               <int key="objectID">5247</int>
+                                               <reference key="object" ref="206924163"/>
+                                               <reference key="parent" ref="377401502"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5060</int>
-                                               <reference key="object" ref="596295285"/>
+                                               <int key="objectID">5250</int>
+                                               <reference key="object" ref="116912874"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="88657835"/>
+                                                       <reference ref="688461412"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5061</int>
-                                               <reference key="object" ref="88657835"/>
+                                               <int key="objectID">5252</int>
+                                               <reference key="object" ref="180322215"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="819464815"/>
+                                                       <reference ref="483232645"/>
                                                </object>
-                                               <reference key="parent" ref="596295285"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5062</int>
-                                               <reference key="object" ref="819464815"/>
+                                               <int key="objectID">5254</int>
+                                               <reference key="object" ref="526590234"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="425953784"/>
+                                                       <reference ref="43785715"/>
                                                </object>
-                                               <reference key="parent" ref="88657835"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5063</int>
-                                               <reference key="object" ref="425953784"/>
-                                               <reference key="parent" ref="819464815"/>
+                                               <reference key="parent" ref="587237088"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5091</int>
-                                               <reference key="object" ref="861218370"/>
+                                               <int key="objectID">5268</int>
+                                               <reference key="object" ref="688461412"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="212633849"/>
+                                                       <reference ref="808277525"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5092</int>
-                                               <reference key="object" ref="212633849"/>
-                                               <reference key="parent" ref="861218370"/>
+                                               <reference key="parent" ref="116912874"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5093</int>
-                                               <reference key="object" ref="695663835"/>
+                                               <int key="objectID">5269</int>
+                                               <reference key="object" ref="808277525"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="198981160"/>
+                                                       <reference ref="341659302"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="688461412"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5094</int>
-                                               <reference key="object" ref="198981160"/>
-                                               <reference key="parent" ref="695663835"/>
+                                               <int key="objectID">5270</int>
+                                               <reference key="object" ref="341659302"/>
+                                               <reference key="parent" ref="808277525"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5095</int>
-                                               <reference key="object" ref="229696812"/>
+                                               <int key="objectID">5271</int>
+                                               <reference key="object" ref="483232645"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="805488070"/>
+                                                       <reference ref="427130300"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5096</int>
-                                               <reference key="object" ref="805488070"/>
-                                               <reference key="parent" ref="229696812"/>
+                                               <reference key="parent" ref="180322215"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5097</int>
-                                               <reference key="object" ref="927860050"/>
+                                               <int key="objectID">5272</int>
+                                               <reference key="object" ref="427130300"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1037957700"/>
+                                                       <reference ref="66454705"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5098</int>
-                                               <reference key="object" ref="1037957700"/>
-                                               <reference key="parent" ref="927860050"/>
+                                               <reference key="parent" ref="483232645"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5099</int>
-                                               <reference key="object" ref="169748081"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="366629849"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5273</int>
+                                               <reference key="object" ref="66454705"/>
+                                               <reference key="parent" ref="427130300"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5100</int>
-                                               <reference key="object" ref="366629849"/>
-                                               <reference key="parent" ref="169748081"/>
+                                               <int key="objectID">5278</int>
+                                               <reference key="object" ref="43785715"/>
+                                               <reference key="parent" ref="526590234"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5101</int>
-                                               <reference key="object" ref="532012054"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="750019806"/>
-                                               </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <int key="objectID">5279</int>
+                                               <reference key="object" ref="580574518"/>
+                                               <reference key="parent" ref="923732752"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5102</int>
-                                               <reference key="object" ref="750019806"/>
-                                               <reference key="parent" ref="532012054"/>
+                                               <int key="objectID">5280</int>
+                                               <reference key="object" ref="750596130"/>
+                                               <reference key="parent" ref="1035150210"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5103</int>
-                                               <reference key="object" ref="850861055"/>
+                                               <int key="objectID">5491</int>
+                                               <reference key="object" ref="104002862"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="539528192"/>
+                                                       <reference ref="371961838"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5104</int>
-                                               <reference key="object" ref="539528192"/>
-                                               <reference key="parent" ref="850861055"/>
+                                               <int key="objectID">5492</int>
+                                               <reference key="object" ref="371961838"/>
+                                               <reference key="parent" ref="104002862"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5105</int>
-                                               <reference key="object" ref="988102670"/>
+                                               <int key="objectID">5493</int>
+                                               <reference key="object" ref="19055068"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="477201006"/>
+                                                       <reference ref="778187711"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5106</int>
-                                               <reference key="object" ref="477201006"/>
-                                               <reference key="parent" ref="988102670"/>
+                                               <int key="objectID">5494</int>
+                                               <reference key="object" ref="778187711"/>
+                                               <reference key="parent" ref="19055068"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5107</int>
-                                               <reference key="object" ref="758473796"/>
+                                               <int key="objectID">5505</int>
+                                               <reference key="object" ref="978025076"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="941741345"/>
+                                                       <reference ref="138681808"/>
                                                </object>
-                                               <reference key="parent" ref="738554558"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5108</int>
-                                               <reference key="object" ref="941741345"/>
-                                               <reference key="parent" ref="758473796"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5130</int>
-                                               <reference key="object" ref="886184281"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="492120702"/>
-                                               </object>
-                                               <reference key="parent" ref="621751818"/>
+                                               <int key="objectID">5506</int>
+                                               <reference key="object" ref="138681808"/>
+                                               <reference key="parent" ref="978025076"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5131</int>
-                                               <reference key="object" ref="492120702"/>
+                                               <int key="objectID">5513</int>
+                                               <reference key="object" ref="482831442"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="717227898"/>
+                                                       <reference ref="266952854"/>
                                                </object>
-                                               <reference key="parent" ref="886184281"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5132</int>
-                                               <reference key="object" ref="717227898"/>
+                                               <int key="objectID">5514</int>
+                                               <reference key="object" ref="266952854"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="228547440"/>
-                                                       <reference ref="950937431"/>
-                                                       <reference ref="583192244"/>
+                                                       <reference ref="289100177"/>
                                                </object>
-                                               <reference key="parent" ref="492120702"/>
+                                               <reference key="parent" ref="482831442"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5133</int>
-                                               <reference key="object" ref="228547440"/>
-                                               <reference key="parent" ref="717227898"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5134</int>
-                                               <reference key="object" ref="950937431"/>
-                                               <reference key="parent" ref="717227898"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5135</int>
-                                               <reference key="object" ref="583192244"/>
-                                               <reference key="parent" ref="717227898"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5153</int>
-                                               <reference key="object" ref="786415813"/>
+                                               <int key="objectID">5515</int>
+                                               <reference key="object" ref="289100177"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="977106207"/>
                                                </object>
-                                               <reference key="parent" ref="69290042"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5154</int>
-                                               <reference key="object" ref="977106207"/>
-                                               <reference key="parent" ref="786415813"/>
+                                               <reference key="parent" ref="266952854"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5157</int>
-                                               <reference key="object" ref="157409278"/>
-                                               <reference key="parent" ref="919178355"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5167</int>
-                                               <reference key="object" ref="987137669"/>
+                                               <int key="objectID">5521</int>
+                                               <reference key="object" ref="398989741"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="537000521"/>
+                                                       <reference ref="506346481"/>
                                                </object>
-                                               <reference key="parent" ref="1053078401"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5168</int>
-                                               <reference key="object" ref="537000521"/>
-                                               <reference key="parent" ref="987137669"/>
+                                               <int key="objectID">5522</int>
+                                               <reference key="object" ref="506346481"/>
+                                               <reference key="parent" ref="398989741"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5171</int>
-                                               <reference key="object" ref="503933842"/>
+                                               <int key="objectID">5523</int>
+                                               <reference key="object" ref="164276139"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="109092334"/>
+                                                       <reference ref="1039518079"/>
                                                </object>
-                                               <reference key="parent" ref="1053078401"/>
+                                               <reference key="parent" ref="168918359"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5172</int>
-                                               <reference key="object" ref="109092334"/>
-                                               <reference key="parent" ref="503933842"/>
+                                               <int key="objectID">5524</int>
+                                               <reference key="object" ref="1039518079"/>
+                                               <reference key="parent" ref="164276139"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5174</int>
-                                               <reference key="object" ref="690304958"/>
+                                               <int key="objectID">5534</int>
+                                               <reference key="object" ref="959722284"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="923732752"/>
+                                                       <reference ref="100898939"/>
                                                </object>
-                                               <reference key="parent" ref="1053078401"/>
+                                               <reference key="parent" ref="440990725"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5175</int>
-                                               <reference key="object" ref="923732752"/>
+                                               <int key="objectID">5535</int>
+                                               <reference key="object" ref="100898939"/>
+                                               <reference key="parent" ref="959722284"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5536</int>
+                                               <reference key="object" ref="931485910"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="580574518"/>
+                                                       <reference ref="843416672"/>
                                                </object>
-                                               <reference key="parent" ref="690304958"/>
+                                               <reference key="parent" ref="440990725"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5177</int>
-                                               <reference key="object" ref="323705695"/>
+                                               <int key="objectID">5537</int>
+                                               <reference key="object" ref="843416672"/>
+                                               <reference key="parent" ref="931485910"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5545</int>
+                                               <reference key="object" ref="852146403"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="936221726"/>
+                                                       <reference ref="409419177"/>
                                                </object>
                                                <reference key="parent" ref="1053078401"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5178</int>
-                                               <reference key="object" ref="936221726"/>
-                                               <reference key="parent" ref="323705695"/>
+                                               <int key="objectID">5546</int>
+                                               <reference key="object" ref="409419177"/>
+                                               <reference key="parent" ref="852146403"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5180</int>
-                                               <reference key="object" ref="303369850"/>
+                                               <int key="objectID">5670</int>
+                                               <reference key="object" ref="277759901"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="677126774"/>
+                                                       <reference ref="522324466"/>
+                                                       <reference ref="358179065"/>
+                                                       <reference ref="525081109"/>
                                                </object>
-                                               <reference key="parent" ref="168918359"/>
+                                               <reference key="parent" ref="69290042"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5181</int>
-                                               <reference key="object" ref="460320725"/>
+                                               <int key="objectID">5549</int>
+                                               <reference key="object" ref="522324466"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="567459641"/>
+                                                       <reference ref="862361869"/>
                                                </object>
-                                               <reference key="parent" ref="168918359"/>
+                                               <reference key="parent" ref="277759901"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5182</int>
-                                               <reference key="object" ref="567459641"/>
+                                               <int key="objectID">5550</int>
+                                               <reference key="object" ref="862361869"/>
+                                               <reference key="parent" ref="522324466"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5553</int>
+                                               <reference key="object" ref="358179065"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="651682595"/>
+                                                       <reference ref="14541127"/>
                                                </object>
-                                               <reference key="parent" ref="460320725"/>
+                                               <reference key="parent" ref="277759901"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5183</int>
-                                               <reference key="object" ref="651682595"/>
+                                               <int key="objectID">5554</int>
+                                               <reference key="object" ref="14541127"/>
+                                               <reference key="parent" ref="358179065"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5551</int>
+                                               <reference key="object" ref="525081109"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="62890346"/>
+                                                       <reference ref="945554305"/>
                                                </object>
-                                               <reference key="parent" ref="567459641"/>
+                                               <reference key="parent" ref="277759901"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5184</int>
-                                               <reference key="object" ref="62890346"/>
-                                               <reference key="parent" ref="651682595"/>
+                                               <int key="objectID">5552</int>
+                                               <reference key="object" ref="945554305"/>
+                                               <reference key="parent" ref="525081109"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5185</int>
-                                               <reference key="object" ref="677126774"/>
-                                               <reference key="parent" ref="303369850"/>
+                                               <int key="objectID">5673</int>
+                                               <reference key="object" ref="681233637"/>
+                                               <reference key="parent" ref="0"/>
+                                               <string key="objectName">Audio Controller</string>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5188</int>
-                                               <reference key="object" ref="734454745"/>
-                                               <reference key="parent" ref="112579544"/>
+                                               <int key="objectID">5674</int>
+                                               <reference key="object" ref="141316080"/>
+                                               <reference key="parent" ref="0"/>
+                                               <string key="objectName">Audios</string>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5192</int>
-                                               <reference key="object" ref="685593004"/>
-                                               <reference key="parent" ref="112579544"/>
+                                               <int key="objectID">5676</int>
+                                               <reference key="object" ref="869523098"/>
+                                               <reference key="parent" ref="0"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5194</int>
-                                               <reference key="object" ref="799016137"/>
+                                               <int key="objectID">5680</int>
+                                               <reference key="object" ref="577274772"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="756255803"/>
+                                                       <reference ref="933946879"/>
+                                                       <reference ref="883603583"/>
                                                </object>
-                                               <reference key="parent" ref="712502892"/>
+                                               <reference key="parent" ref="738554558"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5195</int>
-                                               <reference key="object" ref="756255803"/>
+                                               <int key="objectID">5681</int>
+                                               <reference key="object" ref="883603583"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="596256174"/>
-                                                       <reference ref="377401502"/>
+                                                       <reference ref="327570663"/>
                                                </object>
-                                               <reference key="parent" ref="799016137"/>
+                                               <reference key="parent" ref="577274772"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5196</int>
-                                               <reference key="object" ref="596256174"/>
+                                               <int key="objectID">5682</int>
+                                               <reference key="object" ref="933946879"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="40751315"/>
-                                                       <reference ref="892147391"/>
-                                                       <reference ref="587237088"/>
-                                                       <reference ref="569585004"/>
+                                                       <reference ref="146611085"/>
+                                                       <reference ref="792464451"/>
+                                                       <reference ref="821562152"/>
+                                                       <reference ref="496546489"/>
                                                </object>
-                                               <reference key="parent" ref="756255803"/>
+                                               <reference key="parent" ref="577274772"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5197</int>
-                                               <reference key="object" ref="40751315"/>
-                                               <reference key="parent" ref="596256174"/>
+                                               <int key="objectID">5683</int>
+                                               <reference key="object" ref="146611085"/>
+                                               <reference key="parent" ref="933946879"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5198</int>
-                                               <reference key="object" ref="892147391"/>
-                                               <reference key="parent" ref="596256174"/>
+                                               <int key="objectID">5684</int>
+                                               <reference key="object" ref="792464451"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="581296833"/>
+                                                       <reference ref="393032802"/>
+                                                       <reference ref="596723553"/>
+                                                       <reference ref="1063255"/>
+                                                       <reference ref="590927656"/>
+                                                       <reference ref="200958136"/>
+                                                       <reference ref="33212493"/>
+                                               </object>
+                                               <reference key="parent" ref="933946879"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5199</int>
-                                               <reference key="object" ref="587237088"/>
+                                               <int key="objectID">5685</int>
+                                               <reference key="object" ref="821562152"/>
+                                               <reference key="parent" ref="933946879"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5686</int>
+                                               <reference key="object" ref="496546489"/>
+                                               <reference key="parent" ref="933946879"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5687</int>
+                                               <reference key="object" ref="581296833"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="274341565"/>
-                                                       <reference ref="1033748386"/>
-                                                       <reference ref="362209136"/>
-                                                       <reference ref="270619684"/>
-                                                       <reference ref="116912874"/>
-                                                       <reference ref="180322215"/>
-                                                       <reference ref="526590234"/>
+                                                       <reference ref="750418243"/>
                                                </object>
-                                               <reference key="parent" ref="596256174"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5201</int>
-                                               <reference key="object" ref="274341565"/>
+                                               <int key="objectID">5688</int>
+                                               <reference key="object" ref="393032802"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="426946554"/>
+                                                       <reference ref="852982078"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5215</int>
-                                               <reference key="object" ref="1033748386"/>
+                                               <int key="objectID">5689</int>
+                                               <reference key="object" ref="596723553"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="13236417"/>
+                                                       <reference ref="238248766"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5217</int>
-                                               <reference key="object" ref="362209136"/>
+                                               <int key="objectID">5690</int>
+                                               <reference key="object" ref="1063255"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="704907857"/>
+                                                       <reference ref="257530638"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5219</int>
-                                               <reference key="object" ref="270619684"/>
+                                               <int key="objectID">5691</int>
+                                               <reference key="object" ref="590927656"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="299034685"/>
+                                                       <reference ref="1037917692"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5225</int>
-                                               <reference key="object" ref="426946554"/>
+                                               <int key="objectID">5692</int>
+                                               <reference key="object" ref="200958136"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="472498711"/>
+                                                       <reference ref="4014313"/>
                                                </object>
-                                               <reference key="parent" ref="274341565"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5226</int>
-                                               <reference key="object" ref="472498711"/>
+                                               <int key="objectID">5693</int>
+                                               <reference key="object" ref="33212493"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="1026748451"/>
+                                                       <reference ref="871837653"/>
                                                </object>
-                                               <reference key="parent" ref="426946554"/>
+                                               <reference key="parent" ref="792464451"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5227</int>
-                                               <reference key="object" ref="1026748451"/>
-                                               <reference key="parent" ref="472498711"/>
+                                               <int key="objectID">5694</int>
+                                               <reference key="object" ref="871837653"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="513335837"/>
+                                               </object>
+                                               <reference key="parent" ref="33212493"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5232</int>
-                                               <reference key="object" ref="13236417"/>
-                                               <reference key="parent" ref="1033748386"/>
+                                               <int key="objectID">5695</int>
+                                               <reference key="object" ref="513335837"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="677045788"/>
+                                               </object>
+                                               <reference key="parent" ref="871837653"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5233</int>
-                                               <reference key="object" ref="704907857"/>
-                                               <reference key="parent" ref="362209136"/>
+                                               <int key="objectID">5696</int>
+                                               <reference key="object" ref="677045788"/>
+                                               <reference key="parent" ref="513335837"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5234</int>
-                                               <reference key="object" ref="299034685"/>
-                                               <reference key="parent" ref="270619684"/>
+                                               <int key="objectID">5706</int>
+                                               <reference key="object" ref="750418243"/>
+                                               <reference key="parent" ref="581296833"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5244</int>
-                                               <reference key="object" ref="569585004"/>
-                                               <reference key="parent" ref="596256174"/>
+                                               <int key="objectID">5707</int>
+                                               <reference key="object" ref="327570663"/>
+                                               <reference key="parent" ref="883603583"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5246</int>
-                                               <reference key="object" ref="377401502"/>
+                                               <int key="objectID">5712</int>
+                                               <reference key="object" ref="4014313"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="206924163"/>
+                                                       <reference ref="525066294"/>
                                                </object>
-                                               <reference key="parent" ref="756255803"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5247</int>
-                                               <reference key="object" ref="206924163"/>
-                                               <reference key="parent" ref="377401502"/>
+                                               <reference key="parent" ref="200958136"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5250</int>
-                                               <reference key="object" ref="116912874"/>
+                                               <int key="objectID">5713</int>
+                                               <reference key="object" ref="525066294"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="688461412"/>
+                                                       <reference ref="1058317103"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="4014313"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5252</int>
-                                               <reference key="object" ref="180322215"/>
+                                               <int key="objectID">5714</int>
+                                               <reference key="object" ref="1058317103"/>
+                                               <reference key="parent" ref="525066294"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5715</int>
+                                               <reference key="object" ref="1037917692"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="483232645"/>
+                                                       <reference ref="966554680"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="590927656"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5254</int>
-                                               <reference key="object" ref="526590234"/>
+                                               <int key="objectID">5716</int>
+                                               <reference key="object" ref="966554680"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="43785715"/>
+                                                       <reference ref="106742036"/>
                                                </object>
-                                               <reference key="parent" ref="587237088"/>
+                                               <reference key="parent" ref="1037917692"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5268</int>
-                                               <reference key="object" ref="688461412"/>
+                                               <int key="objectID">5717</int>
+                                               <reference key="object" ref="106742036"/>
+                                               <reference key="parent" ref="966554680"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">5718</int>
+                                               <reference key="object" ref="257530638"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="808277525"/>
+                                                       <reference ref="640929469"/>
                                                </object>
-                                               <reference key="parent" ref="116912874"/>
+                                               <reference key="parent" ref="1063255"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5269</int>
-                                               <reference key="object" ref="808277525"/>
+                                               <int key="objectID">5719</int>
+                                               <reference key="object" ref="640929469"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="341659302"/>
+                                                       <reference ref="713274619"/>
                                                </object>
-                                               <reference key="parent" ref="688461412"/>
+                                               <reference key="parent" ref="257530638"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5270</int>
-                                               <reference key="object" ref="341659302"/>
-                                               <reference key="parent" ref="808277525"/>
+                                               <int key="objectID">5720</int>
+                                               <reference key="object" ref="713274619"/>
+                                               <reference key="parent" ref="640929469"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5271</int>
-                                               <reference key="object" ref="483232645"/>
+                                               <int key="objectID">5721</int>
+                                               <reference key="object" ref="238248766"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="427130300"/>
+                                                       <reference ref="764294190"/>
                                                </object>
-                                               <reference key="parent" ref="180322215"/>
+                                               <reference key="parent" ref="596723553"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5272</int>
-                                               <reference key="object" ref="427130300"/>
+                                               <int key="objectID">5722</int>
+                                               <reference key="object" ref="764294190"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="66454705"/>
+                                                       <reference ref="452766579"/>
                                                </object>
-                                               <reference key="parent" ref="483232645"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5273</int>
-                                               <reference key="object" ref="66454705"/>
-                                               <reference key="parent" ref="427130300"/>
+                                               <reference key="parent" ref="238248766"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5278</int>
-                                               <reference key="object" ref="43785715"/>
-                                               <reference key="parent" ref="526590234"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">5279</int>
-                                               <reference key="object" ref="580574518"/>
-                                               <reference key="parent" ref="923732752"/>
+                                               <int key="objectID">5723</int>
+                                               <reference key="object" ref="452766579"/>
+                                               <reference key="parent" ref="764294190"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">5280</int>
-                                               <reference key="object" ref="750596130"/>
-                                               <reference key="parent" ref="1035150210"/>
+                                               <int key="objectID">5724</int>
+                                               <reference key="object" ref="852982078"/>
+                                               <reference key="parent" ref="393032802"/>
                                        </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSMutableArray" key="dict.sortedKeys">
+                               <object class="NSArray" key="dict.sortedKeys">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                       <string>-1.IBPluginDependency</string>
-                                       <string>-2.IBPluginDependency</string>
                                        <string>-3.IBPluginDependency</string>
                                        <string>-3.ImportedFromIB2</string>
                                        <string>1123.IBPluginDependency</string>
                                        <string>1514.ImportedFromIB2</string>
                                        <string>1515.IBPluginDependency</string>
                                        <string>1515.ImportedFromIB2</string>
-                                       <string>1518.IBPluginDependency</string>
-                                       <string>1518.ImportedFromIB2</string>
-                                       <string>1519.IBPluginDependency</string>
-                                       <string>1519.ImportedFromIB2</string>
-                                       <string>1520.IBPluginDependency</string>
-                                       <string>1520.ImportedFromIB2</string>
-                                       <string>1521.IBPluginDependency</string>
-                                       <string>1521.ImportedFromIB2</string>
-                                       <string>1522.IBPluginDependency</string>
-                                       <string>1522.ImportedFromIB2</string>
-                                       <string>1523.IBPluginDependency</string>
-                                       <string>1523.ImportedFromIB2</string>
-                                       <string>1524.IBPluginDependency</string>
-                                       <string>1524.ImportedFromIB2</string>
-                                       <string>1525.IBPluginDependency</string>
-                                       <string>1525.ImportedFromIB2</string>
-                                       <string>1526.IBPluginDependency</string>
-                                       <string>1526.ImportedFromIB2</string>
-                                       <string>1527.IBPluginDependency</string>
-                                       <string>1527.ImportedFromIB2</string>
-                                       <string>1528.IBPluginDependency</string>
-                                       <string>1528.ImportedFromIB2</string>
-                                       <string>1528.editorWindowContentRectSynchronizationRect</string>
-                                       <string>1529.IBPluginDependency</string>
-                                       <string>1529.ImportedFromIB2</string>
-                                       <string>1530.IBPluginDependency</string>
-                                       <string>1530.ImportedFromIB2</string>
-                                       <string>1531.IBPluginDependency</string>
-                                       <string>1531.ImportedFromIB2</string>
-                                       <string>1532.IBPluginDependency</string>
-                                       <string>1532.ImportedFromIB2</string>
-                                       <string>1533.IBPluginDependency</string>
-                                       <string>1533.ImportedFromIB2</string>
                                        <string>1538.IBPluginDependency</string>
                                        <string>1538.ImportedFromIB2</string>
                                        <string>1539.IBPluginDependency</string>
                                        <string>1542.ImportedFromIB2</string>
                                        <string>1543.IBPluginDependency</string>
                                        <string>1543.ImportedFromIB2</string>
-                                       <string>1544.IBPluginDependency</string>
-                                       <string>1544.ImportedFromIB2</string>
                                        <string>1545.IBPluginDependency</string>
                                        <string>1545.ImportedFromIB2</string>
                                        <string>1546.IBPluginDependency</string>
                                        <string>1549.ImportedFromIB2</string>
                                        <string>1550.IBPluginDependency</string>
                                        <string>1550.ImportedFromIB2</string>
-                                       <string>1551.IBPluginDependency</string>
-                                       <string>1551.ImportedFromIB2</string>
                                        <string>1552.IBPluginDependency</string>
                                        <string>1552.ImportedFromIB2</string>
                                        <string>1553.IBPluginDependency</string>
                                        <string>1843.ImportedFromIB2</string>
                                        <string>1843.editorWindowContentRectSynchronizationRect</string>
                                        <string>1867.IBEditorWindowLastContentRect</string>
+                                       <string>1867.IBPluginDependency</string>
                                        <string>1867.IBWindowTemplateEditedContentRect</string>
                                        <string>1867.ImportedFromIB2</string>
                                        <string>1867.editorWindowContentRectSynchronizationRect</string>
                                        <string>1955.ImportedFromIB2</string>
                                        <string>196.IBPluginDependency</string>
                                        <string>196.ImportedFromIB2</string>
-                                       <string>1962.IBPluginDependency</string>
-                                       <string>1962.ImportedFromIB2</string>
-                                       <string>1963.IBPluginDependency</string>
-                                       <string>1963.ImportedFromIB2</string>
-                                       <string>1964.IBPluginDependency</string>
-                                       <string>1964.ImportedFromIB2</string>
-                                       <string>1966.IBPluginDependency</string>
-                                       <string>1966.ImportedFromIB2</string>
-                                       <string>1967.IBPluginDependency</string>
-                                       <string>1967.ImportedFromIB2</string>
-                                       <string>1967.editorWindowContentRectSynchronizationRect</string>
-                                       <string>1968.IBPluginDependency</string>
-                                       <string>1968.ImportedFromIB2</string>
-                                       <string>1970.IBPluginDependency</string>
-                                       <string>1970.ImportedFromIB2</string>
-                                       <string>1972.IBPluginDependency</string>
-                                       <string>1972.ImportedFromIB2</string>
                                        <string>1985.IBPluginDependency</string>
                                        <string>1985.ImportedFromIB2</string>
                                        <string>1989.IBPluginDependency</string>
                                        <string>2006.ImportedFromIB2</string>
                                        <string>2008.IBPluginDependency</string>
                                        <string>2008.ImportedFromIB2</string>
+                                       <string>2009.IBEditorWindowLastContentRect</string>
                                        <string>2009.IBPluginDependency</string>
                                        <string>2009.ImportedFromIB2</string>
                                        <string>2010.IBPluginDependency</string>
                                        <string>2016.IBPluginDependency</string>
                                        <string>2016.ImportedFromIB2</string>
                                        <string>21.IBEditorWindowLastContentRect</string>
+                                       <string>21.IBPluginDependency</string>
                                        <string>21.IBViewEditorWindowController.showingLayoutRectangles</string>
                                        <string>21.IBWindowTemplateEditedContentRect</string>
                                        <string>21.ImportedFromIB2</string>
                                        <string>2368.ImportedFromIB2</string>
                                        <string>2375.IBPluginDependency</string>
                                        <string>2375.ImportedFromIB2</string>
-                                       <string>240.IBPluginDependency</string>
                                        <string>240.ImportedFromIB2</string>
                                        <string>2421.IBPluginDependency</string>
                                        <string>2421.ImportedFromIB2</string>
                                        <string>2698.IBPluginDependency</string>
                                        <string>2698.ImportedFromIB2</string>
                                        <string>2701.IBEditorWindowLastContentRect</string>
+                                       <string>2701.IBPluginDependency</string>
                                        <string>2701.IBWindowTemplateEditedContentRect</string>
                                        <string>2701.ImportedFromIB2</string>
                                        <string>2701.editorWindowContentRectSynchronizationRect</string>
                                        <string>29.editorWindowContentRectSynchronizationRect</string>
                                        <string>2957.IBPluginDependency</string>
                                        <string>2957.ImportedFromIB2</string>
-                                       <string>3075.IBPluginDependency</string>
-                                       <string>3075.ImportedFromIB2</string>
-                                       <string>3077.IBPluginDependency</string>
-                                       <string>3077.ImportedFromIB2</string>
                                        <string>3203.IBPluginDependency</string>
                                        <string>3203.ImportedFromIB2</string>
                                        <string>3205.IBPluginDependency</string>
                                        <string>4317.ImportedFromIB2</string>
                                        <string>4322.IBPluginDependency</string>
                                        <string>4322.ImportedFromIB2</string>
+                                       <string>434.IBPluginDependency</string>
                                        <string>434.IBWindowTemplateEditedContentRect</string>
                                        <string>434.ImportedFromIB2</string>
                                        <string>434.editorWindowContentRectSynchronizationRect</string>
                                        <string>4579.IBPluginDependency</string>
                                        <string>4579.ImportedFromIB2</string>
                                        <string>4846.IBPluginDependency</string>
-                                       <string>4847.IBPluginDependency</string>
-                                       <string>4848.IBPluginDependency</string>
-                                       <string>4849.IBPluginDependency</string>
-                                       <string>4850.IBPluginDependency</string>
-                                       <string>4851.IBPluginDependency</string>
-                                       <string>4852.IBPluginDependency</string>
-                                       <string>4853.IBPluginDependency</string>
-                                       <string>4854.IBPluginDependency</string>
-                                       <string>4857.IBPluginDependency</string>
-                                       <string>4858.IBPluginDependency</string>
-                                       <string>4859.IBPluginDependency</string>
-                                       <string>4860.IBPluginDependency</string>
-                                       <string>4862.IBPluginDependency</string>
                                        <string>4872.IBPluginDependency</string>
                                        <string>4873.IBPluginDependency</string>
                                        <string>4874.IBPluginDependency</string>
                                        <string>4906.IBPluginDependency</string>
                                        <string>4907.IBPluginDependency</string>
                                        <string>4908.IBPluginDependency</string>
-                                       <string>4909.IBPluginDependency</string>
                                        <string>4910.IBPluginDependency</string>
                                        <string>4911.IBPluginDependency</string>
-                                       <string>4912.IBPluginDependency</string>
                                        <string>4913.IBPluginDependency</string>
                                        <string>4914.IBPluginDependency</string>
                                        <string>4915.IBPluginDependency</string>
                                        <string>4960.IBShouldRemoveOnLegacySave</string>
                                        <string>4961.IBPluginDependency</string>
                                        <string>4961.IBShouldRemoveOnLegacySave</string>
-                                       <string>4963.IBPluginDependency</string>
                                        <string>4964.IBPluginDependency</string>
                                        <string>4967.IBAttributePlaceholdersKey</string>
                                        <string>4967.IBPluginDependency</string>
                                        <string>4967.ImportedFromIB2</string>
                                        <string>4968.IBPluginDependency</string>
-                                       <string>4980.IBPluginDependency</string>
-                                       <string>4980.ImportedFromIB2</string>
-                                       <string>4981.IBPluginDependency</string>
-                                       <string>4982.IBPluginDependency</string>
-                                       <string>4982.ImportedFromIB2</string>
-                                       <string>4983.IBPluginDependency</string>
-                                       <string>4983.ImportedFromIB2</string>
-                                       <string>4984.IBPluginDependency</string>
-                                       <string>4984.ImportedFromIB2</string>
-                                       <string>4985.IBPluginDependency</string>
-                                       <string>4986.IBPluginDependency</string>
-                                       <string>4986.ImportedFromIB2</string>
-                                       <string>4987.IBPluginDependency</string>
-                                       <string>4987.ImportedFromIB2</string>
-                                       <string>4988.IBPluginDependency</string>
-                                       <string>4988.ImportedFromIB2</string>
-                                       <string>4989.IBPluginDependency</string>
-                                       <string>4992.IBPluginDependency</string>
-                                       <string>4992.ImportedFromIB2</string>
-                                       <string>4993.IBPluginDependency</string>
-                                       <string>4994.IBPluginDependency</string>
-                                       <string>4994.ImportedFromIB2</string>
-                                       <string>4995.IBPluginDependency</string>
-                                       <string>4996.IBPluginDependency</string>
-                                       <string>4996.ImportedFromIB2</string>
-                                       <string>4997.IBPluginDependency</string>
-                                       <string>4998.IBPluginDependency</string>
-                                       <string>4998.ImportedFromIB2</string>
-                                       <string>4999.IBPluginDependency</string>
-                                       <string>4999.ImportedFromIB2</string>
-                                       <string>5000.IBPluginDependency</string>
-                                       <string>5000.ImportedFromIB2</string>
-                                       <string>5001.IBPluginDependency</string>
-                                       <string>5002.IBPluginDependency</string>
-                                       <string>5002.ImportedFromIB2</string>
-                                       <string>5003.IBPluginDependency</string>
-                                       <string>5003.ImportedFromIB2</string>
-                                       <string>5004.IBPluginDependency</string>
-                                       <string>5004.ImportedFromIB2</string>
-                                       <string>5005.IBPluginDependency</string>
-                                       <string>5006.IBPluginDependency</string>
-                                       <string>5006.ImportedFromIB2</string>
-                                       <string>5007.IBPluginDependency</string>
-                                       <string>5007.ImportedFromIB2</string>
-                                       <string>5008.IBPluginDependency</string>
-                                       <string>5008.ImportedFromIB2</string>
-                                       <string>5009.IBPluginDependency</string>
-                                       <string>5010.IBPluginDependency</string>
-                                       <string>5010.ImportedFromIB2</string>
-                                       <string>5011.IBPluginDependency</string>
-                                       <string>5011.ImportedFromIB2</string>
-                                       <string>5012.IBPluginDependency</string>
-                                       <string>5012.ImportedFromIB2</string>
-                                       <string>5013.IBPluginDependency</string>
-                                       <string>5014.IBPluginDependency</string>
-                                       <string>5014.ImportedFromIB2</string>
-                                       <string>5014.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5015.IBPluginDependency</string>
-                                       <string>5015.ImportedFromIB2</string>
-                                       <string>5016.IBPluginDependency</string>
-                                       <string>5016.ImportedFromIB2</string>
-                                       <string>5017.IBPluginDependency</string>
-                                       <string>5018.IBPluginDependency</string>
-                                       <string>5018.ImportedFromIB2</string>
-                                       <string>5018.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5019.IBPluginDependency</string>
-                                       <string>5019.ImportedFromIB2</string>
-                                       <string>5040.IBPluginDependency</string>
-                                       <string>5040.ImportedFromIB2</string>
-                                       <string>5041.IBPluginDependency</string>
-                                       <string>5042.IBPluginDependency</string>
-                                       <string>5042.ImportedFromIB2</string>
-                                       <string>5043.IBPluginDependency</string>
-                                       <string>5043.ImportedFromIB2</string>
-                                       <string>5044.IBPluginDependency</string>
-                                       <string>5044.ImportedFromIB2</string>
-                                       <string>5045.IBPluginDependency</string>
-                                       <string>5046.IBPluginDependency</string>
-                                       <string>5046.ImportedFromIB2</string>
-                                       <string>5047.IBPluginDependency</string>
-                                       <string>5047.ImportedFromIB2</string>
-                                       <string>5048.IBPluginDependency</string>
-                                       <string>5048.ImportedFromIB2</string>
-                                       <string>5049.IBPluginDependency</string>
-                                       <string>5050.IBPluginDependency</string>
-                                       <string>5050.ImportedFromIB2</string>
-                                       <string>5050.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5051.IBPluginDependency</string>
-                                       <string>5051.ImportedFromIB2</string>
-                                       <string>5052.IBPluginDependency</string>
-                                       <string>5052.ImportedFromIB2</string>
-                                       <string>5053.IBPluginDependency</string>
-                                       <string>5054.IBPluginDependency</string>
-                                       <string>5054.ImportedFromIB2</string>
-                                       <string>5054.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5055.IBPluginDependency</string>
-                                       <string>5055.ImportedFromIB2</string>
-                                       <string>5056.IBPluginDependency</string>
-                                       <string>5056.ImportedFromIB2</string>
-                                       <string>5057.IBPluginDependency</string>
-                                       <string>5058.IBPluginDependency</string>
-                                       <string>5058.ImportedFromIB2</string>
-                                       <string>5058.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5059.IBPluginDependency</string>
-                                       <string>5059.ImportedFromIB2</string>
-                                       <string>5060.IBPluginDependency</string>
-                                       <string>5060.ImportedFromIB2</string>
-                                       <string>5061.IBPluginDependency</string>
-                                       <string>5062.IBPluginDependency</string>
-                                       <string>5062.ImportedFromIB2</string>
-                                       <string>5062.editorWindowContentRectSynchronizationRect</string>
-                                       <string>5063.IBPluginDependency</string>
-                                       <string>5063.ImportedFromIB2</string>
-                                       <string>5091.IBPluginDependency</string>
-                                       <string>5092.IBPluginDependency</string>
-                                       <string>5093.IBPluginDependency</string>
-                                       <string>5094.IBPluginDependency</string>
-                                       <string>5095.IBPluginDependency</string>
-                                       <string>5096.IBPluginDependency</string>
-                                       <string>5097.IBPluginDependency</string>
-                                       <string>5098.IBPluginDependency</string>
-                                       <string>5099.IBPluginDependency</string>
-                                       <string>5099.ImportedFromIB2</string>
-                                       <string>5100.IBPluginDependency</string>
-                                       <string>5101.IBPluginDependency</string>
-                                       <string>5101.ImportedFromIB2</string>
-                                       <string>5102.IBPluginDependency</string>
-                                       <string>5103.IBPluginDependency</string>
-                                       <string>5103.ImportedFromIB2</string>
-                                       <string>5104.IBPluginDependency</string>
-                                       <string>5105.IBPluginDependency</string>
-                                       <string>5105.ImportedFromIB2</string>
-                                       <string>5106.IBPluginDependency</string>
-                                       <string>5107.IBPluginDependency</string>
-                                       <string>5107.ImportedFromIB2</string>
-                                       <string>5108.IBPluginDependency</string>
                                        <string>5130.IBPluginDependency</string>
                                        <string>5131.IBPluginDependency</string>
                                        <string>5132.IBEditorWindowLastContentRect</string>
                                        <string>5279.IBPluginDependency</string>
                                        <string>5280.IBPluginDependency</string>
                                        <string>5280.ImportedFromIB2</string>
+                                       <string>5491.IBPluginDependency</string>
+                                       <string>5491.ImportedFromIB2</string>
+                                       <string>5492.IBPluginDependency</string>
+                                       <string>5493.IBPluginDependency</string>
+                                       <string>5493.ImportedFromIB2</string>
+                                       <string>5494.IBPluginDependency</string>
+                                       <string>5505.IBPluginDependency</string>
+                                       <string>5505.ImportedFromIB2</string>
+                                       <string>5506.IBPluginDependency</string>
+                                       <string>5513.IBPluginDependency</string>
+                                       <string>5513.ImportedFromIB2</string>
+                                       <string>5514.IBPluginDependency</string>
+                                       <string>5515.IBEditorWindowLastContentRect</string>
+                                       <string>5515.IBPluginDependency</string>
+                                       <string>5515.ImportedFromIB2</string>
+                                       <string>5521.IBPluginDependency</string>
+                                       <string>5521.ImportedFromIB2</string>
+                                       <string>5522.IBPluginDependency</string>
+                                       <string>5523.IBPluginDependency</string>
+                                       <string>5523.ImportedFromIB2</string>
+                                       <string>5524.IBPluginDependency</string>
+                                       <string>5534.IBPluginDependency</string>
+                                       <string>5535.IBPluginDependency</string>
+                                       <string>5536.IBPluginDependency</string>
+                                       <string>5537.IBPluginDependency</string>
+                                       <string>5545.IBPluginDependency</string>
+                                       <string>5545.ImportedFromIB2</string>
+                                       <string>5546.IBPluginDependency</string>
+                                       <string>5549.IBPluginDependency</string>
+                                       <string>5549.ImportedFromIB2</string>
+                                       <string>5550.IBPluginDependency</string>
+                                       <string>5551.IBPluginDependency</string>
+                                       <string>5551.ImportedFromIB2</string>
+                                       <string>5552.IBPluginDependency</string>
+                                       <string>5553.IBPluginDependency</string>
+                                       <string>5553.ImportedFromIB2</string>
+                                       <string>5554.IBPluginDependency</string>
                                        <string>56.IBPluginDependency</string>
                                        <string>56.ImportedFromIB2</string>
+                                       <string>5670.IBPluginDependency</string>
+                                       <string>5674.IBPluginDependency</string>
+                                       <string>5676.IBPluginDependency</string>
+                                       <string>5680.IBPluginDependency</string>
+                                       <string>5681.IBPluginDependency</string>
+                                       <string>5682.IBPluginDependency</string>
+                                       <string>5683.IBPluginDependency</string>
+                                       <string>5684.IBPluginDependency</string>
+                                       <string>5685.IBPluginDependency</string>
+                                       <string>5686.IBPluginDependency</string>
+                                       <string>5687.IBPluginDependency</string>
+                                       <string>5688.IBPluginDependency</string>
+                                       <string>5689.IBPluginDependency</string>
+                                       <string>5690.IBPluginDependency</string>
+                                       <string>5691.IBPluginDependency</string>
+                                       <string>5692.IBPluginDependency</string>
+                                       <string>5693.IBPluginDependency</string>
+                                       <string>5694.IBPluginDependency</string>
+                                       <string>5695.IBEditorWindowLastContentRect</string>
+                                       <string>5695.IBPluginDependency</string>
+                                       <string>5696.IBPluginDependency</string>
                                        <string>57.IBEditorWindowLastContentRect</string>
                                        <string>57.IBPluginDependency</string>
                                        <string>57.ImportedFromIB2</string>
                                        <string>57.editorWindowContentRectSynchronizationRect</string>
+                                       <string>5706.IBPluginDependency</string>
+                                       <string>5707.IBPluginDependency</string>
+                                       <string>5712.IBPluginDependency</string>
+                                       <string>5713.IBEditorWindowLastContentRect</string>
+                                       <string>5713.IBPluginDependency</string>
+                                       <string>5714.IBPluginDependency</string>
+                                       <string>5715.IBPluginDependency</string>
+                                       <string>5716.IBEditorWindowLastContentRect</string>
+                                       <string>5716.IBPluginDependency</string>
+                                       <string>5717.IBPluginDependency</string>
+                                       <string>5718.IBPluginDependency</string>
+                                       <string>5719.IBEditorWindowLastContentRect</string>
+                                       <string>5719.IBPluginDependency</string>
+                                       <string>5720.IBPluginDependency</string>
+                                       <string>5721.IBPluginDependency</string>
+                                       <string>5722.IBEditorWindowLastContentRect</string>
+                                       <string>5722.IBPluginDependency</string>
+                                       <string>5723.IBPluginDependency</string>
+                                       <string>5724.IBPluginDependency</string>
                                        <string>58.IBPluginDependency</string>
                                        <string>58.ImportedFromIB2</string>
                                        <string>970.IBPluginDependency</string>
                                        <string>973.IBPluginDependency</string>
                                        <string>973.ImportedFromIB2</string>
                                </object>
-                               <object class="NSMutableArray" key="dict.values">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{587, 747}, {211, 183}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{434, 787}, {284, 143}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <object class="NSMutableDictionary">
-                                               <string key="NS.key.0">InitialTabViewItem</string>
-                                               <object class="IBInitialTabViewItemAttribute" key="NS.object.0">
-                                                       <string key="name">InitialTabViewItem</string>
-                                                       <reference key="object" ref="712502892"/>
-                                                       <reference key="initialTabViewItem" ref="107038816"/>
-                                               </object>
+                               <object class="NSMutableArray" key="dict.values">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{587, 747}, {211, 183}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{434, 787}, {284, 143}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">InitialTabViewItem</string>
+                                               <object class="IBInitialTabViewItemAttribute" key="NS.object.0">
+                                                       <string key="name">InitialTabViewItem</string>
+                                                       <reference key="object" ref="712502892"/>
+                                                       <reference key="initialTabViewItem" ref="107038816"/>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{476, 687}, {253, 243}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{454, 306}, {270, 550}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="0"/>
+                                       <integer value="1"/>
+                                       <string>{{720, 261}, {270, 550}}</string>
+                                       <string>{{329, 373}, {338, 318}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{329, 373}, {338, 318}}</string>
+                                       <integer value="1"/>
+                                       <string>{{421, 536}, {338, 318}}</string>
+                                       <boolean value="NO"/>
+                                       <integer value="1"/>
+                                       <string>{3.40282e+38, 3.40282e+38}</string>
+                                       <string>{338, 232}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{520, 797}, {236, 133}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{828, 695}, {155, 54}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{329, 210}, {754, 556}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <boolean value="YES"/>
+                                       <string>{{329, 210}, {754, 556}}</string>
+                                       <integer value="1"/>
+                                       <string>{{65, 541}, {760, 550}}</string>
+                                       <boolean value="NO"/>
+                                       <integer value="1"/>
+                                       <string>{3.40282e+38, 3.40282e+38}</string>
+                                       <string>{213, 107}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="553453876"/>
+                                                       <string key="toolTip">Caution: This option will likely break device compatiblity with all but the AppleTV Take 2. Checking this box enables a 64 bit mp4 file which can be over 4 GB.</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{72, 712}, {392, 144}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{72, 712}, {392, 144}}</string>
+                                       <integer value="1"/>
+                                       <string>{{303, 988}, {392, 144}}</string>
+                                       <boolean value="NO"/>
+                                       <integer value="1"/>
+                                       <string>{3.40282e+38, 3.40282e+38}</string>
+                                       <string>{213, 107}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{325, 836}, {394, 20}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{63, 836}, {394, 20}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>HBPresetsOutlineView</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{57, 766}, {300, 233}}</string>
+                                       <integer value="1"/>
+                                       <string>{{57, 766}, {300, 233}}</string>
+                                       <boolean value="NO"/>
+                                       <integer value="1"/>
+                                       <string>{3.40282e+38, 3.40282e+38}</string>
+                                       <string>{213, 107}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="581806074"/>
+                                                       <string key="toolTip">Mixed</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="921877174"/>
+                                                       <string key="toolTip">Mixed</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{304, 383}, {226, 63}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{923, 222}, {226, 63}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{154, 542}, {700, 18}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1041"/>
+                                       <boolean value="NO"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{551, 788}, {111, 4}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{154, 542}, {700, 18}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{337, 663}, {229, 173}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>{{75, 683}, {235, 153}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{154, 542}, {700, 18}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{154, 542}, {700, 18}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{359, 490}, {678, 20}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{154, 542}, {700, 18}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                               </object>
+                       </object>
+                       <object class="NSMutableDictionary" key="unlocalizedProperties">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <reference key="dict.sortedKeys" ref="0"/>
+                               <object class="NSMutableArray" key="dict.values">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               </object>
+                       </object>
+                       <nil key="activeLocalization"/>
+                       <object class="NSMutableDictionary" key="localizations">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <reference key="dict.sortedKeys" ref="0"/>
+                               <object class="NSMutableArray" key="dict.values">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               </object>
+                       </object>
+                       <nil key="sourceID"/>
+                       <int key="maxID">5793</int>
+               </object>
+               <object class="IBClassDescriber" key="IBDocument.Classes">
+                       <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">HBAudioController</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="NSMutableDictionary" key="outlets">
+                                               <string key="NS.key.0">myController</string>
+                                               <string key="NS.object.0">id</string>
+                                       </object>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBProjectSource</string>
+                                               <string key="minorKey">HBAudioController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">HBController</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>Cancel:</string>
+                                                       <string>Pause:</string>
+                                                       <string>Rip:</string>
+                                                       <string>addAllAudioTracks:</string>
+                                                       <string>addFactoryPresets:</string>
+                                                       <string>addPresetPicDropdownChanged:</string>
+                                                       <string>addToQueue:</string>
+                                                       <string>addUserPreset:</string>
+                                                       <string>applyQueueSettingsToMainWindow:</string>
+                                                       <string>autoSetM4vExtension:</string>
+                                                       <string>browseExportPresetFile:</string>
+                                                       <string>browseFile:</string>
+                                                       <string>browseForChapterFile:</string>
+                                                       <string>browseForChapterFileSave:</string>
+                                                       <string>browseImportPresetFile:</string>
+                                                       <string>browseImportSrtFile:</string>
+                                                       <string>browseSources:</string>
+                                                       <string>calculateBitrate:</string>
+                                                       <string>calculatePictureSizing:</string>
+                                                       <string>cancelScanning:</string>
+                                                       <string>chapterPopUpChanged:</string>
+                                                       <string>closeAddPresetPanel:</string>
+                                                       <string>closeSourceTitleScanPanel:</string>
+                                                       <string>customSettingUsed:</string>
+                                                       <string>deleteFactoryPresets:</string>
+                                                       <string>deletePreset:</string>
+                                                       <string>encodeStartStopPopUpChanged:</string>
+                                                       <string>formatPopUpChanged:</string>
+                                                       <string>getDefaultPresets:</string>
+                                                       <string>insertPreset:</string>
+                                                       <string>openForums:</string>
+                                                       <string>openHomepage:</string>
+                                                       <string>openMainWindow:</string>
+                                                       <string>openUserGuide:</string>
+                                                       <string>qualitySliderChanged:</string>
+                                                       <string>revertPictureSizeToMax:</string>
+                                                       <string>selectDefaultPreset:</string>
+                                                       <string>selectPreset:</string>
+                                                       <string>setDefaultPreset:</string>
+                                                       <string>showAboutPanel:</string>
+                                                       <string>showAddPresetPanel:</string>
+                                                       <string>showDebugOutputPanel:</string>
+                                                       <string>showNewScan:</string>
+                                                       <string>showPicturePanel:</string>
+                                                       <string>showPreferencesWindow:</string>
+                                                       <string>showPreviewWindow:</string>
+                                                       <string>showQueueWindow:</string>
+                                                       <string>showSourceTitleScanPanel:</string>
+                                                       <string>startEndFrameValueChanged:</string>
+                                                       <string>startEndSecValueChanged:</string>
+                                                       <string>titlePopUpChanged:</string>
+                                                       <string>twoPassCheckboxChanged:</string>
+                                                       <string>videoEncoderPopUpChanged:</string>
+                                                       <string>videoFrameRateChanged:</string>
+                                                       <string>videoMatrixChanged:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                               </object>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="outlets">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fAddPresetPanel</string>
+                                                       <string>fAdvancedView</string>
+                                                       <string>fAudioDelegate</string>
+                                                       <string>fBrowseSrtFileButton</string>
+                                                       <string>fChapterTable</string>
+                                                       <string>fChapterTableNameColumn</string>
+                                                       <string>fCreateChapterMarkers</string>
+                                                       <string>fDstBrowseButton</string>
+                                                       <string>fDstFile1Field</string>
+                                                       <string>fDstFile2Field</string>
+                                                       <string>fDstFormatField</string>
+                                                       <string>fDstFormatPopUp</string>
+                                                       <string>fDstMp4HttpOptFileCheck</string>
+                                                       <string>fDstMp4LargeFileCheck</string>
+                                                       <string>fDstMp4iPodFileCheck</string>
+                                                       <string>fEncodeStartStopPopUp</string>
+                                                       <string>fFrameratePfrCheck</string>
+                                                       <string>fLoadChaptersButton</string>
+                                                       <string>fPictureCroppingField</string>
+                                                       <string>fPictureSizeField</string>
+                                                       <string>fPresetDrawer</string>
+                                                       <string>fPresetNewDesc</string>
+                                                       <string>fPresetNewFolderCheck</string>
+                                                       <string>fPresetNewName</string>
+                                                       <string>fPresetNewPicFiltersCheck</string>
+                                                       <string>fPresetNewPicHeight</string>
+                                                       <string>fPresetNewPicSettingsPopUp</string>
+                                                       <string>fPresetNewPicWidth</string>
+                                                       <string>fPresetNewPicWidthHeightBox</string>
+                                                       <string>fPresetSelectedDisplay</string>
+                                                       <string>fPresetsActionButton</string>
+                                                       <string>fPresetsAdd</string>
+                                                       <string>fPresetsDelete</string>
+                                                       <string>fPresetsOutlineView</string>
+                                                       <string>fQueueStatus</string>
+                                                       <string>fRipIndicator</string>
+                                                       <string>fSaveChaptersButton</string>
+                                                       <string>fScanIndicator</string>
+                                                       <string>fScanSrcTitleCancelButton</string>
+                                                       <string>fScanSrcTitleNumField</string>
+                                                       <string>fScanSrcTitleOpenButton</string>
+                                                       <string>fScanSrcTitlePanel</string>
+                                                       <string>fScanSrcTitlePathField</string>
+                                                       <string>fSrcAngleLabel</string>
+                                                       <string>fSrcAnglePopUp</string>
+                                                       <string>fSrcChapterEndPopUp</string>
+                                                       <string>fSrcChapterField</string>
+                                                       <string>fSrcChapterStartPopUp</string>
+                                                       <string>fSrcChapterToField</string>
+                                                       <string>fSrcDVD2Field</string>
+                                                       <string>fSrcDsplyNameTitleScan</string>
+                                                       <string>fSrcDuration1Field</string>
+                                                       <string>fSrcDuration2Field</string>
+                                                       <string>fSrcFrameEndEncodingField</string>
+                                                       <string>fSrcFrameStartEncodingField</string>
+                                                       <string>fSrcTimeEndEncodingField</string>
+                                                       <string>fSrcTimeStartEncodingField</string>
+                                                       <string>fSrcTitleField</string>
+                                                       <string>fSrcTitlePopUp</string>
+                                                       <string>fStatusField</string>
+                                                       <string>fSubField</string>
+                                                       <string>fSubForcedCheck</string>
+                                                       <string>fSubPopUp</string>
+                                                       <string>fSubtitlesTable</string>
+                                                       <string>fVidBitrateCell</string>
+                                                       <string>fVidBitrateField</string>
+                                                       <string>fVidConstantCell</string>
+                                                       <string>fVidEncoderField</string>
+                                                       <string>fVidEncoderPopUp</string>
+                                                       <string>fVidQualityField</string>
+                                                       <string>fVidQualityMatrix</string>
+                                                       <string>fVidQualityRFField</string>
+                                                       <string>fVidQualityRFLabel</string>
+                                                       <string>fVidQualitySlider</string>
+                                                       <string>fVidRateField</string>
+                                                       <string>fVidRatePopUp</string>
+                                                       <string>fVidTargetCell</string>
+                                                       <string>fVidTargetSizeField</string>
+                                                       <string>fVidTurboPassCheck</string>
+                                                       <string>fVidTwoPassCheck</string>
+                                                       <string>fVideoFiltersField</string>
+                                                       <string>fWindow</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>NSPanel</string>
+                                                       <string>NSBox</string>
+                                                       <string>HBAudioController</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTableView</string>
+                                                       <string>NSTableColumn</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSDrawer</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSBox</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>HBPresetsOutlineView</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSProgressIndicator</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSProgressIndicator</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSPanel</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTableView</string>
+                                                       <string>NSButtonCell</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButtonCell</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSMatrix</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSSlider</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSPopUpButton</string>
+                                                       <string>NSButtonCell</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSWindow</string>
+                                               </object>
+                                       </object>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="896678678">
+                                               <string key="majorKey">IBProjectSource</string>
+                                               <string key="minorKey">Controller.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">HBController</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>presetSelected:</string>
+                                                       <string>showScanPanel:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                               </object>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="outlets">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fOpenSourceTitleMMenu</string>
+                                                       <string>tableView</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>NSMenuItem</string>
+                                                       <string>NSTableView</string>
+                                               </object>
+                                       </object>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBUserSource</string>
+                                               <string key="minorKey"/>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">HBPresetsOutlineView</string>
+                                       <string key="superclassName">NSOutlineView</string>
+                                       <reference key="sourceIdentifier" ref="896678678"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBUserSource</string>
+                                               <string key="minorKey"/>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">SUUpdater</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBUserSource</string>
+                                               <string key="minorKey"/>
+                                       </object>
+                               </object>
+                       </object>
+                       <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSActionCell</string>
+                                       <string key="superclassName">NSCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="186343158">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="994302592">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="329150619">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSArrayController</string>
+                                       <string key="superclassName">NSObjectController</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSArrayController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSBox</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSBox.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSBrowser</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSBrowser.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSButton</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSButton.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSButtonCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSCell</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSControl</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="93521313">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSController</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSDrawer</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="255346542">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSFormatter</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSImageCell</string>
+                                       <string key="superclassName">NSCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSImageCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSImageView</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSImageView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMatrix</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMatrix.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMenu</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="662939028">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMenuItem</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="955768185">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMenuItemCell</string>
+                                       <string key="superclassName">NSButtonCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMenuItemCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMovieView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMovieView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSNumberFormatter</string>
+                                       <string key="superclassName">NSFormatter</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSNumberFormatter.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="186343158"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="994302592"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="329150619"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="93521313"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="662939028"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="474309511">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="10931481">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="986196456">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
                                        </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{673, 530}, {83, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{476, 687}, {253, 243}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{454, 306}, {270, 550}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="0"/>
-                                       <reference ref="9"/>
-                                       <string>{{720, 261}, {270, 550}}</string>
-                                       <string>{{275, 198}, {338, 318}}</string>
-                                       <string>{{275, 198}, {338, 318}}</string>
-                                       <reference ref="9"/>
-                                       <string>{{421, 536}, {338, 318}}</string>
-                                       <reference ref="6"/>
-                                       <reference ref="9"/>
-                                       <string>{3.40282e+38, 3.40282e+38}</string>
-                                       <string>{338, 232}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{520, 797}, {236, 133}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{418, 529}, {122, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{257, 300}, {760, 550}}</string>
-                                       <reference ref="6"/>
-                                       <string>{{257, 300}, {760, 550}}</string>
-                                       <reference ref="9"/>
-                                       <string>{{65, 541}, {760, 550}}</string>
-                                       <reference ref="6"/>
-                                       <reference ref="9"/>
-                                       <string>{3.40282e+38, 3.40282e+38}</string>
-                                       <string>{213, 107}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <object class="NSMutableDictionary">
-                                               <string key="NS.key.0">ToolTip</string>
-                                               <object class="IBToolTipAttribute" key="NS.object.0">
-                                                       <string key="name">ToolTip</string>
-                                                       <reference key="object" ref="553453876"/>
-                                                       <string key="toolTip">Caution: This option will likely break device compatiblity with all but the AppleTV Take 2. Checking this box enables a 64 bit mp4 file which can be over 4 GB.</string>
-                                               </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
                                        </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{72, 851}, {392, 144}}</string>
-                                       <string>{{72, 851}, {392, 144}}</string>
-                                       <reference ref="9"/>
-                                       <string>{{303, 988}, {392, 144}}</string>
-                                       <reference ref="6"/>
-                                       <reference ref="9"/>
-                                       <string>{3.40282e+38, 3.40282e+38}</string>
-                                       <string>{213, 107}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{325, 930}, {394, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{63, 836}, {394, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>HBPresetsOutlineView</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{57, 766}, {300, 233}}</string>
-                                       <reference ref="9"/>
-                                       <string>{{57, 766}, {300, 233}}</string>
-                                       <reference ref="6"/>
-                                       <reference ref="9"/>
-                                       <string>{3.40282e+38, 3.40282e+38}</string>
-                                       <string>{213, 107}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <object class="NSMutableDictionary">
-                                               <string key="NS.key.0">ToolTip</string>
-                                               <object class="IBToolTipAttribute" key="NS.object.0">
-                                                       <string key="name">ToolTip</string>
-                                                       <reference key="object" ref="581806074"/>
-                                                       <string key="toolTip">Mixed</string>
-                                               </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/IKImageBrowserView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/IKSaveOptions.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/ImageKitDeprecated.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">PDFKit.framework/Headers/PDFDocument.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="654570508">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">PDFKit.framework/Headers/PDFView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedAudioOutput.h</string>
                                        </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <object class="NSMutableDictionary">
-                                               <string key="NS.key.0">ToolTip</string>
-                                               <object class="IBToolTipAttribute" key="NS.object.0">
-                                                       <string key="name">ToolTip</string>
-                                                       <reference key="object" ref="921877174"/>
-                                                       <string key="toolTip">Mixed</string>
-                                               </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedVideoOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureFileOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureVideoPreviewOutput.h</string>
                                        </object>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{418, 529}, {122, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{418, 529}, {122, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{601, 501}, {79, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{673, 530}, {83, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{673, 530}, {83, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{673, 530}, {83, 20}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{304, 383}, {226, 63}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{923, 222}, {226, 63}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{154, 542}, {700, 18}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1041"/>
-                                       <reference ref="6"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{337, 757}, {232, 173}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{75, 683}, {235, 153}}</string>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                </object>
-                       </object>
-                       <object class="NSMutableDictionary" key="unlocalizedProperties">
-                               <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSArray" key="dict.sortedKeys">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureView.h</string>
+                                       </object>
                                </object>
-                               <object class="NSMutableArray" key="dict.values">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTMovie.h</string>
+                                       </object>
                                </object>
-                       </object>
-                       <nil key="activeLocalization"/>
-                       <object class="NSMutableDictionary" key="localizations">
-                               <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSArray" key="dict.sortedKeys">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="281869804">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTMovieView.h</string>
+                                       </object>
                                </object>
-                               <object class="NSMutableArray" key="dict.values">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionParameterView.h</string>
+                                       </object>
                                </object>
-                       </object>
-                       <nil key="sourceID"/>
-                       <int key="maxID">5490</int>
-               </object>
-               <object class="IBClassDescriber" key="IBDocument.Classes">
-                       <object class="NSMutableArray" key="referencedPartialClassDescriptions">
-                               <bool key="EncodedWithXMLCoder">YES</bool>
                                <object class="IBPartialClassDescription">
-                                       <string key="className">HBController</string>
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionPickerView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzFilters.framework/Headers/QuartzFilterManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuickLookUI.framework/Headers/QLPreviewPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="675455814">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObjectController</string>
+                                       <string key="superclassName">NSController</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSObjectController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSOutlineView</string>
+                                       <string key="superclassName">NSTableView</string>
+                                       <reference key="sourceIdentifier" ref="474309511"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSPanel</string>
+                                       <string key="superclassName">NSWindow</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSPopUpButton</string>
+                                       <string key="superclassName">NSButton</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPopUpButton.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSPopUpButtonCell</string>
+                                       <string key="superclassName">NSMenuItemCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPopUpButtonCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSProgressIndicator</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSProgressIndicator.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSResponder</string>
                                        <string key="superclassName">NSObject</string>
-                                       <object class="NSMutableDictionary" key="actions">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>Cancel:</string>
-                                                       <string>Pause:</string>
-                                                       <string>Rip:</string>
-                                                       <string>addAllAudioTracksToPopUp:</string>
-                                                       <string>addFactoryPresets:</string>
-                                                       <string>addToQueue:</string>
-                                                       <string>addUserPreset:</string>
-                                                       <string>applyQueueSettings:</string>
-                                                       <string>audioAddAudioTrackCodecs:</string>
-                                                       <string>audioCodecsPopUpChanged:</string>
-                                                       <string>audioDRCSliderChanged:</string>
-                                                       <string>audioTrackMixdownChanged:</string>
-                                                       <string>audioTrackPopUpChanged:</string>
-                                                       <string>autoSetM4vExtension:</string>
-                                                       <string>browseExportPresetFile:</string>
-                                                       <string>browseFile:</string>
-                                                       <string>browseImportPresetFile:</string>
-                                                       <string>browseImportSrtFile:</string>
-                                                       <string>browseSources:</string>
-                                                       <string>calculateBitrate:</string>
-                                                       <string>calculatePictureSizing:</string>
-                                                       <string>chapterPopUpChanged:</string>
-                                                       <string>closeAddPresetPanel:</string>
-                                                       <string>closeSourceTitleScanPanel:</string>
-                                                       <string>customSettingUsed:</string>
-                                                       <string>deleteFactoryPresets:</string>
-                                                       <string>deletePreset:</string>
-                                                       <string>formatPopUpChanged:</string>
-                                                       <string>getDefaultPresets:</string>
-                                                       <string>insertPreset:</string>
-                                                       <string>openForums:</string>
-                                                       <string>openHomepage:</string>
-                                                       <string>openMainWindow:</string>
-                                                       <string>openUserGuide:</string>
-                                                       <string>qualitySliderChanged:</string>
-                                                       <string>revertPictureSizeToMax:</string>
-                                                       <string>selectDefaultPreset:</string>
-                                                       <string>selectPreset:</string>
-                                                       <string>setDefaultPreset:</string>
-                                                       <string>setEnabledStateOfAudioMixdownControls:</string>
-                                                       <string>showAboutPanel:</string>
-                                                       <string>showAddPresetPanel:</string>
-                                                       <string>showDebugOutputPanel:</string>
-                                                       <string>showNewScan:</string>
-                                                       <string>showPicturePanel:</string>
-                                                       <string>showPreferencesWindow:</string>
-                                                       <string>showPreviewWindow:</string>
-                                                       <string>showQueueWindow:</string>
-                                                       <string>showSourceTitleScanPanel:</string>
-                                                       <string>titlePopUpChanged:</string>
-                                                       <string>twoPassCheckboxChanged:</string>
-                                                       <string>videoEncoderPopUpChanged:</string>
-                                                       <string>videoFrameRateChanged:</string>
-                                                       <string>videoMatrixChanged:</string>
-                                               </object>
-                                               <object class="NSMutableArray" key="dict.values">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
-                                                       <string>id</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSScrollView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSScrollView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSScroller</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSScroller.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSSlider</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSlider.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSSliderCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSliderCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTabView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTabView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTabViewItem</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTabViewItem.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTableColumn</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTableColumn.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTableHeaderView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTableHeaderView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTableView</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <reference key="sourceIdentifier" ref="10931481"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSText</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSText.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTextField</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTextFieldCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSUserDefaultsController</string>
+                                       <string key="superclassName">NSController</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSUserDefaultsController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <reference key="sourceIdentifier" ref="955768185"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <reference key="sourceIdentifier" ref="986196456"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <reference key="sourceIdentifier" ref="255346542"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">PDFView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>goBack:</string>
+                                                       <string>goForward:</string>
+                                                       <string>goToFirstPage:</string>
+                                                       <string>goToLastPage:</string>
+                                                       <string>goToNextPage:</string>
+                                                       <string>goToPreviousPage:</string>
+                                                       <string>selectAll:</string>
+                                                       <string>takeBackgroundColorFrom:</string>
+                                                       <string>zoomIn:</string>
+                                                       <string>zoomOut:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
                                                </object>
                                        </object>
-                                       <object class="NSMutableDictionary" key="outlets">
+                                       <reference key="sourceIdentifier" ref="654570508"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">QCView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="NSMutableDictionary" key="actions">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
+                                               <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>fAddPresetPanel</string>
-                                                       <string>fAdvancedView</string>
-                                                       <string>fAudBitrateLabel</string>
-                                                       <string>fAudCodecLabel</string>
-                                                       <string>fAudDrcLabel</string>
-                                                       <string>fAudLang1PopUp</string>
-                                                       <string>fAudLang2PopUp</string>
-                                                       <string>fAudLang3PopUp</string>
-                                                       <string>fAudLang4PopUp</string>
-                                                       <string>fAudMixdownLabel</string>
-                                                       <string>fAudSamplerateLabel</string>
-                                                       <string>fAudSourceLabel</string>
-                                                       <string>fAudTrack1BitratePopUp</string>
-                                                       <string>fAudTrack1CodecPopUp</string>
-                                                       <string>fAudTrack1DrcField</string>
-                                                       <string>fAudTrack1DrcSlider</string>
-                                                       <string>fAudTrack1Label</string>
-                                                       <string>fAudTrack1MixPopUp</string>
-                                                       <string>fAudTrack1RatePopUp</string>
-                                                       <string>fAudTrack2BitratePopUp</string>
-                                                       <string>fAudTrack2CodecPopUp</string>
-                                                       <string>fAudTrack2DrcField</string>
-                                                       <string>fAudTrack2DrcSlider</string>
-                                                       <string>fAudTrack2Label</string>
-                                                       <string>fAudTrack2MixPopUp</string>
-                                                       <string>fAudTrack2RatePopUp</string>
-                                                       <string>fAudTrack3BitratePopUp</string>
-                                                       <string>fAudTrack3CodecPopUp</string>
-                                                       <string>fAudTrack3DrcField</string>
-                                                       <string>fAudTrack3DrcSlider</string>
-                                                       <string>fAudTrack3Label</string>
-                                                       <string>fAudTrack3MixPopUp</string>
-                                                       <string>fAudTrack3RatePopUp</string>
-                                                       <string>fAudTrack4BitratePopUp</string>
-                                                       <string>fAudTrack4CodecPopUp</string>
-                                                       <string>fAudTrack4DrcField</string>
-                                                       <string>fAudTrack4DrcSlider</string>
-                                                       <string>fAudTrack4Label</string>
-                                                       <string>fAudTrack4MixPopUp</string>
-                                                       <string>fAudTrack4RatePopUp</string>
-                                                       <string>fBrowseSrtFileButton</string>
-                                                       <string>fChapterTable</string>
-                                                       <string>fCreateChapterMarkers</string>
-                                                       <string>fDstBrowseButton</string>
-                                                       <string>fDstFile1Field</string>
-                                                       <string>fDstFile2Field</string>
-                                                       <string>fDstFormatField</string>
-                                                       <string>fDstFormatPopUp</string>
-                                                       <string>fDstMp4HttpOptFileCheck</string>
-                                                       <string>fDstMp4LargeFileCheck</string>
-                                                       <string>fDstMp4iPodFileCheck</string>
-                                                       <string>fPictureCroppingField</string>
-                                                       <string>fPictureSizeField</string>
-                                                       <string>fPresetDrawer</string>
-                                                       <string>fPresetNewDesc</string>
-                                                       <string>fPresetNewFolderCheck</string>
-                                                       <string>fPresetNewName</string>
-                                                       <string>fPresetNewPicFiltersCheck</string>
-                                                       <string>fPresetNewPicSettingsPopUp</string>
-                                                       <string>fPresetSelectedDisplay</string>
-                                                       <string>fPresetsActionButton</string>
-                                                       <string>fPresetsAdd</string>
-                                                       <string>fPresetsDelete</string>
-                                                       <string>fPresetsOutlineView</string>
-                                                       <string>fQueueStatus</string>
-                                                       <string>fRipIndicator</string>
-                                                       <string>fScanIndicator</string>
-                                                       <string>fScanSrcTitleCancelButton</string>
-                                                       <string>fScanSrcTitleNumField</string>
-                                                       <string>fScanSrcTitleOpenButton</string>
-                                                       <string>fScanSrcTitlePanel</string>
-                                                       <string>fScanSrcTitlePathField</string>
-                                                       <string>fSrcAngleLabel</string>
-                                                       <string>fSrcAnglePopUp</string>
-                                                       <string>fSrcChapterEndPopUp</string>
-                                                       <string>fSrcChapterField</string>
-                                                       <string>fSrcChapterStartPopUp</string>
-                                                       <string>fSrcChapterToField</string>
-                                                       <string>fSrcDVD2Field</string>
-                                                       <string>fSrcDsplyNameTitleScan</string>
-                                                       <string>fSrcDuration1Field</string>
-                                                       <string>fSrcDuration2Field</string>
-                                                       <string>fSrcTitleField</string>
-                                                       <string>fSrcTitlePopUp</string>
-                                                       <string>fStatusField</string>
-                                                       <string>fSubField</string>
-                                                       <string>fSubForcedCheck</string>
-                                                       <string>fSubPopUp</string>
-                                                       <string>fSubtitlesTable</string>
-                                                       <string>fVidBitrateCell</string>
-                                                       <string>fVidBitrateField</string>
-                                                       <string>fVidConstantCell</string>
-                                                       <string>fVidEncoderField</string>
-                                                       <string>fVidEncoderPopUp</string>
-                                                       <string>fVidQualityField</string>
-                                                       <string>fVidQualityMatrix</string>
-                                                       <string>fVidQualityRFField</string>
-                                                       <string>fVidQualityRFLabel</string>
-                                                       <string>fVidQualitySlider</string>
-                                                       <string>fVidRateField</string>
-                                                       <string>fVidRatePopUp</string>
-                                                       <string>fVidTargetCell</string>
-                                                       <string>fVidTargetSizeField</string>
-                                                       <string>fVidTurboPassCheck</string>
-                                                       <string>fVidTwoPassCheck</string>
-                                                       <string>fVideoFiltersField</string>
-                                                       <string>fWindow</string>
+                                                       <string>play:</string>
+                                                       <string>start:</string>
+                                                       <string>stop:</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>NSPanel</string>
-                                                       <string>NSBox</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSSlider</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSSlider</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSSlider</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSSlider</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTableView</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSDrawer</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>HBPresetsOutlineView</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSProgressIndicator</string>
-                                                       <string>NSProgressIndicator</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSPanel</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTableView</string>
-                                                       <string>NSButtonCell</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButtonCell</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSMatrix</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSSlider</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSPopUpButton</string>
-                                                       <string>NSButtonCell</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSButton</string>
-                                                       <string>NSTextField</string>
-                                                       <string>NSWindow</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
                                                </object>
                                        </object>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="896678678">
-                                               <string key="majorKey">IBProjectSource</string>
-                                               <string key="minorKey">Controller.h</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzComposer.framework/Headers/QCView.h</string>
                                        </object>
                                </object>
                                <object class="IBPartialClassDescription">
-                                       <string key="className">HBController</string>
-                                       <string key="superclassName">NSObject</string>
+                                       <string key="className">QTMovieView</string>
+                                       <string key="superclassName">NSView</string>
                                        <object class="NSMutableDictionary" key="actions">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>presetSelected:</string>
-                                                       <string>showScanPanel:</string>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>add:</string>
+                                                       <string>addScaled:</string>
+                                                       <string>copy:</string>
+                                                       <string>cut:</string>
+                                                       <string>delete:</string>
+                                                       <string>gotoBeginning:</string>
+                                                       <string>gotoEnd:</string>
+                                                       <string>gotoNextSelectionPoint:</string>
+                                                       <string>gotoPosterFrame:</string>
+                                                       <string>gotoPreviousSelectionPoint:</string>
+                                                       <string>paste:</string>
+                                                       <string>pause:</string>
+                                                       <string>play:</string>
+                                                       <string>replace:</string>
+                                                       <string>selectAll:</string>
+                                                       <string>selectNone:</string>
+                                                       <string>stepBackward:</string>
+                                                       <string>stepForward:</string>
+                                                       <string>trim:</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>id</string>
                                                        <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
                                                </object>
                                        </object>
-                                       <object class="NSMutableDictionary" key="outlets">
-                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>fOpenSourceTitleMMenu</string>
-                                                       <string>tableView</string>
-                                               </object>
-                                               <object class="NSMutableArray" key="dict.values">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <string>NSMenuItem</string>
-                                                       <string>NSTableView</string>
-                                               </object>
-                                       </object>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBUserSource</string>
-                                               <string key="minorKey"/>
-                                       </object>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">HBPresetsOutlineView</string>
-                                       <string key="superclassName">NSOutlineView</string>
-                                       <reference key="sourceIdentifier" ref="896678678"/>
-                               </object>
-                               <object class="IBPartialClassDescription">
-                                       <string key="className">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBUserSource</string>
-                                               <string key="minorKey"/>
-                                       </object>
+                                       <reference key="sourceIdentifier" ref="281869804"/>
                                </object>
                                <object class="IBPartialClassDescription">
                                        <string key="className">SUUpdater</string>
                                        <string key="superclassName">NSObject</string>
-                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBUserSource</string>
-                                               <string key="minorKey"/>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <string key="NS.key.0">checkForUpdates:</string>
+                                               <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="outlets">
+                                               <string key="NS.key.0">delegate</string>
+                                               <string key="NS.object.0">id</string>
+                                       </object>
+                                       <reference key="sourceIdentifier" ref="675455814"/>
                                </object>
                        </object>
                </object>
                <int key="IBDocument.localizationMode">0</int>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+                       <integer value="1050" key="NS.object.0"/>
+               </object>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+                       <integer value="3000" key="NS.object.0"/>
+               </object>
+               <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
                <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
                <int key="IBDocument.defaultPropertyAccessControl">3</int>
        </data>
index d8eba8b..030fa9e 100644 (file)
@@ -2,10 +2,10 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
        <data>
                <int key="IBDocument.SystemTarget">1050</int>
-               <string key="IBDocument.SystemVersion">10A432</string>
-               <string key="IBDocument.InterfaceBuilderVersion">732</string>
-               <string key="IBDocument.AppKitVersion">1038</string>
-               <string key="IBDocument.HIToolboxVersion">437.00</string>
+               <string key="IBDocument.SystemVersion">10F569</string>
+               <string key="IBDocument.InterfaceBuilderVersion">788</string>
+               <string key="IBDocument.AppKitVersion">1038.29</string>
+               <string key="IBDocument.HIToolboxVersion">461.00</string>
                <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <object class="NSArray" key="dict.sortedKeys">
                        </object>
                        <object class="NSMutableArray" key="dict.values">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <string>732</string>
-                               <string>1584</string>
+                               <string>788</string>
+                               <string>1742</string>
                        </object>
                </object>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
-                       <integer value="257"/>
+                       <integer value="252"/>
                </object>
                <object class="NSArray" key="IBDocument.PluginDependencies">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <object class="NSButton" id="798240356">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">292</int>
-                                                                                                                       <string key="NSFrame">{{18, 8}, {77, 25}}</string>
+                                                                                                                       <string key="NSFrame">{{18, 7}, {77, 25}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                                <int key="NSPeriodicInterval">25</int>
                                                                                                                        </object>
                                                                                                                </object>
-                                                                                                               <object class="NSButton" id="537831590">
-                                                                                                                       <reference key="NSNextResponder" ref="385854969"/>
-                                                                                                                       <int key="NSvFlags">289</int>
-                                                                                                                       <string key="NSFrame">{{251, 8}, {69, 25}}</string>
-                                                                                                                       <reference key="NSSuperview" ref="385854969"/>
-                                                                                                                       <object class="NSArray" key="NSViewContentFilters">
-                                                                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
-                                                                                                                               <object class="CIColorMonochrome">
-                                                                                                                                       <object class="CIColor" key="CI_inputColor">
-                                                                                                                                               <float key="red">0.70196080207824707</float>
-                                                                                                                                               <float key="green">0.70196080207824707</float>
-                                                                                                                                               <float key="blue">0.70196080207824707</float>
-                                                                                                                                               <float key="alpha">1</float>
-                                                                                                                                       </object>
-                                                                                                                                       <integer value="1" key="CI_inputIntensity"/>
-                                                                                                                                       <bool key="CIEnabled">YES</bool>
-                                                                                                                               </object>
-                                                                                                                       </object>
-                                                                                                                       <bool key="NSEnabled">YES</bool>
-                                                                                                                       <object class="NSButtonCell" key="NSCell" id="29238952">
-                                                                                                                               <int key="NSCellFlags">67239424</int>
-                                                                                                                               <int key="NSCellFlags2">134479872</int>
-                                                                                                                               <string key="NSContents">Full Screen</string>
-                                                                                                                               <reference key="NSSupport" ref="22"/>
-                                                                                                                               <reference key="NSControlView" ref="537831590"/>
-                                                                                                                               <int key="NSButtonFlags">-2038284033</int>
-                                                                                                                               <int key="NSButtonFlags2">163</int>
-                                                                                                                               <string key="NSAlternateContents"/>
-                                                                                                                               <string key="NSKeyEquivalent"/>
-                                                                                                                               <int key="NSPeriodicDelay">200</int>
-                                                                                                                               <int key="NSPeriodicInterval">25</int>
-                                                                                                                       </object>
-                                                                                                               </object>
                                                                                                                <object class="NSButton" id="141370142">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">289</int>
-                                                                                                                       <string key="NSFrame">{{364, 8}, {54, 25}}</string>
+                                                                                                                       <string key="NSFrame">{{366, 7}, {54, 25}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <object class="NSButton" id="81685190">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">289</int>
-                                                                                                                       <string key="NSFrame">{{325, 8}, {34, 25}}</string>
+                                                                                                                       <string key="NSFrame">{{259, 7}, {86, 25}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                        <object class="NSButtonCell" key="NSCell" id="847033897">
                                                                                                                                <int key="NSCellFlags">67239424</int>
                                                                                                                                <int key="NSCellFlags2">134479872</int>
-                                                                                                                               <string key="NSContents">&lt;-&gt;</string>
+                                                                                                                               <string key="NSContents">Scale To Screen</string>
                                                                                                                                <reference key="NSSupport" ref="22"/>
                                                                                                                                <reference key="NSControlView" ref="81685190"/>
                                                                                                                                <int key="NSButtonFlags">-2038284033</int>
                                                                                                                <object class="NSTextField" id="66510867">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">289</int>
-                                                                                                                       <string key="NSFrame">{{117, 15}, {75, 11}}</string>
+                                                                                                                       <string key="NSFrame">{{119, 14}, {75, 11}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <bool key="NSEnabled">YES</bool>
                                                                                                                        <object class="NSTextFieldCell" key="NSCell" id="567286013">
                                                                                                                <object class="NSPopUpButton" id="598619000">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">289</int>
-                                                                                                                       <string key="NSFrame">{{196, 12}, {45, 15}}</string>
+                                                                                                                       <string key="NSFrame">{{198, 11}, {45, 15}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <object class="NSSlider" id="396925210">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">290</int>
-                                                                                                                       <string key="NSFrame">{{18, 40}, {400, 16}}</string>
+                                                                                                                       <string key="NSFrame">{{18, 39}, {402, 16}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <object class="NSTextField" id="628196212">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">290</int>
-                                                                                                                       <string key="NSFrame">{{15, 56}, {406, 20}}</string>
+                                                                                                                       <string key="NSFrame">{{15, 55}, {408, 20}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <bool key="NSEnabled">YES</bool>
                                                                                                                        <object class="NSTextFieldCell" key="NSCell" id="921881842">
                                                                                                                <object class="NSTextField" id="245200984">
                                                                                                                        <reference key="NSNextResponder" ref="385854969"/>
                                                                                                                        <int key="NSvFlags">290</int>
-                                                                                                                       <string key="NSFrame">{{16, 81}, {406, 12}}</string>
+                                                                                                                       <string key="NSFrame">{{16, 80}, {408, 12}}</string>
                                                                                                                        <reference key="NSSuperview" ref="385854969"/>
                                                                                                                        <bool key="NSEnabled">YES</bool>
                                                                                                                        <object class="NSTextFieldCell" key="NSCell" id="1032360651">
                                                                                                                        </object>
                                                                                                                </object>
                                                                                                        </object>
-                                                                                                       <string key="NSFrame">{{2, 2}, {436, 96}}</string>
+                                                                                                       <string key="NSFrame">{{1, 1}, {438, 97}}</string>
                                                                                                        <reference key="NSSuperview" ref="92351498"/>
                                                                                                </object>
                                                                                        </object>
-                                                                                       <string key="NSFrame">{{21, 90}, {440, 100}}</string>
+                                                                                       <string key="NSFrame">{{21, 121}, {440, 99}}</string>
                                                                                        <reference key="NSSuperview" ref="353606868"/>
                                                                                        <string key="NSOffsets">{0, 0}</string>
                                                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                                                        <int key="NSBoxType">4</int>
                                                                                        <int key="NSTitlePosition">0</int>
                                                                                        <bool key="NSTransparent">NO</bool>
-                                                                                       <real value="2" key="NSBorderWidth2"/>
-                                                                                       <double key="NSCornerRadius2">26</double>
-                                                                                       <reference key="NSBorderColor2" ref="978544139"/>
+                                                                                       <double key="NSCornerRadius2">12</double>
+                                                                                       <object class="NSColor" key="NSBorderColor2">
+                                                                                               <int key="NSColorSpace">1</int>
+                                                                                               <bytes key="NSRGB">MSAxIDEgMC41AA</bytes>
+                                                                                       </object>
                                                                                        <object class="NSColor" key="NSFillColor2">
                                                                                                <int key="NSColorSpace">1</int>
-                                                                                               <bytes key="NSRGB">MCAwIDAgMC43NQA</bytes>
+                                                                                               <bytes key="NSRGB">MCAwIDAgMC42AA</bytes>
+                                                                                       </object>
+                                                                               </object>
+                                                                               <object class="NSBox" id="700607930">
+                                                                                       <reference key="NSNextResponder" ref="353606868"/>
+                                                                                       <int key="NSvFlags">-2147483611</int>
+                                                                                       <object class="NSMutableArray" key="NSSubviews">
+                                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                               <object class="NSView" id="1068222891">
+                                                                                                       <reference key="NSNextResponder" ref="700607930"/>
+                                                                                                       <int key="NSvFlags">256</int>
+                                                                                                       <object class="NSMutableArray" key="NSSubviews">
+                                                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                               <object class="NSSlider" id="886140787">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">290</int>
+                                                                                                                       <string key="NSFrame">{{18, 27}, {407, 21}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <object class="NSArray" key="NSViewContentFilters">
+                                                                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                               <object class="CIColorMonochrome">
+                                                                                                                                       <object class="CIColor" key="CI_inputColor">
+                                                                                                                                               <float key="red">0.70196080207824707</float>
+                                                                                                                                               <float key="green">0.70196080207824707</float>
+                                                                                                                                               <float key="blue">0.70196080207824707</float>
+                                                                                                                                               <float key="alpha">1</float>
+                                                                                                                                       </object>
+                                                                                                                                       <integer value="1" key="CI_inputIntensity"/>
+                                                                                                                                       <bool key="CIEnabled">YES</bool>
+                                                                                                                               </object>
+                                                                                                                       </object>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSSliderCell" key="NSCell" id="493667684">
+                                                                                                                               <int key="NSCellFlags">67501824</int>
+                                                                                                                               <int key="NSCellFlags2">0</int>
+                                                                                                                               <string key="NSContents"/>
+                                                                                                                               <reference key="NSControlView" ref="886140787"/>
+                                                                                                                               <double key="NSMaxValue">100</double>
+                                                                                                                               <double key="NSMinValue">0.0</double>
+                                                                                                                               <double key="NSValue">0.0</double>
+                                                                                                                               <double key="NSAltIncValue">0.0</double>
+                                                                                                                               <int key="NSNumberOfTickMarks">0</int>
+                                                                                                                               <int key="NSTickMarkPosition">1</int>
+                                                                                                                               <bool key="NSAllowsTickMarkValuesOnly">NO</bool>
+                                                                                                                               <bool key="NSVertical">NO</bool>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                               <object class="NSButton" id="102183813">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">268</int>
+                                                                                                                       <string key="NSFrame">{{200, 53}, {39, 25}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSButtonCell" key="NSCell" id="19809002">
+                                                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                                                               <int key="NSCellFlags2">134217728</int>
+                                                                                                                               <string key="NSContents"/>
+                                                                                                                               <object class="NSFont" key="NSSupport" id="353643025">
+                                                                                                                                       <string key="NSName">LucidaGrande</string>
+                                                                                                                                       <double key="NSSize">13</double>
+                                                                                                                                       <int key="NSfFlags">1044</int>
+                                                                                                                               </object>
+                                                                                                                               <reference key="NSControlView" ref="102183813"/>
+                                                                                                                               <int key="NSButtonFlags">-2038169345</int>
+                                                                                                                               <int key="NSButtonFlags2">163</int>
+                                                                                                                               <string key="NSAlternateContents"/>
+                                                                                                                               <string key="NSKeyEquivalent"/>
+                                                                                                                               <int key="NSPeriodicDelay">200</int>
+                                                                                                                               <int key="NSPeriodicInterval">25</int>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                               <object class="NSButton" id="897614796">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">268</int>
+                                                                                                                       <string key="NSFrame">{{171, 53}, {30, 25}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSButtonCell" key="NSCell" id="913339095">
+                                                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                                                               <int key="NSCellFlags2">134217728</int>
+                                                                                                                               <string key="NSContents">|&lt;</string>
+                                                                                                                               <reference key="NSSupport" ref="353643025"/>
+                                                                                                                               <reference key="NSControlView" ref="897614796"/>
+                                                                                                                               <int key="NSButtonFlags">-2038169345</int>
+                                                                                                                               <int key="NSButtonFlags2">163</int>
+                                                                                                                               <string key="NSAlternateContents"/>
+                                                                                                                               <string key="NSKeyEquivalent"/>
+                                                                                                                               <int key="NSPeriodicDelay">200</int>
+                                                                                                                               <int key="NSPeriodicInterval">25</int>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                               <object class="NSButton" id="894608246">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">268</int>
+                                                                                                                       <string key="NSFrame">{{238, 53}, {32, 25}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSButtonCell" key="NSCell" id="117507013">
+                                                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                                                               <int key="NSCellFlags2">134217728</int>
+                                                                                                                               <string key="NSContents">&gt;|</string>
+                                                                                                                               <reference key="NSSupport" ref="353643025"/>
+                                                                                                                               <reference key="NSControlView" ref="894608246"/>
+                                                                                                                               <int key="NSButtonFlags">-2038169345</int>
+                                                                                                                               <int key="NSButtonFlags2">163</int>
+                                                                                                                               <string key="NSAlternateContents"/>
+                                                                                                                               <string key="NSKeyEquivalent"/>
+                                                                                                                               <int key="NSPeriodicDelay">200</int>
+                                                                                                                               <int key="NSPeriodicInterval">25</int>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                               <object class="NSButton" id="630042886">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">292</int>
+                                                                                                                       <string key="NSFrame">{{335, 53}, {77, 25}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <object class="NSArray" key="NSViewContentFilters">
+                                                                                                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                                                                                                               <object class="CIColorMonochrome">
+                                                                                                                                       <object class="CIColor" key="CI_inputColor">
+                                                                                                                                               <float key="red">0.70196080207824707</float>
+                                                                                                                                               <float key="green">0.70196080207824707</float>
+                                                                                                                                               <float key="blue">0.70196080207824707</float>
+                                                                                                                                               <float key="alpha">1</float>
+                                                                                                                                       </object>
+                                                                                                                                       <integer value="1" key="CI_inputIntensity"/>
+                                                                                                                                       <bool key="CIEnabled">YES</bool>
+                                                                                                                               </object>
+                                                                                                                       </object>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSButtonCell" key="NSCell" id="999505395">
+                                                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                                                               <int key="NSCellFlags2">134479872</int>
+                                                                                                                               <string key="NSContents">Still Previews</string>
+                                                                                                                               <reference key="NSSupport" ref="22"/>
+                                                                                                                               <reference key="NSControlView" ref="630042886"/>
+                                                                                                                               <int key="NSButtonFlags">-2038284033</int>
+                                                                                                                               <int key="NSButtonFlags2">163</int>
+                                                                                                                               <string key="NSAlternateContents"/>
+                                                                                                                               <string key="NSKeyEquivalent"/>
+                                                                                                                               <int key="NSPeriodicDelay">200</int>
+                                                                                                                               <int key="NSPeriodicInterval">25</int>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                               <object class="NSTextField" id="964331174">
+                                                                                                                       <reference key="NSNextResponder" ref="1068222891"/>
+                                                                                                                       <int key="NSvFlags">290</int>
+                                                                                                                       <string key="NSFrame">{{18, 10}, {399, 12}}</string>
+                                                                                                                       <reference key="NSSuperview" ref="1068222891"/>
+                                                                                                                       <bool key="NSEnabled">YES</bool>
+                                                                                                                       <object class="NSTextFieldCell" key="NSCell" id="113790059">
+                                                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                                                               <int key="NSCellFlags2">4456448</int>
+                                                                                                                               <string key="NSContents"/>
+                                                                                                                               <reference key="NSSupport" ref="811969608"/>
+                                                                                                                               <reference key="NSControlView" ref="964331174"/>
+                                                                                                                               <bool key="NSDrawsBackground">YES</bool>
+                                                                                                                               <reference key="NSBackgroundColor" ref="407686733"/>
+                                                                                                                               <reference key="NSTextColor" ref="978544139"/>
+                                                                                                                       </object>
+                                                                                                               </object>
+                                                                                                       </object>
+                                                                                                       <string key="NSFrame">{{1, 1}, {438, 97}}</string>
+                                                                                                       <reference key="NSSuperview" ref="700607930"/>
+                                                                                               </object>
+                                                                                       </object>
+                                                                                       <string key="NSFrame">{{21, 16}, {440, 99}}</string>
+                                                                                       <reference key="NSSuperview" ref="353606868"/>
+                                                                                       <string key="NSOffsets">{0, 0}</string>
+                                                                                       <object class="NSTextFieldCell" key="NSTitleCell">
+                                                                                               <int key="NSCellFlags">67239424</int>
+                                                                                               <int key="NSCellFlags2">0</int>
+                                                                                               <string key="NSContents">Playback Controls</string>
+                                                                                               <reference key="NSSupport" ref="26"/>
+                                                                                               <reference key="NSBackgroundColor" ref="384686844"/>
+                                                                                               <object class="NSColor" key="NSTextColor">
+                                                                                                       <int key="NSColorSpace">3</int>
+                                                                                                       <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+                                                                                               </object>
+                                                                                       </object>
+                                                                                       <reference key="NSContentView" ref="1068222891"/>
+                                                                                       <int key="NSBorderType">1</int>
+                                                                                       <int key="NSBoxType">4</int>
+                                                                                       <int key="NSTitlePosition">0</int>
+                                                                                       <bool key="NSTransparent">NO</bool>
+                                                                                       <double key="NSCornerRadius2">12</double>
+                                                                                       <object class="NSColor" key="NSBorderColor2">
+                                                                                               <int key="NSColorSpace">1</int>
+                                                                                               <bytes key="NSRGB">MSAxIDEgMC41AA</bytes>
+                                                                                       </object>
+                                                                                       <object class="NSColor" key="NSFillColor2">
+                                                                                               <int key="NSColorSpace">1</int>
+                                                                                               <bytes key="NSRGB">MCAwIDAgMC42AA</bytes>
                                                                                        </object>
                                                                                </object>
                                                                                <object class="NSBox" id="768906858">
                                                                                                                <object class="NSButton" id="569473100">
                                                                                                                        <reference key="NSNextResponder" ref="1067699710"/>
                                                                                                                        <int key="NSvFlags">265</int>
-                                                                                                                       <string key="NSFrame">{{366, 21}, {46, 25}}</string>
+                                                                                                                       <string key="NSFrame">{{368, 21}, {46, 25}}</string>
                                                                                                                        <reference key="NSSuperview" ref="1067699710"/>
                                                                                                                        <object class="NSArray" key="NSViewContentFilters">
                                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                        </object>
                                                                                                                </object>
                                                                                                        </object>
-                                                                                                       <string key="NSFrame">{{2, 2}, {436, 96}}</string>
+                                                                                                       <string key="NSFrame">{{1, 1}, {438, 98}}</string>
                                                                                                        <reference key="NSSuperview" ref="768906858"/>
                                                                                                </object>
                                                                                        </object>
-                                                                                       <string key="NSFrame">{{21, 90}, {440, 100}}</string>
+                                                                                       <string key="NSFrame">{{21, 233}, {440, 100}}</string>
                                                                                        <reference key="NSSuperview" ref="353606868"/>
                                                                                        <string key="NSOffsets">{0, 0}</string>
                                                                                        <object class="NSTextFieldCell" key="NSTitleCell">
                                                                                        <int key="NSBoxType">4</int>
                                                                                        <int key="NSTitlePosition">0</int>
                                                                                        <bool key="NSTransparent">NO</bool>
-                                                                                       <real value="2" key="NSBorderWidth2"/>
-                                                                                       <double key="NSCornerRadius2">26</double>
-                                                                                       <reference key="NSBorderColor2" ref="978544139"/>
+                                                                                       <double key="NSCornerRadius2">11</double>
+                                                                                       <object class="NSColor" key="NSBorderColor2">
+                                                                                               <int key="NSColorSpace">1</int>
+                                                                                               <bytes key="NSRGB">MSAxIDEgMC41AA</bytes>
+                                                                                       </object>
                                                                                        <object class="NSColor" key="NSFillColor2">
                                                                                                <int key="NSColorSpace">1</int>
-                                                                                               <bytes key="NSRGB">MCAwIDAgMC43NQA</bytes>
+                                                                                               <bytes key="NSRGB">MCAwIDAgMC42AA</bytes>
                                                                                        </object>
                                                                                </object>
                                                                        </object>
                                        <int key="connectionID">263</int>
                                </object>
                                <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">createMoviePreview:</string>
-                                               <reference key="source" ref="355312334"/>
-                                               <reference key="destination" ref="569473100"/>
-                                       </object>
-                                       <int key="connectionID">264</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBOutletConnection" key="connection">
-                                               <string key="label">fFullScreenToggleButton</string>
-                                               <reference key="source" ref="355312334"/>
-                                               <reference key="destination" ref="537831590"/>
-                                       </object>
-                                       <int key="connectionID">267</int>
-                               </object>
-                               <object class="IBConnectionRecord">
-                                       <object class="IBActionConnection" key="connection">
-                                               <string key="label">toggleScreenMode:</string>
-                                               <reference key="source" ref="355312334"/>
-                                               <reference key="destination" ref="537831590"/>
-                                       </object>
-                                       <int key="connectionID">270</int>
-                               </object>
-                               <object class="IBConnectionRecord">
                                        <object class="IBOutletConnection" key="connection">
                                                <string key="label">fPictureSettingsToggleButton</string>
                                                <reference key="source" ref="355312334"/>
                                        </object>
                                        <int key="connectionID">282</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fMoviePlaybackControlBox</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="700607930"/>
+                                       </object>
+                                       <int key="connectionID">363</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fPlayPauseButton</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="102183813"/>
+                                       </object>
+                                       <int key="connectionID">364</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fGoToStillPreviewButton</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="630042886"/>
+                                       </object>
+                                       <int key="connectionID">368</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">pictureSliderChanged:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="630042886"/>
+                                       </object>
+                                       <int key="connectionID">369</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">toggleMoviePreviewPlayPause:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="102183813"/>
+                                       </object>
+                                       <int key="connectionID">370</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fMovieScrubberSlider</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="886140787"/>
+                                       </object>
+                                       <int key="connectionID">371</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fMovieInfoField</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="964331174"/>
+                                       </object>
+                                       <int key="connectionID">374</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fGoToBeginningButton</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="897614796"/>
+                                       </object>
+                                       <int key="connectionID">380</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fGoToEndButton</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="894608246"/>
+                                       </object>
+                                       <int key="connectionID">381</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">moviePlaybackGoToBeginning:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="897614796"/>
+                                       </object>
+                                       <int key="connectionID">382</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">moviePlaybackGoToEnd:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="894608246"/>
+                                       </object>
+                                       <int key="connectionID">383</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">previewScrubberChanged:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="886140787"/>
+                                       </object>
+                                       <int key="connectionID">384</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">cancelCreateMoviePreview:</string>
+                                               <reference key="source" ref="355312334"/>
+                                               <reference key="destination" ref="569473100"/>
+                                       </object>
+                                       <int key="connectionID">395</int>
+                               </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <object class="NSArray" key="orderedObjects">
                                                        <reference ref="92351498"/>
                                                        <reference ref="768906858"/>
                                                        <reference ref="48693112"/>
+                                                       <reference ref="700607930"/>
                                                </object>
                                                <reference key="parent" ref="49161063"/>
                                        </object>
                                                        <reference ref="628196212"/>
                                                        <reference ref="798240356"/>
                                                        <reference ref="396925210"/>
-                                                       <reference ref="537831590"/>
                                                        <reference ref="141370142"/>
                                                        <reference ref="245200984"/>
-                                                       <reference ref="81685190"/>
                                                        <reference ref="66510867"/>
                                                        <reference ref="598619000"/>
+                                                       <reference ref="81685190"/>
                                                </object>
                                                <reference key="parent" ref="289177107"/>
                                        </object>
                                                <reference key="parent" ref="569473100"/>
                                        </object>
                                        <object class="IBObjectRecord">
-                                               <int key="objectID">265</int>
-                                               <reference key="object" ref="537831590"/>
-                                               <object class="NSMutableArray" key="children">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="29238952"/>
-                                               </object>
-                                               <reference key="parent" ref="92351498"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
-                                               <int key="objectID">266</int>
-                                               <reference key="object" ref="29238952"/>
-                                               <reference key="parent" ref="537831590"/>
-                                       </object>
-                                       <object class="IBObjectRecord">
                                                <int key="objectID">271</int>
                                                <reference key="object" ref="141370142"/>
                                                <object class="NSMutableArray" key="children">
                                                <reference key="object" ref="48693112"/>
                                                <reference key="parent" ref="289177107"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">335</int>
+                                               <reference key="object" ref="700607930"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="886140787"/>
+                                                       <reference ref="102183813"/>
+                                                       <reference ref="630042886"/>
+                                                       <reference ref="894608246"/>
+                                                       <reference ref="964331174"/>
+                                                       <reference ref="897614796"/>
+                                               </object>
+                                               <reference key="parent" ref="289177107"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">341</int>
+                                               <reference key="object" ref="886140787"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="493667684"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">346</int>
+                                               <reference key="object" ref="493667684"/>
+                                               <reference key="parent" ref="886140787"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">361</int>
+                                               <reference key="object" ref="102183813"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="19809002"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">362</int>
+                                               <reference key="object" ref="19809002"/>
+                                               <reference key="parent" ref="102183813"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">365</int>
+                                               <reference key="object" ref="630042886"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="999505395"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">366</int>
+                                               <reference key="object" ref="999505395"/>
+                                               <reference key="parent" ref="630042886"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">372</int>
+                                               <reference key="object" ref="964331174"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="113790059"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">373</int>
+                                               <reference key="object" ref="113790059"/>
+                                               <reference key="parent" ref="964331174"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">375</int>
+                                               <reference key="object" ref="897614796"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="913339095"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">376</int>
+                                               <reference key="object" ref="913339095"/>
+                                               <reference key="parent" ref="897614796"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">378</int>
+                                               <reference key="object" ref="894608246"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="117507013"/>
+                                               </object>
+                                               <reference key="parent" ref="700607930"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">379</int>
+                                               <reference key="object" ref="117507013"/>
+                                               <reference key="parent" ref="894608246"/>
+                                       </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
                                        <string>209.IBPluginDependency</string>
                                        <string>210.IBPluginDependency</string>
                                        <string>213.IBPluginDependency</string>
+                                       <string>215.IBAttributePlaceholdersKey</string>
                                        <string>215.IBPluginDependency</string>
                                        <string>215.IBViewIntegration.shadowBlurRadius</string>
                                        <string>215.IBViewIntegration.shadowColor</string>
                                        <string>216.IBPluginDependency</string>
                                        <string>223.IBPluginDependency</string>
                                        <string>224.IBPluginDependency</string>
+                                       <string>226.IBAttributePlaceholdersKey</string>
                                        <string>226.IBPluginDependency</string>
                                        <string>226.ImportedFromIB2</string>
                                        <string>227.IBPluginDependency</string>
                                        <string>252.IBViewIntegration.shadowOffsetHeight</string>
                                        <string>252.IBViewIntegration.shadowOffsetWidth</string>
                                        <string>257.IBPluginDependency</string>
+                                       <string>261.IBAttributePlaceholdersKey</string>
                                        <string>261.IBPluginDependency</string>
                                        <string>262.IBPluginDependency</string>
-                                       <string>265.IBPluginDependency</string>
-                                       <string>265.IBViewIntegration.shadowBlurRadius</string>
-                                       <string>265.IBViewIntegration.shadowColor</string>
-                                       <string>265.IBViewIntegration.shadowOffsetHeight</string>
-                                       <string>265.IBViewIntegration.shadowOffsetWidth</string>
-                                       <string>266.IBPluginDependency</string>
+                                       <string>271.IBAttributePlaceholdersKey</string>
                                        <string>271.IBPluginDependency</string>
                                        <string>271.IBViewIntegration.shadowBlurRadius</string>
                                        <string>271.IBViewIntegration.shadowColor</string>
                                        <string>271.IBViewIntegration.shadowOffsetHeight</string>
                                        <string>271.IBViewIntegration.shadowOffsetWidth</string>
                                        <string>272.IBPluginDependency</string>
+                                       <string>275.IBAttributePlaceholdersKey</string>
                                        <string>275.IBPluginDependency</string>
                                        <string>275.IBViewIntegration.shadowBlurRadius</string>
                                        <string>275.IBViewIntegration.shadowColor</string>
                                        <string>280.IBPluginDependency</string>
                                        <string>280.ImportedFromIB2</string>
                                        <string>281.IBPluginDependency</string>
+                                       <string>335.IBPluginDependency</string>
+                                       <string>335.IBViewIntegration.shadowBlurRadius</string>
+                                       <string>335.IBViewIntegration.shadowColor</string>
+                                       <string>335.IBViewIntegration.shadowOffsetHeight</string>
+                                       <string>335.IBViewIntegration.shadowOffsetWidth</string>
+                                       <string>341.IBPluginDependency</string>
+                                       <string>346.IBPluginDependency</string>
+                                       <string>361.IBAttributePlaceholdersKey</string>
+                                       <string>361.IBPluginDependency</string>
+                                       <string>362.IBPluginDependency</string>
+                                       <string>365.IBAttributePlaceholdersKey</string>
+                                       <string>365.IBPluginDependency</string>
+                                       <string>365.IBViewIntegration.shadowBlurRadius</string>
+                                       <string>365.IBViewIntegration.shadowColor</string>
+                                       <string>365.IBViewIntegration.shadowOffsetHeight</string>
+                                       <string>365.IBViewIntegration.shadowOffsetWidth</string>
+                                       <string>366.IBPluginDependency</string>
+                                       <string>372.IBPluginDependency</string>
+                                       <string>372.ImportedFromIB2</string>
+                                       <string>373.IBPluginDependency</string>
+                                       <string>375.IBAttributePlaceholdersKey</string>
+                                       <string>375.IBPluginDependency</string>
+                                       <string>376.IBPluginDependency</string>
+                                       <string>378.IBAttributePlaceholdersKey</string>
+                                       <string>378.IBPluginDependency</string>
+                                       <string>379.IBPluginDependency</string>
                                        <string>38.IBPluginDependency</string>
                                        <string>38.ImportedFromIB2</string>
                                        <string>5.IBEditorWindowLastContentRect</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="798240356"/>
+                                                       <string key="toolTip">Encode And Play Back A Live Preview At Your Current Settings</string>
+                                               </object>
+                                       </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="0"/>
                                        <object class="NSColor" id="864448722">
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="598619000"/>
+                                                       <string key="toolTip">Select The Length Of Live Preview to Encode</string>
+                                               </object>
+                                       </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="0"/>
                                        <integer value="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="569473100"/>
+                                                       <string key="toolTip">Cancel Live Preview Encode</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="141370142"/>
+                                                       <string key="toolTip">Show Picture Settings Inspector</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="0"/>
+                                       <reference ref="864448722"/>
+                                       <integer value="0"/>
+                                       <integer value="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="81685190"/>
+                                                       <string key="toolTip">Scale Preview To Screen</string>
+                                               </object>
+                                       </object>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="0"/>
                                        <reference ref="864448722"/>
                                        <integer value="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="0"/>
                                        <reference ref="864448722"/>
                                        <integer value="0"/>
                                        <integer value="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="102183813"/>
+                                                       <string key="toolTip">Toggle Play/Pause</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="630042886"/>
+                                                       <string key="toolTip">Show Still Previews</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="0"/>
                                        <reference ref="864448722"/>
                                        <integer value="0"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="897614796"/>
+                                                       <string key="toolTip">Go To Beginning</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <object class="NSMutableDictionary">
+                                               <string key="NS.key.0">ToolTip</string>
+                                               <object class="IBToolTipAttribute" key="NS.object.0">
+                                                       <string key="name">ToolTip</string>
+                                                       <reference key="object" ref="894608246"/>
+                                                       <string key="toolTip">Go To End</string>
+                                               </object>
+                                       </object>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>{{411, 519}, {480, 360}}</string>
+                                       <string>{{262, 474}, {480, 360}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <boolean value="NO"/>
-                                       <string>{{411, 519}, {480, 360}}</string>
+                                       <boolean value="YES"/>
+                                       <string>{{262, 474}, {480, 360}}</string>
                                        <integer value="1"/>
                                        <string>{{221, 276}, {533, 580}}</string>
                                        <boolean value="NO"/>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">282</int>
+                       <int key="maxID">395</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                                                <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>SettingsChanged:</string>
+                                                       <string>cancelCreateMoviePreview:</string>
                                                        <string>createMoviePreview:</string>
-                                                       <string>goFullScreen:</string>
                                                        <string>goWindowedScreen:</string>
+                                                       <string>moviePlaybackGoBackwardOneFrame:</string>
+                                                       <string>moviePlaybackGoForwardOneFrame:</string>
+                                                       <string>moviePlaybackGoToBeginning:</string>
+                                                       <string>moviePlaybackGoToEnd:</string>
                                                        <string>pictureSliderChanged:</string>
                                                        <string>previewDurationPopUpChanged:</string>
+                                                       <string>previewScrubberChanged:</string>
                                                        <string>showMoviePreview:</string>
                                                        <string>showPictureSettings:</string>
                                                        <string>showPreviewWindow:</string>
+                                                       <string>toggleMoviePreviewPlayPause:</string>
                                                        <string>toggleScaleToScreen:</string>
-                                                       <string>toggleScreenMode:</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
+                                                       <string>id</string>
                                                        <string>NSString</string>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>SettingsChanged:</string>
+                                                       <string>cancelCreateMoviePreview:</string>
+                                                       <string>createMoviePreview:</string>
+                                                       <string>goWindowedScreen:</string>
+                                                       <string>moviePlaybackGoBackwardOneFrame:</string>
+                                                       <string>moviePlaybackGoForwardOneFrame:</string>
+                                                       <string>moviePlaybackGoToBeginning:</string>
+                                                       <string>moviePlaybackGoToEnd:</string>
+                                                       <string>pictureSliderChanged:</string>
+                                                       <string>previewDurationPopUpChanged:</string>
+                                                       <string>previewScrubberChanged:</string>
+                                                       <string>showMoviePreview:</string>
+                                                       <string>showPictureSettings:</string>
+                                                       <string>showPreviewWindow:</string>
+                                                       <string>toggleMoviePreviewPlayPause:</string>
+                                                       <string>toggleScaleToScreen:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">SettingsChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">cancelCreateMoviePreview:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">createMoviePreview:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">goWindowedScreen:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">moviePlaybackGoBackwardOneFrame:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">moviePlaybackGoForwardOneFrame:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">moviePlaybackGoToBeginning:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">moviePlaybackGoToEnd:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">pictureSliderChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">previewDurationPopUpChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">previewScrubberChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">showMoviePreview:</string>
+                                                               <string key="candidateClassName">NSString</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">showPictureSettings:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">showPreviewWindow:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">toggleMoviePreviewPlayPause:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">toggleScaleToScreen:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <object class="NSArray" key="dict.sortedKeys">
                                                        <string>fCancelPreviewMovieButton</string>
                                                        <string>fCreatePreviewMovieButton</string>
                                                        <string>fEncodingControlBox</string>
-                                                       <string>fFullScreenToggleButton</string>
+                                                       <string>fGoBackwardOneFrameButton</string>
+                                                       <string>fGoForwardOneFrameButton</string>
+                                                       <string>fGoToBeginningButton</string>
+                                                       <string>fGoToEndButton</string>
+                                                       <string>fGoToStillPreviewButton</string>
                                                        <string>fInfoField</string>
                                                        <string>fMovieCreationProgressIndicator</string>
+                                                       <string>fMovieInfoField</string>
+                                                       <string>fMoviePlaybackControlBox</string>
+                                                       <string>fMovieScrubberSlider</string>
                                                        <string>fMovieView</string>
                                                        <string>fPictureControlBox</string>
                                                        <string>fPictureSettingsToggleButton</string>
                                                        <string>fPictureSlider</string>
                                                        <string>fPictureView</string>
                                                        <string>fPictureViewArea</string>
+                                                       <string>fPlayPauseButton</string>
                                                        <string>fPreviewMovieLengthPopUp</string>
                                                        <string>fPreviewMovieStatusField</string>
                                                        <string>fPreviewWindow</string>
                                                        <string>NSButton</string>
                                                        <string>NSBox</string>
                                                        <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
+                                                       <string>NSButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSProgressIndicator</string>
+                                                       <string>NSTextField</string>
+                                                       <string>NSBox</string>
+                                                       <string>NSSlider</string>
                                                        <string>QTMovieView</string>
                                                        <string>NSBox</string>
                                                        <string>NSButton</string>
                                                        <string>NSSlider</string>
                                                        <string>NSImageView</string>
                                                        <string>NSBox</string>
+                                                       <string>NSButton</string>
                                                        <string>NSPopUpButton</string>
                                                        <string>NSTextField</string>
                                                        <string>NSWindow</string>
                                                        <string>NSTextField</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fCancelPreviewMovieButton</string>
+                                                       <string>fCreatePreviewMovieButton</string>
+                                                       <string>fEncodingControlBox</string>
+                                                       <string>fGoBackwardOneFrameButton</string>
+                                                       <string>fGoForwardOneFrameButton</string>
+                                                       <string>fGoToBeginningButton</string>
+                                                       <string>fGoToEndButton</string>
+                                                       <string>fGoToStillPreviewButton</string>
+                                                       <string>fInfoField</string>
+                                                       <string>fMovieCreationProgressIndicator</string>
+                                                       <string>fMovieInfoField</string>
+                                                       <string>fMoviePlaybackControlBox</string>
+                                                       <string>fMovieScrubberSlider</string>
+                                                       <string>fMovieView</string>
+                                                       <string>fPictureControlBox</string>
+                                                       <string>fPictureSettingsToggleButton</string>
+                                                       <string>fPictureSlider</string>
+                                                       <string>fPictureView</string>
+                                                       <string>fPictureViewArea</string>
+                                                       <string>fPlayPauseButton</string>
+                                                       <string>fPreviewMovieLengthPopUp</string>
+                                                       <string>fPreviewMovieStatusField</string>
+                                                       <string>fPreviewWindow</string>
+                                                       <string>fScaleToScreenToggleButton</string>
+                                                       <string>fShowPreviewMovieButton</string>
+                                                       <string>fscaleInfoField</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fCancelPreviewMovieButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fCreatePreviewMovieButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fEncodingControlBox</string>
+                                                               <string key="candidateClassName">NSBox</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGoBackwardOneFrameButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGoForwardOneFrameButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGoToBeginningButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGoToEndButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGoToStillPreviewButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fInfoField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fMovieCreationProgressIndicator</string>
+                                                               <string key="candidateClassName">NSProgressIndicator</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fMovieInfoField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fMoviePlaybackControlBox</string>
+                                                               <string key="candidateClassName">NSBox</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fMovieScrubberSlider</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fMovieView</string>
+                                                               <string key="candidateClassName">QTMovieView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureControlBox</string>
+                                                               <string key="candidateClassName">NSBox</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureSettingsToggleButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureSlider</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureView</string>
+                                                               <string key="candidateClassName">NSImageView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureViewArea</string>
+                                                               <string key="candidateClassName">NSBox</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPlayPauseButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPreviewMovieLengthPopUp</string>
+                                                               <string key="candidateClassName">NSPopUpButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPreviewMovieStatusField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPreviewWindow</string>
+                                                               <string key="candidateClassName">NSWindow</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fScaleToScreenToggleButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fShowPreviewMovieButton</string>
+                                                               <string key="candidateClassName">NSButton</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fscaleInfoField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBProjectSource</string>
                                                <string key="minorKey">HBPreviewController.h</string>
                                                <string key="NS.key.0">showWindow:</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">showWindow:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">showWindow:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBFrameworkSource</string>
                                                <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string>
                                                        <string>id</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>add:</string>
+                                                       <string>addScaled:</string>
+                                                       <string>copy:</string>
+                                                       <string>cut:</string>
+                                                       <string>delete:</string>
+                                                       <string>gotoBeginning:</string>
+                                                       <string>gotoEnd:</string>
+                                                       <string>gotoNextSelectionPoint:</string>
+                                                       <string>gotoPosterFrame:</string>
+                                                       <string>gotoPreviousSelectionPoint:</string>
+                                                       <string>paste:</string>
+                                                       <string>pause:</string>
+                                                       <string>play:</string>
+                                                       <string>replace:</string>
+                                                       <string>selectAll:</string>
+                                                       <string>selectNone:</string>
+                                                       <string>stepBackward:</string>
+                                                       <string>stepForward:</string>
+                                                       <string>trim:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">add:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">addScaled:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">copy:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">cut:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">delete:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">gotoBeginning:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">gotoEnd:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">gotoNextSelectionPoint:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">gotoPosterFrame:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">gotoPreviousSelectionPoint:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">paste:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">pause:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">play:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">replace:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">selectAll:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">selectNone:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">stepBackward:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">stepForward:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">trim:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <reference key="sourceIdentifier" ref="68262679"/>
                                </object>
                        </object>
                </object>
                <int key="IBDocument.localizationMode">0</int>
+               <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
                <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
                        <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
                        <integer value="1050" key="NS.object.0"/>
                <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
                <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
                <int key="IBDocument.defaultPropertyAccessControl">3</int>
+               <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+                       <bool key="EncodedWithXMLCoder">YES</bool>
+                       <object class="NSArray" key="dict.sortedKeys">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>NSMenuCheckmark</string>
+                               <string>NSMenuMixedState</string>
+                       </object>
+                       <object class="NSMutableArray" key="dict.values">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>{9, 8}</string>
+                               <string>{7, 2}</string>
+                       </object>
+               </object>
        </data>
 </archive>
index 85c1e68..2f877b5 100644 (file)
@@ -2,18 +2,17 @@
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
        <data>
                <int key="IBDocument.SystemTarget">1050</int>
-               <string key="IBDocument.SystemVersion">10B504</string>
-               <string key="IBDocument.InterfaceBuilderVersion">732</string>
-               <string key="IBDocument.AppKitVersion">1038.2</string>
-               <string key="IBDocument.HIToolboxVersion">437.00</string>
+               <string key="IBDocument.SystemVersion">10F569</string>
+               <string key="IBDocument.InterfaceBuilderVersion">788</string>
+               <string key="IBDocument.AppKitVersion">1038.29</string>
+               <string key="IBDocument.HIToolboxVersion">461.00</string>
                <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
                        <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-                       <string key="NS.object.0">732</string>
+                       <string key="NS.object.0">788</string>
                </object>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
-                       <integer value="235"/>
-                       <integer value="233"/>
+                       <integer value="236"/>
                </object>
                <object class="NSArray" key="IBDocument.PluginDependencies">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                                <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                        </object>
                        <object class="NSUserDefaultsController" id="580534391">
+                               <object class="NSMutableArray" key="NSDeclaredKeys">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <string>MinTitleScanSeconds</string>
+                               </object>
                                <bool key="NSSharedInstance">YES</bool>
                        </object>
                        <object class="NSCustomView" id="1048779201">
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                       <object class="NSButton" id="906899216">
+                                       <object class="NSButton" id="1009109497">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 18}, {311, 18}}</string>
+                                               <string key="NSFrame">{{123, 90}, {313, 18}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
-                                               <object class="NSButtonCell" key="NSCell" id="36851657">
-                                                       <int key="NSCellFlags">67239424</int>
+                                               <object class="NSButtonCell" key="NSCell" id="878201725">
+                                                       <int key="NSCellFlags">-2080244224</int>
                                                        <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents">Use iPod/iTunes friendly (.m4v) file extension for MP4</string>
+                                                       <string key="NSContents">Play System Alert Sound</string>
                                                        <object class="NSFont" key="NSSupport" id="26">
                                                                <string key="NSName">LucidaGrande</string>
                                                                <double key="NSSize">11</double>
                                                                <int key="NSfFlags">3100</int>
                                                        </object>
-                                                       <reference key="NSControlView" ref="906899216"/>
+                                                       <reference key="NSControlView" ref="1009109497"/>
                                                        <int key="NSButtonFlags">1211912703</int>
                                                        <int key="NSButtonFlags2">2</int>
+                                                       <object class="NSCustomResource" key="NSNormalImage" id="491838135">
+                                                               <string key="NSClassName">NSImage</string>
+                                                               <string key="NSResourceName">NSSwitch</string>
+                                                       </object>
                                                        <object class="NSButtonImageSource" key="NSAlternateImage" id="1056213191">
                                                                <string key="NSImageName">NSSwitch</string>
                                                        </object>
                                                        <int key="NSPeriodicInterval">25</int>
                                                </object>
                                        </object>
+                                       <object class="NSButton" id="806259169">
+                                               <reference key="NSNextResponder" ref="1048779201"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{345, 71}, {96, 16}}</string>
+                                               <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSButtonCell" key="NSCell" id="725806271">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">134479872</int>
+                                                       <string key="NSContents">Browse ...</string>
+                                                       <object class="NSFont" key="NSSupport">
+                                                               <string key="NSName">LucidaGrande</string>
+                                                               <double key="NSSize">9</double>
+                                                               <int key="NSfFlags">3614</int>
+                                                       </object>
+                                                       <reference key="NSControlView" ref="806259169"/>
+                                                       <int key="NSButtonFlags">-2038284033</int>
+                                                       <int key="NSButtonFlags2">129</int>
+                                                       <string key="NSAlternateContents"/>
+                                                       <string key="NSKeyEquivalent"/>
+                                                       <int key="NSPeriodicDelay">200</int>
+                                                       <int key="NSPeriodicInterval">25</int>
+                                               </object>
+                                       </object>
+                                       <object class="NSTextField" id="842132572">
+                                               <reference key="NSNextResponder" ref="1048779201"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{209, 73}, {125, 14}}</string>
+                                               <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="456853603">
+                                                       <int key="NSCellFlags">68288064</int>
+                                                       <int key="NSCellFlags2">272761856</int>
+                                                       <string key="NSContents">None</string>
+                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSControlView" ref="842132572"/>
+                                                       <object class="NSColor" key="NSBackgroundColor" id="525377782">
+                                                               <int key="NSColorSpace">6</int>
+                                                               <string key="NSCatalogName">System</string>
+                                                               <string key="NSColorName">controlColor</string>
+                                                               <object class="NSColor" key="NSColor" id="666005350">
+                                                                       <int key="NSColorSpace">3</int>
+                                                                       <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+                                                               </object>
+                                                       </object>
+                                                       <object class="NSColor" key="NSTextColor" id="887152126">
+                                                               <int key="NSColorSpace">6</int>
+                                                               <string key="NSCatalogName">System</string>
+                                                               <string key="NSColorName">controlTextColor</string>
+                                                               <object class="NSColor" key="NSColor" id="897199777">
+                                                                       <int key="NSColorSpace">3</int>
+                                                                       <bytes key="NSWhite">MAA</bytes>
+                                                               </object>
+                                                       </object>
+                                               </object>
+                                       </object>
+                                       <object class="NSButton" id="906899216">
+                                               <reference key="NSNextResponder" ref="1048779201"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{125, 18}, {311, 18}}</string>
+                                               <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSButtonCell" key="NSCell" id="36851657">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">131072</int>
+                                                       <string key="NSContents">Use iPod/iTunes friendly (.m4v) file extension for MP4</string>
+                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSControlView" ref="906899216"/>
+                                                       <int key="NSButtonFlags">1211912703</int>
+                                                       <int key="NSButtonFlags2">2</int>
+                                                       <reference key="NSAlternateImage" ref="1056213191"/>
+                                                       <string key="NSAlternateContents"/>
+                                                       <string key="NSKeyEquivalent"/>
+                                                       <int key="NSPeriodicDelay">200</int>
+                                                       <int key="NSPeriodicInterval">25</int>
+                                               </object>
+                                       </object>
                                        <object class="NSButton" id="636306431">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 200}, {133, 18}}</string>
+                                               <string key="NSFrame">{{123, 220}, {133, 18}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="448858755">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSButton" id="965044526">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 38}, {303, 18}}</string>
+                                               <string key="NSFrame">{{125, 38}, {303, 18}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="419322096">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSTextField" id="315188467">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{52, 97}, {69, 14}}</string>
+                                               <string key="NSFrame">{{52, 117}, {69, 14}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="718672066">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <string key="NSContents">When Done:</string>
                                                        <reference key="NSSupport" ref="26"/>
                                                        <reference key="NSControlView" ref="315188467"/>
-                                                       <object class="NSColor" key="NSBackgroundColor" id="525377782">
-                                                               <int key="NSColorSpace">6</int>
-                                                               <string key="NSCatalogName">System</string>
-                                                               <string key="NSColorName">controlColor</string>
-                                                               <object class="NSColor" key="NSColor" id="666005350">
-                                                                       <int key="NSColorSpace">3</int>
-                                                                       <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
-                                                               </object>
-                                                       </object>
-                                                       <object class="NSColor" key="NSTextColor" id="887152126">
-                                                               <int key="NSColorSpace">6</int>
-                                                               <string key="NSCatalogName">System</string>
-                                                               <string key="NSColorName">controlTextColor</string>
-                                                               <object class="NSColor" key="NSColor">
-                                                                       <int key="NSColorSpace">3</int>
-                                                                       <bytes key="NSWhite">MAA</bytes>
-                                                               </object>
-                                                       </object>
+                                                       <reference key="NSBackgroundColor" ref="525377782"/>
+                                                       <reference key="NSTextColor" ref="887152126"/>
                                                </object>
                                        </object>
                                        <object class="NSButton" id="581738572">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 155}, {194, 18}}</string>
+                                               <string key="NSFrame">{{123, 175}, {194, 18}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="824062726">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSButton" id="597305137">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 70}, {119, 18}}</string>
+                                               <string key="NSFrame">{{123, 71}, {86, 18}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="437495050">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents">Send file to MetaX</string>
+                                                       <string key="NSContents">Send file to:</string>
                                                        <reference key="NSSupport" ref="26"/>
                                                        <reference key="NSControlView" ref="597305137"/>
                                                        <int key="NSButtonFlags">1211912703</int>
                                                        <int key="NSButtonFlags2">2</int>
-                                                       <object class="NSCustomResource" key="NSNormalImage" id="476074553">
-                                                               <string key="NSClassName">NSImage</string>
-                                                               <string key="NSResourceName">NSSwitch</string>
-                                                       </object>
+                                                       <reference key="NSNormalImage" ref="491838135"/>
                                                        <reference key="NSAlternateImage" ref="1056213191"/>
                                                        <string key="NSAlternateContents"/>
                                                        <string key="NSKeyEquivalent"/>
                                        <object class="NSTextField" id="576686737">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{62, 202}, {59, 14}}</string>
+                                               <string key="NSFrame">{{62, 222}, {59, 14}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="404194395">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSTextField" id="280291731">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{141, 179}, {95, 14}}</string>
+                                               <string key="NSFrame">{{141, 199}, {95, 14}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="1049782015">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSTextField" id="713240777">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{50, 40}, {71, 14}}</string>
+                                               <string key="NSFrame">{{52, 40}, {71, 14}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="947435557">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSPopUpButton" id="317169558">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{123, 90}, {189, 22}}</string>
+                                               <string key="NSFrame">{{123, 110}, {189, 22}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="792374025">
                                                        <int key="NSCellFlags">71433792</int>
                                        <object class="NSPopUpButton" id="954667708">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{141, 128}, {102, 22}}</string>
+                                               <string key="NSFrame">{{141, 148}, {102, 22}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="841218599">
                                                        <int key="NSCellFlags">71433792</int>
                                        <object class="NSPopUpButton" id="54712339">
                                                <reference key="NSNextResponder" ref="1048779201"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{238, 174}, {205, 22}}</string>
+                                               <string key="NSFrame">{{238, 194}, {205, 22}}</string>
                                                <reference key="NSSuperview" ref="1048779201"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="310956178">
                                                        <int key="NSCellFlags">71433792</int>
                                                </object>
                                        </object>
                                </object>
-                               <string key="NSFrameSize">{492, 236}</string>
+                               <string key="NSFrameSize">{460, 256}</string>
                                <reference key="NSSuperview"/>
+                               <reference key="NSWindow"/>
                                <string key="NSClassName">NSView</string>
                                <string key="NSExtension">NSControl</string>
                        </object>
                        <object class="NSCustomView" id="520288288">
-                               <nil key="NSNextResponder"/>
+                               <reference key="NSNextResponder"/>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                <int key="NSvFlags">268</int>
                                                <string key="NSFrame">{{34, 42}, {432, 17}}</string>
                                                <reference key="NSSuperview" ref="520288288"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="374363387">
                                                        <int key="NSCellFlags">67239488</int>
                                        </object>
                                </object>
                                <string key="NSFrameSize">{496, 82}</string>
+                               <reference key="NSSuperview"/>
+                               <reference key="NSWindow"/>
                                <string key="NSClassName">NSView</string>
                                <string key="NSExtension">NSResponder</string>
                        </object>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{30, 56}, {96, 14}}</string>
                                                <reference key="NSSuperview" ref="332598366"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="459708758">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{95, 22}, {31, 14}}</string>
                                                <reference key="NSSuperview" ref="332598366"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="954547948">
                                                        <int key="NSCellFlags">67239424</int>
                                                <int key="NSvFlags">256</int>
                                                <string key="NSFrame">{{131, 50}, {247, 22}}</string>
                                                <reference key="NSSuperview" ref="332598366"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSComboBoxCell" key="NSCell" id="210320026">
                                                        <int key="NSCellFlags">343014976</int>
                                                        <reference key="NSSupport" ref="26"/>
                                                        <reference key="NSControlView" ref="172081130"/>
                                                        <bool key="NSDrawsBackground">YES</bool>
-                                                       <object class="NSColor" key="NSBackgroundColor">
+                                                       <object class="NSColor" key="NSBackgroundColor" id="84276979">
                                                                <int key="NSColorSpace">6</int>
                                                                <string key="NSCatalogName">System</string>
                                                                <string key="NSColorName">textBackgroundColor</string>
                                                <int key="NSvFlags">-2147483392</int>
                                                <string key="NSFrame">{{18, -4}, {472, 18}}</string>
                                                <reference key="NSSuperview" ref="332598366"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="686321393">
                                                        <int key="NSCellFlags">604110336</int>
                                                <int key="NSvFlags">268</int>
                                                <string key="NSFrame">{{128, 20}, {333, 18}}</string>
                                                <reference key="NSSuperview" ref="332598366"/>
+                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="787274685">
                                                        <int key="NSCellFlags">-2080244224</int>
                                                        <int key="NSCellFlags2">131072</int>
-                                                       <string key="NSContents">Use CoreAudio instead of FAAC for preset default encoder</string>
+                                                       <string key="NSContents">Use CoreAudio instead of FAAC for Built-In Presets</string>
                                                        <reference key="NSSupport" ref="26"/>
                                                        <reference key="NSControlView" ref="1054432492"/>
                                                        <int key="NSButtonFlags">1211912703</int>
                                                        <int key="NSButtonFlags2">130</int>
-                                                       <reference key="NSNormalImage" ref="476074553"/>
+                                                       <reference key="NSNormalImage" ref="491838135"/>
                                                        <reference key="NSAlternateImage" ref="1056213191"/>
                                                        <string key="NSAlternateContents"/>
                                                        <string key="NSKeyEquivalent"/>
                                </object>
                                <string key="NSFrameSize">{492, 91}</string>
                                <reference key="NSSuperview"/>
+                               <reference key="NSWindow"/>
                                <object class="NSMutableString" key="NSClassName">
                                        <characters key="NS.bytes">NSView</characters>
                                </object>
                                <int key="NSvFlags">256</int>
                                <object class="NSMutableArray" key="NSSubviews">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <object class="NSTextField" id="62457548">
+                                               <reference key="NSNextResponder" ref="23728330"/>
+                                               <int key="NSvFlags">268</int>
+                                               <string key="NSFrame">{{302, 172}, {48, 19}}</string>
+                                               <reference key="NSSuperview" ref="23728330"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="607341761">
+                                                       <int key="NSCellFlags">-1804468671</int>
+                                                       <int key="NSCellFlags2">272761856</int>
+                                                       <string key="NSContents"/>
+                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSControlView" ref="62457548"/>
+                                                       <bool key="NSDrawsBackground">YES</bool>
+                                                       <reference key="NSBackgroundColor" ref="84276979"/>
+                                                       <object class="NSColor" key="NSTextColor">
+                                                               <int key="NSColorSpace">6</int>
+                                                               <string key="NSCatalogName">System</string>
+                                                               <string key="NSColorName">textColor</string>
+                                                               <reference key="NSColor" ref="897199777"/>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="NSTextField" id="226601760">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{17, 203}, {280, 14}}</string>
+                                               <string key="NSFrame">{{17, 207}, {280, 14}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="1064438472">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <reference key="NSTextColor" ref="887152126"/>
                                                </object>
                                        </object>
+                                       <object class="NSTextField" id="469378299">
+                                               <reference key="NSNextResponder" ref="23728330"/>
+                                               <int key="NSvFlags">256</int>
+                                               <string key="NSFrame">{{48, 175}, {249, 14}}</string>
+                                               <reference key="NSSuperview" ref="23728330"/>
+                                               <bool key="NSEnabled">YES</bool>
+                                               <object class="NSTextFieldCell" key="NSCell" id="552368920">
+                                                       <int key="NSCellFlags">67239424</int>
+                                                       <int key="NSCellFlags2">71434240</int>
+                                                       <string key="NSContents">Minimum length of title to scan (seconds):</string>
+                                                       <reference key="NSSupport" ref="26"/>
+                                                       <reference key="NSControlView" ref="469378299"/>
+                                                       <reference key="NSBackgroundColor" ref="525377782"/>
+                                                       <reference key="NSTextColor" ref="887152126"/>
+                                               </object>
+                                       </object>
                                        <object class="NSTextField" id="701867067">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{99, 169}, {198, 14}}</string>
+                                               <string key="NSFrame">{{99, 145}, {198, 14}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="978611587">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSTextField" id="173328305">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{137, 78}, {150, 14}}</string>
+                                               <string key="NSFrame">{{137, 53}, {160, 15}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="271531935">
                                                        <int key="NSCellFlags">67239424</int>
                                                        <int key="NSCellFlags2">4325376</int>
-                                                       <string key="NSContents">Activity Log Vebosity Level:</string>
+                                                       <string key="NSContents">Activity Log Verbosity Level:</string>
                                                        <reference key="NSSupport" ref="26"/>
                                                        <reference key="NSControlView" ref="173328305"/>
                                                        <reference key="NSBackgroundColor" ref="525377782"/>
                                        <object class="NSTextField" id="899831697">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{108, 100}, {27, 14}}</string>
+                                               <string key="NSFrame">{{108, 76}, {27, 14}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="483848741">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSTextField" id="898312631">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{70, 134}, {65, 14}}</string>
+                                               <string key="NSFrame">{{70, 110}, {65, 14}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="1062716368">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSButton" id="907177043">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{137, 98}, {304, 18}}</string>
+                                               <string key="NSFrame">{{137, 74}, {304, 18}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="869757541">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSButton" id="745324926">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{137, 132}, {220, 18}}</string>
+                                               <string key="NSFrame">{{137, 108}, {220, 18}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="884409108">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSButton" id="712613872">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{137, 42}, {217, 18}}</string>
+                                               <string key="NSFrame">{{137, 18}, {217, 18}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSButtonCell" key="NSCell" id="562265695">
                                                        <int key="NSCellFlags">67239424</int>
                                        <object class="NSPopUpButton" id="772611942">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">268</int>
-                                               <string key="NSFrame">{{299, 164}, {73, 22}}</string>
+                                               <string key="NSFrame">{{299, 140}, {73, 22}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="413609467">
                                                        <int key="NSCellFlags">-2076049856</int>
                                        <object class="NSPopUpButton" id="822080053">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">268</int>
-                                               <string key="NSFrame">{{299, 198}, {76, 22}}</string>
+                                               <string key="NSFrame">{{299, 202}, {76, 22}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="434430620">
                                                        <int key="NSCellFlags">-2076049856</int>
                                        <object class="NSPopUpButton" id="895206300">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">268</int>
-                                               <string key="NSFrame">{{289, 73}, {66, 22}}</string>
+                                               <string key="NSFrame">{{303, 49}, {66, 22}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSPopUpButtonCell" key="NSCell" id="290473288">
                                                        <int key="NSCellFlags">-2076049856</int>
                                        <object class="NSTextField" id="200780219">
                                                <reference key="NSNextResponder" ref="23728330"/>
                                                <int key="NSvFlags">256</int>
-                                               <string key="NSFrame">{{89, 44}, {46, 14}}</string>
+                                               <string key="NSFrame">{{89, 20}, {46, 14}}</string>
                                                <reference key="NSSuperview" ref="23728330"/>
-                                               <reference key="NSWindow"/>
                                                <bool key="NSEnabled">YES</bool>
                                                <object class="NSTextFieldCell" key="NSCell" id="221545613">
                                                        <int key="NSCellFlags">67239424</int>
                                                </object>
                                        </object>
                                </object>
-                               <string key="NSFrameSize">{492, 237}</string>
+                               <string key="NSFrameSize">{495, 241}</string>
                                <reference key="NSSuperview"/>
-                               <reference key="NSWindow"/>
                                <object class="NSMutableString" key="NSClassName">
                                        <characters key="NS.bytes">NSView</characters>
                                </object>
                                        </object>
                                        <int key="connectionID">434</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: values.SendCompletedEncodeToApp</string>
+                                               <reference key="source" ref="456853603"/>
+                                               <reference key="destination" ref="580534391"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="456853603"/>
+                                                       <reference key="NSDestination" ref="580534391"/>
+                                                       <string key="NSLabel">value: values.SendCompletedEncodeToApp</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">values.SendCompletedEncodeToApp</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">453</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: values.SendCompletedEncodeToApp</string>
+                                               <reference key="source" ref="842132572"/>
+                                               <reference key="destination" ref="580534391"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="842132572"/>
+                                                       <reference key="NSDestination" ref="580534391"/>
+                                                       <string key="NSLabel">value: values.SendCompletedEncodeToApp</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">values.SendCompletedEncodeToApp</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">454</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">browseSendToApp:</string>
+                                               <reference key="source" ref="169862212"/>
+                                               <reference key="destination" ref="806259169"/>
+                                       </object>
+                                       <int key="connectionID">455</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">fSendEncodeToAppField</string>
+                                               <reference key="source" ref="169862212"/>
+                                               <reference key="destination" ref="842132572"/>
+                                       </object>
+                                       <int key="connectionID">456</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: values.AlertWhenDoneSound</string>
+                                               <reference key="source" ref="1009109497"/>
+                                               <reference key="destination" ref="580534391"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="1009109497"/>
+                                                       <reference key="NSDestination" ref="580534391"/>
+                                                       <string key="NSLabel">value: values.AlertWhenDoneSound</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">values.AlertWhenDoneSound</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">460</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBBindingConnection" key="connection">
+                                               <string key="label">value: values.MinTitleScanSeconds</string>
+                                               <reference key="source" ref="62457548"/>
+                                               <reference key="destination" ref="580534391"/>
+                                               <object class="NSNibBindingConnector" key="connector">
+                                                       <reference key="NSSource" ref="62457548"/>
+                                                       <reference key="NSDestination" ref="580534391"/>
+                                                       <string key="NSLabel">value: values.MinTitleScanSeconds</string>
+                                                       <string key="NSBinding">value</string>
+                                                       <string key="NSKeyPath">values.MinTitleScanSeconds</string>
+                                                       <int key="NSNibBindingConnectorVersion">2</int>
+                                               </object>
+                                       </object>
+                                       <int key="connectionID">483</int>
+                               </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <object class="NSArray" key="orderedObjects">
                                                <reference key="object" ref="1048779201"/>
                                                <object class="NSMutableArray" key="children">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                                       <reference ref="906899216"/>
                                                        <reference ref="636306431"/>
-                                                       <reference ref="965044526"/>
                                                        <reference ref="315188467"/>
                                                        <reference ref="581738572"/>
                                                        <reference ref="597305137"/>
                                                        <reference ref="576686737"/>
                                                        <reference ref="280291731"/>
-                                                       <reference ref="713240777"/>
                                                        <reference ref="317169558"/>
                                                        <reference ref="954667708"/>
                                                        <reference ref="54712339"/>
+                                                       <reference ref="842132572"/>
+                                                       <reference ref="806259169"/>
+                                                       <reference ref="1009109497"/>
+                                                       <reference ref="713240777"/>
+                                                       <reference ref="965044526"/>
+                                                       <reference ref="906899216"/>
                                                </object>
                                                <reference key="parent" ref="0"/>
                                                <string key="objectName">General</string>
                                                        <reference ref="712613872"/>
                                                        <reference ref="226601760"/>
                                                        <reference ref="822080053"/>
+                                                       <reference ref="469378299"/>
+                                                       <reference ref="62457548"/>
                                                </object>
                                                <reference key="parent" ref="0"/>
                                                <string key="objectName">Advanced</string>
                                                <reference key="object" ref="954547948"/>
                                                <reference key="parent" ref="247298122"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">448</int>
+                                               <reference key="object" ref="842132572"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="456853603"/>
+                                               </object>
+                                               <reference key="parent" ref="1048779201"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">449</int>
+                                               <reference key="object" ref="456853603"/>
+                                               <reference key="parent" ref="842132572"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">450</int>
+                                               <reference key="object" ref="806259169"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="725806271"/>
+                                               </object>
+                                               <reference key="parent" ref="1048779201"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">451</int>
+                                               <reference key="object" ref="725806271"/>
+                                               <reference key="parent" ref="806259169"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">457</int>
+                                               <reference key="object" ref="1009109497"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="878201725"/>
+                                               </object>
+                                               <reference key="parent" ref="1048779201"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">458</int>
+                                               <reference key="object" ref="878201725"/>
+                                               <reference key="parent" ref="1009109497"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">463</int>
+                                               <reference key="object" ref="469378299"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="552368920"/>
+                                               </object>
+                                               <reference key="parent" ref="23728330"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">464</int>
+                                               <reference key="object" ref="552368920"/>
+                                               <reference key="parent" ref="469378299"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">480</int>
+                                               <reference key="object" ref="62457548"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="607341761"/>
+                                               </object>
+                                               <reference key="parent" ref="23728330"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">481</int>
+                                               <reference key="object" ref="607341761"/>
+                                               <reference key="parent" ref="62457548"/>
+                                       </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
                                        <string>-3.IBPluginDependency</string>
                                        <string>233.IBEditorWindowLastContentRect</string>
                                        <string>233.IBPluginDependency</string>
+                                       <string>233.IBViewEditorWindowController.showingLayoutRectangles</string>
                                        <string>233.ImportedFromIB2</string>
                                        <string>233.editorWindowContentRectSynchronizationRect</string>
                                        <string>234.IBEditorWindowLastContentRect</string>
                                        <string>446.IBPluginDependency</string>
                                        <string>446.ImportedFromIB2</string>
                                        <string>447.IBPluginDependency</string>
+                                       <string>448.IBPluginDependency</string>
+                                       <string>449.IBPluginDependency</string>
+                                       <string>450.IBPluginDependency</string>
+                                       <string>451.IBPluginDependency</string>
+                                       <string>457.IBPluginDependency</string>
+                                       <string>457.ImportedFromIB2</string>
+                                       <string>458.IBPluginDependency</string>
+                                       <string>463.IBPluginDependency</string>
+                                       <string>463.ImportedFromIB2</string>
+                                       <string>464.IBPluginDependency</string>
+                                       <string>480.IBPluginDependency</string>
+                                       <string>481.IBPluginDependency</string>
                                        <string>5.IBEditorWindowLastContentRect</string>
                                        <string>5.IBPluginDependency</string>
                                        <string>5.IBWindowTemplateEditedContentRect</string>
                                <object class="NSMutableArray" key="dict.values">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{198, 532}, {492, 236}}</string>
+                                       <string>{{275, 562}, {460, 256}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <boolean value="YES"/>
                                        <integer value="1"/>
                                        <string>{{0, 636}, {500, 209}}</string>
                                        <string>{{144, 376}, {496, 82}}</string>
                                        <string>{{73, 765}, {492, 91}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
-                                       <string>{{451, 407}, {492, 237}}</string>
+                                       <string>{{229, 565}, {495, 241}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>{{0, 650}, {500, 184}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>{{69, 656}, {500, 200}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>{{69, 656}, {500, 200}}</string>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">447</int>
+                       <int key="maxID">483</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                                <object class="IBPartialClassDescription">
                                        <string key="className">HBPreferencesController</string>
                                        <string key="superclassName">NSWindowController</string>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <string key="NS.key.0">browseSendToApp:</string>
+                                               <string key="NS.object.0">id</string>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">browseSendToApp:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">browseSendToApp:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                <object class="NSArray" key="dict.sortedKeys">
                                                        <string>fAudioView</string>
                                                        <string>fGeneralView</string>
                                                        <string>fPictureView</string>
+                                                       <string>fSendEncodeToAppField</string>
                                                </object>
                                                <object class="NSMutableArray" key="dict.values">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>NSView</string>
                                                        <string>NSView</string>
                                                        <string>NSView</string>
+                                                       <string>NSTextField</string>
+                                               </object>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fAdvancedView</string>
+                                                       <string>fAudioView</string>
+                                                       <string>fGeneralView</string>
+                                                       <string>fPictureView</string>
+                                                       <string>fSendEncodeToAppField</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fAdvancedView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fAudioView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fGeneralView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fPictureView</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fSendEncodeToAppField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
                                                </object>
                                        </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="NS.key.0">runModal:</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">runModal:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">runModal:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBUserSource</string>
                                                <string key="minorKey"/>
                                                <string key="NS.key.0">checkForUpdates:</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">checkForUpdates:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">checkForUpdates:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <string key="NS.key.0">delegate</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <string key="NS.key.0">delegate</string>
+                                               <object class="IBToOneOutletInfo" key="NS.object.0">
+                                                       <string key="name">delegate</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <reference key="sourceIdentifier" ref="606901004"/>
                                </object>
                        </object>
                                                <string key="NS.key.0">showWindow:</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">showWindow:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">showWindow:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBFrameworkSource</string>
                                                <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string>
                                                <string key="NS.key.0">checkForUpdates:</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">checkForUpdates:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">checkForUpdates:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <string key="NS.key.0">delegate</string>
                                                <string key="NS.object.0">id</string>
                                        </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <string key="NS.key.0">delegate</string>
+                                               <object class="IBToOneOutletInfo" key="NS.object.0">
+                                                       <string key="name">delegate</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
                                        <reference key="sourceIdentifier" ref="568667533"/>
                                </object>
                        </object>
                </object>
                <int key="IBDocument.localizationMode">0</int>
+               <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
                <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
                        <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
                        <integer value="1050" key="NS.object.0"/>
                <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
                <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
                <int key="IBDocument.defaultPropertyAccessControl">3</int>
+               <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+                       <bool key="EncodedWithXMLCoder">YES</bool>
+                       <object class="NSArray" key="dict.sortedKeys">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>NSMenuCheckmark</string>
+                               <string>NSMenuMixedState</string>
+                               <string>NSSwitch</string>
+                       </object>
+                       <object class="NSMutableArray" key="dict.values">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>{9, 8}</string>
+                               <string>{7, 2}</string>
+                               <string>{15, 15}</string>
+                       </object>
+               </object>
        </data>
 </archive>
index 667d263..4c9d705 100644 (file)
@@ -1,19 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.02">
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
        <data>
                <int key="IBDocument.SystemTarget">1050</int>
-               <string key="IBDocument.SystemVersion">9F33</string>
-               <string key="IBDocument.InterfaceBuilderVersion">670</string>
-               <string key="IBDocument.AppKitVersion">949.34</string>
-               <string key="IBDocument.HIToolboxVersion">352.00</string>
+               <string key="IBDocument.SystemVersion">10F569</string>
+               <string key="IBDocument.InterfaceBuilderVersion">788</string>
+               <string key="IBDocument.AppKitVersion">1038.29</string>
+               <string key="IBDocument.HIToolboxVersion">461.00</string>
+               <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+                       <string key="NS.object.0">788</string>
+               </object>
                <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
                        <bool key="EncodedWithXMLCoder">YES</bool>
-                       <integer value="2596"/>
+                       <integer value="2577"/>
+                       <integer value="2649"/>
                </object>
                <object class="NSArray" key="IBDocument.PluginDependencies">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                </object>
+               <object class="NSMutableDictionary" key="IBDocument.Metadata">
+                       <bool key="EncodedWithXMLCoder">YES</bool>
+                       <object class="NSArray" key="dict.sortedKeys" id="0">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                       </object>
+                       <object class="NSMutableArray" key="dict.values">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                       </object>
+               </object>
                <object class="NSMutableArray" key="IBDocument.RootObjects" id="543585533">
                        <bool key="EncodedWithXMLCoder">YES</bool>
                        <object class="NSCustomObject" id="678333032">
                        <object class="NSWindowTemplate" id="238545558">
                                <int key="NSWindowStyleMask">4111</int>
                                <int key="NSWindowBacking">2</int>
-                               <string key="NSWindowRect">{{893, 137}, {574, 423}}</string>
+                               <string key="NSWindowRect">{{893, 128}, {587, 432}}</string>
                                <int key="NSWTFlags">1886912512</int>
                                <string key="NSWindowTitle">Queue - HandBrake</string>
                                <string key="NSWindowClass">NSWindow</string>
                                <object class="NSMutableString" key="NSViewClass">
                                        <characters key="NS.bytes">View</characters>
                                </object>
-                               <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSWindowContentMinSize">{525, 340}</string>
                                <object class="NSView" key="NSWindowView" id="431299686">
                                        <reference key="NSNextResponder"/>
@@ -60,7 +74,7 @@
                                                                                                <object class="NSOutlineView" id="790027174">
                                                                                                        <reference key="NSNextResponder" ref="13598910"/>
                                                                                                        <int key="NSvFlags">4352</int>
-                                                                                                       <string key="NSFrameSize">{517, 342}</string>
+                                                                                                       <string key="NSFrameSize">{517, 329}</string>
                                                                                                        <reference key="NSSuperview" ref="13598910"/>
                                                                                                        <bool key="NSEnabled">YES</bool>
                                                                                                        <object class="_NSCornerView" key="NSCornerView">
                                                                                                                <bool key="EncodedWithXMLCoder">YES</bool>
                                                                                                                <object class="NSTableColumn" id="821940358">
                                                                                                                        <string key="NSIdentifier">icon</string>
-                                                                                                                       <double key="NSWidth">3.800000e+01</double>
-                                                                                                                       <double key="NSMinWidth">3.800000e+01</double>
-                                                                                                                       <double key="NSMaxWidth">3.800000e+01</double>
+                                                                                                                       <double key="NSWidth">38</double>
+                                                                                                                       <double key="NSMinWidth">38</double>
+                                                                                                                       <double key="NSMaxWidth">38</double>
                                                                                                                        <object class="NSTableHeaderCell" key="NSHeaderCell">
-                                                                                                                               <int key="NSCellFlags">67239424</int>
-                                                                                                                               <int key="NSCellFlags2">0</int>
+                                                                                                                               <int key="NSCellFlags">75628096</int>
+                                                                                                                               <int key="NSCellFlags2">2048</int>
                                                                                                                                <string key="NSContents"/>
                                                                                                                                <object class="NSFont" key="NSSupport" id="26">
                                                                                                                                        <string key="NSName">LucidaGrande</string>
-                                                                                                                                       <double key="NSSize">1.100000e+01</double>
+                                                                                                                                       <double key="NSSize">11</double>
                                                                                                                                        <int key="NSfFlags">3100</int>
                                                                                                                                </object>
                                                                                                                                <object class="NSColor" key="NSBackgroundColor" id="122009290">
                                                                                                                </object>
                                                                                                                <object class="NSTableColumn" id="664777621">
                                                                                                                        <string key="NSIdentifier">desc</string>
-                                                                                                                       <double key="NSWidth">4.500000e+02</double>
-                                                                                                                       <double key="NSMinWidth">4.000000e+01</double>
-                                                                                                                       <double key="NSMaxWidth">5.000000e+03</double>
+                                                                                                                       <double key="NSWidth">450</double>
+                                                                                                                       <double key="NSMinWidth">40</double>
+                                                                                                                       <double key="NSMaxWidth">5000</double>
                                                                                                                        <object class="NSTableHeaderCell" key="NSHeaderCell">
-                                                                                                                               <int key="NSCellFlags">75628032</int>
-                                                                                                                               <int key="NSCellFlags2">0</int>
+                                                                                                                               <int key="NSCellFlags">75628096</int>
+                                                                                                                               <int key="NSCellFlags2">2048</int>
                                                                                                                                <string key="NSContents"/>
                                                                                                                                <reference key="NSSupport" ref="26"/>
                                                                                                                                <object class="NSColor" key="NSBackgroundColor">
                                                                                                                                <int key="NSCellFlags2">0</int>
                                                                                                                                <object class="NSFont" key="NSSupport" id="844481358">
                                                                                                                                        <string key="NSName">LucidaGrande</string>
-                                                                                                                                       <double key="NSSize">1.200000e+01</double>
+                                                                                                                                       <double key="NSSize">12</double>
                                                                                                                                        <int key="NSfFlags">16</int>
                                                                                                                                </object>
                                                                                                                                <reference key="NSControlView" ref="790027174"/>
                                                                                                                </object>
                                                                                                                <object class="NSTableColumn" id="498008730">
                                                                                                                        <string key="NSIdentifier">action</string>
-                                                                                                                       <double key="NSWidth">2.000000e+01</double>
-                                                                                                                       <double key="NSMinWidth">8.000000e+00</double>
-                                                                                                                       <double key="NSMaxWidth">2.000000e+01</double>
+                                                                                                                       <double key="NSWidth">20</double>
+                                                                                                                       <double key="NSMinWidth">8</double>
+                                                                                                                       <double key="NSMaxWidth">20</double>
                                                                                                                        <object class="NSTableHeaderCell" key="NSHeaderCell">
-                                                                                                                               <int key="NSCellFlags">67239424</int>
-                                                                                                                               <int key="NSCellFlags2">134217728</int>
+                                                                                                                               <int key="NSCellFlags">75628096</int>
+                                                                                                                               <int key="NSCellFlags2">134219776</int>
                                                                                                                                <string key="NSContents"/>
                                                                                                                                <reference key="NSSupport" ref="26"/>
                                                                                                                                <reference key="NSBackgroundColor" ref="122009290"/>
                                                                                                                        <reference key="NSTableView" ref="790027174"/>
                                                                                                                </object>
                                                                                                        </object>
-                                                                                                       <double key="NSIntercellSpacingWidth">3.000000e+00</double>
-                                                                                                       <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+                                                                                                       <double key="NSIntercellSpacingWidth">3</double>
+                                                                                                       <double key="NSIntercellSpacingHeight">2</double>
                                                                                                        <reference key="NSBackgroundColor" ref="983556133"/>
                                                                                                        <object class="NSColor" key="NSGridColor">
                                                                                                                <int key="NSColorSpace">6</int>
                                                                                                                        <bytes key="NSWhite">MC41AA</bytes>
                                                                                                                </object>
                                                                                                        </object>
-                                                                                                       <double key="NSRowHeight">1.700000e+01</double>
+                                                                                                       <double key="NSRowHeight">17</double>
                                                                                                        <int key="NSTvFlags">314605568</int>
+                                                                                                       <reference key="NSDelegate"/>
+                                                                                                       <reference key="NSDataSource"/>
                                                                                                        <int key="NSColumnAutoresizingStyle">1</int>
                                                                                                        <int key="NSDraggingSourceMaskForLocal">15</int>
                                                                                                        <int key="NSDraggingSourceMaskForNonLocal">0</int>
                                                                                                        <bool key="NSAllowsTypeSelect">YES</bool>
+                                                                                                       <int key="NSTableViewDraggingDestinationStyle">0</int>
                                                                                                </object>
                                                                                        </object>
-                                                                                       <string key="NSFrame">{{1, 1}, {517, 342}}</string>
+                                                                                       <string key="NSFrame">{{1, 1}, {517, 329}}</string>
                                                                                        <reference key="NSSuperview" ref="9160137"/>
                                                                                        <reference key="NSNextKeyView" ref="790027174"/>
                                                                                        <reference key="NSDocView" ref="790027174"/>
                                                                                                <string key="NSColorName">controlBackgroundColor</string>
                                                                                                <object class="NSColor" key="NSColor" id="724853981">
                                                                                                        <int key="NSColorSpace">3</int>
-                                                                                                       <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+                                                                                                       <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
                                                                                                </object>
                                                                                        </object>
                                                                                        <int key="NScvFlags">4</int>
                                                                                <object class="NSScroller" id="459639248">
                                                                                        <reference key="NSNextResponder" ref="9160137"/>
                                                                                        <int key="NSvFlags">256</int>
-                                                                                       <string key="NSFrame">{{518, 1}, {15, 342}}</string>
+                                                                                       <string key="NSFrame">{{518, 1}, {15, 329}}</string>
                                                                                        <reference key="NSSuperview" ref="9160137"/>
                                                                                        <reference key="NSTarget" ref="9160137"/>
                                                                                        <string key="NSAction">_doScroller:</string>
-                                                                                       <double key="NSPercent">7.142857e-01</double>
+                                                                                       <double key="NSPercent">0.71428570000000002</double>
                                                                                </object>
                                                                                <object class="NSScroller" id="636348341">
                                                                                        <reference key="NSNextResponder" ref="9160137"/>
-                                                                                       <int key="NSvFlags">256</int>
+                                                                                       <int key="NSvFlags">-2147483392</int>
                                                                                        <string key="NSFrame">{{-100, -100}, {282, 15}}</string>
                                                                                        <reference key="NSSuperview" ref="9160137"/>
                                                                                        <int key="NSsFlags">1</int>
                                                                                        <reference key="NSTarget" ref="9160137"/>
                                                                                        <string key="NSAction">_doScroller:</string>
-                                                                                       <double key="NSPercent">9.656652e-01</double>
+                                                                                       <double key="NSPercent">0.9656652</double>
                                                                                </object>
                                                                        </object>
-                                                                       <string key="NSFrame">{{20, 20}, {534, 344}}</string>
+                                                                       <string key="NSFrame">{{20, 20}, {534, 331}}</string>
                                                                        <reference key="NSSuperview" ref="60629844"/>
                                                                        <reference key="NSNextKeyView" ref="13598910"/>
                                                                        <int key="NSsFlags">18</int>
                                                                                </object>
                                                                                <object class="NSFont" key="NSSupport" id="459826394">
                                                                                        <string key="NSName">Helvetica</string>
-                                                                                       <double key="NSSize">1.200000e+01</double>
+                                                                                       <double key="NSSize">12</double>
                                                                                        <int key="NSfFlags">16</int>
                                                                                </object>
                                                                                <reference key="NSControlView" ref="948250828"/>
-                                                                               <double key="NSMaxValue">3.000000e+01</double>
-                                                                               <double key="NSMinValue">0.000000e+00</double>
-                                                                               <double key="NSValue">2.000000e+00</double>
-                                                                               <double key="NSAltIncValue">0.000000e+00</double>
+                                                                               <double key="NSMaxValue">30</double>
+                                                                               <double key="NSMinValue">0.0</double>
+                                                                               <double key="NSValue">2</double>
+                                                                               <double key="NSAltIncValue">0.0</double>
                                                                                <int key="NSNumberOfTickMarks">31</int>
                                                                                <int key="NSTickMarkPosition">1</int>
                                                                                <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
                                                                                </object>
                                                                                <reference key="NSSupport" ref="459826394"/>
                                                                                <reference key="NSControlView" ref="252090132"/>
-                                                                               <double key="NSMaxValue">1.000000e+01</double>
-                                                                               <double key="NSMinValue">0.000000e+00</double>
-                                                                               <double key="NSValue">3.000000e+00</double>
-                                                                               <double key="NSAltIncValue">0.000000e+00</double>
+                                                                               <double key="NSMaxValue">10</double>
+                                                                               <double key="NSMinValue">0.0</double>
+                                                                               <double key="NSValue">3</double>
+                                                                               <double key="NSAltIncValue">0.0</double>
                                                                                <int key="NSNumberOfTickMarks">11</int>
                                                                                <int key="NSTickMarkPosition">1</int>
                                                                                <bool key="NSAllowsTickMarkValuesOnly">YES</bool>
                                                                                <string key="NSContents">quick way to intercept delete key</string>
                                                                                <object class="NSFont" key="NSSupport">
                                                                                        <string key="NSName">LucidaGrande</string>
-                                                                                       <double key="NSSize">9.000000e+00</double>
+                                                                                       <double key="NSSize">9</double>
                                                                                        <int key="NSfFlags">3614</int>
                                                                                </object>
                                                                                <reference key="NSControlView" ref="1065139278"/>
                                                                                <int key="NSButtonFlags2">34</int>
                                                                                <object class="NSFont" key="NSAlternateImage">
                                                                                        <string key="NSName">LucidaGrande</string>
-                                                                                       <double key="NSSize">9.000000e+00</double>
+                                                                                       <double key="NSSize">9</double>
                                                                                        <int key="NSfFlags">16</int>
                                                                                </object>
                                                                                <string key="NSAlternateContents"/>
-                                                                               <string type="base64-UTF8" key="NSKeyEquivalent">fw</string>
+                                                                               <string key="NSKeyEquivalent">\7f</string>
                                                                                <int key="NSPeriodicDelay">200</int>
                                                                                <int key="NSPeriodicInterval">25</int>
                                                                        </object>
                                                                </object>
                                                        </object>
-                                                       <string key="NSFrameSize">{574, 371}</string>
+                                                       <string key="NSFrame">{{0, 9}, {574, 358}}</string>
                                                        <reference key="NSSuperview" ref="431299686"/>
                                                        <string key="NSClassName">NSView</string>
                                                        <string key="NSExtension">NSResponder</string>
                                                <object class="NSTextField" id="463845363">
                                                        <reference key="NSNextResponder" ref="431299686"/>
                                                        <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{17, 398}, {148, 14}}</string>
+                                                       <string key="NSFrame">{{17, 407}, {148, 14}}</string>
                                                        <reference key="NSSuperview" ref="431299686"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="617812287">
                                                </object>
                                                <object class="NSTextField" id="138063786">
                                                        <reference key="NSNextResponder" ref="431299686"/>
-                                                       <int key="NSvFlags">264</int>
-                                                       <string key="NSFrame">{{17, 376}, {540, 14}}</string>
+                                                       <int key="NSvFlags">266</int>
+                                                       <string key="NSFrame">{{17, 373}, {560, 30}}</string>
                                                        <reference key="NSSuperview" ref="431299686"/>
                                                        <bool key="NSEnabled">YES</bool>
                                                        <object class="NSTextFieldCell" key="NSCell" id="108133680">
                                                                <int key="NSCellFlags">67239424</int>
-                                                               <int key="NSCellFlags2">272760832</int>
+                                                               <int key="NSCellFlags2">4325376</int>
                                                                <string key="NSContents">There are no jobs currently encoding</string>
                                                                <reference key="NSSupport" ref="26"/>
                                                                <reference key="NSControlView" ref="138063786"/>
                                                        </object>
                                                </object>
                                        </object>
-                                       <string key="NSFrameSize">{574, 423}</string>
+                                       <string key="NSFrameSize">{587, 432}</string>
                                        <reference key="NSSuperview"/>
                                </object>
                                <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
                                <string key="NSMinSize">{525, 362}</string>
-                               <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+                               <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
                                <string key="NSFrameAutosaveName">QueueWindow</string>
                        </object>
+                       <object class="NSMenu" id="771940260">
+                               <string key="NSTitle"/>
+                               <object class="NSMutableArray" key="NSMenuItems">
+                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                       <object class="NSMenuItem" id="16179858">
+                                               <reference key="NSMenu" ref="771940260"/>
+                                               <string key="NSTitle">Edit</string>
+                                               <string key="NSKeyEquiv"/>
+                                               <int key="NSMnemonicLoc">2147483647</int>
+                                               <object class="NSCustomResource" key="NSOnImage" id="7190541">
+                                                       <string key="NSClassName">NSImage</string>
+                                                       <string key="NSResourceName">NSMenuCheckmark</string>
+                                               </object>
+                                               <object class="NSCustomResource" key="NSMixedImage" id="681624584">
+                                                       <string key="NSClassName">NSImage</string>
+                                                       <string key="NSResourceName">NSMenuMixedState</string>
+                                               </object>
+                                       </object>
+                                       <object class="NSMenuItem" id="60102320">
+                                               <reference key="NSMenu" ref="771940260"/>
+                                               <string key="NSTitle">Delete</string>
+                                               <string key="NSKeyEquiv"/>
+                                               <int key="NSMnemonicLoc">2147483647</int>
+                                               <reference key="NSOnImage" ref="7190541"/>
+                                               <reference key="NSMixedImage" ref="681624584"/>
+                                       </object>
+                                       <object class="NSMenuItem" id="172286461">
+                                               <reference key="NSMenu" ref="771940260"/>
+                                               <string key="NSTitle">Show</string>
+                                               <string key="NSKeyEquiv"/>
+                                               <int key="NSMnemonicLoc">2147483647</int>
+                                               <reference key="NSOnImage" ref="7190541"/>
+                                               <reference key="NSMixedImage" ref="681624584"/>
+                                       </object>
+                               </object>
+                       </object>
                </object>
                <object class="IBObjectContainer" key="IBDocument.Objects">
                        <object class="NSMutableArray" key="connectionRecords">
                                        </object>
                                        <int key="connectionID">2648</int>
                                </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBOutletConnection" key="connection">
+                                               <string key="label">menu</string>
+                                               <reference key="source" ref="574589932"/>
+                                               <reference key="destination" ref="771940260"/>
+                                       </object>
+                                       <int key="connectionID">2653</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">editSelectedQueueItem:</string>
+                                               <reference key="source" ref="678333032"/>
+                                               <reference key="destination" ref="16179858"/>
+                                       </object>
+                                       <int key="connectionID">2654</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">removeSelectedQueueItem:</string>
+                                               <reference key="source" ref="678333032"/>
+                                               <reference key="destination" ref="60102320"/>
+                                       </object>
+                                       <int key="connectionID">2656</int>
+                               </object>
+                               <object class="IBConnectionRecord">
+                                       <object class="IBActionConnection" key="connection">
+                                               <string key="label">revealSelectedQueueItem:</string>
+                                               <reference key="source" ref="678333032"/>
+                                               <reference key="destination" ref="172286461"/>
+                                       </object>
+                                       <int key="connectionID">2657</int>
+                               </object>
                        </object>
                        <object class="IBMutableOrderedSet" key="objectRecords">
                                <object class="NSArray" key="orderedObjects">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">0</int>
-                                               <object class="NSArray" key="object" id="1017359617">
-                                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                                               </object>
+                                               <reference key="object" ref="0"/>
                                                <reference key="children" ref="543585533"/>
                                                <nil key="parent"/>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-2</int>
                                                <reference key="object" ref="678333032"/>
-                                               <reference key="parent" ref="1017359617"/>
-                                               <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+                                               <reference key="parent" ref="0"/>
+                                               <string key="objectName">File's Owner</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-1</int>
                                                <reference key="object" ref="258430128"/>
-                                               <reference key="parent" ref="1017359617"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">First Responder</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <reference ref="431299686"/>
                                                </object>
-                                               <reference key="parent" ref="1017359617"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">Window</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                        <object class="IBObjectRecord">
                                                <int key="objectID">-3</int>
                                                <reference key="object" ref="529995888"/>
-                                               <reference key="parent" ref="1017359617"/>
+                                               <reference key="parent" ref="0"/>
                                                <string key="objectName">Application</string>
                                        </object>
                                        <object class="IBObjectRecord">
                                                <reference key="object" ref="108133680"/>
                                                <reference key="parent" ref="138063786"/>
                                        </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">2649</int>
+                                               <reference key="object" ref="771940260"/>
+                                               <object class="NSMutableArray" key="children">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <reference ref="16179858"/>
+                                                       <reference ref="60102320"/>
+                                                       <reference ref="172286461"/>
+                                               </object>
+                                               <reference key="parent" ref="0"/>
+                                               <string key="objectName">ContextMenu</string>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">2650</int>
+                                               <reference key="object" ref="16179858"/>
+                                               <reference key="parent" ref="771940260"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">2652</int>
+                                               <reference key="object" ref="60102320"/>
+                                               <reference key="parent" ref="771940260"/>
+                                       </object>
+                                       <object class="IBObjectRecord">
+                                               <int key="objectID">2655</int>
+                                               <reference key="object" ref="172286461"/>
+                                               <reference key="parent" ref="771940260"/>
+                                       </object>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="flattenedProperties">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSMutableArray" key="dict.sortedKeys">
+                               <object class="NSArray" key="dict.sortedKeys">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
-                                       <string>-1.IBPluginDependency</string>
-                                       <string>-2.IBPluginDependency</string>
+                                       <string>-3.IBPluginDependency</string>
                                        <string>2511.IBPluginDependency</string>
                                        <string>2511.ImportedFromIB2</string>
                                        <string>2547.IBPluginDependency</string>
                                        <string>2624.ImportedFromIB2</string>
                                        <string>2625.IBPluginDependency</string>
                                        <string>2625.ImportedFromIB2</string>
+                                       <string>2637.IBPluginDependency</string>
+                                       <string>2638.IBPluginDependency</string>
+                                       <string>2639.IBPluginDependency</string>
+                                       <string>2640.IBPluginDependency</string>
+                                       <string>2641.IBPluginDependency</string>
+                                       <string>2642.IBPluginDependency</string>
+                                       <string>2643.IBPluginDependency</string>
                                        <string>2643.IBShouldRemoveOnLegacySave</string>
+                                       <string>2644.IBPluginDependency</string>
                                        <string>2644.IBShouldRemoveOnLegacySave</string>
                                        <string>2646.IBPluginDependency</string>
                                        <string>2646.ImportedFromIB2</string>
+                                       <string>2647.IBPluginDependency</string>
+                                       <string>2649.IBEditorWindowLastContentRect</string>
+                                       <string>2649.IBPluginDependency</string>
+                                       <string>2650.IBPluginDependency</string>
+                                       <string>2652.IBPluginDependency</string>
+                                       <string>2655.IBPluginDependency</string>
                                </object>
                                <object class="NSMutableArray" key="dict.values">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <integer value="1" id="9"/>
-                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <string>{{170, 67}, {574, 423}}</string>
+                                       <integer value="1"/>
+                                       <string>{{77, 333}, {587, 432}}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <string>{{170, 67}, {574, 423}}</string>
-                                       <reference ref="9"/>
-                                       <reference ref="9"/>
-                                       <reference ref="9"/>
+                                       <string>{{77, 333}, {587, 432}}</string>
+                                       <integer value="1"/>
+                                       <boolean value="NO"/>
+                                       <integer value="1"/>
                                        <string>{3.40282e+38, 3.40282e+38}</string>
                                        <string>{525, 340}</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>HBQueueOutlineView</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>HBImageAndTextCell</string>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
-                                       <reference ref="9"/>
-                                       <reference ref="9"/>
                                        <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
-                                       <reference ref="9"/>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <integer value="1"/>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>{{555, 544}, {96, 63}}</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+                                       <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
                                </object>
                        </object>
                        <object class="NSMutableDictionary" key="unlocalizedProperties">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSArray" key="dict.sortedKeys">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                               </object>
+                               <reference key="dict.sortedKeys" ref="0"/>
                                <object class="NSMutableArray" key="dict.values">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                </object>
                        <nil key="activeLocalization"/>
                        <object class="NSMutableDictionary" key="localizations">
                                <bool key="EncodedWithXMLCoder">YES</bool>
-                               <object class="NSArray" key="dict.sortedKeys">
-                                       <bool key="EncodedWithXMLCoder">YES</bool>
-                               </object>
+                               <reference key="dict.sortedKeys" ref="0"/>
                                <object class="NSMutableArray" key="dict.values">
                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                </object>
                        </object>
                        <nil key="sourceID"/>
-                       <int key="maxID">2648</int>
+                       <int key="maxID">2657</int>
                </object>
                <object class="IBClassDescriber" key="IBDocument.Classes">
                        <object class="NSMutableArray" key="referencedPartialClassDescriptions">
                                        <string key="superclassName">NSWindowController</string>
                                        <object class="NSMutableDictionary" key="actions">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
+                                               <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>editSelectedQueueItem:</string>
                                                        <string>imageSpacingChanged:</string>
                                                        <string>indentChanged:</string>
                                                        <string>removeSelectedQueueItem:</string>
                                                        <string>id</string>
                                                        <string>id</string>
                                                        <string>id</string>
+                                                       <string>id</string>
+                                               </object>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>editSelectedQueueItem:</string>
+                                                       <string>imageSpacingChanged:</string>
+                                                       <string>indentChanged:</string>
+                                                       <string>removeSelectedQueueItem:</string>
+                                                       <string>revealSelectedQueueItem:</string>
+                                                       <string>showQueueWindow:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">editSelectedQueueItem:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">imageSpacingChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">indentChanged:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">removeSelectedQueueItem:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">revealSelectedQueueItem:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">showQueueWindow:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
                                                </object>
                                        </object>
                                        <object class="NSMutableDictionary" key="outlets">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
+                                               <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>fCurrentJobPane</string>
                                                        <string>fIndentation</string>
                                                        <string>NSSlider</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>fCurrentJobPane</string>
+                                                       <string>fIndentation</string>
+                                                       <string>fJobDescTextField</string>
+                                                       <string>fJobIconView</string>
+                                                       <string>fOutlineView</string>
+                                                       <string>fProgressBar</string>
+                                                       <string>fProgressTextField</string>
+                                                       <string>fQueueCountField</string>
+                                                       <string>fQueuePane</string>
+                                                       <string>fSpacing</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fCurrentJobPane</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fIndentation</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fJobDescTextField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fJobIconView</string>
+                                                               <string key="candidateClassName">NSImageView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fOutlineView</string>
+                                                               <string key="candidateClassName">HBQueueOutlineView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fProgressBar</string>
+                                                               <string key="candidateClassName">NSProgressIndicator</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fProgressTextField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fQueueCountField</string>
+                                                               <string key="candidateClassName">NSTextField</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fQueuePane</string>
+                                                               <string key="candidateClassName">NSView</string>
+                                                       </object>
+                                                       <object class="IBToOneOutletInfo">
+                                                               <string key="name">fSpacing</string>
+                                                               <string key="candidateClassName">NSSlider</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier" id="333889241">
                                                <string key="majorKey">IBProjectSource</string>
                                                <string key="minorKey">HBQueueController.h</string>
                                        <string key="superclassName">NSWindowController</string>
                                        <object class="NSMutableDictionary" key="actions">
                                                <bool key="EncodedWithXMLCoder">YES</bool>
-                                               <object class="NSMutableArray" key="dict.sortedKeys">
+                                               <object class="NSArray" key="dict.sortedKeys">
                                                        <bool key="EncodedWithXMLCoder">YES</bool>
                                                        <string>cancelCurrentJob:</string>
                                                        <string>revealSelectedJobGroups:</string>
                                                        <string>id</string>
                                                </object>
                                        </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <bool key="EncodedWithXMLCoder">YES</bool>
+                                               <object class="NSArray" key="dict.sortedKeys">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <string>cancelCurrentJob:</string>
+                                                       <string>revealSelectedJobGroups:</string>
+                                                       <string>togglePauseResume:</string>
+                                                       <string>toggleStartCancel:</string>
+                                               </object>
+                                               <object class="NSMutableArray" key="dict.values">
+                                                       <bool key="EncodedWithXMLCoder">YES</bool>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">cancelCurrentJob:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">revealSelectedJobGroups:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">togglePauseResume:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                                       <object class="IBActionInfo">
+                                                               <string key="name">toggleStartCancel:</string>
+                                                               <string key="candidateClassName">id</string>
+                                                       </object>
+                                               </object>
+                                       </object>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
                                                <string key="majorKey">IBUserSource</string>
                                                <string key="minorKey"/>
                                                <string key="minorKey"/>
                                        </object>
                                </object>
+                       </object>
+                       <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSActionCell</string>
+                                       <string key="superclassName">NSCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSActionCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="1009815657">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSApplication.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="942825343">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSApplicationScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="874636585">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSColorPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSHelpManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPageLayout.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSApplication</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSButton</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSButton.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSButtonCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSButtonCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSCell</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSControl</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="596505546">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSControl.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSFormatter</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSFormatter.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSImageCell</string>
+                                       <string key="superclassName">NSCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSImageCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSImageView</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSImageView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMenu</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="721965304">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMenu.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSMenuItem</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="529283491">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSMenuItem.h</string>
+                                       </object>
+                               </object>
                                <object class="IBPartialClassDescription">
                                        <string key="className">NSObject</string>
                                        <object class="IBClassDescriptionSource" key="sourceIdentifier">
-                                               <string key="majorKey">IBProjectSource</string>
-                                               <string key="minorKey">PictureController.h</string>
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSAccessibility.h</string>
                                        </object>
                                </object>
-                       </object>
-               </object>
-               <int key="IBDocument.localizationMode">0</int>
-               <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
-               <int key="IBDocument.defaultPropertyAccessControl">3</int>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="1009815657"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="942825343"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="874636585"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="596505546"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDictionaryController.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDragging.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSFontManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSFontPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSKeyValueBinding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <reference key="sourceIdentifier" ref="721965304"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSNibLoading.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="440847546">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSOutlineView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSPasteboard.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSavePanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="415747133">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTableView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSToolbarItem.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier" id="165950663">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSArchiver.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSClassDescription.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSError.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSFileManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueCoding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyValueObserving.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSKeyedArchiver.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSObject.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSObjectScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSPortCoder.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSRunLoop.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptClassDescription.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSScriptWhoseTests.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSThread.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURL.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURLConnection.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Foundation.framework/Headers/NSURLDownload.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Growl.framework/Headers/GrowlApplicationBridge.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/IKImageBrowserView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/IKSaveOptions.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">ImageKit.framework/Headers/ImageKitDeprecated.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">PDFKit.framework/Headers/PDFDocument.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">PDFKit.framework/Headers/PDFView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedAudioOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureDecompressedVideoOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureFileOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureVideoPreviewOutput.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTCaptureView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTMovie.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QTKit.framework/Headers/QTMovieView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionParameterView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzComposer.framework/Headers/QCCompositionPickerView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuartzFilters.framework/Headers/QuartzFilterManager.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">QuickLookUI.framework/Headers/QLPreviewPanel.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Sparkle.framework/Headers/SUAppcast.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">Sparkle.framework/Headers/SUUpdater.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSOutlineView</string>
+                                       <string key="superclassName">NSTableView</string>
+                                       <reference key="sourceIdentifier" ref="440847546"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSProgressIndicator</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSProgressIndicator.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSInterfaceStyle.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSResponder</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSResponder.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSScrollView</string>
+                                       <string key="superclassName">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSScrollView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSScroller</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSScroller.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSSlider</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSlider.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSSliderCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSSliderCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTableColumn</string>
+                                       <string key="superclassName">NSObject</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTableColumn.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTableView</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <reference key="sourceIdentifier" ref="415747133"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTextField</string>
+                                       <string key="superclassName">NSControl</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTextField.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSTextFieldCell</string>
+                                       <string key="superclassName">NSActionCell</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSTextFieldCell.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSClipView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <reference key="sourceIdentifier" ref="529283491"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSRulerView.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSView</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <reference key="sourceIdentifier" ref="165950663"/>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSDrawer.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSWindow.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindow</string>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSWindowScripting.h</string>
+                                       </object>
+                               </object>
+                               <object class="IBPartialClassDescription">
+                                       <string key="className">NSWindowController</string>
+                                       <string key="superclassName">NSResponder</string>
+                                       <object class="NSMutableDictionary" key="actions">
+                                               <string key="NS.key.0">showWindow:</string>
+                                               <string key="NS.object.0">id</string>
+                                       </object>
+                                       <object class="NSMutableDictionary" key="actionInfosByName">
+                                               <string key="NS.key.0">showWindow:</string>
+                                               <object class="IBActionInfo" key="NS.object.0">
+                                                       <string key="name">showWindow:</string>
+                                                       <string key="candidateClassName">id</string>
+                                               </object>
+                                       </object>
+                                       <object class="IBClassDescriptionSource" key="sourceIdentifier">
+                                               <string key="majorKey">IBFrameworkSource</string>
+                                               <string key="minorKey">AppKit.framework/Headers/NSWindowController.h</string>
+                                       </object>
+                               </object>
+                       </object>
+               </object>
+               <int key="IBDocument.localizationMode">0</int>
+               <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+                       <integer value="1050" key="NS.object.0"/>
+               </object>
+               <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+                       <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+                       <integer value="3000" key="NS.object.0"/>
+               </object>
+               <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+               <string key="IBDocument.LastKnownRelativeProjectPath">../HandBrake.xcodeproj</string>
+               <int key="IBDocument.defaultPropertyAccessControl">3</int>
+               <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+                       <bool key="EncodedWithXMLCoder">YES</bool>
+                       <object class="NSArray" key="dict.sortedKeys">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>Delete</string>
+                               <string>NSMenuCheckmark</string>
+                               <string>NSMenuMixedState</string>
+                       </object>
+                       <object class="NSMutableArray" key="dict.values">
+                               <bool key="EncodedWithXMLCoder">YES</bool>
+                               <string>{16, 16}</string>
+                               <string>{9, 8}</string>
+                               <string>{7, 2}</string>
+                       </object>
+               </object>
        </data>
 </archive>
index a58b2f8..bc6e5b8 100644 (file)
     IBOutlet NSPopUpButton      * fX264optBframesPopUp;
     IBOutlet NSTextField        * fX264optRefLabel;
     IBOutlet NSPopUpButton      * fX264optRefPopUp;
-    IBOutlet NSTextField        * fX264optNfpskipLabel;
-    IBOutlet NSButton           * fX264optNfpskipSwitch;
+    IBOutlet NSButton           * fX264optWeightPSwitch;
+    IBOutlet NSTextField        * fX264optWeightPLabel;
     IBOutlet NSTextField        * fX264optNodctdcmtLabel;
     IBOutlet NSButton           * fX264optNodctdcmtSwitch;
     IBOutlet NSTextField        * fX264optSubmeLabel;
     IBOutlet NSPopUpButton      * fX264optSubmePopUp;
     IBOutlet NSTextField        * fX264optTrellisLabel;
     IBOutlet NSPopUpButton      * fX264optTrellisPopUp;
-    IBOutlet NSTextField        * fX264optMixedRefsLabel;
-    IBOutlet NSButton           * fX264optMixedRefsSwitch;
     IBOutlet NSTextField        * fX264optMotionEstLabel;
     IBOutlet NSPopUpButton      * fX264optMotionEstPopUp;
     IBOutlet NSTextField        * fX264optMERangeLabel;
     IBOutlet NSPopUpButton      * fX264optMERangePopUp;
-    IBOutlet NSTextField        * fX264optWeightBLabel;
-    IBOutlet NSButton           * fX264optWeightBSwitch;
     IBOutlet NSTextField        * fX264optBPyramidLabel;
-    IBOutlet NSButton           * fX264optBPyramidSwitch;
+    IBOutlet NSPopUpButton      * fX264optBPyramidPopUp;
     IBOutlet NSTextField        * fX264optDirectPredLabel;
     IBOutlet NSPopUpButton      * fX264optDirectPredPopUp;
     IBOutlet NSTextField        * fX264optDeblockLabel;
@@ -49,6 +45,8 @@
     IBOutlet NSButton           * fX264opt8x8dctSwitch;
     IBOutlet NSTextField        * fX264optCabacLabel;
     IBOutlet NSButton           * fX264optCabacSwitch;
+    IBOutlet NSSlider           * fX264optAqSlider;
+    IBOutlet NSTextField        * fX264optAqLabel;
     IBOutlet NSSlider           * fX264optPsyRDSlider;
     IBOutlet NSTextField        * fX264optPsyRDLabel;
     IBOutlet NSSlider           * fX264optPsyTrellisSlider;
index e08cf4f..c8c8b12 100644 (file)
     unsigned i;
     NSControl * controls[] =
       { fX264optViewTitleLabel,fDisplayX264Options,fDisplayX264OptionsLabel,fX264optBframesLabel,
-        fX264optBframesPopUp,fX264optRefLabel,fX264optRefPopUp,fX264optNfpskipLabel,fX264optNfpskipSwitch,
+        fX264optBframesPopUp,fX264optRefLabel,fX264optRefPopUp,
         fX264optNodctdcmtLabel,fX264optNodctdcmtSwitch,fX264optSubmeLabel,fX264optSubmePopUp,
-        fX264optTrellisLabel,fX264optTrellisPopUp,fX264optMixedRefsLabel,fX264optMixedRefsSwitch,
+        fX264optTrellisLabel,fX264optTrellisPopUp, fX264optWeightPLabel, fX264optWeightPSwitch,
         fX264optMotionEstLabel,fX264optMotionEstPopUp,fX264optMERangeLabel,fX264optMERangePopUp,
-        fX264optWeightBLabel,fX264optWeightBSwitch, fX264optBPyramidLabel,fX264optBPyramidSwitch,
+        fX264optBPyramidLabel,fX264optBPyramidPopUp, fX264optAqLabel, fX264optAqSlider,
         fX264optDirectPredLabel,fX264optDirectPredPopUp,fX264optDeblockLabel,fX264optAnalyseLabel,
         fX264optAnalysePopUp,fX264opt8x8dctLabel,fX264opt8x8dctSwitch,fX264optCabacLabel,fX264optCabacSwitch,
         fX264optAlphaDeblockPopUp,fX264optBetaDeblockPopUp, fX264optPsyRDSlider, fX264optPsyRDLabel, fX264optPsyTrellisSlider, fX264optPsyTrellisLabel, fX264optBAdaptPopUp, fX264optBAdaptLabel };
         [fX264optBframesPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
     }
     toolTip =
-        @"Sane values are 1-6. B-Frames are smaller than other frames, so they let you pack in more quality at the same bitrate. Use more of them with animated material.";
+        @"Sane values are ~2-5.  This specifies the maximum number of sequential B-frames that the encoder can use.  Large numbers generally won't help significantly unless Adaptive B-frames is set to Optimal.  Cel-animated source material and B-pyramid also significantly increase the usefulness of larger values. Baseline profile, as required for iPods and similar devices, requires B-frames to be set to 0 (off).";
     [fX264optBframesPopUp setToolTip: toolTip];
     [fX264optBframesLabel setToolTip: toolTip];
     
     /*Reference Frames fX264optRefPopUp*/
     [fX264optRefPopUp removeAllItems];
     [fX264optRefPopUp addItemWithTitle:@"Default (3)"];
-    for (i=0; i<17;i++)
+    for (i=1; i<17;i++)
     {
         [fX264optRefPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
     }
     toolTip =
-        @"Sane values are 1-6. The more you add, the higher the quality â€” but the slower the encode. Be careful...too many and QuickTime struggle to play the video back.";
+        @"Sane values are ~1-6.  The more you add, the better the compression, but the slower the encode.  Cel animation tends to benefit from more reference frames a lot more than film content.  Note that many hardware devices have limitations on the number of supported reference frames, so if you're encoding for a handheld or standalone player, don't touch this unless you're absolutely sure you know what you're doing!";
     [fX264optRefPopUp setToolTip: toolTip];
     [fX264optRefLabel setToolTip: toolTip];
-    
-    /*No Fast P-Skip fX264optNfpskipSwitch BOOLEAN*/
-    [fX264optNfpskipSwitch setState:0];
-    toolTip =
-        @"This can help with blocking on solid colors like blue skies, but it also slows down the encode.";
-    [fX264optNfpskipSwitch setToolTip: toolTip];
-    [fX264optNfpskipLabel setToolTip: toolTip];
+
+    /*Weight-P fX264optWeightPSwitch BOOLEAN*/
+    [fX264optWeightPSwitch setState:1];
+    toolTip = 
+        @"Performs extra analysis to decide upon weighting parameters for each frame.  This improves overall compression slightly and improves the quality of fades greatly. Baseline profile, as required for iPods and similar devices, requires weighted P-frame prediction to be disabled.  Note that some devices and players, even those that support Main Profile, may have problems with Weighted P-frame prediction: the Apple TV is completely incompatible with it, for example.";
+    [fX264optWeightPSwitch setToolTip: toolTip];
+    [fX264optWeightPLabel setToolTip: toolTip];
     
     /*No Dict Decimate fX264optNodctdcmtSwitch BOOLEAN*/
     [fX264optNodctdcmtSwitch setState:0];    
     toolTip =
-        @"To save space, x264 will \"zero out\" blocks when it thinks they won't be perceptible by the viewer. This negligibly reduces quality, but in rare cases it can mess up and produce visible artifacts. This situation can be alleviated by telling x264 not to decimate DCT blocks.\n\nIt increases quality but also bitrate/file size, so if you use it when you've specified a target bitrate you will end up with a worse picture than without it. However, when used with constant quality encoding, or if you boost the average bitrate to compensate, you might get a better result.";
+        @"x264 normally zeroes out nearly-empty data blocks to save bits to be better used for some other purpose in the video.  However, this can sometimes have slight negative effects on retention of subtle grain and dither.  Don't touch this unless you're having banding issues or other such cases where you are having trouble keeping fine noise.";
     [fX264optNodctdcmtSwitch setToolTip: toolTip];
     [fX264optNodctdcmtLabel setToolTip: toolTip];
     
     /*Sub Me fX264optSubmePopUp*/
     [fX264optSubmePopUp removeAllItems];
     [fX264optSubmePopUp addItemWithTitle:@"Default (7)"];
-    for (i=0; i<10;i++)
-    {
-        [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"0: SAD, no subpel (super fast!)"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"1: SAD, qpel"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"2: SATD, qpel"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"3: SATD, multi-qpel"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"4: SATD, qpel on all"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"5: SATD, multi-qpel on all"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"6: RD in I/P-frames"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"7: RD in all frames"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"8: RD refine in I/P-frames"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"9: RD refine in all frames"]];
+    [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"10: QPRD in all frames"]];
     toolTip =
-        @"This setting is finer-grained than the motion estimation settings above. Instead of dealing with whole pixels, it deals with 4 fractional pixels, or quarter pixels (qpel). Higher levels increase quality by further refining the motion prediction for these quarter pixels, but take longer to encode.\n\nLevel 6, turns on a feature called rate distortion optimization, including psychovisual enhancements. 7, the default, enables that rate distortion for B-frames. 8 refines those decisions for I and P frames, and 9 adds on refinement for B-frames as well.";
+        @"This setting controls both subpixel-precision motion estimation and mode decision methods.\n\nSubpixel motion estimation is used for refining motion estimates beyond mere pixel accuracy, improving compression.\n\nMode decision is the method used to choose how to encode each block of the frame: a very important decision.\n\nSAD is the fastest method, followed by SATD, RD, RD refinement, and the slowest, QPRD.\n\n6 or higher is strongly recommended: Psy-RD, a very powerful psy optimization that helps retain detail, requires RD.\n\n10, the most powerful and slowest option, requires trellis=2.";
     [fX264optSubmePopUp setToolTip: toolTip];
     [fX264optSubmeLabel setToolTip: toolTip];
     
     /*Trellis fX264optTrellisPopUp*/
     [fX264optTrellisPopUp removeAllItems];
-    [fX264optTrellisPopUp addItemWithTitle:@"Default (1)"];
-    for (i=0; i<3;i++)
-    {
-        [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
+    [fX264optTrellisPopUp addItemWithTitle:@"Default (Encode only)"];
+    [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"Off"]];
+    [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"Encode only"]];
+    [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"Always"]];
     [fX264optTrellisPopUp setWantsLayer:YES];
     toolTip =
-        @"Trellis fine-tunes how bitrate is doled out, so it can reduce file size/bitrate or increase quality. A value of 1 means it only fine-tunes the final encode of a block of pixels, while 2 means it is considered during earlier phases of the decision-making process as well.";
+        @"Trellis fine-tunes the rounding of transform coefficients to squeeze out 3-5% more compression at the cost of some speed. \"Always\" uses trellis not only during the main encoding process, but also during analysis, which improves compression even more, albeit at great speed cost. Trellis costs more speed at higher bitrates.";
     [fX264optTrellisPopUp setToolTip: toolTip];
     [fX264optTrellisLabel setToolTip: toolTip];
     
-    /*Mixed-references fX264optMixedRefsSwitch BOOLEAN*/
-    [fX264optMixedRefsSwitch setState:1];
-    [fX264optMixedRefsSwitch setWantsLayer:YES];
-    toolTip =
-        @"With this on, different references can be used for different parts of each 16x16 pixel macroblock, increasing quality.";
-    [fX264optMixedRefsSwitch setToolTip: toolTip];
-    [fX264optMixedRefsLabel setToolTip: toolTip];
-    
     /*Motion Estimation fX264optMotionEstPopUp*/
     [fX264optMotionEstPopUp removeAllItems];
     [fX264optMotionEstPopUp addItemWithTitle:@"Default (Hexagon)"];
     [fX264optMotionEstPopUp addItemWithTitle:@"Exhaustive"];
     [fX264optMotionEstPopUp addItemWithTitle:@"Transformed Exhaustive"];
     toolTip =
-        @"Controls the motion estimation method. Motion estimation is how the encoder decides how each block of pixels in a frame has moved, compared to most similar blocks in the other frames it references. There are many ways of finding the most similar blocks, with varying speeds and accuracy.\n\nAt the most basic setting, dia, x264 will only consider a diamond-shaped region around each pixel.\n\nThe default setting, hex, is similar to dia but uses a hexagon shape.\n\nUneven multi-hexagon, umh, searches a number of different patterns across a wider area and thus is slower than hex and dia but further increases compression efficiency and quality.\n\nesa, an exhaustive search of a square around each pixel (whose size is controlled by the me-range parameter), is much slower and offers only minimal quality gains.\n\ntesa, transformed exhaustive search, which performs just as thorough a search, is slower still but offers further slight improvements to quality.";
+        @"Controls the motion estimation method. Motion estimation is how the encoder estimates how each block of pixels in a frame has moved.  A better motion search method improves compression at the cost of speed.\n\nDiamond: performs an extremely fast and simple search using a diamond pattern.\n\nHexagon: performs a somewhat more effective but slightly slower search using a hexagon pattern.\n\nUneven Multi-Hex: performs a very wide search using a variety of patterns, more accurately capturing complex motion.\n\nExhaustive: performs a \"dumb\" search of every pixel in a wide area.  Significantly slower for only a small compression gain.\n\nTransformed Exhaustive: Like exhaustive, but makes even more accurate decisions. Accordingly, somewhat slower, also for only a small improvement.";
     [fX264optMotionEstPopUp setToolTip: toolTip];
     [fX264optMotionEstLabel setToolTip: toolTip];
     
         [fX264optMERangePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
     }
     toolTip =
-        @"This range is the radius, in pixels, x264 should use for motion estimation searches. It only has an effect when you use Uneven Multi-Hexagonal, Exhaustive, or Transformed Exhaustive searching. 24, 32, and 64 are good values, with each being progressively smaller for progressively less improvement to picture quality.";
+        @"This is the distance x264 searches from its best guess at the motion of a block in order to try to find its actual motion.  Doesn't apply to Diamond or Hexagon search options.  The default is fine for most content, but extremely high motion video, especially at HD resolutions, may benefit from higher ranges, albeit at a high speed cost.";
     [fX264optMERangePopUp setToolTip: toolTip];
     [fX264optMERangeLabel setToolTip: toolTip];
     
-    /*Weighted B-Frame Prediction fX264optWeightBSwitch BOOLEAN*/
-    [fX264optWeightBSwitch setState:1];
-    [fX264optWeightBSwitch setWantsLayer:YES];
-    toolTip =
-        @"Sometimes x264 will base a B-frame's motion compensation on frames both before and after. With weighted B-frames, the amount of influence each frame has is related to its distance from the frame being encoded, instead of both having equal influence. The AppleTV can have issues with this.";
-    [fX264optWeightBSwitch setToolTip: toolTip];
-    [fX264optWeightBLabel setToolTip: toolTip];
-    
-    /*B-frame Pyramids fX264optBPyramidSwitch BOOLEAN*/
-    [fX264optBPyramidSwitch setState:0];
-    [fX264optBPyramidSwitch setWantsLayer:YES];
+    /*B-frame Pyramids fX264optBPyramidPopUp*/
+    [fX264optBPyramidPopUp removeAllItems];
+    [fX264optBPyramidPopUp addItemWithTitle:@"Default (Normal)"];
+    [fX264optBPyramidPopUp addItemWithTitle:@"Off"];
+    [fX264optBPyramidPopUp addItemWithTitle:@"Strict"];
+    [fX264optBPyramidPopUp setWantsLayer:YES];
     toolTip =
-        @"B-frame pyramids are a High Profile feature. Pyramidal B-frames mean that B-frames don't just reference surrounding reference frames â€” instead, it also treats a previous B-frame as a reference, improving quality/lowering bitrate at the expense of complexity. Logically, to reference an earlier B-frame, you must tell x264 to use at least 2 B-frames.";
-    [fX264optBPyramidSwitch setToolTip: toolTip];
+        @"B-pyramid improves compression by creating a pyramidal structure (hence the name) of B-frames, allowing B-frames to reference each other to improve compression.  Requires Max B-frames greater than 1; optimal adaptive B-frames is strongly recommended for full compression benefit.";
+    [fX264optBPyramidPopUp setToolTip: toolTip];
     [fX264optBPyramidLabel setToolTip: toolTip];
     
     /*Direct B-Frame Prediction Mode fX264optDirectPredPopUp*/
     [fX264optDirectPredPopUp addItemWithTitle:@"Automatic"];
     [fX264optDirectPredPopUp setWantsLayer:YES];
     toolTip =
-        @"Direct prediction tells x264 what method to use when guessing motion for certain parts of a B-frame. It can either look at other parts of the current frame (spatial) or compare against the following P-frameframe (temporal). You're best off setting this to automatic, so x264 decides which method is best on its own. Don't select none assuming it will be faster; instead it will take longer and look worse. If you're going to choose between spatial and temporal, spatial is usually better.";
+        @"H.264 allows for two different prediction modes, spatial and temporal, in B-frames.\n\nSpatial, the default, is almost always better, but temporal is sometimes useful too.\n\nx264 can, at the cost of a small amount of speed (and accordingly for a small compression gain), adaptively select which is better for each particular frame.";
     [fX264optDirectPredPopUp setToolTip: toolTip];
     [fX264optDirectPredLabel setToolTip: toolTip];
     
     [fX264optBAdaptPopUp addItemWithTitle:@"Optimal"];
     [fX264optBAdaptPopUp setWantsLayer:YES];
     toolTip =
-        @"When adaptive B-Frames are disabled, the number of B-Frames you specify is the constant length of every B-Frame sequence. When one of the adaptive modes is enabled, the number of B-Frames is treated as a maximum, with the length of each sequence varying, but never exceeding the max.\n\nFast mode takes the same amount of time no matter how many B-frames you specify. However, it doesn't always make the best decisions on how many B-Frames to use in a sequence.\n\nOptimal mode gets slower as the maximum number of B-Frames increases, but does a much better job at deciding sequence length, which can mean smaller file sizes and better quality.";
+        @"x264 has a variety of algorithms to decide when to use B-frames and how many to use.\n\nFast mode takes roughly the same amount of time no matter how many B-frames you specify.  However, while fast, its decisions are often suboptimal.\n\nOptimal mode gets slower as the maximum number of B-Frames increases, but makes much more accurate decisions, especially when used with B-pyramid.";
     [fX264optBAdaptPopUp setToolTip: toolTip];
     [fX264optBAdaptLabel setToolTip: toolTip];
     
         [fX264optAlphaDeblockPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
     }
     toolTip =
-        @"x264 includes an in-loop deblocking filter. What this means is that blocky compression artifacts are smoothed away when you play back the video. It has two settings: strength and threshold, just like a simple filter in Photoshop.\n\nStrength controls the amount of deblocking applied to the whole frame. If you drop down below 0, you reduce the amount of blurring. Go too negative, and you'll get an effect somewhat like oversharpening an image. Go into positive values, and the image may become too soft.\n\nThreshold controls how sensitive the filter is to whether something in a block is detail that needs to be preserved: lower numbers blur details less.\n\nThe default deblocking values are 0 and 0. This does not mean zero deblocking. It means x264 will apply the regular deblocking strength and thresholds the codec authors have selected as working the best in most cases.\n\nWhile many, many people stick with the default deblocking values of 0,0, and you should never change the deblocking without disabling adaptive quantization, other people disagree. Some prefer a slightly less blurred image for live action material, and use values like -2,-1 or -2,-2. Others will raise it to 1,1 or even 3,3 for animation. While the values for each setting extend from -6 to 6, the consensus is that going below -3 or above 3 is worthless.";
+        @"H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame.  This not only improves visual quality, but also helps compression significantly. The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.\n\nThe deblocking filter has two adjustable parameters, \"strength\" and \"threshold\". The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few) edges it applies to. Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.";
     [fX264optAlphaDeblockPopUp setToolTip: toolTip];
     [fX264optDeblockLabel setToolTip: toolTip];
 
 
     /* Analysis fX264optAnalysePopUp */
     [fX264optAnalysePopUp removeAllItems];
-    [fX264optAnalysePopUp addItemWithTitle:@"Default (some)"]; /* 0=default */
+    [fX264optAnalysePopUp addItemWithTitle:@"Default (Most)"]; /* 0=default */
     [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"None"]]; /* 1=none */
-    [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"All"]]; /* 2=all */
+    [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"Some"]]; /* 2=some */
+    [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"All"]]; /* 3=all */
     toolTip =
-        @"Analysis controls how finely x264 divides up a frame to capture detail. Full macroblocks are 16x16 pixels, but x264 can go down all the way to 4x4 blocks if it judges it necessary. By default it only breaks up key frames that much. To give x264 the freedom to make the best decisions for all frames, use \"all\" analysis. If you want to create a high profile H.264 video (which is less compatible with the world at large than main profile), also check the \"8x8 DCT blocks\" box to add yet another block size for analysis.";
+        @"Mode decision picks from a variety of options to make its decision: this option chooses what options those are.  Fewer partitions to check means faster encoding, at the cost of worse decisions, since the best option might have been one that was turned off.";
     [fX264optAnalysePopUp setToolTip: toolTip];
     [fX264optAnalyseLabel setToolTip: toolTip];
 
     [fX264opt8x8dctSwitch setState:1];
     [fX264opt8x8dctSwitch setWantsLayer:YES];
     toolTip =
-        @"Checking this box lets x264 break key frames down into 8x8 blocks of pixels for analysis. This is a high profile feature of H.264, which makes it less compatible. It should slightly decrease bitrate or improve quality. Turn it on whenever possible.";
+        @"The 8x8 transform is the single most useful feature of x264 in terms of compression-per-speed.  It improves compression by at least 5% at a very small speed cost and may provide an unusually high visual quality benefit compared to its compression gain.  However, it requires High Profile, which many devices may not support.";
     [fX264opt8x8dctSwitch setToolTip: toolTip];
     [fX264opt8x8dctLabel setToolTip: toolTip];
 
     /* CABAC fX264opCabacSwitch */
     [fX264optCabacSwitch setState:1];
     toolTip =
-        @"CABAC, or context adaptive binary arithmetic coding, is used by x264 to reduce the bitrate needed for a given quality by 15\%. This makes it very cool and very useful, and it should be left on whenever possible. However, it is incompatible with the iPod, and makes the AppleTV struggle. So turn it off for those.\n\nCABAC is a kind of entropy coding, which means that it compresses data by making shorthand symbols to represent long streams of data. The \"entropy\" part means that the symbols it uses the most often are the smallest. When you disable CABAC, another entropy coding scheme gets enabled, called CAVLC (context adaptive variable-length coding). CAVLC is a lot less efficient, which is why it needs 15\% more bitrate to achieve the same quality as CABAC.";
+        @"After the encoder has done its work, it has a bunch of data that needs to be compressed losslessly, similar to ZIP or RAR.  H.264 provides two options for this: CAVLC and CABAC.  CABAC decodes a lot slower but compresses significantly better (10-30%), especially at lower bitrates.  If you're looking to minimize CPU requirements for video playback, disable this option. Baseline profile, as required for iPods and similar devices, requires CABAC to be disabled.";
     [fX264optCabacSwitch setToolTip: toolTip];
     [fX264optCabacLabel setToolTip: toolTip];
+
+    /* Adaptive Quantization Strength fX264opAqSlider */
+    [fX264optAqSlider setMinValue:0.0];
+    [fX264optAqSlider setMaxValue:2.0];
+    [fX264optAqSlider setTickMarkPosition:NSTickMarkBelow];
+    [fX264optAqSlider setNumberOfTickMarks:21];
+    [fX264optAqSlider setAllowsTickMarkValuesOnly:YES];
+    [fX264optAqSlider setFloatValue:1.0];
+    toolTip =
+        @"Adaptive quantization controls how the encoder distributes bits across the frame.  Higher values take more bits away from edges and complex areas to improve areas with finer detail.";
+    [fX264optAqSlider setToolTip: toolTip];
+    [fX264optAqLabel setToolTip: toolTip];
     
     /* PsyRDO fX264optPsyRDSlider */
     [fX264optPsyRDSlider setMinValue:0.0];
-    [fX264optPsyRDSlider setMaxValue:1.0];
+    [fX264optPsyRDSlider setMaxValue:2.0];
     [fX264optPsyRDSlider setTickMarkPosition:NSTickMarkBelow];
-    [fX264optPsyRDSlider setNumberOfTickMarks:11];
+    [fX264optPsyRDSlider setNumberOfTickMarks:21];
     [fX264optPsyRDSlider setAllowsTickMarkValuesOnly:YES];
     [fX264optPsyRDSlider setFloatValue:1.0];
     toolTip =
-        @"Psychovisual Rate Distortion Optimization sure is a mouthful, isn't it? Basically, it means x264 tries to retain detail, for better quality to the human eye, as opposed to trying to maximize quality the way a computer understands it, through signal-to-noise ratios that have trouble telling apart fine detail and noise.";
+        @"Psychovisual rate-distortion optimization takes advantage of the characteristics of human vision to dramatically improve apparent detail and sharpness.  The effect can be made weaker or stronger by adjusting the strength.  Being an RD algorithm, it requires mode decision to be at least \"6\".";
     [fX264optPsyRDSlider setToolTip: toolTip];
     [fX264optPsyRDLabel setToolTip: toolTip];
 
     [fX264optPsyTrellisSlider setMinValue:0.0];
     [fX264optPsyTrellisSlider setMaxValue:1.0];
     [fX264optPsyTrellisSlider setTickMarkPosition:NSTickMarkBelow];
-    [fX264optPsyTrellisSlider setNumberOfTickMarks:11];
+    [fX264optPsyTrellisSlider setNumberOfTickMarks:21];
     [fX264optPsyTrellisSlider setAllowsTickMarkValuesOnly:YES];
     [fX264optPsyTrellisSlider setFloatValue:0.0];
     toolTip =
-        @"Psychovisual Trellis tries to retain more sharpness and detail, but can cause artifacting. It is considered experimental, which is why it's off by default. Good values are 0.1 to 0.2.";
+        @"Psychovisual trellis is an experimental algorithm to further improve sharpness and detail retention beyond what Psychovisual RD does.  Recommended values are around 0.2, though higher values may help for very grainy video or lower bitrate encodes.  Not recommended for cel animation and other sharp-edged graphics.";
     [fX264optPsyTrellisSlider setToolTip: toolTip];
     [fX264optPsyTrellisLabel setToolTip: toolTip];
 
         cleanOptNameString = @"ref";
     }
     
-    /*No Fast PSkip nofast_pskip*/
-    if ([cleanOptNameString isEqualToString:@"no-fast-pskip"] || [cleanOptNameString isEqualToString:@"no_fast_pskip"] || [cleanOptNameString isEqualToString:@"nofast_pskip"])
-    {
-        cleanOptNameString = @"no-fast-pskip";
-    }
-    
     /*No Dict Decimate*/
     if ([cleanOptNameString isEqualToString:@"no-dct-decimate"] || [cleanOptNameString isEqualToString:@"no_dct_decimate"] || [cleanOptNameString isEqualToString:@"nodct_decimate"])
     {
     if ([cleanOptNameString isEqualToString:@"me-range"] || [cleanOptNameString isEqualToString:@"me_range"])
         cleanOptNameString = @"merange";
     
-    /*WeightB*/
-    if ([cleanOptNameString isEqualToString:@"weight-b"] || [cleanOptNameString isEqualToString:@"weight_b"])
-    {
-        cleanOptNameString = @"weightb";
-    }
-    
     /*B Pyramid*/
     if ([cleanOptNameString isEqualToString:@"b_pyramid"])
     {
 {
     /* Lots of situations to cover.
        - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)
-       - CABAC (when 0 turn off trellis)
-       - analysis (if none, turn off 8x8dct)
-       - refs (under 2, disable mixed-refs)
+       - CABAC (when 0 turn off trellis and psy-trel)
        - subme (if under 6, turn off psy-rd and psy-trel)
        - trellis (if 0, turn off psy-trel)
     */
     
     if( sender == fX264optBframesPopUp || sender == nil || sender == fDisplayX264Options )
     {
-        if ( [fX264optBframesPopUp indexOfSelectedItem ] > 0 &&
-             [fX264optBframesPopUp indexOfSelectedItem ] < 2)
+        if ( [fX264optBframesPopUp indexOfSelectedItem ] == 1 )
         {
-            /* If the b-frame widget is at 0 or 1, the user has chosen
+            /* If the b-frame widget is at 1, the user has chosen
                not to use b-frames at all. So disable the options
                that can only be used when b-frames are enabled.        */
             
-            if( [fX264optWeightBSwitch isHidden] == false)
-            {
-                [[fX264optWeightBSwitch animator] setHidden:YES];
-                [[fX264optWeightBLabel animator] setHidden:YES];
-                if ( [fX264optWeightBSwitch state] == 1 )
-                    [fX264optWeightBSwitch performClick:self];
-            }
-
-            if( [fX264optBPyramidSwitch isHidden] == false )
+            if( [fX264optBPyramidPopUp isHidden] == false )
             {
-                [[fX264optBPyramidSwitch animator] setHidden:YES];
+                [[fX264optBPyramidPopUp animator] setHidden:YES];
                 [[fX264optBPyramidLabel animator] setHidden:YES];
-                if ( [fX264optBPyramidSwitch state] == 1 )
-                    [fX264optBPyramidSwitch performClick:self];
+                if ( [fX264optBPyramidPopUp indexOfSelectedItem] > 0 )
+                {
+                    [fX264optBPyramidPopUp selectItemAtIndex: 0];
+                    [[fX264optBPyramidPopUp cell] performClick:self];
+                }
             }
 
             if( [fX264optDirectPredPopUp isHidden] == false )
         else if ( [fX264optBframesPopUp indexOfSelectedItem ] == 2)
         {
             /* Only 1 b-frame? Disable b-pyramid. */
-            if( [fX264optBPyramidSwitch isHidden] == false )
+            if( [fX264optBPyramidPopUp isHidden] == false )
             {
-                [[fX264optBPyramidSwitch animator] setHidden:YES];
+                [[fX264optBPyramidPopUp animator] setHidden:YES];
                 [[fX264optBPyramidLabel animator] setHidden:YES];
-                if ( [fX264optBPyramidSwitch state] == 1 )
-                    [fX264optBPyramidSwitch performClick:self];
+                if ( [fX264optBPyramidPopUp indexOfSelectedItem] > 0 )
+                {
+                    [fX264optBPyramidPopUp selectItemAtIndex: 0];
+                    [[fX264optBPyramidPopUp cell] performClick:self];
+                }
             }
 
-            if( [fX264optWeightBSwitch isHidden] == true )
-            {
-                [[fX264optWeightBSwitch animator] setHidden:NO];
-                [[fX264optWeightBLabel animator] setHidden:NO];
-            }
-            
             if( [fX264optDirectPredPopUp isHidden] == true )
             {
                 [[fX264optDirectPredPopUp animator] setHidden:NO];
         }
         else
         {
-            if( [fX264optBPyramidSwitch isHidden] == true )
+            if( [fX264optBPyramidPopUp isHidden] == true )
             {
-                [[fX264optBPyramidSwitch animator] setHidden:NO];
+                [[fX264optBPyramidPopUp animator] setHidden:NO];
                 [[fX264optBPyramidLabel animator] setHidden:NO];
             }
 
-            if( [fX264optWeightBSwitch isHidden] == true )
-            {
-                [[fX264optWeightBSwitch animator] setHidden:NO];
-                [[fX264optWeightBLabel animator] setHidden:NO];
-            }
-            
             if( [fX264optDirectPredPopUp isHidden] == true )
             {
                 [[fX264optDirectPredPopUp animator] setHidden:NO];
         }
     }
     
-    if( sender == fX264optCabacSwitch || sender == nil || sender == fDisplayX264Options )
-    {
-        if ( [fX264optCabacSwitch state] == false)
-        {
-            if( [fX264optTrellisPopUp isHidden] == false )
-            {
-                /* Without CABAC entropy coding, trellis doesn't run. */
-                [[fX264optTrellisPopUp animator] setHidden:YES];
-                [[fX264optTrellisLabel animator] setHidden:YES];
-                [fX264optTrellisPopUp selectItemAtIndex:0];
-                [[fX264optTrellisPopUp cell] performClick:self];
-            }
-        }
-        else if( [fX264optTrellisPopUp isHidden] == true)
-        {
-            [[fX264optTrellisPopUp animator] setHidden:NO];
-            [[fX264optTrellisLabel animator] setHidden:NO];
-        }
-    }
-    
-    if( sender == fX264optAnalysePopUp || sender == nil || sender == fDisplayX264Options )
-    {
-        if ( [fX264optAnalysePopUp indexOfSelectedItem] == 1)
-        {
-            /* No analysis? Disable 8x8dct */
-            if( [fX264opt8x8dctSwitch isHidden] == false )
-            {
-                [[fX264opt8x8dctSwitch animator] setHidden:YES];
-                [[fX264opt8x8dctLabel animator] setHidden:YES];
-                if ( [fX264opt8x8dctSwitch state] == 1 )
-                    [fX264opt8x8dctSwitch performClick:self];
-            }
-        }
-        else
-        {
-            if( [fX264opt8x8dctSwitch isHidden] == true )
-            {
-                [[fX264opt8x8dctSwitch animator] setHidden:NO];
-                [[fX264opt8x8dctLabel animator] setHidden:NO];
-            }
-        }
-    }
-    
-    if( sender == fX264optRefPopUp || sender == nil || sender == fDisplayX264Options )
-    {
-        if ( [fX264optRefPopUp indexOfSelectedItem] > 0 &&
-             [fX264optRefPopUp indexOfSelectedItem] < 3 )
-        {
-            if( [fX264optMixedRefsSwitch isHidden] == false )
-            {
-                /* Only do mixed-refs when there are at least 2 refs to mix. */
-                [[fX264optMixedRefsSwitch animator] setHidden:YES];
-                [[fX264optMixedRefsLabel animator] setHidden:YES];
-                if( [fX264optMixedRefsSwitch state] == 1 )
-                    [fX264optMixedRefsSwitch performClick:self];
-            }
-        }
-        else
-        {
-            if( [fX264optMixedRefsSwitch isHidden] == true )
-            {
-                [[fX264optMixedRefsSwitch animator] setHidden:NO];
-                [[fX264optMixedRefsLabel animator] setHidden:NO];
-            }
-        }
-    }
-    
     if( sender == fX264optMotionEstPopUp || sender == nil || sender == fDisplayX264Options )
     {
         if ( [fX264optMotionEstPopUp indexOfSelectedItem] < 3 )
             {
                 [[fX264optPsyRDSlider animator] setHidden:YES];
                 [[fX264optPsyRDLabel animator] setHidden:YES];
-                [[fX264optPsyRDSlider animator] setFloatValue:1];
                 if ( [fX264optPsyRDSlider floatValue] < 1.0 )
                 {
                     [fX264optPsyRDSlider setFloatValue:1.0];
             {
                 [[fX264optPsyTrellisSlider animator] setHidden:YES];
                 [[fX264optPsyTrellisLabel animator] setHidden:YES];
-                [[fX264optPsyTrellisSlider animator] setFloatValue:0];
                 if ( [fX264optPsyTrellisSlider floatValue] > 0.0 )
                 {
                     [fX264optPsyTrellisSlider setFloatValue:0.0];
                 [[fX264optPsyRDLabel animator] setHidden:NO];
             }
 
-            if( ( [fX264optTrellisPopUp indexOfSelectedItem] == 0 || [fX264optTrellisPopUp indexOfSelectedItem] >= 2 ) && [fX264optCabacSwitch state] == true && [fX264optPsyTrellisSlider isHidden] == true )
+            if( ( [fX264optTrellisPopUp indexOfSelectedItem] == 0 || [fX264optTrellisPopUp indexOfSelectedItem] >= 2 ) && [fX264optPsyTrellisSlider isHidden] == true )
             {
                 [[fX264optPsyTrellisSlider animator] setHidden:NO];
                 [[fX264optPsyTrellisLabel animator] setHidden:NO];
         }
         else
         {
-            if( ( [fX264optSubmePopUp indexOfSelectedItem] == 0 || [fX264optSubmePopUp indexOfSelectedItem] >= 7 ) && [fX264optCabacSwitch state] == true  && [fX264optPsyTrellisSlider isHidden] == true )
+            if( ( [fX264optSubmePopUp indexOfSelectedItem] == 0 || [fX264optSubmePopUp indexOfSelectedItem] >= 7 ) && [fX264optPsyTrellisSlider isHidden] == true )
             {
                 [[fX264optPsyTrellisSlider animator] setHidden:NO];
                 [[fX264optPsyTrellisLabel animator] setHidden:NO];
                 /*ref NSPopUpButton*/
                 if ([optName isEqualToString:@"ref"])
                 {
-                    [fX264optRefPopUp selectItemAtIndex:[optValue intValue]+1];
+                    // Clamp values to a minimum of 1 and a maximum of 16
+                    if ( [optValue intValue] < 1 )
+                    {
+                        [fX264optRefPopUp selectItemAtIndex:1];
+                        [ self X264AdvancedOptionsChanged: fX264optRefPopUp];
+                    }
+                    else if ( [optValue intValue] > 16 )
+                    {
+                        [fX264optRefPopUp selectItemAtIndex:16];
+                        [ self X264AdvancedOptionsChanged: fX264optRefPopUp];
+                    }
+                    else
+                    {
+                        [fX264optRefPopUp selectItemAtIndex:[optValue intValue]];
+                    }
                 }
-                /*No Fast PSkip NSButton*/
-                if ([optName isEqualToString:@"no-fast-pskip"])
+                /*WeightP NSButton*/
+                if ([optName isEqualToString:@"weightp"])
                 {
-                    [fX264optNfpskipSwitch setState:[optValue intValue]];
+                    if ([optValue intValue] < 1)
+                        [fX264optWeightPSwitch setState:0];
+                    else
+                        [fX264optWeightPSwitch setState:1];
                 }
                 /*No Dict Decimate NSButton*/
                 if ([optName isEqualToString:@"no-dct-decimate"])
                 {
                     [fX264optTrellisPopUp selectItemAtIndex:[optValue intValue]+1];
                 }
-                /*Mixed Refs NSButton*/
-                if ([optName isEqualToString:@"mixed-refs"])
-                {
-                    [fX264optMixedRefsSwitch setState:[optValue intValue]];
-                }
                 /*Motion Estimation NSPopUpButton*/
                 if ([optName isEqualToString:@"me"])
                 {
                 {
                     [fX264optBAdaptPopUp selectItemAtIndex:[optValue intValue]+1];
                 }
-                /*Weighted B-Frames NSButton*/
-                if ([optName isEqualToString:@"weightb"])
-                {
-                    [fX264optWeightBSwitch setState:[optValue intValue]];
-                }
                 /*B Pyramid NSPButton*/
                 if ([optName isEqualToString:@"b-pyramid"])
                 {
-                    [fX264optBPyramidSwitch setState:[optValue intValue]];
-                }
+                    
+                    if( [optValue isEqualToString:@"normal"] )
+                    {
+                        [self X264AdvancedOptionsChanged: fX264optBPyramidPopUp];
+                        [fX264optBPyramidPopUp selectItemAtIndex:0];
+                    }
+                    else if( [optValue isEqualToString:@"2"] )
+                    {
+                        [fX264optBPyramidPopUp selectItemAtIndex:0];
+                        [self X264AdvancedOptionsChanged: fX264optBPyramidPopUp];
+                    }
+                    if( [optValue isEqualToString:@"strict"] )
+                    {
+                        [fX264optBPyramidPopUp selectItemAtIndex:2];
+                    }
+                    else if( [optValue isEqualToString:@"1"] )
+                    {
+                        [fX264optBPyramidPopUp selectItemAtIndex:2];
+                        [self X264AdvancedOptionsChanged: fX264optBPyramidPopUp];
+                    }
+                    if( [optValue isEqualToString:@"none"] )
+                    {
+                        [fX264optBPyramidPopUp selectItemAtIndex:1];
+                    }
+                    else if( [optValue isEqualToString:@"0"] )
+                    {
+                        [fX264optBPyramidPopUp selectItemAtIndex:1];
+                        [self X264AdvancedOptionsChanged: fX264optBPyramidPopUp];
+                    }
+                }                
                 /*Direct B-frame Prediction NSPopUpButton*/
-                if ([optName isEqualToString:@"direct"])
+                                if ([optName isEqualToString:@"direct"])
                 {
                     if ([optValue isEqualToString:@"none"])
                         [fX264optDirectPredPopUp selectItemAtIndex:1];
                 {
                     if ([optValue isEqualToString:@"p8x8,b8x8,i8x8,i4x4"])
                     {
-                        /* Default ("some") */
+                        /* Default ("most") */
                         [fX264optAnalysePopUp selectItemAtIndex:0];
                     }
-                    if ([optValue isEqualToString:@"none"])
+                    else if ([optValue isEqualToString:@"i4x4,i8x8"] ||
+                             [optValue isEqualToString:@"i8x8,i4x4"] )
+                    {
+                        /* Some */
+                        [fX264optAnalysePopUp selectItemAtIndex:2];
+                    }
+                    else if ([optValue isEqualToString:@"none"])
                     {
                         [fX264optAnalysePopUp selectItemAtIndex:1];
                     }
-                    if ([optValue isEqualToString:@"all"])
+                    else if ([optValue isEqualToString:@"all"])
                     {
-                        [fX264optAnalysePopUp selectItemAtIndex:2];
+                        [fX264optAnalysePopUp selectItemAtIndex:3];
                     }
+                    
                 }
                 /* 8x8 DCT NSButton */
                 if ([optName isEqualToString:@"8x8dct"])
                 {
                     [fX264optCabacSwitch setState:[optValue intValue]];
                 }
+                /* Adaptive Quantization Strength NSSlider */
+                if ([optName isEqualToString:@"aq-strength"])
+                {
+                    [fX264optAqSlider setFloatValue:[optValue floatValue]];
+                }                                                              
                 /* Psy-RD and Psy-Trellis NSSliders */
                 if ([optName isEqualToString:@"psy-rd"])
                 {
     {
         optNameToChange = @"ref";
     }
-    if (widget == fX264optNfpskipSwitch)
+    if (widget == fX264optWeightPSwitch)
     {
-        optNameToChange = @"no-fast-pskip";
+        optNameToChange = @"weightp";
     }
     if (widget == fX264optNodctdcmtSwitch)
     {
     {
         optNameToChange = @"trellis";
     }
-    if (widget == fX264optMixedRefsSwitch)
-    {
-        optNameToChange = @"mixed-refs";
-    }
     if (widget == fX264optMotionEstPopUp)
     {
         optNameToChange = @"me";
     {
         optNameToChange = @"b-adapt";
     }
-    if (widget == fX264optWeightBSwitch)
-    {
-        optNameToChange = @"weightb";
-    }
-    if (widget == fX264optBPyramidSwitch)
+    if (widget == fX264optBPyramidPopUp)
     {
         optNameToChange = @"b-pyramid";
     }
     {
         optNameToChange = @"cabac";
     }
+    if( widget == fX264optAqSlider)
+    {
+        optNameToChange = @"aq-strength";
+    }
     if( widget == fX264optPsyRDSlider)
     {
         optNameToChange = @"psy-rd";
         }
     }
     
+    else if ([optName isEqualToString:@"aq-strength"])
+    {
+        if( [fX264optAqSlider floatValue] == 1.0 ) 
+        {
+            /* When Aq is 1 it's the default value and can be ignored. */
+            thisOpt = @"";                                
+        }
+        else
+        {
+            thisOpt = [NSString stringWithFormat:@"%@=%0.1f", optName, [fX264optAqSlider floatValue] ];
+        }
+    }
+
     else if ([optName isEqualToString:@"psy-rd"])
     {
         if( [fX264optPsyRDSlider floatValue] == 1.0 && [fX264optPsyTrellisSlider floatValue] == 0.0 ) 
         }
         else
         {
-            /* Otherwise the format is deblock=a,b, where a and b both have an array
-               offset of 7 because deblocking values start at -6 instead of at zero. */
-            thisOpt = [NSString stringWithFormat:@"%@=%0.1f,%0.1f", optName, [fX264optPsyRDSlider floatValue], [fX264optPsyTrellisSlider floatValue] ];
+            /* Otherwise the format is psy-rd=a,b */
+            thisOpt = [NSString stringWithFormat:@"%@=%0.1f,%0.2f", optName, [fX264optPsyRDSlider floatValue], [fX264optPsyTrellisSlider floatValue] ];
         }
     }
     
-    else if /*Boolean Switches*/ ( [optName isEqualToString:@"b-pyramid"] || [optName isEqualToString:@"no-fast-pskip"] || [optName isEqualToString:@"no-dct-decimate"] )
+    else if /*Boolean Switches*/ ( [optName isEqualToString:@"no-dct-decimate"] )
     {
         /* Here is where we take care of the boolean options that work overtly:
            no-dct-decimate being on means no-dct-decimate=1, etc. Some options
         }
     }
     
-    else if ( [optName isEqualToString:@"8x8dct"] || [optName isEqualToString:@"weightb"] || [optName isEqualToString:@"mixed-refs"] || [optName isEqualToString:@"cabac"] )
+    else if ( [optName isEqualToString:@"8x8dct"] || [optName isEqualToString:@"cabac"] || [optName isEqualToString:@"weightp"] )
     {
         /* These options default to being on. That means they
            only need to be included in the string when turned off. */
             case 1:
                 thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
                 break;
-                
             case 2:
+                thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"i4x4,i8x8"];
+                break;
+            case 3:
                 thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"all"];
                 break;
                 
                 break;
         }
     }
+
+    else if ([optName isEqualToString:@"b-pyramid"])
+    {
+        /* B-pyramid uses string values too. */
+        switch ([sender indexOfSelectedItem])
+        {   
+            case 1:
+                thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
+                break;
+            case 2:
+                thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"strict"];
+                break;
+            case 0:
+                thisOpt = @"";
+                break;
+                
+            default:
+                break;
+        }
+    }
     
     else if ([optName isEqualToString:@"merange"])
     {
         thisOpt = [NSString stringWithFormat:@"%@=%d", optName, [sender indexOfSelectedItem]-1];
     }
     
+    else if ([optName isEqualToString:@"ref"])
+    {
+        /* Refs use actual index numbers */
+        thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]];
+    }
+    
     else // we have a valid value to change, so change it
     {
         if ( [sender indexOfSelectedItem] != 0 )
-        /* Here's our general case, that catches things like ref frames and b-frames.
+        /* Here's our general case, that catches things like b-frames.
            Basically, any options that are PopUp menus with index 0 as default and
-           index 1 as 1, with numerical values, are all handled right here. All of
+           index 1 as 0, with numerical values, are all handled right here. All of
            the above stuff is for the exceptions to the general case.              */
             thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]-1];
     }
diff --git a/macosx/HBAudio.h b/macosx/HBAudio.h
new file mode 100644 (file)
index 0000000..08d1b19
--- /dev/null
@@ -0,0 +1,60 @@
+//
+//  HBAudio.h
+//  HandBrake
+//
+//  Created on 2010-08-30.
+//
+
+#import <Cocoa/Cocoa.h>
+
+@class HBAudioController;
+
+extern NSString *keyAudioCodecName;
+extern NSString *keyAudioSampleRateName;
+extern NSString *keyAudioBitrateName;
+extern NSString *keyAudioMixdownName;
+extern NSString *keyAudioCodec;
+extern NSString *keyAudioMixdown;
+extern NSString *keyAudioSamplerate;
+extern NSString *keyAudioBitrate;
+
+@interface HBAudio : NSObject
+
+{
+       NSDictionary *track;
+       NSDictionary *codec;
+       NSDictionary *mixdown;
+       NSDictionary *sampleRate;
+       NSDictionary *bitRate;
+       NSNumber *drc;
+       NSNumber *videoContainerTag;
+       HBAudioController *controller;
+       NSMutableArray *codecs;
+       NSMutableArray *mixdowns;
+       NSMutableArray *bitRates;
+}
+
+@property (nonatomic, retain) NSDictionary *track;
+@property (nonatomic, retain) NSDictionary *codec;
+@property (nonatomic, retain) NSDictionary *mixdown;
+@property (nonatomic, retain) NSDictionary *sampleRate;
+@property (nonatomic, retain) NSDictionary *bitRate;
+@property (nonatomic, retain) NSNumber *drc;
+@property (nonatomic, retain) NSNumber *videoContainerTag;
+@property (nonatomic, assign) HBAudioController *controller;
+
+@property (nonatomic, readonly) NSArray *tracks;
+@property (nonatomic, retain) NSMutableArray *codecs;
+@property (nonatomic, retain) NSMutableArray *mixdowns;
+@property (nonatomic, readonly) NSArray *sampleRates;
+@property (nonatomic, retain) NSArray *bitRates;
+@property (nonatomic, readonly) BOOL enabled;
+
+- (void) setTrackFromIndex: (int) aValue;
+- (BOOL) setCodecFromName: (NSString *) aValue;
+- (void) setMixdownFromName: (NSString *) aValue;
+- (void) setSampleRateFromName: (NSString *) aValue;
+- (void) setBitRateFromName: (NSString *) aValue;
+
+@end
+
diff --git a/macosx/HBAudio.m b/macosx/HBAudio.m
new file mode 100644 (file)
index 0000000..c1c0cd5
--- /dev/null
@@ -0,0 +1,587 @@
+//
+//  HBAudio.m
+//  HandBrake
+//
+//  Created on 2010-08-30.
+//
+
+#import "HBAudio.h"
+#import "HBAudioController.h"
+#import "hb.h"
+
+NSString *keyAudioCodecName = @"keyAudioCodecName";
+NSString *keyAudioMP4 = @"keyAudioMP4";
+NSString *keyAudioMKV = @"keyAudioMKV";
+NSString *keyAudioSampleRateName = @"keyAudioSampleRateName";
+NSString *keyAudioBitrateName = @"keyAudioBitrateName";
+NSString *keyAudioMustMatchTrack = @"keyAudioMustMatchTrack";
+NSString *keyAudioMixdownName = @"keyAudioMixdownName";
+
+NSString *keyAudioCodec = @"codec";
+NSString *keyAudioMixdown = @"mixdown";
+NSString *keyAudioSamplerate = @"samplerate";
+NSString *keyAudioBitrate = @"bitrate";
+
+static NSMutableArray *masterCodecArray = nil;
+static NSMutableArray *masterMixdownArray = nil;
+static NSMutableArray *masterSampleRateArray = nil;
+static NSMutableArray *masterBitRateArray = nil;
+
+@interface NSArray (HBAudioSupport)
+- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey;
+- (NSDictionary *) lastDictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey;
+@end
+@implementation NSArray (HBAudioSupport)
+- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey reverse: (BOOL) reverse
+
+{
+       NSDictionary *retval = nil;
+       NSEnumerator *enumerator = reverse ? [self reverseObjectEnumerator] : [self objectEnumerator];
+       NSDictionary *dict;
+       id aValue;
+       
+       while (nil != (dict = [enumerator nextObject]) && nil == retval) {
+               if (nil != (aValue = [dict objectForKey: aKey]) && YES == [aValue isEqual: anObject]) {
+                       retval = dict;
+               }
+       }
+       return retval;
+}
+- (NSDictionary *) dictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey
+{      return [self dictionaryWithObject: anObject matchingKey: aKey reverse: NO];     }
+- (NSDictionary *) lastDictionaryWithObject: (id) anObject matchingKey: (NSString *) aKey
+{      return [self dictionaryWithObject: anObject matchingKey: aKey reverse: YES];    }
+
+@end
+
+@implementation HBAudio
+
+#pragma mark -
+#pragma mark Object Setup
+
++ (void) load
+
+{
+       if ([HBAudio class] == self) {
+               int i;
+               NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+               NSDictionary *dict;
+               
+               masterCodecArray = [[NSMutableArray alloc] init];       //      knowingly leaked
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"AAC (CoreAudio)", @"AAC (CoreAudio)"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_CA_AAC], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"AAC (faac)", @"AAC (faac)"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_FAAC], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"MP3 (lame)", @"MP3 (lame)"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_LAME], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"AC3 Passthru", @"AC3 Passthru"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_AC3_PASS], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_AC3], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"AC3", @"AC3"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_AC3], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"DTS Passthru", @"DTS Passthru"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_DCA_PASS], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_DCA], keyAudioMustMatchTrack,
+                                                                         nil]];
+               [masterCodecArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                         NSLocalizedString(@"Vorbis (vorbis)", @"Vorbis (vorbis)"), keyAudioCodecName,
+                                                                         [NSNumber numberWithInt: HB_ACODEC_VORBIS], keyAudioCodec,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMP4,
+                                                                         [NSNumber numberWithBool: YES], keyAudioMKV,
+                                                                         [NSNumber numberWithBool: NO], keyAudioMustMatchTrack,
+                                                                         nil]];
+               
+               masterMixdownArray = [[NSMutableArray alloc] init];     //      knowingly leaked
+               [masterMixdownArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                               NSLocalizedString(@"AC3 Passthru", @"AC3 Passthru"), keyAudioMixdownName,
+                                                                               [NSNumber numberWithInt: HB_ACODEC_AC3_PASS], keyAudioMixdown,
+                                                                               nil]];
+               [masterMixdownArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                               NSLocalizedString(@"DTS Passthru", @"DTS Passthru"), keyAudioMixdownName,
+                                                                               [NSNumber numberWithInt: HB_ACODEC_DCA_PASS], keyAudioMixdown,
+                                                                               nil]];
+               for (i = 0; i < hb_audio_mixdowns_count; i++) {
+                       [masterMixdownArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                       [NSString stringWithUTF8String: hb_audio_mixdowns[i].human_readable_name], keyAudioMixdownName,
+                                                                                       [NSNumber numberWithInt: hb_audio_mixdowns[i].amixdown], keyAudioMixdown,
+                                                                                       nil]];
+               }
+
+               //      Note that for the Auto value we use 0 for the sample rate because our controller will give back the track's
+               //      input sample rate when it finds this 0 value as the selected sample rate.  We do this because the input
+               //      sample rate depends on the track, which means it depends on the title, so cannot be nicely set up here.
+               masterSampleRateArray = [[NSMutableArray alloc] init];  //      knowingly leaked
+               [masterSampleRateArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                  NSLocalizedString(@"Auto", @"Auto"), keyAudioSampleRateName,
+                                                                                  [NSNumber numberWithInt: 0], keyAudioSamplerate,
+                                                                                  nil]];
+               for (i = 0; i < hb_audio_rates_count; i++) {
+                       [masterSampleRateArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                          [NSString stringWithUTF8String: hb_audio_rates[i].string], keyAudioSampleRateName,
+                                                                                          [NSNumber numberWithInt: hb_audio_rates[i].rate], keyAudioSamplerate,
+                                                                                          nil]];
+               }
+               
+               masterBitRateArray = [[NSMutableArray alloc] init];     // knowingly leaked
+               for (i = 0; i < hb_audio_bitrates_count; i++) {
+                       dict = [NSDictionary dictionaryWithObjectsAndKeys:
+                                       [NSString stringWithUTF8String: hb_audio_bitrates[i].string], keyAudioBitrateName,
+                                       [NSNumber numberWithInt: hb_audio_bitrates[i].rate], keyAudioBitrate,
+                                       nil];
+                       [masterBitRateArray addObject: dict];
+               }
+               
+               [pool release];
+       }
+       return;
+}
+
+//     Ensure the list of codecs is accurate
+//     Update the current value of codec based on the revised list
+- (void) updateCodecs
+
+{
+       NSMutableArray *permittedCodecs = [NSMutableArray array];
+       unsigned int count = [masterCodecArray count];
+       NSDictionary *dict;
+       NSString *keyThatAllows = nil;
+
+       //      Determine which key we use to see which codecs are permitted
+       switch ([videoContainerTag intValue]) {
+               case HB_MUX_MP4:
+                       keyThatAllows = keyAudioMP4;
+                       break;
+               case HB_MUX_MKV:
+                       keyThatAllows = keyAudioMKV;
+                       break;
+               default:
+                       keyThatAllows = @"error condition";
+                       break;
+       }
+
+       //      First get a list of the permitted codecs based on the internal rules
+       if (nil != track && YES == [self enabled]) {
+               BOOL goodToAdd;
+
+               for (unsigned int i = 0; i < count; i++) {
+                       dict = [masterCodecArray objectAtIndex: i];
+                       
+                       //      First make sure only codecs permitted by the container are here
+                       goodToAdd = [[dict objectForKey: keyThatAllows] boolValue];
+                       
+                       //      Now we make sure if DTS or AC3 is not available in the track it is not put in the codec list, but in a general way
+                       if (YES == [[dict objectForKey: keyAudioMustMatchTrack] boolValue]) {
+                               if ([[dict objectForKey: keyAudioMustMatchTrack] intValue] != [[[self track] objectForKey: keyAudioInputCodec] intValue]) {
+                                       goodToAdd = NO;
+                               }
+                       }
+                       
+                       if (YES == goodToAdd) {
+                               [permittedCodecs addObject: dict];
+                       }
+               }
+       }
+       
+       //      Now make sure the permitted list and the actual ones matches
+       [self setCodecs: permittedCodecs];
+
+       //      Ensure our codec is on the list of permitted codecs
+       if (nil == [self codec] || NO == [permittedCodecs containsObject: [self codec]]) {
+               if (0 < [permittedCodecs count]) {
+                       [self setCodec: [permittedCodecs objectAtIndex: 0]];    //      This should be defaulting to Core Audio
+               }
+               else {
+                       [self setCodec: nil];
+               }
+       }
+
+       return;
+}
+
+- (void) updateMixdowns: (BOOL) shouldSetDefault
+
+{
+       NSMutableArray *permittedMixdowns = [NSMutableArray array];
+       NSDictionary *dict;
+       BOOL shouldAdd;
+       int currentMixdown;
+
+       unsigned int count = [masterMixdownArray count];
+       int codecCodec = [[codec objectForKey: keyAudioCodec] intValue];
+       int channelLayout = [[track objectForKey: keyAudioInputChannelLayout] intValue];
+       int theDefaultMixdown = hb_get_default_mixdown(codecCodec, channelLayout);
+       int theBestMixdown = hb_get_best_mixdown(codecCodec, channelLayout, 0);
+
+       for (unsigned int i = 0; i < count; i++) {
+               dict = [masterMixdownArray objectAtIndex: i];
+               currentMixdown = [[dict objectForKey: keyAudioMixdown] intValue];
+
+               //      Basically with the way the mixdowns are stored, the assumption from the libhb point of view
+               //      currently is that all mixdowns from the best down to mono are supported.
+               if (currentMixdown <= theBestMixdown) {
+                       shouldAdd = YES;
+               } else if (0 == theBestMixdown && codecCodec == currentMixdown) {
+                       // 0 means passthrough, add the current mixdown if it matches the passthrough codec
+                       shouldAdd = YES;
+               } else {
+                       shouldAdd = NO;
+               }
+
+               if (YES == shouldAdd) {
+                       [permittedMixdowns addObject: dict];
+               }
+       }
+
+       if (0 == theDefaultMixdown) {
+               // a mixdown of 0 means passthrough
+               theDefaultMixdown = codecCodec;
+       }
+
+       if (NO == [self enabled]) {
+               permittedMixdowns = nil;
+       }
+
+       //      Now make sure the permitted list and the actual ones matches
+       [self setMixdowns: permittedMixdowns];
+
+       //      Select the proper one
+       if (YES == shouldSetDefault) {
+               [self setMixdown: [permittedMixdowns dictionaryWithObject: [NSNumber numberWithInt: theDefaultMixdown] matchingKey: keyAudioMixdown]];
+       }
+
+       if (nil == [self mixdown] || NO == [permittedMixdowns containsObject: [self mixdown]]) {
+               [self setMixdown: [permittedMixdowns lastObject]];
+       }
+
+       return;
+}
+
+- (void) updateBitRates: (BOOL) shouldSetDefault
+
+{
+       NSMutableArray *permittedBitRates = [NSMutableArray array];
+       NSDictionary *dict;
+       int minBitRate;
+       int maxBitRate;
+       int currentBitRate;
+       BOOL shouldAdd;
+       
+       unsigned int count = [masterBitRateArray count];
+       int trackInputBitRate = [[[self track] objectForKey: keyAudioInputBitrate] intValue];
+       BOOL limitsToTrackInputBitRate = ([[codec objectForKey: keyAudioCodec] intValue] & HB_ACODEC_PASS_FLAG) ? YES : NO;
+       int theSampleRate = [[[self sampleRate] objectForKey: keyAudioSamplerate] intValue];
+               
+       if (0 == theSampleRate) {       //      this means Auto
+               theSampleRate = [[[self track] objectForKey: keyAudioInputSampleRate] intValue];
+               }
+
+       int ourCodec = [[codec objectForKey: keyAudioCodec] intValue];
+       int ourMixdown = [[[self mixdown] objectForKey: keyAudioMixdown] intValue];
+       hb_get_audio_bitrate_limits(ourCodec, theSampleRate, ourMixdown, &minBitRate, &maxBitRate);
+       int theDefaultBitRate = hb_get_default_audio_bitrate(ourCodec, theSampleRate, ourMixdown);
+
+       for (unsigned int i = 0; i < count; i++) {
+               dict = [masterBitRateArray objectAtIndex: i];
+               currentBitRate = [[dict objectForKey: keyAudioBitrate] intValue];
+               
+               //      First ensure the bitrate falls within range of the codec
+               shouldAdd = (currentBitRate >= minBitRate && currentBitRate <= maxBitRate);
+               
+               //      Now make sure the mixdown is not limiting us to the track input bitrate
+               if (YES == shouldAdd && YES == limitsToTrackInputBitRate) {
+                       if (currentBitRate != trackInputBitRate) {
+                               shouldAdd = NO;
+                       }
+               }
+                               
+               if (YES == shouldAdd) {
+                       [permittedBitRates addObject: dict];
+               }
+       }
+       
+       //      There is a situation where we have a mixdown requirement to match the track input bit rate,
+       //      but it does not fall into the range the codec supports.  Therefore, we force it here.
+       if (YES == limitsToTrackInputBitRate && 0 == [permittedBitRates count]) {
+               NSDictionary *missingBitRate = [masterBitRateArray dictionaryWithObject: [NSNumber numberWithInt: trackInputBitRate] matchingKey: keyAudioBitrate];
+               if (nil == missingBitRate) {
+                       //      We are in an even worse situation where the requested bit rate does not even exist in the underlying
+                       //      library of supported bitrates.  Of course since this value is ignored we can freely make a bogus one
+                       //      for the UI just to make the user a little more aware.
+                       missingBitRate = [NSDictionary dictionaryWithObjectsAndKeys:
+                                                         [NSString stringWithFormat: @"%d", trackInputBitRate], keyAudioBitrateName,
+                                                         [NSNumber numberWithInt: trackInputBitRate], keyAudioBitrate,
+                                                         nil];
+                       }
+               [permittedBitRates addObject: missingBitRate];
+       }
+
+       if (NO == [self enabled]) {
+               permittedBitRates = nil;
+       }
+
+       //      Make sure we are updated with the permitted list
+       [self setBitRates: permittedBitRates];
+
+       //      Select the proper one
+       if (YES == shouldSetDefault) {
+               [self setBitRateFromName: [NSString stringWithFormat:@"%d", theDefaultBitRate]];
+               }
+
+       if (nil == [self bitRate] || NO == [permittedBitRates containsObject: [self bitRate]]) {
+               [self setBitRate: [permittedBitRates lastObject]];
+       }
+       
+       return;
+}
+
+- (id) init
+
+{
+       if (self = [super init]) {
+               [self addObserver: self forKeyPath: @"videoContainerTag" options: 0 context: NULL];
+               [self addObserver: self forKeyPath: @"track" options: NSKeyValueObservingOptionOld context: NULL];
+               [self addObserver: self forKeyPath: @"codec" options: 0 context: NULL];
+               [self addObserver: self forKeyPath: @"mixdown" options: 0 context: NULL];
+               [self addObserver: self forKeyPath: @"sampleRate" options: 0 context: NULL];
+               }
+       return self;
+}
+
+#pragma mark -
+#pragma mark Accessors
+
+@synthesize track;
+@synthesize codec;
+@synthesize mixdown;
+@synthesize sampleRate;
+@synthesize bitRate;
+@synthesize drc;
+@synthesize videoContainerTag;
+@synthesize controller;
+
+@synthesize codecs;
+@synthesize mixdowns;
+@synthesize bitRates;
+
+- (NSArray *) tracks   {       return [controller masterTrackArray];   }
+
+- (NSArray *) sampleRates      {       return masterSampleRateArray;   }
+
+- (void) dealloc
+
+{
+       [self removeObserver: self forKeyPath: @"videoContainerTag"];
+       [self removeObserver: self forKeyPath: @"track"];
+       [self removeObserver: self forKeyPath: @"codec"];
+       [self removeObserver: self forKeyPath: @"mixdown"];
+       [self removeObserver: self forKeyPath: @"sampleRate"];
+       [self setTrack: nil];
+       [self setCodec: nil];
+       [self setMixdown: nil];
+       [self setSampleRate: nil];
+       [self setBitRate: nil];
+       [self setDrc: nil];
+       [self setVideoContainerTag: nil];
+       [self setCodecs: nil];
+       [self setMixdowns: nil];
+       [self setBitRates: nil];
+       [super dealloc];
+       return;
+}
+
+#pragma mark -
+#pragma mark KVO
+
+- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary *) change context: (void *) context
+
+{
+       if (YES == [keyPath isEqualToString: @"videoContainerTag"]) {
+               [self updateCodecs];
+               }
+       else if (YES == [keyPath isEqualToString: @"track"]) {
+               if (nil != [self track]) {
+                       [self updateCodecs];
+                       [self updateMixdowns: YES];
+                       if (YES == [self enabled]) {
+                               [self setSampleRate: [[self sampleRates] objectAtIndex: 0]];    // default to Auto
+                               }
+                       if (YES == [[controller noneTrack] isEqual: [change objectForKey: NSKeyValueChangeOldKey]]) {
+                               [controller switchingTrackFromNone: self];
+                               }
+                       if (YES == [[controller noneTrack] isEqual: [self track]]) {
+                               [controller settingTrackToNone: self];
+                               }
+                       }
+               }
+       else if (YES == [keyPath isEqualToString: @"codec"]) {
+               [self updateMixdowns: YES];
+               [self updateBitRates: YES];
+               }
+       else if (YES == [keyPath isEqualToString: @"mixdown"]) {
+               [self updateBitRates: YES];
+               [[NSNotificationCenter defaultCenter] postNotificationName: HBMixdownChangedNotification object: self];
+               }
+       else if (YES == [keyPath isEqualToString: @"sampleRate"]) {
+               [self updateBitRates: NO];
+               }
+       return;
+}
+
+#pragma mark -
+#pragma mark Special Setters
+
+- (void) setTrackFromIndex: (int) aValue
+
+{
+       [self setTrack: [[self tracks] dictionaryWithObject: [NSNumber numberWithInt: aValue] matchingKey: keyAudioTrackIndex]];
+       return;
+}
+
+//     This returns whether it is able to set the actual codec desired.
+- (BOOL) setCodecFromName: (NSString *) aValue
+
+{
+       NSDictionary *dict = [[self codecs] dictionaryWithObject: aValue matchingKey: keyAudioCodecName];
+       
+       if (nil != dict) {
+               [self setCodec: dict];
+       }
+       return (nil != dict);
+}
+
+- (void) setMixdownFromName: (NSString *) aValue
+
+{
+       NSDictionary *dict = [[self mixdowns] dictionaryWithObject: aValue matchingKey: keyAudioMixdownName];
+
+       if (nil != dict) {
+               [self setMixdown: dict];
+       }
+       return;
+}
+
+- (void) setSampleRateFromName: (NSString *) aValue
+
+{
+       NSDictionary *dict = [[self sampleRates] dictionaryWithObject: aValue matchingKey: keyAudioSampleRateName];
+       
+       if (nil != dict) {
+               [self setSampleRate: dict];
+       }
+       return;
+}
+
+- (void) setBitRateFromName: (NSString *) aValue
+
+{
+       NSDictionary *dict = [[self bitRates] dictionaryWithObject: aValue matchingKey: keyAudioBitrateName];
+       
+       if (nil != dict) {
+               [self setBitRate: dict];
+       }
+       return;
+}
+
+
+#pragma mark -
+#pragma mark Validation
+
+//     Because we have indicated that the binding for the drc validates immediately we can implement the
+//     key value binding method to ensure the drc stays in our accepted range.
+- (BOOL) validateDrc: (id *) ioValue error: (NSError *) outError
+
+{
+       BOOL retval = YES;
+       
+       if (nil != *ioValue) {
+               if (0.0 < [*ioValue floatValue] && 1.0 > [*ioValue floatValue]) {
+                       *ioValue = [NSNumber numberWithFloat: 1.0];
+               }
+       }
+       
+       return retval;
+}
+
+#pragma mark -
+#pragma mark Bindings Support
+
+- (BOOL) enabled
+
+{
+       return (nil != track) ? (NO == [track isEqual: [controller noneTrack]]) : NO;
+}
+
+- (BOOL) mixdownEnabled
+
+{
+       BOOL retval = [self enabled];
+
+       if (YES == retval) {
+               int myMixdown = [[[self mixdown] objectForKey: keyAudioMixdown] intValue];
+               if (HB_ACODEC_AC3_PASS == myMixdown || HB_ACODEC_DCA_PASS == myMixdown) {
+                       retval = NO;
+               }
+       }
+       return retval;
+}
+
+- (BOOL) AC3Enabled
+
+{
+       BOOL retval = [self enabled];
+       
+       if (YES == retval) {
+               int myTrackCodec = [[[self track] objectForKey: keyAudioInputCodec] intValue];
+               int myCodecCodec = [[[self codec] objectForKey: keyAudioCodec] intValue];
+               if (HB_ACODEC_AC3 != myTrackCodec || HB_ACODEC_AC3_PASS == myCodecCodec) {
+                       retval = NO;
+               }
+       }
+       return retval;
+}
+
++ (NSSet *) keyPathsForValuesAffectingValueForKey: (NSString *) key
+
+{
+       NSSet *retval = nil;
+
+       if (YES == [key isEqualToString: @"enabled"]) {
+               retval = [NSSet setWithObjects: @"track", nil];
+               }
+       else if (YES == [key isEqualToString: @"AC3Enabled"]) {
+               retval = [NSSet setWithObjects: @"track", @"codec", nil];
+       }
+       else if (YES == [key isEqualToString: @"mixdownEnabled"]) {
+               retval = [NSSet setWithObjects: @"track", @"mixdown", nil];
+               }
+       return retval;
+}
+
+@end
diff --git a/macosx/HBAudioController.h b/macosx/HBAudioController.h
new file mode 100644 (file)
index 0000000..cfff30c
--- /dev/null
@@ -0,0 +1,56 @@
+//
+//  HBAudioController.h
+//  HandBrake
+//
+//  Created on 2010-08-24.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "hb.h"
+
+extern NSString *keyAudioTrackIndex;
+extern NSString *keyAudioTrackName;
+extern NSString *keyAudioInputBitrate;
+extern NSString *keyAudioInputSampleRate;
+extern NSString *keyAudioInputCodec;
+extern NSString *keyAudioInputChannelLayout;
+extern NSString *HBMixdownChangedNotification;
+
+@class HBAudio;
+
+@interface HBAudioController : NSObject
+
+       {
+       id                                      myController;
+       NSMutableArray          *audioArray;            //      the configured audio information
+       NSMutableArray          *masterTrackArray;      //      the master list of audio tracks from the title
+       NSDictionary            *noneTrack;                     //      this represents no audio track selection
+       NSNumber                        *videoContainerTag;     //      initially is the default HB_MUX_MP4
+       }
+
+@property (nonatomic, readonly) NSArray *masterTrackArray;
+@property (nonatomic, readonly) NSDictionary *noneTrack;
+@property (nonatomic, retain) NSNumber *videoContainerTag;
+
+- (void) setHBController: (id) aController;
+- (void) prepareAudioForQueueFileJob: (NSMutableDictionary *) aDict;
+- (void) prepareAudioForJob: (hb_job_t *) aJob;
+- (void) prepareAudioForPreset: (NSMutableArray *) anArray;
+- (void) addTracksFromQueue: (NSMutableDictionary *) aQueue;
+- (void) addTracksFromPreset: (NSMutableDictionary *) aPreset;
+- (void) addAllTracksFromPreset: (NSMutableDictionary *) aPreset;
+- (BOOL) anyCodecMatches: (int) aCodecValue;
+- (void) addNewAudioTrack;
+- (void) settingTrackToNone: (HBAudio *) newNoneTrack;
+- (void) switchingTrackFromNone: (HBAudio *) noLongerNoneTrack;
+
+@end
+
+@interface HBAudioController (KVC)
+
+- (unsigned int) countOfAudioArray;
+- (HBAudio *) objectInAudioArrayAtIndex: (unsigned int) index;
+- (void) insertObject: (HBAudio *) audioObject inAudioArrayAtIndex: (unsigned int) index;
+- (void) removeObjectFromAudioArrayAtIndex: (unsigned int) index;
+
+@end
diff --git a/macosx/HBAudioController.m b/macosx/HBAudioController.m
new file mode 100644 (file)
index 0000000..55dfc99
--- /dev/null
@@ -0,0 +1,538 @@
+//
+//  HBAudioController.m
+//  HandBrake
+//
+//  Created on 2010-08-24.
+//
+
+#import "HBAudioController.h"
+#import "Controller.h"
+#import "HBAudio.h"
+#import "hb.h"
+
+NSString *keyAudioTrackIndex = @"keyAudioTrackIndex";
+NSString *keyAudioTrackName = @"keyAudioTrackName";
+NSString *keyAudioInputBitrate = @"keyAudioInputBitrate";
+NSString *keyAudioInputSampleRate = @"keyAudioInputSampleRate";
+NSString *keyAudioInputCodec = @"keyAudioInputCodec";
+NSString *keyAudioInputChannelLayout = @"keyAudioInputChannelLayout";
+NSString *HBMixdownChangedNotification = @"HBMixdownChangedNotification";
+
+@implementation HBAudioController
+
+#pragma mark -
+#pragma mark Accessors
+
+@synthesize masterTrackArray;
+@synthesize noneTrack;
+@synthesize videoContainerTag;
+
+- (id) init
+
+{
+       if (self = [super init]) {
+               [self setVideoContainerTag: [NSNumber numberWithInt: HB_MUX_MP4]];
+               audioArray = [[NSMutableArray alloc] init];
+       }
+       return self;
+}
+
+- (void) dealloc
+
+{
+       [[NSNotificationCenter defaultCenter] removeObserver: self];
+       [masterTrackArray release];
+       [noneTrack release];
+       [audioArray release];
+       [self setVideoContainerTag: nil];
+       [super dealloc];
+       return;
+}
+
+- (void) setHBController: (id) aController
+
+{
+       NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
+       myController = aController;
+
+       /* register that we are interested in changes made to the video container */
+       [center addObserver: self selector: @selector(containerChanged:) name: HBContainerChangedNotification object: aController];
+       [center addObserver: self selector: @selector(titleChanged:) name: HBTitleChangedNotification object: aController];
+       return;
+}
+
+- (void) _clearAudioArray
+
+{
+       while (0 < [self countOfAudioArray]) {
+               [self removeObjectFromAudioArrayAtIndex: 0];
+       }
+       return;
+}
+
+#pragma mark -
+#pragma mark HBController Support
+
+- (void) prepareAudioForQueueFileJob: (NSMutableDictionary *) aDict
+
+{
+       unsigned int audioArrayCount = [self countOfAudioArray];
+       for (unsigned int counter = 0; counter < audioArrayCount; counter++) {
+               HBAudio *anAudio = [self objectInAudioArrayAtIndex: counter];
+               if (YES == [anAudio enabled]) {
+                       NSString *prefix = [NSString stringWithFormat: @"Audio%d", counter + 1];
+                       NSNumber *sampleRateToUse = (0 == [[[anAudio sampleRate] objectForKey: keyAudioSamplerate] intValue]) ?
+                                                               [[anAudio track] objectForKey: keyAudioInputSampleRate] :
+                                                               [[anAudio sampleRate] objectForKey: keyAudioSamplerate];
+               
+                       [aDict setObject: [[anAudio track] objectForKey: keyAudioTrackIndex] forKey: [prefix stringByAppendingString: @"Track"]];
+                       [aDict setObject: [[anAudio track] objectForKey: keyAudioTrackName] forKey: [prefix stringByAppendingString: @"TrackDescription"]];
+                       [aDict setObject: [[anAudio codec] objectForKey: keyAudioCodecName] forKey: [prefix stringByAppendingString: @"Encoder"]];
+                       [aDict setObject: [[anAudio mixdown] objectForKey: keyAudioMixdownName] forKey: [prefix stringByAppendingString: @"Mixdown"]];
+                       [aDict setObject: [[anAudio sampleRate] objectForKey: keyAudioSampleRateName] forKey: [prefix stringByAppendingString: @"Samplerate"]];
+                       [aDict setObject: [[anAudio bitRate] objectForKey: keyAudioBitrateName] forKey: [prefix stringByAppendingString: @"Bitrate"]];
+                       [aDict setObject: [anAudio drc] forKey: [prefix stringByAppendingString: @"TrackDRCSlider"]];
+               
+                       prefix = [NSString stringWithFormat: @"JobAudio%d", counter + 1];
+                       [aDict setObject: [[anAudio codec] objectForKey: keyAudioCodec] forKey: [prefix stringByAppendingString: @"Encoder"]];
+                       [aDict setObject: [[anAudio mixdown] objectForKey: keyAudioMixdown] forKey: [prefix stringByAppendingString: @"Mixdown"]];
+                       [aDict setObject: sampleRateToUse forKey: [prefix stringByAppendingString: @"Samplerate"]];
+                       [aDict setObject: [[anAudio bitRate] objectForKey: keyAudioBitrate] forKey: [prefix stringByAppendingString: @"Bitrate"]];
+               }
+       }
+       return;
+}
+
+- (void) prepareAudioForJob: (hb_job_t *) aJob
+
+{
+       unsigned int i;
+       
+       //      First clear out any audio tracks in the job currently
+    int audiotrack_count = hb_list_count(aJob->list_audio);
+    for(i = 0; i < audiotrack_count; i++)
+    {
+        hb_audio_t *temp_audio = (hb_audio_t *) hb_list_item(aJob->list_audio, 0);
+        hb_list_rem(aJob->list_audio, temp_audio);
+    }
+
+       //      Now add audio tracks based on the current settings
+       unsigned int audioArrayCount = [self countOfAudioArray];
+       for (i = 0; i < audioArrayCount; i++) {
+               HBAudio *anAudio = [self objectInAudioArrayAtIndex: i];
+               if (YES == [anAudio enabled]) {
+                       NSNumber *sampleRateToUse = (0 == [[[anAudio sampleRate] objectForKey: keyAudioSamplerate] intValue]) ?
+                                                                               [[anAudio track] objectForKey: keyAudioInputSampleRate] :
+                                                                               [[anAudio sampleRate] objectForKey: keyAudioSamplerate];
+                       
+                       hb_audio_config_t *audio = (hb_audio_config_t *) calloc(1, sizeof(*audio));
+                       hb_audio_config_init(audio);
+                       audio->in.track = [[[anAudio track] objectForKey: keyAudioTrackIndex] intValue] - 1;
+                       /* We go ahead and assign values to our audio->out.<properties> */
+                       audio->out.track = audio->in.track;
+                       audio->out.codec = [[[anAudio codec] objectForKey: keyAudioCodec] intValue];
+                       audio->out.mixdown = [[[anAudio mixdown] objectForKey: keyAudioMixdown] intValue];
+                       audio->out.bitrate = [[[anAudio bitRate] objectForKey: keyAudioBitrate] intValue];
+                       audio->out.samplerate = [sampleRateToUse intValue];
+                       audio->out.dynamic_range_compression = [[anAudio drc] floatValue];
+        
+                       hb_audio_add(aJob, audio);
+                       free(audio);
+               }
+       }
+       return;
+}
+
+- (void) prepareAudioForPreset: (NSMutableArray *) anArray
+
+{
+       unsigned int audioArrayCount = [self countOfAudioArray];
+       unsigned int i;
+
+       for (i = 0; i < audioArrayCount; i++) {
+               HBAudio *anAudio = [self objectInAudioArrayAtIndex: i];
+               if (YES == [anAudio enabled]) {
+                       NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity: 7];
+                       [dict setObject: [[anAudio track] objectForKey: keyAudioTrackIndex] forKey: @"AudioTrack"];
+                       [dict setObject: [[anAudio track] objectForKey: keyAudioTrackName] forKey: @"AudioTrackDescription"];
+                       [dict setObject: [[anAudio codec] objectForKey: keyAudioCodecName] forKey: @"AudioEncoder"];
+                       [dict setObject: [[anAudio mixdown] objectForKey: keyAudioMixdownName] forKey: @"AudioMixdown"];
+                       [dict setObject: [[anAudio sampleRate] objectForKey: keyAudioSampleRateName] forKey: @"AudioSamplerate"];
+                       [dict setObject: [[anAudio bitRate] objectForKey: keyAudioBitrateName] forKey: @"AudioBitrate"];
+                       [dict setObject: [anAudio drc] forKey: @"AudioTrackDRCSlider"];
+                       [anArray addObject: dict];
+                       [dict release];
+               }
+       }
+       return;
+}
+
+- (void) addTracksFromQueue: (NSMutableDictionary *) aQueue
+
+{
+       NSString *base;
+       int value;
+       int maximumNumberOfAllowedAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+
+       //      Reinitialize the configured list of audio tracks
+       [self _clearAudioArray];
+       
+       //      The following is the pattern to follow, but with Audio%dTrack being the key to seek...
+       //      Can we assume that there will be no skip in the data?
+       for (unsigned int i = 1; i <= maximumNumberOfAllowedAudioTracks; i++) {
+               base = [NSString stringWithFormat: @"Audio%d", i];
+               value = [[aQueue objectForKey: [base stringByAppendingString: @"Track"]] intValue];
+               if (0 < value) {
+                       HBAudio *newAudio = [[HBAudio alloc] init];
+                       [newAudio setController: self];
+                       [self insertObject: newAudio inAudioArrayAtIndex: [self countOfAudioArray]];
+                       [newAudio setVideoContainerTag: [self videoContainerTag]];
+                       [newAudio setTrackFromIndex: value];
+                       [newAudio setCodecFromName: [aQueue objectForKey: [base stringByAppendingString: @"Encoder"]]];
+                       [newAudio setMixdownFromName: [aQueue objectForKey: [base stringByAppendingString: @"Mixdown"]]];
+                       [newAudio setSampleRateFromName: [aQueue objectForKey: [base stringByAppendingString: @"Samplerate"]]];
+                       [newAudio setBitRateFromName: [aQueue objectForKey: [base stringByAppendingString: @"Bitrate"]]];
+                       [newAudio setDrc: [aQueue objectForKey: [base stringByAppendingString: @"TrackDRCSlider"]]];
+                       [newAudio release];
+               }
+       }
+
+       [self switchingTrackFromNone: nil];     // see if we need to add one to the list
+       
+       return;
+}
+
+//     This routine takes the preset and will return the value for the key AudioList
+//     if it exists, otherwise it creates an array from the data in the present.
+- (NSArray *) _presetAudioArrayFromPreset: (NSMutableDictionary *) aPreset
+
+{
+       NSArray *retval = [aPreset objectForKey: @"AudioList"];
+
+       if (nil == retval) {
+               int maximumNumberOfAllowedAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+               NSString *base;
+               NSMutableArray *whatToUse = [NSMutableArray array];
+               for (unsigned int i = 1; i <= maximumNumberOfAllowedAudioTracks; i++) {
+                       base = [NSString stringWithFormat: @"Audio%d", i];
+                       if (nil != [aPreset objectForKey: [base stringByAppendingString: @"Track"]]) {
+                               [whatToUse addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                          [aPreset objectForKey: [base stringByAppendingString: @"Encoder"]], @"AudioEncoder",
+                                                                          [aPreset objectForKey: [base stringByAppendingString: @"Mixdown"]], @"AudioMixdown",
+                                                                          [aPreset objectForKey: [base stringByAppendingString: @"Samplerate"]], @"AudioSamplerate",
+                                                                          [aPreset objectForKey: [base stringByAppendingString: @"Bitrate"]], @"AudioBitrate",
+                                                                          [aPreset objectForKey: [base stringByAppendingString: @"TrackDRCSlider"]], @"AudioTrackDRCSlider",
+                                                                          nil]];
+                       }
+               }
+               retval = whatToUse;
+       }
+       return retval;
+}
+
+//     This uses the templateAudioArray from the preset to create the audios for the specified trackIndex
+- (void) _processPresetAudioArray: (NSArray *) templateAudioArray forTrack: (unsigned int) trackIndex andType: (int) aType
+
+{
+       NSEnumerator *enumerator = [templateAudioArray objectEnumerator];
+       NSDictionary *dict;
+       NSString *key;
+       int maximumNumberOfAllowedAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+       
+       while (nil != (dict = [enumerator nextObject])) {
+               if ([self countOfAudioArray] < maximumNumberOfAllowedAudioTracks) {
+                       BOOL fallenBack = NO;
+                       HBAudio *newAudio = [[HBAudio alloc] init];
+                       [newAudio setController: self];
+                       [self insertObject: newAudio inAudioArrayAtIndex: [self countOfAudioArray]];
+                       [newAudio setVideoContainerTag: [self videoContainerTag]];
+                       [newAudio setTrackFromIndex: trackIndex];
+                       key = [dict objectForKey: @"AudioEncoder"];
+                       if (0 == aType &&
+                               YES == [[NSUserDefaults standardUserDefaults] boolForKey: @"UseCoreAudio"] &&
+                               YES == [key isEqualToString: @"AAC (faac)"]
+                               ) {
+                               key = @"AAC (CoreAudio)";
+                       }
+                       if (YES == [[NSUserDefaults standardUserDefaults] boolForKey: @"AC3PassthruDefaultsToAC3"] &&
+                               YES == [key isEqualToString: @"AC3 Passthru"]) {
+                               if (NO == [newAudio setCodecFromName: key]) {
+                                       key = @"AC3";
+                                       fallenBack = YES;
+                               }
+                       }
+                       //      If our preset wants us to support a codec that the track does not support, instead
+                       //      of changing the codec we remove the audio instead.
+                       if (YES == [newAudio setCodecFromName: key]) {
+                               [newAudio setMixdownFromName: [dict objectForKey: @"AudioMixdown"]];
+                               [newAudio setSampleRateFromName: [dict objectForKey: @"AudioSamplerate"]];
+                               if (NO == fallenBack) {
+                                       [newAudio setBitRateFromName: [dict objectForKey: @"AudioBitrate"]];
+                                       }
+                               [newAudio setDrc: [dict objectForKey: @"AudioTrackDRCSlider"]];
+                       }
+                       else {
+                               [self removeObjectFromAudioArrayAtIndex: [self countOfAudioArray] - 1];
+                       }
+                       [newAudio release];
+               }
+       }
+       return;
+}
+
+//     This matches the FIRST track with the specified prefix, otherwise it uses the defaultIfNotFound value
+- (unsigned int) _trackWithTitlePrefix: (NSString *) prefix defaultIfNotFound: (unsigned int) defaultIfNotFound
+
+{
+       unsigned int retval = defaultIfNotFound;
+       int count = [masterTrackArray count];
+       NSString *languageTitle;
+       BOOL found = NO;
+       
+       //      We search for the prefix noting that our titles have the format %d: %s where the %s is the prefix
+       for (unsigned int i = 1; i < count && NO == found; i++) {       //      Note that we skip the "None" track
+               languageTitle = [[masterTrackArray objectAtIndex: i] objectForKey: keyAudioTrackName];
+               if (YES == [[languageTitle substringFromIndex: [languageTitle rangeOfString: @" "].location + 1] hasPrefix: prefix]) {
+                       retval = i;
+                       found = YES;
+               }
+       }
+       return retval;
+}
+
+//     When we add a track and we do not have a preset to use for the track we use
+//     this bogus preset to do the dirty work.
+- (NSMutableDictionary *) _defaultPreset
+
+{
+       static NSMutableDictionary *retval = nil;
+       
+       if (nil == retval) {
+               retval = [[NSMutableDictionary dictionaryWithObjectsAndKeys:
+               [NSArray arrayWithObject:
+               [NSDictionary dictionaryWithObjectsAndKeys:
+               [NSNumber numberWithInt: 1],     @"AudioTrack",
+               @"AAC (faac)",                   @"AudioEncoder",
+               @"Dolby Pro Logic II",           @"AudioMixdown",
+               @"Auto",                         @"AudioSamplerate",
+               @"160",                          @"AudioBitrate",
+               [NSNumber numberWithFloat: 0.0], @"AudioTrackDRCSlider",
+               nil]], @"AudioList", nil] retain];
+       }
+       return retval;
+}
+
+- (void) addTracksFromPreset: (NSMutableDictionary *) aPreset allTracks: (BOOL) allTracks
+
+{
+       id whatToUse = [self _presetAudioArrayFromPreset: aPreset];
+       NSString *preferredLanguageName = [[NSUserDefaults standardUserDefaults] stringForKey: @"DefaultLanguage"];
+       int preferredLanguage = [self _trackWithTitlePrefix: preferredLanguageName defaultIfNotFound: 1];
+
+       //      Reinitialize the configured list of audio tracks
+       [self _clearAudioArray];
+       
+       [self _processPresetAudioArray: whatToUse forTrack: preferredLanguage andType: [[aPreset objectForKey: @"Type"] intValue]];
+       if (YES == allTracks) {
+               unsigned int count = [masterTrackArray count];
+               for (unsigned int i = 1; i < count; i++) {
+                       if (i != preferredLanguage) {
+                               [self _processPresetAudioArray: whatToUse forTrack: i andType: [[aPreset objectForKey: @"Type"] intValue]];
+                       }
+               }
+       }
+
+       return;
+}
+
+- (void) _ensureAtLeastOneNonEmptyTrackExists
+
+{
+       int count = [self countOfAudioArray];
+       if (0 == count || NO == [[self objectInAudioArrayAtIndex: 0] enabled]) {
+               [self addTracksFromPreset: [self _defaultPreset] allTracks: NO];
+               }
+       [self switchingTrackFromNone: nil];     //      this ensures there is a None track at the end of the list
+       return;
+}
+
+- (void) addTracksFromPreset: (NSMutableDictionary *) aPreset
+
+{
+       [self addTracksFromPreset: aPreset allTracks: NO];
+       [self _ensureAtLeastOneNonEmptyTrackExists];
+       return;
+}
+
+- (void) addAllTracksFromPreset: (NSMutableDictionary *) aPreset
+
+{
+       [self addTracksFromPreset: aPreset allTracks: YES];
+       [self _ensureAtLeastOneNonEmptyTrackExists];
+       return;
+}
+
+- (BOOL) anyCodecMatches: (int) aCodecValue
+
+{
+       BOOL retval = NO;
+       unsigned int audioArrayCount = [self countOfAudioArray];
+       for (unsigned int i = 0; i < audioArrayCount && NO == retval; i++) {
+               HBAudio *anAudio = [self objectInAudioArrayAtIndex: i];
+        if (YES == [anAudio enabled] && aCodecValue == [[[anAudio codec] objectForKey: keyAudioCodec] intValue]) {
+                       retval = YES;
+               }
+       }
+       return retval;
+}
+
+- (void) addNewAudioTrack
+
+{
+       HBAudio *newAudio = [[HBAudio alloc] init];
+       [newAudio setController: self];
+       [self insertObject: newAudio inAudioArrayAtIndex: [self countOfAudioArray]];
+       [newAudio setVideoContainerTag: [self videoContainerTag]];
+       [newAudio setTrack: noneTrack];
+       [newAudio setDrc: [NSNumber numberWithFloat: 0.0]];
+       [newAudio release];     
+       return;
+}
+
+#pragma mark -
+#pragma mark Notification Handling
+
+- (void) settingTrackToNone: (HBAudio *) newNoneTrack
+
+{
+       //      If this is not the last track in the array we need to remove it.  We then need to see if a new
+       //      one needs to be added (in the case when we were at maximum count and this switching makes it
+       //      so we are no longer at maximum.
+       unsigned int index = [audioArray indexOfObject: newNoneTrack];
+
+       if (NSNotFound != index && index < [self countOfAudioArray] - 1) {
+               [self removeObjectFromAudioArrayAtIndex: index];
+       }
+       [self switchingTrackFromNone: nil];     // see if we need to add one to the list
+       return;
+}
+
+- (void) switchingTrackFromNone: (HBAudio *) noLongerNoneTrack
+
+{
+       int count = [self countOfAudioArray];
+       BOOL needToAdd = NO;
+       int maximumNumberOfAllowedAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+
+       //      If there is no last track that is None and we are less than our maximum number of permitted tracks, we add one.
+       if (count < maximumNumberOfAllowedAudioTracks) {
+               if (0 < count) {
+                       HBAudio *lastAudio = [self objectInAudioArrayAtIndex: count - 1];
+                       if (YES == [lastAudio enabled]) {
+                               needToAdd = YES;
+                       }
+               }
+               else {
+                       needToAdd = YES;
+               }
+       }
+
+       if (YES == needToAdd) {
+               [self addNewAudioTrack];
+       }
+       return;
+}
+
+//     This gets called whenever the video container changes.
+- (void) containerChanged: (NSNotification *) aNotification
+
+{
+       NSDictionary *notDict = [aNotification userInfo];
+
+       [self setVideoContainerTag: [notDict objectForKey: keyContainerTag]];
+
+       //      Update each of the instances because this value influences possible settings.
+       NSEnumerator *enumerator = [audioArray objectEnumerator];
+       HBAudio *audioObject;
+
+       while (nil != (audioObject = [enumerator nextObject])) {
+               [audioObject setVideoContainerTag: [self videoContainerTag]];
+       }
+       return;
+}
+
+- (void) titleChanged: (NSNotification *) aNotification
+
+{
+       NSDictionary *notDict = [aNotification userInfo];
+       NSData *theData = [notDict objectForKey: keyTitleTag];
+       hb_title_t *title = NULL;
+
+       [theData getBytes: &title length: sizeof(title)];
+       if (title) {
+               hb_audio_config_t *audio;
+               hb_list_t *list = title->list_audio;
+               int i, count = hb_list_count(list);
+
+               //      Reinitialize the master list of available audio tracks from this title
+               [masterTrackArray release];
+               masterTrackArray = [[NSMutableArray alloc] init];
+               [noneTrack release];
+               noneTrack = [[NSDictionary dictionaryWithObjectsAndKeys:
+                                        [NSNumber numberWithInt: 0], keyAudioTrackIndex,
+                                        NSLocalizedString(@"None", @"None"), keyAudioTrackName,
+                                        [NSNumber numberWithInt: 0], keyAudioInputCodec,
+                                                        nil] retain];
+               [masterTrackArray addObject: noneTrack];
+               for (i = 0; i < count; i++) {
+                       audio = (hb_audio_config_t *) hb_list_audio_config_item(list, i);
+                       [masterTrackArray addObject: [NSDictionary dictionaryWithObjectsAndKeys:
+                                                                                 [NSNumber numberWithInt: i + 1], keyAudioTrackIndex,
+                                                                                 [NSString stringWithFormat: @"%d: %s", i, audio->lang.description], keyAudioTrackName,
+                                                                                 [NSNumber numberWithInt: audio->in.bitrate / 1000], keyAudioInputBitrate,
+                                                                                 [NSNumber numberWithInt: audio->in.samplerate], keyAudioInputSampleRate,
+                                                                                 [NSNumber numberWithInt: audio->in.codec], keyAudioInputCodec,
+                                                                                 [NSNumber numberWithInt: audio->in.channel_layout], keyAudioInputChannelLayout,
+                                                                                 nil]];
+               }
+       }
+
+       //      Reinitialize the configured list of audio tracks
+       [self _clearAudioArray];
+
+       if (NO == [myController hasValidPresetSelected]) {
+               [self _ensureAtLeastOneNonEmptyTrackExists];
+       }
+       return;
+}
+
+#pragma mark -
+#pragma mark KVC
+
+- (unsigned int) countOfAudioArray
+
+{
+       return [audioArray count];
+}
+
+- (HBAudio *) objectInAudioArrayAtIndex: (unsigned int) index
+
+{
+       return [audioArray objectAtIndex: index];
+}
+
+- (void) insertObject: (HBAudio *) audioObject inAudioArrayAtIndex: (unsigned int) index;
+
+{
+       [audioArray insertObject: audioObject atIndex: index];
+       return;
+}
+
+- (void) removeObjectFromAudioArrayAtIndex: (unsigned int) index
+
+{
+       [audioArray removeObjectAtIndex: index];
+       return;
+}
+
+@end
index 5ce02ad..2b9fcfe 100644 (file)
 // Original value used by cleaner
 //#define TextStorageUpperSizeLimit 20000
 // lets use this higher value for now for better gui debugging
-#define TextStorageUpperSizeLimit 40000
+#define TextStorageUpperSizeLimit 125000
 
 /// When old output is removed, this is the amount of characters that will be
 /// left in outputTextStorage.
 // Original value used by cleaner
 //#define TextStorageLowerSizeLimit 15000
 // lets use this higher value for now for better gui debugging
-#define TextStorageLowerSizeLimit 35000
+#define TextStorageLowerSizeLimit 120000
 
 @implementation HBOutputPanelController
 
index 29ae733..1b9a397 100644 (file)
@@ -182,7 +182,7 @@ int stderrwrite(void *inFD, const char *buffer, int size)
  */ 
 - (void)forwardOutput:(NSData *)data
 {
-       NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
+       NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        [listeners makeObjectsPerformSelector:forwardingSelector withObject:string];
        [string release];
 }
index 297fe57..ca1ad5a 100644 (file)
@@ -8,9 +8,13 @@
 @interface HBPreferencesController : NSWindowController
 {
     IBOutlet NSView         * fGeneralView, * fPictureView, * fAudioView, * fAdvancedView;
+    IBOutlet NSTextField    * fSendEncodeToAppField;
 }
 
 + (void)registerUserDefaults;
 - (id)init;
-
+/* Manage the send encode to xxx.app windows and field */
+- (IBAction) browseSendToApp: (id) sender;
+- (void) browseSendToAppDone: (NSOpenPanel *) sheet
+                  returnCode: (int) returnCode contextInfo: (void *) contextInfo;
 @end
index 943cf3b..f829183 100644 (file)
@@ -45,9 +45,9 @@
         @"YES",             @"CheckForUpdates",
         @"Open Source",     @"LaunchSourceBehavior",
         @"English",         @"DefaultLanguage",
-        @"YES",              @"UseCoreAudio",
-        @"NO",              @"DefaultMpegName",
-        @"YES",              @"UseDvdNav",
+        @"YES",             @"UseCoreAudio",
+        @"YES",              @"DefaultMpegName",
+        @"YES",             @"UseDvdNav",
         @"",                @"DefAdvancedx264Flags",
         @"YES",             @"DefaultPresetsDrawerShow",
         desktopDirectory,   @"LastDestinationDirectory",
         @"NO",              @"DefaultAutoNaming",
         @"NO",              @"DisableDvdAutoDetect",
         @"Alert Window",    @"AlertWhenDone",
+        @"YES",             @"AlertWhenDoneSound",
         @"1",               @"LoggingLevel",
         @"NO",              @"EncodeLogLocation",
+        @"10",              @"MinTitleScanSeconds",
         @"10",              @"PreviewsNumber",
         @"",                @"Drawer Size",
         @"0.25",            @"x264CqSliderFractional",
-        @"YES",              @"AlertBuiltInPresetUpdate",
+        @"YES",             @"AlertBuiltInPresetUpdate",
+        @"MetaX",           @"SendCompletedEncodeToApp",
+               @"YES",                         @"AC3PassthruDefaultsToAC3",
         nil]];
 }
 
                                         TOOLBAR_AUDIO, TOOLBAR_ADVANCED, nil];
 }
 
+/* Manage the send encode to xxx.app windows and field */
+/*Opens the app browse window*/
+- (IBAction) browseSendToApp: (id) sender
+{
+    NSOpenPanel * panel;
+       
+    panel = [NSOpenPanel openPanel];
+    [panel setAllowsMultipleSelection: NO];
+    [panel setCanChooseFiles: YES];
+    [panel setCanChooseDirectories: NO ];
+    NSString * sendToAppDirectory;
+       if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastSendToAppDirectory"])
+       {
+               sendToAppDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastSendToAppDirectory"];
+       }
+       else
+       {
+               sendToAppDirectory = @"/Applications";
+       }
+    [panel beginSheetForDirectory: sendToAppDirectory file: nil types: nil
+                   modalForWindow: [self window] modalDelegate: self
+                   didEndSelector: @selector( browseSendToAppDone:returnCode:contextInfo: )
+                      contextInfo: sender]; 
+}
+
+- (void) browseSendToAppDone: (NSOpenPanel *) sheet
+                  returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    if( returnCode == NSOKButton )
+    {
+        NSString *sendToAppPath = [[sheet filenames] objectAtIndex: 0];
+        NSString *sendToAppDirectory = [sendToAppPath stringByDeletingLastPathComponent];
+        [[NSUserDefaults standardUserDefaults] setObject:sendToAppDirectory forKey:@"LastSendToAppDirectory"];
+        [sheet orderOut: self];
+        NSString *sendToAppName;
+        sendToAppName = [[sendToAppPath lastPathComponent] stringByDeletingPathExtension];
+        /* we set the name of the app to send to in the display field */
+        [fSendEncodeToAppField setStringValue:sendToAppName];
+        [[NSUserDefaults standardUserDefaults] setObject:[fSendEncodeToAppField stringValue] forKey:@"SendCompletedEncodeToApp"];
+        
+    }
+}
+
+
 @end
 
 @implementation HBPreferencesController (Private)
index d8ea61a..b4e1507 100644 (file)
@@ -17,6 +17,7 @@
 - (NSDictionary *)createRegularPresetFolder;
 - (NSDictionary *)createLegacyPresetFolder;
 
+- (NSDictionary *)createiPadPreset;
 - (NSDictionary *)createAppleTVPreset;
 - (NSDictionary *)createAppleTVLegacyPreset;
 - (NSDictionary *)createAppleUniversalPreset;
index 9ccd15e..a574979 100644 (file)
     [childrenArray addObject:[self createAppleUniversalPreset]];
     [childrenArray addObject:[self createIpodLowPreset]];
     [childrenArray addObject:[self createiPhonePreset]];
+       [childrenArray addObject:[self createiPhone4Preset]];
+    [childrenArray addObject:[self createiPadPreset]];
     [childrenArray addObject:[self createAppleTVPreset]];
+       [childrenArray addObject:[self createAppleTv2Preset]];
 
     [preset setObject:[NSMutableArray arrayWithArray: childrenArray] forKey:@"ChildrenArray"];
     
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
 
     /* x264 Option String (We can use this to tweak the appleTV output)*/
-    [preset setObject:@"cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0" forKey:@"x264Option"];
+    [preset setObject:@"cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
 
     /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
 
     /* Get the New Preset Description from the field in the AddPresetPanel */
     [preset setObject:@"HandBrake's deprecated settings for the AppleTV, including Dolby Digital 5.1 AC3 sound. Provides a good balance between quality and file size, and optimizes performance. This is the AppleTV preset from HandBrake 0.9.2, and while it is offered as a service to legacy users, it is no longer supported." forKey:@"PresetDescription"];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
 
     /* x264 Option String (We can use this to tweak the appleTV output)*/
-    [preset setObject:@"ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0" forKey:@"x264Option"];
+    [preset setObject:@"ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
 
     /* Basic Picture Settings */
     /* Use Max Picture settings for whatever the dvd is.*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
 
     /* x264 Option String (We can use this to tweak the appleTV output)*/
-    [preset setObject:@"cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6" forKey:@"x264Option"];
+    [preset setObject:@"cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     return preset;
 }
 
+- (NSDictionary *)createiPadPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+
+    /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPad" forKey:@"PresetName"];
+
+    /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+    /*Set whether or not this is a folder, 1 is bool for folder*/
+    [preset setObject:[NSNumber numberWithBool: NO] forKey:@"Folder"];
+    /*Set whether or not this is default, at creation set to 0*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+
+    /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+
+    /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for the iPad (1st gen) is optimized for viewing on its 1024x768 display." forKey:@"PresetDescription"];
+
+    /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+
+    /* 64-bit MP4 file */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4LargeFile"];
+
+    /* Chapter Markers*/
+     [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+
+    /* Video encoder */
+    [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
+
+    /* x264 Option String (We can use this to tweak the output)*/
+    [preset setObject:@"" forKey:@"x264Option"];
+
+    /* Video quality */
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
+    [preset setObject:@"700" forKey:@"VideoTargetSize"];
+    [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+    [preset setObject:[NSNumber numberWithFloat:20.0] forKey:@"VideoQualitySlider"];
+
+    /* Video framerate */
+    [preset setObject:@"29.97 (NTSC Video)" forKey:@"VideoFramerate"];
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoFrameratePFR"];
+    
+    /* GrayScale */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+
+    /* 2 Pass Encoding */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+
+    /* Basic Picture Settings */
+    /* Use Max Picture settings for whatever the dvd is.*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:1024] forKey:@"PictureWidth"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"PicturePAR"];
+
+    /* Explicitly set the filters for built-in presets */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureFilters"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDenoise"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VFR"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeblock"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDetelecine"];
+
+    /* Set crop settings here */
+    /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];    
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+
+    /* Audio - Is done on a track by track basis, ONLY specifiy the tracks we want set as any track
+     * not listed will be set to "None" and not encoded */
+    NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
+    
+    /* Track 1 */        
+    NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
+    [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
+    [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
+    [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
+    [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
+    [audioTrack1Array autorelease];
+    [audioListArray addObject:audioTrack1Array];
+
+    [preset setObject:[NSMutableArray arrayWithArray: audioListArray] forKey:@"AudioList"];
+
+    /* Subtitles*/
+    [preset setObject:@"None" forKey:@"Subtitles"];
+
+    [preset autorelease];
+    return preset;
+}
+
+- (NSDictionary *)createiPhone4Preset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       
+    /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPhone 4" forKey:@"PresetName"];
+       
+    /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+    /*Set whether or not this is a folder, 1 is bool for folder*/
+    [preset setObject:[NSNumber numberWithBool: NO] forKey:@"Folder"];
+    /*Set whether or not this is default, at creation set to 0*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       
+    /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       
+    /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for the iPhone 4 is optimized for viewing on its 960x480 display." forKey:@"PresetDescription"];
+       
+    /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       
+    /* 64-bit MP4 file */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4LargeFile"];
+       
+    /* Chapter Markers*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+       
+    /* Video encoder */
+    [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
+       
+    /* x264 Option String (We can use this to tweak the output)*/
+    [preset setObject:@"" forKey:@"x264Option"];
+       
+    /* Video quality */
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
+    [preset setObject:@"700" forKey:@"VideoTargetSize"];
+    [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+    [preset setObject:[NSNumber numberWithFloat:20.0] forKey:@"VideoQualitySlider"];
+       
+    /* Video framerate */
+    [preset setObject:@"29.97 (NTSC Video)" forKey:@"VideoFramerate"];
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoFrameratePFR"];
+    
+    /* GrayScale */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       
+    /* 2 Pass Encoding */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+    /* Basic Picture Settings */
+    /* Use Max Picture settings for whatever the dvd is.*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:960] forKey:@"PictureWidth"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"PicturePAR"];
+       
+    /* Explicitly set the filters for built-in presets */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureFilters"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDenoise"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VFR"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeblock"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDetelecine"];
+       
+    /* Set crop settings here */
+    /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];    
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+    /* Audio - Is done on a track by track basis, ONLY specifiy the tracks we want set as any track
+     * not listed will be set to "None" and not encoded */
+    NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
+    
+    /* Track 1 */        
+    NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
+    [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
+    [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
+    [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
+    [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
+    [audioTrack1Array autorelease];
+    [audioListArray addObject:audioTrack1Array];
+       
+    [preset setObject:[NSMutableArray arrayWithArray: audioListArray] forKey:@"AudioList"];
+       
+    /* Subtitles*/
+    [preset setObject:@"None" forKey:@"Subtitles"];
+       
+    [preset autorelease];
+    return preset;
+}
+
+- (NSDictionary *)createAppleTv2Preset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       
+    /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"AppleTV 2" forKey:@"PresetName"];
+       
+    /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+    /*Set whether or not this is a folder, 1 is bool for folder*/
+    [preset setObject:[NSNumber numberWithBool: NO] forKey:@"Folder"];
+    /*Set whether or not this is default, at creation set to 0*/
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       
+    /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       
+    /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's preset for the Apple TV (2nd gen) is optimized for viewing on its 1280x720 display." forKey:@"PresetDescription"];
+       
+    /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       
+    /* 64-bit MP4 file */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4LargeFile"];
+       
+    /* Chapter Markers*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+       
+    /* Video encoder */
+    [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
+       
+    /* x264 Option String (We can use this to tweak the output)*/
+    [preset setObject:@"" forKey:@"x264Option"];
+       
+    /* Video quality */
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
+    [preset setObject:@"700" forKey:@"VideoTargetSize"];
+    [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+    [preset setObject:[NSNumber numberWithFloat:20.0] forKey:@"VideoQualitySlider"];
+       
+    /* Video framerate */
+    [preset setObject:@"29.97 (NTSC Video)" forKey:@"VideoFramerate"];
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoFrameratePFR"];
+    
+    /* GrayScale */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       
+    /* 2 Pass Encoding */
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+    /* Basic Picture Settings */
+    /* Use Max Picture settings for whatever the dvd is.*/
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:1280] forKey:@"PictureWidth"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"PicturePAR"];
+       
+    /* Explicitly set the filters for built-in presets */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureFilters"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDenoise"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"VFR"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeblock"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDetelecine"];
+       
+    /* Set crop settings here */
+    /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+    [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];    
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+    /* Audio - Is done on a track by track basis, ONLY specifiy the tracks we want set as any track
+     * not listed will be set to "None" and not encoded */
+    NSMutableArray *audioListArray = [[NSMutableArray alloc] init];
+    
+    /* Track 1 */        
+    NSMutableDictionary *audioTrack1Array = [[NSMutableDictionary alloc] init];
+    [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
+    [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
+    [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
+    [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
+    [audioTrack1Array autorelease];
+    [audioListArray addObject:audioTrack1Array];
+       
+    /* Track 2 */
+    NSMutableDictionary *audioTrack2Array = [[NSMutableDictionary alloc] init];
+    [audioTrack2Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
+    [audioTrack2Array setObject:@"AC3 Passthru" forKey:@"AudioEncoder"];
+    [audioTrack2Array setObject:@"AC3 Passthru" forKey:@"AudioMixdown"];
+    [audioTrack2Array setObject:@"Auto" forKey:@"AudioSamplerate"];
+    [audioTrack2Array setObject:@"160" forKey:@"AudioBitrate"];
+    /* Note: we ignore specified bitrate for AC3 Passthru in libhb and use
+     * the sources bitrate, however we need to initially set the value to something so
+     * the macgui doesnt barf, so 160 seems as good as anything */
+    [audioTrack2Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
+    [audioTrack2Array autorelease];
+    [audioListArray addObject:audioTrack2Array];
+       
+       
+    [preset setObject:[NSMutableArray arrayWithArray: audioListArray] forKey:@"AudioList"];
+       
+    /* Subtitles*/
+    [preset setObject:@"None" forKey:@"Subtitles"];
+       
+    [preset autorelease];
+    return preset;
+}
+
 - (NSDictionary *)createClassicPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
 
     /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
 
     /* Get the New Preset Description from the field in the AddPresetPanel */
     [preset setObject:@"HandBrake's traditional, faster, lower-quality settings." forKey:@"PresetDescription"];
 
     /*Picture Settings*/
     /* Use Max Picture settings for whatever the dvd is.*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
 
     /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
 
     /* Get the New Preset Description from the field in the AddPresetPanel */
     [preset setObject:@"HandBrake's general-purpose preset for High Profile H.264 video, with all the bells and whistles." forKey:@"PresetDescription"];
 
     /*Picture Settings*/
     /* Use Max Picture settings for whatever the dvd is.*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"Mp4iPodCompatible"];
     /* x264 Option String */
-    [preset setObject:@"cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
+    [preset setObject:@"cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
 
     /*Picture Settings*/
     /* Use a width of 480 for the iPhone*/
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"128" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4iPodCompatible"];
     /* x264 Option String */
-    [preset setObject:@"level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
+    [preset setObject:@"level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
 
     /*Picture Settings*/
     /* Use a width of 480 for the iPhone*/
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"128" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4iPodCompatible"];
     /* x264 Option String */
-    [preset setObject:@"level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
+    [preset setObject:@"level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
 
     /*Picture Settings*/
     /* Use a width of 640 for iPod TV-out */
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:@"H.264 (x264)" forKey:@"VideoEncoder"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"Mp4iPodCompatible"];
     /* x264 Option String */
-    [preset setObject:@"level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
+    [preset setObject:@"level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0" forKey:@"x264Option"];
 
     /* Video quality */
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
 
     /*Picture Settings*/
     /* Use a width of 320 for the iPod screen */
-    [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
     [preset setObject:[NSNumber numberWithInt:320] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"Default"];
 
     /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+    [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
 
     /* Get the New Preset Description from the field in the AddPresetPanel */
     [preset setObject:@"HandBrake's normal, default settings." forKey:@"PresetDescription"];
 
     /*Picture Settings*/
     /* Use Max Picture settings for whatever the dvd is.*/
-    [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
     [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
     [audioTrack1Array setObject:[NSNumber numberWithInt:1] forKey:@"AudioTrack"];
     [audioTrack1Array setObject:@"AAC (faac)" forKey:@"AudioEncoder"];
     [audioTrack1Array setObject:@"Dolby Pro Logic II"  forKey:@"AudioMixdown"];
-    [audioTrack1Array setObject:@"48" forKey:@"AudioSamplerate"];
+    [audioTrack1Array setObject:@"Auto" forKey:@"AudioSamplerate"];
     [audioTrack1Array setObject:@"160" forKey:@"AudioBitrate"];
     [audioTrack1Array setObject:[NSNumber numberWithFloat:0.0] forKey:@"AudioTrackDRCSlider"];
     [audioTrack1Array autorelease];
index df5cf2b..1394a97 100644 (file)
@@ -30,6 +30,7 @@
     IBOutlet NSBox           * fPictureViewArea;
     IBOutlet NSBox           * fPictureControlBox;
     IBOutlet NSBox           * fEncodingControlBox;
+    IBOutlet NSBox           * fMoviePlaybackControlBox;
 
     IBOutlet NSSlider        * fPictureSlider;
     IBOutlet NSTextField     * fInfoField;
     int                               hudTimerSeconds;
     
     /* Full Screen Mode Toggle */
-    IBOutlet NSButton               * fFullScreenToggleButton;
     IBOutlet NSButton               * fScaleToScreenToggleButton;
     IBOutlet NSButton               * fPictureSettingsToggleButton;
-    BOOL                              isFullScreen;
     BOOL                              scaleToScreen;
+    
     /* Movie Previews */
+    QTMovie                         * aMovie;
+    IBOutlet QTMovieView            * fMovieView;
+    /* Playback Panel Controls */
+    IBOutlet NSButton               * fPlayPauseButton;
+    IBOutlet NSButton               * fGoToBeginningButton;
+    IBOutlet NSButton               * fGoToEndButton;
+    IBOutlet NSButton               * fGoForwardOneFrameButton;
+    IBOutlet NSButton               * fGoBackwardOneFrameButton;
+    IBOutlet NSSlider               * fMovieScrubberSlider;
+    IBOutlet NSButton               * fGoToStillPreviewButton;
+    IBOutlet NSTextField            * fMovieInfoField;
+    NSTimer                         * fMovieTimer;
+    
+    
     IBOutlet NSButton               * fCreatePreviewMovieButton;
     IBOutlet NSButton               * fCancelPreviewMovieButton;
     IBOutlet NSButton               * fShowPreviewMovieButton;
@@ -63,7 +77,6 @@
     hb_handle_t                     * fPreviewLibhb;           // private libhb for creating previews
     NSTimer                         * fLibhbTimer;             // timer for retrieving state from libhb
     IBOutlet NSTextField            * fPreviewMovieStatusField; 
-    IBOutlet QTMovieView            * fMovieView;
     IBOutlet NSPopUpButton          * fPreviewMovieLengthPopUp; // popup of choices for length of preview in seconds
 }
 - (id)init;
 - (IBAction)showPictureSettings:(id)sender;
 - (NSString*) pictureSizeInfoString;
 
-/* Full Screen */
-- (IBAction)toggleScreenMode:(id)sender;
 - (IBAction)toggleScaleToScreen:(id)sender;
-- (BOOL)fullScreen;
-- (IBAction)goFullScreen:(id)sender;
 - (IBAction)goWindowedScreen:(id)sender;
 
 /* HUD overlay */
+- (void) enableHudControls;
+- (void) disableHudControls;
+
 - (void) startHudTimer;
 - (void) stopHudTimer;
 
 - (void) startReceivingLibhbNotifications;
 - (void) stopReceivingLibhbNotifications;
 
+- (void) installMovieCallbacks;
+- (void)removeMovieCallbacks;
+
+- (IBAction) cancelCreateMoviePreview: (id) sender;
 - (IBAction) createMoviePreview: (id) sender;
 - (void) libhbStateChanged: (hb_state_t ) state;
 - (IBAction) showMoviePreview: (NSString *) path;
+- (IBAction) toggleMoviePreviewPlayPause: (id) sender;
+- (IBAction) moviePlaybackGoToBeginning: (id) sender;
+- (IBAction) moviePlaybackGoToEnd: (id) sender;
+- (IBAction) moviePlaybackGoBackwardOneFrame: (id) sender;
+- (IBAction) moviePlaybackGoForwardOneFrame: (id) sender;
+
+-(void) initPreviewScrubberForMovie;
+-(void) adjustPreviewScrubberForCurrentMovieTime;
+- (IBAction) previewScrubberChanged: (id) sender;
+-(void)setTime:(int)timeValue;
+-(void)timeToQTTime:(long)timeValue resultTime:(QTTime *)aQTTime;
+- (void) startMovieTimer;
+- (void) stopMovieTimer;
+- (NSString*) calculatePlaybackSMTPETimecodeForDisplay;
+
+
 - (IBAction) previewDurationPopUpChanged: (id) sender;
 
 
index 5397fe5..a4d8b84 100644 (file)
@@ -14,6 +14,8 @@
 }
 @end
 
+
+
 @interface PreviewController (Private)
 
 - (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize;
         int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue];
         fPreviewLibhb = hb_init(loggingLevel, 0);
         
+        
+
        }
        return self;
 }
 
 
-
 //------------------------------------------------------------------------------------
 // Displays and brings the picture window to the front
 //------------------------------------------------------------------------------------
@@ -83,7 +86,6 @@
     //[self pictureSliderChanged:nil];
     [self startReceivingLibhbNotifications];
     
-    isFullScreen = NO;
     hudTimerSeconds = 0;
     /* we set the progress indicator to not use threaded animation
      * as it causes a conflict with the qtmovieview's controllerbar
     // Show the picture view
     [fPictureView setHidden:NO];
     [fMovieView pause:nil];
+    [fMovieTimer invalidate];
+    [fMovieTimer release];
     [fMovieView setHidden:YES];
        [fMovieView setMovie:nil];
 
-    isFullScreen = NO;
     hudTimerSeconds = 0;
     [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PreviewWindowIsOpen"];
 }
     hb_stop(fPreviewLibhb);
     if (fPreviewMoviePath)
     {
-        [[NSFileManager defaultManager] removeFileAtPath:fPreviewMoviePath handler:nil];
+        [[NSFileManager defaultManager] removeItemAtPath:fPreviewMoviePath error:nil];
         [fPreviewMoviePath release];
     }    
     
     [fHudTimer invalidate];
     [fHudTimer release];
     
+    [fMovieTimer invalidate];
+    [fMovieTimer release];
+    
     [fPicturePreviews release];
     [fFullScreenWindow release];
-
+    
+    hb_close(&fPreviewLibhb);
+    
+    [self removeMovieCallbacks];
+    
     [super dealloc];
 }
 
     fPicture = 0;
     MaxOutputWidth = title->width - job->crop[2] - job->crop[3];
     MaxOutputHeight = title->height - job->crop[0] - job->crop[1];
+    
     [self SettingsChanged: nil];
+
 }
 
 
 
 // Adjusts the window to draw the current picture (fPicture) adjusting its size as
 // necessary to display as much of the picture as possible.
-- (void) displayPreview
+- (void) displayPreview 
 {
     hb_job_t * job = fTitle->job;
     /* lets make sure that the still picture view is not hidden and that 
      * the movie preview is 
      */
+     aMovie = nil;
     [fMovieView pause:nil];
     [fMovieView setHidden:YES];
        [fMovieView setMovie:nil];
     [fMovieCreationProgressIndicator stopAnimation: nil];
     [fMovieCreationProgressIndicator setHidden: YES];
+    [fMoviePlaybackControlBox setHidden: YES];
+    if( fMovieTimer )
+    {
+        [self stopMovieTimer];
+    }
+    [fPictureControlBox setHidden: NO];
     
     [fPictureView setHidden:NO];
     
-    //[fHBController writeToActivityLog: "displayPreview called"];
-    
     NSImage *fPreviewImage = [self imageForPicture: fPicture];
     NSSize imageScaledSize = [fPreviewImage size];
     [fPictureView setImage: fPreviewImage];
                           @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Custom",
                           fTitle->width, fTitle->height, output_width, output_height, fTitle->job->anamorphic.dar_width, fTitle->job->anamorphic.dar_height];
         
-        displaySize.width = fTitle->job->anamorphic.dar_width + fTitle->job->crop[2] + fTitle->job->crop[3];
+        displaySize.width = fTitle->job->anamorphic.dar_width + fTitle->job->crop[2] + fTitle->job->crop[3] ;
         displaySize.height = fTitle->job->anamorphic.dar_height + fTitle->job->crop[0] + fTitle->job->crop[1];
         imageScaledSize.width = (int)fTitle->job->anamorphic.dar_width;
         imageScaledSize.height = (int)fTitle->job->height;   
         sizeInfoString = [NSString stringWithFormat:
                           @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height,
                           fTitle->job->width, fTitle->job->height];
-        
+       
         displaySize.width = fTitle->width;
         displaySize.height = fTitle->height;
         imageScaledSize.width = fTitle->job->width;
         imageScaledSize.height = fTitle->job->height;
     }
     
+    
+    
     NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
+    [self resizeSheetForViewSize:viewSize];
+
+    NSSize windowSize = [[self window] frame].size;    
     
-    /* Initially set our preview image here */
-    /*
     if (scaleToScreen == YES)
     {
-        viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width);
-        viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height);
-        [fPreviewImage setSize: viewSize];
-        //[fPictureView setFrameSize: viewSize];
+        /* Note: this should probably become a utility function */
+        /* We are in Scale To Screen mode so, we have to get the ratio for height and width against the window
+         *size so we can scale from there.
+         */
+        CGFloat deltaWidth = imageScaledSize.width / displaySize.width;
+        CGFloat deltaHeight = imageScaledSize.height /displaySize.height;
+        NSSize windowSize = [[self window] frame].size;  
+        CGFloat pictureAspectRatio = imageScaledSize.width / imageScaledSize.height;
+        
+        /* Set our min size to the storage size */
+        NSSize minSize;
+        minSize.width = fTitle->width;
+        minSize.height = fTitle->height;
+
+        /* Set delta's based on minimum size */
+        if (imageScaledSize.width <  minSize.width)
+        {
+            deltaWidth = imageScaledSize.width / minSize.width;
+        }
+        else
+        {
+            deltaWidth = 1.0;
+        }
+        
+        if (imageScaledSize.height <  minSize.height)
+        {
+            deltaHeight =  imageScaledSize.height / minSize.height;
+        }
+        else
+        {
+            deltaHeight = 1.0;
+        }
+        
+        /* Now apply our deltas to the full screen view */
+        if (pictureAspectRatio > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height
+        {
+            viewSize.width = windowSize.width * deltaWidth;
+            viewSize.height = viewSize.width / pictureAspectRatio;
+            
+        }
+        else
+        {
+            viewSize.height = windowSize.height * deltaHeight; 
+            viewSize.width = viewSize.height * pictureAspectRatio;
+        }
+        
     }
-    
     else
     {
-        [fPreviewImage setSize: imageScaledSize];
-        [fPictureView setFrameSize: imageScaledSize];
-    }
-    [fPictureView setImage: fPreviewImage];
-    // center it vertically and horizontally
-    NSPoint origin = [fPictureViewArea frame].origin;
-    origin.y += ([fPictureViewArea frame].size.height -
-                 [fPictureView frame].size.height) / 2.0;
-    
-    origin.x += ([fPictureViewArea frame].size.width -
-                 [fPictureView frame].size.width) / 2.0;
-    [fPictureView setFrameOrigin:origin]; 
-    */
-    /* we also need to take into account scaling to full screen to activate switching the view size */
-    if( [self viewNeedsToResizeToSize:viewSize])
-    {
-        if (fTitle->job->anamorphic.mode != 2 || (fTitle->job->anamorphic.mode == 2 && fTitle->width == fTitle->job->width))
+        viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width);
+        viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height);
+        
+        if (fTitle->width > windowSize.width || fTitle->height > windowSize.height)
         {
-            [self resizeSheetForViewSize:viewSize];
-            //[self setViewSize:viewSize];
-            
+            CGFloat viewSizeAspect = viewSize.width / viewSize.height;
+            if (viewSizeAspect > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height
+            {
+                viewSize.width = viewSize.width * (windowSize.width / fTitle->width) ;
+                viewSize.height = viewSize.width / viewSizeAspect;
+            }
+            else
+            {
+                viewSize.height = viewSize.height * (windowSize.height / fTitle->height);
+                viewSize.width = viewSize.height * viewSizeAspect;
+            }
         }
-    }   
+        
+    }
     
-    viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width);
-    viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height);
     [self setViewSize:viewSize];
     
-    /* special case for scaleToScreen */
-    if (scaleToScreen == YES)
-    {
-        [fPreviewImage setSize: viewSize];
-        [fPictureView setImage: fPreviewImage];
-    }
-    
+    /* relocate our hud origins as per setViewSize */
+    NSPoint hudControlBoxOrigin = [fPictureControlBox frame].origin;
+    hudControlBoxOrigin.y = ([[self window] frame].size.height / 2) - (viewSize.height / 2);
+    hudControlBoxOrigin.x = ([[self window] frame].size.width / 2) - ([fPictureControlBox frame].size.width / 2);
+    [fPictureControlBox setFrameOrigin:hudControlBoxOrigin];
+    [fEncodingControlBox setFrameOrigin:hudControlBoxOrigin];
+    [fMoviePlaybackControlBox setFrameOrigin:hudControlBoxOrigin];
+
+
     NSString *scaleString;
-    
-    if( imageScaledSize.height > [fPictureView frame].size.height)
+    CGFloat scale = ( ( CGFloat )[fPictureView frame].size.width) / ( ( CGFloat )imageScaledSize.width);
+    if (scale * 100.0 != 100)
     {
-        CGFloat scale = ( ( CGFloat )[fPictureView frame].size.width) / ( ( CGFloat )imageScaledSize.width);        
         scaleString = [NSString stringWithFormat:
-                       NSLocalizedString( @" (Scaled to %.0f%% actual size)",
+                       NSLocalizedString( @" (%.0f%% actual size)",
                                          @"String shown when a preview is scaled" ), scale * 100.0];
     }
     else
     {
-        scaleString = @"";
+        scaleString = @"(Actual size)";
+    }
+    
+    if (scaleToScreen == YES)
+    {
+        scaleString = [scaleString stringByAppendingString:@" Scaled To Screen"];
     }
     /* Set the info fields in the hud controller */
     [fInfoField setStringValue: [NSString stringWithFormat:
         [self showWindow:sender];
         [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PreviewWindowIsOpen"];
         [fPreviewWindow setAcceptsMouseMovedEvents:YES];
-        isFullScreen = NO;
         scaleToScreen = NO;
         [self pictureSliderChanged:nil];
     }
 }
 
 #pragma mark Hud Control Overlay
+/* enableHudControls and disableHudControls are used to sync enableUI
+ * in HBController so that during a scan we do not attempt to access source
+ * images, etc. which can cause a crash. In general this ui behavior will mirror
+ * the main window ui's enableUI method and in fact is called from there */
+- (void) enableHudControls
+{
+    [fPictureSlider setEnabled:YES];
+    [fScaleToScreenToggleButton setEnabled:YES];
+    [fCreatePreviewMovieButton setEnabled:YES];
+    [fGoToStillPreviewButton setEnabled:YES];
+    [fHBController writeToActivityLog: "Preview: Enabling HUD Controls"];
+}
+
+- (void) disableHudControls
+{
+    [fPictureSlider setEnabled:NO];
+    [fScaleToScreenToggleButton setEnabled:NO];
+    [fCreatePreviewMovieButton setEnabled:NO];
+    [fGoToStillPreviewButton setEnabled:NO];
+    [fHBController writeToActivityLog: "Preview: Disabling HUD Controls"];
+}
+
 - (void) mouseMoved:(NSEvent *)theEvent
 {
     [super mouseMoved:theEvent];
     NSPoint mouseLoc = [theEvent locationInWindow];
     
     /* Test for mouse location to show/hide hud controls */
-    if( isEncoding == NO ) {
+    if( isEncoding == NO ) 
+    {
+        /* Since we are not encoding, verify which control hud to show
+         * or hide based on aMovie ( aMovie indicates we need movie controls )
+         */
+        NSBox           * hudBoxToShow;
+        if ( aMovie == nil ) // No movie loaded up
+        {
+            hudBoxToShow = fPictureControlBox;
+        }
+        else // We have a movie
+        {
+            hudBoxToShow = fMoviePlaybackControlBox;
+        }
+        
         if( NSPointInRect( mouseLoc, [fPictureControlBox frame] ) )
         {
-            [[fPictureControlBox animator] setHidden: NO];
+            [[hudBoxToShow animator] setHidden: NO];
             [self stopHudTimer];
         }
                else if( NSPointInRect( mouseLoc, [fPictureViewArea frame] ) )
         {
-            [[fPictureControlBox animator] setHidden: NO];
+            [[hudBoxToShow animator] setHidden: NO];
             [self startHudTimer];
         }
         else
-            [[fPictureControlBox animator] setHidden: YES];
+        {
+            [[hudBoxToShow animator] setHidden: YES];
+        }
        }
 }
 
 - (void) hudTimerFired: (NSTimer*)theTimer
 {
     hudTimerSeconds++;
-    if( hudTimerSeconds >= 10 ) {
+    if( hudTimerSeconds >= 10 ) 
+    {
+        /* Regardless which control box is active, after the timer
+         * period we want either one to fade to hidden.
+         */
         [[fPictureControlBox animator] setHidden: YES];
+        [[fMoviePlaybackControlBox animator] setHidden: YES];
         [self stopHudTimer];
     }
 }
 
-#pragma mark Fullscreen Mode
 
-- (IBAction)toggleScreenMode:(id)sender
-{
-    if (!isFullScreen)
-    {
-        [self goFullScreen:nil];
-    }
-    else
-    {
-        [self goWindowedScreen:nil];
-    }
-}
 
 - (IBAction)toggleScaleToScreen:(id)sender
 {
         scaleToScreen = NO;
         /* make sure we are set to a still preview */
         [self pictureSliderChanged:nil];
-        [fScaleToScreenToggleButton setTitle:@"<->"];
+        [fScaleToScreenToggleButton setTitle:@"Scale To Screen"];
     }
     else
     {
         scaleToScreen = YES;
         /* make sure we are set to a still preview */
         [self pictureSliderChanged:nil];
-        [fScaleToScreenToggleButton setTitle:@">-<"];
+        [fScaleToScreenToggleButton setTitle:@"Actual Scale"];
     }
+    
 }
 
-- (BOOL)fullScreen
-{
-    return isFullScreen;
-}
 
-- (IBAction)goFullScreen:(id)sender 
-{ 
-    // Get the screen information. 
-    NSScreen* mainScreen = [fPreviewWindow screen];
-    NSDictionary* screenInfo = [mainScreen deviceDescription]; 
-    NSNumber* screenID = [screenInfo objectForKey:@"NSScreenNumber"]; 
-    // Capture the screen. 
-    CGDirectDisplayID displayID = (CGDirectDisplayID)[screenID longValue]; 
-    CGDisplayErr err = CGDisplayCapture(displayID); 
-    
-    if (err == CGDisplayNoErr) 
-    { 
-        
-        /* make sure we are set to a still preview and not scaled to screen */
-        scaleToScreen = NO;
-        [self pictureSliderChanged:nil];
-        
-        // Create the full-screen window. 
-        //NSRect winRect = [mainScreen frame];
-        //fPictureViewArea
-        NSRect winRect = [fPictureViewArea frame];
-          
-        fFullScreenWindow = [[NSWindow alloc] initWithContentRect:winRect 
-                                                        styleMask:NSBorderlessWindowMask 
-                                                          backing:NSBackingStoreBuffered 
-                                                            defer:NO 
-                                                           screen:mainScreen]; 
-        
-        // Establish the window attributes. 
-        [fFullScreenWindow setReleasedWhenClosed:NO]; 
-        [fFullScreenWindow setDisplaysWhenScreenProfileChanges:YES]; 
-        [fFullScreenWindow setDelegate:self]; 
-        
-        /* insert a view into the new window */
-        [fFullScreenWindow setContentView:fPictureViewArea]; 
-        [fPictureViewArea setNeedsDisplay:YES];
-        
-        /* Better to center the window using the screen's frame
-         * and the windows origin. Note that we should take into
-         * account the auto sizing and alignment that occurs in 
-         * setViewSize each time the preview changes.
-         * Note: by using [fFullScreenWindow screen] (instead of
-         * [NSScreen mainScreen]) in referencing the screen
-         * coordinates, the full screen window will show up on
-         * whichever display was being used in windowed mode
-         * on multi-display systems
-         */
-        
-        NSSize screenSize = [[fFullScreenWindow screen] frame].size;
-        NSSize windowSize = [fFullScreenWindow frame].size;
-        NSPoint windowOrigin = [fFullScreenWindow frame].origin;
-        
-        /* Adjust our origin y (vertical) based on the screen height */
-        windowOrigin.y += (screenSize.height - windowSize.height) / 2.0;
-        windowOrigin.x += (screenSize.width - windowSize.width) / 2.0;
-        
-        [fFullScreenWindow setFrameOrigin:windowOrigin];
-        
-        /* lets kill the timer for now */
-        [self stopReceivingLibhbNotifications];
-        
-        /* We need to retain the fPreviewWindow */
-        [fPreviewWindow retain];
-        
-        [self setWindow:fFullScreenWindow];
-        
-        // The window has to be above the level of the shield window.
-        int32_t shieldLevel = CGShieldingWindowLevel(); 
-        
-        [fFullScreenWindow setLevel:shieldLevel]; 
-        
-        // Show the window. 
-        [fFullScreenWindow makeKeyAndOrderFront:self];
-        
-        
-        /* Change the name of fFullScreenToggleButton appropriately */
-        [fFullScreenToggleButton setTitle: @"Windowed"];
-        
-        /* Lets fire the timer back up for the hud controls, etc. */
-        [self startReceivingLibhbNotifications];
-        
-        isFullScreen = YES;
-        [fScaleToScreenToggleButton setHidden:NO];
-        
-        /* make sure we are set to a still preview */
-        [self pictureSliderChanged:nil];
-        
-        [fFullScreenWindow setAcceptsMouseMovedEvents:YES];
-        
-        
-        hudTimerSeconds = 0;
-        [self startHudTimer];
-    } 
-} 
 
 // Title-less windows normally don't receive key presses, override this
 - (BOOL)canBecomeKeyWindow
     [fPreviewWindow setLevel:NSNormalWindowLevel];
     
     /* Set the isFullScreen flag back to NO */
-    isFullScreen = NO;
+    //isFullScreen = NO;
     scaleToScreen = NO;
     /* make sure we are set to a still preview */
     [self pictureSliderChanged:nil];
     [self showPreviewWindow:nil];
     
     /* Change the name of fFullScreenToggleButton appropriately */
-    [fFullScreenToggleButton setTitle: @"Full Screen"];
+    //[fFullScreenToggleButton setTitle: @"Full Screen"];
     // [fScaleToScreenToggleButton setHidden:YES];
     /* set the picture settings pallete back to normal level */
     [fHBController picturePanelWindowed];
  
 
 #pragma mark Movie Preview
+
+- (IBAction) cancelCreateMoviePreview: (id) sender
+{
+    
+    hb_state_t s;
+    hb_get_state2( fPreviewLibhb, &s );
+    
+    if(isEncoding && (s.state == HB_STATE_WORKING || s.state == HB_STATE_PAUSED))
+    {
+        hb_stop( fPreviewLibhb );
+        [fPictureView setHidden:NO];
+        [fMovieView pause:nil];
+        [fMovieView setHidden:YES];
+               [fMovieView setMovie:nil];
+        [fPictureSlider setHidden:NO];
+        isEncoding = NO;
+        
+        [self pictureSliderChanged:nil];
+        
+        return;
+    }
+    
+}
+
 - (IBAction) createMoviePreview: (id) sender
 {
     
     hb_get_state2( fPreviewLibhb, &s );
     
     if(sender == fCancelPreviewMovieButton && (s.state == HB_STATE_WORKING || s.state == HB_STATE_PAUSED))
-       {
+    {
         hb_stop( fPreviewLibhb );
         [fPictureView setHidden:NO];
         [fMovieView pause:nil];
     
     [fHBController prepareJobForPreview];
     
+    /* Make sure we have a Preview sub directory with our pidnum attached */
+    NSString *PreviewDirectory = [NSString stringWithFormat:@"~/Library/Application Support/HandBrake/Previews/%d", [fHBController getPidnum]];
+    PreviewDirectory = [PreviewDirectory stringByExpandingTildeInPath];
+    if( ![[NSFileManager defaultManager] fileExistsAtPath:PreviewDirectory] )
+    {
+        [[NSFileManager defaultManager] createDirectoryAtPath:PreviewDirectory 
+                                  withIntermediateDirectories:NO 
+                                                   attributes:nil 
+                                                        error:nil];
+    }
     /* Destination file. We set this to our preview directory
      * changing the extension appropriately.*/
     if (fTitle->job->mux == HB_MUX_MP4) // MP4 file
     {
         /* we use .m4v for our mp4 files so that ac3 and chapters in mp4 will play properly */
-        fPreviewMoviePath = @"~/Library/Application Support/HandBrake/Previews/preview_temp.m4v";
+        fPreviewMoviePath = [PreviewDirectory stringByAppendingString:@"/preview_temp.m4v"];
     }
     else if (fTitle->job->mux == HB_MUX_MKV) // MKV file
     {
-        fPreviewMoviePath = @"~/Library/Application Support/HandBrake/Previews/preview_temp.mkv";
-    }
-    else if (fTitle->job->mux == HB_MUX_AVI) // AVI file
-    {
-        fPreviewMoviePath = @"~/Library/Application Support/HandBrake/Previews/preview_temp.avi";
-    }
-    else if (fTitle->job->mux == HB_MUX_OGM) // OGM file
-    {
-        fPreviewMoviePath = @"~/Library/Application Support/HandBrake/Previews/preview_temp.ogm";
+        fPreviewMoviePath = [PreviewDirectory stringByAppendingString:@"/preview_temp.mkv"];
     }
     
     fPreviewMoviePath = [[fPreviewMoviePath stringByExpandingTildeInPath]retain];
     /* See if there is an existing preview file, if so, delete it */
     if( ![[NSFileManager defaultManager] fileExistsAtPath:fPreviewMoviePath] )
     {
-        [[NSFileManager defaultManager] removeFileAtPath:fPreviewMoviePath
-                                                 handler:nil];
+        [[NSFileManager defaultManager] removeItemAtPath:fPreviewMoviePath error:nil];
     }
     
     /* We now direct our preview encode to fPreviewMoviePath */
             [fMovieCreationProgressIndicator stopAnimation: nil];
             [fMovieCreationProgressIndicator setHidden: YES];
             [fEncodingControlBox setHidden: YES];
+            [fPictureControlBox setHidden: YES];
             isEncoding = NO;
-            /* we make sure the picture slider and preview match */
-            [self pictureSliderChanged:nil];
 
             // Show the movie view
             [self showMoviePreview:fPreviewMoviePath];
     }
 }
 
+- (IBAction) toggleMoviePreviewPlayPause: (id) sender
+{
+    /* make sure a movie is even loaded up */
+    if (aMovie != nil)
+    {
+        /* For some stupid reason there is no "isPlaying" method for a QTMovie
+         * object, given that, we detect the rate to determine whether the movie
+         * is playing or not.
+         */
+        if ([aMovie rate] != 0) // we are playing 
+        {
+            [fMovieView pause:aMovie];
+            [fPlayPauseButton setTitle: @">"];
+        }
+        else // we are paused or stopped
+        {
+            [fMovieView play:aMovie];
+            [fPlayPauseButton setTitle: @"||"];   
+        }
+    }
+    
+}
+
+- (IBAction) moviePlaybackGoToBeginning: (id) sender
+{
+    /* make sure a movie is even loaded up */
+    if (aMovie != nil)
+    {
+        [fMovieView gotoBeginning:aMovie];
+     }
+    
+}
+
+- (IBAction) moviePlaybackGoToEnd: (id) sender
+{
+    /* make sure a movie is even loaded up */
+    if (aMovie != nil)
+    {
+        [fMovieView gotoEnd:aMovie];
+     }
+    
+}
+
+- (IBAction) moviePlaybackGoBackwardOneFrame: (id) sender
+{
+    /* make sure a movie is even loaded up */
+    if (aMovie != nil)
+    {
+        [fMovieView pause:aMovie]; // Pause the movie
+        [fMovieView stepBackward:aMovie];
+     }
+    
+}
+
+- (IBAction) moviePlaybackGoForwardOneFrame: (id) sender
+{
+    /* make sure a movie is even loaded up */
+    if (aMovie != nil)
+    {
+        [fMovieView pause:aMovie]; // Pause the movie
+        [fMovieView stepForward:aMovie];
+     }
+    
+}
+
+
+- (void) startMovieTimer
+{
+       if( fMovieTimer ) {
+               [fMovieTimer invalidate];
+               [fMovieTimer release];
+       }
+    fMovieTimer = [NSTimer scheduledTimerWithTimeInterval:0.10 target:self selector:@selector(movieTimerFired:) userInfo:nil repeats:YES];
+    [fMovieTimer retain];
+}
+
+- (void) stopMovieTimer
+{
+    if( fMovieTimer )
+    {
+        [fMovieTimer invalidate];
+        [fMovieTimer release];
+        fMovieTimer = nil;
+    }
+}
+
+- (void) movieTimerFired: (NSTimer*)theTimer
+{
+     if (aMovie != nil)
+    {
+        [self adjustPreviewScrubberForCurrentMovieTime];
+        [fMovieInfoField setStringValue: [NSString stringWithFormat:NSLocalizedString( @"%@", @"" ),[self calculatePlaybackSMTPETimecodeForDisplay]]];    
+    }
+}
+
+
+
 - (IBAction) showMoviePreview: (NSString *) path
 {
     /* Since the gray background for the still images is part of
      * we retain the gray cropping border  we have already established
      * with the still previews
      */
-
+    
     /* Load the new movie into fMovieView */
-    if (path) {
-               QTMovie * aMovie;
+    if (path) 
+    {
+               //QTMovie * aMovie;
                NSError  *outError;
                NSURL *movieUrl = [NSURL fileURLWithPath:path];
                NSDictionary *movieAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                                                                 [NSNumber numberWithBool:YES], @"QTMovieOpenForPlaybackAttribute",
                                                                                 [NSNumber numberWithBool:NO], @"QTMovieOpenAsyncRequiredAttribute",                                                            
                                                                                 [NSNumber numberWithBool:NO], @"QTMovieOpenAsyncOKAttribute",
+                                         [NSNumber numberWithBool:YES], @"QTMovieIsSteppableAttribute",
                                                                                 QTMovieApertureModeClean, QTMovieApertureModeAttribute,
                                                                                 nil];
-
+        
         aMovie = [[[QTMovie alloc] initWithAttributes:movieAttributes error:&outError] autorelease];
-
-               if (!aMovie) {
+        
+        
+               if (!aMovie) 
+        {
                        NSLog(@"Unable to open movie");
                }
-        else {
+        else 
+        {
             NSRect movieBounds;
             /* we get some size information from the preview movie */
             NSSize movieSize= [[aMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
             movieBounds = [fMovieView movieBounds];
             movieBounds.size.height = movieSize.height;
-            
-            if ([fMovieView isControllerVisible]) {
+            /* We also get our view size to use for scaling fMovieView's size */
+            NSSize scaledMovieViewSize = [fPictureView frame].size;
+            [fMovieView setControllerVisible:FALSE];
+            if ([fMovieView isControllerVisible]) 
+            {
                 CGFloat controllerBarHeight = [fMovieView controllerBarHeight];
                 if ( controllerBarHeight != 0 ) //Check if QTKit return a real value or not.
+                {
                     movieBounds.size.height += controllerBarHeight;
+                    scaledMovieViewSize.height += controllerBarHeight;
+                }
                 else
+                {
                     movieBounds.size.height += 15;
+                    scaledMovieViewSize.height += 15;
+                }
             }
             
             movieBounds.size.width = movieSize.width;
             
-            /* We need to find out if the preview movie needs to be scaled down so
-             * that it doesn't overflow our available viewing container (just like for image
-             * in -displayPreview) for HD sources, etc. [fPictureViewArea frame].size.height*/
-            if( (movieBounds.size.height) > [fPictureViewArea frame].size.height || scaleToScreen == YES )
-            {
-                /* The preview movie would be larger than the available viewing area
-                 * in the preview movie, so we go ahead and scale it down to the same size
-                 * as the still preview  or we readjust our window to allow for the added height if need be
-                 */
-                NSSize displaySize = NSMakeSize( ( CGFloat ) movieBounds.size.width, ( CGFloat ) movieBounds.size.height );
-                NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
-                if( [self viewNeedsToResizeToSize:viewSize] ) {
-                    [self resizeSheetForViewSize:viewSize];
-                    [self setViewSize:viewSize];
-                }
-                [fMovieView setFrameSize:viewSize];
-            }
-            else
+            /* we need to account for an issue where the scaledMovieViewSize > the window size */
+            if (scaledMovieViewSize.height > [[self window] frame].size.height)
             {
-                /* Since the preview movie is smaller than the available viewing area
-                 * we can go ahead and use the preview movies native size */
-                [fMovieView setFrameSize:movieBounds.size];
+                [fHBController writeToActivityLog: "showMoviePreview: Our window is not tall enough to show the controller bar ..."];
             }
             
-            //lets reposition the movie if need be
             
-            NSPoint origin = [fPictureViewArea frame].origin;
-            origin.x += trunc( ( [fPictureViewArea frame].size.width -
+            
+            /* Scale the fMovieView to scaledMovieViewSize */
+            [fMovieView setFrameSize:scaledMovieViewSize];
+            
+            /*set our origin try using fPictureViewArea or fPictureView */
+            NSPoint origin = [fPictureView frame].origin;
+            origin.x += trunc( ( [fPictureView frame].size.width -
                                 [fMovieView frame].size.width ) / 2.0 );
-            /* We need to detect whether or not we are currently less than the available height.*/
-            if( movieBounds.size.height < [fPictureView frame].size.height )
-            {
-                /* If we are, we are adding 15 to the height to allow for the controller bar so
-                 * we need to subtract half of that for the origin.y to get the controller bar
-                 * below the movie to it lines up vertically with where our still preview was
-                 */
-                origin.y += trunc( ( ( [fPictureViewArea frame].size.height -
+            origin.y += trunc( ( ( [fPictureView frame].size.height -
                                       [fMovieView frame].size.height ) / 2.0 ) - 7.5 );
-            }
-            else
-            {
-                /* if we are >= to the height of the picture view area, the controller bar
-                 * gets taken care of with picture resizing, so we do not want to offset the height
-                 */
-                origin.y += trunc( ( [fPictureViewArea frame].size.height -
-                                    [fMovieView frame].size.height ) / 2.0 );
-            }
+
             [fMovieView setFrameOrigin:origin];
             [fMovieView setMovie:aMovie];
             [fMovieView setHidden:NO];
+            [fMoviePlaybackControlBox setHidden: NO];
+            [fPictureControlBox setHidden: YES];
+            
             // to actually play the movie
+            
+            [self initPreviewScrubberForMovie];
+            [self startMovieTimer];
+            /* Install amovie notifications */
+            [aMovie setDelegate:self];
+            [self installMovieCallbacks];
             [fMovieView play:aMovie];
+
         }
     }
     isEncoding = NO;
 }
+#pragma mark *** Movie Playback Scrubber and time code methods ***
+
+/* Since MacOSX Leopard QTKit has taken over some responsibility for assessing movie playback
+ * information from the old QuickTime carbon api ( time code information as well as fps, etc.).
+ * However, the QTKit devs at apple were not really big on documentation and further ...
+ * QuickTimes ability to playback HB's largely variable framerate output makes perfectly frame
+ * accurate information at best convoluted. Still, for the purpose of a custom hud based custom
+ * playback scrubber slider this has so far proven to be as accurate as I have found. To say it
+ * could use some better accuracy is not understating it enough probably.
+ * Most of this was gleaned from this obscure Apple Mail list thread:
+ * http://www.mailinglistarchive.com/quicktime-api@lists.apple.com/msg05642.html
+ * Now as we currently do not show a QTKit control bar with scrubber for display sizes > container
+ * size, this seems to facilitate playback control from the HB custom HUD controller fairly close
+ * to the built in controller bar.
+ * Further work needs to be done to try to get accurate frame by frame playback display if we want it.
+ * Note that the keyboard commands for frame by frame step through etc. work as always.
+ */ 
+
+// Returns a human readable string from the currentTime of movie playback
+- (NSString*) calculatePlaybackSMTPETimecodeForDisplay
+{
+    QTTime time = [aMovie currentTime];
+    
+    NSString *smtpeTimeCodeString;
+    int days, hour, minute, second, frame;
+    long long result;
+    
+    result = time.timeValue / time.timeScale; // second
+    frame = (time.timeValue % time.timeScale) / 100;
+    
+    second = result % 60;
+    
+    result = result / 60; // minute
+    minute = result % 60;
+    
+    result = result / 60; // hour
+    hour = result % 24;         
+    days = result;
+    
+    smtpeTimeCodeString = [NSString stringWithFormat:@"Time: %02d:%02d:%02d", hour, minute, second]; // hh:mm:ss
+    return smtpeTimeCodeString;
+    
+}
+
+
+// Initialize the preview scrubber min/max to appropriate values for the current movie
+-(void) initPreviewScrubberForMovie
+{
+    if (aMovie)
+    {
+        
+        QTTime duration = [aMovie duration];
+        float result = duration.timeValue / duration.timeScale;
+        
+        [fMovieScrubberSlider setMinValue:0.0];
+        [fMovieScrubberSlider setMaxValue: (float)result];
+        [fMovieScrubberSlider setFloatValue: 0.0];
+    }
+}
+
+
+-(void) adjustPreviewScrubberForCurrentMovieTime
+{
+    if (aMovie)
+    {
+        QTTime time = [aMovie currentTime];
+        
+        float result = (float)time.timeValue / (float)time.timeScale;;
+        [fMovieScrubberSlider setFloatValue:result];
+    }
+}
+
+- (IBAction) previewScrubberChanged: (id) sender
+{
+    if (aMovie)
+    {
+        [fMovieView pause:aMovie]; // Pause the movie
+        QTTime time = [aMovie currentTime];
+        [self setTime: time.timeScale * [fMovieScrubberSlider floatValue]];
+        [self calculatePlaybackSMTPETimecodeForDisplay];
+    }
+}
+#pragma mark *** Movie Notifications ***
+
+- (void) installMovieCallbacks
+{
+
+
+/*Notification for any time the movie rate changes */
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(movieRateDidChange:)
+                                                     name:@"QTMovieRateDidChangeNotification"
+                                                   object:aMovie];
+        /*Notification for when the movie ends */
+        [[NSNotificationCenter defaultCenter] addObserver:self
+                                                 selector:@selector(movieDidEnd:)
+                                                     name:@"QTMovieDidEndNotification"
+                                                   object:aMovie];
+}
+
+- (void)removeMovieCallbacks
+{
+    if (aMovie)
+    {
+        /*Notification for any time the movie rate changes */
+        [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                        name:@"QTMovieRateDidChangeNotification"
+                                                      object:aMovie];
+        /*Notification for when the movie ends */
+        [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                        name:@"QTMovieDidEndNotification"
+                                                      object:aMovie];
+    }
+}
+
+- (void)movieRateDidChange:(NSNotification *)notification
+{
+    if (aMovie != nil)
+    {
+        /* For some stupid reason there is no "isPlaying" method for a QTMovie
+         * object, given that, we detect the rate to determine whether the movie
+         * is playing or not.
+         */
+        //[self adjustPreviewScrubberForCurrentMovieTime];
+        if ([aMovie rate] != 0) // we are playing 
+        {
+            [fPlayPauseButton setTitle: @"||"];
+        }
+        else // we are paused or stopped
+        {
+            [fPlayPauseButton setTitle: @">"];
+        }
+    }
+}
+/* This notification is not currently used. However we should keep it "just in case" as
+ * live preview playback is enhanced.
+ */
+- (void)movieDidEnd:(NSNotification *)notification
+{
+
+    //[fHBController writeToActivityLog: "Movie DidEnd Notification Received"];
+}
+
+
+#pragma mark *** QTTime Utilities ***
+
+       // convert a time value (long) to a QTTime structure
+-(void)timeToQTTime:(long)timeValue resultTime:(QTTime *)aQTTime
+{
+       NSNumber *timeScaleObj;
+       long timeScaleValue;
+
+       timeScaleObj = [aMovie attributeForKey:QTMovieTimeScaleAttribute];
+       timeScaleValue = [timeScaleObj longValue];
+
+       *aQTTime = QTMakeTime(timeValue, timeScaleValue);
+}
+
+       // set the movie's current time
+-(void)setTime:(int)timeValue
+{
+       QTTime movieQTTime;
+       NSValue *valueForQTTime;
+       
+       [self timeToQTTime:timeValue resultTime:&movieQTTime];
+
+       valueForQTTime = [NSValue valueWithQTTime:movieQTTime];
+
+       [aMovie setAttribute:valueForQTTime forKey:QTMovieCurrentTimeAttribute];
+}
+
 
 @end
 
 //
 - (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize
 {
-    // The min size is 320x240
+    // The min size is 480x360
     CGFloat minWidth = 480.0;
     CGFloat minHeight = 360.0;
 
-    NSSize screenSize = [[NSScreen mainScreen] frame].size;
+    NSSize screenSize = [[[self window] screen] visibleFrame].size;
     NSSize sheetSize = [[self window] frame].size;
     NSSize viewAreaSize = [fPictureViewArea frame].size;
-    CGFloat paddingX = sheetSize.width - viewAreaSize.width;
-    CGFloat paddingY = sheetSize.height - viewAreaSize.height;
-    CGFloat maxWidth;
-    CGFloat maxHeight;
+    CGFloat paddingX = 0.00;
+    CGFloat paddingY = 0.00;
     
-    if (isFullScreen)
-    {
-        /* We are in full screen mode so lets use the full screen if we need to */
-        maxWidth =  screenSize.width - paddingX;
-        maxHeight = screenSize.height - paddingY;
-    }
-    else
+    if (fTitle->width > screenSize.width || fTitle->height > screenSize.height)
     {
-        // The max size of the view is when the sheet is taking up 85% of the screen.
-        maxWidth = (0.85 * screenSize.width) - paddingX;
-        maxHeight = (0.85 * screenSize.height) - paddingY;
+        if (scaleToScreen == YES)
+        {
+            paddingX = screenSize.width - imageSize.width;
+            paddingY = screenSize.height - imageSize.height;
+        }
+        
+        else
+        {
+            paddingX = sheetSize.width - viewAreaSize.width;
+            paddingY = sheetSize.height - viewAreaSize.height;  
+        }
+
     }
     
-    NSSize resultSize = imageSize;
+    CGFloat maxWidth;
+    CGFloat maxHeight;
+    maxWidth =  screenSize.width - paddingX;
+    maxHeight = screenSize.height - paddingY;
     
-    // Its better to have a view that's too small than a view that's too big, so
-    // apply the maximum constraints last.
-    if( resultSize.width < minWidth )
-    {
-        resultSize.height *= (minWidth / resultSize.width);
-        resultSize.width = minWidth;
-    }
-    if( resultSize.height < minHeight )
-    {
-        resultSize.width *= (minHeight / resultSize.height);
-        resultSize.height = minHeight;
-    }
-    if( resultSize.width > maxWidth )
-    {
-        resultSize.height *= (maxWidth / resultSize.width);
-        resultSize.width = maxWidth;
-    }
-    if( resultSize.height > maxHeight )
-    {
-        resultSize.width *= (maxHeight / resultSize.height);
-        resultSize.height = maxHeight;
-    }
+    NSSize resultSize = imageSize;
+    CGFloat resultPar = resultSize.width / resultSize.height;
+
+    //note, a mbp 15" at 1440 x 900 is a 1.6 ar
+    CGFloat screenAspect = screenSize.width / screenSize.height;
+    // Note, a standard dvd will use 720 x 480 which is a 1.5
+    CGFloat viewAreaAspect = viewAreaSize.width / viewAreaSize.height;
     
     if (scaleToScreen == YES)
     {
-        CGFloat screenAspect;
-        CGFloat viewAreaAspect; 
-        //note, a mbp 15" at 1440 x 900 is a 1.6 ar
-        screenAspect = screenSize.width / screenSize.height;
-        
-        // Note, a standard dvd will use 720 x 480 which is a 1.5
-        viewAreaAspect = viewAreaSize.width / viewAreaSize.height;
         
         if (screenAspect < viewAreaAspect)
         {
         }
         
     }
+    else if ( resultSize.width > maxWidth || resultSize.height > maxHeight )
+    {
+       // Source is larger than screen in one or more dimensions
+        if ( resultPar > screenAspect )
+        {
+            // Source aspect wider than screen aspect, snap to max width and vary height
+            resultSize.width = maxWidth;
+            resultSize.height = (maxWidth / resultPar);
+        }
+        else
+        {
+            // Source aspect narrower than screen aspect, snap to max height vary width
+            resultSize.height = maxHeight;
+            resultSize.width = (maxHeight * resultPar);
+        }
+    }
 
-      return resultSize;
+    // If necessary, grow to minimum dimensions to ensure controls overlay is not obstructed
+    if ( resultSize.width < minWidth )
+    {
+        resultSize.width = minWidth;
+    }
+    if ( resultSize.height < minHeight )
+    {
+        resultSize.height = minHeight;
+    }
+    
+    return resultSize;
 
     
 }
     
     // Now resize the whole panel by those same deltas, but don't exceed the min
     NSRect frame = [[self window] frame];
-    NSSize maxSize = [[self window] maxSize];
-    NSSize minSize = [[self window] minSize];
+    NSSize maxSize = [[[self window] screen] visibleFrame].size;
+    /* if we are not Scale To Screen, put an 85% of visible screen on the window */
+    if (scaleToScreen == NO )
+    {
+        maxSize.width = maxSize.width * 0.85;
+        maxSize.height = maxSize.height * 0.85;
+    }
+    
+    /* Set our min size to the storage size */
+    NSSize minSize;
+    minSize.width = fTitle->width;
+    minSize.height = fTitle->height;
+    
     frame.size.width += deltaX;
     frame.size.height += deltaY;
     if( frame.size.width < minSize.width )
     {
         frame.size.height = minSize.height;
     }
+    /* compare frame to max size of screen */
+    
+    if( frame.size.width > maxSize.width )
+    {
+        frame.size.width = maxSize.width;
+    }
+    
+    if( frame.size.height > maxSize.height )
+    {
+        frame.size.height = maxSize.height;
+    }
     
     
+    
+
+    
     // But now the sheet is off-center, so also shift the origin to center it and
     // keep the top aligned.
     if( frame.size.width != [[self window] frame].size.width )
         frame.origin.x -= (deltaX / 2.0);
     
-    if (isFullScreen)
-    {
-        if( frame.size.height != [[self window] frame].size.height )
-        {
-            frame.origin.y -= (deltaY / 2.0);
-        }
-        else
-        {
-            if( frame.size.height != [[self window] frame].size.height )
-                frame.origin.y -= deltaY;
-        }
         
-        [[self window] setFrame:frame display:YES animate:NO];
-    }
-    else
-    {
         /* Since upon launch we can open up the preview window if it was open
          * the last time we quit (and at the size it was) we want to make
          * sure that upon resize we do not have the window off the screen
          * So check the origin against the screen origin and adjust if
          * necessary.
          */
-        NSSize screenSize = [[[self window] screen] frame].size;
+        NSSize screenSize = [[[self window] screen] visibleFrame].size;
         NSPoint screenOrigin = [[[self window] screen] frame].origin;
+        if (screenSize.height < frame.size.height)
+        {
+            frame.size.height = screenSize.height;
+        }
+        if (screenSize.width < frame.size.width)
+        {
+            frame.size.width = screenSize.width;
+        }
+        
+        
         /* our origin is off the screen to the left*/
         if (frame.origin.x < screenOrigin.x)
         {
         }
         
         [[self window] setFrame:frame display:YES animate:YES];
-    }
+    
     
 }
 
 //
 - (void)setViewSize: (NSSize)viewSize
 {   
+    
     /* special case for scaleToScreen */
-    if (scaleToScreen == YES)
+    NSSize screenSize = [[[self window] screen] visibleFrame].size;
+    NSSize areaSize = [fPictureViewArea frame].size;
+    NSSize pictureSize = [fPictureView frame].size;
+    CGFloat viewSizeAspect = viewSize.width / viewSize.height;
+    
+    if (viewSize.width > areaSize.width || viewSize.height > areaSize.height)
     {
-        /* for scaleToScreen, we expand the fPictureView to fit the entire screen */
-        NSSize areaSize = [fPictureViewArea frame].size;
-        CGFloat viewSizeAspect = viewSize.width / viewSize.height;
+        
         if (viewSizeAspect > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height
         {
             viewSize.width = areaSize.width;
         }
         
     }
-
+    
     [fPictureView setFrameSize:viewSize];
-
+    NSSize newAreaSize = [fPictureViewArea frame].size;
+    
+    
     // center it vertically and horizontally
     NSPoint origin = [fPictureViewArea frame].origin;
     origin.y += ([fPictureViewArea frame].size.height -
     origin.y = floor( origin.y );
     
     [fPictureView setFrameOrigin:origin];
+    
 }
 
 
index 51e01f6..f08415f 100644 (file)
@@ -53,8 +53,9 @@ BOOL                        fIsDragging;
     hb_handle_t                  *fQueueEncodeLibhb;              // reference to libhb
     HBController                 *fHBController;        // reference to HBController
     NSMutableArray               *fJobGroups;           // mirror image of the queue array from controller.mm
-
-    int                          fEncodingQueueItem;     // corresponds to the index of fJobGroups encoding item
+    
+    int                          pidNum;                // Records the PID number from HBController for this instance
+    int                          fEncodingQueueItem;    // corresponds to the index of fJobGroups encoding item
     int                          fPendingCount;         // Number of various kinds of job groups in fJobGroups.
     int                          fCompletedCount;
     int                          fCanceledCount;
@@ -106,7 +107,7 @@ BOOL                        fIsDragging;
 #endif
 
 }
-
+- (void)setPidNum: (int)myPidnum;
 - (void)setHandle: (hb_handle_t *)handle;
 - (void)setHBController: (HBController *)controller;
 
@@ -137,6 +138,7 @@ BOOL                        fIsDragging;
 /* control encodes in the window */
 - (IBAction)removeSelectedQueueItem: (id)sender;
 - (IBAction)revealSelectedQueueItem: (id)sender;
+- (IBAction)editSelectedQueueItem: (id)sender;
 
 #if HB_OUTLINE_METRIC_CONTROLS
 - (IBAction)imageSpacingChanged: (id)sender;
index 580c9e6..8e9b592 100644 (file)
@@ -75,8 +75,6 @@
     return fIsDragging;
 }
 
-
-
 @end
 
 #pragma mark Toolbar Identifiers
@@ -111,7 +109,8 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
             nil]];
 
         fJobGroups = [[NSMutableArray arrayWithCapacity:0] retain];
-       } 
+       }
+
         return self;
 }
 
@@ -120,14 +119,13 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     [fJobGroups setArray:QueueFileArray];
     fIsDragging = NO; 
     /* First stop any timer working now */
-    [self stopAnimatingCurrentJobGroupInQueue];
+    //[self stopAnimatingCurrentJobGroupInQueue];
     [fOutlineView reloadData];
     
     
     
     /* lets get the stats on the status of the queue array */
     
-    fEncodingQueueItem = 0;
     fPendingCount = 0;
     fCompletedCount = 0;
     fCanceledCount = 0;
@@ -140,11 +138,11 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
      * 2 == is yet to be encoded
      * 3 == cancelled
      */
-    
        int i = 0;
+    NSDictionary *thisQueueDict = nil;
        for(id tempObject in fJobGroups)
        {
-               NSDictionary *thisQueueDict = tempObject;
+               thisQueueDict = tempObject;
                if ([[thisQueueDict objectForKey:@"Status"] intValue] == 0) // Completed
                {
                        fCompletedCount++;      
@@ -152,7 +150,11 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
                if ([[thisQueueDict objectForKey:@"Status"] intValue] == 1) // being encoded
                {
                        fWorkingCount++;
-            fEncodingQueueItem = i;    
+            /* we have an encoding job so, lets start the animation timer */
+            if ([thisQueueDict objectForKey:@"EncodingPID"] && [[thisQueueDict objectForKey:@"EncodingPID"] intValue] == pidNum)
+            {
+                fEncodingQueueItem = i;
+            }
                }
         if ([[thisQueueDict objectForKey:@"Status"] intValue] == 2) // pending         
         {
@@ -165,14 +167,6 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
                i++;
        }
     
-    /* We should fire up the encoding timer here based on fWorkingCount */
-    
-    if (fWorkingCount > 0)
-    {
-        /* we have an encoding job so, lets start the animation timer */
-        [self startAnimatingCurrentWorkingEncodeInQueue];
-    }
-    
     /* Set the queue status field in the queue window */
     NSMutableString * string;
     if (fPendingCount == 1)
@@ -186,6 +180,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     [fQueueCountField setStringValue:string];
     
 }
+
 /* This method sets the status string in the queue window
  * and is called from Controller.mm (fHBController)
  * instead of running another timer here polling libhb
@@ -193,7 +188,9 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
  */
 - (void)setQueueStatusString: (NSString *)statusString
 {
-[fProgressTextField setStringValue:statusString];
+    
+    [fProgressTextField setStringValue:statusString];
+    
 }
 
 //------------------------------------------------------------------------------------
@@ -231,6 +228,12 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     fHBController = controller;
 }
 
+- (void)setPidNum: (int)myPidnum
+{
+    pidNum = myPidnum;
+    [fHBController writeToActivityLog: "HBQueueController : My Pidnum is %d", pidNum];
+}
+
 #pragma mark -
 
 //------------------------------------------------------------------------------------
@@ -240,6 +243,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
 {
     [self showWindow:sender];
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"QueueWindowIsOpen"];
+    [self startAnimatingCurrentWorkingEncodeInQueue];
 }
 
 
@@ -254,7 +258,6 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     if( ![[self window] setFrameUsingName:@"Queue"] )
         [[self window] center];
     [self setWindowFrameAutosaveName:@"Queue"];
-    [[self window] setExcludedFromWindowsMenu:YES];
 
     /* lets setup our queue list outline view for drag and drop here */
     [fOutlineView registerForDraggedTypes: [NSArray arrayWithObject:DragDropSimplePboardType] ];
@@ -275,9 +278,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
 
     // Show/hide UI elements
     fCurrentJobPaneShown = NO;     // it's shown in the nib
-    //[self showCurrentJobPane:NO];
 
-    //[self updateQueueCountField];
 }
 
 
@@ -287,6 +288,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
 - (void)windowWillClose:(NSNotification *)aNotification
 {
     [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"QueueWindowIsOpen"];
+    [self stopAnimatingCurrentJobGroupInQueue];
 }
 
 #pragma mark Toolbar
@@ -509,7 +511,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     }
     else
     { 
-    /* since we are not a currently encoding item, we can just be cancelled */
+    /* since we are not a currently encoding item, we can just be removed */
             [fHBController removeQueueFileItem:row];
     }
 }
@@ -522,19 +524,19 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
      * In this case, we are paused from the calling window, so calling
      * [fHBController Pause:NULL]; Again will resume encoding
      */
-       [fHBController Pause:NULL];
+    [fHBController Pause:NULL];
     if (returnCode == NSAlertOtherReturn)
     {
-    /* We need to save the currently encoding item number first */
-    int encodingItemToRemove = fEncodingQueueItem;
-    /* Since we are encoding, we need to let fHBController Cancel this job
-     * upon which it will move to the next one if there is one
-     */
-    [fHBController doCancelCurrentJob];
-    /* Now, we can go ahead and remove the job we just cancelled since
-     * we have its item number from above
-     */
-    [fHBController removeQueueFileItem:encodingItemToRemove];
+        /* We need to save the currently encoding item number first */
+        int encodingItemToRemove = fEncodingQueueItem;
+        /* Since we are encoding, we need to let fHBController Cancel this job
+         * upon which it will move to the next one if there is one
+         */
+        [fHBController doCancelCurrentJob];
+        /* Now, we can go ahead and remove the job we just cancelled since
+         * we have its item number from above
+         */
+        [fHBController removeQueueFileItem:encodingItemToRemove];
     }
     
 }
@@ -598,9 +600,53 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     }
 }
 
-#pragma mark -
+
+//------------------------------------------------------------------------------------
+// Send the selected queue item back to the main window for rescan and possible edit.
+//------------------------------------------------------------------------------------
+- (IBAction)editSelectedQueueItem: (id)sender
+{
+    NSIndexSet * selectedRows = [fOutlineView selectedRowIndexes];
+    NSUInteger row = [selectedRows firstIndex];
+    if( row == NSNotFound )
+        return;
+    /* if this is a currently encoding job, we need to be sure to alert the user,
+     * to let them decide to cancel it first, then if they do, we can come back and
+     * remove it */
+    
+    if ([[[fJobGroups objectAtIndex:row] objectForKey:@"Status"] integerValue] == 1)
+    {
+       /* We pause the encode here so that it doesn't finish right after and then
+        * screw up the sync while the window is open
+        */
+       [fHBController Pause:NULL];
+         NSString * alertTitle = [NSString stringWithFormat:NSLocalizedString(@"Stop This Encode and Remove It ?", nil)];
+        // Which window to attach the sheet to?
+        NSWindow * docWindow = nil;
+        if ([sender respondsToSelector: @selector(window)])
+            docWindow = [sender window];
+        
+        
+        NSBeginCriticalAlertSheet(
+                                  alertTitle,
+                                  NSLocalizedString(@"Keep Encoding", nil),
+                                  nil,
+                                  NSLocalizedString(@"Stop Encoding and Delete", nil),
+                                  docWindow, self,
+                                  nil, @selector(didDimissCancelCurrentJob:returnCode:contextInfo:), nil,
+                                  NSLocalizedString(@"Your movie will be lost if you don't continue encoding.", nil));
+        
+    }
+    else
+    { 
+    /* since we are not a currently encoding item, we can just be cancelled */
+    [fHBController rescanQueueItemToMainWindow:[[fJobGroups objectAtIndex:row] objectForKey:@"SourcePath"] scanTitleNum:[[[fJobGroups objectAtIndex:row] objectForKey:@"TitleNumber"] integerValue] selectedQueueItem:row];
+    
+    }
+}
 
 
+#pragma mark -
 #pragma mark Animate Endcoding Item
 
 
@@ -634,7 +680,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
     }
 }
 
-
+/* We need to make sure we denote only working encodes even for multiple instances */
 - (void) animateWorkingEncodeIconInQueue
 {
     NSInteger row = fEncodingQueueItem; /// need to set to fEncodingQueueItem
@@ -852,22 +898,14 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         }
         
         /* check to see how many audio track lines to allow for */
-        if ([[queueItemToCheck objectForKey:@"Audio1Track"] intValue] > 0)
-        {
-            itemHeightForDisplay +=  rowHeightNonTitle; 
-        }
-        if ([[queueItemToCheck objectForKey:@"Audio2Track"] intValue] > 0)
-        {
-            itemHeightForDisplay +=  rowHeightNonTitle; 
-        }
-        if ([[queueItemToCheck objectForKey:@"Audio3Track"] intValue] > 0)
-        {
-            itemHeightForDisplay +=  rowHeightNonTitle; 
-        }
-        if ([[queueItemToCheck objectForKey:@"Audio4Track"] intValue] > 0)
-        {
-            itemHeightForDisplay +=  rowHeightNonTitle; 
-        }
+               unsigned int ourMaximumNumberOfAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+               int actualCountOfAudioTracks = 0;
+               for (unsigned int i = 1; i <= ourMaximumNumberOfAudioTracks; i++) {
+                       if (0 < [[queueItemToCheck objectForKey: [NSString stringWithFormat: @"Audio%dTrack", i]] intValue]) {
+                               actualCountOfAudioTracks++;
+                       }
+               }
+               itemHeightForDisplay += (actualCountOfAudioTracks * rowHeightNonTitle);
         
         /* add in subtitle lines for each subtitle in the SubtitleList array */
         itemHeightForDisplay +=  rowHeightNonTitle * [[queueItemToCheck objectForKey:@"SubtitleList"] count];
@@ -917,16 +955,9 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
 
 - (id)outlineView:(NSOutlineView *)fOutlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
 {
-    // nb: The "desc" column is currently an HBImageAndTextCell. However, we are longer
-    // using the image portion of the cell so we could switch back to a regular NSTextFieldCell.
-    
     if ([[tableColumn identifier] isEqualToString:@"desc"])
     {
-        /* This should have caused the description we wanted to show*/
-        //return [item objectForKey:@"SourceName"];
         
-        /* code to build the description as per old queue */
-        //return [self formatEncodeItemDescription:item];
         
         /* Below should be put into a separate method but I am way too f'ing lazy right now */
         NSMutableAttributedString * finalString = [[[NSMutableAttributedString alloc] initWithString: @""] autorelease];
@@ -958,14 +989,28 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
                                          nil];
         
         /* First line, we should strip the destination path and just show the file name and add the title num and chapters (if any) */
-        //finalDescription = [finalDescription stringByAppendingString:[NSString stringWithFormat:@"Source: %@ Output: %@\n", [item objectForKey:@"SourceName"],[item objectForKey:@"DestinationPath"]]];
         NSString * summaryInfo;
         
         NSString * titleString = [NSString stringWithFormat:@"Title %d", [[item objectForKey:@"TitleNumber"] intValue]];
         
-        NSString * chapterString = ([[item objectForKey:@"ChapterStart"] intValue] == [[item objectForKey:@"ChapterEnd"] intValue]) ?
-        [NSString stringWithFormat:@"Chapter %d", [[item objectForKey:@"ChapterStart"] intValue]] :
-        [NSString stringWithFormat:@"Chapters %d through %d", [[item objectForKey:@"ChapterStart"] intValue], [[item objectForKey:@"ChapterEnd"] intValue]];
+        NSString * startStopString = @"";
+        if ([[item objectForKey:@"fEncodeStartStop"] intValue] == 0)
+        {
+            /* Start Stop is chapters */
+            startStopString = ([[item objectForKey:@"ChapterStart"] intValue] == [[item objectForKey:@"ChapterEnd"] intValue]) ?
+            [NSString stringWithFormat:@"Chapter %d", [[item objectForKey:@"ChapterStart"] intValue]] :
+            [NSString stringWithFormat:@"Chapters %d through %d", [[item objectForKey:@"ChapterStart"] intValue], [[item objectForKey:@"ChapterEnd"] intValue]];
+        }
+        else if ([[item objectForKey:@"fEncodeStartStop"] intValue] == 1)
+        {
+            /* Start Stop is seconds */
+            startStopString = [NSString stringWithFormat:@"Seconds %d through %d", [[item objectForKey:@"StartSeconds"] intValue], [[item objectForKey:@"StartSeconds"] intValue] + [[item objectForKey:@"StopSeconds"] intValue]];
+        }
+        else if ([[item objectForKey:@"fEncodeStartStop"] intValue] == 2)
+        {
+            /* Start Stop is Frames */
+            startStopString = [NSString stringWithFormat:@"Frames %d through %d", [[item objectForKey:@"StartFrame"] intValue], [[item objectForKey:@"StartFrame"] intValue] + [[item objectForKey:@"StopFrame"] intValue]];
+        }
         
         NSString * passesString = @"";
         /* check to see if our first subtitle track is Foreign Language Search, in which case there is an in depth scan */
@@ -994,7 +1039,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         /* lets add the output file name to the title string here */
         NSString * outputFilenameString = [[item objectForKey:@"DestinationPath"] lastPathComponent];
         
-        summaryInfo = [NSString stringWithFormat: @" (%@, %@, %@) -> %@", titleString, chapterString, passesString, outputFilenameString];
+        summaryInfo = [NSString stringWithFormat: @" (%@, %@, %@) -> %@", titleString, startStopString, passesString, outputFilenameString];
         
         [finalString appendString:[NSString stringWithFormat:@"%@\n", summaryInfo] withAttributes:detailAttr];  
         
@@ -1007,91 +1052,30 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         [finalString appendString:[NSString stringWithFormat:@"%@\n", [item objectForKey:@"PresetName"]] withAttributes:detailAttr];
         
         /* Third Line  (Format Summary) */
-        NSString * audioCodecSummary = @"";
+        NSString * audioCodecSummary = @"";    //      This seems to be set by the last track we have available...
         /* Lets also get our audio track detail since we are going through the logic for use later */
-        NSString * audioDetail1 = @"";
-        NSString * audioDetail2 = @"";
-        NSString * audioDetail3 = @"";
-        NSString * audioDetail4 = @"";
-        if ([[item objectForKey:@"Audio1Track"] intValue] > 0)
-        {
-            audioCodecSummary = [NSString stringWithFormat:@"%@", [item objectForKey:@"Audio1Encoder"]];
-            audioDetail1 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
-                            [item objectForKey:@"Audio1TrackDescription"] ,
-                            [item objectForKey:@"Audio1Encoder"],
-                            [item objectForKey:@"Audio1Mixdown"] ,
-                            [item objectForKey:@"Audio1Samplerate"],
-                            [item objectForKey:@"Audio1Bitrate"]];
-            
-            if ([[item objectForKey:@"Audio1TrackDRCSlider"] floatValue] > 0.00)
-            {
-                audioDetail1 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail1,[item objectForKey:@"Audio1TrackDRCSlider"]];
-            }
-            else
-            {
-                audioDetail1 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail1];
-            }
-        }
-        
-        if ([[item objectForKey:@"Audio2Track"] intValue] > 0)
-        {
-            audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio2Encoder"]];
-            audioDetail2 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
-                            [item objectForKey:@"Audio2TrackDescription"] ,
-                            [item objectForKey:@"Audio2Encoder"],
-                            [item objectForKey:@"Audio2Mixdown"] ,
-                            [item objectForKey:@"Audio2Samplerate"],
-                            [item objectForKey:@"Audio2Bitrate"]];
-            
-            if ([[item objectForKey:@"Audio2TrackDRCSlider"] floatValue] > 0.00)
-            {
-                audioDetail2 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail2,[item objectForKey:@"Audio2TrackDRCSlider"]];
-            }
-            else
-            {
-                audioDetail2 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail2];
-            }
-        }
-        
-        if ([[item objectForKey:@"Audio3Track"] intValue] > 0)
-        {
-            audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio3Encoder"]];
-            audioDetail3 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
-                            [item objectForKey:@"Audio3TrackDescription"] ,
-                            [item objectForKey:@"Audio3Encoder"],
-                            [item objectForKey:@"Audio3Mixdown"] ,
-                            [item objectForKey:@"Audio3Samplerate"],
-                            [item objectForKey:@"Audio3Bitrate"]];
-            
-            if ([[item objectForKey:@"Audio3TrackDRCSlider"] floatValue] > 0.00)
-            {
-                audioDetail3 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail3,[item objectForKey:@"Audio3TrackDRCSlider"]];
-            }
-            else
-            {
-                audioDetail3 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail3];
-            }
-        }
+               unsigned int ourMaximumNumberOfAudioTracks = [HBController maximumNumberOfAllowedAudioTracks];
+               NSMutableArray *audioDetails = [NSMutableArray arrayWithCapacity: ourMaximumNumberOfAudioTracks];
+               NSString *base;
+               NSString *detailString;
+               NSNumber *drc;
+               for (unsigned int i = 1; i <= ourMaximumNumberOfAudioTracks; i++) {
+                       base = [NSString stringWithFormat: @"Audio%d", i];
+                       if (0 < [[item objectForKey: [base stringByAppendingString: @"Track"]] intValue]) {
+                               audioCodecSummary = [NSString stringWithFormat: @"%@", [item objectForKey: [base stringByAppendingString: @"Encoder"]]];
+                               drc = [item objectForKey: [base stringByAppendingString: @"TrackDRCSlider"]];
+                               detailString = [NSString stringWithFormat: @"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps), DRC: %@",
+                                                               [item objectForKey: [base stringByAppendingString: @"TrackDescription"]],
+                                                               [item objectForKey: [base stringByAppendingString: @"Encoder"]],
+                                                               [item objectForKey: [base stringByAppendingString: @"Mixdown"]],
+                                                               [item objectForKey: [base stringByAppendingString: @"Samplerate"]],
+                                                               [item objectForKey: [base stringByAppendingString: @"Bitrate"]],
+                                                               (0.0 < [drc floatValue]) ? drc : @"Off"
+                                                               ];
+                               [audioDetails addObject: detailString];
+                       }
+               }
         
-        if ([[item objectForKey:@"Audio4Track"] intValue] > 0)
-        {
-            audioCodecSummary = [NSString stringWithFormat:@"%@, %@",audioCodecSummary ,[item objectForKey:@"Audio3Encoder"]];
-            audioDetail4 = [NSString stringWithFormat:@"%@ Encoder: %@ Mixdown: %@ SampleRate: %@(khz) Bitrate: %@(kbps)",
-                            [item objectForKey:@"Audio4TrackDescription"] ,
-                            [item objectForKey:@"Audio4Encoder"],
-                            [item objectForKey:@"Audio4Mixdown"] ,
-                            [item objectForKey:@"Audio4Samplerate"],
-                            [item objectForKey:@"Audio4Bitrate"]];
-            
-            if ([[item objectForKey:@"Audio4TrackDRCSlider"] floatValue] > 0.00)
-            {
-                audioDetail4 = [NSString stringWithFormat:@"%@, DRC: %@",audioDetail4,[item objectForKey:@"Audio4TrackDRCSlider"]];
-            }
-            else
-            {
-                audioDetail4 = [NSString stringWithFormat:@"%@, DRC: Off",audioDetail4];
-            }
-        }
         
         NSString * jobFormatInfo;
         if ([[item objectForKey:@"ChapterMarkers"] intValue] == 1)
@@ -1136,6 +1120,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         [finalString appendString: @"Destination: " withAttributes:detailBoldAttr];
         [finalString appendString: [item objectForKey:@"DestinationPath"] withAttributes:detailAttr];
         [finalString appendString:@"\n" withAttributes:detailAttr];
+        
         /* Fifth Line Picture Details*/
         NSString * pictureInfo;
         pictureInfo = [NSString stringWithFormat:@"%@", [item objectForKey:@"PictureSizingSummary"]];
@@ -1143,6 +1128,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         {
             pictureInfo = [pictureInfo stringByAppendingString:@" Keep Aspect Ratio"];
         }
+        
         if ([[item objectForKey:@"VideoGrayScale"] intValue] == 1)
         {
             pictureInfo = [pictureInfo stringByAppendingString:@", Grayscale"];
@@ -1270,7 +1256,14 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         else
         {
             /* we have a specified, constant framerate */
+            if ([[item objectForKey:@"VideoFrameratePFR"] intValue] == 1)
+            {
+            videoInfo = [NSString stringWithFormat:@"%@ Framerate: %@ (peak framerate)", videoInfo ,[item objectForKey:@"VideoFramerate"]];
+            }
+            else
+            {
             videoInfo = [NSString stringWithFormat:@"%@ Framerate: %@ (constant framerate)", videoInfo ,[item objectForKey:@"VideoFramerate"]];
+            }
         }
         
         if ([[item objectForKey:@"VideoQualityType"] intValue] == 0)// Target Size MB
@@ -1300,33 +1293,18 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         
         
         /* Seventh Line Audio Details*/
-        if ([audioDetail1 length] != 0)
-        {
-            [finalString appendString: @"Audio Track 1: " withAttributes:detailBoldAttr];
-            [finalString appendString: audioDetail1 withAttributes:detailAttr];
-            [finalString appendString:@"\n" withAttributes:detailAttr];
-        }
-        
-        if ([audioDetail2 length] != 0)
-        {
-            [finalString appendString: @"Audio Track 2: " withAttributes:detailBoldAttr];
-            [finalString appendString: audioDetail2 withAttributes:detailAttr];
-            [finalString appendString:@"\n" withAttributes:detailAttr];
-        }
-        
-        if ([audioDetail3 length] != 0)
-        {
-            [finalString appendString: @"Audio Track 3: " withAttributes:detailBoldAttr];
-            [finalString appendString: audioDetail3 withAttributes:detailAttr];
-            [finalString appendString:@"\n" withAttributes:detailAttr];
-        }
-        
-        if ([audioDetail4 length] != 0)
-        {
-            [finalString appendString: @"Audio Track 4: " withAttributes:detailBoldAttr];
-            [finalString appendString: audioDetail4 withAttributes:detailAttr];
-            [finalString appendString:@"\n" withAttributes:detailAttr];
-        }
+        NSEnumerator *audioDetailEnumerator = [audioDetails objectEnumerator];
+               NSString *anAudioDetail;
+               int audioDetailCount = 0;
+               while (nil != (anAudioDetail = [audioDetailEnumerator nextObject])) {
+                       audioDetailCount++;
+                       if (0 < [anAudioDetail length]) {
+                               [finalString appendString: [NSString stringWithFormat: @"Audio Track %d ", audioDetailCount] withAttributes: detailBoldAttr];
+                               [finalString appendString: anAudioDetail withAttributes: detailAttr];
+                               [finalString appendString: @"\n" withAttributes: detailAttr];
+                       }
+               }
+
         /* Eighth Line Subtitle Details */
         
         int i = 0;
@@ -1386,7 +1364,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         return @"";
     }
 }
-
+/* This method inserts the proper action icons into the far right of the queue window */
 - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
 {
     if ([[tableColumn identifier] isEqualToString:@"desc"])
@@ -1403,7 +1381,8 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
     {
         [cell setEnabled: YES];
         BOOL highlighted = [outlineView isRowSelected:[outlineView rowForItem: item]] && [[outlineView window] isKeyWindow] && ([[outlineView window] firstResponder] == outlineView);
-        if ([[item objectForKey:@"Status"] intValue] == 0)
+        
+        if ([[item objectForKey:@"Status"] intValue] == 0 || ([[item objectForKey:@"Status"] intValue] == 1 && [[item objectForKey:@"EncodingPID"] intValue] != pidNum))
         {
             [cell setAction: @selector(revealSelectedQueueItem:)];
             if (highlighted)
@@ -1416,21 +1395,23 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         }
         else
         {
-            [cell setAction: @selector(removeSelectedQueueItem:)];
-            if (highlighted)
-            {
-                [cell setImage:[NSImage imageNamed:@"DeleteHighlight"]];
-                [cell setAlternateImage:[NSImage imageNamed:@"DeleteHighlightPressed"]];
-            }
-            else
-                [cell setImage:[NSImage imageNamed:@"Delete"]];
+            
+                [cell setAction: @selector(removeSelectedQueueItem:)];
+                if (highlighted)
+                {
+                    [cell setImage:[NSImage imageNamed:@"DeleteHighlight"]];
+                    [cell setAlternateImage:[NSImage imageNamed:@"DeleteHighlightPressed"]];
+                }
+                else
+                    [cell setImage:[NSImage imageNamed:@"Delete"]];
+   
         }
     }
 }
 
 - (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
 {
-    // By default, the discolsure image gets centered vertically in the cell. We want
+    // By default, the disclosure image gets centered vertically in the cell. We want
     // always at the top.
     if ([outlineView isItemExpanded: item])
         [cell setImagePosition: NSImageAbove];
index 6cc5535..83c9a1d 100644 (file)
@@ -29,12 +29,14 @@ int                           container;
 // Create new subtitle track
 - (void)addSubtitleTrack;
 - (NSDictionary *)createSubtitleTrack;
-- (NSMutableArray*) getSubtitleArray: (NSMutableArray *) subtitlesArray ;
+- (NSMutableArray*) getSubtitleArray;
 // Add an srt file
 - (void)createSubtitleSrtTrack:(NSString *)filePath;
 
 - (void)containerChanged:(int) newContainer;
 
+- (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray;
+
 // Table View Delegates
 - (int)numberOfRowsInTableView:(NSTableView *)aTableView;
 
index 95ffad0..1d0c45a 100644 (file)
             int i;
             for(i = 0; i < hb_list_count( fTitle->list_subtitle ); i++ )
             {
-                NSString * trackTypeString = @"";
-                int isPictureSub = 0;
                 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
                 sub_config = subtitle->config;
                 
-                if (subtitle->format == PICTURESUB)
-                {
-                    trackTypeString = @"- (Bitmap)";
-                    isPictureSub = 1;
-                }
-                else
-                {
-                    trackTypeString = @"- (Text)";
-                }
+                int canBeBurnedIn = subtitle->source == VOBSUB || subtitle->source == SSASUB;
+                int supportsForcedFlags = subtitle->source == VOBSUB;
                 
                 /* create a dictionary of source subtitle information to store in our array */
-                NSString *popupName = [NSString stringWithFormat:@"%d - %@ %@",i,[NSString stringWithUTF8String:subtitle->lang],trackTypeString];
                 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
                 /* Subtitle Source track popup index */
                 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
-                /* Subtitle Source track type */
+                /* Human-readable representation of subtitle->source */
+                NSString *subSourceName = [NSString stringWithUTF8String:hb_subsource_name( subtitle->source )];
+                NSString *bitmapOrText = subtitle->source == PICTURESUB ? @"Bitmap" : @"Text";
+                /* Subtitle Source track name */
+                NSString *popupName = [NSString stringWithFormat:@"%d - %@ - (%@) (%@)",i,[NSString stringWithUTF8String:subtitle->lang],bitmapOrText,subSourceName];
                 [newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
-                /* Subtitle Source track type (Source, Srt, etc.) */
-                [newSubtitleSourceTrack setObject:@"Source" forKey:@"sourceTrackType"];
-                /* Subtitle Source track popup isPictureSub */ 
-                [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:isPictureSub] forKey:@"sourceTrackisPictureSub"];
+                /* Subtitle Source track type (VobSub, Srt, etc.) */
+                [newSubtitleSourceTrack setObject:subSourceName forKey:@"sourceTrackType"];
+                /* Subtitle Source track canBeBurnedIn */
+                [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:canBeBurnedIn] forKey:@"sourceTrackCanBeBurnedIn"];
+                /* Subtitle Source track supportsForcedFlags */
+                [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:supportsForcedFlags] forKey:@"sourceTrackSupportsForcedFlags"];
                 
                 [subtitleSourceArray addObject:newSubtitleSourceTrack];
                 [newSubtitleSourceTrack autorelease];
     [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
     /* Subtitle Source track popup language */
     [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
-    /* Subtitle Source track popup isPictureSub */
-    [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
     /* Subtitle track forced state */
     [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
     /* Subtitle track burned state */
     [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
     /* Subtitle track default state */
     [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+    /* Subtitle Source track canBeBurnedIn */
+    [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+    /* Subtitle Source track supportsForcedFlags */
+    [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
 
     [newSubtitleTrack autorelease];
     return newSubtitleTrack;
     NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
     /* Subtitle Source track popup index */
     [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
-    /* Subtitle Source track type */
+    /* Subtitle Source track name */
     [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
-    /* Subtitle Source track type (Source, Srt, etc.) */
+    /* Subtitle Source track type (VobSub, Srt, etc.) */
     [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
     [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
-    /* Subtitle Source track type */
+    /* Subtitle Source file path */
     [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
-    /* Subtitle Source track popup isPictureSub */ 
-    [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
+    /* Subtitle Source track canBeBurnedIn */
+    [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
+    /* Subtitle Source track supportsForcedFlags */
+    [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
     
     [subtitleSourceArray addObject:newSubtitleSourceTrack];
     [newSubtitleSourceTrack autorelease];
     [newSubtitleSrtTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
     /* Subtitle Source track popup language */
     [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"];
-    /* Subtitle Source track popup isPictureSub */
-    [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
     /* Subtitle track forced state */
     [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
     /* Subtitle track burned state */
     [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
     /* Subtitle track default state */
     [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+    /* Subtitle Source track canBeBurnedIn */
+    [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+    /* Subtitle Source track supportsForcedFlags */
+    [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
     
     /* now the srt only info, Language, Chart Code and offset */
     [newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
     
 }
 
-- (NSMutableArray*) getSubtitleArray: (NSMutableArray *) subtitlesArray 
+/* used to return the current subtitleArray to controller.m */
+- (NSMutableArray*) getSubtitleArray
 {
     return subtitleArray;
 }
 
 - (void)containerChanged:(int) newContainer
 {
-container = newContainer;
+    container = newContainer;
+}
+
+- (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
+{
+    /* Note: we need to look for external subtitles so it can be added to the source array track.
+     * Remember the source container subs are already loaded with resetTitle which is already called
+     * so any external sub sources need to be added to our source subs here
+     */
+    
+    int i = 0;
+    NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
+    id tempObject;
+    while ( tempObject = [enumerator nextObject] )  
+    {
+        /* We have an srt track */
+        if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
+        {
+            NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"];
+            /* Start replicate the add new srt code above */
+            /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
+            NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
+            /* create a dictionary of source subtitle information to store in our array */
+            NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
+            /* Subtitle Source track popup index */
+            [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
+            /* Subtitle Source track name */
+            [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
+            /* Subtitle Source track type (VobSub, Srt, etc.) */
+            [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
+            [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
+            /* Subtitle Source file path */
+            [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
+            /* Subtitle Source track canBeBurnedIn */
+            [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
+            /* Subtitle Source track supportsForcedFlags */
+            [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
+            
+            [subtitleSourceArray addObject:newSubtitleSourceTrack];
+            [newSubtitleSourceTrack autorelease];
+            /* END replicate the add new srt code above */
+        }
+        i++;
+    }
+    
+    
+    /*Set the subtitleArray to the newSubtitleArray */
+    [subtitleArray setArray:newSubtitleArray];
 }
    
 #pragma mark -
@@ -589,7 +639,6 @@ container = newContainer;
         if ([anObject intValue] != 0)
         {
             int sourceSubtitleIndex;
-            bool isPictureSub = FALSE;
             
             if (rowIndex == 0)
             {
@@ -600,47 +649,40 @@ container = newContainer;
                 sourceSubtitleIndex = [anObject intValue] - 1;
             }
             
-            if (rowIndex == 0 && [anObject intValue] == 1)// we are Foreign Launguage Search, which is inherently bitmap
-            {
-                isPictureSub = TRUE;
-            }
-            else
+            if(rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search, which is inherently vobsub
             {
-                if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackisPictureSub"] intValue] ==1)
-                {
-                    isPictureSub = TRUE;
-                }
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )] forKey:@"subtitleSourceTrackType"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
+                // foreign lang search is most useful when combined w/Forced Only - make it default
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackForced"];
             }
-            if (isPictureSub == TRUE)
+            /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
+            else if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
             {
-                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackisPictureSub"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
             }
             else
             {
-                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
-                /* if we are not picture sub, then we must be a text sub, handbrake does not support burning in text subs */
-                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
-            }
-            
-            /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] forKey:@"subtitleSourceTrackType"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackCanBeBurnedIn"] intValue]]
+                                                        forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackSupportsForcedFlags"] intValue]]
+                                                        forKey:@"subtitleSourceTrackSupportsForcedFlags"];
+            } 
             
-            if (rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search
+            if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
             {
-                    [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];  
+                /* the source track cannot be burned in, so uncheck the widget */
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
             }
-            else
+             
+            if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
             {
-                if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
-                {
-                    [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
-                    [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
-                }
-                else
-                {
-                    [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
-                }
-            } 
-            
+                /* the source track does not support forced flags, so uncheck the widget */
+                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
+            }
         }
     }
     else if ([[aTableColumn identifier] isEqualToString:@"forced"])
@@ -649,8 +691,13 @@ container = newContainer;
     }
     else if ([[aTableColumn identifier] isEqualToString:@"burned"])
     {
-        [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];   
-        /* now we need to make sure no other tracks are set to burned if we have set burned*/
+        [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
+        if([anObject intValue] == 1)
+        {
+            /* Burned In and Default are mutually exclusive */
+            [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+        }
+        /* now we need to make sure no other tracks are set to burned if we have set burned */
         if ([anObject intValue] == 1)
         {
             int i = 0;
@@ -668,7 +715,12 @@ container = newContainer;
     }
     else if ([[aTableColumn identifier] isEqualToString:@"default"])
     {
-        [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];   
+        [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
+        if([anObject intValue] == 1)
+        {
+            /* Burned In and Default are mutually exclusive */
+            [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
+        }   
         /* now we need to make sure no other tracks are set to default */
         if ([anObject intValue] == 1)
         {
@@ -711,18 +763,35 @@ container = newContainer;
     if ([[aTableColumn identifier] isEqualToString:@"track"])
     {
         
-        /* since mp4 only supports burned in vobsubs (bitmap) we need to make sure burned in is specified */
+        /* Since currently no quicktime based playback devices support soft vobsubs in mp4, we make sure "burned in" is specified
+         * by default to avoid massive confusion and anarchy. However we also want to guard against multiple burned in subtitle tracks
+         * as libhb would ignore all but the first one anyway. Plus it would probably be stupid. 
+         */
         if (container == HB_MUX_MP4 && [anObject intValue] != 0)
         {
-            /* so, if isPictureSub = TRUE and we are mp4, we now have to A) set burned-in to 1 and b) remove any other
-             * tracks specified that are burned in */
-            if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
+            if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )]])
             {
-                [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
+                /* lets see if there are currently any burned in subs specified */
+                NSEnumerator *enumerator = [subtitleArray objectEnumerator];
+                id tempObject;
+                BOOL subtrackBurnedInFound = NO;
+                while ( tempObject = [enumerator nextObject] )  
+                {
+                    if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
+                    {
+                        subtrackBurnedInFound = YES;
+                    }
+                }
+                /* if we have no current vobsub set to burn it in ... burn it in by default */
+                if(!subtrackBurnedInFound)
+                {
+                    [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
+                    /* Burned In and Default are mutually exclusive */
+                    [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+                }
             }
         }
         
-        
         /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
          * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
          */
@@ -788,15 +857,23 @@ container = newContainer;
         if ([[aTableColumn identifier] isEqualToString:@"forced"])
         {
             [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
+            /* Disable the "Forced Only" checkbox if a) the track is "None" or b) the subtitle track doesn't support forced flags */
+            if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
+                [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
+            {
+                [aCell setEnabled:NO];
+            }
+            else
+            {
+                [aCell setEnabled:YES];
+            }
         }
         else if ([[aTableColumn identifier] isEqualToString:@"burned"])
         {
             [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
-            /* Disable the "Burned-In" checkbox if a) the track is "None", b) the subtitle track is text (we do not support burning in
-             * text subs, or c) we are mp4 and the track is a vobsub (picture sub) */
+            /* Disable the "Burned In" checkbox if a) the track is "None" or b) the subtitle track can't be burned in */
             if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
-                [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 0 ||
-                (container == HB_MUX_MP4 && [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1))
+                [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
             {
                 [aCell setEnabled:NO];
             }
@@ -869,50 +946,7 @@ container = newContainer;
         }
         
     }
-    
-    
-    if (container == HB_MUX_MP4)
-    {
-        /* now remove any other tracks that are set as burned and are picturesubs */
-        int i = 0;
-        int removedTracks = 0;
-        NSEnumerator *enumerator = [subtitleArray objectEnumerator];
-        id tempObject;
-        NSMutableArray *tempArrayToDelete = [NSMutableArray array];
-        BOOL removeTrack = NO; 
-        while ( tempObject = [enumerator nextObject] )  
-        {
-            
-            if ([[tempObject objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
-            {
-                /* if this is the first vobsub mark it. if not, remove it */
-                if (removeTrack == NO)
-                {
-                    /* make sure that this is set to be burned in */
-                    [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
-                    removeTrack = YES;
-                }
-                else
-                {
-                    [tempArrayToDelete addObject:tempObject];
-                    removedTracks ++;
-                }
-            }
-            
-            i++;
-        }
-        /* check to see if there are tracks to remove from the array */
-        if ([tempArrayToDelete count] > 0)
-        {
-            /* Popup a warning that hb only support one pic sub being burned in with mp4 */
-            int status;
-            status = NSRunAlertPanel(@"More than one vobsub is not supported in an mp4...",@"Your first vobsub track will now be used.", @"OK", nil, nil);
-            [NSApp requestUserAttention:NSCriticalRequest];
-            
-            [subtitleArray removeObjectsInArray:tempArrayToDelete];
-            [aTableView reloadData];
-        }
-    }
+     
 }
 
 
index 17ee305..cba643a 100644 (file)
                A906A0520F7A7B210007A827 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A906A0500F7A7B210007A827 /* AudioToolbox.framework */; };
                A9AC41DF0C918DB500DDF9B8 /* HBAdvancedController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AC41DD0C918DB500DDF9B8 /* HBAdvancedController.m */; };
                A9AC41E00C918DB500DDF9B8 /* HBAdvancedController.h in Headers */ = {isa = PBXBuildFile; fileRef = A9AC41DE0C918DB500DDF9B8 /* HBAdvancedController.h */; };
+               D234BCBD1240E82800BE2E98 /* HBAudio.h in Headers */ = {isa = PBXBuildFile; fileRef = D234BCB91240E82800BE2E98 /* HBAudio.h */; };
+               D234BCBE1240E82800BE2E98 /* HBAudio.m in Sources */ = {isa = PBXBuildFile; fileRef = D234BCBA1240E82800BE2E98 /* HBAudio.m */; };
+               D234BCBF1240E82800BE2E98 /* HBAudioController.h in Headers */ = {isa = PBXBuildFile; fileRef = D234BCBB1240E82800BE2E98 /* HBAudioController.h */; };
+               D234BCC01240E82800BE2E98 /* HBAudioController.m in Sources */ = {isa = PBXBuildFile; fileRef = D234BCBC1240E82800BE2E98 /* HBAudioController.m */; };
                D289A9F30DBBE7AC00CE614B /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D289A9F20DBBE7AC00CE614B /* CoreServices.framework */; };
                D289AAC40DBBF3F100CE614B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DEB2024052B055F00C39CA9 /* IOKit.framework */; };
                E3003C7F0C88505D0072F2A8 /* DeleteHighlightPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = E3003C7E0C88505D0072F2A8 /* DeleteHighlightPressed.png */; };
                A906A0500F7A7B210007A827 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
                A9AC41DD0C918DB500DDF9B8 /* HBAdvancedController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = HBAdvancedController.m; sourceTree = "<group>"; };
                A9AC41DE0C918DB500DDF9B8 /* HBAdvancedController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HBAdvancedController.h; sourceTree = "<group>"; };
+               D234BCB91240E82800BE2E98 /* HBAudio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAudio.h; sourceTree = "<group>"; };
+               D234BCBA1240E82800BE2E98 /* HBAudio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAudio.m; sourceTree = "<group>"; };
+               D234BCBB1240E82800BE2E98 /* HBAudioController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAudioController.h; sourceTree = "<group>"; };
+               D234BCBC1240E82800BE2E98 /* HBAudioController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAudioController.m; sourceTree = "<group>"; };
                D289A9F20DBBE7AC00CE614B /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
                E3003C7E0C88505D0072F2A8 /* DeleteHighlightPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DeleteHighlightPressed.png; sourceTree = "<group>"; };
                E3003CB40C8852B70072F2A8 /* DeletePressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DeletePressed.png; sourceTree = "<group>"; };
                526FBC930B4CAA260064E04C /* HandBrake Sources */ = {
                        isa = PBXGroup;
                        children = (
+                               D234BCB91240E82800BE2E98 /* HBAudio.h */,
+                               D234BCBA1240E82800BE2E98 /* HBAudio.m */,
+                               D234BCBB1240E82800BE2E98 /* HBAudioController.h */,
+                               D234BCBC1240E82800BE2E98 /* HBAudioController.m */,
                                A2D18AA50FD81C50003C997B /* HBSubtitles.h */,
                                A2D18AA60FD81C50003C997B /* HBSubtitles.m */,
                                4DF3C8CB052889CD00A80101 /* Controller.h */,
                                A2BEA5FB0F2A1ED1001CE7A1 /* PictureController.h in Headers */,
                                278070240F5C261300699207 /* ChapterTitles.h in Headers */,
                                A2D18AA70FD81C50003C997B /* HBSubtitles.h in Headers */,
+                               D234BCBD1240E82800BE2E98 /* HBAudio.h in Headers */,
+                               D234BCBF1240E82800BE2E98 /* HBAudioController.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        buildConfigurationList = 4D4E7BC4087804870051572B /* Build configuration list for PBXProject "HandBrake" */;
                        compatibilityVersion = "Xcode 3.1";
                        hasScannedForEncodings = 1;
+                       knownRegions = (
+                               English,
+                               Japanese,
+                               French,
+                               German,
+                       );
                        mainGroup = 29B97314FDCFA39411CA2CEA /* HandBrake */;
                        projectDirPath = "";
                        projectRoot = "";
                                A22C85ED0D05D35100C10E36 /* HBPresets.m in Sources */,
                                A2BEA5FC0F2A1ED1001CE7A1 /* PictureController.m in Sources */,
                                A2D18AA80FD81C50003C997B /* HBSubtitles.m in Sources */,
+                               D234BCBE1240E82800BE2E98 /* HBAudio.m in Sources */,
+                               D234BCC01240E82800BE2E98 /* HBAudioController.m in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)";
                                CONFIGURATION_TEMP_DIR = "$(SYMROOT)";
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)";
                                CONFIGURATION_TEMP_DIR = "$(SYMROOT)";
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)";
                                CONFIGURATION_TEMP_DIR = "$(SYMROOT)";
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)";
                                CONFIGURATION_TEMP_DIR = "$(SYMROOT)";
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                COPY_PHASE_STRIP = NO;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                COPY_PHASE_STRIP = NO;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                COPY_PHASE_STRIP = NO;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                COPY_PHASE_STRIP = NO;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                GCC_C_LANGUAGE_STANDARD = "compiler-default";
                                INSTALL_PATH = /usr/local/bin;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrakeCLI;
                        };
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                INFOPLIST_PREFIX_HEADER = "$(EXTERNAL_BUILD)/macosx/Info.h";
                                INFOPLIST_PREPROCESS = YES;
                                OTHER_LDFLAGS = (
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libbluray.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/liba52.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libass.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavcodec.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavformat.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libavutil.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libavcore.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdca.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdnav.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libdvdread.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaac.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libfaad.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfontconfig.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libfreetype.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmkv.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp3lame.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libmp4v2.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbis.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libvorbisenc.a",
                                        "$(EXTERNAL_BUILD)/contrib/lib/libx264.a",
+                                       "$(EXTERNAL_BUILD)/contrib/lib/libxml2.a",
                                );
                                PRODUCT_NAME = HandBrake;
                                WARNING_CFLAGS = (
                                COPY_PHASE_STRIP = NO;
                                DEBUG_INFORMATION_FORMAT = dwarf;
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
                                CONFIGURATION_BUILD_DIR = "$(EXTERNAL_BUILD)";
                                CONFIGURATION_TEMP_DIR = "$(SYMROOT)";
                                EXTERNAL_BUILD = "$(EXTERNAL_SRC)/build.$(CONFIGURATION)";
-                               EXTERNAL_JOBS = 2;
+                               EXTERNAL_JOBS = 1;
                                EXTERNAL_METHOD = xcode;
                                EXTERNAL_SRC = ..;
                                FRAMEWORK_SEARCH_PATHS = "$(EXTERNAL_SRC)/macosx";
index 011848a..a2e33cf 100644 (file)
@@ -31,7 +31,7 @@
        <key>NSPrincipalClass</key>
        <string>NSApplication</string>
        <key>NSHumanReadableCopyright</key>
-       <string>© 2003-2009, HandBrake Developers</string>
+       <string>© 2003-2011, HandBrake Developers</string>
        <key>SUFeedURL</key>
        <string>HB_PLIST_SUFEEDURL</string>
 </dict>
index 4a1dd61..56dbe5f 100644 (file)
 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem;
 - (IBAction) resizeInspectorForTab: (id)sender;
 - (IBAction) showPreviewWindow: (id)sender;
-- (BOOL) previewFullScreenMode;
-- (IBAction) previewGoWindowed: (id)sender;
+
+- (void) enablePreviewHudControls;
+- (void) disablePreviewHudControls;
 
 - (IBAction) adjustSizingDisplay: (id) sender;
 
 - (IBAction) storageLinkChanged: (id) sender;
 - (IBAction) parLinkChanged: (id) sender;
 - (IBAction) displayLinkChanged: (id) sender;
-- (void) setToFullScreenMode;
+
 - (void) setToWindowedMode;
 
 /* Filter Actions */
index 67fe65f..7817410 100644 (file)
 //------------------------------------------------------------------------------------
 - (IBAction) showPictureWindow: (id)sender
 {
-    if ([fPreviewController fullScreen] == YES)
-    {
-        [self showWindow:sender];
-        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"];
-        [self setToFullScreenMode];
-    }
-    else
-    {
+
+
         if ([[self window] isVisible])
         {
             [[self window] close];
             [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PictureSizeWindowIsOpen"];
             [self setToWindowedMode];
         }
-    }
+
     [self adjustFilterDisplay:nil];
     [self adjustSizingDisplay:nil];
 }
 
-- (BOOL) previewFullScreenMode
-{
-    return [fPreviewController fullScreen];
-}
+
 
 /* this method is used to detect clicking on a tab in fSizeFilterView */
 - (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
         [fParHeightLabel setHidden: NO];
         [fDisplayWidthField setHidden: NO];
         [fDisplayWidthLabel setHidden: NO];
-        [fModulusLabel setHidden: NO];
-        [fModulusPopUp setHidden: NO];
         /* adjust/move keep ar checkbox */
         [fRatioLabel setHidden: YES];
         [fRatioLabel2 setHidden: NO];
         [fParHeightLabel setHidden: YES];
         [fDisplayWidthField setHidden: YES];
         [fDisplayWidthLabel setHidden: YES];
-        [fModulusLabel setHidden: YES];
-        [fModulusPopUp setHidden: YES];
         /* adjust/move keep ar checkbox */
         [fRatioLabel setHidden: NO];
         [fRatioLabel2 setHidden: YES];
 
 #pragma mark -
 
-- (IBAction) previewGoWindowed: (id)sender
-{
-    [fPreviewController goWindowedScreen:self];
-}
+
 
 - (IBAction) showPreviewWindow: (id)sender
 {
     [fPreviewController showWindow:sender];
 }
 
+- (void) enablePreviewHudControls
+{
+    [fPreviewController enableHudControls];
+}
 
-
-
-- (void) setToFullScreenMode
+- (void) disablePreviewHudControls
 {
-    int32_t shieldLevel = CGShieldingWindowLevel(); 
-    
-    [fPictureWindow setLevel:shieldLevel + 1]; 
-    // Show the window. 
-    [fPictureWindow makeKeyAndOrderFront:self];
+    [fPreviewController disableHudControls];
 }
 
 - (void) setToWindowedMode
     [fModulusPopUp addItemWithTitle: @"8"];
     [fModulusPopUp addItemWithTitle: @"4"];
     [fModulusPopUp addItemWithTitle: @"2"];
-    if (job->anamorphic.mode == 3)
+    if (job->modulus)
     {
-        [fModulusPopUp selectItemWithTitle: [NSString stringWithFormat:@"%d",job->anamorphic.modulus]];
+        [fModulusPopUp selectItemWithTitle: [NSString stringWithFormat:@"%d",job->modulus]];
     }
     else
     {
-        [fModulusPopUp selectItemWithTitle: @"16"];
+        [fModulusPopUp selectItemAtIndex: 0];
     }
     
+    
     /* We initially set the previous state of keep ar to on */
     keepAspectRatioPreviousState = 1;
        if (!autoCrop)
     titleParWidth = job->anamorphic.par_width;
     titleParHeight = job->anamorphic.par_height;
     
-    [self SettingsChanged: nil];
+    [self SettingsChanged:nil];
 }
 
 - (IBAction) storageLinkChanged: (id) sender
 - (IBAction) SettingsChanged: (id) sender
 {
     hb_job_t * job = fTitle->job;
-    [fModulusPopUp setEnabled:NO];
-    job->anamorphic.modulus = 16;
+
+    /* if we are anything but strict anamorphic */
+    if ([fAnamorphicPopUp indexOfSelectedItem] != 1)
+    {
+        [fModulusLabel setHidden:NO];
+        [fModulusPopUp setHidden:NO];
+        if (sender == fModulusPopUp)
+        {
+            /* do a dry run with hb_fix aspect to get new modulus */
+            job->modulus = [[fModulusPopUp titleOfSelectedItem] intValue];
+            job->keep_ratio  = 1;
+            hb_fix_aspect( job, HB_KEEP_WIDTH );
+            if( job->height > fTitle->height )
+            {
+                job->height = fTitle->height;
+                hb_fix_aspect( job, HB_KEEP_HEIGHT );
+            }
+            [fWidthStepper      setIntValue: job->width];
+            [fWidthField        setIntValue: job->width];
+            if( [fAnamorphicPopUp indexOfSelectedItem] != 2) // if we are not loose or custom
+            {
+                [fHeightStepper     setIntValue: job->height];
+                [fHeightField       setIntValue: job->height];
+            }    
+        }
+    }
+    else
+    {
+        /* we are strict so hide the mod popup since libhb uses mod 2 for strict anamorphic*/
+        [fModulusLabel setHidden:YES];
+        [fModulusPopUp setHidden:YES];
+    }
+
+    job->modulus = [[fModulusPopUp titleOfSelectedItem] intValue];
+    
+    [fWidthStepper  setIncrement: job->modulus];
+    [fHeightStepper setIncrement: job->modulus];
 
     /* Since custom anamorphic allows for a height setting > fTitle->height
      * check to make sure it is returned to fTitle->height for all other modes
         job->anamorphic.par_width = titleParWidth;
         job->anamorphic.par_height = titleParHeight;
         [fRatioLabel setHidden: NO];
-        
-        [fWidthStepper  setIncrement: 16];
-        [fHeightStepper setIncrement: 16];
-    }
-    else
-    {
-        [fWidthStepper  setIncrement: [[fModulusPopUp titleOfSelectedItem] intValue]];
-        [fHeightStepper setIncrement: [[fModulusPopUp titleOfSelectedItem] intValue]];
     }
     
        if( [fAnamorphicPopUp indexOfSelectedItem] > 0 )
             job->anamorphic.mode = 3;
             
             /* Set the status of our custom ana only widgets accordingly */
-            /* for mod 3 we can use modulus other than 16 */
             [fModulusPopUp setEnabled:YES];
-            job->anamorphic.modulus = [[fModulusPopUp titleOfSelectedItem] intValue];
             
             [fWidthStepper setEnabled: YES];
             [fWidthField setEnabled: YES];
         
        }
        
-    //job->keep_ratio  = ( [fRatioCheck state] == NSOnState );
-    
     if ([fAnamorphicPopUp indexOfSelectedItem] != 3)
     {
-    job->keep_ratio  = ( [fRatioCheck state] == NSOnState );
-            if( job->keep_ratio )
+        job->keep_ratio  = ( [fRatioCheck state] == NSOnState );
+        if( job->keep_ratio )
         {
             if( sender == fWidthStepper || sender == fRatioCheck ||
-               sender == fCropTopStepper || sender == fCropBottomStepper )
+               sender == fCropTopStepper || sender == fCropBottomStepper|| 
+               sender == fCropMatrix || sender == nil  )
             {
                 hb_fix_aspect( job, HB_KEEP_WIDTH );
                 if( job->height > fTitle->height )
index 9927a44..260a8ad 100644 (file)
@@ -5,6 +5,10 @@
    It may be used under the terms of the GNU General Public License. */
 
 #include <Cocoa/Cocoa.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
 #import "hb.h"
 
 void SigHandler( int signal )
@@ -25,8 +29,115 @@ void hb_error_handler( const char *errmsg )
 }
 }
 
+char * str_printf(const char *fmt, ...)
+{
+    /* Guess we need no more than 100 bytes. */
+    int len;
+    va_list ap;
+    int size = 100;
+    char *tmp, *str = NULL;
+
+    str = (char*)malloc(size);
+    while (1) 
+    {
+        /* Try to print in the allocated space. */
+        va_start(ap, fmt);
+        len = vsnprintf(str, size, fmt, ap);
+        va_end(ap);
+
+        /* If that worked, return the string. */
+        if (len > -1 && len < size) {
+            return str;
+        }
+
+        /* Else try again with more space. */
+        if (len > -1)    /* glibc 2.1 */
+            size = len+1; /* precisely what is needed */
+        else           /* glibc 2.0 */
+            size *= 2;  /* twice the old size */
+
+        tmp = (char*)realloc(str, size);
+        if (tmp == NULL) {
+            return str;
+        }
+        str = tmp;
+    }
+}
+
+#define EXTRA_VLC_DYLD_PATH "/Applications/VLC.app/Contents/MacOS/lib"
+#define DEFAULT_DYLD_PATH "/usr/local/lib:/usr/lib"
+
 int main( int argc, const char ** argv )
 {
+    char *dylib_path;
+    int no_exec = 0;
+
+    // Check for flag that prevents exec bomb.  It
+    // incidentally can be used to prevent adding
+    // our modifications to the dyld env vars.
+    if ( argc > 1 && strncmp(argv[1], "-n", 2) == 0 )
+        no_exec = 1;
+
+    if ( !no_exec )
+    {
+        dylib_path = getenv("DYLD_FALLBACK_LIBRARY_PATH");
+        if ( dylib_path == NULL ||
+             strstr( dylib_path, "/Applications/VLC.app/Contents/MacOS/lib" ) == NULL )
+        {
+            char *path = NULL;
+            char *home;
+            int result = -1;
+
+            home = getenv("HOME");
+
+            if ( dylib_path == NULL )
+            {
+                // Set the system default of $HOME/lib:/usr/local/lib:/usr/lib
+                // And add our extra path
+                if ( home != NULL )
+                {
+                    path = str_printf("%s/lib:%s:%s:%s%s", home, 
+                                      DEFAULT_DYLD_PATH, 
+                                      EXTRA_VLC_DYLD_PATH, 
+                                      home, EXTRA_VLC_DYLD_PATH);
+                }
+                else
+                {
+                    path = str_printf("%s:%s", DEFAULT_DYLD_PATH, EXTRA_VLC_DYLD_PATH);
+                }
+                if ( path != NULL )
+                    result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1);
+            }
+            else
+            {
+                // add our extra path
+                if ( home != NULL )
+                {
+                    path = str_printf("%s:%s:%s%s", dylib_path, EXTRA_VLC_DYLD_PATH,
+                                                        home, EXTRA_VLC_DYLD_PATH);
+                }
+                else
+                {
+                    path = str_printf("%s:%s", dylib_path, EXTRA_VLC_DYLD_PATH);
+                }
+                if ( path != NULL )
+                    result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1);
+            }
+            if ( result == 0 )
+            {
+                const char ** new_argv;
+                int i;
+
+                new_argv = (const char**)malloc( (argc + 2) * sizeof(char*) );
+                new_argv[0] = argv[0];
+                new_argv[1] = "-n";
+                for (i = 1; i < argc; i++)
+                    new_argv[i+1] = argv[i];
+                new_argv[i+1] = NULL;
+                execv(new_argv[0], (char* const*)new_argv);
+            }
+        }
+    }
     signal( SIGINT, SigHandler );
     hb_register_error_handler(&hb_error_handler);
     return NSApplicationMain( argc, argv );
index a12d380..d5905a8 100644 (file)
@@ -314,6 +314,90 @@ class ShellProbe( Action ):
 
 ###############################################################################
 ##
+## Compile test probe: determine if compile time feature is supported
+##
+## returns true if feature successfully compiles
+##
+##   
+class CCProbe( Action ):
+    def __init__( self, pretext, command, test_file ):
+        super( CCProbe, self ).__init__( 'probe', pretext )
+        self.command = command
+        self.test_file = test_file
+
+    def _action( self ):
+        ## write program file
+        file = open( 'conftest.c', 'w' )
+        file.write( self.test_file )
+        file.close()
+        ## pipe and redirect stderr to stdout; effects communicate result
+        pipe = subprocess.Popen( '%s -c -o conftest.o conftest.c' % self.command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
+
+        ## read data into memory buffers, only first element (stdout) data is used
+        data = pipe.communicate()
+        self.fail = pipe.returncode != 0
+
+        if data[0]:
+            self.session = data[0].splitlines()
+        else:
+            self.session = []
+
+        if pipe.returncode:
+            self.msg_end = 'code %d' % (pipe.returncode)
+        os.remove( 'conftest.c' )
+        if not self.fail:
+            os.remove( 'conftest.o' )
+
+    def _dumpSession( self, printf ):
+        printf( '  + %s\n', self.command )
+        super( CCProbe, self )._dumpSession( printf )
+
+
+###############################################################################
+##
+## Compile test probe: determine if compile time feature is supported
+##
+## returns true if feature successfully compiles
+##
+##   
+class LDProbe( Action ):
+    def __init__( self, pretext, command, lib, test_file ):
+        super( LDProbe, self ).__init__( 'probe', pretext )
+        self.command = command
+        self.test_file = test_file
+        self.lib = lib
+
+    def _action( self ):
+        ## write program file
+        file = open( 'conftest.c', 'w' )
+        file.write( self.test_file )
+        file.close()
+        ## pipe and redirect stderr to stdout; effects communicate result
+        pipe = subprocess.Popen( '%s -o conftest conftest.c %s' % (self.command, self.lib), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
+
+        ## read data into memory buffers, only first element (stdout) data is used
+        data = pipe.communicate()
+        self.fail = pipe.returncode != 0
+
+        if data[0]:
+            self.session = data[0].splitlines()
+        else:
+            self.session = []
+
+        if pipe.returncode:
+            self.msg_end = 'code %d' % (pipe.returncode)
+
+        os.remove( 'conftest.c' )
+        if not self.fail:
+            os.remove( 'conftest' )
+
+    def _dumpSession( self, printf ):
+        printf( '  + %s\n', self.command )
+        super( LDProbe, self )._dumpSession( printf )
+
+
+###############################################################################
+##
 ## GNU host tuple probe: determine canonical platform type
 ##
 ## example results from various platforms:
@@ -593,7 +677,7 @@ class RepoProbe( ShellProbe ):
         self.root      = 'svn://nowhere.com/project'
         self.branch    = 'unknown'
         self.uuid      = '00000000-0000-0000-0000-000000000000';
-        self.rev       = 0
+        self.rev       = 3736
         self.date      = '0000-00-00 00:00:00 -0000'
         self.official  = 0
         self.type      = 'unofficial'
@@ -660,7 +744,7 @@ class Project( Action ):
 
         self.vmajor = 0
         self.vminor = 9
-        self.vpoint = 4
+        self.vpoint = 5
 
     def _action( self ):
         ## add architecture to URL only for Mac
@@ -971,8 +1055,12 @@ def createCLI():
 
     h = IfHost( 'disable GTK GUI', '*-*-linux*', none=optparse.SUPPRESS_HELP ).value
     grp.add_option( '--disable-gtk', default=False, action='store_true', help=h )
+    h = IfHost( 'disable GTK GUI update checks', '*-*-linux*', none=optparse.SUPPRESS_HELP ).value
+    grp.add_option( '--disable-gtk-update-checks', default=False, action='store_true', help=h )
     h = IfHost( 'enable GTK GUI (mingw)', '*-*-mingw*', none=optparse.SUPPRESS_HELP ).value
     grp.add_option( '--enable-gtk-mingw', default=False, action='store_true', help=h )
+    h = IfHost( 'enable use of ffmpeg mpeg2 decoding', '*-*-*', none=optparse.SUPPRESS_HELP ).value
+    grp.add_option( '--enable-ff-mpeg2', default=False, action='store_true', help=h )
 
     h = IfHost( 'disable Xcode', '*-*-darwin*', none=optparse.SUPPRESS_HELP ).value
     grp.add_option( '--disable-xcode', default=False, action='store_true', help=h )
@@ -1200,6 +1288,81 @@ try:
     for action in Action.actions:
         action.run()
 
+    if build.system == 'mingw':
+        dlfcn_test = """
+#include <dlfcn.h>
+#include <stdio.h>
+
+void fnord() { int i=42;}
+int main ()
+{
+  void *self = dlopen (0, RTLD_GLOBAL|RTLD_NOW);
+  int status = 1;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = 0;
+      else if (dlsym( self,"_fnord")) status = 0;
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+"""
+        dlfcn = LDProbe( 'static dlfcn', '%s -static' % Tools.gcc.pathname, '-ldl', dlfcn_test )
+        dlfcn.run()
+
+        pthread_test = """
+#include <stdio.h>
+#include <pthread.h>
+int main ()
+{
+  pthread_t thread;
+  pthread_create (&thread, NULL, NULL, NULL);
+  return 0;
+}
+"""
+        pthread = LDProbe( 'static pthread', '%s -static' % Tools.gcc.pathname, '-lpthreadGC2', pthread_test )
+        pthread.run()
+
+        bz2_test = """
+#include <stdio.h>
+#include <bzlib.h>
+int main ()
+{
+  BZ2_bzReadOpen(NULL, NULL, 0, 0, NULL, 0);
+  return 0;
+}
+"""
+        bz2 = LDProbe( 'static bz2', '%s -static' % Tools.gcc.pathname, '-lbz2', bz2_test )
+        bz2.run()
+
+        libz_test = """
+#include <stdio.h>
+#include <zlib.h>
+int main ()
+{
+  compress(NULL, NULL, NULL, 0);
+  return 0;
+}
+"""
+        libz = LDProbe( 'static zlib', '%s -static' % Tools.gcc.pathname, '-lz', libz_test )
+        libz.run()
+
+        iconv_test = """
+#include <stdio.h>
+#include <iconv.h>
+int main ()
+{
+  iconv_open(NULL, NULL);
+  return 0;
+}
+"""
+        iconv = LDProbe( 'static iconv', '%s -static' % Tools.gcc.pathname, '-liconv', iconv_test )
+        iconv.run()
+
     ## cfg hook before doc prep
     cfg.doc_ready()
 
@@ -1292,7 +1455,9 @@ try:
     doc.addBlank()
     doc.add( 'FEATURE.asm',   'disabled' )
     doc.add( 'FEATURE.gtk',   int( not options.disable_gtk ))
+    doc.add( 'FEATURE.gtk.update.checks',   int( not options.disable_gtk_update_checks ))
     doc.add( 'FEATURE.gtk.mingw',   int( options.enable_gtk_mingw ))
+    doc.add( 'FEATURE.ff.mpeg2',   int( options.enable_ff_mpeg2 ))
     doc.add( 'FEATURE.xcode', int( not (Tools.xcodebuild.fail or options.disable_xcode or options.cross) ))
 
     if not Tools.xcodebuild.fail and not options.disable_xcode:
@@ -1301,7 +1466,24 @@ try:
         doc.add( 'XCODE.external.build',  cfg.xcode_x_build )
         doc.add( 'XCODE.external.prefix', cfg.xcode_x_prefix )
 
+    doc.addBlank()
+    if build.system == 'mingw':
+        if not dlfcn.fail:
+            doc.add( 'HAS.dlfcn', 1 )
+        if not pthread.fail:
+            doc.add( 'HAS.pthread', 1 )
+        if not bz2.fail:
+            doc.add( 'HAS.bz2', 1 )
+        if not libz.fail:
+            doc.add( 'HAS.libz', 1 )
+        if not iconv.fail:
+            doc.add( 'HAS.iconv', 1 )
+
     doc.addMake( '' )
+    doc.addMake( '## define debug mode before other includes' )
+    doc.addMake( '## since it is tested in some module.defs' )
+    doc.add( 'GCC.g', debugMode.mode )
+    doc.addBlank()
     doc.addMake( '## include definitions' )
     doc.addMake( 'include $(SRC/)make/include/main.defs' )
 
@@ -1324,7 +1506,6 @@ try:
         doc.add( 'GCC.minver', '' )
     doc.add( 'GCC.ldsysroot', '$(GCC.sysroot)' )
     doc.add( 'GCC.ldminver', '$(GCC.minver)' )
-    doc.add( 'GCC.g', debugMode.mode )
     doc.add( 'GCC.O', optimizeMode.mode )
 
     if options.enable_asm and not Tools.yasm.fail:
index fcff273..9edd938 100644 (file)
@@ -124,7 +124,7 @@ define import.CONTRIB.defs
     $(1).INSTALL.ntargets =
 
     $(1).INSTALL.args = !make @dir !extra !ntargets
-    $(1).INSTALL.args.dir = -C $$(1) install
+    $(1).INSTALL.args.dir = -j 1 -C $$(1) install
 
     $(1).INSTALL.mkdirs = $$(CONTRIB.build/)lib/ $$(CONTRIB.build/)include/
     $(1).INSTALL.target = $$($(1).build/).stamp.install
index a9523dd..c9b82e7 100644 (file)
@@ -14,7 +14,9 @@ GCC.minver  =
 GCC.ldminver=
 GCC.vis     = 0
 GCC.pic     = 0
-GCC.g       = none
+ifndef GCC.g
+       GCC.g       = none
+endif
 GCC.O       = none
 GCC.D       =
 GCC.I       =
index 3228593..4742f0f 100644 (file)
@@ -11,34 +11,47 @@ include $(SRC/)make/include/tool.defs
 MODULES += contrib/a52dec
 
 ifneq (,$(filter $(BUILD.system),cygwin mingw))
+ifneq ($(HAS.bz2),1)
     MODULES += contrib/bzip2
 endif
+endif
 
 MODULES += contrib/faac
 MODULES += contrib/faad2
 MODULES += contrib/ffmpeg
+MODULES += contrib/fontconfig
+MODULES += contrib/freetype
 MODULES += contrib/lame
+MODULES += contrib/libass
 MODULES += contrib/libdca
 MODULES += contrib/libdvdread
 MODULES += contrib/libdvdnav
+MODULES += contrib/libbluray
 MODULES += contrib/libmkv
 MODULES += contrib/libogg
 MODULES += contrib/libsamplerate
 MODULES += contrib/libtheora
 MODULES += contrib/libvorbis
+MODULES += contrib/libxml2
 MODULES += contrib/mp4v2
 MODULES += contrib/mpeg2dec
 
 ifneq (,$(filter $(BUILD.system),mingw))
+ifneq ($(HAS.pthread),1)
     MODULES += contrib/pthreadw32
 endif
+endif
 
 MODULES += contrib/x264
 
 ifneq (,$(filter $(BUILD.system),cygwin mingw))
+ifneq ($(HAS.iconv),1)
     MODULES += contrib/libiconv
+endif
+ifneq ($(HAS.libz),1)
     MODULES += contrib/zlib
 endif
+endif
 
 ifneq (,$(filter $(BUILD.system),solaris))
     MODULES += contrib/libiconv
index 132567c..5a8d8ac 100644 (file)
@@ -21,6 +21,7 @@ endif
 build:
 clean:
 install:
+install-strip:
 uninstall:
 xclean: contrib.xclean clean
 doc:
index 9a5d109..29f45e9 100644 (file)
@@ -9,3 +9,5 @@ TAR.exe   = tar
 TOUCH.exe = touch
 WGET.exe  = wget
 MV.exe    = mv
+ZIP.exe   = zip
+LN.exe    = ln
index e6b9552..d84928d 100644 (file)
@@ -2,12 +2,12 @@ Source: handbrake
 Section: graphics
 Priority: optional
 Maintainer: John Stebbins <jstebbins.hb@gmail.com>
-Build-Depends: debhelper (>= 6), autotools-dev, libtool, libgtkhtml3.14-dev, libhal-storage-dev, intltool, autoconf, yasm (>= 0.7.0), libbz2-dev, zlib1g-dev
-Standards-Version: 3.7.3
+Build-Depends: debhelper (>= 6), autotools-dev, libtool, libgudev-1.0-dev, intltool, autoconf, yasm (>= 0.7.0), libbz2-dev, zlib1g-dev, libwebkit-dev, libnotify-dev, libgstreamer0.10-dev, libgstreamer-plugins-base0.10-dev, wget, subversion, python2.6
+Standards-Version: 3.8.4
 Homepage: http://www.handbrake.fr/
 
 Package: handbrake-cli
-Architecture: any
+Architecture: i386 amd64
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Conflicts: handbrake
 Description: versatile DVD ripper and video transcoder - command line
@@ -18,8 +18,8 @@ Description: versatile DVD ripper and video transcoder - command line
  HandBrakeCLI
 
 Package: handbrake-gtk
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}
+Architecture: i386 amd64
+Depends: ${shlibs:Depends}, ${misc:Depends}, libwebkit-1.0-2, libnotify1
 Conflicts: handbrake
 Description: versatile DVD ripper and video transcoder - GTK GUI
  HandBrake is a versatile, easy-to-use tool for converting DVDs and other videos
index 036aa3b..bab615c 100755 (executable)
@@ -26,7 +26,7 @@ FORCEVERSION =
 
 $(BUILDDIR)/GNUmakefile: $(CONFIGURE)
        dh_testdir
-       unset CFLAGS; unset CPPLAGS; unset CXXLAGS; $(CONFIGURE) --prefix=/usr
+       unset CFLAGS; unset CPPLAGS; unset CXXLAGS; $(CONFIGURE) --disable-gtk-update-checks --prefix=/usr
 
 build:  $(BUILDDIR)/GNUmakefile
        dh_testdir
@@ -53,7 +53,6 @@ binary-indep: build install
        dh_installdocs -i
        dh_install --sourcedir=debian/tmp -i
        dh_icons -i
-       dh_desktop -i
        dh_link -i
        dh_compress -i
        dh_fixperms -i
@@ -73,7 +72,6 @@ binary-arch: build install
        dh_installman -a
        dh_link -a
        dh_icons -a
-       dh_desktop -a
        dh_strip -a
        dh_compress -a
        dh_fixperms -a
index 8b91f2d..e4232b3 100644 (file)
@@ -1,12 +1,27 @@
 PKG.deb.machine = `dpkg --print-architecture`
 PKG.rpm.machine = `rpm -E "%_target_cpu"`
+PKG.release = 1
+PKG.rpm.dist = `rpm -E "%dist"`
+
+PKG.rpm.src.tar.bz2 = $(STAGE.out.src/)rpm/$(PKG.basename).tar.bz2
+STAGE.out.rpm.src/ = $(STAGE.out.src/)rpm/
+
 PKG.debian  = $(PKG.in/)linux/debian
 PKG.cli.deb = $(PKG.out/)$(HB.name)-$(HB.version)-Ubuntu_CLI_$(BUILD.machine).deb
 PKG.gui.deb = $(PKG.out/)$(HB.name)-$(HB.version)-Ubuntu_GUI_$(BUILD.machine).deb
+PKG.deb.basename = handbrake-$(HB.version)
+PKG.src.deb.tar = handbrake_$(HB.version).tar.gz
+PKG.src.deb.stamp = $(STAGE.out.src/).debsrc.stamp
+PKG.src.deb = $(PKG.out/)handbrake_$(HB.version).deb
 
 PKG.cli.tmp.deb = $(PKG.out/)handbrake-cli_$(HB.version)_$(PKG.deb.machine).deb
 PKG.gui.tmp.deb = $(PKG.out/)handbrake-gtk_$(HB.version)_$(PKG.deb.machine).deb
 
+PKG.native.rpm.stamp = $(RPM.out/).rpm.stamp
+
+PKG.gui.native.rpm = $(RPM.out/)RPMS/$(PKG.rpm.machine)/$(HB.name)-gui-$(HB.version)-$(PKG.release)$(PKG.rpm.dist).$(PKG.rpm.machine).rpm
+PKG.cli.native.rpm = $(RPM.out/)RPMS/$(PKG.rpm.machine)/$(HB.name)-cli-$(HB.version)-$(PKG.release)$(PKG.rpm.dist).$(PKG.rpm.machine).rpm
+
 PKG.cli.rpm  = $(PKG.out/)$(HB.name)-$(HB.version)-Fedora_CLI_$(BUILD.machine).rpm
 PKG.gui.rpm  = $(PKG.out/)$(HB.name)-$(HB.version)-Fedora_GUI_$(BUILD.machine).rpm
 RPM.out  = $(STAGE.out/)rpm
@@ -16,6 +31,7 @@ RPMROOT.out/ = $(PWD)/$(STAGE.out/)rpmroot/
 
 ###############################################################################
 
+BUILD.out += $(PKG.src.tar)
 BUILD.out += $(PKG.cli.deb)
 BUILD.out += $(PKG.gui.deb)
 BUILD.out += $(PKG.cli.rpm)
index c3346be..145f751 100644 (file)
-pkg.create.deb:: pkg.create $(PKG.gui.deb) $(PKG.cli.deb)
-pkg.create.rpm:: pkg.create $(PKG.gui.rpm) $(PKG.cli.rpm)
+pkg.create.deb:: $(PKG.gui.deb) $(PKG.cli.deb)
+pkg.create.rpm:: $(PKG.gui.rpm)
+pkg.create.src.deb:: $(PKG.src.deb.stamp)
 
-$(PKG.gui.rpm) $(PKG.cli.rpm): | $(dir $(PKG.gui.rpm) $(PKG.cli.rpm))
-$(PKG.gui.rpm) $(PKG.cli.rpm):
+#
+# RPM binary package rules
+#
+$(PKG.rpm.src.tar.bz2): $(STAGE.out.rpm.src/)
+       $(TAR.exe) cjf $@ -C $(STAGE.out.rpm.src/) $(PKG.basename)
+
+$(STAGE.out.rpm.src/): GNUmakefile
+#      -$(MKDIR.exe) -p $(STAGE.out.rpm.src/)$(PKG.basename)
+#      tar c --exclude build ../* | tar x -C $(STAGE.out.rpm.src/)$(PKG.basename)
+       -$(RM.exe) -rf $(STAGE.out.src/)
+       make contrib.fetch
+       svn co -r$(HB.repo.rev) $(HB.repo.url) $@/$(PKG.basename)
+       -$(MKDIR.exe) $(STAGE.out.rpm.src/)$(PKG.basename)/download
+       $(CP.exe) $(SRC/)download/*.tar.* $(STAGE.out.rpm.src/)$(PKG.basename)/download
+
+$(PKG.native.rpm.stamp): $(PKG.rpm.src.tar.bz2)
        -$(MKDIR.exe) -p $(RPM.out/)SOURCES
        -$(MKDIR.exe) -p $(RPM.out/)SPECS
        -$(MKDIR.exe) -p $(RPM.out/)BUILD
        -$(MKDIR.exe) -p $(RPM.out/)RPMS
        -$(MKDIR.exe) -p $(RPM.out/)SRPMS
        -$(MKDIR.exe) -p $(RPMROOT.out/)
-       $(CP.exe) $(GTK.src/)ghb.spec $(RPM.out/)SPECS
-       $(CP.exe) $(PKG.src.tar.bz2) $(RPM.out/)SOURCES
-       $(TAR.exe) -xf $(PKG.src.tar.bz2) -C $(RPM.out/)BUILD
-       rpmbuild --define="version $(HB.version)" --define="_topdir $(PWD)/$(RPM.out)" --buildroot $(RPMROOT.out) -ba $(GTK.src/)ghb.spec
-       $(CP.exe) $(RPM.out/)RPMS/$(PKG.rpm.machine)/$(HB.name)-cli-$(HB.version)*.rpm $(PKG.cli.rpm)
-       $(CP.exe) $(RPM.out/)RPMS/$(PKG.rpm.machine)/$(HB.name)-gui-$(HB.version)*.rpm $(PKG.gui.rpm)
+       echo "%define name $(HB.name)" > $(RPM.out/)SPECS/ghb.spec
+       echo "%define release 1" >> $(RPM.out/)SPECS/ghb.spec
+       echo "%define version $(HB.version)" >> $(RPM.out/)SPECS/ghb.spec
+       cat $(GTK.src/)ghb.spec >> $(RPM.out/)SPECS/ghb.spec
+       $(CP.exe) $(PKG.rpm.src.tar.bz2) $(RPM.out/)SOURCES
+       rpmbuild --define="_topdir $(PWD)/$(RPM.out)" --buildroot $(RPMROOT.out) -ba $(RPM.out/)SPECS/ghb.spec
+       $(TOUCH.exe) $(PKG.native.rpm.stamp)
 
-$(PKG.gui.deb): | $(dir $(PKG.gui.deb))
-$(PKG.gui.deb):
-       -rm $(SRC/)debian
+$(PKG.gui.rpm): | $(dir $(PKG.gui.rpm))
+$(PKG.gui.rpm): $(PKG.native.rpm.stamp)
+       $(CP.exe) $(PKG.gui.native.rpm) $(PKG.gui.rpm)
+       $(CP.exe) $(PKG.cli.native.rpm) $(PKG.cli.rpm)
+
+#
+# Debian binary package rules
+#
+$(PKG.gui.tmp.deb): | $(dir $(PKG.gui.tmp.deb))
+$(PKG.gui.tmp.deb): GNUmakefile
+       -$(RM.exe) $(SRC/)debian
        ln -s $(PWD)/$(PKG.debian) $(SRC/)debian
        fakeroot $(MAKE) -C $(SRC/) -f debian/rules clean
        $(MAKE) BUILDDIR=$(PWD)/$(BUILD) CONFIGURE=configure -C $(SRC/) -f debian/rules build
        echo $(PKG.out/)
        fakeroot $(MAKE) FORCEVERSION="-- -v$(HB.version)" BUILDDIR=$(PWD)/$(BUILD) CONFIGURE=configure PKGDESTDIR=$(PWD)/$(PKG.out/) -C $(SRC/) -f debian/rules binary
+
+$(PKG.gui.deb): | $(dir $(PKG.gui.deb))
+$(PKG.gui.deb): $(PKG.gui.tmp.deb)
        $(MV.exe) $(PKG.gui.tmp.deb) $(PKG.gui.deb)
 
 $(PKG.cli.deb): | $(dir $(PKG.cli.deb))
-$(PKG.cli.deb): $(PKG.gui.deb)
+$(PKG.cli.deb): $(PKG.gui.tmp.deb)
        $(MV.exe) $(PKG.cli.tmp.deb) $(PKG.cli.deb)
 
+#
+# Debian source package rules
+#
+pkg.push.src.deb:: $(PKG.src.deb.stamp)
+       (cd $(STAGE.out.src/)maverick && dput handbrake-snapshots handbrake_$(HB.version)ppa1~maverick1_source.changes )
+       (cd $(STAGE.out.src/)lucid && dput handbrake-snapshots handbrake_$(HB.version)ppa1~lucid1_source.changes )
+       (cd $(STAGE.out.src/)karmic && dput handbrake-snapshots handbrake_$(HB.version)ppa1~karmic1_source.changes )
+
+$(PKG.src.deb.stamp): GNUmakefile
+       -$(RM.exe) -rf $(STAGE.out.src/)
+       make contrib.fetch
+       svn co -r$(HB.repo.rev) $(HB.repo.url) $(STAGE.out.src/)maverick/$(PKG.deb.basename)
+       $(CP.exe) -a $(SRC/)download $(STAGE.out.src/)maverick/$(PKG.deb.basename)
+       cp -a $(PWD)/$(PKG.debian) $(STAGE.out.src/)maverick/$(PKG.deb.basename)
+       echo "handbrake ($(HB.version)ppa1~maverick1) maverick; urgency=low" > $(STAGE.out.src/)maverick/$(PKG.deb.basename)/debian/changelog
+       echo "  * Snapshot" >> $(STAGE.out.src/)maverick/$(PKG.deb.basename)/debian/changelog
+       echo "    - See timeline at http://trac.handbrake.fr/timeline" >> $(STAGE.out.src/)maverick/$(PKG.deb.basename)/debian/changelog
+       echo "" >> $(STAGE.out.src/)maverick/$(PKG.deb.basename)/debian/changelog
+       echo " -- John Stebbins <jstebbins.hb@gmail.com>  Sun, 11 Apr 2010 9:51:07 -0800" >> $(STAGE.out.src/)maverick/$(PKG.deb.basename)/debian/changelog
+       $(TAR.exe) czf $(STAGE.out.src/)maverick/$(PKG.src.deb.tar) -C $(STAGE.out.src/)maverick $(PKG.deb.basename)
+       (cd $(STAGE.out.src/)maverick/$(PKG.deb.basename) && debuild -S -kjstebbins.hb)
+       svn co -r$(HB.repo.rev) $(HB.repo.url) $(STAGE.out.src/)lucid/$(PKG.deb.basename)
+       $(CP.exe) -a $(SRC/)download $(STAGE.out.src/)lucid/$(PKG.deb.basename)
+       cp -a $(PWD)/$(PKG.debian) $(STAGE.out.src/)lucid/$(PKG.deb.basename)
+       echo "handbrake ($(HB.version)ppa1~lucid1) lucid; urgency=low" > $(STAGE.out.src/)lucid/$(PKG.deb.basename)/debian/changelog
+       echo "  * Snapshot" >> $(STAGE.out.src/)lucid/$(PKG.deb.basename)/debian/changelog
+       echo "    - See timeline at http://trac.handbrake.fr/timeline" >> $(STAGE.out.src/)lucid/$(PKG.deb.basename)/debian/changelog
+       echo "" >> $(STAGE.out.src/)lucid/$(PKG.deb.basename)/debian/changelog
+       echo " -- John Stebbins <jstebbins.hb@gmail.com>  Sun, 11 Apr 2010 9:51:07 -0800" >> $(STAGE.out.src/)lucid/$(PKG.deb.basename)/debian/changelog
+       $(TAR.exe) czf $(STAGE.out.src/)lucid/$(PKG.src.deb.tar) -C $(STAGE.out.src/)lucid $(PKG.deb.basename)
+       (cd $(STAGE.out.src/)lucid/$(PKG.deb.basename) && debuild -S -kjstebbins.hb)
+       svn co -r$(HB.repo.rev) $(HB.repo.url) $(STAGE.out.src/)karmic/$(PKG.deb.basename)
+       $(CP.exe) -a $(SRC/)download $(STAGE.out.src/)karmic/$(PKG.deb.basename)
+       cp -a $(PWD)/$(PKG.debian) $(STAGE.out.src/)karmic/$(PKG.deb.basename)
+       echo "handbrake ($(HB.version)ppa1~karmic1) karmic; urgency=low" > $(STAGE.out.src/)karmic/$(PKG.deb.basename)/debian/changelog
+       echo "  * Snapshot" >> $(STAGE.out.src/)karmic/$(PKG.deb.basename)/debian/changelog
+       echo "    - See timeline at http://trac.handbrake.fr/timeline" >> $(STAGE.out.src/)karmic/$(PKG.deb.basename)/debian/changelog
+       echo "" >> $(STAGE.out.src/)karmic/$(PKG.deb.basename)/debian/changelog
+       echo " -- John Stebbins <jstebbins.hb@gmail.com>  Sun, 11 Apr 2010 9:51:07 -0800" >> $(STAGE.out.src/)karmic/$(PKG.deb.basename)/debian/changelog
+       $(TAR.exe) czf $(STAGE.out.src/)karmic/$(PKG.src.deb.tar) -C $(STAGE.out.src/)karmic $(PKG.deb.basename)
+       (cd $(STAGE.out.src/)karmic/$(PKG.deb.basename) && debuild -S -kjstebbins.hb)
+       $(TOUCH.exe) $(PKG.src.deb.stamp)
+
+
diff --git a/pkg/mingw/module.defs b/pkg/mingw/module.defs
new file mode 100644 (file)
index 0000000..054a4d0
--- /dev/null
@@ -0,0 +1,9 @@
+PKG.cli.zip = $(PKG.out/)$(HB.name)-$(HB.version)-Win_CLI.zip\r
+\r
+PKG.mingw.lib = $(SRC/)libraries\r
+\r
+STAGE.out.cli/ = $(STAGE.out/)cli/\r
+\r
+###############################################################################\r
+\r
+BUILD.out += $(PKG.cli.zip)\r
diff --git a/pkg/mingw/module.rules b/pkg/mingw/module.rules
new file mode 100644 (file)
index 0000000..b9ba1d9
--- /dev/null
@@ -0,0 +1,13 @@
+pkg.create.zip:: pkg.create $(PKG.cli.zip)\r
+\r
+$(PKG.cli.zip): | $(dir $(PKG.cli.zip))\r
+$(PKG.cli.zip): | $(STAGE.out.cli/)\r
+       cd $(STAGE.out.cli/) && $(ZIP.exe) -r $(call fn.ABSOLUTE,$(PKG.cli.zip)) .\r
+\r
+\r
+$(STAGE.out.cli/):\r
+       -$(MKDIR.exe) -p $@\r
+       $(CP.exe) HandBrakeCLI.exe $(STAGE.out.cli/)\r
+       $(call STAGE.doc,$(STAGE.out.cli/))\r
+\r
+\r
index 97020d9..11dae99 100644 (file)
@@ -3,7 +3,8 @@ $(eval $(call import.MODULE.defs,PKG,pkg))
 PKG.in/  = $(SRC/)pkg/
 PKG.out/ = $(BUILD/)pkg/
 
-PKG.src.tar.bz2 = $(PKG.out/)$(HB.name)-$(HB.version).tar.bz2
+PKG.basename    = $(HB.name)-$(HB.version)
+PKG.src.tar.bz2 = $(PKG.out/)$(PKG.basename).tar.bz2
 
 STAGE.out/     = $(BUILD/)stage/
 STAGE.out.src/ = $(STAGE.out/)src/
index 60457d2..f841fd9 100644 (file)
@@ -12,13 +12,13 @@ pkg.clean:
 
 $(PKG.src.tar.bz2): | $(dir $(PKG.src.tar.bz2))
 $(PKG.src.tar.bz2): | $(STAGE.out.src/)
-       $(TAR.exe) cjf $@ -C $(STAGE.out.src/) .
+       $(TAR.exe) cjf $@ -C $(STAGE.out.src/) $(PKG.basename)
 
 $(STAGE.out.src/):
-       svn export -r$(HB.repo.rev) $(HB.repo.url) $@/$(HB.name)-$(HB.version)
+       svn export -r$(HB.repo.rev) $(HB.repo.url) $@/$(PKG.basename)
        sed 's/\(self.rev.*=.*\)0/\1$(HB.repo.rev)/' \
-           $@/$(HB.name)-$(HB.version)/make/configure.py > $@/$(HB.name)-$(HB.version)/make/configure.py.tmp
-       $(MV.exe) $@/$(HB.name)-$(HB.version)/make/configure.py.tmp $@/$(HB.name)-$(HB.version)/make/configure.py
+           $@/$(PKG.basename)/make/configure.py > $@/$(PKG.basename)/make/configure.py.tmp
+       $(MV.exe) $@/$(PKG.basename)/make/configure.py.tmp $@/$(PKG.basename)/make/configure.py
 
 ###############################################################################
 
index 32ea30e..f458aec 100755 (executable)
@@ -275,10 +275,6 @@ class Display
     case hash["FileFormat"]
     when /MP4/
       commandString << "mp4 "
-    when /AVI/
-      commandString << "avi "
-    when /OGM/
-      commandString << "ogm "
     when /MKV/
       commandString << "mkv "
     end
@@ -289,8 +285,8 @@ class Display
       case hash["VideoEncoder"]
       when /x264/
         commandString << "x264"
-      when /XviD/
-        commandString << "xvid"
+      when /Theora/
+        commandString << "theora"
       end
     end
 
@@ -315,6 +311,10 @@ class Display
       else
         commandString << " -r " << hash["VideoFramerate"]
       end
+      
+      if hash["VideoFrameratePFR"] == 1
+        commandString << " --pfr "
+      end
     end
     
     #Audio tracks
@@ -334,7 +334,9 @@ class Display
       
       #Encoders
       case audioTrack["AudioEncoder"]
-        when /AC3 /
+        when /AC3 Pass/
+          audioEncoders << "copy:ac3"
+        when /AC3/
           audioEncoders << "ac3"
         when /AAC/
           audioEncoders << "faac"
@@ -391,10 +393,6 @@ class Display
     case hash["FileFormat"]
     when /MP4/
       commandString << "mp4"
-    when /AVI/
-      commandString << "avi"
-    when /OGM/
-      commandString << "ogm"
     when /MKV/
       commandString << "mkv"
     end
@@ -432,7 +430,7 @@ class Display
     end
     
     #Subtitles
-    if hash["Subtitles"] != "None"
+    if hash["Subtitles"] && hash["Subtitles"] != "None"
       if hash["Subtitles"] == "Autoselect"
         commandString << " --subtitle-scan"
       else
@@ -445,29 +443,28 @@ class Display
     if hash["UsesPictureFilters"] == 1
       
       case hash["PictureDeinterlace"]
-      when 1
-        commandString << " --deinterlace=\"fast\""
       when 2
-        commandString << " --deinterlace=\slow\""
+        commandString << " --deinterlace=\"fast\""
       when 3
-        commandString << " --deinterlace=\"slower\""
+        commandString << " --deinterlace=\slow\""
       when 4
+        commandString << " --deinterlace=\"slower\""
+      when 5
         commandString << " --deinterlace=\"slowest\""
       end
       
       case hash["PictureDenoise"]
-      when 1
-        commandString << " --denoise=\"weak\""
       when 2
-        commandString << " --denoise=\"medium\""
+        commandString << " --denoise=\"weak\""
       when 3
+        commandString << " --denoise=\"medium\""
+      when 4
         commandString << " --denoise=\"strong\""
       end
       
-      if hash["PictureDetelecine"] == 1 then commandString << " --detelecine" end
-      if hash["PictureDeblock"] == 1 then commandString << " --deblock" end
-      if hash["VFR"].to_i == 1 then commandString << " --vfr" end
-      if hash["PictureDecomb"] == 1 then commandString << " --decomb" end
+      if hash["PictureDetelecine"] == 2 then commandString << " --detelecine" end
+      if hash["PictureDeblock"] != 0 then commandString << " --deblock=" << hash["PictureDeblock"].to_s end
+      if hash["PictureDecomb"] == 2 then commandString << " --decomb" end
       
     end
     
@@ -476,6 +473,8 @@ class Display
       commandString << " --strict-anamorphic"
     elsif hash["PicturePAR"] == 2
       commandString << " --loose-anamorphic"
+    elsif hash["PicturePAR"] == 3
+      commandString << " --custom-anamorphic"
     end
 
     #Booleans
@@ -535,8 +534,8 @@ class Display
       case hash["VideoEncoder"]
       when /x264/
         commandString << "x264"
-      when /XviD/
-        commandString << "xvid"
+      when /Theora/
+        commandString << "theora"
       end
     end
 
@@ -561,6 +560,10 @@ class Display
       else
         commandString << " -r " << hash["VideoFramerate"]
       end
+      
+      if hash["VideoFrameratePFR"] == 1
+        commandString << " --pfr "
+      end
     end
     
     #Audio tracks
@@ -580,7 +583,9 @@ class Display
       
       #Encoders
       case audioTrack["AudioEncoder"]
-        when /AC3 /
+        when /AC3 Pass/
+          audioEncoders << "copy:ac3"
+        when /AC3/
           audioEncoders << "ac3"
         when /AAC/
           audioEncoders << "faac"
@@ -637,10 +642,6 @@ class Display
     case hash["FileFormat"]
     when /MP4/
       commandString << "mp4"
-    when /AVI/
-      commandString << "avi"
-    when /OGM/
-      commandString << "ogm"
     when /MKV/
       commandString << "mkv"
     end
@@ -678,7 +679,7 @@ class Display
     end
     
     #Subtitles
-    if hash["Subtitles"] != "None"
+    if hash["Subtitles"] && hash["Subtitles"] != "None"
       if hash["Subtitles"] == "Autoselect"
         commandString << " --subtitle-scan"
       else
@@ -691,29 +692,28 @@ class Display
     if hash["UsesPictureFilters"] == 1
       
       case hash["PictureDeinterlace"]
-      when 1
-        commandString << " --deinterlace=\"fast\""
       when 2
-        commandString << " --deinterlace=\slow\""
+        commandString << " --deinterlace=\"fast\""
       when 3
-        commandString << " --deinterlace=\"slower\""
+        commandString << " --deinterlace=\slow\""
       when 4
+        commandString << " --deinterlace=\"slower\""
+      when 5
         commandString << " --deinterlace=\"slowest\""
       end
       
       case hash["PictureDenoise"]
-      when 1
-        commandString << " --denoise=\"weak\""
       when 2
-        commandString << " --denoise=\"medium\""
+        commandString << " --denoise=\"weak\""
       when 3
+        commandString << " --denoise=\"medium\""
+      when 4
         commandString << " --denoise=\"strong\""
       end
       
-      if hash["PictureDetelecine"] == 1 then commandString << " --detelecine" end
-      if hash["PictureDeblock"] == 1 then commandString << " --deblock" end
-      if hash["VFR"].to_i == 1 then commandString << " --vfr" end
-      if hash["PictureDecomb"] == 1 then commandString << " --decomb" end
+      if hash["PictureDetelecine"] == 2 then commandString << " --detelecine" end
+      if hash["PictureDeblock"] != 0 then commandString << " --deblock=" << hash["PictureDeblock"].to_s end
+      if hash["PictureDecomb"] == 2 then commandString << " --decomb" end
     end
 
     #Anamorphic
@@ -721,6 +721,8 @@ class Display
       commandString << " --strict-anamorphic"
     elsif hash["PicturePAR"] == 2
       commandString << " --loose-anamorphic"
+    elsif hash["PicturePAR"] == 3
+      commandString << " --custom-anamorphic"
     end
     
     #Booleans
@@ -754,10 +756,6 @@ class Display
     case hash["FileFormat"]
     when /MP4/
       commandString << "    mux = " << "HB_MUX_MP4;\n    "
-    when /AVI/
-      commandString << "    mux = " << "HB_MUX_AVI;\n    "
-    when /OGM/
-      commandString << "    mux = " << "HB_MUX_OGM;\n    "
     when /MKV/
       commandString << "    mux = " << "HB_MUX_MKV;\n    "
     end
@@ -765,7 +763,7 @@ class Display
     
     #iPod MP4 atom
     if hash["Mp4iPodCompatible"].to_i == 1
-      commandString << "job->ipod_atom = 1;\n   "
+      commandString << "job->ipod_atom = 1;\n    "
     end
     
     # 64-bit files
@@ -779,8 +777,8 @@ class Display
       case hash["VideoEncoder"]
       when /x264/
         commandString << "HB_VCODEC_X264;\n    "
-      when /XviD/
-        commandString << "HB_VCODEC_XVID;\n    "        
+      when /Theora/
+        commandString << "HB_VCODEC_THEORA;\n    "        
       end
     end
 
@@ -792,7 +790,6 @@ class Display
       commandString << "job->vbitrate = " << hash["VideoAvgBitrate"] << ";\n    "
     when 2
       commandString << "job->vquality = " << hash["VideoQualitySlider"].to_s << ";\n    "
-      commandString << "job->crf = 1;\n    "
     end
 
     #FPS
@@ -805,7 +802,12 @@ class Display
         commandString << "job->vrate_base = " << "1080000\n    "
       # Gotta add the rest of the framerates for completion's sake.
       end
-      commandString << "job->cfr = 1;\n    "
+      
+      if hash["VideoFrameratePFR"] == 1
+        commandString << "job->cfr = 2;\n    "
+      else
+        commandString << "job->cfr = 1;\n    "
+      end
     end
     
     #Audio tracks
@@ -825,7 +827,9 @@ class Display
 
       #Encoders
       case audioTrack["AudioEncoder"]
-        when /AC3 /
+        when /AC3 Pass/
+          audioEncoders << "copy:ac3"
+        when /AC3/
           audioEncoders << "ac3"
         when /AAC/
           audioEncoders << "faac"
@@ -911,7 +915,7 @@ class Display
       commandString << "job->crop[0] = " << hash["PictureTopCrop"].to_s << ";\n    "
       commandString << "job->crop[1] = " << hash["PictureBottomCrop"].to_s << ";\n    "
       commandString << "job->crop[2] = " << hash["PictureLeftCrop"].to_s << ";\n    "
-      commandString << "job->crop[4] - " << hash["PictureRightCrop"].to_s << ";\n    "
+      commandString << "job->crop[4] = " << hash["PictureRightCrop"].to_s << ";\n    "
     end
     
     #Dimensions
@@ -947,44 +951,54 @@ class Display
     if hash["UsesPictureFilters"] == 1
       
       case hash["PictureDeinterlace"]
-      when 1
+      when 2
         commandString << "deinterlace = 1;\n    "
         commandString << "deinterlace_opt = \"-1\";\n    "
-      when 2
+      when 3
         commandString << "deinterlace = 1;\n    "
         commandString << "deinterlace_opt = \"2\";\n    "
-      when 3
+      when 4
         commandString << "deinterlace = 1;\n    "
         commandString << "deinterlace_opt = \"0\";\n    "
-      when 4
+      when 5
         commandString << "deinterlace = 1;\n    "
         commandString << "deinterlace_opt = \"1:-1:1\";\n    "
       end
       
       case hash["PictureDenoise"]
-      when 1
+      when 2
         commandString << "denoise = 1;\n    "
         commandString << "denoise_opt = \"2:1:2:3\";\n    "
-      when 2
+      when 3
         commandString << "denoise = 1;\n    "
         commandString << "denoise_opt = \"3:2:2:3\";\n    "
-      when 3
+      when 4
         commandString << "denoise = 1;\n    "
         commandString << "denoise_opt = \"7:7:5:5\";\n    "
       end
       
-      if hash["PictureDetelecine"] == 1 then commandString << "detelecine = 1;\n    " end
-      if hash["PictureDeblock"] == 1 then commandString << "deblock = 1;\n    " end
-      if hash["VFR"].to_i == 1 then commandString << "vfr = 1;\n    " end
-      if hash["PictureDecomb"] == 1 then commandString << "decomb = 1;\n    " end
+      if hash["PictureDetelecine"] == 2 then commandString << "detelecine = 1;\n    " end
+      if hash["PictureDeblock"] != 0
+        then
+          commandString << "deblock = 1;\n    "
+          commandString << "deblock_opt = \"" << hash["PictureDeblock"].to_s << "\";\n    "
+        end
+      if hash["PictureDecomb"] == 2 then commandString << "decomb = 1;\n    " end
       
     end
     
     #Anamorphic
-    if hash["PicturePAR"] == 1
-      commandString << "anamorphic_mode = 1;\n    "
-    elsif hash["PicturePAR"] == 2
-      commandString << "anamorphic_mode = 2;\n    "
+    if hash["PicturePAR"] != 0
+      commandString << "if( !anamorphic_mode )\n    "
+      commandString << "{\n    "
+      if hash["PicturePAR"] == 1
+        commandString << "    anamorphic_mode = 1;\n    "
+      elsif hash["PicturePAR"] == 2
+        commandString << "    anamorphic_mode = 2;\n    "
+      elsif hash["PicturePAR"] == 3
+        commandString << "    anamorphic_mode = 3;\n    "
+      end
+      commandString << "}\n    "
     end
     
     #Booleans
@@ -992,7 +1006,7 @@ class Display
     if hash["VideoGrayScale"] == 1 then commandString << "job->grayscale = 1;\n    " end
     if hash["VideoTwoPass"] == 1 then commandString << "twoPass = 1;\n    " end
     if hash["VideoTurboTwoPass"] == 1 then commandString << "turbo_opts_enabled = 1;\n" end
-    
+    commandString << "\n"
     commandString << "}"
     
     # That's it, print to screen now
@@ -1045,8 +1059,8 @@ class Display
       case hash["VideoEncoder"]
       when /x264/
         commandString << "x264 "
-      when /XviD/
-        commandString << "xvid "
+      when /Theora/
+        commandString << "theora "
       end
     end
 
@@ -1071,6 +1085,10 @@ class Display
       else
         commandString << " -r " << hash["VideoFramerate"]
       end
+      
+      if hash["VideoFrameratePFR"] == 1
+        commandString << " --pfr "
+      end
     end
     
     #Audio tracks
@@ -1090,7 +1108,9 @@ class Display
       
       #Encoders
       case audioTrack["AudioEncoder"]
-        when /AC3 /
+        when /AC3 Pass/
+          audioEncoders << "copy:ac3"
+        when /AC3/
           audioEncoders << "ac3"
         when /AAC/
           audioEncoders << "faac"
@@ -1147,10 +1167,6 @@ class Display
     case hash["FileFormat"]
     when /MP4/
       commandString << "mp4"
-    when /AVI/
-      commandString << "avi"
-    when /OGM/
-      commandString << "ogm"
     when /MKV/
       commandString << "mkv"
     end
@@ -1188,7 +1204,7 @@ class Display
     end
     
     #Subtitles
-    if hash["Subtitles"] != "None"
+    if hash["Subtitles"] && hash["Subtitles"] != "None"
       if hash["Subtitles"] == "Autoselect"
         commandString << " --subtitle-scan"
       else
@@ -1201,29 +1217,28 @@ class Display
     if hash["UsesPictureFilters"] == 1
       
       case hash["PictureDeinterlace"]
-      when 1
-        commandString << " --deinterlace=\\\"fast\\\""
       when 2
-        commandString << " --deinterlace=\\\slow\\\""
+        commandString << " --deinterlace=\\\"fast\\\""
       when 3
-        commandString << " --deinterlace=\\\"slower\\\""
+        commandString << " --deinterlace=\\\slow\\\""
       when 4
+        commandString << " --deinterlace=\\\"slower\\\""
+      when 5
         commandString << " --deinterlace=\\\"slowest\\\""
       end
       
       case hash["PictureDenoise"]
-      when 1
-        commandString << " --denoise=\\\"weak\\\""
       when 2
-        commandString << " --denoise=\\\"medium\\\""
+        commandString << " --denoise=\\\"weak\\\""
       when 3
+        commandString << " --denoise=\\\"medium\\\""
+      when 4
         commandString << " --denoise=\\\"strong\\\""
       end
       
-      if hash["PictureDetelecine"] == 1 then commandString << " --detelecine" end
-      if hash["PictureDeblock"] == 1 then commandString << " --deblock" end
-      if hash["VFR"].to_i == 1 then commandString << " --vfr" end
-      if hash["PictureDecomb"] == 1 then commandString << " --decomb" end
+      if hash["PictureDetelecine"] == 2 then commandString << " --detelecine" end
+      if hash["PictureDeblock"] != 0 then commandString << " --deblock=" << hash["PictureDeblock"].to_s end
+      if hash["PictureDecomb"] == 2 then commandString << " --decomb" end
     end
     
     #Anamorphic
@@ -1231,6 +1246,8 @@ class Display
       commandString << " --strict-anamorphic"
     elsif hash["PicturePAR"] == 2
       commandString << " --loose-anamorphic"
+    elsif hash["PicturePAR"] == 3
+      commandString << " --custom-anamorphic"
     end
     
     #Booleans
@@ -1267,4 +1284,4 @@ else
   # Direct the user to the help
   puts "\n\tUsage: manicure.rb [options]"
   puts "\tSee help with -h or --help"
-end
\ No newline at end of file
+end
index e9bc7b7..33d34d4 100644 (file)
@@ -10,20 +10,27 @@ TEST.c.o = $(patsubst $(SRC/)%.c,$(BUILD/)%.o,$(TEST.c))
 TEST.exe = $(BUILD/)$(call TARGET.exe,$(HB.name)CLI)
 
 TEST.libs = $(LIBHB.a) $(foreach n, \
-        a52 avcodec avformat avutil dca dvdnav dvdread faac faad mkv mpeg2 mp3lame mp4v2 \
-        ogg samplerate swscale theora vorbis vorbisenc x264, \
+        a52 ass avcore avcodec avformat avutil dca dvdnav dvdread faac faad fontconfig freetype mkv mpeg2 mp3lame mp4v2 \
+        ogg samplerate swscale theora vorbis vorbisenc x264 xml2 bluray, \
         $(CONTRIB.build/)lib/lib$(n).a )
 
 TEST.install.exe = $(DESTDIR)$(PREFIX/)bin/$(notdir $(TEST.exe))
 
+ifeq (1,$(PTHREADW32.enabled))
+    TEST.libs += $(CONTRIB.build/)lib/libpthreadGC2.a
+endif
 ifeq (1,$(LIBICONV.enabled))
     TEST.libs += $(CONTRIB.build/)lib/libiconv.a
 endif
 ifeq (1,$(BZIP2.enabled))
     TEST.libs += $(CONTRIB.build/)lib/libbz2.a
+else
+       TEST.GCC.l += bz2
 endif
 ifeq (1,$(ZLIB.enabled))
     TEST.libs += $(CONTRIB.build/)lib/libz.a
+else
+       TEST.GCC.l += z
 endif
 
 ###############################################################################
@@ -40,13 +47,22 @@ TEST.GCC.I += $(LIBHB.GCC.I)
 
 ifeq ($(BUILD.system),darwin)
     TEST.GCC.f += IOKit CoreServices AudioToolbox
-    TEST.GCC.l += iconv bz2 z
+    TEST.GCC.l += iconv
 else ifeq ($(BUILD.system),linux)
-    TEST.GCC.l += bz2 z pthread dl m
+    TEST.GCC.l += pthread dl m
 else ifeq ($(BUILD.system),solaris)
-    TEST.GCC.l += bz2 z pthread nsl socket
+    TEST.GCC.l += pthread nsl socket
 else ifeq (1-mingw,$(BUILD.cross)-$(BUILD.system))
-    TEST.libs += $(CONTRIB.build/)lib/libpthreadGC2.a
+ifeq ($(HAS.iconv),1)
+    TEST.GCC.l += iconv
+endif
+ifeq ($(HAS.pthread),1)
+    TEST.GCC.l += pthreadGC2
+endif
+ifeq ($(HAS.dlfcn),1)
+    TEST.GCC.l += dl
+endif
     TEST.GCC.D += PTW32_STATIC_LIB
     TEST.GCC.l += iberty ws2_32
+       TEST.GCC.args.extra.exe++ += -static
 endif
index c510689..5f41d4d 100644 (file)
@@ -24,12 +24,17 @@ clean: test.clean
 ## skip install/uninstall on darwin
 ifneq ($(BUILD.system),darwin)
 
+test.install-strip: | $(dir $(TEST.install.exe))
+       $(CP.exe) $(TEST.exe) $(TEST.install.exe)
+       $(STRIP.exe) $(TEST.install.exe)
+
 test.install: | $(dir $(TEST.install.exe))
        $(CP.exe) $(TEST.exe) $(TEST.install.exe)
 
 test.uninstall:
        $(RM.exe) -f $(TEST.install.exe)
 
+install-strip: test.install-strip
 install: test.install
 uninstall: test.uninstall
 
index ad21868..a0354fd 100644 (file)
 #endif
 
 /* Options */
+#if defined( __APPLE_CC__ )
+#define EXTRA_VLC_DYLD_PATH "/Applications/VLC.app/Contents/MacOS/lib"
+#define DEFAULT_DYLD_PATH "/usr/local/lib:/usr/lib"
+
+static int    no_vlc_dylib = 0;
+#endif
 static int    debug       = HB_DEBUG_ALL;
 static int    update      = 0;
 static int    dvdnav      = 1;
@@ -37,7 +43,8 @@ static char * input       = NULL;
 static char * output      = NULL;
 static char * format      = NULL;
 static int    titleindex  = 1;
-static int    longest_title = 0;
+static int    titlescan   = 0;
+static int    main_feature = 0;
 static char * native_language = NULL;
 static int    native_dub  = 0;
 static int    twoPass     = 0;
@@ -51,10 +58,10 @@ static int    detelecine            = 0;
 static char * detelecine_opt        = 0;
 static int    decomb                = 0;
 static char * decomb_opt            = 0;
+static int    rotate                = 0;
+static char * rotate_opt            = 0;
 static int    grayscale   = 0;
 static int    vcodec      = HB_VCODEC_FFMPEG;
-static int    h264_13     = 0;
-static int    h264_30     = 0;
 static hb_list_t * audios = NULL;
 static hb_audio_config_t * audio = NULL;
 static int    num_audio_tracks = 0;
@@ -65,8 +72,11 @@ static char * arates      = NULL;
 static char * abitrates   = NULL;
 static char * acodecs     = NULL;
 static char * anames      = NULL;
+#ifdef __APPLE_CC__
+static int    default_acodec = HB_ACODEC_CA_AAC;
+#else
 static int    default_acodec = HB_ACODEC_FAAC;
-static int    default_abitrate = 160;
+#endif
 static int    audio_explicit = 0;
 static char ** subtracks   = NULL;
 static char ** subforce    = NULL;
@@ -115,10 +125,15 @@ static int    color_matrix  = 0;
 static int    preview_count = 10;
 static int    store_previews = 0;
 static int    start_at_preview = 0;
+static int64_t start_at_pts    = 0;
+static int    start_at_frame = 0;
+static char * start_at_string = NULL;
+static char * start_at_token = NULL;
 static int64_t stop_at_pts    = 0;
 static int    stop_at_frame = 0;
 static char * stop_at_string = NULL;
 static char * stop_at_token = NULL;
+static uint64_t min_title_duration = 900000LL;
 
 /* Exit cleanly on Ctrl-C */
 static volatile int die = 0;
@@ -181,11 +196,6 @@ int main( int argc, char ** argv )
         return 1;
     }
 
-#if defined( PTW32_STATIC_LIB )
-    pthread_win32_process_attach_np();
-    pthread_win32_thread_attach_np();
-#endif
-
     /* Register our error handler */
     hb_register_error_handler(&hb_cli_error_handler);
 
@@ -212,6 +222,7 @@ int main( int argc, char ** argv )
                      "date.\n" );
         }
         hb_close( &h );
+        hb_global_close();
         return 0;
     }
 
@@ -231,14 +242,14 @@ int main( int argc, char ** argv )
     /* Feed libhb with a DVD to scan */
     fprintf( stderr, "Opening %s...\n", input );
 
-    if (longest_title) {
+    if (main_feature) {
         /*
-         * We need to scan for all the titles in order to find the longest
+         * We need to scan for all the titles in order to find the main feature
          */
         titleindex = 0;
     }
 
-    hb_scan( h, input, titleindex, preview_count, store_previews );
+    hb_scan( h, input, titleindex, preview_count, store_previews, min_title_duration );
 
     /* Wait... */
     while( !die )
@@ -323,6 +334,7 @@ int main( int argc, char ** argv )
 
     /* Clean up */
     hb_close( &h );
+    hb_global_close();
     if( input )  free( input );
     if( output ) free( output );
     if( format ) free( format );
@@ -351,14 +363,10 @@ int main( int argc, char ** argv )
        if( x264opts2 ) free (x264opts2 );
     if (preset_name) free (preset_name);
     if( stop_at_string ) free( stop_at_string );
+    if( start_at_string ) free( start_at_string );
 
     fprintf( stderr, "HandBrake has exited.\n" );
 
-#if defined( PTW32_STATIC_LIB )
-    pthread_win32_thread_detach_np();
-    pthread_win32_process_detach_np();
-#endif
-
     return 0;
 }
 
@@ -378,10 +386,21 @@ static void PrintTitleInfo( hb_title_t * title )
     int i;
 
     fprintf( stderr, "+ title %d:\n", title->index );
-    fprintf( stderr, "  + vts %d, ttn %d, cells %d->%d (%d blocks)\n",
-             title->vts, title->ttn, title->cell_start, title->cell_end,
-             title->block_count );
-    if (dvdnav)
+    if ( title->index == title->job->feature )
+    {
+        fprintf( stderr, "  + Main Feature\n" );
+    }
+    if ( title->type == HB_STREAM_TYPE )
+    {
+        fprintf( stderr, "  + stream: %s\n", title->path );
+    }
+    else if ( title->type == HB_DVD_TYPE )
+    {
+        fprintf( stderr, "  + vts %d, ttn %d, cells %d->%d (%"PRIu64" blocks)\n",
+                title->vts, title->ttn, title->cell_start, title->cell_end,
+                title->block_count );
+    }
+    if (title->angle_count > 1)
         fprintf( stderr, "  + angle(s) %d\n", title->angle_count );
     fprintf( stderr, "  + duration: %02d:%02d:%02d\n",
              title->hours, title->minutes, title->seconds );
@@ -397,7 +416,7 @@ static void PrintTitleInfo( hb_title_t * title )
     for( i = 0; i < hb_list_count( title->list_chapter ); i++ )
     {
         chapter = hb_list_item( title->list_chapter, i );
-        fprintf( stderr, "    + %d: cells %d->%d, %d blocks, duration "
+        fprintf( stderr, "    + %d: cells %d->%d, %"PRIu64" blocks, duration "
                  "%02d:%02d:%02d\n", chapter->index,
                  chapter->cell_start, chapter->cell_end,
                  chapter->block_count, chapter->hours, chapter->minutes,
@@ -428,10 +447,11 @@ static void PrintTitleInfo( hb_title_t * title )
     for( i = 0; i < hb_list_count( title->list_subtitle ); i++ )
     {
         subtitle = hb_list_item( title->list_subtitle, i );
-        fprintf( stderr, "    + %d, %s (iso639-2: %s) (%s)\n", 
+        fprintf( stderr, "    + %d, %s (iso639-2: %s) (%s)(%s)\n", 
                  i + 1, subtitle->lang,
                  subtitle->iso639_2,
-                 (subtitle->format == TEXTSUB) ? "Text" : "Bitmap");
+                 (subtitle->format == TEXTSUB) ? "Text" : "Bitmap",
+                 hb_subsource_name(subtitle->source));
     }
 
     if(title->detected_interlacing)
@@ -442,11 +462,11 @@ static void PrintTitleInfo( hb_title_t * title )
 
 }
 
-static int test_sub_list( char ** list, char * needle, int pos )
+static int test_sub_list( char ** list, int pos )
 {
     int i;
 
-    if ( list == NULL || needle == NULL )
+    if ( list == NULL || pos == 0 )
         return 0;
 
     if ( list[0] == NULL && pos == 1 )
@@ -454,8 +474,9 @@ static int test_sub_list( char ** list, char * needle, int pos )
 
     for ( i = 0; list[i] != NULL; i++ )
     {
-        if ( strcasecmp( list[i], needle ) == 0 )
-            return i + 1;
+        int idx = strtol( list[i], NULL, 0 );
+        if ( idx == pos )
+            return 1;
     }
     return 0;
 }
@@ -476,7 +497,7 @@ static int HandleEvents( hb_handle_t * h )
         case HB_STATE_SCANNING:
             /* Show what title is currently being scanned */
             fprintf( stderr, "Scanning title %d", p.title_cur );
-            if( !titleindex )
+            if( !titleindex || titlescan )
                 fprintf( stderr, " of %d", p.title_count );
             fprintf( stderr, "...\n" );
             break;
@@ -507,15 +528,15 @@ static int HandleEvents( hb_handle_t * h )
                 die = 1;
                 break;
             }
-               if( longest_title )
+               if( main_feature )
                {
                 int i;
-                int longest_title_idx=0;
-                int longest_title_pos=-1;
-                int longest_title_time=0;
+                int main_feature_idx=0;
+                int main_feature_pos=-1;
+                int main_feature_time=0;
                 int title_time;
 
-                fprintf( stderr, "Searching for longest title...\n" );
+                fprintf( stderr, "Searching for main feature title...\n" );
 
                 for( i = 0; i < hb_list_count( list ); i++ )
                 {
@@ -523,29 +544,36 @@ static int HandleEvents( hb_handle_t * h )
                     title_time = (title->hours*60*60 ) + (title->minutes *60) + (title->seconds);
                     fprintf( stderr, " + Title (%d) index %d has length %dsec\n",
                              i, title->index, title_time );
-                    if( longest_title_time < title_time )
+                    if( main_feature_time < title_time )
+                    {
+                        main_feature_time = title_time;
+                        main_feature_pos = i;
+                        main_feature_idx = title->index;
+                    }
+                    if( title->job->feature == title->index )
                     {
-                        longest_title_time = title_time;
-                        longest_title_pos = i;
-                        longest_title_idx = title->index;
+                        main_feature_time = title_time;
+                        main_feature_pos = i;
+                        main_feature_idx = title->index;
+                        break;
                     }
                 }
-                if( longest_title_pos == -1 )
+                if( main_feature_pos == -1 )
                 {
-                    fprintf( stderr, "No longest title found.\n" );
+                    fprintf( stderr, "No main feature title found.\n" );
                     die = 1;
                     break;
                 }
-                titleindex = longest_title_idx;
-                fprintf( stderr, "Found longest title, setting title to %d\n",
-                         longest_title_idx);
+                titleindex = main_feature_idx;
+                fprintf( stderr, "Found main feature title, setting title to %d\n",
+                         main_feature_idx);
 
-                title = hb_list_item( list, longest_title_pos);
+                title = hb_list_item( list, main_feature_pos);
             } else {
                 title = hb_list_item( list, 0 );
             }
 
-            if( !titleindex )
+            if( !titleindex || titlescan )
             {
                 /* Scan-only mode, print infos and exit */
                 int i;
@@ -563,7 +591,7 @@ static int HandleEvents( hb_handle_t * h )
 
             PrintTitleInfo( title );
 
-            if( chapter_start && chapter_end && !stop_at_pts && !start_at_preview && !stop_at_frame )
+            if( chapter_start && chapter_end && !stop_at_pts && !start_at_preview && !stop_at_frame && !start_at_pts && !start_at_frame )
             {
                 job->chapter_start = MAX( job->chapter_start,
                                           chapter_start );
@@ -583,406 +611,564 @@ static int HandleEvents( hb_handle_t * h )
                 fprintf( stderr, "+ Using preset: %s", preset_name);
 
                 if (!strcmp(preset_name, "Universal"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    vcodec = HB_VCODEC_X264;
-                    job->vquality = 20.0;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1,1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac,ac3");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160,160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2,auto");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48,Auto");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0,0.0");
-                    }
-                    maxWidth = 720;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6");
-                    }
-                    anamorphic_mode = 2;
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "iPod"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->ipod_atom = 1;
-                    vcodec = HB_VCODEC_X264;
-                    job->vbitrate = 700;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                    maxWidth = 320;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0");
-                    }
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "iPhone & iPod Touch"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    vcodec = HB_VCODEC_X264;
-                    job->vquality = 20.0;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("128");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                    maxWidth = 480;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0");
-                    }
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "AppleTV"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->largeFileSize = 1;
-                    vcodec = HB_VCODEC_X264;
-                    job->vquality = 20.0;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1,1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac,ac3");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160,160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2,auto");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48,Auto");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0,0.0");
-                    }
-                    maxWidth = 960;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0");
-                    }
-                    anamorphic_mode = 2;
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "Normal"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    vcodec = HB_VCODEC_X264;
-                    job->vquality = 20.0;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
-                    }
-                    anamorphic_mode = 1;
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "High Profile"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    vcodec = HB_VCODEC_X264;
-                    job->vquality = 20.0;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1,1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac,ac3");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160,160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2,auto");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48,Auto");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0,0.0");
-                    }
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("b-adapt=2:rc-lookahead=50");
-                    }
-                    detelecine = 1;
-                    decomb = 1;
-                    anamorphic_mode = 2;
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "Classic"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->vbitrate = 1000;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                }
-
-                if (!strcmp(preset_name, "AppleTV Legacy"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->largeFileSize = 1;
-                    vcodec = HB_VCODEC_X264;
-                    job->vbitrate = 2500;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1,1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac,ac3");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160,160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2,auto");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48,Auto");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0,0.0");
-                    }
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
-                    }
-                    anamorphic_mode = 1;
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "iPhone Legacy"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->ipod_atom = 1;
-                    vcodec = HB_VCODEC_X264;
-                    job->vbitrate = 960;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("128");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                    maxWidth = 480;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0");
-                    }
-                    job->chapter_markers = 1;
-                }
-
-                if (!strcmp(preset_name, "iPod Legacy"))
-                {
-                    if( !mux )
-                    {
-                        mux = HB_MUX_MP4;
-                    }
-                    job->ipod_atom = 1;
-                    vcodec = HB_VCODEC_X264;
-                    job->vbitrate = 1500;
-                    if( !atracks )
-                    {
-                        atracks = strdup("1");
-                    }
-                    if( !acodecs )
-                    {
-                        acodecs = strdup("faac");
-                    }
-                    if( !abitrates )
-                    {
-                        abitrates = strdup("160");
-                    }
-                    if( !mixdowns )
-                    {
-                        mixdowns = strdup("dpl2");
-                    }
-                    if( !arates )
-                    {
-                        arates = strdup("48");
-                    }
-                    if( !dynamic_range_compression )
-                    {
-                        dynamic_range_compression = strdup("0.0");
-                    }
-                    maxWidth = 640;
-                    if( !x264opts )
-                    {
-                        x264opts = strdup("level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0");
-                    }
-                    job->chapter_markers = 1;
-                }
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1,1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac,copy:ac3");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160,160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2,auto");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto,Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0,0.0");
+                                       }
+                                       maxWidth = 720;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6");
+                                       }
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPod"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->ipod_atom = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vbitrate = 700;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 320;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0");
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPhone & iPod Touch"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("128");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 480;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0");
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPhone 4"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->largeFileSize = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       job->vrate_base = 900900;
+                                       job->cfr = 2;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 960;
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPad"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->largeFileSize = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       job->vrate_base = 900900;
+                                       job->cfr = 2;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 1024;
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "AppleTV"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->largeFileSize = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1,1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac,copy:ac3");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160,160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2,auto");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto,Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0,0.0");
+                                       }
+                                       maxWidth = 960;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500");
+                                       }
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "AppleTV 2"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->largeFileSize = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       job->vrate_base = 900900;
+                                       job->cfr = 2;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1,1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac,copy:ac3");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160,160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2,auto");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto,Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0,0.0");
+                                       }
+                                       maxWidth = 1280;
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "Normal"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0");
+                                       }
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 1;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "High Profile"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vquality = 20.0;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1,1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac,copy:ac3");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160,160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2,auto");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto,Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0,0.0");
+                                       }
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("b-adapt=2:rc-lookahead=50");
+                                       }
+                                       detelecine = 1;
+                                       decomb = 1;
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 2;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "Classic"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->vbitrate = 1000;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "AppleTV Legacy"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->largeFileSize = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vbitrate = 2500;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1,1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac,copy:ac3");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160,160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2,auto");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto,Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0,0.0");
+                                       }
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0");
+                                       }
+                                       if( !anamorphic_mode )
+                                       {
+                                               anamorphic_mode = 1;
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPhone Legacy"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->ipod_atom = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vbitrate = 960;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("128");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 480;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0");
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                               
+                               if (!strcmp(preset_name, "iPod Legacy"))
+                               {
+                                       if( !mux )
+                                       {
+                                               mux = HB_MUX_MP4;
+                                       }
+                                       job->ipod_atom = 1;
+                                       vcodec = HB_VCODEC_X264;
+                                       job->vbitrate = 1500;
+                                       if( !atracks )
+                                       {
+                                               atracks = strdup("1");
+                                       }
+                                       if( !acodecs )
+                                       {
+                                               acodecs = strdup("faac");
+                                       }
+                                       if( !abitrates )
+                                       {
+                                               abitrates = strdup("160");
+                                       }
+                                       if( !mixdowns )
+                                       {
+                                               mixdowns = strdup("dpl2");
+                                       }
+                                       if( !arates )
+                                       {
+                                               arates = strdup("Auto");
+                                       }
+                                       if( !dynamic_range_compression )
+                                       {
+                                               dynamic_range_compression = strdup("0.0");
+                                       }
+                                       maxWidth = 640;
+                                       if( !x264opts )
+                                       {
+                                               x264opts = strdup("level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0");
+                                       }
+                                       job->chapter_markers = 1;
+                                       
+                               }
+                                               
             }
 
                        if ( chapter_markers )
@@ -1063,6 +1249,12 @@ static int HandleEvents( hb_handle_t * h )
             
             /* Add selected filters */
             job->filters = hb_list_init();
+            
+            if( rotate )
+            {
+                hb_filter_rotate.settings = rotate_opt;
+                hb_list_add( job->filters, &hb_filter_rotate);
+            }
             if( detelecine )
             {
                 hb_filter_detelecine.settings = detelecine_opt;
@@ -1093,6 +1285,11 @@ static int HandleEvents( hb_handle_t * h )
             {
                 case 0: // Non-anamorphic
                     
+                    if (modulus)
+                    {
+                        job->modulus = modulus;
+                    }
+                    
                     if( width && height )
                     {
                         job->width  = width;
@@ -1101,15 +1298,27 @@ static int HandleEvents( hb_handle_t * h )
                     else if( width )
                     {
                         job->width = width;
+                        // do not exceed source dimensions by default
+                        if( !maxHeight )
+                            job->maxHeight = title->height;
                         hb_fix_aspect( job, HB_KEEP_WIDTH );
                     }
                     else if( height )
                     {
                         job->height = height;
+                        // do not exceed source dimensions by default
+                        if( !maxWidth )
+                            job->maxWidth = title->width;
                         hb_fix_aspect( job, HB_KEEP_HEIGHT );
                     }
                     else if( !width && !height )
                     {
+                        /* Default to cropped width when one isn't specified
+                         * avoids rounding to mod 16 regardless of modulus */
+                        job->width = title->width - job->crop[2] - job->crop[3];
+                        // do not exceed source dimensions by default
+                        if( !maxHeight )
+                            job->maxHeight = title->height;
                         hb_fix_aspect( job, HB_KEEP_WIDTH );
                     }
 
@@ -1124,7 +1333,7 @@ static int HandleEvents( hb_handle_t * h )
                     
                     if (modulus)
                     {
-                        job->anamorphic.modulus = modulus;
+                        job->modulus = modulus;
                     }
                     
                     if( itu_par )
@@ -1149,7 +1358,7 @@ static int HandleEvents( hb_handle_t * h )
                     
                     if (modulus)
                     {
-                        job->anamorphic.modulus = modulus;
+                        job->modulus = modulus;
                     }
                     
                     if( itu_par )
@@ -1236,7 +1445,7 @@ static int HandleEvents( hb_handle_t * h )
                 break;
             }
 
-            if( vquality >= 0.0 && ( ( vquality <= 1.0 ) || ( vcodec == HB_VCODEC_X264 ) || (vcodec == HB_VCODEC_FFMPEG) ) )
+            if( vquality >= 0.0 )
             {
                 job->vquality = vquality;
                 job->vbitrate = 0;
@@ -1250,14 +1459,6 @@ static int HandleEvents( hb_handle_t * h )
             {
                 job->vcodec = vcodec;
             }
-            if( h264_13 )
-            {
-                job->h264_level = 13;
-            }
-               if( h264_30 )
-               {
-                   job->h264_level = 30;
-            }
             if( vrate )
             {
                 job->cfr = cfr;
@@ -1497,6 +1698,10 @@ static int HandleEvents( hb_handle_t * h )
 
                     if( audio != NULL )
                     {
+                        if ( !strcasecmp( token, "auto" ) )
+                        {
+                            arate = audio->in.samplerate;
+                        }
                         if (!is_sample_rate_valid(arate))
                         {
                             fprintf(stderr, "Invalid sample rate %d, using input rate %d\n", arate, audio->in.samplerate);
@@ -1528,6 +1733,52 @@ static int HandleEvents( hb_handle_t * h )
                 }
             }
             /* Sample Rate */
+            
+            /* Audio Mixdown */
+            i = 0;
+            if ( mixdowns )
+            {
+                char * token = strtok(mixdowns, ",");
+                if (token == NULL)
+                    token = mixdowns;
+                while ( token != NULL )
+                {
+                    mixdown = hb_mixdown_get_mixdown_from_short_name(token);
+                    audio = hb_list_audio_config_item(job->list_audio, i);
+                    if( audio != NULL )
+                    {
+                        audio->out.mixdown = mixdown;
+                        if( (++i) >= num_audio_tracks )
+                            break;  /* We have more inputs than audio tracks, oops */
+                    }
+                    else
+                    {
+                        fprintf(stderr, "Ignoring mixdown, no audio tracks\n");
+                    }
+                    token = strtok(NULL, ",");
+                }
+            }
+            if (i < num_audio_tracks)
+            {
+                /* We have fewer inputs than audio tracks, use the default mixdown for the rest. Unless
+                 * we only have one input, then use that.
+                 */
+                int use_default = 0;
+                if (i != 1)
+                    use_default = 1;
+
+                for (; i < num_audio_tracks; i++)
+                {
+                    audio = hb_list_audio_config_item(job->list_audio, i);
+                    if (use_default)
+                    {
+                        // Get default for this tracks codec and layout
+                        mixdown = hb_get_default_mixdown( audio->out.codec, audio->in.channel_layout );
+                    }
+                    audio->out.mixdown = mixdown;
+                }
+            }
+            /* Audio Mixdown */
 
             /* Audio Bitrate */
             i = 0;
@@ -1560,11 +1811,19 @@ static int HandleEvents( hb_handle_t * h )
                  * for the remaining tracks. Unless we only have one input, then use
                  * that for all tracks.
                  */
+                int use_default = 0;
                 if (i != 1)
-                    abitrate = default_abitrate;
+                    use_default = 1;
+
                 for (; i < num_audio_tracks; i++)
                 {
                     audio = hb_list_audio_config_item(job->list_audio, i);
+                    if (use_default)
+                    {
+                        abitrate = hb_get_default_audio_bitrate( 
+                                        audio->out.codec, audio->out.samplerate,
+                                        audio->out.mixdown );
+                    }
                     audio->out.bitrate = abitrate;
                 }
             }
@@ -1610,45 +1869,6 @@ static int HandleEvents( hb_handle_t * h )
             }
             /* Audio DRC */
 
-            /* Audio Mixdown */
-            i = 0;
-            if ( mixdowns )
-            {
-                char * token = strtok(mixdowns, ",");
-                if (token == NULL)
-                    token = mixdowns;
-                while ( token != NULL )
-                {
-                    mixdown = hb_mixdown_get_mixdown_from_short_name(token);
-                    audio = hb_list_audio_config_item(job->list_audio, i);
-                    if( audio != NULL )
-                    {
-                        audio->out.mixdown = mixdown;
-                        if( (++i) >= num_audio_tracks )
-                            break;  /* We have more inputs than audio tracks, oops */
-                    }
-                    else
-                    {
-                        fprintf(stderr, "Ignoring mixdown, no audio tracks\n");
-                    }
-                    token = strtok(NULL, ",");
-                }
-            }
-            if (i < num_audio_tracks)
-            {
-                /* We have fewer inputs than audio tracks, use DPLII for the rest. Unless
-                 * we only have one input, then use that.
-                 */
-                if (i != 1)
-                    mixdown = HB_AMIXDOWN_DOLBYPLII;
-                for (; i < num_audio_tracks; i++)
-                {
-                   audio = hb_list_audio_config_item(job->list_audio, i);
-                   audio->out.mixdown = mixdown;
-                }
-            }
-            /* Audio Mixdown */
-
             /* Audio Track Names */
             i = 0;
             if ( anames )
@@ -1685,6 +1905,39 @@ static int HandleEvents( hb_handle_t * h )
             }
             /* Audio Track Names */
 
+            /* Fix up passthru that needs to fallback to ac3 encode */
+            for( i = 0; i < hb_list_count( job->list_audio ); )
+            {
+                audio = hb_list_audio_config_item( job->list_audio, i );
+                if ( ( audio->out.codec & HB_ACODEC_AC3 ) &&
+                     ( audio->out.codec & HB_ACODEC_PASS_FLAG ) &&
+                    !( audio->out.codec & audio->in.codec ) )
+                {
+                    // AC3 passthru not possible, fallback to AC3 encoder.
+                    fprintf( stderr, "AC3 passthru requested and input codec is not AC3 for track %d, using AC3 encoder\n",
+                        audio->out.track );
+                    audio->out.codec = HB_ACODEC_AC3;
+                    audio->out.mixdown = hb_get_default_mixdown( audio->out.codec, audio->in.channel_layout );
+                    audio->out.bitrate = hb_get_default_audio_bitrate( audio->out.codec, audio->out.samplerate,
+                        audio->out.mixdown );
+                }
+                // fix 'copy' to select a specific codec
+                if ( audio->out.codec & HB_ACODEC_PASS_FLAG )
+                {
+                    audio->out.codec &= (audio->in.codec | HB_ACODEC_PASS_FLAG);
+                    if ( !( audio->out.codec & HB_ACODEC_MASK ) )
+                    {
+                        // Passthru not possible, drop audio.
+                        fprintf( stderr, "Passthru requested and input codec is not the same as output codec for track %d, dropping track\n",
+                            audio->out.track );
+                        hb_audio_t * item = hb_list_item( job->list_audio, i );
+                        hb_list_rem( job->list_audio, item );
+                        continue;
+                    }
+                }
+                i++;
+            }
+
             if( size )
             {
                 job->vbitrate = hb_calc_bitrate( job, size );
@@ -1695,12 +1948,15 @@ static int HandleEvents( hb_handle_t * h )
             if( subtracks )
             {
                 char * token;
-                int    i, pos;
+                int    i;
+                int    burnpos = 0, defaultpos = 0;
 
-                pos = 0;
+                if ( subburn )
+                    burnpos = strtol( subburn, NULL, 0 );
+                if ( subdefault )
+                    defaultpos = strtol( subdefault, NULL, 0 );
                 for ( i = 0; subtracks[i] != NULL; i++ )
                 {
-                    pos++;
                     token = subtracks[i];
                     if( strcasecmp(token, "scan" ) == 0 )
                     {
@@ -1708,21 +1964,21 @@ static int HandleEvents( hb_handle_t * h )
 
                         if ( subburn != NULL )
                         {
-                            burn = ( pos == 1 && subburn[0] == 0 ) ||
-                                   ( strcmp( "scan", subburn ) == 0 );
+                            burn = ( i == 0 && subburn[0] == 0 ) ||
+                                   ( burnpos == i+1 );
                         }
                         if ( subdefault != NULL )
                         {
-                            def =  ( pos == 1 && subdefault[0] == 0 ) ||
-                                   ( strcmp( "scan", subdefault ) == 0 );
+                            def =  ( i == 0 && subdefault[0] == 0 ) ||
+                                   ( defaultpos == i+1 );
                         }
-                        force = test_sub_list( subforce, "scan", pos );
+                        force = test_sub_list( subforce, i+1 );
 
-                        if ( !burn && mux == HB_MUX_MKV )
+                        if ( !burn )
                         {
                             job->select_subtitle_config.dest = PASSTHRUSUB;
                         }
-                        else if ( burn )
+                        else
                         {
                             if ( sub_burned )
                             {
@@ -1730,14 +1986,9 @@ static int HandleEvents( hb_handle_t * h )
                             }
                             sub_burned = 1;
                         }
-                        if ( !( !burn && mux == HB_MUX_MP4 ) )
-                        {
-                            job->select_subtitle_config.force = force;
-                            job->select_subtitle_config.default_track = def;
-                            subtitle_scan = 1;
-                        } else {
-                            fprintf( stderr, "Warning: Subtitle Scan for MP4 requires the '--subtitle-burn' option to be selected\n");
-                        }
+                        job->select_subtitle_config.force = force;
+                        job->select_subtitle_config.default_track = def;
+                        subtitle_scan = 1;
                     }
                     else
                     {
@@ -1757,30 +2008,22 @@ static int HandleEvents( hb_handle_t * h )
 
                         if ( subburn != NULL )
                         {
-                            burn = ( pos == 1 && subburn[0] == 0 ) ||
-                                   ( strcmp( token, subburn ) == 0 );
+                            burn = ( i == 0 && subburn[0] == 0 ) ||
+                                   ( burnpos == i+1 );
                         }
                         if ( subdefault != NULL )
                         {
-                            def =  ( pos == 1 && subdefault[0] == 0 ) ||
-                                   ( strcmp( token, subdefault ) == 0 );
+                            def =  ( i == 0 && subdefault[0] == 0 ) ||
+                                   ( defaultpos == i+1 );
                         }
 
-                        force = test_sub_list(subforce, token, pos);
-
-                        if ( !burn && mux == HB_MUX_MKV && 
-                             subtitle->format == PICTURESUB)
-                        {
-                            sub_config.dest = PASSTHRUSUB;
-                        }
-                        else if (!burn && mux == HB_MUX_MP4 &&
-                             subtitle->format == PICTURESUB)
-                        {
-                            // Skip any non-burned vobsubs when output is mp4
-                            fprintf( stderr, "Warning: Skipping subtitle track %d, can't pass-through VOBSUBs in an MP4 container,\nadd '--subtitle-burn %d' to the command line\n", track+1, track+1 );
-                            continue;
-                        }
-                        else if ( burn && subtitle->format == PICTURESUB )
+                        force = test_sub_list(subforce, i+1);
+                        
+                        int supports_burn =
+                            ( subtitle->source == VOBSUB ) ||
+                            ( subtitle->source == SSASUB );
+                        
+                        if ( burn && supports_burn )
                         {
                             // Only allow one subtitle to be burned into video
                             if ( sub_burned )
@@ -1789,6 +2032,13 @@ static int HandleEvents( hb_handle_t * h )
                                 continue;
                             }
                             sub_burned = 1;
+                            
+                            // Mark as burn-in
+                            sub_config.dest = RENDERSUB;
+                        }
+                        else
+                        {
+                            sub_config.dest = PASSTHRUSUB;
                         }
                         sub_config.force = force;
                         sub_config.default_track = def;
@@ -1800,17 +2050,15 @@ static int HandleEvents( hb_handle_t * h )
             if( srtfile )
             {
                 char * token;
-                int i, pos;
+                int i;
                 hb_subtitle_config_t sub_config;
 
-                pos = 0;
                 for( i=0; srtfile[i] != NULL; i++ )
                 {
                     char *codeset = "L1";
                     int64_t offset = 0;
                     char *lang = "und";
 
-                    pos++;
                     token = srtfile[i];
                     if( srtcodeset && srtcodeset[i] )
                     {
@@ -1827,8 +2075,10 @@ static int HandleEvents( hb_handle_t * h )
                     sub_config.default_track = 
                            ( srtdefault != -1 ) && ( srtdefault == i + 1 );
                     sub_config.force = 0;
-                    strncpy( sub_config.src_filename, srtfile[i], 128);
-                    strncpy( sub_config.src_codeset, codeset, 40);
+                    strncpy( sub_config.src_filename, srtfile[i], 255);
+                    sub_config.src_filename[255] = 0;
+                    strncpy( sub_config.src_codeset, codeset, 39);
+                    sub_config.src_codeset[39] = 0;
                     sub_config.offset = offset;
 
                     hb_srt_add( job, &sub_config, lang);
@@ -1967,6 +2217,18 @@ static int HandleEvents( hb_handle_t * h )
                 subtitle_scan = 0;
             }
             
+            if( start_at_pts )
+            {
+                job->pts_to_start = start_at_pts;
+                subtitle_scan = 0;
+            }
+            
+            if( start_at_frame )
+            {
+                job->frame_to_start = start_at_frame;
+                subtitle_scan = 0;
+            }
+            
             if( subtitle_scan )
             {
                 char *x264opts_tmp;
@@ -2070,6 +2332,17 @@ static int HandleEvents( hb_handle_t * h )
         }
 
 #define p s.param.working
+        case HB_STATE_SEARCHING:
+            fprintf( stdout, "\rEncoding: task %d of %d, Searching for start time, %.2f %%",
+                     p.job_cur, p.job_count, 100.0 * p.progress );
+            if( p.seconds > -1 )
+            {
+                fprintf( stdout, " (ETA %02dh%02dm%02ds)", 
+                         p.hours, p.minutes, p.seconds );
+            }
+            fflush(stdout);
+            break;
+
         case HB_STATE_WORKING:
             fprintf( stdout, "\rEncoding: task %d of %d, %.2f %%",
                      p.job_cur, p.job_count, 100.0 * p.progress );
@@ -2164,9 +2437,10 @@ static void ShowHelp()
 
     "### Source Options-----------------------------------------------------------\n\n"
     "    -i, --input <string>    Set input device\n"
-    "    -t, --title <number>    Select a title to encode (0 to scan only,\n"
+    "    -t, --title <number>    Select a title to encode (0 to scan all titles only,\n"
     "                            default: 1)\n"
-    "    -L, --longest           Select the longest title\n"
+    "        --scan              Scan selected title only.\n"
+    "        --main-feature      Detect and select the main feature title.\n"
     "    -c, --chapters <string> Select chapters (e.g. \"1-3\" for chapters\n"
     "                            1 to 3, or \"3\" for chapter 3 only,\n"
     "                            default: all chapters)\n"
@@ -2175,6 +2449,8 @@ static void ShowHelp()
     "                            and whether or not they're stored to disk (0 or 1).\n"
     "                            (default: 10:0)\n"
     "    --start-at-preview <#>  Start encoding at a given preview.\n"
+    "    --start-at    <unit:#>  Start encoding at a given frame, duration (in seconds),\n"
+    "                            or pts (on a 90kHz clock)\n"
     "    --stop-at     <unit:#>  Stop encoding at a given frame, duration (in seconds),\n"
     "                            or pts (on a 90kHz clock)"
     "\n"
@@ -2197,7 +2473,7 @@ static void ShowHelp()
     "    -x, --x264opts <string> Specify advanced x264 options in the\n"
     "                            same style as mencoder:\n"
     "                            option1=value1:option2=value2\n"
-    "    -q, --quality <float>   Set video quality (0.0..1.0)\n"
+    "    -q, --quality <number>  Set video quality\n"
     "    -S, --size <MB>         Set target size\n"
     "    -b, --vb <kb/s>         Set video bitrate (default: 1000)\n"
     "    -2, --two-pass          Use two-pass mode\n"
@@ -2237,23 +2513,29 @@ static void ShowHelp()
 
 #ifdef __APPLE_CC__
     fprintf( out,
-    "    -E, --aencoder <string> Audio encoder(s) (ca_aac/faac/lame/vorbis/ac3/dts) \n"
-    "                            ac3 and dts meaning passthrough\n"
+    "    -E, --aencoder <string> Audio encoder(s)\n"
+    "                                (ca_aac/faac/lame/vorbis/ac3/copy/copy:ac3/copy:dts)\n"
+    "                            copy, copy:ac3 and copy:dts meaning passthrough.\n"
+    "                            copy will passthrough either ac3 or dts.\n"
     "                            Separated by commas for more than one audio track.\n"
-    "                            (default: guessed)\n" );
+    "                            (default: ca_aac)\n" );
 #else
     fprintf( out,
-    "    -E, --aencoder <string> Audio encoder(s) (faac/lame/vorbis/ac3/dts) \n"
-    "                            ac3 and dts meaning passthrough\n"
+    "    -E, --aencoder <string> Audio encoder(s):\n"
+    "                                (faac/lame/vorbis/ac3/copy/copy:ac3/copy:dts)\n"
+    "                            copy, copy:ac3 and copy:dts meaning passthrough.\n"
+    "                            copy will passthrough either ac3 or dts.\n"
     "                            Separated by commas for more than one audio track.\n"
-    "                            (default: guessed)\n" );
+    "                            (default: faac for mp4, lame for mkv)\n" );
 #endif
     fprintf( out,
-    "    -B, --ab <kb/s>         Set audio bitrate(s)  (default: 160)\n"
+    "    -B, --ab <kb/s>         Set audio bitrate(s) (default: depends on the\n"
+    "                            selected codec, mixdown and samplerate)\n"
     "                            Separated by commas for more than one audio track.\n"
     "    -6, --mixdown <string>  Format(s) for surround sound downmixing\n"
     "                            Separated by commas for more than one audio track.\n"
-    "                            (mono/stereo/dpl1/dpl2/6ch, default: dpl2)\n"
+    "                            (mono/stereo/dpl1/dpl2/6ch, default: up to 6ch for ac3,\n"
+    "                            up to dpl2 for other encoders)\n"
     "    -R, --arate             Set audio samplerate(s) (" );
     for( i = 0; i < hb_audio_rates_count; i++ )
     {
@@ -2292,8 +2574,8 @@ static void ShowHelp()
     "    --itu-par               Use wider, ITU pixel aspect values for loose and\n"
     "                            custom anamorphic, useful with underscanned sources\n"
     "    --modulus               Set the number you want the scaled pixel dimensions\n"
-    "      <number>              to divide cleanly by, for loose and custom\n"
-    "                            anamorphic modes (default: 16)\n"
+    "      <number>              to divide cleanly by. Does not affect strict\n"
+    "                            anamorphic mode, which is always mod 2 (default: 16)\n"
     "    -M  --color-matrix      Set the color space signaled by the output\n"
     "          <601 or 709>      (Bt.601 is mostly for SD content, Bt.709 for HD,\n"
     "                             default: set by resolution)\n"
@@ -2319,6 +2601,8 @@ static void ShowHelp()
      "          <weak/medium/strong>\n"
      "    -7, --deblock           Deblock video with pp7 filter\n"
      "          <QP:M>            (default 5:2)\n"
+     "        --rotate            Flips images axes\n"
+     "          <M>               (default 3)\n"
     "    -g, --grayscale         Grayscale encoding\n"
     "\n"
 
@@ -2326,7 +2610,7 @@ static void ShowHelp()
     "    -s, --subtitle <string> Select subtitle track(s), separated by commas\n"
     "                            More than one output track can be used for one\n"
     "                            input.\n"
-    "                            (\"1,2,3\" for multiple tracks.\n"
+    "                            Example: \"1,2,3\" for multiple tracks.\n"
     "                            A special track name \"scan\" adds an extra 1st pass.\n"
     "                            This extra pass scans subtitles matching the\n"
     "                            language of the first audio or the language \n"
@@ -2336,18 +2620,22 @@ static void ShowHelp()
     "                            for short foreign language segments. Best used in\n"
     "                            conjunction with --subtitle-forced.\n"
     "    -F, --subtitle-forced   Only display subtitles from the selected stream if\n"
-    "          <string>          the subtitle has the forced flag set. May be used in\n"
-    "                            conjunction with \"scan\" track to auto-select\n"
-    "                            a stream if it contains forced subtitles.\n"
+    "          <string>          the subtitle has the forced flag set. The values in\n"
+    "                            \"string\" are indexes into the subtitle list\n"
+    "                            specified with '--subtitle'.\n"
     "                            Separated by commas for more than one audio track.\n"
-    "                            (\"1,2,3\" for multiple tracks.\n"
-    "                            If \"string\" is omitted, the first trac is forced.\n"
+    "                            Example: \"1,2,3\" for multiple tracks.\n"
+    "                            If \"string\" is omitted, the first track is forced.\n"
     "        --subtitle-burn     \"Burn\" the selected subtitle into the video track\n"
-    "          <number>          If \"number\" is omitted, the first trac is burned.\n"
+    "          <number>          If \"number\" is omitted, the first track is burned.\n"
+    "                            \"number\" is an index into the subtitle list\n"
+    "                            specified with '--subtitle'.\n"
     "        --subtitle-default  Flag the selected subtitle as the default subtitle\n"
     "          <number>          to be displayed upon playback.  Setting no default\n"
     "                            means no subtitle will be automatically displayed\n"
-    "                            If \"number\" is omitted, the first trac is default.\n"
+    "                            If \"number\" is omitted, the first track is default.\n"
+    "                            \"number\" is an index into the subtitle list\n"
+    "                            specified with '--subtitle'.\n"
     "    -N, --native-language   Specifiy the your language preference. When the first\n"
     "          <string>          audio track does not match your native language then\n"
     "                            select the first subtitle that does. When used in\n"
@@ -2387,37 +2675,46 @@ static void ShowHelp()
  ****************************************************************************/
 static void ShowPresets()
 {
-    printf("\n< Apple\n");
-
-    printf("\n   + Universal:  -e x264  -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:bframes=0:8x8dct=0:trellis=0:subme=6\n");
-
-    printf("\n   + iPod:  -e x264  -b 700 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0\n");
-
-    printf("\n   + iPhone & iPod Touch:  -e x264  -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:subme=6:8x8dct=0:trellis=0\n");
-
-    printf("\n   + AppleTV:  -e x264  -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-adapt=2:weightb=0:trellis=0:weightp=0\n");
-
+       fprintf( stderr, "%s - %s - %s\n", HB_PROJECT_TITLE, HB_PROJECT_BUILD_TITLE, HB_PROJECT_URL_WEBSITE );
+       
+       printf("\n< Apple\n");
+       
+    printf("\n   + Universal:  -e x264  -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -X 720 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:bframes=0:weightp=0:8x8dct=0:trellis=0:subme=6\n");
+       
+    printf("\n   + iPod:  -e x264  -b 700 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 320 -m -x level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subme=6:8x8dct=0:trellis=0\n");
+       
+    printf("\n   + iPhone & iPod Touch:  -e x264  -q 20.0 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -X 480 -m -x cabac=0:ref=2:me=umh:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0\n");
+       
+    printf("\n   + iPhone 4:  -e x264  -q 20.0 -r 29.97 --pfr  -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -4 -X 960 --loose-anamorphic -m\n");
+       
+    printf("\n   + iPad:  -e x264  -q 20.0 -r 29.97 --pfr  -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -4 -X 1024 --loose-anamorphic -m\n");
+       
+    printf("\n   + AppleTV:  -e x264  -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 960 --loose-anamorphic -m -x cabac=0:ref=2:me=umh:b-pyramid=none:b-adapt=2:weightb=0:trellis=0:weightp=0:vbv-maxrate=9500:vbv-bufsize=9500\n");
+       
+    printf("\n   + AppleTV 2:  -e x264  -q 20.0 -r 29.97 --pfr  -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 -X 1280 --loose-anamorphic -m\n");
+       
     printf("\n>\n");
-
+       
     printf("\n< Regular\n");
-
-    printf("\n   + Normal:  -e x264  -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 --strict-anamorphic -m -x ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0\n");
-
-    printf("\n   + High Profile:  -e x264  -q 20.0 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x b-adapt=2:rc-lookahead=50\n");
-
+       
+    printf("\n   + Normal:  -e x264  -q 20.0 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 --strict-anamorphic -m -x ref=2:bframes=2:subme=6:mixed-refs=0:weightb=0:8x8dct=0:trellis=0\n");
+       
+    printf("\n   + High Profile:  -e x264  -q 20.0 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 --detelecine --decomb --loose-anamorphic -m -x b-adapt=2:rc-lookahead=50\n");
+       
     printf("\n>\n");
-
+       
     printf("\n< Legacy\n");
-
-    printf("\n   + Classic:  -b 1000 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4\n");
-
-    printf("\n   + AppleTV Legacy:  -e x264  -b 2500 -a 1,1 -E faac,ac3 -B 160,160 -6 dpl2,auto -R 48,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
-
-    printf("\n   + iPhone Legacy:  -e x264  -b 960 -a 1 -E faac -B 128 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:subme=6:8x8dct=0:trellis=0\n");
-
-    printf("\n   + iPod Legacy:  -e x264  -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R 48 -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0\n");
-
+       
+    printf("\n   + Classic:  -b 1000 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4\n");
+       
+    printf("\n   + AppleTV Legacy:  -e x264  -b 2500 -a 1,1 -E faac,copy:ac3 -B 160,160 -6 dpl2,auto -R Auto,Auto -D 0.0,0.0 -f mp4 -4 --strict-anamorphic -m -x ref=1:b-pyramid=none:weightp=0:subme=5:me=umh:no-fast-pskip=1:cabac=0:weightb=0:8x8dct=0:trellis=0\n");
+       
+    printf("\n   + iPhone Legacy:  -e x264  -b 960 -a 1 -E faac -B 128 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 480 -m -x level=30:cabac=0:ref=1:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:bframes=0:weightp=0:subme=6:8x8dct=0:trellis=0\n");
+       
+    printf("\n   + iPod Legacy:  -e x264  -b 1500 -a 1 -E faac -B 160 -6 dpl2 -R Auto -D 0.0 -f mp4 -I -X 640 -m -x level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:psy-rd=0,0:subme=6:8x8dct=0:trellis=0\n");
+       
     printf("\n>\n");
+
 }
 
 static char * hb_strndup( char * str, int len )
@@ -2476,21 +2773,26 @@ static int ParseOptions( int argc, char ** argv )
     
     #define PREVIEWS            257
     #define START_AT_PREVIEW    258
-    #define STOP_AT             259
-    #define ANGLE               260
-    #define DVDNAV              261
-    #define DISPLAY_WIDTH       262
-    #define PIXEL_ASPECT        263
-    #define MODULUS             264
-    #define KEEP_DISPLAY_ASPECT 265
-    #define SUB_BURNED          266
-    #define SUB_DEFAULT         267
-    #define NATIVE_DUB          268
-    #define SRT_FILE            269
-    #define SRT_CODESET         270
-    #define SRT_OFFSET          271
-    #define SRT_LANG            272
-    #define SRT_DEFAULT         273
+    #define START_AT            259
+    #define STOP_AT             260
+    #define ANGLE               261
+    #define DVDNAV              262
+    #define DISPLAY_WIDTH       263
+    #define PIXEL_ASPECT        264
+    #define MODULUS             265
+    #define KEEP_DISPLAY_ASPECT 266
+    #define SUB_BURNED          267
+    #define SUB_DEFAULT         268
+    #define NATIVE_DUB          269
+    #define SRT_FILE            270
+    #define SRT_CODESET         271
+    #define SRT_OFFSET          272
+    #define SRT_LANG            273
+    #define SRT_DEFAULT         274
+    #define ROTATE_FILTER       275
+    #define SCAN_ONLY           276
+    #define MAIN_FEATURE        277
+    #define MIN_DURATION        278
     
     for( ;; )
     {
@@ -2510,7 +2812,9 @@ static int ParseOptions( int argc, char ** argv )
             { "ipod-atom",   no_argument,       NULL,    'I' },
 
             { "title",       required_argument, NULL,    't' },
-            { "longest",     no_argument,       NULL,    'L' },
+            { "min-duration",required_argument, NULL,    MIN_DURATION },
+            { "scan",        no_argument,       NULL,    SCAN_ONLY },
+            { "main-feature",no_argument,       NULL,    MAIN_FEATURE },
             { "chapters",    required_argument, NULL,    'c' },
             { "angle",       required_argument, NULL,    ANGLE },
             { "markers",     optional_argument, NULL,    'm' },
@@ -2537,6 +2841,7 @@ static int ParseOptions( int argc, char ** argv )
             { "detelecine",  optional_argument, NULL,    '9' },
             { "decomb",      optional_argument, NULL,    '5' },
             { "grayscale",   no_argument,       NULL,    'g' },
+            { "rotate",      optional_argument, NULL,   ROTATE_FILTER },
             { "strict-anamorphic",  no_argument, &anamorphic_mode, 1 },
             { "loose-anamorphic", no_argument, &anamorphic_mode, 2 },
             { "custom-anamorphic", no_argument, &anamorphic_mode, 3 },
@@ -2566,18 +2871,25 @@ static int ParseOptions( int argc, char ** argv )
             { "color-matrix",required_argument, NULL,    'M' },
             { "previews",    required_argument, NULL,    PREVIEWS },
             { "start-at-preview", required_argument, NULL, START_AT_PREVIEW },
+            { "start-at",    required_argument, NULL,    START_AT },
             { "stop-at",    required_argument, NULL,     STOP_AT },
             { "vfr",         no_argument,       &cfr,    0 },
             { "cfr",         no_argument,       &cfr,    1 },
             { "pfr",         no_argument,       &cfr,    2 },
+#if defined( __APPLE_CC__ )
+            { "no-vlc-dylib-path", no_argument, &no_vlc_dylib,    1 },
+#endif
             { 0, 0, 0, 0 }
           };
 
         int option_index = 0;
         int c;
+        int cur_optind;
 
-               c = getopt_long( argc, argv,
-                                                "hv::uC:f:4i:Io:t:Lc:m::M:a:A:6:s:UF::N:e:E:2dD:7895gOw:l:n:b:q:S:B:r:R:x:TY:X:Z:z",
+        cur_optind = optind;
+        c = getopt_long( argc, argv,
+                         "hv::uC:f:4i:Io:t:c:m::M:a:A:6:s:UF::N:e:E:"
+                         "2dD:7895gOw:l:n:b:q:S:B:r:R:x:TY:X:Z:z",
                          long_options, &option_index );
         if( c < 0 )
         {
@@ -2655,8 +2967,11 @@ static int ParseOptions( int argc, char ** argv )
             case 't':
                 titleindex = atoi( optarg );
                 break;
-            case 'L':
-                longest_title = 1;
+            case SCAN_ONLY:
+                titlescan = 1;
+                break;
+            case MAIN_FEATURE:
+                main_feature = 1;
                 break;
             case 'c':
             {
@@ -2837,6 +3152,13 @@ static int ParseOptions( int argc, char ** argv )
             case 'g':
                 grayscale = 1;
                 break;
+            case ROTATE_FILTER:
+                if( optarg != NULL )
+                {
+                    rotate_opt = strdup( optarg );
+                }
+                rotate = 1;
+                break;
             case DISPLAY_WIDTH:
                 if( optarg != NULL )
                 {
@@ -2864,16 +3186,6 @@ static int ParseOptions( int argc, char ** argv )
                 {
                     vcodec = HB_VCODEC_X264;
                 }
-                else if( !strcasecmp( optarg, "x264b13" ) )
-                {
-                    vcodec = HB_VCODEC_X264;
-                    h264_13 = 1;
-                }
-                else if( !strcasecmp( optarg, "x264b30" ) )
-                {
-                    vcodec = HB_VCODEC_X264;
-                    h264_30 = 1;
-                }
                 else if( !strcasecmp( optarg, "theora" ) )
                 {
                     vcodec = HB_VCODEC_THEORA;
@@ -2976,6 +3288,26 @@ static int ParseOptions( int argc, char ** argv )
             case START_AT_PREVIEW:
                 start_at_preview = atoi( optarg );
                 break;
+            case START_AT:
+                start_at_string = strdup( optarg );
+                start_at_token = strtok( start_at_string, ":");
+                if( !strcmp( start_at_token, "frame" ) )
+                {
+                    start_at_token = strtok( NULL, ":");
+                    start_at_frame = atoi(start_at_token);
+                }
+                else if( !strcmp( start_at_token, "pts" ) )
+                {
+                    start_at_token = strtok( NULL, ":");
+                    sscanf( start_at_token, "%"SCNd64, &start_at_pts );
+                }
+                else if( !strcmp( start_at_token, "duration" ) )
+                {
+                    start_at_token = strtok( NULL, ":");
+                    sscanf( start_at_token, "%"SCNd64, &start_at_pts );
+                    start_at_pts *= 90000LL;
+                }
+                break;
             case STOP_AT:
                 stop_at_string = strdup( optarg );
                 stop_at_token = strtok( stop_at_string, ":");
@@ -3002,8 +3334,11 @@ static int ParseOptions( int argc, char ** argv )
                 else if( atoi( optarg ) == 709 )
                     color_matrix = 2;
                 break;
+            case MIN_DURATION:
+                min_title_duration = strtol( optarg, NULL, 0 );
+                break;
             default:
-                fprintf( stderr, "unknown option (%s)\n", argv[optind] );
+                fprintf( stderr, "unknown option (%s)\n", argv[cur_optind] );
                 return -1;
         }
     }
@@ -3011,8 +3346,109 @@ static int ParseOptions( int argc, char ** argv )
     return 0;
 }
 
+char * str_printf(const char *fmt, ...)
+{
+    /* Guess we need no more than 100 bytes. */
+    int len;
+    va_list ap;
+    int size = 100;
+    char *tmp, *str = NULL;
+
+    str = (char*)malloc(size);
+    while (1) 
+    {
+        /* Try to print in the allocated space. */
+        va_start(ap, fmt);
+        len = vsnprintf(str, size, fmt, ap);
+        va_end(ap);
+
+        /* If that worked, return the string. */
+        if (len > -1 && len < size) {
+            return str;
+        }
+
+        /* Else try again with more space. */
+        if (len > -1)    /* glibc 2.1 */
+            size = len+1; /* precisely what is needed */
+        else           /* glibc 2.0 */
+            size *= 2;  /* twice the old size */
+
+        tmp = (char*)realloc(str, size);
+        if (tmp == NULL) {
+            return str;
+        }
+        str = tmp;
+    }
+}
+
 static int CheckOptions( int argc, char ** argv )
 {
+#if defined( __APPLE_CC__ )
+    // If OSX, add VLC dylib path and exec to make it stick.
+    char *dylib_path;
+
+    if ( !no_vlc_dylib )
+    {
+        dylib_path = getenv("DYLD_FALLBACK_LIBRARY_PATH");
+        if ( dylib_path == NULL ||
+             strstr( dylib_path, "/Applications/VLC.app/Contents/MacOS/lib" ) == NULL )
+        {
+            char *path = NULL;
+            char *home;
+            int result = -1;
+
+            home = getenv("HOME");
+
+            if ( dylib_path == NULL )
+            {
+                // Set the system default of $HOME/lib:/usr/local/lib:/usr/lib
+                // And add our extra path
+                if ( home != NULL )
+                {
+                    path = str_printf("%s/lib:%s:%s:%s%s", home, 
+                                      DEFAULT_DYLD_PATH, 
+                                      EXTRA_VLC_DYLD_PATH, 
+                                      home, EXTRA_VLC_DYLD_PATH);
+                }
+                else
+                {
+                    path = str_printf("%s:%s", DEFAULT_DYLD_PATH, EXTRA_VLC_DYLD_PATH);
+                }
+                if ( path != NULL )
+                    result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1);
+            }
+            else
+            {
+                // add our extra path
+                if ( home != NULL )
+                {
+                    path = str_printf("%s:%s:%s%s", dylib_path, EXTRA_VLC_DYLD_PATH,
+                                                        home, EXTRA_VLC_DYLD_PATH);
+                }
+                else
+                {
+                    path = str_printf("%s:%s", dylib_path, EXTRA_VLC_DYLD_PATH);
+                }
+                if ( path != NULL )
+                    result = setenv("DYLD_FALLBACK_LIBRARY_PATH", path, 1);
+            }
+            if ( result == 0 )
+            {
+                const char ** new_argv;
+                int i;
+
+                new_argv = (const char**)malloc( (argc + 2) * sizeof(char*) );
+                new_argv[0] = argv[0];
+                new_argv[1] = "--no-vlc-dylib-path";
+                for (i = 1; i < argc; i++)
+                    new_argv[i+1] = argv[i];
+                new_argv[i+1] = NULL;
+                execv(new_argv[0], (char* const*)new_argv);
+            }
+        }
+    }
+#endif
+
     if( update )
     {
         return 0;
@@ -3026,7 +3462,7 @@ static int CheckOptions( int argc, char ** argv )
     }
 
     /* Parse format */
-    if( titleindex > 0 )
+    if( titleindex > 0 && !titlescan )
     {
         if( output == NULL || *output == '\0' )
         {
@@ -3041,18 +3477,17 @@ static int CheckOptions( int argc, char ** argv )
 
             /* autodetect */
             if( p && ( !strcasecmp( p, ".mp4" )  ||
-                            !strcasecmp( p, ".m4v" ) ) )
+                       !strcasecmp( p, ".m4v" ) ) )
             {
-                if ( h264_30 == 1 )
-                    mux = HB_MUX_IPOD;
-                else
-                    mux = HB_MUX_MP4;
-                default_acodec = HB_ACODEC_FAAC;
+                mux = HB_MUX_MP4;
             }
             else if( p && !strcasecmp(p, ".mkv" ) )
             {
                 mux = HB_MUX_MKV;
-                default_acodec = HB_ACODEC_AC3;
+#ifndef __APPLE_CC__
+                // default to Lame for MKV (except under OS X where Core Audio is available)
+                default_acodec = HB_ACODEC_LAME;
+#endif
             }
             else
             {
@@ -3064,16 +3499,15 @@ static int CheckOptions( int argc, char ** argv )
         else if( !strcasecmp( format, "mp4" ) ||
                  !strcasecmp( format, "m4v" ) )
         {
-            if ( h264_30 == 1)
-                mux = HB_MUX_IPOD;
-            else
-                mux = HB_MUX_MP4;
-            default_acodec = HB_ACODEC_FAAC;
+            mux = HB_MUX_MP4;
         }
         else if( !strcasecmp( format, "mkv" ) )
         {
             mux = HB_MUX_MKV;
-            default_acodec = HB_ACODEC_AC3;
+#ifndef __APPLE_CC__
+            // default to Lame for MKV (except under OS X where Core Audio is available)
+            default_acodec = HB_ACODEC_LAME;
+#endif
         }
         else
         {
@@ -3092,9 +3526,17 @@ static int get_acodec_for_string( char *codec )
     {
         return HB_ACODEC_AC3;
     }
-    else if( !strcasecmp( codec, "dts" ) || !strcasecmp( codec, "dca" ) )
+    else if( !strcasecmp( codec, "copy" ) )
+    {
+        return HB_ACODEC_AC3_PASS | HB_ACODEC_DCA_PASS;
+    }
+    else if( !strcasecmp( codec, "copy:ac3" ) )
+    {
+        return HB_ACODEC_AC3_PASS;
+    }
+    else if( !strcasecmp( codec, "copy:dts" ) || !strcasecmp( codec, "copy:dca" ) )
     {
-        return HB_ACODEC_DCA;
+        return HB_ACODEC_DCA_PASS;
     }
     else if( !strcasecmp( codec, "lame" ) )
     {
index 0ac76d5..43e5ba8 100644 (file)
@@ -1,8 +1,8 @@
 ï»¿/*  AudioPanel.Designer.cs $\r
        \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
@@ -35,14 +35,6 @@ namespace Handbrake.Controls
         private void InitializeComponent()\r
         {\r
             this.components = new System.ComponentModel.Container();\r
-            this.lv_audioList = new System.Windows.Forms.ListView();\r
-            this.col_id = new System.Windows.Forms.ColumnHeader();\r
-            this.col_Source = new System.Windows.Forms.ColumnHeader();\r
-            this.col_codec = new System.Windows.Forms.ColumnHeader();\r
-            this.col_mixdown = new System.Windows.Forms.ColumnHeader();\r
-            this.col_samplerate = new System.Windows.Forms.ColumnHeader();\r
-            this.col_bitrate = new System.Windows.Forms.ColumnHeader();\r
-            this.col_drc = new System.Windows.Forms.ColumnHeader();\r
             this.audioMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r
             this.audioList_moveup = new System.Windows.Forms.ToolStripMenuItem();\r
             this.audioList_movedown = new System.Windows.Forms.ToolStripMenuItem();\r
@@ -51,13 +43,13 @@ namespace Handbrake.Controls
             this.btn_RemoveAudioTrack = new System.Windows.Forms.Button();\r
             this.btn_addAudioTrack = new System.Windows.Forms.Button();\r
             this.lbl_drc = new System.Windows.Forms.Label();\r
-            this.label16 = new System.Windows.Forms.Label();\r
+            this.lbl_drcHeader = new System.Windows.Forms.Label();\r
             this.tb_drc = new System.Windows.Forms.TrackBar();\r
             this.label68 = new System.Windows.Forms.Label();\r
-            this.label67 = new System.Windows.Forms.Label();\r
-            this.label66 = new System.Windows.Forms.Label();\r
+            this.lbl_sampleRate = new System.Windows.Forms.Label();\r
+            this.lbl_bitrate = new System.Windows.Forms.Label();\r
             this.label65 = new System.Windows.Forms.Label();\r
-            this.label14 = new System.Windows.Forms.Label();\r
+            this.lbl_mixdown = new System.Windows.Forms.Label();\r
             this.drp_audioEncoder = new System.Windows.Forms.ComboBox();\r
             this.label27 = new System.Windows.Forms.Label();\r
             this.drp_audioMix = new System.Windows.Forms.ComboBox();\r
@@ -66,69 +58,20 @@ namespace Handbrake.Controls
             this.drp_audioSample = new System.Windows.Forms.ComboBox();\r
             this.AudioTrackGroup = new System.Windows.Forms.GroupBox();\r
             this.AudioMenuRowHeightHack = new System.Windows.Forms.ImageList(this.components);\r
+            this.audioList = new System.Windows.Forms.DataGridView();\r
+            this.Track = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.AudioCodec = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.Mixdown = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.Samplerate = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.Bitrate = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
+            this.DRC = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
             this.audioMenu.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.tb_drc)).BeginInit();\r
             this.AudioTrackGroup.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.audioList)).BeginInit();\r
             this.SuspendLayout();\r
             // \r
-            // lv_audioList\r
-            // \r
-            this.lv_audioList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {\r
-            this.col_id,\r
-            this.col_Source,\r
-            this.col_codec,\r
-            this.col_mixdown,\r
-            this.col_samplerate,\r
-            this.col_bitrate,\r
-            this.col_drc});\r
-            this.lv_audioList.ContextMenuStrip = this.audioMenu;\r
-            this.lv_audioList.FullRowSelect = true;\r
-            this.lv_audioList.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r
-            this.lv_audioList.HideSelection = false;\r
-            this.lv_audioList.LabelWrap = false;\r
-            this.lv_audioList.Location = new System.Drawing.Point(16, 150);\r
-            this.lv_audioList.MultiSelect = false;\r
-            this.lv_audioList.Name = "lv_audioList";\r
-            this.lv_audioList.Size = new System.Drawing.Size(689, 140);\r
-            this.lv_audioList.TabIndex = 65;\r
-            this.lv_audioList.UseCompatibleStateImageBehavior = false;\r
-            this.lv_audioList.View = System.Windows.Forms.View.Details;\r
-            this.lv_audioList.SelectedIndexChanged += new System.EventHandler(this.lv_audioList_SelectedIndexChanged);\r
-            // \r
-            // col_id\r
-            // \r
-            this.col_id.Text = "Track";\r
-            this.col_id.Width = 47;\r
-            // \r
-            // col_Source\r
-            // \r
-            this.col_Source.Text = "Source";\r
-            this.col_Source.Width = 170;\r
-            // \r
-            // col_codec\r
-            // \r
-            this.col_codec.Text = "Audio Codec";\r
-            this.col_codec.Width = 88;\r
-            // \r
-            // col_mixdown\r
-            // \r
-            this.col_mixdown.Text = "Mixdown";\r
-            this.col_mixdown.Width = 127;\r
-            // \r
-            // col_samplerate\r
-            // \r
-            this.col_samplerate.Text = "Samplerate (kHz)";\r
-            this.col_samplerate.Width = 101;\r
-            // \r
-            // col_bitrate\r
-            // \r
-            this.col_bitrate.Text = "Bitrate (Kbps)";\r
-            this.col_bitrate.Width = 95;\r
-            // \r
-            // col_drc\r
-            // \r
-            this.col_drc.Text = "DRC";\r
-            // \r
             // audioMenu\r
             // \r
             this.audioMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
@@ -137,19 +80,19 @@ namespace Handbrake.Controls
             this.toolStripSeparator2,\r
             this.audioList_remove});\r
             this.audioMenu.Name = "audioMenu";\r
-            this.audioMenu.Size = new System.Drawing.Size(142, 76);\r
+            this.audioMenu.Size = new System.Drawing.Size(139, 76);\r
             // \r
             // audioList_moveup\r
             // \r
             this.audioList_moveup.Name = "audioList_moveup";\r
-            this.audioList_moveup.Size = new System.Drawing.Size(141, 22);\r
+            this.audioList_moveup.Size = new System.Drawing.Size(138, 22);\r
             this.audioList_moveup.Text = "Move Up";\r
             this.audioList_moveup.Click += new System.EventHandler(this.audioList_moveup_Click);\r
             // \r
             // audioList_movedown\r
             // \r
             this.audioList_movedown.Name = "audioList_movedown";\r
-            this.audioList_movedown.Size = new System.Drawing.Size(141, 22);\r
+            this.audioList_movedown.Size = new System.Drawing.Size(138, 22);\r
             this.audioList_movedown.Text = "Move Down";\r
             this.audioList_movedown.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
             this.audioList_movedown.Click += new System.EventHandler(this.audioList_movedown_Click);\r
@@ -157,12 +100,12 @@ namespace Handbrake.Controls
             // toolStripSeparator2\r
             // \r
             this.toolStripSeparator2.Name = "toolStripSeparator2";\r
-            this.toolStripSeparator2.Size = new System.Drawing.Size(138, 6);\r
+            this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6);\r
             // \r
             // audioList_remove\r
             // \r
             this.audioList_remove.Name = "audioList_remove";\r
-            this.audioList_remove.Size = new System.Drawing.Size(141, 22);\r
+            this.audioList_remove.Size = new System.Drawing.Size(138, 22);\r
             this.audioList_remove.Text = "Remove";\r
             this.audioList_remove.Click += new System.EventHandler(this.audioList_remove_Click);\r
             // \r
@@ -202,18 +145,19 @@ namespace Handbrake.Controls
             this.lbl_drc.TabIndex = 62;\r
             this.lbl_drc.Text = "0";\r
             // \r
-            // label16\r
+            // lbl_drcHeader\r
             // \r
-            this.label16.AutoSize = true;\r
-            this.label16.BackColor = System.Drawing.Color.Transparent;\r
-            this.label16.Location = new System.Drawing.Point(607, 17);\r
-            this.label16.Name = "label16";\r
-            this.label16.Size = new System.Drawing.Size(28, 13);\r
-            this.label16.TabIndex = 61;\r
-            this.label16.Text = "DRC";\r
+            this.lbl_drcHeader.AutoSize = true;\r
+            this.lbl_drcHeader.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_drcHeader.Location = new System.Drawing.Point(607, 17);\r
+            this.lbl_drcHeader.Name = "lbl_drcHeader";\r
+            this.lbl_drcHeader.Size = new System.Drawing.Size(28, 13);\r
+            this.lbl_drcHeader.TabIndex = 61;\r
+            this.lbl_drcHeader.Text = "DRC";\r
             // \r
             // tb_drc\r
             // \r
+            this.tb_drc.BackColor = System.Drawing.SystemColors.Window;\r
             this.tb_drc.LargeChange = 0;\r
             this.tb_drc.Location = new System.Drawing.Point(598, 29);\r
             this.tb_drc.Margin = new System.Windows.Forms.Padding(0);\r
@@ -222,7 +166,7 @@ namespace Handbrake.Controls
             this.tb_drc.Size = new System.Drawing.Size(57, 45);\r
             this.tb_drc.TabIndex = 60;\r
             this.tb_drc.TickFrequency = 10;\r
-            this.tb_drc.Scroll += new System.EventHandler(this.tb_drc_Scroll);\r
+            this.tb_drc.Scroll += new System.EventHandler(this.ControlChanged);\r
             // \r
             // label68\r
             // \r
@@ -235,25 +179,25 @@ namespace Handbrake.Controls
             this.label68.TabIndex = 49;\r
             this.label68.Text = "Audio Tracks";\r
             // \r
-            // label67\r
+            // lbl_sampleRate\r
             // \r
-            this.label67.AutoSize = true;\r
-            this.label67.BackColor = System.Drawing.Color.Transparent;\r
-            this.label67.Location = new System.Drawing.Point(463, 17);\r
-            this.label67.Name = "label67";\r
-            this.label67.Size = new System.Drawing.Size(61, 13);\r
-            this.label67.TabIndex = 57;\r
-            this.label67.Text = "Samplerate";\r
+            this.lbl_sampleRate.AutoSize = true;\r
+            this.lbl_sampleRate.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_sampleRate.Location = new System.Drawing.Point(463, 17);\r
+            this.lbl_sampleRate.Name = "lbl_sampleRate";\r
+            this.lbl_sampleRate.Size = new System.Drawing.Size(61, 13);\r
+            this.lbl_sampleRate.TabIndex = 57;\r
+            this.lbl_sampleRate.Text = "Samplerate";\r
             // \r
-            // label66\r
+            // lbl_bitrate\r
             // \r
-            this.label66.AutoSize = true;\r
-            this.label66.BackColor = System.Drawing.Color.Transparent;\r
-            this.label66.Location = new System.Drawing.Point(538, 17);\r
-            this.label66.Name = "label66";\r
-            this.label66.Size = new System.Drawing.Size(39, 13);\r
-            this.label66.TabIndex = 59;\r
-            this.label66.Text = "Bitrate";\r
+            this.lbl_bitrate.AutoSize = true;\r
+            this.lbl_bitrate.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_bitrate.Location = new System.Drawing.Point(538, 17);\r
+            this.lbl_bitrate.Name = "lbl_bitrate";\r
+            this.lbl_bitrate.Size = new System.Drawing.Size(39, 13);\r
+            this.lbl_bitrate.TabIndex = 59;\r
+            this.lbl_bitrate.Text = "Bitrate";\r
             // \r
             // label65\r
             // \r
@@ -265,15 +209,15 @@ namespace Handbrake.Controls
             this.label65.TabIndex = 53;\r
             this.label65.Text = "Audio Codec";\r
             // \r
-            // label14\r
+            // lbl_mixdown\r
             // \r
-            this.label14.AutoSize = true;\r
-            this.label14.BackColor = System.Drawing.Color.Transparent;\r
-            this.label14.Location = new System.Drawing.Point(368, 17);\r
-            this.label14.Name = "label14";\r
-            this.label14.Size = new System.Drawing.Size(49, 13);\r
-            this.label14.TabIndex = 55;\r
-            this.label14.Text = "Mixdown";\r
+            this.lbl_mixdown.AutoSize = true;\r
+            this.lbl_mixdown.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_mixdown.Location = new System.Drawing.Point(368, 17);\r
+            this.lbl_mixdown.Name = "lbl_mixdown";\r
+            this.lbl_mixdown.Size = new System.Drawing.Size(49, 13);\r
+            this.lbl_mixdown.TabIndex = 55;\r
+            this.lbl_mixdown.Text = "Mixdown";\r
             // \r
             // drp_audioEncoder\r
             // \r
@@ -283,12 +227,14 @@ namespace Handbrake.Controls
             "AAC (faac)",\r
             "MP3 (lame)",\r
             "Vorbis (vorbis)",\r
-            "AC3 Passthru"});\r
+            "AC3 Passthru",\r
+            "AC3 (ffmpeg)",\r
+            "DTS Passthru"});\r
             this.drp_audioEncoder.Location = new System.Drawing.Point(215, 34);\r
             this.drp_audioEncoder.Name = "drp_audioEncoder";\r
             this.drp_audioEncoder.Size = new System.Drawing.Size(111, 21);\r
             this.drp_audioEncoder.TabIndex = 52;\r
-            this.drp_audioEncoder.SelectedIndexChanged += new System.EventHandler(this.drp_audenc_SelectedIndexChanged);\r
+            this.drp_audioEncoder.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);\r
             // \r
             // label27\r
             // \r
@@ -315,7 +261,7 @@ namespace Handbrake.Controls
             this.drp_audioMix.Name = "drp_audioMix";\r
             this.drp_audioMix.Size = new System.Drawing.Size(129, 21);\r
             this.drp_audioMix.TabIndex = 54;\r
-            this.drp_audioMix.SelectedIndexChanged += new System.EventHandler(this.drp_audmix_SelectedIndexChanged);\r
+            this.drp_audioMix.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);\r
             // \r
             // drp_audioTrack\r
             // \r
@@ -323,11 +269,11 @@ namespace Handbrake.Controls
             this.drp_audioTrack.FormattingEnabled = true;\r
             this.drp_audioTrack.Items.AddRange(new object[] {\r
             "Automatic"});\r
-            this.drp_audioTrack.Location = new System.Drawing.Point(15, 35);\r
+            this.drp_audioTrack.Location = new System.Drawing.Point(15, 34);\r
             this.drp_audioTrack.Name = "drp_audioTrack";\r
             this.drp_audioTrack.Size = new System.Drawing.Size(194, 21);\r
             this.drp_audioTrack.TabIndex = 50;\r
-            this.drp_audioTrack.SelectedIndexChanged += new System.EventHandler(this.drp_audioTrack_SelectedIndexChanged);\r
+            this.drp_audioTrack.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);\r
             // \r
             // drp_audioBitrate\r
             // \r
@@ -348,7 +294,7 @@ namespace Handbrake.Controls
             this.drp_audioBitrate.Name = "drp_audioBitrate";\r
             this.drp_audioBitrate.Size = new System.Drawing.Size(70, 21);\r
             this.drp_audioBitrate.TabIndex = 58;\r
-            this.drp_audioBitrate.SelectedIndexChanged += new System.EventHandler(this.drp_audbit_SelectedIndexChanged);\r
+            this.drp_audioBitrate.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);\r
             // \r
             // drp_audioSample\r
             // \r
@@ -365,7 +311,7 @@ namespace Handbrake.Controls
             this.drp_audioSample.Name = "drp_audioSample";\r
             this.drp_audioSample.Size = new System.Drawing.Size(55, 21);\r
             this.drp_audioSample.TabIndex = 56;\r
-            this.drp_audioSample.SelectedIndexChanged += new System.EventHandler(this.drp_audsr_SelectedIndexChanged);\r
+            this.drp_audioSample.SelectedIndexChanged += new System.EventHandler(this.ControlChanged);\r
             // \r
             // AudioTrackGroup\r
             // \r
@@ -376,16 +322,16 @@ namespace Handbrake.Controls
             this.AudioTrackGroup.Controls.Add(this.drp_audioMix);\r
             this.AudioTrackGroup.Controls.Add(this.lbl_drc);\r
             this.AudioTrackGroup.Controls.Add(this.label27);\r
-            this.AudioTrackGroup.Controls.Add(this.label16);\r
+            this.AudioTrackGroup.Controls.Add(this.lbl_drcHeader);\r
             this.AudioTrackGroup.Controls.Add(this.drp_audioEncoder);\r
             this.AudioTrackGroup.Controls.Add(this.tb_drc);\r
-            this.AudioTrackGroup.Controls.Add(this.label14);\r
+            this.AudioTrackGroup.Controls.Add(this.lbl_mixdown);\r
             this.AudioTrackGroup.Controls.Add(this.label65);\r
-            this.AudioTrackGroup.Controls.Add(this.label67);\r
-            this.AudioTrackGroup.Controls.Add(this.label66);\r
+            this.AudioTrackGroup.Controls.Add(this.lbl_sampleRate);\r
+            this.AudioTrackGroup.Controls.Add(this.lbl_bitrate);\r
             this.AudioTrackGroup.Location = new System.Drawing.Point(16, 67);\r
             this.AudioTrackGroup.Name = "AudioTrackGroup";\r
-            this.AudioTrackGroup.Size = new System.Drawing.Size(689, 77);\r
+            this.AudioTrackGroup.Size = new System.Drawing.Size(685, 77);\r
             this.AudioTrackGroup.TabIndex = 66;\r
             this.AudioTrackGroup.TabStop = false;\r
             this.AudioTrackGroup.Text = "Selected Track: New Track";\r
@@ -396,13 +342,105 @@ namespace Handbrake.Controls
             this.AudioMenuRowHeightHack.ImageSize = new System.Drawing.Size(1, 18);\r
             this.AudioMenuRowHeightHack.TransparentColor = System.Drawing.Color.Transparent;\r
             // \r
+            // audioList\r
+            // \r
+            this.audioList.AllowUserToAddRows = false;\r
+            this.audioList.AllowUserToResizeColumns = false;\r
+            this.audioList.AllowUserToResizeRows = false;\r
+            this.audioList.BackgroundColor = System.Drawing.Color.White;\r
+            this.audioList.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;\r
+            this.audioList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;\r
+            this.audioList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\r
+            this.Track,\r
+            this.Source,\r
+            this.AudioCodec,\r
+            this.Mixdown,\r
+            this.Samplerate,\r
+            this.Bitrate,\r
+            this.DRC});\r
+            this.audioList.ContextMenuStrip = this.audioMenu;\r
+            this.audioList.GridColor = System.Drawing.Color.White;\r
+            this.audioList.Location = new System.Drawing.Point(16, 150);\r
+            this.audioList.Name = "audioList";\r
+            this.audioList.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;\r
+            this.audioList.RowHeadersVisible = false;\r
+            this.audioList.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;\r
+            this.audioList.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;\r
+            this.audioList.ShowCellErrors = false;\r
+            this.audioList.ShowCellToolTips = false;\r
+            this.audioList.ShowEditingIcon = false;\r
+            this.audioList.ShowRowErrors = false;\r
+            this.audioList.Size = new System.Drawing.Size(685, 140);\r
+            this.audioList.TabIndex = 67;\r
+            this.audioList.SelectionChanged += new System.EventHandler(this.audioList_SelectionChanged);\r
+            // \r
+            // Track\r
+            // \r
+            this.Track.FillWeight = 304.2808F;\r
+            this.Track.HeaderText = "Track";\r
+            this.Track.Name = "Track";\r
+            this.Track.ReadOnly = true;\r
+            this.Track.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            this.Track.Width = 50;\r
+            // \r
+            // Source\r
+            // \r
+            this.Source.FillWeight = 49.69727F;\r
+            this.Source.HeaderText = "Source";\r
+            this.Source.Name = "Source";\r
+            this.Source.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            this.Source.Width = 150;\r
+            // \r
+            // AudioCodec\r
+            // \r
+            this.AudioCodec.HeaderText = "Audio Codec";\r
+            this.AudioCodec.Name = "AudioCodec";\r
+            this.AudioCodec.ReadOnly = true;\r
+            this.AudioCodec.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            // \r
+            // Mixdown\r
+            // \r
+            this.Mixdown.FillWeight = 49.69727F;\r
+            this.Mixdown.HeaderText = "Mixdown";\r
+            this.Mixdown.Name = "Mixdown";\r
+            this.Mixdown.ReadOnly = true;\r
+            this.Mixdown.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            this.Mixdown.Width = 150;\r
+            // \r
+            // Samplerate\r
+            // \r
+            this.Samplerate.FillWeight = 49.69727F;\r
+            this.Samplerate.HeaderText = "Samplerate";\r
+            this.Samplerate.Name = "Samplerate";\r
+            this.Samplerate.ReadOnly = true;\r
+            this.Samplerate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            this.Samplerate.Width = 75;\r
+            // \r
+            // Bitrate\r
+            // \r
+            this.Bitrate.FillWeight = 49.69727F;\r
+            this.Bitrate.HeaderText = "Bitrate";\r
+            this.Bitrate.Name = "Bitrate";\r
+            this.Bitrate.ReadOnly = true;\r
+            this.Bitrate.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            this.Bitrate.Width = 75;\r
+            // \r
+            // DRC\r
+            // \r
+            this.DRC.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;\r
+            this.DRC.FillWeight = 96.36334F;\r
+            this.DRC.HeaderText = "DRC";\r
+            this.DRC.Name = "DRC";\r
+            this.DRC.ReadOnly = true;\r
+            this.DRC.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
+            // \r
             // AudioPanel\r
             // \r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;\r
             this.BackColor = System.Drawing.Color.Transparent;\r
+            this.Controls.Add(this.audioList);\r
             this.Controls.Add(this.label68);\r
             this.Controls.Add(this.btn_addAudioTrack);\r
-            this.Controls.Add(this.lv_audioList);\r
             this.Controls.Add(this.AudioTrackGroup);\r
             this.Controls.Add(this.btn_RemoveAudioTrack);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
@@ -412,6 +450,7 @@ namespace Handbrake.Controls
             ((System.ComponentModel.ISupportInitialize)(this.tb_drc)).EndInit();\r
             this.AudioTrackGroup.ResumeLayout(false);\r
             this.AudioTrackGroup.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.audioList)).EndInit();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -419,29 +458,21 @@ namespace Handbrake.Controls
 \r
         #endregion\r
 \r
-        internal System.Windows.Forms.ListView lv_audioList;\r
-        private System.Windows.Forms.ColumnHeader col_Source;\r
-        private System.Windows.Forms.ColumnHeader col_codec;\r
-        private System.Windows.Forms.ColumnHeader col_mixdown;\r
-        private System.Windows.Forms.ColumnHeader col_samplerate;\r
-        private System.Windows.Forms.ColumnHeader col_bitrate;\r
-        private System.Windows.Forms.ColumnHeader col_drc;\r
         private System.Windows.Forms.Button btn_RemoveAudioTrack;\r
         private System.Windows.Forms.Button btn_addAudioTrack;\r
         internal System.Windows.Forms.Label lbl_drc;\r
-        internal System.Windows.Forms.Label label16;\r
+        internal System.Windows.Forms.Label lbl_drcHeader;\r
         internal System.Windows.Forms.TrackBar tb_drc;\r
         internal System.Windows.Forms.Label label68;\r
-        internal System.Windows.Forms.Label label67;\r
-        internal System.Windows.Forms.Label label66;\r
+        internal System.Windows.Forms.Label lbl_sampleRate;\r
+        internal System.Windows.Forms.Label lbl_bitrate;\r
         internal System.Windows.Forms.Label label65;\r
-        internal System.Windows.Forms.Label label14;\r
+        internal System.Windows.Forms.Label lbl_mixdown;\r
         internal System.Windows.Forms.ComboBox drp_audioEncoder;\r
         internal System.Windows.Forms.Label label27;\r
         internal System.Windows.Forms.ComboBox drp_audioMix;\r
         internal System.Windows.Forms.ComboBox drp_audioTrack;\r
         internal System.Windows.Forms.ComboBox drp_audioSample;\r
-        private System.Windows.Forms.ColumnHeader col_id;\r
         private System.Windows.Forms.GroupBox AudioTrackGroup;\r
         private System.Windows.Forms.ImageList AudioMenuRowHeightHack;\r
         private System.Windows.Forms.ContextMenuStrip audioMenu;\r
@@ -450,5 +481,13 @@ namespace Handbrake.Controls
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r
         private System.Windows.Forms.ToolStripMenuItem audioList_remove;\r
         internal System.Windows.Forms.ComboBox drp_audioBitrate;\r
+        private System.Windows.Forms.DataGridView audioList;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn Track;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn Source;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn AudioCodec;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn Mixdown;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn Samplerate;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn Bitrate;\r
+        private System.Windows.Forms.DataGridViewTextBoxColumn DRC;\r
     }\r
 }\r
index b394e3c..e5f37d6 100644 (file)
 ï»¿/*  AudioPanel.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Collections;\r
+    using System.Linq;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Parsing;\r
+\r
+    using Presets;\r
+    using AudioTrack = Model.AudioTrack;\r
+\r
+    /// <summary>\r
+    /// The AudioPanel Control\r
+    /// </summary>\r
     public partial class AudioPanel : UserControl\r
     {\r
-        public event EventHandler AudioListChanged;\r
 \r
+        private const string AC3Passthru = "AC3 Passthru";\r
+\r
+        private const string DTSPassthru = "DTS Passthru";\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="AudioPanel"/> class. \r
+        /// Create a new instance of the Audio Panel\r
+        /// </summary>\r
         public AudioPanel()\r
         {\r
             InitializeComponent();\r
-            drp_audioMix.SelectedIndex = 0;\r
+            drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
+            drp_audioSample.SelectedIndex = 1;\r
         }\r
 \r
-        // Audio Track Options\r
-        private void drp_audioTrack_SelectedIndexChanged(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// The audio list has changed\r
+        /// </summary>\r
+        public event EventHandler AudioListChanged;\r
+\r
+        /// <summary>\r
+        /// Get the audio panel\r
+        /// </summary>\r
+        /// <returns>A listview containing the audio tracks</returns>\r
+        public DataGridView GetAudioPanel()\r
         {\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audioTrack.Text;\r
-                lv_audioList.Select();\r
-            }\r
+            return audioList;\r
         }\r
-        private void drp_audenc_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Set the File Container. This funciton is used to limit the available options for each file container.\r
+        /// </summary>\r
+        /// <param name="path">\r
+        /// the file path\r
+        /// </param>\r
+        public void SetContainer(string path)\r
         {\r
-            // Setup the widgets with the correct avail options\r
-            if (drp_audioEncoder.Text.Contains("AAC"))\r
+            string oldval = drp_audioEncoder.Text;\r
+\r
+            drp_audioEncoder.Items.Clear();\r
+            drp_audioEncoder.Items.Add("AAC (faac)");\r
+            drp_audioEncoder.Items.Add("MP3 (lame)");\r
+            drp_audioEncoder.Items.Add(AC3Passthru);\r
+            drp_audioEncoder.Items.Add("AC3 (ffmpeg)");\r
+\r
+            if (path.Contains("MKV"))\r
             {\r
-                setMixDown(true);\r
-                setBitrate(160);\r
+                drp_audioEncoder.Items.Add(DTSPassthru);\r
+                drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
             }\r
+\r
+            if (!drp_audioEncoder.Text.Contains(oldval))\r
+                drp_audioEncoder.SelectedIndex = 0;\r
             else\r
+                drp_audioEncoder.SelectedItem = oldval;\r
+\r
+            // Make sure the table is updated with new audio codecs\r
+            // Defaults to AAC encoding.\r
+            foreach (DataGridViewRow row in audioList.Rows)\r
             {\r
-                setMixDown(false);\r
-                setBitrate(320);\r
+                if (!drp_audioEncoder.Items.Contains(row.Cells[2].Value))\r
+                    row.Cells[2].Value = drp_audioEncoder.Items[0].ToString();\r
             }\r
+        }\r
 \r
-            // Configure the widgets with values\r
-            if (drp_audioEncoder.Text.Contains("AC3") || drp_audioEncoder.Text.Contains("DTS"))\r
-            {\r
-                drp_audioMix.Enabled = false;\r
-                drp_audioBitrate.Enabled = false;\r
-                drp_audioSample.Enabled = false;\r
+        /// <summary>\r
+        /// Checks if the settings used required the .m4v (rather than .mp4) extension\r
+        /// </summary>\r
+        /// <returns>True if m4v is required</returns>\r
+        public bool RequiresM4V()\r
+        {\r
+            return this.audioList.Rows.Cast<DataGridViewRow>().Any(row => row.Cells[2].Value.ToString().Contains("AC3"));\r
+        }\r
 \r
-                drp_audioMix.SelectedIndex = 0;\r
-                drp_audioBitrate.SelectedIndex = 0;\r
-                drp_audioSample.SelectedIndex = 0;\r
-            }\r
-            else\r
-            {\r
-                drp_audioMix.Enabled = true;\r
-                drp_audioBitrate.Enabled = true;\r
-                drp_audioSample.Enabled = true;\r
+        /// <summary>\r
+        /// Load an arraylist of AudioTrack items into the list.\r
+        /// </summary>\r
+        /// <param name="audioTracks">List of audio tracks</param>\r
+        public void LoadTracks(ArrayList audioTracks)\r
+        {\r
+            ClearAudioList();\r
 \r
-                drp_audioMix.SelectedIndex = 0;\r
-                drp_audioBitrate.SelectedIndex = 9;\r
-                drp_audioSample.SelectedIndex = 0;\r
-            }\r
+            if (audioTracks == null)\r
+                return;\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            foreach (AudioTrack track in audioTracks)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
-                lv_audioList.Select();\r
+                DataGridViewRow newTrack = new DataGridViewRow();\r
+                newTrack.CreateCells(audioList);\r
+                newTrack.Cells[0].Value = GetNewID().ToString();\r
+                newTrack.Cells[1].Value = "Automatic";\r
+                newTrack.Cells[2].Value = track.Encoder;\r
+                newTrack.Cells[3].Value = track.MixDown;\r
+                newTrack.Cells[4].Value = track.SampleRate;\r
+                newTrack.Cells[5].Value = track.Encoder.Contains(AC3Passthru) || track.Encoder.Contains(DTSPassthru) ? "Auto" : track.Bitrate;\r
+                newTrack.Cells[6].Value = track.DRC;\r
+                AddTrackForPreset(newTrack);\r
             }\r
+\r
+            this.AutomaticTrackSelection();\r
         }\r
-        private void drp_audmix_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Set the Track list dropdown from the parsed title captured during the scan\r
+        /// </summary>\r
+        /// <param name="selectedTitle">The selected title</param>\r
+        /// <param name="preset">A preset</param>\r
+        public void SetTrackListFromPreset(Title selectedTitle, Preset preset)\r
         {\r
-            if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text == "6 Channel Discrete"))\r
-                setBitrate(384);\r
-            else if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text != "6 Channel Discrete"))\r
-                setBitrate(160);\r
+            if (selectedTitle.AudioTracks.Count == 0)\r
+            {\r
+                audioList.Rows.Clear();\r
+                drp_audioTrack.Items.Clear();\r
+                drp_audioTrack.Items.Add("None Found");\r
+                drp_audioTrack.SelectedIndex = 0;\r
+                return;\r
+            }\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            // Setup the Audio track source dropdown with the new audio tracks.\r
+            drp_audioTrack.Items.Clear();\r
+            drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
+\r
+            // Add any tracks the preset has, if there is a preset and no audio tracks in the list currently\r
+            if (audioList.Rows.Count == 0 && preset != null)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
-                lv_audioList.Select();\r
+                QueryParser parsed = QueryParser.Parse(preset.Query);\r
+                foreach (AudioTrack audioTrack in parsed.AudioInformation)\r
+                {\r
+                    DataGridViewRow newTrack = new DataGridViewRow();\r
+                    newTrack.CreateCells(audioList);\r
+                    newTrack.Cells[0].Value = GetNewID().ToString();\r
+                    newTrack.Cells[1].Value = (audioTrack.Track);\r
+                    newTrack.Cells[2].Value = (audioTrack.Encoder);\r
+                    newTrack.Cells[3].Value = (audioTrack.MixDown);\r
+                    newTrack.Cells[4].Value = (audioTrack.SampleRate);\r
+                    newTrack.Cells[5].Value = (audioTrack.Bitrate);\r
+                    newTrack.Cells[6].Value = (audioTrack.DRC);\r
+                    audioList.Rows.Add(newTrack);\r
+                }\r
             }\r
+\r
+            this.AutomaticTrackSelection();\r
         }\r
-        private void drp_audsr_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        private void AutomaticTrackSelection()\r
         {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
+            if (Properties.Settings.Default.NativeLanguage == "Any")\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
-                lv_audioList.Select();\r
+                drp_audioTrack.SelectedIndex = 0;\r
+                foreach (DataGridViewRow item in audioList.Rows)\r
+                {\r
+                    if (this.drp_audioTrack.SelectedItem != null)\r
+                    {\r
+                        item.Cells[1].Value = this.drp_audioTrack.SelectedItem.ToString();\r
+                    }\r
+                }\r
             }\r
-        }\r
-        private void drp_audbit_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            else\r
             {\r
-                if (drp_audioEncoder.Text.Contains("AC3"))\r
-                    drp_audioBitrate.SelectedItem = "Auto";\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
-                lv_audioList.Select();\r
+                int mode = Properties.Settings.Default.DubMode;\r
+                switch (mode)\r
+                {\r
+                    case 1:\r
+                    case 3:\r
+                        // Dub Foreign Language Audio \r
+                        // Select the prefered language audio, or the first track if it doesn't exist.\r
+                        int i = 0;\r
+                        foreach (object item in drp_audioTrack.Items)\r
+                        {\r
+                            if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
+                            {\r
+                                drp_audioTrack.SelectedIndex = i;\r
+                                break;\r
+                            }\r
+\r
+                            i++;\r
+                        }\r
+\r
+                        if (drp_audioTrack.SelectedItem != null)\r
+                            foreach (DataGridViewRow item in audioList.Rows)\r
+                                item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        else\r
+                        {\r
+                            drp_audioTrack.SelectedIndex = 0;\r
+                            if (drp_audioTrack.SelectedItem != null)\r
+                                foreach (DataGridViewRow item in audioList.Rows)\r
+                                    item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        }\r
+\r
+                        break;\r
+                    case 2:\r
+                    default:\r
+                        // Select the first track which is hopefully the default and foreign track.\r
+                        drp_audioTrack.SelectedIndex = 0;\r
+\r
+                        if (drp_audioTrack.SelectedItem != null)\r
+                            foreach (DataGridViewRow item in audioList.Rows)\r
+                                item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        break;\r
+                }\r
             }\r
         }\r
-        private void tb_drc_Scroll(object sender, EventArgs e)\r
+\r
+        // Control and ListView\r
+\r
+        /// <summary>\r
+        /// one of the controls has changed. Event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void ControlChanged(object sender, EventArgs e)\r
         {\r
-            double value;\r
-            if (tb_drc.Value == 0) value = 0;\r
-            else\r
-                value = ((tb_drc.Value - 1) / 10.0) + 1;\r
+            Control ctl = (Control)sender;\r
 \r
-            lbl_drc.Text = value.ToString();\r
+            switch (ctl.Name)\r
+            {\r
+                case "drp_audioTrack":\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                    {\r
+                        audioList.SelectedRows[0].Cells[1].Value = drp_audioTrack.Text;\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+                        // If the track isn't AC3, and the encoder is, change it.\r
+                        if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(AC3Passthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("(AC3)"))\r
+                        {\r
+                            // Switch to AAC\r
+                            drp_audioEncoder.SelectedIndex = 0;\r
+                        }\r
+\r
+                        // If the track isn't DTS, and the encoder is, change it.\r
+                        if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(DTSPassthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("DTS"))\r
+                        {\r
+                            // Switch to AAC\r
+                            drp_audioEncoder.SelectedIndex = 0;\r
+                        }\r
+                    }\r
+                    break;\r
+                case "drp_audioEncoder":\r
+                    SetMixDown();\r
+                    SetBitrate();\r
+\r
+                    // Configure the widgets with values\r
+                    if (drp_audioEncoder.Text.Contains(AC3Passthru) || drp_audioEncoder.Text.Contains(DTSPassthru))\r
+                    {\r
+                        drp_audioMix.Enabled =\r
+                            drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;\r
+                        lbl_bitrate.Enabled =\r
+                            lbl_drc.Enabled =\r
+                            lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;\r
+                    }\r
+                    else\r
+                    {\r
+                        drp_audioMix.Enabled =\r
+                            drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;\r
+                        lbl_bitrate.Enabled =\r
+                            lbl_drc.Enabled =\r
+                            lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;\r
+                    }\r
+\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[2].Value = drp_audioEncoder.Text;\r
+                    break;\r
+                case "drp_audioMix":\r
+                    SetBitrate();\r
+\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[3].Value = drp_audioMix.Text;\r
+                    break;\r
+                case "drp_audioSample":\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[4].Value = drp_audioSample.Text;\r
+                    break;\r
+                case "drp_audioBitrate":\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[5].Value = drp_audioBitrate.Text;\r
+                    break;\r
+                case "tb_drc":\r
+                    double value;\r
+                    if (tb_drc.Value == 0) value = 0;\r
+                    else\r
+                        value = ((tb_drc.Value - 1) / 10.0) + 1;\r
+\r
+                    lbl_drc.Text = value.ToString();\r
+\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                    {\r
+                        audioList.SelectedRows[0].Cells[6].Value = value.ToString();\r
+                        audioList.Select();\r
+                    }\r
+                    break;\r
+            }\r
+\r
+            audioList.Select();\r
+        }\r
+\r
+        /// <summary>\r
+        /// The Audio List selected index changed event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void audioList_SelectionChanged(object sender, EventArgs e)\r
+        {\r
+            // Set the dropdown controls based on the selected item in the Audio List.\r
+            if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
-                lv_audioList.Select();\r
+                drp_audioTrack.SelectedItem = audioList.SelectedRows[0].Cells[1].Value;\r
+                drp_audioEncoder.SelectedItem = audioList.SelectedRows[0].Cells[2].Value;\r
+                drp_audioMix.SelectedItem = audioList.SelectedRows[0].Cells[3].Value;\r
+                drp_audioSample.SelectedItem = audioList.SelectedRows[0].Cells[4].Value;\r
+                drp_audioBitrate.SelectedItem = audioList.SelectedRows[0].Cells[5].Value;\r
+                double drcValue;\r
+                int drcCalculated;\r
+                double.TryParse(audioList.SelectedRows[0].Cells[6].Value.ToString(), out drcValue);\r
+                if (drcValue != 0)\r
+                    drcValue = ((drcValue * 10) + 1) - 10;\r
+                int.TryParse(drcValue.ToString(), out drcCalculated);\r
+                tb_drc.Value = drcCalculated;\r
+                lbl_drc.Text = audioList.SelectedRows[0].Cells[6].Value.ToString();\r
+\r
+                AudioTrackGroup.Text = "Selected Track: " + audioList.SelectedRows[0].Cells[0].Value;\r
             }\r
+            else\r
+                AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
         }\r
 \r
         // Track Controls\r
+\r
+        /// <summary>\r
+        /// The Add Audio Track button event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
         {\r
+            if (drp_audioTrack.Text == "None Found")\r
+            {\r
+                MessageBox.Show(\r
+                    "Your source appears to have no audio tracks that HandBrake supports.",\r
+                    "Warning",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Warning);\r
+                return;\r
+            }\r
+\r
             double value = 0;\r
             if (tb_drc.Value != 0)\r
                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
 \r
             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
-            ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
-            newTrack.SubItems.Add(drp_audioTrack.Text);\r
-            newTrack.SubItems.Add(drp_audioEncoder.Text);\r
-            newTrack.SubItems.Add(drp_audioMix.Text);\r
-            newTrack.SubItems.Add(drp_audioSample.Text);\r
-            newTrack.SubItems.Add(drp_audioBitrate.Text);\r
-            newTrack.SubItems.Add(value.ToString());\r
-            lv_audioList.Items.Add(newTrack);\r
+            DataGridViewRow newTrack = new DataGridViewRow();\r
+            newTrack.CreateCells(audioList);\r
+            newTrack.Cells[0].Value = GetNewID().ToString();\r
+            newTrack.Cells[1].Value = drp_audioTrack.Text;\r
+            newTrack.Cells[2].Value = drp_audioEncoder.Text;\r
+            newTrack.Cells[3].Value = drp_audioMix.Text;\r
+            newTrack.Cells[4].Value = drp_audioSample.Text;\r
+            newTrack.Cells[5].Value = drp_audioBitrate.Text;\r
+            newTrack.Cells[6].Value = value.ToString();\r
+            audioList.Rows.Add(newTrack);\r
 \r
             // The Audio List has changed to raise the event.\r
             if (this.AudioListChanged != null)\r
                 this.AudioListChanged(this, new EventArgs());\r
 \r
             // Select the newly added track and select the control       \r
-            lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
-            lv_audioList.Select();\r
+            audioList.ClearSelection();\r
+            audioList.Rows[audioList.Rows.Count - 1].Selected = true;\r
+            audioList.Select();\r
         }\r
+\r
+        /// <summary>\r
+        /// The Remove Track button event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
         {\r
-            RemoveAudioTrack();\r
+            RemoveTrack();\r
         }\r
 \r
         // Audio List Menu\r
+\r
+        /// <summary>\r
+        /// The Audio List Move Up menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_moveup_Click(object sender, EventArgs e)\r
         {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index--;\r
-\r
-                if (lv_audioList.Items.Count > index && index >= 0)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
+            MoveTrack(true);\r
         }\r
+\r
+        /// <summary>\r
+        /// The audio list move down menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_movedown_Click(object sender, EventArgs e)\r
         {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index++;\r
-\r
-                if (index < lv_audioList.Items.Count)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
+            MoveTrack(false);\r
         }\r
+\r
+        /// <summary>\r
+        /// The audio list remove menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_remove_Click(object sender, EventArgs e)\r
         {\r
-            RemoveAudioTrack();\r
+            RemoveTrack();\r
         }\r
-        private void RemoveAudioTrack()\r
+\r
+        // Private Functions\r
+\r
+        /// <summary>\r
+        /// Add track for preset\r
+        /// </summary>\r
+        /// <param name="item">\r
+        /// The item.\r
+        /// </param>\r
+        private void AddTrackForPreset(DataGridViewRow item)\r
+        {\r
+            audioList.Rows.Add(item);\r
+            if (this.AudioListChanged != null)\r
+                this.AudioListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Clear the audio list\r
+        /// </summary>\r
+        private void ClearAudioList()\r
+        {\r
+            audioList.Rows.Clear();\r
+            if (this.AudioListChanged != null)\r
+                this.AudioListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Get a new ID for the next audio track\r
+        /// </summary>\r
+        /// <returns>\r
+        /// an int\r
+        /// </returns>\r
+        private int GetNewID()\r
+        {\r
+            return audioList.Rows.Count + 1;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Remove an audio track from the list\r
+        /// </summary>\r
+        private void RemoveTrack()\r
         {\r
             // Remove the Item and reselect the control if the following conditions are met.\r
-            if (lv_audioList.SelectedItems.Count != 0)\r
+            if (audioList.SelectedRows.Count != 0)\r
             {\r
                 // The Audio List is about to change so raise the event.\r
                 if (this.AudioListChanged != null)\r
                     this.AudioListChanged(this, new EventArgs());\r
 \r
                 // Record the current selected index.\r
-                int currentPosition = lv_audioList.SelectedIndices[0];\r
+                int currentPosition = audioList.SelectedRows[0].Index;\r
 \r
-                lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
+                audioList.Rows.Remove(audioList.SelectedRows[0]);\r
 \r
                 // Now reslect the correct item and give focus to the audio list.\r
-                if (lv_audioList.Items.Count != 0)\r
+                if (audioList.Rows.Count != 0)\r
                 {\r
-                    if (currentPosition <= (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[currentPosition].Selected = true;\r
-                    else if (currentPosition > (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
+                    audioList.ClearSelection();\r
+                    if (currentPosition <= (audioList.Rows.Count - 1))\r
+                        audioList.Rows[currentPosition].Selected = true;\r
+                    else if (currentPosition > (audioList.Rows.Count - 1))\r
+                        audioList.Rows[audioList.Rows.Count - 1].Selected = true;\r
 \r
-                    lv_audioList.Select();\r
+                    audioList.Select();\r
                 }\r
                 // Regenerate the ID numers\r
-                reGenerateListIDs();\r
+                ReGenerateListIDs();\r
             }\r
         }\r
 \r
-        // Public Functions\r
-        public void SetTrackList(Parsing.Title selectedTitle)\r
-        {\r
-            drp_audioTrack.Items.Clear();\r
-            drp_audioTrack.Items.Add("Automatic");\r
-            drp_audioTrack.Items.Add("None");\r
-            drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
-\r
-            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
-            if (Properties.Settings.Default.NativeLanguage == "Any")\r
-                drp_audioTrack.SelectedIndex = 0;\r
-            else\r
-            {\r
-                if (Properties.Settings.Default.DubAudio) // "Dub Foreign language audio" \r
-                {\r
-                    int i = 0;\r
-                    foreach (object item in drp_audioTrack.Items)\r
-                    {\r
-                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
-                        {\r
-                            drp_audioTrack.SelectedIndex = i;\r
-                            break;\r
-                        }\r
-\r
-                        i++;\r
-                    }\r
-\r
-                    if (drp_audioTrack.SelectedItem != null)\r
-                        foreach (ListViewItem item in lv_audioList.Items)\r
-                            item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
-                    else\r
-                    {\r
-                        drp_audioTrack.SelectedIndex = 0;\r
-                        if (drp_audioTrack.SelectedItem != null)\r
-                            foreach (ListViewItem item in lv_audioList.Items)\r
-                                item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
-                    }\r
-                }\r
-                else\r
-                    drp_audioTrack.SelectedIndex = 0; // "Use Foreign language audio and Subtitles"\r
-            }\r
-            drp_audioMix.SelectedIndex = 0;\r
-        }\r
-        public ListView GetAudioPanel()\r
-        {\r
-            return lv_audioList;\r
-        }\r
-        public void SetContainer(String path)\r
+        /// <summary>\r
+        /// Move an audio track up or down the audio list\r
+        /// </summary>\r
+        /// <param name="up">\r
+        /// The up.\r
+        /// </param>\r
+        private void MoveTrack(bool up)\r
         {\r
-            string oldval = drp_audioEncoder.Text;\r
-            if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
-            {\r
-                drp_audioEncoder.Items.Clear();\r
-                drp_audioEncoder.Items.Add("AAC (faac)");\r
-                drp_audioEncoder.Items.Add("AC3 Passthru");\r
-                if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
-                    drp_audioEncoder.SelectedIndex = 0;\r
-                else\r
-                    drp_audioEncoder.SelectedItem = oldval;\r
+            if (audioList.SelectedRows.Count == 0) return;\r
 \r
-            }\r
-            else if (path.Contains("MKV"))\r
-            {\r
-                drp_audioEncoder.Items.Clear();\r
-                drp_audioEncoder.Items.Add("AAC (faac)");\r
-                drp_audioEncoder.Items.Add("MP3 (lame)");\r
-                drp_audioEncoder.Items.Add("AC3 Passthru");\r
-                drp_audioEncoder.Items.Add("DTS Passthru");\r
-                drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
-                drp_audioEncoder.SelectedItem = oldval;\r
+            DataGridViewRow item = audioList.SelectedRows[0];\r
+            int index = item.Index;\r
 \r
-                if (drp_audioEncoder.Text == string.Empty)\r
-                    drp_audioEncoder.SelectedIndex = 0;\r
-            }\r
+            if (up) index--;\r
+            else index++;\r
 \r
-            // Make sure the table is updated with new audio codecs\r
-            foreach (ListViewItem row in lv_audioList.Items)\r
+            if (index < audioList.Rows.Count || (audioList.Rows.Count > index && index >= 0))\r
             {\r
-                if (!drp_audioEncoder.Items.Contains(row.SubItems[2].Text))\r
-                    row.SubItems[2].Text = drp_audioEncoder.Items[0].ToString();\r
+                audioList.Rows.Remove(item);\r
+                audioList.Rows.Insert(index, item);\r
+                audioList.ClearSelection();\r
+                item.Selected = true;\r
             }\r
         }\r
-        public void AddTrackForPreset(ListViewItem item)\r
-        {\r
-            lv_audioList.Items.Add(item);\r
-            if (this.AudioListChanged != null)\r
-                this.AudioListChanged(this, new EventArgs());\r
-        }\r
-        public void ClearAudioList()\r
-        {\r
-            lv_audioList.Items.Clear();\r
-            if (this.AudioListChanged != null)\r
-                this.AudioListChanged(this, new EventArgs());\r
-        }\r
-        public int GetNewID()\r
-        {\r
-            return lv_audioList.Items.Count + 1;\r
-        }\r
-        public Boolean RequiresM4V()\r
-        {\r
-            foreach (ListViewItem item in lv_audioList.Items)\r
-            {\r
-                if (item.SubItems[2].Text.Contains("AC3"))\r
-                    return true;\r
-            }\r
-            return false;\r
-        }\r
 \r
-        // Helper Functions \r
-        private void reGenerateListIDs()\r
+        /// <summary>\r
+        /// Regenerate all the audio track id's on the audio list\r
+        /// </summary>\r
+        private void ReGenerateListIDs()\r
         {\r
             int i = 1;\r
-            foreach (ListViewItem item in lv_audioList.Items)\r
+            foreach (DataGridViewRow item in audioList.Rows)\r
             {\r
-                item.SubItems[0].Text = i.ToString();\r
+                item.Cells[0].Value = i.ToString();\r
                 i++;\r
             }\r
         }\r
-        private void setBitrate(int max)\r
+\r
+        /// <summary>\r
+        /// Set the bitrate dropdown\r
+        /// </summary>\r
+        private void SetBitrate()\r
         {\r
+            int max = 0;\r
+            drp_audioBitrate.Items.Remove("Auto");\r
+            drp_audioBitrate.Items.Remove("192");\r
+            drp_audioBitrate.Items.Remove("224");\r
+            drp_audioBitrate.Items.Remove("256");\r
+            drp_audioBitrate.Items.Remove("320");\r
+            drp_audioBitrate.Items.Remove("384");\r
+            drp_audioBitrate.Items.Remove("448");\r
+            drp_audioBitrate.Items.Remove("640");\r
+            drp_audioBitrate.Items.Remove("768");\r
+\r
+            switch (drp_audioEncoder.Text)\r
+            {\r
+                case "AAC (faac)":\r
+                    max = drp_audioMix.Text.Contains("6 Channel") ? 768 : 320;\r
+                    break;\r
+                case "MP3 (lame)":\r
+                    max = 320;\r
+                    break;\r
+                case "Vorbis (vorbis)":\r
+                    max = 384;\r
+                    break;\r
+                case "AC3 (ffmpeg)":\r
+                    max = 640;\r
+                    break;\r
+                case AC3Passthru:\r
+                    drp_audioBitrate.Items.Add("Auto");\r
+                    drp_audioBitrate.SelectedItem = "Auto";\r
+                    drp_audioSample.SelectedItem = "Auto";\r
+                    break;\r
+                case DTSPassthru:\r
+                    drp_audioBitrate.Items.Add("Auto");\r
+                    drp_audioBitrate.SelectedItem = "Auto";\r
+                    drp_audioSample.SelectedItem = "Auto";\r
+                    break;\r
+            }\r
+\r
             if (max > 160)\r
             {\r
                 drp_audioBitrate.Items.Add("192");\r
                 drp_audioBitrate.Items.Add("224");\r
                 drp_audioBitrate.Items.Add("256");\r
                 drp_audioBitrate.Items.Add("320");\r
-                if (max == 384)\r
-                    drp_audioBitrate.Items.Add("384");\r
-                else\r
-                    drp_audioBitrate.Items.Remove("384");\r
             }\r
-            else\r
+\r
+            if (max > 320)\r
             {\r
-                drp_audioBitrate.Items.Remove("192");\r
-                drp_audioBitrate.Items.Remove("224");\r
-                drp_audioBitrate.Items.Remove("256");\r
-                drp_audioBitrate.Items.Remove("320");\r
-                drp_audioBitrate.Items.Remove("384");\r
+                drp_audioBitrate.Items.Add("384");\r
             }\r
-            if (drp_audioBitrate.SelectedItem == null)\r
+\r
+            if (max >= 640)\r
+            {\r
+                drp_audioBitrate.Items.Add("448");\r
+                drp_audioBitrate.Items.Add("640");\r
+            }\r
+\r
+            if (max == 768)\r
+            {\r
+                drp_audioBitrate.Items.Add("768");\r
+            }\r
+\r
+            if (drp_audioBitrate.SelectedItem == null && audioList.SelectedRows.Count == 0)\r
                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
+\r
+            if (drp_audioBitrate.SelectedItem == null && audioList.SelectedRows.Count != 0 && (string)this.audioList.SelectedRows[0].Cells[5].Value == "Auto")\r
+            {\r
+                drp_audioBitrate.SelectedItem = "160";\r
+            }\r
         }\r
-        private void setMixDown(Boolean aac)\r
+\r
+        /// <summary>\r
+        /// Set the mixdown dropdown\r
+        /// </summary>\r
+        private void SetMixDown()\r
         {\r
             drp_audioMix.Items.Clear();\r
-            drp_audioMix.Items.Add("Automatic");\r
-            if (aac)\r
-                drp_audioMix.Items.Add("Mono");\r
+            drp_audioMix.Items.Add("Mono");\r
             drp_audioMix.Items.Add("Stereo");\r
             drp_audioMix.Items.Add("Dolby Surround");\r
             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
-            if (aac)\r
-                drp_audioMix.Items.Add("6 Channel Discrete");\r
-        }\r
-        private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Set the dropdown controls based on the selected item in the Audio List.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
-                drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
-                drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
-                drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
-                drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
-                double drcValue; int drcCalculated;\r
-                double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
-                if (drcValue == 0) drcCalculated = 0;\r
-                else\r
-                    drcValue = ((drcValue * 10) + 1) - 10;\r
-                int.TryParse(drcValue.ToString(), out drcCalculated);\r
-                tb_drc.Value = drcCalculated;\r
-                lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
+            drp_audioMix.Items.Add("6 Channel Discrete");\r
+            drp_audioMix.Items.Add(AC3Passthru);\r
+            drp_audioMix.Items.Add(DTSPassthru);\r
+\r
+            drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
 \r
-                AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
+            switch (drp_audioEncoder.Text)\r
+            {\r
+                case "AAC (faac)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "MP3 (lame)":\r
+                    drp_audioMix.Items.Remove("6 Channel Discrete");\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "Vorbis (vorbis)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "AC3 (ffmpeg)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "AC3 Passthru":\r
+                    drp_audioMix.SelectedItem = AC3Passthru;\r
+                    break;\r
+                case "DTS Passthru":\r
+                    drp_audioMix.SelectedItem = DTSPassthru;\r
+                    break;\r
             }\r
-            else\r
-                AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
         }\r
-\r
     }\r
 }
\ No newline at end of file
index 07fd5e2..1a22734 100644 (file)
   <metadata name="AudioMenuRowHeightHack.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>35, 17</value>\r
   </metadata>\r
+  <metadata name="Track.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="Source.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="AudioCodec.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="Mixdown.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="Samplerate.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="Bitrate.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <metadata name="DRC.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
 </root>
\ No newline at end of file
index cc2346a..33531ca 100644 (file)
@@ -86,7 +86,7 @@
             this.drop_detelecine.Name = "drop_detelecine";\r
             this.drop_detelecine.Size = new System.Drawing.Size(174, 21);\r
             this.drop_detelecine.TabIndex = 45;\r
-            this.drop_detelecine.SelectedIndexChanged += new System.EventHandler(this.drop_detelecine_SelectedIndexChanged);\r
+            this.drop_detelecine.SelectedIndexChanged += new System.EventHandler(this.DropDetelecineSelectedIndexChanged);\r
             // \r
             // text_customDC\r
             // \r
             this.drop_decomb.Name = "drop_decomb";\r
             this.drop_decomb.Size = new System.Drawing.Size(174, 21);\r
             this.drop_decomb.TabIndex = 48;\r
-            this.drop_decomb.SelectedIndexChanged += new System.EventHandler(this.drop_decomb_SelectedIndexChanged);\r
+            this.drop_decomb.SelectedIndexChanged += new System.EventHandler(this.DropDecombSelectedIndexChanged);\r
             // \r
             // text_customDI\r
             // \r
             this.drop_deinterlace.Name = "drop_deinterlace";\r
             this.drop_deinterlace.Size = new System.Drawing.Size(174, 21);\r
             this.drop_deinterlace.TabIndex = 51;\r
-            this.drop_deinterlace.SelectedIndexChanged += new System.EventHandler(this.drop_deinterlace_SelectedIndexChanged);\r
+            this.drop_deinterlace.SelectedIndexChanged += new System.EventHandler(this.DropDeinterlaceSelectedIndexChanged);\r
             // \r
             // text_customDN\r
             // \r
             this.drop_denoise.Name = "drop_denoise";\r
             this.drop_denoise.Size = new System.Drawing.Size(174, 21);\r
             this.drop_denoise.TabIndex = 54;\r
-            this.drop_denoise.SelectedIndexChanged += new System.EventHandler(this.drop_denoise_SelectedIndexChanged);\r
+            this.drop_denoise.SelectedIndexChanged += new System.EventHandler(this.DropDenoiseSelectedIndexChanged);\r
             // \r
             // slider_deblock\r
             // \r
             this.slider_deblock.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)\r
                         | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.slider_deblock.BackColor = System.Drawing.SystemColors.Window;\r
             this.slider_deblock.Location = new System.Drawing.Point(71, 111);\r
             this.slider_deblock.Maximum = 15;\r
             this.slider_deblock.Minimum = 4;\r
             this.slider_deblock.Size = new System.Drawing.Size(174, 45);\r
             this.slider_deblock.TabIndex = 58;\r
             this.slider_deblock.Value = 4;\r
-            this.slider_deblock.Scroll += new System.EventHandler(this.slider_deblock_Scroll);\r
+            this.slider_deblock.Scroll += new System.EventHandler(this.SliderDeblockScroll);\r
             // \r
             // check_grayscale\r
             // \r
index c5c56fc..dda8c95 100644 (file)
@@ -1,12 +1,27 @@
-using System;\r
-using System.Windows.Forms;\r
+/*  Filters.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// The Filters Panel\r
+    /// </summary>\r
     public partial class Filters : UserControl\r
     {\r
+        /// <summary>\r
+        /// The Filter settings have changed\r
+        /// </summary>\r
         public event EventHandler FilterSettingsChanged;\r
 \r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Filters"/> class. \r
+        /// Creates a new instance of Filters\r
+        /// </summary>\r
         public Filters()\r
         {\r
             InitializeComponent();\r
@@ -16,62 +31,19 @@ namespace Handbrake.Controls
             drop_detelecine.SelectedIndex = 0;\r
         }\r
 \r
-        // Controls\r
-        private void drop_detelecine_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            text_customDT.Visible = drop_detelecine.Text == "Custom";\r
-            // A Filter has changed so raise a FilterSettingsChanged event.\r
-            if (this.FilterSettingsChanged != null)\r
-                this.FilterSettingsChanged(this, new EventArgs());\r
-        }\r
-        private void drop_decomb_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            text_customDC.Visible = drop_decomb.Text == "Custom";\r
-            if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)\r
-                drop_deinterlace.SelectedIndex = 0;\r
-\r
-            // A Filter has changed so raise a FilterSettingsChanged event.\r
-            if (this.FilterSettingsChanged != null)\r
-                this.FilterSettingsChanged(this, new EventArgs());\r
-        }\r
-        private void drop_deinterlace_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            text_customDI.Visible = drop_deinterlace.Text == "Custom";\r
-            if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)\r
-                drop_decomb.SelectedIndex = 0;\r
-\r
-            // A Filter has changed so raise a FilterSettingsChanged event.\r
-            if (this.FilterSettingsChanged != null)\r
-                this.FilterSettingsChanged(this, new EventArgs());\r
-        }\r
-        private void drop_denoise_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            text_customDN.Visible = drop_denoise.Text == "Custom";\r
-\r
-            // A Filter has changed so raise a FilterSettingsChanged event.\r
-            if (this.FilterSettingsChanged != null)\r
-                this.FilterSettingsChanged(this, new EventArgs());\r
-        }\r
-        private void slider_deblock_Scroll(object sender, EventArgs e)\r
-        {\r
-            lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();\r
-\r
-            // A Filter has changed so raise a FilterSettingsChanged event.\r
-            if (this.FilterSettingsChanged != null)\r
-                this.FilterSettingsChanged(this, new EventArgs());\r
-        }\r
-\r
-        // Returns the CLI query for the query generator.\r
-        public string getCLIQuery\r
+        /// <summary>\r
+        /// Gets the CLI query for the query generator.\r
+        /// </summary>\r
+        public string GetCliQuery\r
         {\r
             get\r
             {\r
-                string query = "";\r
+                string query = string.Empty;\r
 \r
-                switch (drop_detelecine.Text)  // DeTelecine\r
+                switch (drop_detelecine.Text) // DeTelecine\r
                 {\r
                     case "Off":\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                     case "Default":\r
                         query += " --detelecine";\r
@@ -80,15 +52,14 @@ namespace Handbrake.Controls
                         query += " --detelecine=\"" + text_customDT.Text + "\"";\r
                         break;\r
                     default:\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                 }\r
 \r
-\r
                 switch (drop_decomb.Text) // Decomb\r
                 {\r
                     case "Off":\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                     case "Default":\r
                         query += " --decomb";\r
@@ -97,14 +68,14 @@ namespace Handbrake.Controls
                         query += " --decomb=\"" + text_customDC.Text + "\"";\r
                         break;\r
                     default:\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                 }\r
 \r
                 switch (drop_deinterlace.Text) // DeInterlace\r
                 {\r
                     case "None":\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                     case "Fast":\r
                         query += " --deinterlace=\"fast\"";\r
@@ -119,14 +90,14 @@ namespace Handbrake.Controls
                         query += " --deinterlace=\"" + text_customDI.Text + "\"";\r
                         break;\r
                     default:\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                 }\r
 \r
                 switch (drop_denoise.Text) // Denoise\r
                 {\r
                     case "None":\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                     case "Weak":\r
                         query += " --denoise=\"weak\"";\r
@@ -141,7 +112,7 @@ namespace Handbrake.Controls
                         query += " --denoise=\"" + text_customDN.Text + "\"";\r
                         break;\r
                     default:\r
-                        query += "";\r
+                        query += string.Empty;\r
                         break;\r
                 }\r
 \r
@@ -155,10 +126,13 @@ namespace Handbrake.Controls
             }\r
         }\r
 \r
-        // Setup for each component for the preset loader.\r
-        public void setDeTelecine(string value)\r
+        /// <summary>\r
+        /// Set the Detelecine control\r
+        /// </summary>\r
+        /// <param name="value">The value part of the CLI string</param>\r
+        public void SetDeTelecine(string value)\r
         {\r
-            text_customDT.Text = "";\r
+            text_customDT.Text = string.Empty;\r
             text_customDT.Visible = false;\r
             switch (value)\r
             {\r
@@ -175,9 +149,14 @@ namespace Handbrake.Controls
                     break;\r
             }\r
         }\r
-        public void setDeNoise(string value)\r
+\r
+        /// <summary>\r
+        /// Set the Denoise control\r
+        /// </summary>\r
+        /// <param name="value">The value part of the CLI string</param>\r
+        public void SetDeNoise(string value)\r
         {\r
-            text_customDN.Text = "";\r
+            text_customDN.Text = string.Empty;\r
             text_customDN.Visible = false;\r
             switch (value)\r
             {\r
@@ -200,13 +179,17 @@ namespace Handbrake.Controls
                     break;\r
             }\r
         }\r
-        public void setDeInterlace(string value)\r
+\r
+        /// <summary>\r
+        /// Set the Deinterlace Control\r
+        /// </summary>\r
+        /// <param name="value">The value part of the CLI string</param>\r
+        public void SetDeInterlace(string value)\r
         {\r
-            text_customDI.Text = "";\r
+            text_customDI.Text = string.Empty;\r
             text_customDI.Visible = false;\r
             switch (value)\r
             {\r
-\r
                 case "Off":\r
                     drop_deinterlace.SelectedIndex = 0;\r
                     break;\r
@@ -227,9 +210,14 @@ namespace Handbrake.Controls
                     break;\r
             }\r
         }\r
-        public void setDecomb(string value)\r
+\r
+        /// <summary>\r
+        /// Set the Decomb Control\r
+        /// </summary>\r
+        /// <param name="value">The value part of the CLI string</param>\r
+        public void SetDecomb(string value)\r
         {\r
-            text_customDC.Text = "";\r
+            text_customDC.Text = string.Empty;\r
             text_customDC.Visible = false;\r
             switch (value)\r
             {\r
@@ -246,7 +234,12 @@ namespace Handbrake.Controls
                     break;\r
             }\r
         }\r
-        public void setDeBlock(int value)\r
+\r
+        /// <summary>\r
+        /// Set the Deblock Control\r
+        /// </summary>\r
+        /// <param name="value">The deblock value</param>\r
+        public void SetDeBlock(int value)\r
         {\r
             if (value != 0)\r
             {\r
@@ -259,9 +252,63 @@ namespace Handbrake.Controls
                 lbl_deblockVal.Text = "Off";\r
             }\r
         }\r
-        public void setGrayScale(bool value)\r
+\r
+        /// <summary>\r
+        /// Set the grayscale control\r
+        /// </summary>\r
+        /// <param name="value">Boolean value</param>\r
+        public void SetGrayScale(bool value)\r
         {\r
             check_grayscale.CheckState = value ? CheckState.Checked : CheckState.Unchecked;\r
-        } \r
+        }\r
+\r
+        // Controls\r
+        private void DropDetelecineSelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            text_customDT.Visible = drop_detelecine.Text == "Custom";\r
+            // A Filter has changed so raise a FilterSettingsChanged event.\r
+            if (this.FilterSettingsChanged != null)\r
+                this.FilterSettingsChanged(this, new EventArgs());\r
+        }\r
+\r
+        private void DropDecombSelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            text_customDC.Visible = drop_decomb.Text == "Custom";\r
+            if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)\r
+                drop_deinterlace.SelectedIndex = 0;\r
+\r
+            // A Filter has changed so raise a FilterSettingsChanged event.\r
+            if (this.FilterSettingsChanged != null)\r
+                this.FilterSettingsChanged(this, new EventArgs());\r
+        }\r
+\r
+        private void DropDeinterlaceSelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            text_customDI.Visible = drop_deinterlace.Text == "Custom";\r
+            if (drop_decomb.SelectedIndex != 0 && drop_deinterlace.SelectedIndex != 0)\r
+                drop_decomb.SelectedIndex = 0;\r
+\r
+            // A Filter has changed so raise a FilterSettingsChanged event.\r
+            if (this.FilterSettingsChanged != null)\r
+                this.FilterSettingsChanged(this, new EventArgs());\r
+        }\r
+\r
+        private void DropDenoiseSelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            text_customDN.Visible = drop_denoise.Text == "Custom";\r
+\r
+            // A Filter has changed so raise a FilterSettingsChanged event.\r
+            if (this.FilterSettingsChanged != null)\r
+                this.FilterSettingsChanged(this, new EventArgs());\r
+        }\r
+\r
+        private void SliderDeblockScroll(object sender, EventArgs e)\r
+        {\r
+            lbl_deblockVal.Text = slider_deblock.Value == 4 ? "Off" : slider_deblock.Value.ToString();\r
+\r
+            // A Filter has changed so raise a FilterSettingsChanged event.\r
+            if (this.FilterSettingsChanged != null)\r
+                this.FilterSettingsChanged(this, new EventArgs());\r
+        }\r
     }\r
-}\r
+}
\ No newline at end of file
index 30a8933..c6b3b00 100644 (file)
@@ -42,11 +42,8 @@ namespace Handbrake.Controls
             this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();\r
             this.label7 = new System.Windows.Forms.Label();\r
             this.lbl_src_res = new System.Windows.Forms.Label();\r
-            this.Label91 = new System.Windows.Forms.Label();\r
-            this.lbl_Aspect = new System.Windows.Forms.Label();\r
             this.Label55 = new System.Windows.Forms.Label();\r
             this.text_width = new System.Windows.Forms.NumericUpDown();\r
-            this.lbl_max = new System.Windows.Forms.Label();\r
             this.label4 = new System.Windows.Forms.Label();\r
             this.text_height = new System.Windows.Forms.NumericUpDown();\r
             this.check_KeepAR = new System.Windows.Forms.CheckBox();\r
@@ -65,6 +62,7 @@ namespace Handbrake.Controls
             this.drp_modulus = new System.Windows.Forms.ComboBox();\r
             this.label8 = new System.Windows.Forms.Label();\r
             this.label26 = new System.Windows.Forms.Label();\r
+            this.lbl_presetCropWarning = new System.Windows.Forms.Label();\r
             this.tableLayoutPanel3.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.crop_left)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.crop_right)).BeginInit();\r
@@ -141,7 +139,7 @@ namespace Handbrake.Controls
             this.crop_left.Name = "crop_left";\r
             this.crop_left.Size = new System.Drawing.Size(44, 21);\r
             this.crop_left.TabIndex = 98;\r
-            this.crop_left.ValueChanged += new System.EventHandler(this.crop_ValueChanged);\r
+            this.crop_left.ValueChanged += new System.EventHandler(this.CropValueChanged);\r
             // \r
             // crop_right\r
             // \r
@@ -160,7 +158,7 @@ namespace Handbrake.Controls
             this.crop_right.Name = "crop_right";\r
             this.crop_right.Size = new System.Drawing.Size(44, 21);\r
             this.crop_right.TabIndex = 101;\r
-            this.crop_right.ValueChanged += new System.EventHandler(this.crop_ValueChanged);\r
+            this.crop_right.ValueChanged += new System.EventHandler(this.CropValueChanged);\r
             // \r
             // check_autoCrop\r
             // \r
@@ -176,7 +174,7 @@ namespace Handbrake.Controls
             this.check_autoCrop.TabStop = true;\r
             this.check_autoCrop.Text = "Automatic";\r
             this.check_autoCrop.UseVisualStyleBackColor = true;\r
-            this.check_autoCrop.CheckedChanged += new System.EventHandler(this.check_autoCrop_CheckedChanged);\r
+            this.check_autoCrop.CheckedChanged += new System.EventHandler(this.CheckAutoCropCheckedChanged);\r
             // \r
             // Label51\r
             // \r
@@ -208,7 +206,7 @@ namespace Handbrake.Controls
             this.crop_top.Name = "crop_top";\r
             this.crop_top.Size = new System.Drawing.Size(44, 21);\r
             this.crop_top.TabIndex = 100;\r
-            this.crop_top.ValueChanged += new System.EventHandler(this.crop_ValueChanged);\r
+            this.crop_top.ValueChanged += new System.EventHandler(this.CropValueChanged);\r
             // \r
             // Label53\r
             // \r
@@ -253,7 +251,7 @@ namespace Handbrake.Controls
             this.crop_bottom.Name = "crop_bottom";\r
             this.crop_bottom.Size = new System.Drawing.Size(44, 21);\r
             this.crop_bottom.TabIndex = 103;\r
-            this.crop_bottom.ValueChanged += new System.EventHandler(this.crop_ValueChanged);\r
+            this.crop_bottom.ValueChanged += new System.EventHandler(this.CropValueChanged);\r
             // \r
             // check_customCrop\r
             // \r
@@ -279,11 +277,8 @@ namespace Handbrake.Controls
             this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel2.Controls.Add(this.label7, 0, 0);\r
             this.tableLayoutPanel2.Controls.Add(this.lbl_src_res, 1, 0);\r
-            this.tableLayoutPanel2.Controls.Add(this.Label91, 2, 0);\r
-            this.tableLayoutPanel2.Controls.Add(this.lbl_Aspect, 3, 0);\r
             this.tableLayoutPanel2.Controls.Add(this.Label55, 0, 1);\r
             this.tableLayoutPanel2.Controls.Add(this.text_width, 1, 1);\r
-            this.tableLayoutPanel2.Controls.Add(this.lbl_max, 4, 1);\r
             this.tableLayoutPanel2.Controls.Add(this.label4, 2, 1);\r
             this.tableLayoutPanel2.Controls.Add(this.text_height, 3, 1);\r
             this.tableLayoutPanel2.Controls.Add(this.check_KeepAR, 1, 2);\r
@@ -322,32 +317,6 @@ namespace Handbrake.Controls
             this.lbl_src_res.TabIndex = 77;\r
             this.lbl_src_res.Text = "--";\r
             // \r
-            // Label91\r
-            // \r
-            this.Label91.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.Label91.AutoSize = true;\r
-            this.Label91.BackColor = System.Drawing.Color.Transparent;\r
-            this.Label91.ImeMode = System.Windows.Forms.ImeMode.NoControl;\r
-            this.Label91.Location = new System.Drawing.Point(120, 3);\r
-            this.Label91.Margin = new System.Windows.Forms.Padding(3);\r
-            this.Label91.Name = "Label91";\r
-            this.Label91.Size = new System.Drawing.Size(72, 13);\r
-            this.Label91.TabIndex = 78;\r
-            this.Label91.Text = "Aspect Ratio:";\r
-            // \r
-            // lbl_Aspect\r
-            // \r
-            this.lbl_Aspect.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.lbl_Aspect.AutoSize = true;\r
-            this.lbl_Aspect.BackColor = System.Drawing.Color.Transparent;\r
-            this.lbl_Aspect.ImeMode = System.Windows.Forms.ImeMode.NoControl;\r
-            this.lbl_Aspect.Location = new System.Drawing.Point(198, 3);\r
-            this.lbl_Aspect.Margin = new System.Windows.Forms.Padding(3);\r
-            this.lbl_Aspect.Name = "lbl_Aspect";\r
-            this.lbl_Aspect.Size = new System.Drawing.Size(15, 13);\r
-            this.lbl_Aspect.TabIndex = 79;\r
-            this.lbl_Aspect.Text = "--";\r
-            // \r
             // Label55\r
             // \r
             this.Label55.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
@@ -373,20 +342,7 @@ namespace Handbrake.Controls
             this.text_width.Name = "text_width";\r
             this.text_width.Size = new System.Drawing.Size(64, 21);\r
             this.text_width.TabIndex = 85;\r
-            this.text_width.ValueChanged += new System.EventHandler(this.text_width_ValueChanged);\r
-            // \r
-            // lbl_max\r
-            // \r
-            this.lbl_max.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.lbl_max.AutoSize = true;\r
-            this.lbl_max.ImeMode = System.Windows.Forms.ImeMode.NoControl;\r
-            this.lbl_max.Location = new System.Drawing.Point(268, 26);\r
-            this.lbl_max.Margin = new System.Windows.Forms.Padding(3);\r
-            this.lbl_max.Name = "lbl_max";\r
-            this.lbl_max.Size = new System.Drawing.Size(15, 13);\r
-            this.lbl_max.TabIndex = 83;\r
-            this.lbl_max.Text = "--";\r
-            this.lbl_max.DoubleClick += new System.EventHandler(this.lbl_max_DoubleClick);\r
+            this.text_width.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);\r
             // \r
             // label4\r
             // \r
@@ -404,7 +360,7 @@ namespace Handbrake.Controls
             // \r
             // text_height\r
             // \r
-            this.text_height.Location = new System.Drawing.Point(198, 22);\r
+            this.text_height.Location = new System.Drawing.Point(168, 22);\r
             this.text_height.Maximum = new decimal(new int[] {\r
             2560,\r
             0,\r
@@ -413,7 +369,7 @@ namespace Handbrake.Controls
             this.text_height.Name = "text_height";\r
             this.text_height.Size = new System.Drawing.Size(64, 21);\r
             this.text_height.TabIndex = 86;\r
-            this.text_height.ValueChanged += new System.EventHandler(this.text_height_ValueChanged);\r
+            this.text_height.ValueChanged += new System.EventHandler(this.TextHeightValueChanged);\r
             // \r
             // check_KeepAR\r
             // \r
@@ -428,7 +384,7 @@ namespace Handbrake.Controls
             this.check_KeepAR.TabIndex = 95;\r
             this.check_KeepAR.Text = "Keep Aspect Ratio";\r
             this.check_KeepAR.UseVisualStyleBackColor = true;\r
-            this.check_KeepAR.CheckedChanged += new System.EventHandler(this.check_KeepAR_CheckedChanged);\r
+            this.check_KeepAR.CheckedChanged += new System.EventHandler(this.CheckKeepArCheckedChanged);\r
             // \r
             // tableLayoutPanel1\r
             // \r
@@ -465,14 +421,14 @@ namespace Handbrake.Controls
             // \r
             this.updownParHeight.Location = new System.Drawing.Point(82, 111);\r
             this.updownParHeight.Maximum = new decimal(new int[] {\r
-            2560,\r
+            10000,\r
             0,\r
             0,\r
             0});\r
             this.updownParHeight.Name = "updownParHeight";\r
             this.updownParHeight.Size = new System.Drawing.Size(53, 21);\r
             this.updownParHeight.TabIndex = 112;\r
-            this.updownParHeight.ValueChanged += new System.EventHandler(this.text_width_ValueChanged);\r
+            this.updownParHeight.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);\r
             // \r
             // label6\r
             // \r
@@ -529,14 +485,14 @@ namespace Handbrake.Controls
             // \r
             this.updownParWidth.Location = new System.Drawing.Point(82, 84);\r
             this.updownParWidth.Maximum = new decimal(new int[] {\r
-            2560,\r
+            10000,\r
             0,\r
             0,\r
             0});\r
             this.updownParWidth.Name = "updownParWidth";\r
             this.updownParWidth.Size = new System.Drawing.Size(53, 21);\r
             this.updownParWidth.TabIndex = 111;\r
-            this.updownParWidth.ValueChanged += new System.EventHandler(this.text_width_ValueChanged);\r
+            this.updownParWidth.ValueChanged += new System.EventHandler(this.TextWidthValueChanged);\r
             // \r
             // drp_anamorphic\r
             // \r
@@ -551,7 +507,7 @@ namespace Handbrake.Controls
             this.drp_anamorphic.Name = "drp_anamorphic";\r
             this.drp_anamorphic.Size = new System.Drawing.Size(110, 21);\r
             this.drp_anamorphic.TabIndex = 82;\r
-            this.drp_anamorphic.SelectedIndexChanged += new System.EventHandler(this.drp_anamorphic_SelectedIndexChanged);\r
+            this.drp_anamorphic.SelectedIndexChanged += new System.EventHandler(this.DrpAnamorphicSelectedIndexChanged);\r
             // \r
             // lbl_parWidth\r
             // \r
@@ -577,7 +533,7 @@ namespace Handbrake.Controls
             this.updownDisplayWidth.Name = "updownDisplayWidth";\r
             this.updownDisplayWidth.Size = new System.Drawing.Size(53, 21);\r
             this.updownDisplayWidth.TabIndex = 110;\r
-            this.updownDisplayWidth.ValueChanged += new System.EventHandler(this.updownDisplayWidth_ValueChanged);\r
+            this.updownDisplayWidth.ValueChanged += new System.EventHandler(this.UpdownDisplayWidthValueChanged);\r
             // \r
             // lbl_modulus\r
             // \r
@@ -618,7 +574,7 @@ namespace Handbrake.Controls
             this.drp_modulus.Name = "drp_modulus";\r
             this.drp_modulus.Size = new System.Drawing.Size(110, 21);\r
             this.drp_modulus.TabIndex = 88;\r
-            this.drp_modulus.SelectedIndexChanged += new System.EventHandler(this.drp_modulus_SelectedIndexChanged);\r
+            this.drp_modulus.SelectedIndexChanged += new System.EventHandler(this.DrpModulusSelectedIndexChanged);\r
             // \r
             // label8\r
             // \r
@@ -644,10 +600,21 @@ namespace Handbrake.Controls
             this.label26.TabIndex = 113;\r
             this.label26.Text = "Size";\r
             // \r
+            // lbl_presetCropWarning\r
+            // \r
+            this.lbl_presetCropWarning.AutoSize = true;\r
+            this.lbl_presetCropWarning.ForeColor = System.Drawing.Color.Black;\r
+            this.lbl_presetCropWarning.Location = new System.Drawing.Point(479, 13);\r
+            this.lbl_presetCropWarning.Name = "lbl_presetCropWarning";\r
+            this.lbl_presetCropWarning.Size = new System.Drawing.Size(140, 13);\r
+            this.lbl_presetCropWarning.TabIndex = 118;\r
+            this.lbl_presetCropWarning.Text = "( Preset values are in use! )";\r
+            // \r
             // PictureSettings\r
             // \r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;\r
             this.BackColor = System.Drawing.Color.Transparent;\r
+            this.Controls.Add(this.lbl_presetCropWarning);\r
             this.Controls.Add(this.tableLayoutPanel3);\r
             this.Controls.Add(this.tableLayoutPanel2);\r
             this.Controls.Add(this.tableLayoutPanel1);\r
@@ -693,10 +660,7 @@ namespace Handbrake.Controls
         private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;\r
         internal System.Windows.Forms.Label label7;\r
         internal System.Windows.Forms.Label lbl_src_res;\r
-        internal System.Windows.Forms.Label Label91;\r
-        internal System.Windows.Forms.Label lbl_Aspect;\r
         internal System.Windows.Forms.Label Label55;\r
-        private System.Windows.Forms.Label lbl_max;\r
         internal System.Windows.Forms.Label label4;\r
         internal System.Windows.Forms.CheckBox check_KeepAR;\r
         private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
@@ -716,6 +680,7 @@ namespace Handbrake.Controls
         internal System.Windows.Forms.Label label26;\r
         internal System.Windows.Forms.NumericUpDown text_width;\r
         internal System.Windows.Forms.NumericUpDown text_height;\r
+        private System.Windows.Forms.Label lbl_presetCropWarning;\r
 \r
 \r
 \r
index bbca24d..b6f51f5 100644 (file)
@@ -1,22 +1,36 @@
-using System;\r
-using System.ComponentModel;\r
-using System.Drawing;\r
-using System.Globalization;\r
-using System.Windows.Forms;\r
-using Handbrake.Parsing;\r
+/*  PictureSetting.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Drawing;\r
+    using System.Globalization;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.ApplicationServices.Parsing;\r
+\r
+    using Presets;\r
+\r
+    /// <summary>\r
+    /// The Picture Settings Panel\r
+    /// </summary>\r
     public partial class PictureSettings : UserControl\r
     {\r
-        private readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
-        public event EventHandler PictureSettingsChanged;\r
-\r
-        private Boolean _preventChangingWidth, _preventChangingHeight, _preventChangingCustom, _preventChangingDisplayWidth;\r
-        private int _presetMaximumWidth, _presetMaximumHeight;\r
-        private double _cachedDar;\r
-        private Title _sourceTitle;\r
+        private readonly CultureInfo culture = new CultureInfo("en-US", false);\r
+        private bool preventChangingWidth;\r
+        private bool preventChangingHeight;\r
+        private bool preventChangingCustom;\r
+        private bool preventChangingDisplayWidth;\r
+        private double cachedDar;\r
+        private Title sourceTitle;\r
 \r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="PictureSettings"/> class. \r
+        /// Creates a new instance of the Picture Settings Class\r
+        /// </summary>\r
         public PictureSettings()\r
         {\r
             InitializeComponent();\r
@@ -26,91 +40,119 @@ namespace Handbrake.Controls
         }\r
 \r
         /// <summary>\r
+        /// Picture Settings Changed Event Handler\r
+        /// </summary>\r
+        public event EventHandler PictureSettingsChanged;\r
+\r
+        /// <summary>\r
         /// Gets or sets the source media used by this control.\r
         /// </summary>\r
-        [Browsable(false)]\r
-        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r
         public Title Source\r
         {\r
-            private get { return _sourceTitle; }\r
-            set\r
+            private get\r
             {\r
-                _sourceTitle = value;\r
-                Enabled = _sourceTitle != null;\r
-\r
-                // Set the Aspect Ratio\r
-                lbl_Aspect.Text = _sourceTitle.AspectRatio.ToString(Culture);\r
-                lbl_src_res.Text = _sourceTitle.Resolution.Width + " x " + _sourceTitle.Resolution.Height;\r
-\r
-                // Set the Recommended Cropping values\r
-                crop_top.Value = GetCropMod2Clean(_sourceTitle.AutoCropDimensions[0]);\r
-                crop_bottom.Value = GetCropMod2Clean(_sourceTitle.AutoCropDimensions[1]);\r
-                crop_left.Value = GetCropMod2Clean(_sourceTitle.AutoCropDimensions[2]);\r
-                crop_right.Value = GetCropMod2Clean(_sourceTitle.AutoCropDimensions[3]);\r
-\r
-                // Set the Resolution Boxes\r
-                if (drp_anamorphic.SelectedIndex == 0)\r
-                {\r
-                    if (text_width.Value == 0) // Only update the values if the fields don't already have values.\r
-                        text_width.Value = _sourceTitle.Resolution.Width;\r
-\r
-                    check_KeepAR.Checked = true; // Forces Resolution to be correct.\r
-                }\r
-                else\r
-                {\r
-                    if (text_width.Value == 0 && text_height.Value == 0)// Only update the values if the fields don't already have values.\r
-                    {\r
-                        text_width.Value = _sourceTitle.Resolution.Width;\r
-                        text_height.Value = _sourceTitle.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
-                    }\r
+                return sourceTitle;\r
+            }\r
 \r
-                    labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;\r
-                }\r
+            set\r
+            {\r
+                sourceTitle = value;\r
+                Enabled = sourceTitle != null;\r
+                NewSourceSet();\r
+            }\r
+        }\r
 \r
-                //updownDisplayWidth.Value = CalculateAnamorphicSizes().Width;\r
-                updownParWidth.Value = _sourceTitle.ParVal.Width;\r
-                updownParHeight.Value = _sourceTitle.ParVal.Height;\r
-                //_cachedDar = (double)updownDisplayWidth.Value / (double)text_height.Value;\r
+        /// <summary>\r
+        /// Gets or sets the currently selected preset.\r
+        /// </summary>\r
+        public Preset CurrentlySelectedPreset { get; set; }\r
 \r
+        /// <summary>\r
+        /// Gets or sets the maximum allowable size for the encoded resolution. Set a value to\r
+        /// "0" if the maximum does not matter.\r
+        /// </summary>\r
+        public Size PresetMaximumResolution { get; set; }\r
 \r
-                Size croppedDar = CalculateAnamorphicSizes();\r
-                _cachedDar = (double) croppedDar.Width/croppedDar.Height;\r
-                updownDisplayWidth.Value = croppedDar.Width;\r
+        /// <summary>\r
+        /// Set the Preset Crop Warning Label\r
+        /// </summary>\r
+        /// <param name="selectedPreset">\r
+        /// The Selected preset\r
+        /// </param>\r
+        public void SetPresetCropWarningLabel(Preset selectedPreset)\r
+        {\r
+            if (this.check_customCrop.Checked)\r
+            {\r
+                lbl_presetCropWarning.Visible = true;\r
+                if (selectedPreset != null && selectedPreset.CropSettings == false) lbl_presetCropWarning.Visible = false;\r
+                else if (selectedPreset == null) lbl_presetCropWarning.Visible = false;\r
+            }\r
+            else\r
+            {\r
+                lbl_presetCropWarning.Visible = false;\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Gets or sets the maximum allowable size for the encoded resolution. Set a value to\r
-        /// "0" if the maximum does not matter.\r
+        /// Setup the UI. The Source has just changed.\r
         /// </summary>\r
-        [Browsable(false)]\r
-        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]\r
-        public Size PresetMaximumResolution\r
+        private void NewSourceSet()\r
         {\r
-            get { return new Size(_presetMaximumWidth, _presetMaximumHeight); }\r
-            set\r
+            // Set the Aspect Ratio\r
+            lbl_src_res.Text = sourceTitle.Resolution.Width + " x " + sourceTitle.Resolution.Height;\r
+\r
+            // Set the Recommended Cropping values, but only if a preset doesn't have hard set picture settings.\r
+            if ((CurrentlySelectedPreset != null && CurrentlySelectedPreset.CropSettings == false) || CurrentlySelectedPreset == null)\r
             {\r
-                _presetMaximumWidth = value.Width;\r
-                _presetMaximumHeight = value.Height;\r
-\r
-                if (value.Width != 0 && value.Height != 0)\r
-                    lbl_max.Text = "Max Width / Height";\r
-                else if (value.Width != 0)\r
-                    lbl_max.Text = "Max Width";\r
-                else if (value.Height != 0)\r
-                    lbl_max.Text = "Max Height";\r
-                else\r
-                    lbl_max.Text = "";\r
+                crop_top.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Top);\r
+                crop_bottom.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Bottom);\r
+                crop_left.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Left);\r
+                crop_right.Value = GetCropMod2Clean(sourceTitle.AutoCropDimensions.Right);\r
             }\r
+\r
+            SetPresetCropWarningLabel(CurrentlySelectedPreset);\r
+\r
+            // Set the Resolution Boxes\r
+            if (drp_anamorphic.SelectedIndex == 0)\r
+            {\r
+                int width = sourceTitle.Resolution.Width;\r
+\r
+                if (width > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0) // If the preset has a Max width set, don't use a width larger than it.\r
+                    width = PresetMaximumResolution.Width;\r
+\r
+                if (text_width.Value == 0 || (text_width.Value > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0)) // Only update the values if the fields don't already have values.\r
+                    text_width.Value = width;\r
+\r
+                check_KeepAR.Checked = true; // Forces Resolution to be correct.\r
+            }\r
+            else\r
+            {\r
+                int width = sourceTitle.Resolution.Width;\r
+                if (width > PresetMaximumResolution.Width && PresetMaximumResolution.Width != 0) // If the preset has a Max width set, don't use a width larger than it.\r
+                    width = PresetMaximumResolution.Width;\r
+\r
+                int height = sourceTitle.Resolution.Height;\r
+                if (height > PresetMaximumResolution.Height && PresetMaximumResolution.Height != 0) // If the preset has a Max height set, don't use a width larger than it.\r
+                    height = PresetMaximumResolution.Height;\r
+\r
+                text_width.Value = width;\r
+                text_height.Value = height - (int)crop_top.Value - (int)crop_bottom.Value;\r
+\r
+                labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;\r
+            }\r
+\r
+            updownParWidth.Value = sourceTitle.ParVal.Width;\r
+            updownParHeight.Value = sourceTitle.ParVal.Height;\r
+\r
+            Size croppedDar = CalculateAnamorphicSizes();\r
+            cachedDar = (double)croppedDar.Width / croppedDar.Height;\r
+            updownDisplayWidth.Value = croppedDar.Width;\r
         }\r
 \r
         // Picture Controls\r
-        private void text_width_ValueChanged(object sender, EventArgs e)\r
+        private void TextWidthValueChanged(object sender, EventArgs e)\r
         {\r
-            if (Properties.Settings.Default.disableResCalc)\r
-                return;\r
-\r
-            if (_preventChangingWidth)\r
+            if (preventChangingWidth)\r
                 return;\r
 \r
             // Make sure the new value doesn't exceed the maximum\r
@@ -123,7 +165,7 @@ namespace Handbrake.Controls
                 case 0:\r
                     if (check_KeepAR.Checked && Source != null)\r
                     {\r
-                        _preventChangingHeight = true;\r
+                        preventChangingHeight = true;\r
 \r
                         int width = (int)text_width.Value;\r
 \r
@@ -137,18 +179,18 @@ namespace Handbrake.Controls
                                            (Source.Resolution.Height * SourceAspect.Width * crop_width);\r
                         text_height.Value = (decimal)GetModulusValue(newHeight);\r
 \r
-                        _preventChangingHeight = false;\r
+                        preventChangingHeight = false;\r
                     }\r
                     break;\r
                 case 3:\r
                     if (check_KeepAR.CheckState == CheckState.Unchecked && Source != null)\r
                     {\r
-                        if (_preventChangingCustom)\r
+                        if (preventChangingCustom)\r
                             break;\r
 \r
-                        _preventChangingDisplayWidth = true;\r
+                        preventChangingDisplayWidth = true;\r
                         updownDisplayWidth.Value = text_width.Value * updownParWidth.Value / updownParHeight.Value;\r
-                        _preventChangingDisplayWidth = false;\r
+                        preventChangingDisplayWidth = false;\r
 \r
                         labelDisplaySize.Text = Math.Truncate(updownDisplayWidth.Value) + "x" + text_height.Value;\r
                     }\r
@@ -164,14 +206,12 @@ namespace Handbrake.Controls
                     break;\r
             }\r
 \r
-            _preventChangingWidth = false;\r
+            preventChangingWidth = false;\r
         }\r
-        private void text_height_ValueChanged(object sender, EventArgs e)\r
-        {\r
-            if (Properties.Settings.Default.disableResCalc)\r
-                return;\r
 \r
-            if (_preventChangingHeight)\r
+        private void TextHeightValueChanged(object sender, EventArgs e)\r
+        {\r
+            if (preventChangingHeight)\r
                 return;\r
 \r
             if (Source != null)\r
@@ -183,17 +223,18 @@ namespace Handbrake.Controls
                 case 0:\r
                     if (check_KeepAR.Checked && Source != null)\r
                     {\r
-                        _preventChangingWidth = true;\r
+                        preventChangingWidth = true;\r
 \r
                         double crop_width = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;\r
                         double crop_height = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
 \r
-                        double new_width = ((double)text_height.Value * Source.Resolution.Height * SourceAspect.Width * crop_width) /\r
-                                            (Source.Resolution.Width * SourceAspect.Height * crop_height);\r
+                        double new_width = ((double)text_height.Value * Source.Resolution.Height * SourceAspect.Width *\r
+                                            crop_width) /\r
+                                           (Source.Resolution.Width * SourceAspect.Height * crop_height);\r
 \r
                         text_width.Value = (decimal)GetModulusValue(new_width);\r
 \r
-                        _preventChangingWidth = false;\r
+                        preventChangingWidth = false;\r
                     }\r
                     break;\r
                 case 3:\r
@@ -206,17 +247,17 @@ namespace Handbrake.Controls
                         // - Changes PIXEL HEIGHT to STORAGE WIDTH\r
                         // DAR = DISPLAY WIDTH / DISPLAY HEIGHT (cache after every modification)\r
 \r
-                        double rawCalculatedDisplayWidth = (double)text_height.Value * _cachedDar;\r
+                        double rawCalculatedDisplayWidth = (double)text_height.Value * cachedDar;\r
 \r
-                        _preventChangingDisplayWidth = true; // Start Guards\r
-                        _preventChangingWidth = true;\r
+                        preventChangingDisplayWidth = true; // Start Guards\r
+                        preventChangingWidth = true;\r
 \r
                         updownDisplayWidth.Value = (decimal)rawCalculatedDisplayWidth;\r
                         updownParWidth.Value = updownDisplayWidth.Value;\r
                         updownParHeight.Value = text_width.Value;\r
 \r
-                        _preventChangingWidth = false; // Reset Guards\r
-                        _preventChangingDisplayWidth = false;\r
+                        preventChangingWidth = false; // Reset Guards\r
+                        preventChangingDisplayWidth = false;\r
                     }\r
 \r
                     break;\r
@@ -225,16 +266,14 @@ namespace Handbrake.Controls
                     break;\r
             }\r
 \r
-            _preventChangingHeight = false;\r
+            preventChangingHeight = false;\r
         }\r
-        private void check_KeepAR_CheckedChanged(object sender, EventArgs e)\r
-        {\r
-            if (Properties.Settings.Default.disableResCalc)\r
-                return;\r
 \r
-            //Force TextWidth to recalc height\r
+        private void CheckKeepArCheckedChanged(object sender, EventArgs e)\r
+        {\r
+            // Force TextWidth to recalc height\r
             if (check_KeepAR.Checked)\r
-                text_width_ValueChanged(this, new EventArgs());\r
+                TextWidthValueChanged(this, new EventArgs());\r
 \r
             // Disable the Custom Anamorphic Par Controls if checked.\r
             if (drp_anamorphic.SelectedIndex == 3)\r
@@ -247,20 +286,18 @@ namespace Handbrake.Controls
             if (PictureSettingsChanged != null)\r
                 PictureSettingsChanged(this, new EventArgs());\r
         }\r
-        private void updownDisplayWidth_ValueChanged(object sender, EventArgs e)\r
-        {\r
-            if (Properties.Settings.Default.disableResCalc)\r
-                return;\r
 \r
-            if (_preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Unchecked)\r
+        private void UpdownDisplayWidthValueChanged(object sender, EventArgs e)\r
+        {\r
+            if (preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Unchecked)\r
             {\r
-                _preventChangingCustom = true;\r
+                preventChangingCustom = true;\r
                 updownParWidth.Value = updownDisplayWidth.Value;\r
                 updownParHeight.Value = text_width.Value;\r
-                _preventChangingCustom = false;\r
+                preventChangingCustom = false;\r
             }\r
 \r
-            if (_preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Checked)\r
+            if (preventChangingDisplayWidth == false && check_KeepAR.CheckState == CheckState.Checked)\r
             {\r
                 // - Changes HEIGHT to keep DAR\r
                 // - Changes PIXEL WIDTH to new DISPLAY WIDTH\r
@@ -269,28 +306,27 @@ namespace Handbrake.Controls
 \r
                 // Calculate new Height Value\r
                 int modulus;\r
-                if(!int.TryParse(drp_modulus.SelectedItem.ToString(), out modulus))\r
+                if (!int.TryParse(drp_modulus.SelectedItem.ToString(), out modulus))\r
                     modulus = 16;\r
 \r
-                int rawCalculatedHeight = (int)((int)updownDisplayWidth.Value / _cachedDar);\r
+                int rawCalculatedHeight = (int)((int)updownDisplayWidth.Value / cachedDar);\r
                 int modulusHeight = rawCalculatedHeight - (rawCalculatedHeight % modulus);\r
 \r
                 // Update value\r
-                _preventChangingHeight = true;\r
+                preventChangingHeight = true;\r
                 text_height.Value = (decimal)modulusHeight;\r
                 updownParWidth.Value = updownDisplayWidth.Value;\r
                 updownParHeight.Value = text_width.Value;\r
-                _preventChangingHeight = false;\r
+                preventChangingHeight = false;\r
             }\r
-\r
         }\r
 \r
         // Anamorphic Controls\r
-        private void drp_anamorphic_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void DrpAnamorphicSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             switch (drp_anamorphic.SelectedIndex)\r
             {\r
-                case 0:\r
+                case 0: // None\r
                     text_width.Enabled = true;\r
                     text_height.Enabled = true;\r
                     check_KeepAR.Enabled = true;\r
@@ -298,15 +334,16 @@ namespace Handbrake.Controls
                     SetCustomAnamorphicOptionsVisible(false);\r
                     labelStaticDisplaySize.Visible = false;\r
                     labelDisplaySize.Visible = false;\r
+                    drp_modulus.Visible = true;\r
+                    lbl_modulus.Visible = true;\r
 \r
-                    check_KeepAR.Checked = true;\r
-                    drp_modulus.SelectedIndex = 0;\r
+                    // check_KeepAR.Checked = true;\r
 \r
                     if (check_KeepAR.Checked)\r
-                        text_width_ValueChanged(this, new EventArgs());\r
+                        TextWidthValueChanged(this, new EventArgs());\r
                     // Don't update display size if we're not using anamorphic\r
                     return;\r
-                case 1:\r
+                case 1: // Strict\r
                     text_width.Enabled = false;\r
                     text_height.Enabled = false;\r
                     check_KeepAR.Enabled = false;\r
@@ -314,11 +351,10 @@ namespace Handbrake.Controls
                     SetCustomAnamorphicOptionsVisible(false);\r
                     labelStaticDisplaySize.Visible = true;\r
                     labelDisplaySize.Visible = true;\r
-                    drp_modulus.SelectedIndex = 0;\r
 \r
                     check_KeepAR.Checked = true;\r
                     break;\r
-                case 2:\r
+                case 2: // Loose\r
                     text_width.Enabled = true;\r
                     text_height.Enabled = false;\r
                     check_KeepAR.Enabled = false;\r
@@ -326,11 +362,12 @@ namespace Handbrake.Controls
                     SetCustomAnamorphicOptionsVisible(false);\r
                     labelStaticDisplaySize.Visible = true;\r
                     labelDisplaySize.Visible = true;\r
-                    drp_modulus.SelectedIndex = 0;\r
+                    drp_modulus.Visible = true;\r
+                    lbl_modulus.Visible = true;\r
 \r
                     check_KeepAR.Checked = true;\r
                     break;\r
-                case 3:\r
+                case 3: // Custom\r
                     text_width.Enabled = true;\r
                     text_height.Enabled = true;\r
                     check_KeepAR.Enabled = true;\r
@@ -343,27 +380,27 @@ namespace Handbrake.Controls
                     updownParWidth.Enabled = !check_KeepAR.Checked;\r
                     updownParHeight.Enabled = !check_KeepAR.Checked;\r
                     break;\r
-\r
             }\r
 \r
             labelDisplaySize.Text = CalculateAnamorphicSizes().Width + "x" + CalculateAnamorphicSizes().Height;\r
 \r
             if (check_KeepAR.Checked)\r
-                text_width_ValueChanged(this, new EventArgs());\r
+                TextWidthValueChanged(this, new EventArgs());\r
 \r
             if (PictureSettingsChanged != null)\r
                 PictureSettingsChanged(this, new EventArgs());\r
         }\r
-        private void drp_modulus_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        private void DrpModulusSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
-            _preventChangingWidth = true;\r
-            _preventChangingHeight = true;\r
+            preventChangingWidth = true;\r
+            preventChangingHeight = true;\r
 \r
             text_width.Value = (decimal)GetModulusValue((double)text_width.Value);\r
             text_height.Value = (decimal)GetModulusValue((double)text_height.Value);\r
 \r
-            _preventChangingWidth = false;\r
-            _preventChangingHeight = false;\r
+            preventChangingWidth = false;\r
+            preventChangingHeight = false;\r
 \r
             text_width.Increment = int.Parse(drp_modulus.SelectedItem.ToString());\r
             text_height.Increment = int.Parse(drp_modulus.SelectedItem.ToString());\r
@@ -373,21 +410,25 @@ namespace Handbrake.Controls
         }\r
 \r
         // Cropping Controls\r
-        private void check_autoCrop_CheckedChanged(object sender, EventArgs e)\r
+        private void CheckAutoCropCheckedChanged(object sender, EventArgs e)\r
         {\r
             crop_top.Enabled = check_customCrop.Checked;\r
             crop_bottom.Enabled = check_customCrop.Checked;\r
             crop_left.Enabled = check_customCrop.Checked;\r
             crop_right.Enabled = check_customCrop.Checked;\r
 \r
-            crop_top.Value = Source.AutoCropDimensions[0];\r
-            crop_bottom.Value = Source.AutoCropDimensions[1];\r
-            crop_left.Value = Source.AutoCropDimensions[2];\r
-            crop_right.Value = Source.AutoCropDimensions[3];\r
+            if (Source != null)\r
+            {\r
+                crop_top.Value = Source.AutoCropDimensions.Top;\r
+                crop_bottom.Value = Source.AutoCropDimensions.Bottom;\r
+                crop_left.Value = Source.AutoCropDimensions.Left;\r
+                crop_right.Value = Source.AutoCropDimensions.Right;\r
+            }\r
         }\r
-        private void crop_ValueChanged(object sender, EventArgs e)\r
+\r
+        private void CropValueChanged(object sender, EventArgs e)\r
         {\r
-            text_width_ValueChanged(this, new EventArgs());\r
+            TextWidthValueChanged(this, new EventArgs());\r
         }\r
 \r
         // GUI Functions\r
@@ -410,22 +451,24 @@ namespace Handbrake.Controls
             get\r
             {\r
                 if (Source != null) // display aspect = (width * par_width) / (height * par_height)\r
-                    return new Size((Source.ParVal.Width * Source.Resolution.Width), (Source.ParVal.Height * Source.Resolution.Height));\r
+                    return new Size((Source.ParVal.Width * Source.Resolution.Width),\r
+                                    (Source.ParVal.Height * Source.Resolution.Height));\r
 \r
                 return new Size(0, 0); // Fall over to 16:9 and hope for the best\r
             }\r
         }\r
+\r
         private Size CalculateAnamorphicSizes()\r
         {\r
             if (Source != null)\r
             {\r
                 /* Set up some variables to make the math easier to follow. */\r
-                int cropped_width = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;\r
-                int cropped_height = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
-                double storage_aspect = (double)cropped_width / cropped_height;\r
+                int croppedWidth = Source.Resolution.Width - (int)crop_left.Value - (int)crop_right.Value;\r
+                int croppedHeight = Source.Resolution.Height - (int)crop_top.Value - (int)crop_bottom.Value;\r
+                double storageAspect = (double)croppedWidth / croppedHeight;\r
 \r
                 /* Figure out what width the source would display at. */\r
-                double source_display_width = (double)cropped_width * Source.ParVal.Width / Source.ParVal.Height;\r
+                double sourceDisplayWidth = (double)croppedWidth * Source.ParVal.Width / Source.ParVal.Height;\r
 \r
                 /*\r
                      3 different ways of deciding output dimensions:\r
@@ -439,28 +482,28 @@ namespace Handbrake.Controls
                     default:\r
                     case 1:\r
                         /* Strict anamorphic */\r
-                        double displayWidth = ((double)cropped_width * Source.ParVal.Width / Source.ParVal.Height);\r
+                        double displayWidth = ((double)croppedWidth * Source.ParVal.Width / Source.ParVal.Height);\r
                         displayWidth = Math.Round(displayWidth, 0);\r
-                        Size output = new Size((int)displayWidth, cropped_height);\r
+                        Size output = new Size((int)displayWidth, croppedHeight);\r
                         return output;\r
                     case 2:\r
                         /* "Loose" anamorphic.\r
                             - Uses mod16-compliant dimensions,\r
                             - Allows users to set the width\r
                         */\r
-                        width = (int) text_width.Value;\r
+                        width = (int)text_width.Value;\r
                         width = GetModulusValue(width); /* Time to get picture width that divide cleanly.*/\r
 \r
-                        height = (width / storage_aspect) + 0.5;\r
+                        height = (width / storageAspect) + 0.5;\r
                         height = GetModulusValue(height); /* Time to get picture height that divide cleanly.*/\r
 \r
                         /* The film AR is the source's display width / cropped source height.\r
                            The output display width is the output height * film AR.\r
                            The output PAR is the output display width / output storage width. */\r
-                        double pixel_aspect_width = height * source_display_width / cropped_height;\r
-                        double pixel_aspect_height = width;\r
+                        double pixelAspectWidth = height * sourceDisplayWidth / croppedHeight;\r
+                        double pixelAspectHeight = width;\r
 \r
-                        double disWidthLoose = (width * pixel_aspect_width / pixel_aspect_height);\r
+                        double disWidthLoose = (width * pixelAspectWidth / pixelAspectHeight);\r
                         if (double.IsNaN(disWidthLoose))\r
                             disWidthLoose = 0;\r
                         return new Size((int)disWidthLoose, (int)height);\r
@@ -483,6 +526,7 @@ namespace Handbrake.Controls
             // Return a default value of 0,0 to indicate failure\r
             return new Size(0, 0);\r
         }\r
+\r
         private double GetModulusValue(double value)\r
         {\r
             int mod = int.Parse(drp_modulus.SelectedItem.ToString());\r
@@ -493,19 +537,12 @@ namespace Handbrake.Controls
 \r
             return remainder >= ((double)mod / 2) ? value + (mod - remainder) : value - remainder;\r
         }\r
+\r
         private static int GetCropMod2Clean(int value)\r
         {\r
             int remainder = value % 2;\r
             if (remainder == 0) return value;\r
             return (value + remainder);\r
         }\r
-\r
-        // Hidden UI feature to drop the MaxWidth / Height with the MaxWidth/Height label is double clicked\r
-        private void lbl_max_DoubleClick(object sender, EventArgs e)\r
-        {\r
-            PresetMaximumResolution = new Size(0,0);\r
-            if (PictureSettingsChanged != null)\r
-                PictureSettingsChanged(this, new EventArgs());\r
-        }\r
     }\r
 }
\ No newline at end of file
index 5f1eaa1..b38b6e4 100644 (file)
@@ -80,7 +80,7 @@
             this.btn_addTrack.Text = "Add";\r
             this.toolTip.SetToolTip(this.btn_addTrack, "Add a new subtitle track to the list below");\r
             this.btn_addTrack.UseVisualStyleBackColor = false;\r
-            this.btn_addTrack.Click += new System.EventHandler(this.btn_addSubTrack_Click);\r
+            this.btn_addTrack.Click += new System.EventHandler(this.BtnAddSubTrackClick);\r
             // \r
             // btn_RemoveSubTrack\r
             // \r
@@ -93,7 +93,7 @@
             this.btn_RemoveSubTrack.TabIndex = 69;\r
             this.btn_RemoveSubTrack.Text = "Remove";\r
             this.btn_RemoveSubTrack.UseVisualStyleBackColor = false;\r
-            this.btn_RemoveSubTrack.Click += new System.EventHandler(this.btn_RemoveSubTrack_Click);\r
+            this.btn_RemoveSubTrack.Click += new System.EventHandler(this.BtnRemoveSubTrackClick);\r
             // \r
             // lv_subList\r
             // \r
             this.lv_subList.TabIndex = 70;\r
             this.lv_subList.UseCompatibleStateImageBehavior = false;\r
             this.lv_subList.View = System.Windows.Forms.View.Details;\r
-            this.lv_subList.SelectedIndexChanged += new System.EventHandler(this.lb_subList_SelectedIndexChanged);\r
+            this.lv_subList.SelectedIndexChanged += new System.EventHandler(this.LbSubListSelectedIndexChanged);\r
             // \r
             // col_Source\r
             // \r
             this.toolStripSeparator2,\r
             this.mnu_remove});\r
             this.subMenu.Name = "audioMenu";\r
-            this.subMenu.Size = new System.Drawing.Size(142, 76);\r
+            this.subMenu.Size = new System.Drawing.Size(139, 76);\r
             // \r
             // mnu_moveup\r
             // \r
             this.mnu_moveup.Name = "mnu_moveup";\r
-            this.mnu_moveup.Size = new System.Drawing.Size(141, 22);\r
+            this.mnu_moveup.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_moveup.Text = "Move Up";\r
-            this.mnu_moveup.Click += new System.EventHandler(this.mnu_moveup_Click);\r
+            this.mnu_moveup.Click += new System.EventHandler(this.MnuMoveupClick);\r
             // \r
             // mnu_movedown\r
             // \r
             this.mnu_movedown.Name = "mnu_movedown";\r
-            this.mnu_movedown.Size = new System.Drawing.Size(141, 22);\r
+            this.mnu_movedown.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_movedown.Text = "Move Down";\r
             this.mnu_movedown.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.mnu_movedown.Click += new System.EventHandler(this.mnu_movedown_Click);\r
+            this.mnu_movedown.Click += new System.EventHandler(this.MnuMovedownClick);\r
             // \r
             // toolStripSeparator2\r
             // \r
             this.toolStripSeparator2.Name = "toolStripSeparator2";\r
-            this.toolStripSeparator2.Size = new System.Drawing.Size(138, 6);\r
+            this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6);\r
             // \r
             // mnu_remove\r
             // \r
             this.mnu_remove.Name = "mnu_remove";\r
-            this.mnu_remove.Size = new System.Drawing.Size(141, 22);\r
+            this.mnu_remove.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_remove.Text = "Remove";\r
-            this.mnu_remove.Click += new System.EventHandler(this.mnu_remove_Click);\r
+            this.mnu_remove.Click += new System.EventHandler(this.MnuRemoveClick);\r
             // \r
             // label68\r
             // \r
             this.drp_subtitleTracks.Name = "drp_subtitleTracks";\r
             this.drp_subtitleTracks.Size = new System.Drawing.Size(164, 21);\r
             this.drp_subtitleTracks.TabIndex = 74;\r
-            this.drp_subtitleTracks.SelectedIndexChanged += new System.EventHandler(this.drp_subtitleTracks_SelectedIndexChanged);\r
+            this.drp_subtitleTracks.SelectedIndexChanged += new System.EventHandler(this.DrpSubtitleTracksSelectedIndexChanged);\r
             // \r
             // label10\r
             // \r
             0,\r
             0,\r
             0});\r
+            this.srt_offset.Minimum = new decimal(new int[] {\r
+            1000000000,\r
+            0,\r
+            0,\r
+            -2147483648});\r
             this.srt_offset.Name = "srt_offset";\r
             this.srt_offset.Size = new System.Drawing.Size(58, 21);\r
             this.srt_offset.TabIndex = 79;\r
-            this.srt_offset.ValueChanged += new System.EventHandler(this.srt_offset_ValueChanged);\r
+            this.srt_offset.ValueChanged += new System.EventHandler(this.SrtOffsetValueChanged);\r
             // \r
             // srt_lang\r
             // \r
             this.srt_lang.Name = "srt_lang";\r
             this.srt_lang.Size = new System.Drawing.Size(103, 21);\r
             this.srt_lang.TabIndex = 50;\r
-            this.srt_lang.SelectedIndexChanged += new System.EventHandler(this.srt_lang_SelectedIndexChanged);\r
+            this.srt_lang.SelectedIndexChanged += new System.EventHandler(this.SrtLangSelectedIndexChanged);\r
             // \r
             // label8\r
             // \r
             this.srt_charcode.Name = "srt_charcode";\r
             this.srt_charcode.Size = new System.Drawing.Size(78, 21);\r
             this.srt_charcode.TabIndex = 73;\r
-            this.srt_charcode.SelectedIndexChanged += new System.EventHandler(this.srt_charcode_SelectedIndexChanged);\r
+            this.srt_charcode.SelectedIndexChanged += new System.EventHandler(this.SrtCharcodeSelectedIndexChanged);\r
             // \r
             // label4\r
             // \r
             this.check_forced.Size = new System.Drawing.Size(15, 14);\r
             this.check_forced.TabIndex = 75;\r
             this.check_forced.UseVisualStyleBackColor = true;\r
-            this.check_forced.CheckedChanged += new System.EventHandler(this.check_forced_CheckedChanged);\r
+            this.check_forced.CheckedChanged += new System.EventHandler(this.CheckForcedCheckedChanged);\r
             // \r
             // label7\r
             // \r
             this.check_default.Size = new System.Drawing.Size(15, 14);\r
             this.check_default.TabIndex = 77;\r
             this.check_default.UseVisualStyleBackColor = true;\r
-            this.check_default.CheckedChanged += new System.EventHandler(this.check_default_CheckedChanged);\r
+            this.check_default.CheckedChanged += new System.EventHandler(this.CheckDefaultCheckedChanged);\r
             // \r
             // check_burned\r
             // \r
             this.check_burned.Size = new System.Drawing.Size(15, 14);\r
             this.check_burned.TabIndex = 76;\r
             this.check_burned.UseVisualStyleBackColor = true;\r
-            this.check_burned.CheckedChanged += new System.EventHandler(this.check_burned_CheckedChanged);\r
+            this.check_burned.CheckedChanged += new System.EventHandler(this.CheckBurnedCheckedChanged);\r
             // \r
             // btn_srtAdd\r
             // \r
             this.btn_srtAdd.Text = "Import SRT";\r
             this.toolTip.SetToolTip(this.btn_srtAdd, "Add a new SRT file to the \"track\" dropdown menu.");\r
             this.btn_srtAdd.UseVisualStyleBackColor = false;\r
-            this.btn_srtAdd.Click += new System.EventHandler(this.btn_srtAdd_Click);\r
+            this.btn_srtAdd.Click += new System.EventHandler(this.BtnSrtAddClick);\r
             // \r
             // openFileDialog\r
             // \r
index 80c7edb..29c1272 100644 (file)
-using System;\r
-using System.Collections.Generic;\r
-using System.IO;\r
-using System.Windows.Forms;\r
-using Handbrake.Functions;\r
+/*  Subtitles.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// The Subtitles Tab\r
+    /// </summary>\r
     public partial class Subtitles : UserControl\r
     {\r
-        readonly IDictionary<string, string> LangMap = new Dictionary<string, string>();\r
-        List<SubtitleInfo> SubList = new List<SubtitleInfo>();\r
-        private int _fileContainer;\r
+        #region Priavate Variables and Collections\r
+\r
+        /// <summary>\r
+        /// Map of languages to language codes\r
+        /// </summary>\r
+        private readonly IDictionary<string, string> langMap = new Dictionary<string, string>();\r
+\r
+        /// <summary>\r
+        /// A List of SRT Files\r
+        /// </summary>\r
+        private readonly IDictionary<string, string> srtFiles = new Dictionary<string, string>();\r
 \r
+        /// <summary>\r
+        /// The Subtitle List\r
+        /// </summary>\r
+        private readonly List<SubtitleInfo> subList = new List<SubtitleInfo>();\r
+\r
+        #endregion\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Subtitles"/> class.\r
+        /// </summary>\r
         public Subtitles()\r
         {\r
             InitializeComponent();\r
 \r
-            LangMap = Main.mapLanguages();\r
-            foreach (string key in LangMap.Keys)\r
+            langMap = Main.MapLanguages();\r
+            foreach (string key in langMap.Keys)\r
                 srt_lang.Items.Add(key);\r
 \r
             srt_charcode.SelectedIndex = 28;\r
             srt_lang.SelectedIndex = 40;\r
         }\r
 \r
-        // Primary Controls\r
-        private void btn_addSubTrack_Click(object sender, EventArgs e)\r
+        #region Public Methods\r
+        /// <summary>\r
+        /// Gets the CLI Query for this panel\r
+        /// </summary>\r
+        /// <returns>A CliQuery string</returns>\r
+        public string GetCliQuery\r
+        {\r
+            get\r
+            {\r
+                string query = string.Empty;\r
+                if (lv_subList.Items.Count != 0) // If we have subtitle tracks\r
+                {\r
+                    // BitMap and CC's\r
+                    string subtitleTracks = String.Empty;\r
+                    string subtitleForced = String.Empty;\r
+                    string subtitleBurn = String.Empty;\r
+                    string subtitleDefault = String.Empty;\r
+\r
+                    // SRT\r
+                    string srtFile = String.Empty;\r
+                    string srtCodeset = String.Empty;\r
+                    string srtOffset = String.Empty;\r
+                    string srtLang = String.Empty;\r
+                    string srtDefault = String.Empty;\r
+                    int srtCount = 0;\r
+                    int subCount = 0;\r
+\r
+                    foreach (SubtitleInfo item in subList)\r
+                    {\r
+                        string itemToAdd;\r
+\r
+                        if (item.IsSrtSubtitle) // We have an SRT file\r
+                        {\r
+                            srtCount++; // SRT track id.\r
+\r
+                            srtLang += srtLang == string.Empty ? langMap[item.SrtLang] : "," + langMap[item.SrtLang];\r
+                            srtCodeset += srtCodeset == string.Empty ? item.SrtCharCode : "," + item.SrtCharCode;\r
+\r
+                            if (item.Default)\r
+                                srtDefault = srtCount.ToString();\r
+\r
+                            itemToAdd = item.SrtPath;\r
+                            srtFile += srtFile == string.Empty ? itemToAdd : "," + itemToAdd;\r
+\r
+                            itemToAdd = item.SrtOffset.ToString();\r
+                            srtOffset += srtOffset == string.Empty ? itemToAdd : "," + itemToAdd;\r
+                        }\r
+                        else // We have Bitmap or CC\r
+                        {\r
+                            subCount++;\r
+\r
+                            // Find --subtitle <string>\r
+                            if (item.Track.Contains("Foreign Audio Search"))\r
+                                itemToAdd = "scan";\r
+                            else\r
+                            {\r
+                                string[] tempSub = item.Track.Split(' ');\r
+                                itemToAdd = tempSub[0];\r
+                            }\r
+\r
+                            subtitleTracks += subtitleTracks == string.Empty ? itemToAdd : "," + itemToAdd;\r
+\r
+                            // Find --subtitle-forced\r
+                            if (item.Forced)\r
+                                subtitleForced += subtitleForced == string.Empty ? subCount.ToString() : "," + subCount;\r
+\r
+                            // Find --subtitle-burn\r
+                            if (item.Burned)\r
+                                subtitleBurn = subCount.ToString();\r
+\r
+                            // Find --subtitle-default\r
+                            if (item.Default)\r
+                                subtitleDefault = subCount.ToString();\r
+                        }\r
+                    }\r
+\r
+                    // Build The CLI Subtitles Query\r
+                    if (subtitleTracks != string.Empty)\r
+                    {\r
+                        query += " --subtitle " + subtitleTracks;\r
+\r
+                        if (subtitleForced != string.Empty)\r
+                            query += " --subtitle-forced=" + subtitleForced;\r
+                        if (subtitleBurn != string.Empty)\r
+                            query += " --subtitle-burn=" + subtitleBurn;\r
+                        if (subtitleDefault != string.Empty)\r
+                            query += " --subtitle-default=" + subtitleDefault;\r
+                    }\r
+\r
+                    if (srtFile != string.Empty) // SRTs\r
+                    {\r
+                        query += " --srt-file " + "\"" + srtFile + "\"";\r
+\r
+                        if (srtCodeset != string.Empty)\r
+                            query += " --srt-codeset " + srtCodeset;\r
+                        if (srtOffset != string.Empty)\r
+                            query += " --srt-offset " + srtOffset;\r
+                        if (srtLang != string.Empty)\r
+                            query += " --srt-lang " + srtLang;\r
+                        if (srtDefault != string.Empty)\r
+                            query += " --srt-default=" + srtDefault;\r
+                    }\r
+                }\r
+                return query;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Checks of the current settings will require the m4v file extension\r
+        /// </summary>\r
+        /// <returns>True if Yes</returns>\r
+        public bool RequiresM4V()\r
+        {\r
+            return this.subList.Any(track => track.SubtitleType != SubtitleType.VobSub);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Automatically setup the subtitle tracks.\r
+        /// This handles the automatic setup of subitles which the user can control from the program options\r
+        /// </summary>\r
+        /// <param name="subs">List of Subtitles</param>\r
+        public void SetSubtitleTrackAuto(object[] subs)\r
+        {\r
+            drp_subtitleTracks.Items.Clear();\r
+            drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");\r
+            drp_subtitleTracks.Items.AddRange(subs);\r
+            drp_subtitleTracks.SelectedIndex = 0;\r
+            Clear();\r
+\r
+            this.AutomaticSubtitleSelection();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Automatic Subtitle Selection based on user preferences.\r
+        /// </summary>\r
+        public void AutomaticSubtitleSelection()\r
+        {\r
+            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
+            if (Properties.Settings.Default.NativeLanguage != "Any")\r
+            {\r
+                if (Properties.Settings.Default.DubMode != 1) // We need to add a subtitle track if this is false.\r
+                {\r
+                    foreach (object item in drp_subtitleTracks.Items)\r
+                    {\r
+                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
+                        {\r
+                            drp_subtitleTracks.SelectedItem = item;\r
+                            BtnAddSubTrackClick(this, new EventArgs());\r
+                        }\r
+                    }\r
+\r
+                    if (drp_subtitleTracks.SelectedIndex == 0 && Properties.Settings.Default.useClosedCaption)\r
+                    {\r
+                        foreach (object item in drp_subtitleTracks.Items)\r
+                        {\r
+                            if (item.ToString().Contains("Closed"))\r
+                            {\r
+                                drp_subtitleTracks.SelectedItem = item;\r
+                                BtnAddSubTrackClick(this, new EventArgs());\r
+                            }\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Clear the Subtitle List\r
+        /// </summary>\r
+        public void Clear()\r
+        {\r
+            lv_subList.Items.Clear();\r
+            subList.Clear();\r
+        }\r
+        #endregion\r
+\r
+        #region Primary Controls\r
+\r
+        /// <summary>\r
+        /// Add a Subtitle track.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnAddSubTrackClick(object sender, EventArgs e)\r
         {\r
             // Logic\r
             string forcedVal = check_forced.CheckState == CheckState.Checked ? "Yes" : "No";\r
             string defaultSub = check_default.CheckState == CheckState.Checked ? "Yes" : "No";\r
-            string burnedVal = check_burned.CheckState == CheckState.Checked && (!drp_subtitleTracks.Text.Contains("Text")) ? "Yes" : "No";\r
+            string burnedVal = check_burned.CheckState == CheckState.Checked &&\r
+                               (drp_subtitleTracks.Text.Contains("(VOBSUB)") || drp_subtitleTracks.Text.Contains("(SSA)"))\r
+                                   ? "Yes"\r
+                                   : "No";\r
             string srtCode = "-", srtLangVal = "-", srtPath = "-", srtFile = "-";\r
             int srtOffsetMs = 0;\r
 \r
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
-                burnedVal = "No";\r
-                forcedVal = "No";\r
-                srtPath = openFileDialog.FileName;\r
-                srtFile = Path.GetFileName(openFileDialog.FileName);\r
+                srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
+                srtFile = drp_subtitleTracks.SelectedItem.ToString();\r
                 srtLangVal = srt_lang.SelectedItem.ToString();\r
                 srtCode = srt_charcode.SelectedItem.ToString();\r
                 srtOffsetMs = (int)srt_offset.Value;\r
-                if (defaultSub == "Yes") setNoSrtDefault();\r
-            } else\r
-            {\r
-                if (defaultSub == "Yes") SetNoDefault();\r
-                if (burnedVal == "Yes") SetNoBurned();\r
-\r
-                if (_fileContainer == 0)\r
-                    burnedVal = "Yes";  // MP4 must have bitmap subs burned in.\r
+                if (defaultSub == "Yes") this.SetDefaultToOffForAllSRTTracks();\r
             }\r
-\r
-            if (_fileContainer == 0) // MP4 and M4V file extension\r
+            else\r
             {\r
-                // Make sure we only have 1 bitmap track.\r
-                if (drp_subtitleTracks.SelectedItem != null && drp_subtitleTracks.SelectedItem.ToString().Contains("Bitmap"))\r
-                {\r
-                    foreach (ListViewItem item in lv_subList.Items)\r
-                    {\r
-                        if (item.SubItems[0].Text.Contains("Bitmap"))\r
-                        {\r
-                            MessageBox.Show(this, "More than one vobsub is not supported in mp4... Your first vobsub track will now be used.",\r
-                                            "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-                            return;\r
-                        }\r
-                    }\r
-                }\r
+                if (defaultSub == "Yes") this.SetDefaultToOffForAllTracks();\r
+                if (burnedVal == "Yes") this.SetBurnedToOffForAllTracks();\r
             }\r
 \r
             string trackName = (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
-                               ? srtLangVal + " (" + srtFile + ")"\r
-                               : drp_subtitleTracks.SelectedItem.ToString();\r
-\r
+                                   ? srtLangVal + " (" + srtFile + ")"\r
+                                   : drp_subtitleTracks.SelectedItem.ToString();\r
 \r
             SubtitleInfo track = new SubtitleInfo\r
                                      {\r
                                          Track = trackName,\r
-                                         Forced = forcedVal,\r
-                                         Burned = burnedVal,\r
-                                         Default = defaultSub,\r
+                                         Forced = check_forced.Checked,\r
+                                         Burned = check_burned.Checked,\r
+                                         Default = check_default.Checked,\r
                                          SrtLang = srtLangVal,\r
                                          SrtCharCode = srtCode,\r
                                          SrtOffset = srtOffsetMs,\r
@@ -89,31 +287,71 @@ namespace Handbrake.Controls
                                      };\r
 \r
             lv_subList.Items.Add(track.ListView);\r
-            SubList.Add(track);\r
-\r
+            subList.Add(track);\r
         }\r
-        private void btn_srtAdd_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Import an SRT Subtitle Track\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnSrtAddClick(object sender, EventArgs e)\r
         {\r
             if (openFileDialog.ShowDialog() != DialogResult.OK)\r
                 return;\r
+\r
+            if (srtFiles.ContainsKey(Path.GetFileName(openFileDialog.FileName)))\r
+            {\r
+                MessageBox.Show(\r
+                    "A Subtitle track with the same name has already been imported.",\r
+                    "Warning",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Warning);\r
+                return;\r
+            }\r
+\r
             drp_subtitleTracks.Items.Add(Path.GetFileName(openFileDialog.FileName));\r
             drp_subtitleTracks.SelectedItem = Path.GetFileName(openFileDialog.FileName);\r
+            srtFiles.Add(Path.GetFileName(openFileDialog.FileName), openFileDialog.FileName);\r
         }\r
-        private void btn_RemoveSubTrack_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Remove a subtitle track\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnRemoveSubTrackClick(object sender, EventArgs e)\r
         {\r
-            RemoveTrack();\r
+            this.RemoveSelectedTrack();\r
         }\r
 \r
-        // Secondary Controls\r
-        private void lb_subList_SelectedIndexChanged(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// The Subtitle List selected index has changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void LbSubListSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             // Set the dropdown controls based on the selected item in the List.\r
             if (lv_subList.Items.Count != 0 && lv_subList.SelectedIndices.Count != 0)\r
             {\r
-                SubtitleInfo track = SubList[lv_subList.SelectedIndices[0]];\r
+                SubtitleInfo track = subList[lv_subList.SelectedIndices[0]];\r
 \r
                 int c = 0;\r
-                if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))  // We have an SRT\r
+                if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.ToLower().Contains(".srt"))\r
+                // We have an SRT\r
                 {\r
                     foreach (var item in drp_subtitleTracks.Items)\r
                     {\r
@@ -124,10 +362,10 @@ namespace Handbrake.Controls
                     srt_lang.SelectedItem = track.SrtLang;\r
                     srt_offset.Value = track.SrtOffset;\r
                     srt_charcode.SelectedItem = track.SrtCharCode;\r
-                    check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;\r
                     SubGroupBox.Text = "Selected Track: " + track.Track;\r
                 }\r
-                else  // We have Bitmap/CC\r
+                else // We have Bitmap/CC\r
                 {\r
                     foreach (var item in drp_subtitleTracks.Items)\r
                     {\r
@@ -135,18 +373,31 @@ namespace Handbrake.Controls
                             drp_subtitleTracks.SelectedIndex = c;\r
                         c++;\r
                     }\r
-                    check_forced.CheckState = track.Forced == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    check_burned.CheckState = track.Burned == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    check_default.CheckState = track.Default == "Yes" ? CheckState.Checked : CheckState.Unchecked;\r
-                    SubGroupBox.Text = "Selected Track: " + lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
+                    check_forced.CheckState = track.Forced ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_burned.CheckState = track.Burned ? CheckState.Checked : CheckState.Unchecked;\r
+                    check_default.CheckState = track.Default ? CheckState.Checked : CheckState.Unchecked;\r
+                    SubGroupBox.Text = "Selected Track: " +\r
+                                       lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text;\r
                 }\r
             }\r
             else\r
                 SubGroupBox.Text = "Selected Track: None (Click \"Add\" to add another track to the list)";\r
         }\r
 \r
-        // Bitmap / CC / SRT Controls\r
-        private void drp_subtitleTracks_SelectedIndexChanged(object sender, EventArgs e)\r
+        #endregion\r
+\r
+        #region Subtitle Controls\r
+\r
+        /// <summary>\r
+        /// Handle the Subtitle track dropdown changed event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void DrpSubtitleTracksSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
@@ -170,54 +421,102 @@ namespace Handbrake.Controls
             if (drp_subtitleTracks.SelectedItem.ToString().Contains(".srt"))\r
             {\r
                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text = srt_lang.SelectedItem + "(" +\r
-                    drp_subtitleTracks.SelectedItem + ")";\r
+                                                                                   drp_subtitleTracks.SelectedItem + ")";\r
                 lv_subList.Select();\r
-            } else\r
+\r
+                string srtPath;\r
+                srtFiles.TryGetValue(drp_subtitleTracks.SelectedItem.ToString(), out srtPath);\r
+                subList[lv_subList.SelectedIndices[0]].SrtPath = srtPath;\r
+            }\r
+            else\r
             {\r
                 lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text =\r
                     drp_subtitleTracks.SelectedItem.ToString();\r
                 lv_subList.Select();\r
             }\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].Track = drp_subtitleTracks.SelectedItem.ToString();\r
         }\r
-        private void check_forced_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Foreced Subtitles checkbox changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckForcedCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[1].Text = check_forced.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
+            subList[lv_subList.SelectedIndices[0]].Forced = check_forced.Checked;\r
+            // Update SubList List<SubtitleInfo> \r
         }\r
-        private void check_burned_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Burned in subtitles checkbox changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckBurnedCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             if (check_burned.Checked) // Make sure we only have 1 burned track\r
-                SetNoBurned();\r
+                this.SetBurnedToOffForAllTracks();\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[2].Text = check_burned.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo> \r
+            subList[lv_subList.SelectedIndices[0]].Burned = check_burned.Checked;\r
+            // Update SubList List<SubtitleInfo> \r
         }\r
-        private void check_default_CheckedChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Default Subitle track check changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void CheckDefaultCheckedChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             if (check_default.Checked) // Make sure we only have 1 default track\r
                 if (lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[0].Text.Contains(".srt"))\r
-                    setNoSrtDefault();\r
+                    this.SetDefaultToOffForAllSRTTracks();\r
                 else\r
-                    SetNoDefault();\r
+                    this.SetDefaultToOffForAllTracks();\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[3].Text = check_default.Checked ? "Yes" : "No";\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].Default = check_default.Checked ? "Yes" : "No"; // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].Default = check_default.Checked;\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_offset_ValueChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Srt Offset Numeric Control Changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtOffsetValueChanged(object sender, EventArgs e)\r
         {\r
             // Update an item in the  list if required.\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0)\r
@@ -226,29 +525,64 @@ namespace Handbrake.Controls
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[6].Text = srt_offset.Value.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value; // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtOffset = (int)srt_offset.Value;\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_charcode_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// The SRT Charcode changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtCharcodeSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[5].Text = srt_charcode.SelectedItem.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtCharCode = srt_charcode.SelectedItem.ToString();\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
-        private void srt_lang_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// The Srt Language code changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SrtLangSelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             if (lv_subList.Items.Count == 0 || lv_subList.SelectedIndices.Count == 0) return;\r
 \r
             lv_subList.Items[lv_subList.SelectedIndices[0]].SubItems[4].Text = srt_lang.SelectedItem.ToString();\r
             lv_subList.Select();\r
 \r
-            SubList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString(); // Update SubList List<SubtitleInfo>\r
+            subList[lv_subList.SelectedIndices[0]].SrtLang = srt_lang.SelectedItem.ToString();\r
+            // Update SubList List<SubtitleInfo>\r
         }\r
 \r
-        // Right Click Menu\r
-        private void mnu_moveup_Click(object sender, EventArgs e)\r
+        #endregion\r
+\r
+        #region Right Click Menu\r
+\r
+        /// <summary>\r
+        /// Move an item in the subtitle list up\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuMoveupClick(object sender, EventArgs e)\r
         {\r
             if (lv_subList.SelectedIndices.Count != 0)\r
             {\r
@@ -265,7 +599,17 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-        private void mnu_movedown_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Move an item in the subtitle list down\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuMovedownClick(object sender, EventArgs e)\r
         {\r
             if (lv_subList.SelectedIndices.Count != 0)\r
             {\r
@@ -282,46 +626,68 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-        private void mnu_remove_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Remove a selected subtitle track.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuRemoveClick(object sender, EventArgs e)\r
         {\r
-            RemoveTrack();\r
+            this.RemoveSelectedTrack();\r
         }\r
 \r
-        // Functions\r
-        private void SetNoDefault()\r
+        #endregion\r
+\r
+        #region Helpers\r
+        /// <summary>\r
+        /// Set all Non SRT tracks to Default = NO\r
+        /// </summary>\r
+        private void SetDefaultToOffForAllTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
             {\r
-                if (SubList[c].SrtPath == "-")\r
+                if (subList[c].SrtPath == "-")\r
                 {\r
                     if (item.SubItems[3].Text == "Yes")\r
                     {\r
                         item.SubItems[3].Text = "No";\r
-                        SubList[c].Default = "No";\r
-                    }     \r
+                        subList[c].Default = false;\r
+                    }\r
                 }\r
                 c++;\r
             }\r
         }\r
 \r
-        private void setNoSrtDefault()\r
+        /// <summary>\r
+        /// Set all subtitle tracks so that they have no default.\r
+        /// </summary>\r
+        private void SetDefaultToOffForAllSRTTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
             {\r
-                if (SubList[c].SrtPath != "-")\r
+                if (!subList[c].IsSrtSubtitle)\r
                 {\r
                     if (item.SubItems[3].Text == "Yes")\r
                     {\r
                         item.SubItems[3].Text = "No";\r
-                        SubList[c].Default = "No";\r
+                        subList[c].Default = false;\r
                     }\r
                 }\r
                 c++;\r
             }\r
         }\r
-        private void SetNoBurned()\r
+\r
+        /// <summary>\r
+        /// Set all tracks to Burned = No\r
+        /// </summary>\r
+        private void SetBurnedToOffForAllTracks()\r
         {\r
             int c = 0;\r
             foreach (ListViewItem item in lv_subList.Items)\r
@@ -329,12 +695,16 @@ namespace Handbrake.Controls
                 if (item.SubItems[2].Text == "Yes")\r
                 {\r
                     item.SubItems[2].Text = "No";\r
-                    SubList[c].Burned = "No";\r
+                    subList[c].Burned = false;\r
                 }\r
                 c++;\r
             }\r
         }\r
-        private void RemoveTrack()\r
+\r
+        /// <summary>\r
+        /// Remove a selected track\r
+        /// </summary>\r
+        private void RemoveSelectedTrack()\r
         {\r
             // Remove the Item and reselect the control if the following conditions are met.\r
             if (lv_subList.SelectedItems.Count != 0)\r
@@ -344,7 +714,7 @@ namespace Handbrake.Controls
                 int selectedInd = lv_subList.SelectedIndices[0];\r
 \r
                 lv_subList.Items.RemoveAt(selectedInd);\r
-                SubList.RemoveAt(selectedInd);\r
+                subList.RemoveAt(selectedInd);\r
 \r
                 // Now reslect the correct item and give focus to the list.\r
                 if (lv_subList.Items.Count != 0)\r
@@ -358,97 +728,6 @@ namespace Handbrake.Controls
                 }\r
             }\r
         }\r
-\r
-        // Public Functions\r
-        public void Clear()\r
-        {\r
-            lv_subList.Items.Clear();\r
-            SubList.Clear();\r
-        }\r
-        public void SmartClear()\r
-        {\r
-            /* Smart clear will only remove subtitle tracks that do not have an equivlent \r
-              for the new source / title which the user has selected. */\r
-            throw new NotImplementedException();\r
-        }\r
-        public Boolean RequiresM4V()\r
-        {\r
-            foreach (ListViewItem item in lv_subList.Items)\r
-            {\r
-                if (item.SubItems.Count != 5)\r
-                    return true;\r
-\r
-                if (item.SubItems[1].Text.Contains("(Text)"))\r
-                    return true;\r
-            }\r
-            return false;\r
-        }\r
-        public void SetSubtitleTrackAuto()\r
-        {\r
-            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
-            if (Properties.Settings.Default.NativeLanguage != "Any")\r
-            {\r
-                if (!Properties.Settings.Default.DubAudio) // We need to add a subtitle track if this is false.\r
-                {\r
-                    int i = 0;\r
-                    foreach (object item in drp_subtitleTracks.Items)\r
-                    {\r
-                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
-                            drp_subtitleTracks.SelectedIndex = i;\r
-\r
-                        i++;\r
-                    }\r
-\r
-                    btn_addSubTrack_Click(this, new EventArgs());\r
-                }\r
-            }\r
-        }\r
-        public void SetContainer(int value)\r
-        {\r
-            _fileContainer = value;\r
-            Boolean trigger = false;\r
-            if (_fileContainer != 1)\r
-                foreach (ListViewItem item in lv_subList.Items)\r
-                {\r
-                    if (item.SubItems[1].Text.Contains("Bitmap"))\r
-                    {\r
-                        if (trigger)\r
-                            lv_subList.Items.Remove(item);\r
-                        trigger = true;\r
-                    }\r
-                }\r
-        }\r
-        public List<SubtitleInfo> GetSubtitleInfoList()\r
-        {\r
-            return SubList;\r
-        }\r
-    }\r
-\r
-    public class SubtitleInfo\r
-    {\r
-        public string Track { get; set; }\r
-        public string Forced { get; set; }\r
-        public string Burned { get; set; }\r
-        public string Default { get; set; }\r
-        public string SrtLang { get; set; }\r
-        public string SrtCharCode { get; set; }\r
-        public int SrtOffset { get; set; }\r
-        public string SrtPath { get; set; }\r
-        public string SrtFileName { get; set; }\r
-\r
-        public ListViewItem ListView\r
-        {\r
-            get\r
-            {\r
-                ListViewItem listTrack = new ListViewItem(Track);\r
-                listTrack.SubItems.Add(Forced);\r
-                listTrack.SubItems.Add(Burned);\r
-                listTrack.SubItems.Add(Default);\r
-                listTrack.SubItems.Add(SrtLang);\r
-                listTrack.SubItems.Add(SrtCharCode);\r
-                listTrack.SubItems.Add(SrtOffset.ToString());\r
-                return listTrack;\r
-            }\r
-        }\r
+        #endregion\r
     }\r
 }
\ No newline at end of file
index 2e6f00c..9be4767 100644 (file)
   <metadata name="subMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>17, 17</value>\r
   </metadata>\r
-  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>237, 17</value>\r
-  </metadata>\r
   <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>113, 17</value>\r
   </metadata>\r
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>237, 17</value>\r
+  </metadata>\r
 </root>
\ No newline at end of file
index 206a0b6..e445c17 100644 (file)
@@ -47,15 +47,11 @@ namespace Handbrake.Controls
             this.rtf_x264Query = new System.Windows.Forms.RichTextBox();\r
             this.check_Cabac = new System.Windows.Forms.CheckBox();\r
             this.check_noDCTDecimate = new System.Windows.Forms.CheckBox();\r
-            this.check_noFastPSkip = new System.Windows.Forms.CheckBox();\r
             this.lbl_trellis = new System.Windows.Forms.Label();\r
             this.drop_trellis = new System.Windows.Forms.ComboBox();\r
             this.drop_deblockBeta = new System.Windows.Forms.ComboBox();\r
             this.label41 = new System.Windows.Forms.Label();\r
             this.drop_deblockAlpha = new System.Windows.Forms.ComboBox();\r
-            this.panel3 = new System.Windows.Forms.Panel();\r
-            this.panel1 = new System.Windows.Forms.Panel();\r
-            this.panel2 = new System.Windows.Forms.Panel();\r
             this.check_8x8DCT = new System.Windows.Forms.CheckBox();\r
             this.label45 = new System.Windows.Forms.Label();\r
             this.drop_analysis = new System.Windows.Forms.ComboBox();\r
@@ -65,23 +61,30 @@ namespace Handbrake.Controls
             this.drop_MotionEstimationRange = new System.Windows.Forms.ComboBox();\r
             this.label54 = new System.Windows.Forms.Label();\r
             this.drop_MotionEstimationMethod = new System.Windows.Forms.ComboBox();\r
-            this.check_pyrmidalBFrames = new System.Windows.Forms.CheckBox();\r
-            this.check_weightedBFrames = new System.Windows.Forms.CheckBox();\r
             this.lbl_direct_prediction = new System.Windows.Forms.Label();\r
             this.drop_directPrediction = new System.Windows.Forms.ComboBox();\r
             this.label62 = new System.Windows.Forms.Label();\r
             this.drop_bFrames = new System.Windows.Forms.ComboBox();\r
             this.label64 = new System.Windows.Forms.Label();\r
             this.drop_refFrames = new System.Windows.Forms.ComboBox();\r
-            this.check_mixedReferences = new System.Windows.Forms.CheckBox();\r
             this.ToolTip = new System.Windows.Forms.ToolTip(this.components);\r
+            this.check_weightp = new System.Windows.Forms.CheckBox();\r
+            this.slider_adaptiveQuantStrength = new System.Windows.Forms.TrackBar();\r
+            this.combo_pyrmidalBFrames = new System.Windows.Forms.ComboBox();\r
+            this.lbl_adaptiveQuantStrength = new System.Windows.Forms.Label();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.lbl_prymidalBframes = new System.Windows.Forms.Label();\r
+            this.label3 = new System.Windows.Forms.Label();\r
             ((System.ComponentModel.ISupportInitialize)(this.slider_psytrellis)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.slider_psyrd)).BeginInit();\r
+            ((System.ComponentModel.ISupportInitialize)(this.slider_adaptiveQuantStrength)).BeginInit();\r
             this.SuspendLayout();\r
             // \r
             // slider_psytrellis\r
             // \r
-            this.slider_psytrellis.Location = new System.Drawing.Point(436, 194);\r
+            this.slider_psytrellis.BackColor = System.Drawing.SystemColors.Window;\r
+            this.slider_psytrellis.Location = new System.Drawing.Point(427, 231);\r
+            this.slider_psytrellis.Maximum = 20;\r
             this.slider_psytrellis.Name = "slider_psytrellis";\r
             this.slider_psytrellis.Size = new System.Drawing.Size(131, 45);\r
             this.slider_psytrellis.TabIndex = 86;\r
@@ -93,7 +96,7 @@ namespace Handbrake.Controls
             // lbl_psytrellis\r
             // \r
             this.lbl_psytrellis.AutoSize = true;\r
-            this.lbl_psytrellis.Location = new System.Drawing.Point(328, 198);\r
+            this.lbl_psytrellis.Location = new System.Drawing.Point(309, 231);\r
             this.lbl_psytrellis.Name = "lbl_psytrellis";\r
             this.lbl_psytrellis.Size = new System.Drawing.Size(102, 13);\r
             this.lbl_psytrellis.TabIndex = 85;\r
@@ -102,7 +105,7 @@ namespace Handbrake.Controls
             // lbl_psyrd\r
             // \r
             this.lbl_psyrd.AutoSize = true;\r
-            this.lbl_psyrd.Location = new System.Drawing.Point(283, 164);\r
+            this.lbl_psyrd.Location = new System.Drawing.Point(264, 199);\r
             this.lbl_psyrd.Name = "lbl_psyrd";\r
             this.lbl_psyrd.Size = new System.Drawing.Size(147, 13);\r
             this.lbl_psyrd.TabIndex = 84;\r
@@ -110,17 +113,20 @@ namespace Handbrake.Controls
             // \r
             // slider_psyrd\r
             // \r
-            this.slider_psyrd.Location = new System.Drawing.Point(436, 153);\r
+            this.slider_psyrd.BackColor = System.Drawing.SystemColors.Window;\r
+            this.slider_psyrd.Location = new System.Drawing.Point(425, 199);\r
+            this.slider_psyrd.Maximum = 20;\r
             this.slider_psyrd.Name = "slider_psyrd";\r
             this.slider_psyrd.Size = new System.Drawing.Size(131, 45);\r
             this.slider_psyrd.TabIndex = 83;\r
             this.ToolTip.SetToolTip(this.slider_psyrd, resources.GetString("slider_psyrd.ToolTip"));\r
+            this.slider_psyrd.Value = 10;\r
             this.slider_psyrd.Scroll += new System.EventHandler(this.widgetControlChanged);\r
             // \r
             // lbl_adaptBFrames\r
             // \r
             this.lbl_adaptBFrames.AutoSize = true;\r
-            this.lbl_adaptBFrames.Location = new System.Drawing.Point(21, 124);\r
+            this.lbl_adaptBFrames.Location = new System.Drawing.Point(309, 28);\r
             this.lbl_adaptBFrames.Name = "lbl_adaptBFrames";\r
             this.lbl_adaptBFrames.Size = new System.Drawing.Size(102, 13);\r
             this.lbl_adaptBFrames.TabIndex = 81;\r
@@ -135,9 +141,9 @@ namespace Handbrake.Controls
             "Off",\r
             "Fast",\r
             "Optimal"});\r
-            this.drop_adaptBFrames.Location = new System.Drawing.Point(129, 121);\r
+            this.drop_adaptBFrames.Location = new System.Drawing.Point(417, 24);\r
             this.drop_adaptBFrames.Name = "drop_adaptBFrames";\r
-            this.drop_adaptBFrames.Size = new System.Drawing.Size(121, 21);\r
+            this.drop_adaptBFrames.Size = new System.Drawing.Size(106, 21);\r
             this.drop_adaptBFrames.TabIndex = 82;\r
             this.ToolTip.SetToolTip(this.drop_adaptBFrames, resources.GetString("drop_adaptBFrames.ToolTip"));\r
             this.drop_adaptBFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
@@ -149,15 +155,15 @@ namespace Handbrake.Controls
             this.label43.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.label43.Location = new System.Drawing.Point(13, 13);\r
             this.label43.Name = "label43";\r
-            this.label43.Size = new System.Drawing.Size(144, 13);\r
+            this.label43.Size = new System.Drawing.Size(60, 13);\r
             this.label43.TabIndex = 49;\r
-            this.label43.Text = "Advanced H.264 Options";\r
+            this.label43.Text = "Encoding:";\r
             // \r
             // btn_reset\r
             // \r
             this.btn_reset.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_reset.ForeColor = System.Drawing.Color.DarkOrange;\r
-            this.btn_reset.Location = new System.Drawing.Point(13, 229);\r
+            this.btn_reset.Location = new System.Drawing.Point(634, 230);\r
             this.btn_reset.Name = "btn_reset";\r
             this.btn_reset.Size = new System.Drawing.Size(75, 23);\r
             this.btn_reset.TabIndex = 79;\r
@@ -168,7 +174,7 @@ namespace Handbrake.Controls
             // rtf_x264Query\r
             // \r
             this.rtf_x264Query.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
-            this.rtf_x264Query.Location = new System.Drawing.Point(13, 258);\r
+            this.rtf_x264Query.Location = new System.Drawing.Point(16, 259);\r
             this.rtf_x264Query.Name = "rtf_x264Query";\r
             this.rtf_x264Query.Size = new System.Drawing.Size(698, 43);\r
             this.rtf_x264Query.TabIndex = 80;\r
@@ -181,7 +187,7 @@ namespace Handbrake.Controls
             this.check_Cabac.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
             this.check_Cabac.Checked = true;\r
             this.check_Cabac.CheckState = System.Windows.Forms.CheckState.Checked;\r
-            this.check_Cabac.Location = new System.Drawing.Point(277, 129);\r
+            this.check_Cabac.Location = new System.Drawing.Point(3, 89);\r
             this.check_Cabac.Name = "check_Cabac";\r
             this.check_Cabac.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
             this.check_Cabac.Size = new System.Drawing.Size(141, 17);\r
@@ -196,7 +202,7 @@ namespace Handbrake.Controls
             // \r
             this.check_noDCTDecimate.AutoSize = true;\r
             this.check_noDCTDecimate.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_noDCTDecimate.Location = new System.Drawing.Point(597, 41);\r
+            this.check_noDCTDecimate.Location = new System.Drawing.Point(30, 212);\r
             this.check_noDCTDecimate.Name = "check_noDCTDecimate";\r
             this.check_noDCTDecimate.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
             this.check_noDCTDecimate.Size = new System.Drawing.Size(114, 17);\r
@@ -207,26 +213,10 @@ namespace Handbrake.Controls
             this.check_noDCTDecimate.UseVisualStyleBackColor = true;\r
             this.check_noDCTDecimate.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
             // \r
-            // check_noFastPSkip\r
-            // \r
-            this.check_noFastPSkip.AutoSize = true;\r
-            this.check_noFastPSkip.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_noFastPSkip.Location = new System.Drawing.Point(611, 18);\r
-            this.check_noFastPSkip.Name = "check_noFastPSkip";\r
-            this.check_noFastPSkip.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
-            this.check_noFastPSkip.Size = new System.Drawing.Size(100, 17);\r
-            this.check_noFastPSkip.TabIndex = 76;\r
-            this.check_noFastPSkip.Text = "No Fast-P-Skip:";\r
-            this.check_noFastPSkip.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.ToolTip.SetToolTip(this.check_noFastPSkip, "This can help with blocking on solid colors like blue skies, but it also slows do" +\r
-                    "wn the encode.");\r
-            this.check_noFastPSkip.UseVisualStyleBackColor = true;\r
-            this.check_noFastPSkip.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
-            // \r
             // lbl_trellis\r
             // \r
             this.lbl_trellis.AutoSize = true;\r
-            this.lbl_trellis.Location = new System.Drawing.Point(421, 130);\r
+            this.lbl_trellis.Location = new System.Drawing.Point(563, 43);\r
             this.lbl_trellis.Name = "lbl_trellis";\r
             this.lbl_trellis.Size = new System.Drawing.Size(38, 13);\r
             this.lbl_trellis.TabIndex = 67;\r
@@ -237,11 +227,11 @@ namespace Handbrake.Controls
             this.drop_trellis.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_trellis.FormattingEnabled = true;\r
             this.drop_trellis.Items.AddRange(new object[] {\r
-            "Default (1)",\r
-            "0",\r
-            "1",\r
-            "2"});\r
-            this.drop_trellis.Location = new System.Drawing.Point(468, 127);\r
+            "Default (Encode Only)",\r
+            "Off",\r
+            "Encode Only",\r
+            "Always"});\r
+            this.drop_trellis.Location = new System.Drawing.Point(615, 40);\r
             this.drop_trellis.Name = "drop_trellis";\r
             this.drop_trellis.Size = new System.Drawing.Size(94, 21);\r
             this.drop_trellis.TabIndex = 75;\r
@@ -267,9 +257,9 @@ namespace Handbrake.Controls
             "4",\r
             "5",\r
             "6"});\r
-            this.drop_deblockBeta.Location = new System.Drawing.Point(643, 95);\r
+            this.drop_deblockBeta.Location = new System.Drawing.Point(631, 175);\r
             this.drop_deblockBeta.Name = "drop_deblockBeta";\r
-            this.drop_deblockBeta.Size = new System.Drawing.Size(68, 21);\r
+            this.drop_deblockBeta.Size = new System.Drawing.Size(78, 21);\r
             this.drop_deblockBeta.TabIndex = 74;\r
             this.ToolTip.SetToolTip(this.drop_deblockBeta, resources.GetString("drop_deblockBeta.ToolTip"));\r
             this.drop_deblockBeta.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
@@ -277,7 +267,7 @@ namespace Handbrake.Controls
             // label41\r
             // \r
             this.label41.AutoSize = true;\r
-            this.label41.Location = new System.Drawing.Point(575, 72);\r
+            this.label41.Location = new System.Drawing.Point(563, 152);\r
             this.label41.Name = "label41";\r
             this.label41.Size = new System.Drawing.Size(62, 13);\r
             this.label41.TabIndex = 66;\r
@@ -302,50 +292,23 @@ namespace Handbrake.Controls
             "4",\r
             "5",\r
             "6"});\r
-            this.drop_deblockAlpha.Location = new System.Drawing.Point(643, 69);\r
+            this.drop_deblockAlpha.Location = new System.Drawing.Point(631, 149);\r
             this.drop_deblockAlpha.Name = "drop_deblockAlpha";\r
-            this.drop_deblockAlpha.Size = new System.Drawing.Size(68, 21);\r
+            this.drop_deblockAlpha.Size = new System.Drawing.Size(78, 21);\r
             this.drop_deblockAlpha.TabIndex = 73;\r
             this.ToolTip.SetToolTip(this.drop_deblockAlpha, resources.GetString("drop_deblockAlpha.ToolTip"));\r
             this.drop_deblockAlpha.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
             // \r
-            // panel3\r
-            // \r
-            this.panel3.BackColor = System.Drawing.Color.Black;\r
-            this.panel3.Location = new System.Drawing.Point(277, 123);\r
-            this.panel3.Margin = new System.Windows.Forms.Padding(0);\r
-            this.panel3.Name = "panel3";\r
-            this.panel3.Size = new System.Drawing.Size(290, 1);\r
-            this.panel3.TabIndex = 65;\r
-            // \r
-            // panel1\r
-            // \r
-            this.panel1.BackColor = System.Drawing.Color.Black;\r
-            this.panel1.Location = new System.Drawing.Point(13, 89);\r
-            this.panel1.Margin = new System.Windows.Forms.Padding(0);\r
-            this.panel1.Name = "panel1";\r
-            this.panel1.Size = new System.Drawing.Size(247, 1);\r
-            this.panel1.TabIndex = 51;\r
-            // \r
-            // panel2\r
-            // \r
-            this.panel2.BackColor = System.Drawing.Color.Black;\r
-            this.panel2.Location = new System.Drawing.Point(277, 95);\r
-            this.panel2.Margin = new System.Windows.Forms.Padding(0);\r
-            this.panel2.Name = "panel2";\r
-            this.panel2.Size = new System.Drawing.Size(290, 1);\r
-            this.panel2.TabIndex = 63;\r
-            // \r
             // check_8x8DCT\r
             // \r
             this.check_8x8DCT.AutoSize = true;\r
             this.check_8x8DCT.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_8x8DCT.Location = new System.Drawing.Point(492, 101);\r
+            this.check_8x8DCT.Location = new System.Drawing.Point(44, 111);\r
             this.check_8x8DCT.Name = "check_8x8DCT";\r
             this.check_8x8DCT.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
-            this.check_8x8DCT.Size = new System.Drawing.Size(71, 17);\r
+            this.check_8x8DCT.Size = new System.Drawing.Size(100, 17);\r
             this.check_8x8DCT.TabIndex = 72;\r
-            this.check_8x8DCT.Text = "8x8 DCT:";\r
+            this.check_8x8DCT.Text = "8x8 Transform:";\r
             this.check_8x8DCT.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
             this.ToolTip.SetToolTip(this.check_8x8DCT, resources.GetString("check_8x8DCT.ToolTip"));\r
             this.check_8x8DCT.UseVisualStyleBackColor = true;\r
@@ -354,21 +317,22 @@ namespace Handbrake.Controls
             // label45\r
             // \r
             this.label45.AutoSize = true;\r
-            this.label45.Location = new System.Drawing.Point(367, 102);\r
+            this.label45.Location = new System.Drawing.Point(563, 16);\r
             this.label45.Name = "label45";\r
-            this.label45.Size = new System.Drawing.Size(50, 13);\r
+            this.label45.Size = new System.Drawing.Size(78, 13);\r
             this.label45.TabIndex = 64;\r
-            this.label45.Text = "Analysis:";\r
+            this.label45.Text = "Partition Type:";\r
             // \r
             // drop_analysis\r
             // \r
             this.drop_analysis.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_analysis.FormattingEnabled = true;\r
             this.drop_analysis.Items.AddRange(new object[] {\r
-            "Default (some)",\r
+            "Default (most)",\r
             "None",\r
+            "Some",\r
             "All"});\r
-            this.drop_analysis.Location = new System.Drawing.Point(423, 99);\r
+            this.drop_analysis.Location = new System.Drawing.Point(646, 13);\r
             this.drop_analysis.Name = "drop_analysis";\r
             this.drop_analysis.Size = new System.Drawing.Size(63, 21);\r
             this.drop_analysis.TabIndex = 71;\r
@@ -378,11 +342,11 @@ namespace Handbrake.Controls
             // label48\r
             // \r
             this.label48.AutoSize = true;\r
-            this.label48.Location = new System.Drawing.Point(279, 45);\r
+            this.label48.Location = new System.Drawing.Point(262, 110);\r
             this.label48.Name = "label48";\r
-            this.label48.Size = new System.Drawing.Size(138, 13);\r
+            this.label48.Size = new System.Drawing.Size(149, 13);\r
             this.label48.TabIndex = 62;\r
-            this.label48.Text = "Subpixel Motion Estimation:";\r
+            this.label48.Text = "Subpixel ME && Mode Decision:";\r
             // \r
             // drop_subpixelMotionEstimation\r
             // \r
@@ -390,17 +354,18 @@ namespace Handbrake.Controls
             this.drop_subpixelMotionEstimation.FormattingEnabled = true;\r
             this.drop_subpixelMotionEstimation.Items.AddRange(new object[] {\r
             "Default (7)",\r
-            "0",\r
-            "1",\r
-            "2",\r
-            "3",\r
-            "4",\r
-            "5",\r
-            "6",\r
-            "7",\r
-            "8",\r
-            "9"});\r
-            this.drop_subpixelMotionEstimation.Location = new System.Drawing.Point(423, 42);\r
+            "0: SAD, no subpel (super fast!)",\r
+            "1: SAD, qpel",\r
+            "2: SATD, qpel",\r
+            "3: SATD, multi-qpel",\r
+            "4: SATD, qpel on all",\r
+            "5: SATD, multi-qpel on all",\r
+            "6: RD in I/P-frames",\r
+            "7: RD in all frames",\r
+            "8: RD refine in I/P-frames",\r
+            "9: RD refine in all frames",\r
+            "10: QPRD in all frames"});\r
+            this.drop_subpixelMotionEstimation.Location = new System.Drawing.Point(417, 105);\r
             this.drop_subpixelMotionEstimation.Name = "drop_subpixelMotionEstimation";\r
             this.drop_subpixelMotionEstimation.Size = new System.Drawing.Size(139, 21);\r
             this.drop_subpixelMotionEstimation.TabIndex = 70;\r
@@ -410,7 +375,7 @@ namespace Handbrake.Controls
             // lbl_merange\r
             // \r
             this.lbl_merange.AutoSize = true;\r
-            this.lbl_merange.Location = new System.Drawing.Point(288, 71);\r
+            this.lbl_merange.Location = new System.Drawing.Point(282, 135);\r
             this.lbl_merange.Name = "lbl_merange";\r
             this.lbl_merange.Size = new System.Drawing.Size(129, 13);\r
             this.lbl_merange.TabIndex = 61;\r
@@ -483,7 +448,7 @@ namespace Handbrake.Controls
             "62",\r
             "63",\r
             "64"});\r
-            this.drop_MotionEstimationRange.Location = new System.Drawing.Point(423, 68);\r
+            this.drop_MotionEstimationRange.Location = new System.Drawing.Point(417, 132);\r
             this.drop_MotionEstimationRange.Name = "drop_MotionEstimationRange";\r
             this.drop_MotionEstimationRange.Size = new System.Drawing.Size(139, 21);\r
             this.drop_MotionEstimationRange.TabIndex = 69;\r
@@ -493,7 +458,7 @@ namespace Handbrake.Controls
             // label54\r
             // \r
             this.label54.AutoSize = true;\r
-            this.label54.Location = new System.Drawing.Point(283, 19);\r
+            this.label54.Location = new System.Drawing.Point(277, 81);\r
             this.label54.Name = "label54";\r
             this.label54.Size = new System.Drawing.Size(134, 13);\r
             this.label54.TabIndex = 60;\r
@@ -511,49 +476,21 @@ namespace Handbrake.Controls
             "Uneven Multi-Hexagon",\r
             "Exhaustive",\r
             "Transformed Exhaustive"});\r
-            this.drop_MotionEstimationMethod.Location = new System.Drawing.Point(423, 16);\r
+            this.drop_MotionEstimationMethod.Location = new System.Drawing.Point(417, 78);\r
             this.drop_MotionEstimationMethod.Name = "drop_MotionEstimationMethod";\r
             this.drop_MotionEstimationMethod.Size = new System.Drawing.Size(139, 21);\r
             this.drop_MotionEstimationMethod.TabIndex = 68;\r
             this.ToolTip.SetToolTip(this.drop_MotionEstimationMethod, resources.GetString("drop_MotionEstimationMethod.ToolTip"));\r
             this.drop_MotionEstimationMethod.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
             // \r
-            // check_pyrmidalBFrames\r
-            // \r
-            this.check_pyrmidalBFrames.AutoSize = true;\r
-            this.check_pyrmidalBFrames.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_pyrmidalBFrames.Location = new System.Drawing.Point(17, 194);\r
-            this.check_pyrmidalBFrames.Name = "check_pyrmidalBFrames";\r
-            this.check_pyrmidalBFrames.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
-            this.check_pyrmidalBFrames.Size = new System.Drawing.Size(124, 17);\r
-            this.check_pyrmidalBFrames.TabIndex = 59;\r
-            this.check_pyrmidalBFrames.Text = "Pyramidal B-Frames:";\r
-            this.ToolTip.SetToolTip(this.check_pyrmidalBFrames, resources.GetString("check_pyrmidalBFrames.ToolTip"));\r
-            this.check_pyrmidalBFrames.UseVisualStyleBackColor = true;\r
-            this.check_pyrmidalBFrames.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
-            // \r
-            // check_weightedBFrames\r
-            // \r
-            this.check_weightedBFrames.AutoSize = true;\r
-            this.check_weightedBFrames.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_weightedBFrames.Location = new System.Drawing.Point(17, 173);\r
-            this.check_weightedBFrames.Name = "check_weightedBFrames";\r
-            this.check_weightedBFrames.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
-            this.check_weightedBFrames.Size = new System.Drawing.Size(124, 17);\r
-            this.check_weightedBFrames.TabIndex = 58;\r
-            this.check_weightedBFrames.Text = "Weighted B-Frames:";\r
-            this.ToolTip.SetToolTip(this.check_weightedBFrames, resources.GetString("check_weightedBFrames.ToolTip"));\r
-            this.check_weightedBFrames.UseVisualStyleBackColor = true;\r
-            this.check_weightedBFrames.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
-            // \r
             // lbl_direct_prediction\r
             // \r
             this.lbl_direct_prediction.AutoSize = true;\r
-            this.lbl_direct_prediction.Location = new System.Drawing.Point(34, 150);\r
+            this.lbl_direct_prediction.Location = new System.Drawing.Point(297, 54);\r
             this.lbl_direct_prediction.Name = "lbl_direct_prediction";\r
-            this.lbl_direct_prediction.Size = new System.Drawing.Size(89, 13);\r
+            this.lbl_direct_prediction.Size = new System.Drawing.Size(114, 13);\r
             this.lbl_direct_prediction.TabIndex = 53;\r
-            this.lbl_direct_prediction.Text = "Direct Prediction:";\r
+            this.lbl_direct_prediction.Text = "Adaptive Direct Mode:";\r
             // \r
             // drop_directPrediction\r
             // \r
@@ -565,9 +502,9 @@ namespace Handbrake.Controls
             "Spatial",\r
             "Temporal",\r
             "Automatic"});\r
-            this.drop_directPrediction.Location = new System.Drawing.Point(129, 147);\r
+            this.drop_directPrediction.Location = new System.Drawing.Point(417, 51);\r
             this.drop_directPrediction.Name = "drop_directPrediction";\r
-            this.drop_directPrediction.Size = new System.Drawing.Size(121, 21);\r
+            this.drop_directPrediction.Size = new System.Drawing.Size(106, 21);\r
             this.drop_directPrediction.TabIndex = 57;\r
             this.ToolTip.SetToolTip(this.drop_directPrediction, resources.GetString("drop_directPrediction.ToolTip"));\r
             this.drop_directPrediction.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
@@ -575,11 +512,11 @@ namespace Handbrake.Controls
             // label62\r
             // \r
             this.label62.AutoSize = true;\r
-            this.label62.Location = new System.Drawing.Point(67, 98);\r
+            this.label62.Location = new System.Drawing.Point(21, 64);\r
             this.label62.Name = "label62";\r
-            this.label62.Size = new System.Drawing.Size(56, 13);\r
+            this.label62.Size = new System.Drawing.Size(103, 13);\r
             this.label62.TabIndex = 52;\r
-            this.label62.Text = "B-Frames:";\r
+            this.label62.Text = "Maximum B-Frames:";\r
             // \r
             // drop_bFrames\r
             // \r
@@ -604,19 +541,17 @@ namespace Handbrake.Controls
             "14",\r
             "15",\r
             "16"});\r
-            this.drop_bFrames.Location = new System.Drawing.Point(129, 95);\r
+            this.drop_bFrames.Location = new System.Drawing.Point(129, 61);\r
             this.drop_bFrames.Name = "drop_bFrames";\r
-            this.drop_bFrames.Size = new System.Drawing.Size(121, 21);\r
+            this.drop_bFrames.Size = new System.Drawing.Size(106, 21);\r
             this.drop_bFrames.TabIndex = 56;\r
-            this.ToolTip.SetToolTip(this.drop_bFrames, "Sane values are 1-6. \r\nB-Frames are smaller than other frames, so they let you pa" +\r
-                    "ck in more quality at the same bitrate. \r\nUse more of them with animated materia" +\r
-                    "l.");\r
+            this.ToolTip.SetToolTip(this.drop_bFrames, resources.GetString("drop_bFrames.ToolTip"));\r
             this.drop_bFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
             // \r
             // label64\r
             // \r
             this.label64.AutoSize = true;\r
-            this.label64.Location = new System.Drawing.Point(24, 45);\r
+            this.label64.Location = new System.Drawing.Point(25, 38);\r
             this.label64.Name = "label64";\r
             this.label64.Size = new System.Drawing.Size(99, 13);\r
             this.label64.TabIndex = 50;\r
@@ -628,7 +563,6 @@ namespace Handbrake.Controls
             this.drop_refFrames.FormattingEnabled = true;\r
             this.drop_refFrames.Items.AddRange(new object[] {\r
             "Default (3)",\r
-            "0",\r
             "1",\r
             "2",\r
             "3",\r
@@ -645,61 +579,130 @@ namespace Handbrake.Controls
             "14",\r
             "15",\r
             "16"});\r
-            this.drop_refFrames.Location = new System.Drawing.Point(129, 42);\r
+            this.drop_refFrames.Location = new System.Drawing.Point(129, 35);\r
             this.drop_refFrames.Name = "drop_refFrames";\r
-            this.drop_refFrames.Size = new System.Drawing.Size(121, 21);\r
+            this.drop_refFrames.Size = new System.Drawing.Size(106, 21);\r
             this.drop_refFrames.TabIndex = 54;\r
-            this.ToolTip.SetToolTip(this.drop_refFrames, "Sane values are 1-6. \r\nThe more you add, the higher the quality, but the slower t" +\r
-                    "he encode. Be careful... too many and QuickTime struggles to play the video back" +\r
-                    ".");\r
+            this.ToolTip.SetToolTip(this.drop_refFrames, resources.GetString("drop_refFrames.ToolTip"));\r
             this.drop_refFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
             // \r
-            // check_mixedReferences\r
-            // \r
-            this.check_mixedReferences.AutoSize = true;\r
-            this.check_mixedReferences.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.check_mixedReferences.Location = new System.Drawing.Point(25, 68);\r
-            this.check_mixedReferences.Name = "check_mixedReferences";\r
-            this.check_mixedReferences.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
-            this.check_mixedReferences.Size = new System.Drawing.Size(116, 17);\r
-            this.check_mixedReferences.TabIndex = 55;\r
-            this.check_mixedReferences.Text = "Mixed References:";\r
-            this.check_mixedReferences.TextAlign = System.Drawing.ContentAlignment.MiddleRight;\r
-            this.ToolTip.SetToolTip(this.check_mixedReferences, "With this on, different references can be used for different parts of each 16x16 " +\r
-                    "pixel macroblock, increasing quality.");\r
-            this.check_mixedReferences.UseVisualStyleBackColor = true;\r
-            this.check_mixedReferences.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
-            // \r
             // ToolTip\r
             // \r
             this.ToolTip.Active = false;\r
             this.ToolTip.AutomaticDelay = 1000;\r
             this.ToolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;\r
             // \r
+            // check_weightp\r
+            // \r
+            this.check_weightp.AutoSize = true;\r
+            this.check_weightp.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;\r
+            this.check_weightp.ForeColor = System.Drawing.SystemColors.ControlText;\r
+            this.check_weightp.Location = new System.Drawing.Point(20, 134);\r
+            this.check_weightp.Name = "check_weightp";\r
+            this.check_weightp.RightToLeft = System.Windows.Forms.RightToLeft.No;\r
+            this.check_weightp.Size = new System.Drawing.Size(124, 17);\r
+            this.check_weightp.TabIndex = 87;\r
+            this.check_weightp.Text = "Weighted P-Frames:";\r
+            this.ToolTip.SetToolTip(this.check_weightp, resources.GetString("check_weightp.ToolTip"));\r
+            this.check_weightp.UseVisualStyleBackColor = true;\r
+            this.check_weightp.CheckedChanged += new System.EventHandler(this.widgetControlChanged);\r
+            // \r
+            // slider_adaptiveQuantStrength\r
+            // \r
+            this.slider_adaptiveQuantStrength.BackColor = System.Drawing.SystemColors.Window;\r
+            this.slider_adaptiveQuantStrength.Location = new System.Drawing.Point(425, 167);\r
+            this.slider_adaptiveQuantStrength.Maximum = 20;\r
+            this.slider_adaptiveQuantStrength.Name = "slider_adaptiveQuantStrength";\r
+            this.slider_adaptiveQuantStrength.Size = new System.Drawing.Size(131, 45);\r
+            this.slider_adaptiveQuantStrength.TabIndex = 88;\r
+            this.ToolTip.SetToolTip(this.slider_adaptiveQuantStrength, "Adaptive quantization controls how the encoder distributes bits across the frame." +\r
+                    "  \r\nHigher values take more bits away from edges and complex areas to improve ar" +\r
+                    "eas with finer detail");\r
+            this.slider_adaptiveQuantStrength.Value = 10;\r
+            this.slider_adaptiveQuantStrength.Scroll += new System.EventHandler(this.widgetControlChanged);\r
+            // \r
+            // combo_pyrmidalBFrames\r
+            // \r
+            this.combo_pyrmidalBFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.combo_pyrmidalBFrames.FormattingEnabled = true;\r
+            this.combo_pyrmidalBFrames.Items.AddRange(new object[] {\r
+            "Default (Normal)",\r
+            "Off",\r
+            "Strict"});\r
+            this.combo_pyrmidalBFrames.Location = new System.Drawing.Point(129, 157);\r
+            this.combo_pyrmidalBFrames.Name = "combo_pyrmidalBFrames";\r
+            this.combo_pyrmidalBFrames.Size = new System.Drawing.Size(106, 21);\r
+            this.combo_pyrmidalBFrames.TabIndex = 92;\r
+            this.ToolTip.SetToolTip(this.combo_pyrmidalBFrames, resources.GetString("combo_pyrmidalBFrames.ToolTip"));\r
+            this.combo_pyrmidalBFrames.SelectedIndexChanged += new System.EventHandler(this.widgetControlChanged);\r
+            // \r
+            // lbl_adaptiveQuantStrength\r
+            // \r
+            this.lbl_adaptiveQuantStrength.AutoSize = true;\r
+            this.lbl_adaptiveQuantStrength.Location = new System.Drawing.Point(248, 171);\r
+            this.lbl_adaptiveQuantStrength.Name = "lbl_adaptiveQuantStrength";\r
+            this.lbl_adaptiveQuantStrength.Size = new System.Drawing.Size(163, 13);\r
+            this.lbl_adaptiveQuantStrength.TabIndex = 89;\r
+            this.lbl_adaptiveQuantStrength.Text = "Adaptive Quantization Strength:";\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.BackColor = System.Drawing.Color.Transparent;\r
+            this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label1.Location = new System.Drawing.Point(13, 193);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(83, 13);\r
+            this.label1.TabIndex = 90;\r
+            this.label1.Text = "Psychovisual:";\r
+            // \r
+            // lbl_prymidalBframes\r
+            // \r
+            this.lbl_prymidalBframes.AutoSize = true;\r
+            this.lbl_prymidalBframes.Location = new System.Drawing.Point(20, 160);\r
+            this.lbl_prymidalBframes.Name = "lbl_prymidalBframes";\r
+            this.lbl_prymidalBframes.Size = new System.Drawing.Size(105, 13);\r
+            this.lbl_prymidalBframes.TabIndex = 91;\r
+            this.lbl_prymidalBframes.Text = "Pyramidal B-Frames:";\r
+            // \r
+            // label3\r
+            // \r
+            this.label3.AutoSize = true;\r
+            this.label3.BackColor = System.Drawing.Color.Transparent;\r
+            this.label3.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label3.Location = new System.Drawing.Point(248, 13);\r
+            this.label3.Name = "label3";\r
+            this.label3.Size = new System.Drawing.Size(57, 13);\r
+            this.label3.TabIndex = 93;\r
+            this.label3.Text = "Analysis:";\r
+            // \r
             // x264Panel\r
             // \r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;\r
             this.BackColor = System.Drawing.Color.Transparent;\r
+            this.Controls.Add(this.label3);\r
+            this.Controls.Add(this.rtf_x264Query);\r
+            this.Controls.Add(this.lbl_prymidalBframes);\r
+            this.Controls.Add(this.combo_pyrmidalBFrames);\r
+            this.Controls.Add(this.label1);\r
             this.Controls.Add(this.slider_psytrellis);\r
+            this.Controls.Add(this.slider_psyrd);\r
+            this.Controls.Add(this.lbl_adaptiveQuantStrength);\r
+            this.Controls.Add(this.slider_adaptiveQuantStrength);\r
+            this.Controls.Add(this.check_weightp);\r
             this.Controls.Add(this.lbl_psytrellis);\r
             this.Controls.Add(this.lbl_psyrd);\r
-            this.Controls.Add(this.slider_psyrd);\r
             this.Controls.Add(this.lbl_adaptBFrames);\r
             this.Controls.Add(this.drop_adaptBFrames);\r
             this.Controls.Add(this.label43);\r
             this.Controls.Add(this.btn_reset);\r
-            this.Controls.Add(this.rtf_x264Query);\r
             this.Controls.Add(this.check_Cabac);\r
             this.Controls.Add(this.check_noDCTDecimate);\r
-            this.Controls.Add(this.check_noFastPSkip);\r
             this.Controls.Add(this.lbl_trellis);\r
             this.Controls.Add(this.drop_trellis);\r
             this.Controls.Add(this.drop_deblockBeta);\r
             this.Controls.Add(this.label41);\r
             this.Controls.Add(this.drop_deblockAlpha);\r
-            this.Controls.Add(this.panel3);\r
-            this.Controls.Add(this.panel1);\r
-            this.Controls.Add(this.panel2);\r
             this.Controls.Add(this.check_8x8DCT);\r
             this.Controls.Add(this.label45);\r
             this.Controls.Add(this.drop_analysis);\r
@@ -709,20 +712,18 @@ namespace Handbrake.Controls
             this.Controls.Add(this.drop_MotionEstimationRange);\r
             this.Controls.Add(this.label54);\r
             this.Controls.Add(this.drop_MotionEstimationMethod);\r
-            this.Controls.Add(this.check_pyrmidalBFrames);\r
-            this.Controls.Add(this.check_weightedBFrames);\r
             this.Controls.Add(this.lbl_direct_prediction);\r
             this.Controls.Add(this.drop_directPrediction);\r
             this.Controls.Add(this.label62);\r
             this.Controls.Add(this.drop_bFrames);\r
             this.Controls.Add(this.label64);\r
             this.Controls.Add(this.drop_refFrames);\r
-            this.Controls.Add(this.check_mixedReferences);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.Name = "x264Panel";\r
-            this.Size = new System.Drawing.Size(720, 306);\r
+            this.Size = new System.Drawing.Size(720, 305);\r
             ((System.ComponentModel.ISupportInitialize)(this.slider_psytrellis)).EndInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.slider_psyrd)).EndInit();\r
+            ((System.ComponentModel.ISupportInitialize)(this.slider_adaptiveQuantStrength)).EndInit();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -741,15 +742,11 @@ namespace Handbrake.Controls
         internal System.Windows.Forms.RichTextBox rtf_x264Query;\r
         internal System.Windows.Forms.CheckBox check_Cabac;\r
         internal System.Windows.Forms.CheckBox check_noDCTDecimate;\r
-        internal System.Windows.Forms.CheckBox check_noFastPSkip;\r
         internal System.Windows.Forms.Label lbl_trellis;\r
         internal System.Windows.Forms.ComboBox drop_trellis;\r
         internal System.Windows.Forms.ComboBox drop_deblockBeta;\r
         internal System.Windows.Forms.Label label41;\r
         internal System.Windows.Forms.ComboBox drop_deblockAlpha;\r
-        internal System.Windows.Forms.Panel panel3;\r
-        internal System.Windows.Forms.Panel panel1;\r
-        internal System.Windows.Forms.Panel panel2;\r
         internal System.Windows.Forms.CheckBox check_8x8DCT;\r
         internal System.Windows.Forms.Label label45;\r
         internal System.Windows.Forms.ComboBox drop_analysis;\r
@@ -759,15 +756,19 @@ namespace Handbrake.Controls
         internal System.Windows.Forms.ComboBox drop_MotionEstimationRange;\r
         internal System.Windows.Forms.Label label54;\r
         internal System.Windows.Forms.ComboBox drop_MotionEstimationMethod;\r
-        internal System.Windows.Forms.CheckBox check_pyrmidalBFrames;\r
-        internal System.Windows.Forms.CheckBox check_weightedBFrames;\r
         internal System.Windows.Forms.Label lbl_direct_prediction;\r
         internal System.Windows.Forms.ComboBox drop_directPrediction;\r
         internal System.Windows.Forms.Label label62;\r
         internal System.Windows.Forms.ComboBox drop_bFrames;\r
         internal System.Windows.Forms.Label label64;\r
         internal System.Windows.Forms.ComboBox drop_refFrames;\r
-        internal System.Windows.Forms.CheckBox check_mixedReferences;\r
         private System.Windows.Forms.ToolTip ToolTip;\r
+        internal System.Windows.Forms.CheckBox check_weightp;\r
+        internal System.Windows.Forms.Label lbl_adaptiveQuantStrength;\r
+        internal System.Windows.Forms.TrackBar slider_adaptiveQuantStrength;\r
+        internal System.Windows.Forms.Label label1;\r
+        internal System.Windows.Forms.Label lbl_prymidalBframes;\r
+        internal System.Windows.Forms.ComboBox combo_pyrmidalBFrames;\r
+        internal System.Windows.Forms.Label label3;\r
     }\r
 }\r
index 4229c82..7678539 100644 (file)
@@ -1,16 +1,30 @@
 ï»¿/*  x264Panel.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Globalization;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// The x264 Panel\r
+    /// </summary>\r
     public partial class x264Panel : UserControl\r
     {\r
+        /* \r
+         * TODO This code was ported from the obj-c MacGUI code. It's really messy and could really do with being cleaned up\r
+         * at some point.\r
+         */\r
+\r
+        private CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="x264Panel"/> class. \r
+        /// Initializes a new instance of the x264 panel user control\r
+        /// </summary>\r
         public x264Panel()\r
         {\r
             InitializeComponent();\r
@@ -18,117 +32,34 @@ namespace Handbrake.Controls
             if (Properties.Settings.Default.tooltipEnable)\r
                 ToolTip.Active = true;\r
 \r
-            reset2Defaults();\r
-        }\r
-\r
-        public string x264Query\r
-        {\r
-            get { return rtf_x264Query.Text; }\r
-            set { rtf_x264Query.Text = value; }\r
+            Reset2Defaults();\r
         }\r
 \r
-        private void widgetControlChanged(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Gets or sets the X264 query string\r
+        /// </summary>\r
+        public string X264Query\r
         {\r
-            Control changedControlName = (Control) sender;\r
-            string controlName = "";\r
-\r
-            switch (changedControlName.Name.Trim())\r
+            get\r
             {\r
-                case "drop_refFrames":\r
-                    controlName = "ref";\r
-                    break;\r
-                case "check_mixedReferences":\r
-                    controlName = "mixed-refs";\r
-                    break;\r
-                case "drop_bFrames":\r
-                    controlName = "bframes";\r
-                    break;\r
-                case "drop_directPrediction":\r
-                    controlName = "direct";\r
-                    break;\r
-                case "check_weightedBFrames":\r
-                    controlName = "weightb";\r
-                    break;\r
-                case "check_pyrmidalBFrames":\r
-                    controlName = "b-pyramid";\r
-                    break;\r
-                case "drop_MotionEstimationMethod":\r
-                    controlName = "me";\r
-                    break;\r
-                case "drop_MotionEstimationRange":\r
-                    controlName = "merange";\r
-                    break;\r
-                case "drop_subpixelMotionEstimation":\r
-                    controlName = "subq";\r
-                    break;\r
-                case "drop_analysis":\r
-                    controlName = "analyse";\r
-                    break;\r
-                case "check_8x8DCT":\r
-                    controlName = "8x8dct";\r
-                    break;\r
-                case "drop_deblockAlpha":\r
-                    controlName = "deblock";\r
-                    break;\r
-                case "drop_deblockBeta":\r
-                    controlName = "deblock";\r
-                    break;\r
-                case "drop_trellis":\r
-                    controlName = "trellis";\r
-                    break;\r
-                case "check_noFastPSkip":\r
-                    controlName = "no-fast-pskip";\r
-                    break;\r
-                case "check_noDCTDecimate":\r
-                    controlName = "no-dct-decimate";\r
-                    break;\r
-                case "check_Cabac":\r
-                    controlName = "cabac";\r
-                    break;\r
-                case "slider_psyrd":\r
-                    controlName = "psy-rd";\r
-                    break;\r
-                case "slider_psytrellis":\r
-                    controlName = "psy-rd";\r
-                    break;\r
-                case "drop_adaptBFrames":\r
-                    controlName = "b-adapt";\r
-                    break;\r
+                return rtf_x264Query.Text;\r
             }\r
-            on_x264_WidgetChange(controlName);\r
-        }\r
-        private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
-        {\r
-            if (rtf_x264Query.Text.EndsWith("\n"))\r
+            set\r
             {\r
-                string query = rtf_x264Query.Text.Replace("\n", "");\r
-                reset2Defaults();\r
-                rtf_x264Query.Text = query;\r
-                X264_StandardizeOptString();\r
-                X264_SetCurrentSettingsInPanel();\r
-\r
-                if (rtf_x264Query.Text == string.Empty)\r
-                    reset2Defaults();\r
+                rtf_x264Query.Text = value;\r
             }\r
         }\r
-        private void btn_reset_Click(object sender, EventArgs e)\r
-        {\r
-            rtf_x264Query.Text = "";\r
-            reset2Defaults();\r
-        }\r
-        \r
+\r
         /// <summary>\r
         /// Reset all components to defaults and clears the x264 rtf box\r
         /// </summary>\r
-        public void reset2Defaults()\r
+        public void Reset2Defaults()\r
         {\r
             check_8x8DCT.CheckState = CheckState.Checked;\r
             check_Cabac.CheckState = CheckState.Checked;\r
-            check_mixedReferences.CheckState = CheckState.Checked;\r
+            check_weightp.CheckState = CheckState.Checked;\r
             check_noDCTDecimate.CheckState = CheckState.Unchecked;\r
-            check_noFastPSkip.CheckState = CheckState.Unchecked;\r
-            check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
-            check_weightedBFrames.CheckState = CheckState.Checked;\r
+            combo_pyrmidalBFrames.SelectedIndex = 0;\r
             drop_analysis.SelectedIndex = 0;\r
             drop_bFrames.SelectedIndex = 0;\r
             drop_deblockAlpha.SelectedIndex = 0;\r
@@ -142,24 +73,26 @@ namespace Handbrake.Controls
             slider_psyrd.Value = 10;\r
             slider_psytrellis.Value = 0;\r
             drop_adaptBFrames.SelectedIndex = 0;\r
+            slider_adaptiveQuantStrength.Value = slider_adaptiveQuantStrength.Maximum / 2;\r
 \r
-            rtf_x264Query.Text = "";\r
+            rtf_x264Query.Text = string.Empty;\r
         }\r
 \r
+        #region Standardize Option String\r
         /// <summary>\r
         /// Iterate over every x264 option, standardize it, write the full string to the x264 rtf box\r
         /// </summary>\r
-        public void X264_StandardizeOptString()\r
+        public void StandardizeOptString()\r
         {\r
             /* Set widgets depending on the opt string in field */\r
-            String thisOpt; // The separated option such as "bframes=3"\r
-            String optName; // The option name such as "bframes"\r
-            String optValue;// The option value such as "3"\r
-            String changedOptString = "";\r
-            String[] currentOptsArray;\r
+            string thisOpt; // The separated option such as "bframes=3"\r
+            string optName; // The option name such as "bframes"\r
+            string optValue; // The option value such as "3"\r
+            string changedOptString = string.Empty;\r
+            string[] currentOptsArray;\r
 \r
             /*First, we get an opt string to process */\r
-            String currentOptString = rtf_x264Query.Text;\r
+            string currentOptString = rtf_x264Query.Text;\r
 \r
             /*verify there is an opt string to process */\r
             if (currentOptString.Contains("="))\r
@@ -176,8 +109,8 @@ namespace Handbrake.Controls
                     if (currentOptsArray[currentOptsArrayCount - 1] == string.Empty)\r
                         break;\r
 \r
-                    String[] splitOptRange = thisOpt.Split('=');\r
-                    if (thisOpt != "")\r
+                    string[] splitOptRange = thisOpt.Split('=');\r
+                    if (thisOpt != string.Empty)\r
                     {\r
                         if (thisOpt.Contains("="))\r
                         {\r
@@ -185,14 +118,14 @@ namespace Handbrake.Controls
                             optValue = splitOptRange[1];\r
 \r
                             /* Standardize the names here depending on whats in the string */\r
-                            optName = X264_StandardizeOptNames(optName);\r
+                            optName = StandardizeOptName(optName);\r
                             thisOpt = optName + "=" + optValue;\r
                         }\r
                         else // No value given so we use a default of "1"\r
                         {\r
                             optName = thisOpt;\r
                             /* Standardize the names here depending on whats in the string */\r
-                            optName = X264_StandardizeOptNames(optName);\r
+                            optName = StandardizeOptName(optName);\r
                             thisOpt = optName + "=1";\r
                         }\r
                     }\r
@@ -211,7 +144,7 @@ namespace Handbrake.Controls
             }\r
 \r
             /* Change the option string to reflect the new standardized option string */\r
-            if (changedOptString != "")\r
+            if (changedOptString != string.Empty)\r
                 rtf_x264Query.Text = changedOptString;\r
         }\r
 \r
@@ -220,19 +153,16 @@ namespace Handbrake.Controls
         /// Input: String. - Single X264 Option. Name only\r
         /// Output: String - Single X264 Option. Name only. Changed to standard format\r
         /// </summary>\r
-        /// <param name="cleanOptNameString"></param>\r
-        /// <returns></returns>\r
-        private static string X264_StandardizeOptNames(String cleanOptNameString)\r
+        /// <param name="cleanOptNameString">a string of x264 options to clean</param>\r
+        /// <returns>A string containing standardized x264 option names</returns>\r
+        private static string StandardizeOptName(string cleanOptNameString)\r
         {\r
-            String input = cleanOptNameString;\r
+            string input = cleanOptNameString;\r
 \r
+            /* Reference Frames */\r
             if (input.Equals("ref") || input.Equals("frameref"))\r
                 cleanOptNameString = "ref";\r
 \r
-            /*No Fast PSkip nofast_pskip*/\r
-            if (input.Equals("no-fast-pskip") || input.Equals("no_fast_pskip") || input.Equals("nofast_pskip"))\r
-                cleanOptNameString = "no-fast-pskip";\r
-\r
             /*No Dict Decimate*/\r
             if (input.Equals("no-dct-decimate") || input.Equals("no_dct_decimate") || input.Equals("nodct_decimate"))\r
                 cleanOptNameString = "no-dct-decimate";\r
@@ -245,10 +175,6 @@ namespace Handbrake.Controls
             if (input.Equals("me-range") || input.Equals("me_range"))\r
                 cleanOptNameString = "merange";\r
 \r
-            /*WeightB*/\r
-            if (input.Equals("weight-b") || input.Equals("weight_b"))\r
-                cleanOptNameString = "weightb";\r
-\r
             /*B Pyramid*/\r
             if (input.Equals("b_pyramid"))\r
                 cleanOptNameString = "b-pyramid";\r
@@ -267,20 +193,21 @@ namespace Handbrake.Controls
 \r
             return cleanOptNameString;\r
         }\r
+        #endregion\r
 \r
         /// <summary>\r
         /// Resets the GUI widgets to the contents of the option string.\r
         /// </summary>\r
-        public void X264_SetCurrentSettingsInPanel()\r
+        public void SetCurrentSettingsInPanel()\r
         {\r
             /* Set widgets depending on the opt string in field */\r
-            String thisOpt; // The separated option such as "bframes=3"\r
-            String optName; // The option name such as "bframes"\r
-            String optValue;// The option value such as "3"\r
-            String[] currentOptsArray;\r
+            string thisOpt; // The separated option such as "bframes=3"\r
+            string optName; // The option name such as "bframes"\r
+            string optValue; // The option value such as "3"\r
+            string[] currentOptsArray;\r
 \r
-            //Set currentOptString to the contents of the text box.\r
-            String currentOptString = rtf_x264Query.Text.Replace("\n", "");\r
+            // Set currentOptString to the contents of the text box.\r
+            string currentOptString = rtf_x264Query.Text.Replace("\n", string.Empty);\r
 \r
             /*verify there is an opt string to process */\r
             if (currentOptString.Contains("="))\r
@@ -296,7 +223,7 @@ namespace Handbrake.Controls
                 for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)\r
                 {\r
                     thisOpt = currentOptsArray[loopcounter];\r
-                    String[] splitOptRange = thisOpt.Split('=');\r
+                    string[] splitOptRange = thisOpt.Split('=');\r
 \r
                     if (thisOpt.Contains("="))\r
                     {\r
@@ -313,20 +240,32 @@ namespace Handbrake.Controls
                             case "ref":\r
                                 drop_refFrames.SelectedItem = optValue;\r
                                 continue;\r
-                            case "no-fast-pskip":\r
-                                check_noFastPSkip.CheckState = CheckState.Checked;\r
+                            case "weightp":\r
+                                this.check_weightp.CheckState = optValue == "0" ? CheckState.Unchecked : CheckState.Checked;\r
                                 continue;\r
                             case "no-dct-decimate":\r
                                 check_noDCTDecimate.CheckState = CheckState.Checked;\r
                                 continue;\r
                             case "subq":\r
-                                drop_subpixelMotionEstimation.SelectedItem = optValue;\r
+                                int subqValue;\r
+                                if (int.TryParse(optValue, out subqValue))\r
+                                {\r
+                                    drop_subpixelMotionEstimation.SelectedIndex = subqValue + 1;\r
+                                }\r
                                 continue;\r
                             case "trellis":\r
-                                drop_trellis.SelectedItem = optValue;\r
-                                continue;\r
-                            case "mixed-refs":\r
-                                check_mixedReferences.CheckState = CheckState.Checked;\r
+                                switch (optValue)\r
+                                {\r
+                                    case "0":\r
+                                        drop_trellis.SelectedIndex = 1;\r
+                                        break;\r
+                                    case "1":\r
+                                         drop_trellis.SelectedIndex = 2;\r
+                                        break;\r
+                                    case "2":\r
+                                        drop_trellis.SelectedIndex = 3;\r
+                                        break;\r
+                                }\r
                                 continue;\r
                             case "me":\r
                                 if (optValue.Equals("dia"))\r
@@ -348,22 +287,27 @@ namespace Handbrake.Controls
                                 int.TryParse(optValue, out badapt);\r
                                 drop_adaptBFrames.SelectedIndex = (badapt + 1);\r
                                 continue;\r
-                            case "weightb":\r
-                                if (optValue != "0")\r
-                                    check_weightedBFrames.CheckState = CheckState.Checked;\r
-                                else\r
-                                    check_weightedBFrames.CheckState = CheckState.Unchecked;\r
-                                continue;\r
                             case "b-pyramid":\r
-                                check_pyrmidalBFrames.CheckState = CheckState.Checked;\r
+                                switch (optValue)\r
+                                {\r
+                                    case "normal":\r
+                                        combo_pyrmidalBFrames.SelectedIndex = 0;\r
+                                        break;\r
+                                    case "strict":\r
+                                        combo_pyrmidalBFrames.SelectedIndex = 2;\r
+                                        break;\r
+                                    case "none":\r
+                                        combo_pyrmidalBFrames.SelectedIndex = 1;\r
+                                        break;\r
+                                }\r
                                 continue;\r
                             case "direct":\r
                                 if (optValue == "auto")\r
                                     optValue = "Automatic";\r
 \r
-                                if (optValue != "")\r
+                                if (optValue != string.Empty)\r
                                 {\r
-                                    Char[] letters = optValue.ToCharArray();\r
+                                    char[] letters = optValue.ToCharArray();\r
                                     letters[0] = Char.ToUpper(letters[0]);\r
                                     optValue = new string(letters);\r
                                 }\r
@@ -375,7 +319,7 @@ namespace Handbrake.Controls
                                 string alphaDeblock = splitDeblock[0];\r
                                 string betaDeblock = splitDeblock[1];\r
 \r
-                                if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", "").Equals("0"))\r
+                                if (alphaDeblock.Equals("0") && betaDeblock.Replace("\n", string.Empty).Equals("0"))\r
                                 {\r
                                     drop_deblockAlpha.SelectedItem = "Default (0)";\r
                                     drop_deblockBeta.SelectedItem = "Default (0)";\r
@@ -384,20 +328,31 @@ namespace Handbrake.Controls
                                 {\r
                                     drop_deblockAlpha.SelectedItem = !alphaDeblock.Equals("0") ? alphaDeblock : "0";\r
 \r
-                                    drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", "").Equals("0") ? betaDeblock.Replace("\n", "") : "0";\r
+                                    drop_deblockBeta.SelectedItem = !betaDeblock.Replace("\n", string.Empty).Equals("0")\r
+                                                                        ? betaDeblock.Replace("\n", string.Empty)\r
+                                                                        : "0";\r
                                 }\r
                                 continue;\r
                             case "analyse":\r
                                 if (optValue.Equals("p8x8,b8x8,i8x8,i4x4"))\r
-                                    drop_analysis.SelectedItem = "Default (some)";\r
+                                    drop_analysis.SelectedItem = "Default (most)";\r
                                 if (optValue.Equals("none"))\r
                                     drop_analysis.SelectedItem = "None";\r
+                                if (optValue.Equals("i4x4,i8x8"))\r
+                                    drop_analysis.SelectedItem = "Some";\r
                                 if (optValue.Equals("all"))\r
                                     drop_analysis.SelectedItem = "All";\r
                                 continue;\r
                             case "8x8dct":\r
                                 check_8x8DCT.CheckState = optValue == "1" ? CheckState.Checked : CheckState.Unchecked;\r
                                 continue;\r
+                            case "aq-strength":\r
+                                float value;\r
+                                float.TryParse(optValue, NumberStyles.Float, CultureInfo.InvariantCulture, out value);\r
+                                int sliderValue;\r
+                                int.TryParse((value * 10).ToString(), out sliderValue);\r
+                                slider_adaptiveQuantStrength.Value = sliderValue;\r
+                                continue;\r
                             case "cabac":\r
                                 check_Cabac.CheckState = CheckState.Unchecked;\r
                                 continue;\r
@@ -408,9 +363,9 @@ namespace Handbrake.Controls
                                 int val, val2;\r
 \r
                                 // default psy-rd = 1 (10 for the slider)\r
-                                psyrd = double.TryParse(x[0], out psyrd) ? psyrd * 10 : 10.0;\r
+                                psyrd = double.TryParse(x[0], NumberStyles.Float, CultureInfo.InvariantCulture, out psyrd) ? psyrd * 10 : 10.0;\r
                                 // default psy-trellis = 0\r
-                                psytrellis = double.TryParse(x[1], out psytrellis) ? psytrellis * 10 : 0.0; \r
+                                psytrellis = double.TryParse(x[1], NumberStyles.Float, CultureInfo.InvariantCulture, out psytrellis) ? psytrellis * 20 : 0.0;\r
 \r
                                 int.TryParse(psyrd.ToString(), out val);\r
                                 int.TryParse(psytrellis.ToString(), out val2);\r
@@ -427,38 +382,41 @@ namespace Handbrake.Controls
         /// <summary>\r
         /// This function will update the X264 Query when one of the GUI widgets changes.\r
         /// </summary>\r
-        private void on_x264_WidgetChange(string sender)\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        private void OnX264WidgetChange(string sender)\r
         {\r
-            animate(sender);\r
-            String optNameToChange = sender;\r
-            String currentOptString = rtf_x264Query.Text;\r
+            Animate(sender);\r
+            string optNameToChange = sender;\r
+            string currentOptString = rtf_x264Query.Text;\r
 \r
             /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after\r
                 the first character of the opt string (hence the ":") */\r
-            String checkOptNameToChange = ":" + optNameToChange + "=";\r
-            String checkOptNameToChangeBegin = optNameToChange + "=";\r
+            string checkOptNameToChange = ":" + optNameToChange + "=";\r
+            string checkOptNameToChangeBegin = optNameToChange + "=";\r
 \r
             // IF the current H264 Option String Contains Multiple Items or Just 1 Item\r
             if ((currentOptString.Contains(checkOptNameToChange)) || (currentOptString.StartsWith(checkOptNameToChangeBegin)))\r
-                hasOptions(currentOptString, optNameToChange);\r
+                HasOptions(currentOptString, optNameToChange);\r
             else // IF there is no options in the rich text box!\r
-                hasNoOptions(optNameToChange);\r
+                HasNoOptions(optNameToChange);\r
         }\r
 \r
         /// <summary>\r
         /// Called when the current x264 option string contains multiple (or a single) item(s) in it seperated by :\r
         /// it updates the current option that the widget corrosponds to, if it is already in thes string.\r
         /// </summary>\r
-        /// <param name="currentOptString"></param>\r
-        /// <param name="optNameToChange"></param>\r
-        private void hasOptions(string currentOptString, string optNameToChange)\r
+        /// <param name="currentOptString">The Current Option String</param>\r
+        /// <param name="optNameToChange">Name of the option to change</param>\r
+        private void HasOptions(string currentOptString, string optNameToChange)\r
         {\r
-            String thisOpt;             // The separated option such as "bframes=3"\r
-            String optName;        // The option name such as "bframes"\r
-            String[] currentOptsArray;\r
+            string thisOpt; // The separated option such as "bframes=3"\r
+            string optName; // The option name such as "bframes"\r
+            string[] currentOptsArray;\r
 \r
             /* Create new empty opt string*/\r
-            String changedOptString = "";\r
+            string changedOptString = string.Empty;\r
 \r
             /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/\r
             currentOptsArray = currentOptString.Split(':');\r
@@ -472,7 +430,7 @@ namespace Handbrake.Controls
                 {\r
                     string[] splitOptRange = thisOpt.Split('=');\r
 \r
-                    optName = splitOptRange[0];     // e.g bframes\r
+                    optName = splitOptRange[0]; // e.g bframes\r
 \r
                     /* \r
                      * Run through the available widgets for x264 opts and set them, as you add widgets,\r
@@ -484,14 +442,15 @@ namespace Handbrake.Controls
                     {\r
                         if (optNameToChange.Equals("deblock"))\r
                         {\r
-                            String da = drop_deblockAlpha.SelectedItem.ToString();\r
-                            String db = drop_deblockBeta.SelectedItem.ToString();\r
+                            string da = drop_deblockAlpha.SelectedItem.ToString();\r
+                            string db = drop_deblockBeta.SelectedItem.ToString();\r
 \r
-                            if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
+                            if (((da.Contains("Default")) && (db.Contains("Default"))) ||\r
+                                ((da.Contains("0")) && (db.Contains("0"))))\r
                             {\r
                                 drop_deblockBeta.SelectedItem = "Default (0)";\r
                                 drop_deblockAlpha.SelectedItem = "Default (0)";\r
-                                thisOpt = "";\r
+                                thisOpt = string.Empty;\r
                             }\r
                             else if ((!da.Contains("Default")) && (db.Contains("Default")))\r
                             {\r
@@ -506,35 +465,55 @@ namespace Handbrake.Controls
                             else if ((!da.Contains("Default")) && (!db.Contains("Default")))\r
                                 thisOpt = "deblock=" + da + "," + db;\r
                         }\r
+                        else if (optNameToChange.Equals("aq-strength"))\r
+                        {\r
+                            if (slider_adaptiveQuantStrength.Value == 10)\r
+                                thisOpt = string.Empty;\r
+                            else\r
+                            {\r
+                                double value = slider_adaptiveQuantStrength.Value * 0.1;\r
+                                string aqs = value.ToString("f1", culture);\r
+                                thisOpt = "aq-strength=" + aqs;\r
+                            }\r
+                        }\r
                         else if (optNameToChange.Equals("psy-rd"))\r
                         {\r
                             if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
-                                thisOpt = "";\r
+                                thisOpt = string.Empty;\r
                             else\r
                             {\r
                                 double psyrd = slider_psyrd.Value * 0.1;\r
-                                double psytre = slider_psytrellis.Value * 0.1;\r
+                                double psytre = slider_psytrellis.Value * 0.05;\r
 \r
-                                string rd = psyrd.ToString("f1");\r
-                                string rt = psytre.ToString("f1");\r
+                                string rd = psyrd.ToString("f2", culture);\r
+                                string rt = psytre.ToString("f2", culture);\r
 \r
                                 thisOpt = "psy-rd=" + rd + "," + rt;\r
                             }\r
                         }\r
-                        else if (optNameToChange.Equals("mixed-refs"))\r
-                            thisOpt = check_mixedReferences.CheckState == CheckState.Checked ? "mixed-refs=1" : "mixed-refs=0";\r
-                        else if (optNameToChange.Equals("weightb"))\r
-                            thisOpt = check_weightedBFrames.CheckState == CheckState.Checked ? "" : "weightb=0";\r
                         else if (optNameToChange.Equals("b-pyramid"))\r
-                            thisOpt = check_pyrmidalBFrames.CheckState == CheckState.Checked ? "b-pyramid=1" : "";\r
-                        else if (optNameToChange.Equals("no-fast-pskip"))\r
-                            thisOpt = check_noFastPSkip.CheckState == CheckState.Checked ? "no-fast-pskip=1" : "";\r
+                        {\r
+                            switch (combo_pyrmidalBFrames.SelectedIndex)\r
+                            {\r
+                                case 0: // Default\r
+                                    thisOpt = string.Empty;\r
+                                    break;\r
+                                case 1: // Off\r
+                                    thisOpt = "b-pyramid=none";\r
+                                    break;\r
+                                case 2: // Strict\r
+                                    thisOpt = "b-pyramid=strict";\r
+                                    break;\r
+                            }\r
+                        }\r
                         else if (optNameToChange.Equals("no-dct-decimate"))\r
-                            thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : "";\r
+                            thisOpt = check_noDCTDecimate.CheckState == CheckState.Checked ? "no-dct-decimate=1" : string.Empty;\r
                         else if (optNameToChange.Equals("8x8dct"))\r
-                            thisOpt = check_8x8DCT.CheckState == CheckState.Checked ? "8x8dct=1" : "8x8dct=0";\r
+                            thisOpt = check_8x8DCT.CheckState == CheckState.Unchecked ? "8x8dct=0" : string.Empty;\r
                         else if (optNameToChange.Equals("cabac"))\r
-                            thisOpt = check_Cabac.CheckState == CheckState.Checked ? "" : "cabac=0";\r
+                            thisOpt = check_Cabac.CheckState == CheckState.Checked ? string.Empty : "cabac=0";\r
+                        else if (optNameToChange.Equals("weightp"))\r
+                            thisOpt = check_weightp.CheckState == CheckState.Checked ? string.Empty : "weightp=0";\r
                         else if (optNameToChange.Equals("me"))\r
                         {\r
                             switch (drop_MotionEstimationMethod.SelectedIndex)\r
@@ -560,7 +539,7 @@ namespace Handbrake.Controls
                                     break;\r
 \r
                                 default:\r
-                                    thisOpt = "";\r
+                                    thisOpt = string.Empty;\r
                                     break;\r
                             }\r
                         }\r
@@ -585,7 +564,7 @@ namespace Handbrake.Controls
                                     break;\r
 \r
                                 default:\r
-                                    thisOpt = "";\r
+                                    thisOpt = string.Empty;\r
                                     break;\r
                             }\r
                         }\r
@@ -598,11 +577,15 @@ namespace Handbrake.Controls
                                     break;\r
 \r
                                 case 2:\r
+                                    thisOpt = "analyse=some";\r
+                                    break;\r
+\r
+                                case 3:\r
                                     thisOpt = "analyse=all";\r
                                     break;\r
 \r
                                 default:\r
-                                    thisOpt = "";\r
+                                    thisOpt = string.Empty;\r
                                     break;\r
                             }\r
                         }\r
@@ -610,47 +593,59 @@ namespace Handbrake.Controls
                         {\r
                             thisOpt = !drop_MotionEstimationRange.SelectedItem.ToString().Contains("Default")\r
                                           ? "merange=" + drop_MotionEstimationRange.SelectedItem\r
-                                          : "";\r
+                                          : string.Empty;\r
                         }\r
                         else if (optNameToChange.Equals("b-adapt"))\r
                         {\r
                             thisOpt = !drop_adaptBFrames.SelectedItem.ToString().Contains("Default")\r
                                           ? "b-adapt=" + (drop_adaptBFrames.SelectedIndex - 1)\r
-                                          : "";\r
+                                          : string.Empty;\r
                         }\r
                         else if (optNameToChange.Equals("ref"))\r
                         {\r
                             thisOpt = !drop_refFrames.SelectedItem.ToString().Contains("Default")\r
                                           ? "ref=" + drop_refFrames.SelectedItem\r
-                                          : "";\r
+                                          : string.Empty;\r
                         }\r
                         else if (optNameToChange.Equals("bframes"))\r
                         {\r
-                            String value = drop_bFrames.SelectedItem.ToString();\r
+                            string value = drop_bFrames.SelectedItem.ToString();\r
                             thisOpt = !drop_bFrames.SelectedItem.ToString().Contains("Default")\r
                                           ? "bframes=" + value\r
-                                          : "";\r
+                                          : string.Empty;\r
                         }\r
                         else if (optNameToChange.Equals("subq"))\r
                         {\r
-                            String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
+                            string value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
+                            string[] val = value.Split(':');\r
                             thisOpt = !drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default")\r
-                                          ? "subq=" + value\r
-                                          : "";\r
+                                          ? "subq=" + val[0]\r
+                                          : string.Empty;\r
                         }\r
                         else if (optNameToChange.Equals("trellis"))\r
                         {\r
-                            String value = drop_trellis.SelectedItem.ToString();\r
-                            thisOpt = !drop_trellis.SelectedItem.ToString().Contains("Default")\r
-                                          ? "trellis=" + value\r
-                                          : "";\r
+                            switch (drop_trellis.SelectedIndex)\r
+                            {\r
+                                case 1: // Off\r
+                                    thisOpt = "trellis=0";\r
+                                    break;\r
+                                case 2: // Encode Only\r
+                                    thisOpt = "trellis=1";\r
+                                    break;\r
+                                case 3: // Always\r
+                                    thisOpt = "trellis=2";\r
+                                    break;\r
+                                default:\r
+                                    thisOpt = string.Empty;\r
+                                    break;\r
+                            }\r
                         }\r
                     }\r
                 }\r
 \r
                 /* Construct New String for opts here */\r
-                if (!thisOpt.Equals(""))\r
-                    changedOptString = changedOptString.Equals("") ? thisOpt : changedOptString + ":" + thisOpt;\r
+                if (!thisOpt.Equals(string.Empty))\r
+                    changedOptString = changedOptString.Equals(string.Empty) ? thisOpt : changedOptString + ":" + thisOpt;\r
             }\r
 \r
             /* Change the option string to reflect the new mod settings */\r
@@ -662,11 +657,11 @@ namespace Handbrake.Controls
         /// Handles 2 cases.  1 Where rtf_x264Query.Text is empty, and one where there is an option with no value,\r
         /// e.g no-fast-pskip\r
         /// </summary>\r
-        /// <param name="optNameToChange"></param>\r
-        private void hasNoOptions(string optNameToChange)\r
+        /// <param name="optNameToChange">The Option Name to Change</param>\r
+        private void HasNoOptions(IEquatable<string> optNameToChange)\r
         {\r
-            string colon = "";\r
-            if (rtf_x264Query.Text != "")\r
+            string colon = string.Empty;\r
+            if (rtf_x264Query.Text != string.Empty)\r
                 colon = ":";\r
 \r
             string query = rtf_x264Query.Text;\r
@@ -731,6 +726,10 @@ namespace Handbrake.Controls
                         break;\r
 \r
                     case 2:\r
+                        query = query + colon + "analyse=some";\r
+                        break;\r
+\r
+                    case 3:\r
                         query = query + colon + "analyse=all";\r
                         break;\r
 \r
@@ -748,11 +747,10 @@ namespace Handbrake.Controls
                 int value = drop_adaptBFrames.SelectedIndex - 1;\r
                 query = query + colon + "b-adapt=" + value;\r
             }\r
-\r
             else if (optNameToChange.Equals("deblock"))\r
             {\r
-                String da = drop_deblockAlpha.SelectedItem.ToString();\r
-                String db = drop_deblockBeta.Text;\r
+                string da = drop_deblockAlpha.SelectedItem.ToString();\r
+                string db = drop_deblockBeta.Text;\r
 \r
                 if (((da.Contains("Default")) && (db.Contains("Default"))) || ((da.Contains("0")) && (db.Contains("0"))))\r
                 {\r
@@ -770,42 +768,45 @@ namespace Handbrake.Controls
                     query = query + colon + "deblock=" + da + "," + db;\r
                 }\r
             }\r
+            else if (optNameToChange.Equals("aq-strength"))\r
+            {\r
+                if (slider_adaptiveQuantStrength.Value == 10)\r
+                    query = string.Empty;\r
+                else\r
+                {\r
+                    double value = slider_adaptiveQuantStrength.Value * 0.1;\r
+                    string aqs = value.ToString("f1", culture);\r
+                    query += colon + "aq-strength=" + aqs;\r
+                }\r
+            }\r
             else if (optNameToChange.Equals("psy-rd"))\r
             {\r
                 if (slider_psyrd.Value == 10 && slider_psytrellis.Value == 0)\r
-                    query += "";\r
+                    query += string.Empty;\r
                 else\r
                 {\r
                     double psyrd = slider_psyrd.Value * 0.1;\r
-                    double psytre = slider_psytrellis.Value * 0.1;\r
+                    double psytre = slider_psytrellis.Value * 0.05;\r
 \r
-                    string rd = psyrd.ToString("f1");\r
-                    string rt = psytre.ToString("f1");\r
+                    string rd = psyrd.ToString("f1", culture);\r
+                    string rt = psytre.ToString("f2", culture);\r
 \r
                     query += colon + "psy-rd=" + rd + "," + rt;\r
                 }\r
             }\r
-            else if (optNameToChange.Equals("mixed-refs"))\r
-            {\r
-                if (check_mixedReferences.CheckState == CheckState.Checked)\r
-                    query = query + colon + "mixed-refs=1";\r
-                else\r
-                    query = query + colon + "mixed-refs=0";\r
-            }\r
-            else if (optNameToChange.Equals("weightb"))\r
-            {\r
-                if (check_weightedBFrames.CheckState != CheckState.Checked)\r
-                    query = query + colon + "weightb=0";\r
-            }\r
             else if (optNameToChange.Equals("b-pyramid"))\r
             {\r
-                if (check_pyrmidalBFrames.CheckState == CheckState.Checked)\r
-                    query = query + colon + "b-pyramid=1";\r
-            }\r
-            else if (optNameToChange.Equals("no-fast-pskip"))\r
-            {\r
-                if (check_noFastPSkip.CheckState == CheckState.Checked)\r
-                    query = query + colon + "no-fast-pskip=1";\r
+                switch (combo_pyrmidalBFrames.SelectedIndex)\r
+                {\r
+                    case 0:\r
+                        break;\r
+                    case 1:\r
+                        query = query + colon + "b-pyramid=none";\r
+                        break;\r
+                    case 2:\r
+                        query = query + colon + "b-pyramid=strict";\r
+                        break;\r
+                }\r
             }\r
             else if (optNameToChange.Equals("no-dct-decimate"))\r
             {\r
@@ -814,14 +815,19 @@ namespace Handbrake.Controls
             }\r
             else if (optNameToChange.Equals("8x8dct"))\r
             {\r
-                if (check_8x8DCT.CheckState == CheckState.Checked)\r
-                    query = query + colon + "8x8dct=1";\r
+                if (check_8x8DCT.CheckState == CheckState.Unchecked)\r
+                    query = query + colon + "8x8dct=0";\r
             }\r
             else if (optNameToChange.Equals("cabac"))\r
             {\r
                 if (check_Cabac.CheckState != CheckState.Checked)\r
                     query = query + colon + "cabac=0";\r
             }\r
+            else if (optNameToChange.Equals("weightp"))\r
+            {\r
+                if (check_weightp.CheckState == CheckState.Unchecked)\r
+                    query = query + colon + "weightp=0";\r
+            }\r
             else if (optNameToChange.Equals("ref"))\r
             {\r
                 if (!drop_refFrames.SelectedItem.ToString().Contains("Default"))\r
@@ -829,20 +835,35 @@ namespace Handbrake.Controls
             }\r
             else if (optNameToChange.Equals("bframes"))\r
             {\r
-                String value = drop_bFrames.SelectedItem.ToString();\r
+                string value = drop_bFrames.SelectedItem.ToString();\r
                 if (!drop_bFrames.SelectedItem.ToString().Contains("Default"))\r
                     query = query + colon + "bframes=" + value;\r
             }\r
             else if (optNameToChange.Equals("subq"))\r
             {\r
-                String value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
+                string value = drop_subpixelMotionEstimation.SelectedItem.ToString();\r
                 if (!drop_subpixelMotionEstimation.SelectedItem.ToString().Contains("Default"))\r
-                    query = query + colon + "subq=" + value;\r
+                {\r
+                    string[] val = value.Split(':');\r
+                    query = query + colon + "subq=" + val[0];\r
+                }\r
             }\r
             else if (optNameToChange.Equals("trellis"))\r
             {\r
-                if (!drop_trellis.SelectedItem.ToString().Contains("Default"))\r
-                    query = query + colon + "trellis=" + drop_trellis.SelectedItem;\r
+                switch (drop_trellis.SelectedIndex)\r
+                {\r
+                    case 1: // Off\r
+                        query = query + colon + "trellis=0";\r
+                        break;\r
+                    case 2: // Encode Only\r
+                        query = query + colon + "trellis=1";\r
+                        break;\r
+                    case 3: // Always\r
+                        query = query + colon + "trellis=2";\r
+                        break;\r
+                    default:\r
+                        break;\r
+                }\r
             }\r
 \r
             rtf_x264Query.Text = query;\r
@@ -851,33 +872,30 @@ namespace Handbrake.Controls
         /// <summary>\r
         /// Shows and hides controls based on the values of other controls.\r
         /// </summary>\r
-        /// <param name="sender"></param>\r
-        private void animate(string sender)\r
+        /// <param name="sender">The Sender</param>\r
+        private void Animate(string sender)\r
         {\r
             /* Lots of situations to cover.\r
-                  - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)\r
-                  - CABAC (when 0 turn off trellis)\r
-                  - analysis (if none, turn off 8x8dct)\r
-                  - refs (under 2, disable mixed-refs)\r
-                  - subme (if under 6, turn off psy-rd and psy-trel)\r
-                  - trellis (if 0, turn off psy-trel)\r
-               */\r
-\r
-            switch(sender)\r
+               - B-frames (when 0 turn of b-frame specific stuff, when < 2 disable b-pyramid)\r
+               - CABAC (when 0 turn off trellis and psy-trel\r
+               - subme (if under 6, turn off psy-rd and psy-trel)\r
+               - trellis (if 0, turn off psy-trel)\r
+             */\r
+\r
+            switch (sender)\r
             {\r
                 case "bframes":\r
-                    if (drop_bFrames.SelectedIndex >0 && drop_bFrames.SelectedIndex < 2  )\r
+                    if (drop_bFrames.SelectedIndex == 1)\r
                     {\r
-                        /* If the b-frame widget is at 0 or 1, the user has chosen\r
+                        /* If the b-frame widget is at 1, the user has chosen\r
                            not to use b-frames at all. So disable the options\r
                            that can only be used when b-frames are enabled.        */\r
-                        check_weightedBFrames.Visible = false;\r
-                        check_pyrmidalBFrames.Visible = false;\r
+                        combo_pyrmidalBFrames.Visible = false;\r
+                        lbl_prymidalBframes.Visible = false;\r
                         drop_directPrediction.Visible = false;\r
                         lbl_direct_prediction.Visible = false;\r
 \r
-                        check_weightedBFrames.CheckState = CheckState.Unchecked;\r
-                        check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
+                        combo_pyrmidalBFrames.SelectedIndex = 0;\r
                         drop_directPrediction.SelectedIndex = 0;\r
 \r
                         drop_adaptBFrames.Visible = false;\r
@@ -887,10 +905,10 @@ namespace Handbrake.Controls
                     else if (drop_bFrames.SelectedIndex == 2)\r
                     {\r
                         /* Only 1 b-frame? Disable b-pyramid. */\r
-                        check_pyrmidalBFrames.Visible = false;\r
-                        check_pyrmidalBFrames.CheckState = CheckState.Unchecked;\r
+                        combo_pyrmidalBFrames.Visible = false;\r
+                        lbl_prymidalBframes.Visible = false;\r
+                        combo_pyrmidalBFrames.SelectedIndex = 0;\r
 \r
-                        check_weightedBFrames.Visible = true;\r
                         drop_directPrediction.Visible = true;\r
                         lbl_direct_prediction.Visible = true;\r
 \r
@@ -899,51 +917,16 @@ namespace Handbrake.Controls
                     }\r
                     else\r
                     {\r
-                        check_weightedBFrames.Visible = true;\r
-                        check_pyrmidalBFrames.Visible = true;\r
+                        combo_pyrmidalBFrames.Visible = true;\r
+                        lbl_prymidalBframes.Visible = true;\r
                         drop_directPrediction.Visible = true;\r
                         lbl_direct_prediction.Visible = true;\r
 \r
                         drop_adaptBFrames.Visible = true;\r
                         lbl_adaptBFrames.Visible = true;\r
                     }\r
-                break;\r
-                case "cabac":\r
-                    if (check_Cabac.Checked == false)\r
-                    {\r
-                        /* Without CABAC entropy coding, trellis doesn't run. */\r
-                        drop_trellis.Visible = false;\r
-                        drop_trellis.SelectedIndex = 0;\r
-                        lbl_trellis.Visible = false;\r
-                    }\r
-                    else\r
-                    {\r
-                        drop_trellis.Visible = true;\r
-                        lbl_trellis.Visible = true;\r
-                    }\r
-                break;\r
-                case "analyse":\r
-                    if (drop_analysis.SelectedIndex == 1)\r
-                    {\r
-                        /* No analysis? Disable 8x8dct */\r
-                        check_8x8DCT.Visible = false;\r
-                        if (sender != "8x8dct")\r
-                            check_8x8DCT.CheckState = CheckState.Unchecked;\r
-                    }\r
-                    else\r
-                        check_8x8DCT.Visible = true;\r
-                break;\r
-                case "ref":\r
-                    if (drop_refFrames.SelectedIndex > 0 && drop_refFrames.SelectedIndex < 3)\r
-                    {\r
-                        check_mixedReferences.Visible = false;\r
-                        if (sender != "mixed-refs")\r
-                            check_mixedReferences.CheckState = CheckState.Unchecked;\r
-                    }\r
-                    else\r
-                        check_mixedReferences.Visible = true;\r
-                break;\r
-                case "me":        // Motion Estimation\r
+                    break;\r
+                case "me": // Motion Estimation\r
                     if (drop_MotionEstimationMethod.SelectedIndex < 3)\r
                     {\r
                         drop_MotionEstimationRange.Visible = false;\r
@@ -955,15 +938,15 @@ namespace Handbrake.Controls
                         drop_MotionEstimationRange.Visible = true;\r
                         lbl_merange.Visible = true;\r
                     }\r
-                break;\r
-                case "subq":        // subme\r
-                    if (drop_subpixelMotionEstimation.SelectedIndex != 0 && drop_subpixelMotionEstimation.SelectedIndex < 7)\r
+                    break;\r
+                case "subq": // subme\r
+                    if (drop_subpixelMotionEstimation.SelectedIndex != 0 &&\r
+                        drop_subpixelMotionEstimation.SelectedIndex < 7)\r
                     {\r
                         slider_psyrd.Visible = false;\r
                         slider_psyrd.Value = 10;\r
                         lbl_psyrd.Visible = false;\r
 \r
-\r
                         slider_psytrellis.Visible = false;\r
                         slider_psytrellis.Value = 0;\r
                         lbl_psytrellis.Visible = false;\r
@@ -973,15 +956,15 @@ namespace Handbrake.Controls
                         slider_psyrd.Visible = true;\r
                         lbl_psyrd.Visible = true;\r
 \r
-                        if (drop_trellis.SelectedIndex >= 2 && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
+                        if (drop_trellis.SelectedIndex >= 2 && slider_psytrellis.Visible == false)\r
                         {\r
                             slider_psytrellis.Visible = true;\r
                             lbl_psytrellis.Visible = true;\r
                         }\r
                     }\r
-                break;\r
-                case "trellis":        // subme\r
-                    if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2 )\r
+                    break;\r
+                case "trellis": // subme\r
+                    if (drop_trellis.SelectedIndex > 0 && drop_trellis.SelectedIndex < 2)\r
                     {\r
                         slider_psytrellis.Visible = false;\r
                         slider_psytrellis.Value = 0;\r
@@ -989,14 +972,105 @@ namespace Handbrake.Controls
                     }\r
                     else\r
                     {\r
-                        if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && check_Cabac.Checked && slider_psytrellis.Visible == false)\r
+                        if ((drop_subpixelMotionEstimation.SelectedIndex == 0 || drop_subpixelMotionEstimation.SelectedIndex >= 7) && slider_psytrellis.Visible == false)\r
                         {\r
                             slider_psytrellis.Visible = true;\r
                             lbl_psytrellis.Visible = true;\r
                         }\r
                     }\r
-                break;\r
+                    break;\r
             }\r
         }\r
+\r
+        /* UI Events */\r
+\r
+        private void widgetControlChanged(object sender, EventArgs e)\r
+        {\r
+            Control changedControlName = (Control) sender;\r
+            string controlName = string.Empty;\r
+\r
+            switch (changedControlName.Name.Trim())\r
+            {\r
+                case "drop_refFrames":\r
+                    controlName = "ref";\r
+                    break;\r
+                case "drop_bFrames":\r
+                    controlName = "bframes";\r
+                    break;\r
+                case "drop_directPrediction":\r
+                    controlName = "direct";\r
+                    break;\r
+                case "check_weightp":\r
+                    controlName = "weightp";\r
+                    break;\r
+                case "combo_pyrmidalBFrames":\r
+                    controlName = "b-pyramid";\r
+                    break;\r
+                case "drop_MotionEstimationMethod":\r
+                    controlName = "me";\r
+                    break;\r
+                case "drop_MotionEstimationRange":\r
+                    controlName = "merange";\r
+                    break;\r
+                case "drop_subpixelMotionEstimation":\r
+                    controlName = "subq";\r
+                    break;\r
+                case "drop_analysis":\r
+                    controlName = "analyse";\r
+                    break;\r
+                case "check_8x8DCT":\r
+                    controlName = "8x8dct";\r
+                    break;\r
+                case "drop_deblockAlpha":\r
+                    controlName = "deblock";\r
+                    break;\r
+                case "drop_deblockBeta":\r
+                    controlName = "deblock";\r
+                    break;\r
+                case "drop_trellis":\r
+                    controlName = "trellis";\r
+                    break;\r
+                case "check_noDCTDecimate":\r
+                    controlName = "no-dct-decimate";\r
+                    break;\r
+                case "check_Cabac":\r
+                    controlName = "cabac";\r
+                    break;\r
+                case "slider_psyrd":\r
+                    controlName = "psy-rd";\r
+                    break;\r
+                case "slider_psytrellis":\r
+                    controlName = "psy-rd";\r
+                    break;\r
+                case "slider_adaptiveQuantStrength":\r
+                    controlName = "aq-strength";\r
+                    break;\r
+                case "drop_adaptBFrames":\r
+                    controlName = "b-adapt";\r
+                    break;\r
+            }\r
+            OnX264WidgetChange(controlName);\r
+        }\r
+\r
+        private void rtf_x264Query_TextChanged(object sender, EventArgs e)\r
+        {\r
+            if (rtf_x264Query.Text.EndsWith("\n"))\r
+            {\r
+                string query = rtf_x264Query.Text.Replace("\n", string.Empty);\r
+                Reset2Defaults();\r
+                rtf_x264Query.Text = query;\r
+                this.StandardizeOptString();\r
+                this.SetCurrentSettingsInPanel();\r
+\r
+                if (rtf_x264Query.Text == string.Empty)\r
+                    Reset2Defaults();\r
+            }\r
+        }\r
+\r
+        private void btn_reset_Click(object sender, EventArgs e)\r
+        {\r
+            rtf_x264Query.Text = string.Empty;\r
+            Reset2Defaults();\r
+        }\r
     }\r
 }
\ No newline at end of file
index 064df4a..094e31a 100644 (file)
   <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>17, 17</value>\r
   </metadata>\r
-  <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>17, 17</value>\r
-  </metadata>\r
   <data name="slider_psyrd.ToolTip" xml:space="preserve">\r
     <value>Psychovisual Rate Distortion Optimization sure is a mouthful, isn't it? Basically, it means x264 tries to retain detail, for better quality to the human eye, \r
 as opposed to trying to maximize quality the way a computer understands it, through signal-to-noise ratios that have trouble telling apart fine detail and noise.</value>\r
   </data>\r
   <data name="drop_adaptBFrames.ToolTip" xml:space="preserve">\r
-    <value>When adaptive B-Frames are disabled, the number of B-Frames you specify is the constant length of every B-Frame sequence. \r
-When one of the adaptive modes is enabled, the number of B-Frames is treated as a maximum, with the length of each sequence varying, but never exceeding the max.\r
+    <value>x264 has a variety of algorithms to decide when to use B-frames and how many to use.\r
 \r
-Fast mode takes the same amount of time no matter how many B-frames you specify. However, it doesn't always make the best decisions on how many B-Frames to use in a sequence.\r
+Fast mode takes roughly the same amount of time no matter how many B-frames you specify.  However, while fast, its decisions are often suboptimal.\r
 \r
-Optimal mode gets slower as the maximum number of B-Frames increases, but does a much better job at deciding sequence length, which can mean smaller file sizes and better quality.</value>\r
+Optimal mode gets slower as the maximum number of B-Frames increases, but makes much more accurate decisions, especially when used with B-pyramid.</value>\r
   </data>\r
   <data name="check_Cabac.ToolTip" xml:space="preserve">\r
-    <value>CABAC, or context adaptive binary arithmetic coding, is used by x264 to reduce the bitrate needed for a given quality by 15\%. \r
-This makes it very cool and very useful, and it should be left on whenever possible. However, it is incompatible with the iPod, and makes the AppleTV struggle. So turn it off for those.\r
-\r
-CABAC is a kind of entropy coding, which means that it compresses data by making shorthand symbols to represent long streams of data. The \"entropy\" part means that the symbols it uses the most often are the smallest. \r
-When you disable CABAC, another entropy coding scheme gets enabled, called CAVLC (context adaptive variable-length coding). \r
-CAVLC is a lot less efficient, which is why it needs 15\% more bitrate to achieve the same quality as CABAC.</value>\r
+    <value>After the encoder has done its work, it has a bunch of data that needs to be compressed losslessly, similar to ZIP or RAR.  \r
+H.264 provides two options for this: CAVLC and CABAC.  CABAC decodes a lot slower but compresses significantly better (10-30%), especially at lower bitrates.  \r
+If you're looking to minimize CPU requirements for video playback, disable this option.\r
+Baseline profile, as required for iPods and similar devices, requires CABAC to be disabled.</value>\r
   </data>\r
   <data name="check_noDCTDecimate.ToolTip" xml:space="preserve">\r
-    <value>To save space, x264 will \"zero out\" blocks when it thinks they won't be perceptible by the viewer. \r
-This negligibly reduces quality, but in rare cases it can mess up and produce visible artifacts. \r
-This situation can be alleviated by telling x264 not to decimate DCT blocks.\r
-\r
-It increases quality but also bitrate/file size, so if you use it when you've specified a target bitrate you will end up with a worse picture than without it. \r
-However, when used with constant quality encoding, or if you boost the average bitrate to compensate, you might get a better result.</value>\r
+    <value>x264 normally zeroes out nearly-empty data blocks to save bits to be better used for some other purpose in the video.  \r
+However, this can sometimes have slight negative effects on retention of subtle grain and dither.  \r
+Don't touch this unless you're having banding issues or other such cases where you are having trouble keeping fine noise.</value>\r
   </data>\r
   <data name="drop_trellis.ToolTip" xml:space="preserve">\r
-    <value>Trellis fine-tunes how bitrate is doled out, so it can reduce file size/bitrate or increase quality. \r
-A value of 1 means it only fine-tunes the final encode of a block of pixels, while 2 means it is considered during earlier phases of the decision-making process as well.</value>\r
+    <value>Trellis fine-tunes the rounding of transform coefficients to squeeze out 3-5% more compression at the cost of some speed. \r
+"Always" uses trellis not only during the main encoding process, but also during analysis, which improves compression even \r
+more, albeit at great speed cost. \r
+\r
+Trellis costs more speed at higher bitrates</value>\r
   </data>\r
   <data name="drop_deblockBeta.ToolTip" xml:space="preserve">\r
-    <value>x264 includes an in-loop deblocking filter. What this means is that blocky compression artifacts are smoothed away when you play back the video\r
-It has two settings: strength and threshold, just like a simple filter in Photoshop.\r
+    <value>H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame.  This not only improves visual quality, but also helps compression significantly\r
+The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.\r
 \r
-Strength controls the amount of deblocking applied to the whole frame. If you drop down below 0, you reduce the amount of blurring. \r
-Go too negative, and you'll get an effect somewhat like oversharpening an image. Go into positive values, and the image may become too soft.\r
-\r
-Threshold controls how sensitive the filter is to whether something in a block is detail that needs to be preserved: lower numbers blur details less.\r
-\r
-The default deblocking values are 0 and 0. \r
-This does not mean zero deblocking. \r
-It means x264 will apply the regular deblocking strength and thresholds the codec authors have selected as working the best in most cases.\r
-\r
-While many, many people stick with the default deblocking values of 0,0, and you should never change the deblocking without disabling adaptive quantization, \r
-other people disagree. \r
-Some prefer a slightly less blurred image for live action material, and use values like -2,-1 or -2,-2. Others will raise it to 1,1 or even 3,3 for animation. \r
-While the values for each setting extend from -6 to 6, the consensus is that going below -3 or above 3 is worthless.</value>\r
+The deblocking filter has two adjustable parameters, \"strength\" and \"threshold\". \r
+The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few)  edges it applies to. \r
+Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</value>\r
   </data>\r
   <data name="drop_deblockAlpha.ToolTip" xml:space="preserve">\r
-    <value>x264 includes an in-loop deblocking filter. What this means is that blocky compression artifacts are smoothed away when you play back the video. \r
-It has two settings: strength and threshold, just like a simple filter in Photoshop.\r
-\r
-Strength controls the amount of deblocking applied to the whole frame. If you drop down below 0, you reduce the amount of blurring. \r
-Go too negative, and you'll get an effect somewhat like oversharpening an image. Go into positive values, and the image may become too soft.\r
-\r
-Threshold controls how sensitive the filter is to whether something in a block is detail that needs to be preserved: lower numbers blur details less.\r
+    <value>H.264 has a built-in deblocking filter that smooths out blocking artifacts after decoding each frame.  This not only improves visual quality, but also helps compression significantly. \r
+The deblocking filter takes a lot of CPU power, so if you're looking to minimize CPU requirements for video playback, disable it.\r
 \r
-The default deblocking values are 0 and 0. \r
-This does not mean zero deblocking. \r
-It means x264 will apply the regular deblocking strength and thresholds the codec authors have selected as working the best in most cases.\r
-\r
-While many, many people stick with the default deblocking values of 0,0, and you should never change the deblocking without disabling adaptive quantization, \r
-other people disagree. \r
-Some prefer a slightly less blurred image for live action material, and use values like -2,-1 or -2,-2. Others will raise it to 1,1 or even 3,3 for animation. \r
-While the values for each setting extend from -6 to 6, the consensus is that going below -3 or above 3 is worthless.</value>\r
+The deblocking filter has two adjustable parameters, \"strength\" and \"threshold\". \r
+The former controls how strong (or weak) the deblocker is, while the latter controls how many (or few)  edges it applies to. \r
+Lower values mean less deblocking, higher values mean more deblocking. The default is 0 (normal strength) for both parameters.</value>\r
   </data>\r
   <data name="check_8x8DCT.ToolTip" xml:space="preserve">\r
-    <value>Checking this box lets x264 break key frames down into 8x8 blocks of pixels for analysis. \r
-This is a high profile feature of H.264, which makes it less compatible. It should slightly decrease bitrate or improve quality. \r
-Turn it on whenever possible.</value>\r
+    <value>The 8x8 transform is the single most useful feature of x264 in terms of compression-per-speed.  \r
+It improves compression by at least 5% at a very small speed cost and may provide an unusually high visual quality benefit compared to its compression gain.  \r
+However, it requires High Profile, which many devices may not support.</value>\r
   </data>\r
   <data name="drop_analysis.ToolTip" xml:space="preserve">\r
-    <value>Analysis controls how finely x264 divides up a frame to capture detail. Full macroblocks are 16x16 pixels, but x264 can go down all the way to 4x4 blocks if it judges it necessary. \r
-By default it only breaks up key frames that much. To give x264 the freedom to make the best decisions for all frames, use \"all\" analysis. \r
-If you want to create a high profile H.264 video (which is less compatible with the world at large than main profile), also check the \"8x8 DCT blocks\" box to add yet another block size for analysis.</value>\r
+    <value>Mode decision picks from a variety of options to make its decision: this option chooses what options those are.  \r
+Fewer partitions to check means faster encoding, at the cost of worse decisions, since the best option might have been one that was turned off.</value>\r
   </data>\r
   <data name="drop_subpixelMotionEstimation.ToolTip" xml:space="preserve">\r
-    <value>This setting is finer-grained than the motion estimation settings above. Instead of dealing with whole pixels, it deals with 4 fractional pixels, or quarter pixels (qpel). \r
-Higher levels increase quality by further refining the motion prediction for these quarter pixels, but take longer to encode.\r
+    <value>This setting controls both subpixel-precision motion estimation and mode decision methods.\r
+\r
+Subpixel motion estimation is used for refining motion estimates beyond mere pixel accuracy, improving compression.\r
+\r
+Mode decision is the method used to choose how to encode each block of the frame: a very important decision.\r
 \r
-Level 6, turns on a feature called rate distortion optimization, including psychovisual enhancements. \r
-7, the default, enables that rate distortion for B-frames.\r
-8 refines those decisions for I and P frames, and 9 adds on refinement for B-frames as well.</value>\r
+SAD is the fastest method, followed by SATD, RD, RD refinement, and the slowest, QPRD.\r
+6 or higher is strongly recommended: Psy-RD, a very powerful psy optimization that helps retain detail, requires RD.\r
+10, the most powerful and slowest option, requires trellis=2.</value>\r
   </data>\r
   <data name="drop_MotionEstimationRange.ToolTip" xml:space="preserve">\r
-    <value>This range is the radius, in pixels, x264 should use for motion estimation searches. \r
-It only has an effect when you use Uneven Multi-Hexagonal, Exhaustive, or Transformed Exhaustive searching. \r
-24, 32, and 64 are good values, with each being progressively smaller for progressively less improvement to picture quality.</value>\r
+    <value>This is the distance x264 searches from its best guess at the motion of a block in order to try to find its actual motion.  \r
+Doesn't apply to Diamond or Hexagon search options.  \r
+The default is fine for most content, but extremely high motion video, especially at HD resolutions, may benefit from higher ranges, albeit at a high speed cost.</value>\r
   </data>\r
   <data name="drop_MotionEstimationMethod.ToolTip" xml:space="preserve">\r
-    <value>Controls the motion estimation method. \r
-Motion estimation is how the encoder decides how each block of pixels in a frame has moved, compared to most similar blocks in the other frames it references. \r
-There are many ways of finding the most similar blocks, with varying speeds and accuracy.\r
+    <value>Controls the motion estimation method. Motion estimation is how the encoder estimates how each block of pixels in a frame has moved.  \r
+A better motion search method improves compression at the cost of speed.\r
+\r
+Diamond: performs an extremely fast and simple search using a diamond pattern.\r
+\r
+Hexagon: performs a somewhat more effective but slightly slower search using a hexagon pattern.\r
 \r
-At the most basic setting, dia, x264 will only consider a diamond-shaped region around each pixel.\r
+Uneven Multi-Hex: performs a very wide search using a variety of patterns, more accurately capturing complex motion.\r
 \r
-The default setting, hex, is similar to dia but uses a hexagon shape.\r
+Exhaustive: performs a \"dumb\" search of every pixel in a wide area.  Significantly slower for only a small compression gain.\r
 \r
-Uneven multi-hexagon, umh, searches a number of different patterns across a wider area and thus is slower than hex and dia but further increases compression efficiency and quality.\r
+Transformed Exhaustive: Like exhaustive, but makes even more accurate decisions. Accordingly, somewhat slower, also for only a small improvement.</value>\r
+  </data>\r
+  <data name="drop_directPrediction.ToolTip" xml:space="preserve">\r
+    <value>H.264 allows for two different prediction modes, spatial and temporal, in B-frames.\r
 \r
-esa, an exhaustive search of a square around each pixel (whose size is controlled by the me-range parameter), is much slower and offers only minimal quality gains.\r
+Spatial, the default, is almost always better, but temporal is sometimes useful too.\r
 \r
-tesa, transformed exhaustive search, which performs just as thorough a search, is slower still but offers further slight improvements to quality.</value>\r
+x264 can, at the cost of a small amount of speed (and accordingly for a small compression gain), adaptively select which is better for each particular frame.</value>\r
   </data>\r
-  <data name="check_pyrmidalBFrames.ToolTip" xml:space="preserve">\r
-    <value>B-frame pyramids are a High Profile feature. Pyramidal B-frames mean that B-frames don't just reference surrounding reference frames - \r
-instead, it also treats a previous B-frame as a reference, improving quality/lowering bitrate at the expense of complexity. \r
-Logically, to reference an earlier B-frame, you must tell x264 to use at least 2 B-frames.</value>\r
+  <data name="drop_bFrames.ToolTip" xml:space="preserve">\r
+    <value>Sane values are ~2-5.  \r
+This specifies the maximum number of sequential B-frames that the encoder can use. \r
+ Large numbers generally won't help significantly unless Adaptive B-frames is set to Optimal.  \r
+Cel-animated source material and B-pyramid also significantly increase the usefulness of larger values. \r
+Baseline profile, as required for iPods and similar devices, requires B-frames to be set to 0 (off).</value>\r
   </data>\r
-  <data name="check_weightedBFrames.ToolTip" xml:space="preserve">\r
-    <value>Sometimes x264 will base a B-frame's motion compensation on frames both before and after. \r
-With weighted B-frames, the amount of influence each frame has is related to its distance from the frame being encoded, \r
-instead of both having equal influence. \r
-The AppleTV can have issues with this.</value>\r
+  <data name="drop_refFrames.ToolTip" xml:space="preserve">\r
+    <value>Sane values are ~1-6.  \r
+The more you add, the better the compression, but the slower the encode.  \r
+Cel animation tends to benefit from more reference frames a lot more than film content. \r
+Note that many hardware devices have limitations on the number of supported reference frames, so if you're encoding for a handheld or standalone player, \r
+don't touch this unless you're absolutely sure you know what you're doing!</value>\r
   </data>\r
-  <data name="drop_directPrediction.ToolTip" xml:space="preserve">\r
-    <value>Direct prediction tells x264 what method to use when guessing motion for certain parts of a B-frame. \r
-It can either look at other parts of the current frame (spatial) or compare against the following P-frameframe (temporal). \r
-You're best off setting this to automatic, so x264 decides which method is best on its own. \r
-Don't select none assuming it will be faster; instead it will take longer and look worse. If you're going to choose between spatial and temporal, spatial is usually better.</value>\r
+  <data name="check_weightp.ToolTip" xml:space="preserve">\r
+    <value>Performs extra analysis to decide upon weighting parameters for each frame.  \r
+This improves overall compression slightly and improves the quality of fades greatly. \r
+Baseline profile, as required for iPods and similar devices, requires weighted P-frame prediction to be disabled.  \r
+Note that some devices and players, even those that support Main Profile, \r
+may have problems with Weighted P-frame prediction: the Apple TV is completely incompatible with it, for example.</value>\r
+  </data>\r
+  <data name="combo_pyrmidalBFrames.ToolTip" xml:space="preserve">\r
+    <value>B-pyramid improves compression by creating a pyramidal structure (hence the name) of B-frames, allowing B-frames to \r
+reference each other to improve compression.  \r
+\r
+Requires Max B-frames greater than 1; optimal adaptive B-frames is strongly recommended for full compression benefit.</value>\r
   </data>\r
 </root>
\ No newline at end of file
index 6f8efaa..18919fe 100644 (file)
@@ -1,34 +1,62 @@
 /*  Main.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using System.Diagnostics;\r
-using System.Text.RegularExpressions;\r
-using System.Collections.Generic;\r
-using System.Xml.Serialization;\r
-using System.Threading;\r
-using Handbrake.EncodeQueue;\r
-using System.Net;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Functions\r
 {\r
-    static class Main\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Text;\r
+    using System.Text.RegularExpressions;\r
+    using System.Windows.Forms;\r
+    using System.Xml.Serialization;\r
+\r
+    using HandBrake.Framework.Services;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Parsing;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// Useful functions which various screens can use.\r
+    /// </summary>\r
+    public static class Main\r
     {\r
-        // Private Variables\r
-        private static readonly XmlSerializer ser = new XmlSerializer(typeof(List<Job>));\r
+        /// <summary>\r
+        /// The Error Service\r
+        /// </summary>\r
+        private static readonly IErrorService errorService = new ErrorService();\r
+\r
+        /// <summary>\r
+        /// The XML Serializer\r
+        /// </summary>\r
+        private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<Job>));\r
 \r
         /// <summary>\r
         /// Calculate the duration of the selected title and chapters\r
         /// </summary>\r
-        public static TimeSpan calculateDuration(int chapterStart, int chapterEnd, Parsing.Title selectedTitle)\r
+        /// <param name="chapterStart">\r
+        /// The chapter Start.\r
+        /// </param>\r
+        /// <param name="chapterEnd">\r
+        /// The chapter End.\r
+        /// </param>\r
+        /// <param name="selectedTitle">\r
+        /// The selected Title.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The calculated duration.\r
+        /// </returns>\r
+        public static TimeSpan CalculateDuration(int chapterStart, int chapterEnd, Title selectedTitle)\r
         {\r
             TimeSpan duration = TimeSpan.FromSeconds(0.0);\r
-            chapterStart++; chapterEnd++;\r
+            chapterStart++;\r
+            chapterEnd++;\r
             if (chapterStart != 0 && chapterEnd != 0 && chapterEnd <= selectedTitle.Chapters.Count)\r
             {\r
                 for (int i = chapterStart; i <= chapterEnd; i++)\r
@@ -39,28 +67,22 @@ namespace Handbrake.Functions
         }\r
 \r
         /// <summary>\r
-        /// Select the longest title in the DVD title dropdown menu on frmMain\r
-        /// </summary>\r
-        public static Parsing.Title selectLongestTitle(Parsing.DVD thisDvd)\r
-        {\r
-            TimeSpan longestDurationFound = TimeSpan.FromSeconds(0.0);\r
-            Parsing.Title returnTitle = null;\r
-\r
-            foreach (Parsing.Title item in thisDvd.Titles)\r
-            {\r
-                if (item.Duration > longestDurationFound)\r
-                {\r
-                    returnTitle = item;\r
-                    longestDurationFound = item.Duration;\r
-                }\r
-            }\r
-            return returnTitle;\r
-        }\r
-\r
-        /// <summary>\r
         /// Set's up the DataGridView on the Chapters tab (frmMain)\r
         /// </summary>\r
-        public static DataGridView chapterNaming(DataGridView dataChpt, string chapterEnd)\r
+        /// <param name="title">\r
+        /// The currently selected title object.\r
+        /// This will be used to get chapter names if they exist.\r
+        /// </param>\r
+        /// <param name="dataChpt">\r
+        /// The DataGridView Control\r
+        /// </param>\r
+        /// <param name="chapterEnd">\r
+        /// The chapter End.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The chapter naming.\r
+        /// </returns>\r
+        public static DataGridView ChapterNaming(Title title, DataGridView dataChpt, string chapterEnd)\r
         {\r
             int i = 0, finish = 0;\r
 \r
@@ -69,9 +91,18 @@ namespace Handbrake.Functions
 \r
             while (i < finish)\r
             {\r
+                string chapterName = string.Empty;\r
+                if (title != null)\r
+                {\r
+                    if (title.Chapters.Count <= i && title.Chapters[i] != null)\r
+                    {\r
+                        chapterName = title.Chapters[i].ChapterName;\r
+                    }\r
+                }\r
+\r
                 int n = dataChpt.Rows.Add();\r
-                dataChpt.Rows[n].Cells[0].Value = (i + 1);\r
-                dataChpt.Rows[n].Cells[1].Value = "Chapter " + (i + 1);\r
+                dataChpt.Rows[n].Cells[0].Value = i + 1;\r
+                dataChpt.Rows[n].Cells[1].Value = string.IsNullOrEmpty(chapterName) ? "Chapter " + (i + 1) : chapterName;\r
                 dataChpt.Rows[n].Cells[0].ValueType = typeof(int);\r
                 dataChpt.Rows[n].Cells[1].ValueType = typeof(string);\r
                 i++;\r
@@ -83,10 +114,14 @@ namespace Handbrake.Functions
         /// <summary>\r
         /// Import a CSV file which contains Chapter Names\r
         /// </summary>\r
-        /// <param name="dataChpt"></param>\r
-        /// <param name="filename"></param>\r
-        /// <returns></returns>\r
-        public static DataGridView importChapterNames(DataGridView dataChpt, string filename)\r
+        /// <param name="dataChpt">\r
+        /// The DataGridView Control\r
+        /// </param>\r
+        /// <param name="filename">\r
+        /// The filepath and name\r
+        /// </param>\r
+        /// <returns>A Populated DataGridView</returns>\r
+        public static DataGridView ImportChapterNames(DataGridView dataChpt, string filename)\r
         {\r
             IDictionary<int, string> chapterMap = new Dictionary<int, string>();\r
             try\r
@@ -95,12 +130,13 @@ namespace Handbrake.Functions
                 string csv = sr.ReadLine();\r
                 while (csv != null)\r
                 {\r
-                    if (csv.Trim() != "")\r
+                    if (csv.Trim() != string.Empty)\r
                     {\r
+                        csv = csv.Replace("\\,", "<!comma!>");\r
                         string[] contents = csv.Split(',');\r
                         int chapter;\r
                         int.TryParse(contents[0], out chapter);\r
-                        chapterMap.Add(chapter, contents[1]);\r
+                        chapterMap.Add(chapter, contents[1].Replace("<!comma!>", ","));\r
                     }\r
                     csv = sr.ReadLine();\r
                 }\r
@@ -121,34 +157,81 @@ namespace Handbrake.Functions
         }\r
 \r
         /// <summary>\r
+        /// Create a CSV file with the data from the Main Window Chapters tab\r
+        /// </summary>\r
+        /// <param name="mainWindow">Main Window</param>\r
+        /// <param name="filePathName">Path to save the csv file</param>\r
+        /// <returns>True if successful </returns>\r
+        public static bool SaveChapterMarkersToCsv(frmMain mainWindow, string filePathName)\r
+        {\r
+            try\r
+            {\r
+                string csv = string.Empty;\r
+\r
+                foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)\r
+                {\r
+                    csv += row.Cells[0].Value.ToString();\r
+                    csv += ",";\r
+                    csv += row.Cells[1].Value.ToString().Replace(",", "\\,");\r
+                    csv += Environment.NewLine;\r
+                }\r
+                StreamWriter file = new StreamWriter(filePathName);\r
+                file.Write(csv);\r
+                file.Close();\r
+                file.Dispose();\r
+                return true;\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                ShowExceptiowWindow("Unable to save Chapter Makrers file! \nChapter marker names will NOT be saved in your encode", exc.ToString());\r
+                return false;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
         /// Function which generates the filename and path automatically based on \r
         /// the Source Name, DVD title and DVD Chapters\r
         /// </summary>\r
-        public static string autoName(frmMain mainWindow) //ComboBox drpDvdtitle, string chapter_start, string chatper_end, string source, string dest, int format, Boolean chapters)\r
+        /// <param name="mainWindow">\r
+        /// The main Window.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The Generated FileName\r
+        /// </returns>\r
+        public static string AutoName(frmMain mainWindow)\r
         {\r
-            string AutoNamePath = string.Empty;\r
+            string autoNamePath = string.Empty;\r
             if (mainWindow.drp_dvdtitle.Text != "Automatic")\r
             {\r
-                // Get the Source Name \r
-                string sourceName = mainWindow.SourceName;\r
+                // Get the Source Name and remove any invalid characters\r
+\r
+                string sourceName = Path.GetInvalidFileNameChars().Aggregate(Path.GetFileNameWithoutExtension(mainWindow.SourceName), (current, character) => current.Replace(character.ToString(), string.Empty));\r
+\r
+                if (Properties.Settings.Default.AutoNameRemoveUnderscore)\r
+                    sourceName = sourceName.Replace("_", " ");\r
+\r
+                if (Properties.Settings.Default.AutoNameTitleCase)\r
+                    sourceName = TitleCase(sourceName);\r
 \r
                 // Get the Selected Title Number\r
                 string[] titlesplit = mainWindow.drp_dvdtitle.Text.Split(' ');\r
-                string dvdTitle = titlesplit[0].Replace("Automatic", "");\r
+                string dvdTitle = titlesplit[0].Replace("Automatic", string.Empty);\r
 \r
                 // Get the Chapter Start and Chapter End Numbers\r
-                string chapterStart = mainWindow.drop_chapterStart.Text.Replace("Auto", "");\r
-                string chapterFinish = mainWindow.drop_chapterFinish.Text.Replace("Auto", "");\r
+                string chapterStart = mainWindow.drop_chapterStart.Text.Replace("Auto", string.Empty);\r
+                string chapterFinish = mainWindow.drop_chapterFinish.Text.Replace("Auto", string.Empty);\r
                 string combinedChapterTag = chapterStart;\r
-                if (chapterFinish != chapterStart && chapterFinish != "")\r
+                if (chapterFinish != chapterStart && chapterFinish != string.Empty)\r
                     combinedChapterTag = chapterStart + "-" + chapterFinish;\r
 \r
                 // Get the destination filename.\r
                 string destinationFilename;\r
-                if (Properties.Settings.Default.autoNameFormat != "")\r
+                if (Properties.Settings.Default.autoNameFormat != string.Empty)\r
                 {\r
                     destinationFilename = Properties.Settings.Default.autoNameFormat;\r
-                    destinationFilename = destinationFilename.Replace("{source}", sourceName).Replace("{title}", dvdTitle).Replace("{chapters}", combinedChapterTag);\r
+                    destinationFilename = destinationFilename.Replace("{source}", sourceName)\r
+                                                             .Replace("{title}", dvdTitle)\r
+                                                             .Replace("{chapters}", combinedChapterTag);\r
                 }\r
                 else\r
                     destinationFilename = sourceName + "_T" + dvdTitle + "_C" + combinedChapterTag;\r
@@ -156,10 +239,10 @@ namespace Handbrake.Functions
                 // Add the appropriate file extension\r
                 if (mainWindow.drop_format.SelectedIndex == 0)\r
                 {\r
-                    if (Properties.Settings.Default.useM4v || mainWindow.Check_ChapterMarkers.Checked || mainWindow.AudioSettings.RequiresM4V() || mainWindow.Subtitles.RequiresM4V())\r
-                        destinationFilename += ".m4v";\r
-                    else\r
-                        destinationFilename += ".mp4";\r
+                    destinationFilename += Properties.Settings.Default.useM4v || mainWindow.Check_ChapterMarkers.Checked ||\r
+                                           mainWindow.AudioSettings.RequiresM4V() || mainWindow.Subtitles.RequiresM4V()\r
+                                               ? ".m4v"\r
+                                               : ".mp4";\r
                 }\r
                 else if (mainWindow.drop_format.SelectedIndex == 1)\r
                     destinationFilename += ".mkv";\r
@@ -169,88 +252,112 @@ namespace Handbrake.Functions
                 if (!mainWindow.text_destination.Text.Contains(Path.DirectorySeparatorChar.ToString()))\r
                 {\r
                     // If there is an auto name path, use it...\r
-                    if (Properties.Settings.Default.autoNamePath.Trim() != "" && Properties.Settings.Default.autoNamePath.Trim() != "Click 'Browse' to set the default location")\r
-                        AutoNamePath = Path.Combine(Properties.Settings.Default.autoNamePath, destinationFilename);\r
+                    if (Properties.Settings.Default.autoNamePath.Trim() == "{source_path}" && !string.IsNullOrEmpty(mainWindow.sourcePath))\r
+                    {\r
+                        autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.sourcePath), destinationFilename);\r
+                        if (autoNamePath == mainWindow.sourcePath)\r
+                        {\r
+                            // Append out_ to files that already exist or is the source file\r
+                            autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.sourcePath), "output_" + destinationFilename);\r
+                        }\r
+                    }\r
+                    else if (Properties.Settings.Default.autoNamePath.Trim() != string.Empty && Properties.Settings.Default.autoNamePath.Trim() != "Click 'Browse' to set the default location")\r
+                    {\r
+                        autoNamePath = Path.Combine(Properties.Settings.Default.autoNamePath, destinationFilename);\r
+                    }\r
                     else // ...otherwise, output to the source directory\r
-                        AutoNamePath = null;\r
+                        autoNamePath = null;\r
                 }\r
                 else // Otherwise, use the path that is already there.\r
                 {\r
                     // Use the path and change the file extension to match the previous destination\r
-                    AutoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.text_destination.Text), destinationFilename);\r
+                    autoNamePath = Path.Combine(Path.GetDirectoryName(mainWindow.text_destination.Text), destinationFilename);\r
 \r
                     if (Path.HasExtension(mainWindow.text_destination.Text))\r
-                        AutoNamePath = Path.ChangeExtension(AutoNamePath, Path.GetExtension(mainWindow.text_destination.Text));\r
+                        autoNamePath = Path.ChangeExtension(autoNamePath,\r
+                                                            Path.GetExtension(mainWindow.text_destination.Text));\r
                 }\r
             }\r
 \r
-            return AutoNamePath;\r
+            return autoNamePath;\r
         }\r
 \r
         /// <summary>\r
         /// Get's HandBrakes version data from the CLI.\r
         /// </summary>\r
-        /// <returns>Arraylist of Version Data. 0 = hb_version 1 = hb_build</returns>\r
-        public static void setCliVersionData()\r
+        public static void SetCliVersionData()\r
         {\r
-            String line;\r
+            string line;\r
 \r
             // 0 = SVN Build / Version\r
             // 1 = Build Date\r
-\r
             DateTime lastModified = File.GetLastWriteTime("HandBrakeCLI.exe");\r
 \r
-\r
-            if (Properties.Settings.Default.cliLastModified == lastModified && Properties.Settings.Default.hb_build != 0)\r
+            if (Properties.Settings.Default.hb_build != 0 && Properties.Settings.Default.cliLastModified == lastModified)\r
+            {\r
                 return;\r
+            }\r
 \r
             Properties.Settings.Default.cliLastModified = lastModified;\r
-            \r
+\r
             Process cliProcess = new Process();\r
-            ProcessStartInfo handBrakeCLI = new ProcessStartInfo("HandBrakeCLI.exe", " -u")\r
+            ProcessStartInfo handBrakeCli = new ProcessStartInfo("HandBrakeCLI.exe", " -u -v0")\r
                                                 {\r
                                                     UseShellExecute = false,\r
                                                     RedirectStandardError = true,\r
                                                     RedirectStandardOutput = true,\r
                                                     CreateNoWindow = true\r
                                                 };\r
-            cliProcess.StartInfo = handBrakeCLI;\r
+            cliProcess.StartInfo = handBrakeCli;\r
 \r
             try\r
             {\r
                 cliProcess.Start();\r
+\r
                 // Retrieve standard output and report back to parent thread until the process is complete\r
                 TextReader stdOutput = cliProcess.StandardError;\r
 \r
                 while (!cliProcess.HasExited)\r
                 {\r
-                    line = stdOutput.ReadLine() ?? "";\r
-                    Match m = Regex.Match(line, @"HandBrake ([0-9.]*)(svn[0-9M]*) \([0-9]*\)");\r
+                    line = stdOutput.ReadLine() ?? string.Empty;\r
+                    Match m = Regex.Match(line, @"HandBrake ([svnM0-9.]*) \(([0-9]*)\)");\r
                     Match platform = Regex.Match(line, @"- ([A-Za-z0-9\s ]*) -");\r
 \r
                     if (m.Success)\r
                     {\r
-                        string data = line.Replace("(", "").Replace(")", "").Replace("HandBrake ", "");\r
-                        string[] arr = data.Split(' ');\r
+                        string version = m.Groups[1].Success ? m.Groups[1].Value : string.Empty;\r
+                        string build = m.Groups[2].Success ? m.Groups[2].Value : string.Empty;\r
 \r
-                        Properties.Settings.Default.hb_build = int.Parse(arr[1]);\r
-                        Properties.Settings.Default.hb_version = arr[0];\r
+                        int buildValue;\r
+                        int.TryParse(build, out buildValue);\r
+\r
+                        Properties.Settings.Default.hb_build = buildValue;\r
+                        Properties.Settings.Default.hb_version = version;\r
                     }\r
+\r
                     if (platform.Success)\r
-                        Properties.Settings.Default.hb_platform = platform.Value.Replace("-", "").Trim();\r
+                    {\r
+                        Properties.Settings.Default.hb_platform = platform.Value.Replace("-", string.Empty).Trim();\r
+                    }\r
 \r
                     if (cliProcess.TotalProcessorTime.Seconds > 10) // Don't wait longer than 10 seconds.\r
                     {\r
                         Process cli = Process.GetProcessById(cliProcess.Id);\r
                         if (!cli.HasExited)\r
+                        {\r
                             cli.Kill();\r
+                        }\r
                     }\r
                 }\r
+\r
                 Properties.Settings.Default.Save();\r
             }\r
             catch (Exception e)\r
             {\r
-                MessageBox.Show("Unable to retrieve version information from the CLI. \nError:\n" + e);\r
+                Properties.Settings.Default.hb_build = 0;\r
+                Properties.Settings.Default.Save();\r
+\r
+                ShowExceptiowWindow("Unable to retrieve version information from the CLI.", e.ToString());\r
             }\r
         }\r
 \r
@@ -259,82 +366,103 @@ namespace Handbrake.Functions
         /// If it does, it means the last queue did not complete before HandBrake closed.\r
         /// So, return a boolean if true. \r
         /// </summary>\r
-        public static Boolean checkQueueRecovery()\r
+        /// <returns>\r
+        /// True if there is a queue to recover.\r
+        /// </returns>\r
+        public static List<string> CheckQueueRecovery()\r
         {\r
             try\r
             {\r
-                string tempPath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");\r
-                if (File.Exists(tempPath))\r
+                string tempPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");\r
+                List<string> queueFiles = new List<string>();\r
+\r
+                DirectoryInfo info = new DirectoryInfo(tempPath);\r
+                FileInfo[] logFiles = info.GetFiles("*.xml");\r
+                foreach (FileInfo file in logFiles)\r
                 {\r
-                    using (FileStream strm = new FileStream(tempPath, FileMode.Open, FileAccess.Read))\r
+                    if (!file.Name.Contains("hb_queue_recovery"))\r
+                        continue;\r
+\r
+                    using (FileStream strm = new FileStream(Path.Combine(file.DirectoryName, file.Name), FileMode.Open, FileAccess.Read))\r
                     {\r
-                        List<Job> list = ser.Deserialize(strm) as List<Job>;\r
+                        List<Job> list = Ser.Deserialize(strm) as List<Job>;\r
                         if (list != null)\r
+                        {\r
                             if (list.Count != 0)\r
-                                return true;\r
+                            {\r
+                                queueFiles.Add(file.Name);\r
+                            }\r
+                        }\r
                     }\r
                 }\r
-                return false;\r
+\r
+                return queueFiles;\r
             }\r
             catch (Exception)\r
             {\r
-                return false; // Keep quiet about the error.\r
+                return new List<string>(); // Keep quiet about the error.\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Get the Process ID of HandBrakeCLI for the current instance.\r
+        /// Recover a queue from file.\r
         /// </summary>\r
-        /// <param name="before">List of processes before the new process was started</param>\r
-        /// <returns>Int - Process ID</returns>\r
-        public static int getCliProcess(Process[] before)\r
+        /// <param name="encodeQueue">\r
+        /// The encode Queue.\r
+        /// </param>\r
+        public static void RecoverQueue(IQueue encodeQueue)\r
         {\r
-            // This is a bit of a cludge. Maybe someone has a better idea on how to impliment this.\r
-            // Since we used CMD to start HandBrakeCLI, we don't get the process ID from hbProc.\r
-            // Instead we take the processes before and after, and get the ID of HandBrakeCLI.exe\r
-            // avoiding any previous instances of HandBrakeCLI.exe in before.\r
-            // Kill the current process.\r
-\r
-            DateTime startTime = DateTime.Now;\r
-            TimeSpan duration;\r
-\r
-            Process[] hbProcesses = Process.GetProcessesByName("HandBrakeCLI");\r
-            while (hbProcesses.Length == 0)\r
+            DialogResult result = DialogResult.None;\r
+            List<string> queueFiles = CheckQueueRecovery();\r
+            if (queueFiles.Count == 1)\r
             {\r
-                hbProcesses = Process.GetProcessesByName("HandBrakeCLI");\r
-                duration = DateTime.Now - startTime;\r
-                if (duration.Seconds > 5 && hbProcesses.Length == 0) // Make sure we don't wait forever if the process doesn't start\r
-                    return -1;\r
+                result = MessageBox.Show(\r
+                        "HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?",\r
+                        "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+            }\r
+            else if (queueFiles.Count > 1)\r
+            {\r
+                result = MessageBox.Show(\r
+                        "HandBrake has detected multiple unfinished queue files. These will be from multiple instances of HandBrake running. Would you like to recover all unfinished jobs?",\r
+                        "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
             }\r
 \r
-            Process hbProcess = null;\r
-            foreach (Process process in hbProcesses)\r
+            if (result == DialogResult.Yes)\r
             {\r
-                Boolean found = false;\r
-                // Check if the current CLI instance was running before we started the current one\r
-                foreach (Process bprocess in before)\r
+                foreach (string file in queueFiles)\r
                 {\r
-                    if (process.Id == bprocess.Id)\r
-                        found = true;\r
+                    encodeQueue.LoadQueueFromFile(file); // Start Recovery\r
                 }\r
+            }\r
+            else\r
+            {\r
+                if (IsMultiInstance) return; // Don't tamper with the files if we are multi instance\r
 \r
-                // If it wasn't running before, we found the process we want.\r
-                if (!found)\r
+                string tempPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");\r
+                foreach (string file in queueFiles)\r
                 {\r
-                    hbProcess = process;\r
-                    break;\r
+                    if (File.Exists(Path.Combine(tempPath, file)))\r
+                        File.Delete(Path.Combine(tempPath, file));\r
                 }\r
             }\r
-            if (hbProcess != null)\r
-                return hbProcess.Id;\r
+        }\r
 \r
-            return -1;\r
+        /// <summary>\r
+        /// Gets a value indicating whether HandBrake is running in multi instance mode\r
+        /// </summary>\r
+        /// <returns>True if the UI has another instance running</returns>\r
+        public static bool IsMultiInstance\r
+        {\r
+            get\r
+            {\r
+                return Process.GetProcessesByName("HandBrake").Length > 0 ? true : false;\r
+            }\r
         }\r
 \r
         /// <summary>\r
         ///  Clear all the encode log files.\r
         /// </summary>\r
-        public static void clearLogs()\r
+        public static void ClearLogs()\r
         {\r
             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
             if (Directory.Exists(logDir))\r
@@ -343,297 +471,336 @@ namespace Handbrake.Functions
                 FileInfo[] logFiles = info.GetFiles("*.txt");\r
                 foreach (FileInfo file in logFiles)\r
                 {\r
-                    if (!file.Name.Contains("last_scan_log") && !file.Name.Contains("last_encode_log") && !file.Name.Contains("tmp_appReadable_log.txt"))\r
+                    if (!file.Name.Contains("last_scan_log") && !file.Name.Contains("last_encode_log"))\r
                         File.Delete(file.FullName);\r
                 }\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Begins checking for an update to HandBrake.\r
+        /// Clear old log files x days in the past\r
         /// </summary>\r
-        /// <param name="callback">The method that will be called when the check is finished.</param>\r
-        /// <param name="debug">Whether or not to execute this in debug mode.</param>\r
-        public static void BeginCheckForUpdates(AsyncCallback callback, bool debug)\r
+        public static void ClearOldLogs()\r
         {\r
-            ThreadPool.QueueUserWorkItem(new WaitCallback(delegate\r
+            string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
+            if (Directory.Exists(logDir))\r
             {\r
-                try\r
-                {\r
-                    // Is this a stable or unstable build?\r
-                    string url = Properties.Settings.Default.hb_build.ToString().EndsWith("1") ? Properties.Settings.Default.appcast_unstable : Properties.Settings.Default.appcast;\r
-\r
-                    // Initialize variables\r
-                    WebRequest request = WebRequest.Create(url);\r
-                    WebResponse response = request.GetResponse();\r
-                    AppcastReader reader = new AppcastReader();\r
-\r
-                    // Get the data, convert it to a string, and parse it into the AppcastReader\r
-                    reader.getInfo(new StreamReader(response.GetResponseStream()).ReadToEnd());\r
-\r
-                    // Further parse the information\r
-                    string build = reader.build;\r
-\r
-                    int latest = int.Parse(build);\r
-                    int current = Properties.Settings.Default.hb_build;\r
-                    int skip = Properties.Settings.Default.skipversion;\r
+                DirectoryInfo info = new DirectoryInfo(logDir);\r
+                FileInfo[] logFiles = info.GetFiles("*.txt");\r
 \r
-                    // If the user wanted to skip this version, don't report the update\r
-                    if (latest == skip)\r
+                foreach (FileInfo file in logFiles)\r
+                {\r
+                    if (file.LastWriteTime < DateTime.Now.AddDays(-30))\r
                     {\r
-                        UpdateCheckInformation info = new UpdateCheckInformation() { NewVersionAvailable = false, BuildInformation = null };\r
-                        callback(new UpdateCheckResult(debug, info));\r
-                        return;\r
+                        if (!file.Name.Contains("last_scan_log.txt") && !file.Name.Contains("last_encode_log.txt"))\r
+                            File.Delete(file.FullName);\r
                     }\r
+                }\r
+            }\r
+        }\r
 \r
-                    // Set when the last update was\r
-                    Properties.Settings.Default.lastUpdateCheckDate = DateTime.Now;\r
-                    Properties.Settings.Default.Save();\r
+        /// <summary>\r
+        /// Map languages and their iso639_2 value into a IDictionary\r
+        /// </summary>\r
+        /// <returns>A Dictionary containing the language and iso code</returns>\r
+        public static IDictionary<string, string> MapLanguages()\r
+        {\r
+            IDictionary<string, string> languageMap = new Dictionary<string, string>\r
+                                                          {\r
+                                                              {"Any", "und"}, \r
+                                                              {"Afar", "aar"}, \r
+                                                              {"Abkhazian", "abk"}, \r
+                                                              {"Afrikaans", "afr"}, \r
+                                                              {"Akan", "aka"}, \r
+                                                              {"Albanian", "sqi"}, \r
+                                                              {"Amharic", "amh"}, \r
+                                                              {"Arabic", "ara"}, \r
+                                                              {"Aragonese", "arg"}, \r
+                                                              {"Armenian", "hye"}, \r
+                                                              {"Assamese", "asm"}, \r
+                                                              {"Avaric", "ava"}, \r
+                                                              {"Avestan", "ave"}, \r
+                                                              {"Aymara", "aym"}, \r
+                                                              {"Azerbaijani", "aze"}, \r
+                                                              {"Bashkir", "bak"}, \r
+                                                              {"Bambara", "bam"}, \r
+                                                              {"Basque", "eus"}, \r
+                                                              {"Belarusian", "bel"}, \r
+                                                              {"Bengali", "ben"}, \r
+                                                              {"Bihari", "bih"}, \r
+                                                              {"Bislama", "bis"}, \r
+                                                              {"Bosnian", "bos"}, \r
+                                                              {"Breton", "bre"}, \r
+                                                              {"Bulgarian", "bul"}, \r
+                                                              {"Burmese", "mya"}, \r
+                                                              {"Catalan", "cat"}, \r
+                                                              {"Chamorro", "cha"}, \r
+                                                              {"Chechen", "che"}, \r
+                                                              {"Chinese", "zho"}, \r
+                                                              {"Church Slavic", "chu"}, \r
+                                                              {"Chuvash", "chv"}, \r
+                                                              {"Cornish", "cor"}, \r
+                                                              {"Corsican", "cos"}, \r
+                                                              {"Cree", "cre"}, \r
+                                                              {"Czech", "ces"}, \r
+                                                              {"Dansk", "dan"}, \r
+                                                              {"Divehi", "div"}, \r
+                                                              {"Nederlands", "nld"}, \r
+                                                              {"Dzongkha", "dzo"}, \r
+                                                              {"English", "eng"}, \r
+                                                              {"Esperanto", "epo"}, \r
+                                                              {"Estonian", "est"}, \r
+                                                              {"Ewe", "ewe"}, \r
+                                                              {"Faroese", "fao"}, \r
+                                                              {"Fijian", "fij"}, \r
+                                                              {"Suomi", "fin"}, \r
+                                                              {"Francais", "fra"}, \r
+                                                              {"Western Frisian", "fry"}, \r
+                                                              {"Fulah", "ful"}, \r
+                                                              {"Georgian", "kat"}, \r
+                                                              {"Deutsch", "deu"}, \r
+                                                              {"Gaelic (Scots)", "gla"}, \r
+                                                              {"Irish", "gle"}, \r
+                                                              {"Galician", "glg"}, \r
+                                                              {"Manx", "glv"}, \r
+                                                              {"Greek Modern", "ell"}, \r
+                                                              {"Guarani", "grn"}, \r
+                                                              {"Gujarati", "guj"}, \r
+                                                              {"Haitian", "hat"}, \r
+                                                              {"Hausa", "hau"}, \r
+                                                              {"Hebrew", "heb"}, \r
+                                                              {"Herero", "her"}, \r
+                                                              {"Hindi", "hin"}, \r
+                                                              {"Hiri Motu", "hmo"}, \r
+                                                              {"Magyar", "hun"}, \r
+                                                              {"Igbo", "ibo"}, \r
+                                                              {"Islenska", "isl"}, \r
+                                                              {"Ido", "ido"}, \r
+                                                              {"Sichuan Yi", "iii"}, \r
+                                                              {"Inuktitut", "iku"}, \r
+                                                              {"Interlingue", "ile"}, \r
+                                                              {"Interlingua", "ina"}, \r
+                                                              {"Indonesian", "ind"}, \r
+                                                              {"Inupiaq", "ipk"}, \r
+                                                              {"Italiano", "ita"}, \r
+                                                              {"Javanese", "jav"}, \r
+                                                              {"Japanese", "jpn"}, \r
+                                                              {"Kalaallisut", "kal"}, \r
+                                                              {"Kannada", "kan"}, \r
+                                                              {"Kashmiri", "kas"}, \r
+                                                              {"Kanuri", "kau"}, \r
+                                                              {"Kazakh", "kaz"}, \r
+                                                              {"Central Khmer", "khm"}, \r
+                                                              {"Kikuyu", "kik"}, \r
+                                                              {"Kinyarwanda", "kin"}, \r
+                                                              {"Kirghiz", "kir"}, \r
+                                                              {"Komi", "kom"}, \r
+                                                              {"Kongo", "kon"}, \r
+                                                              {"Korean", "kor"}, \r
+                                                              {"Kuanyama", "kua"}, \r
+                                                              {"Kurdish", "kur"}, \r
+                                                              {"Lao", "lao"}, \r
+                                                              {"Latin", "lat"}, \r
+                                                              {"Latvian", "lav"}, \r
+                                                              {"Limburgan", "lim"}, \r
+                                                              {"Lingala", "lin"}, \r
+                                                              {"Lithuanian", "lit"}, \r
+                                                              {"Luxembourgish", "ltz"}, \r
+                                                              {"Luba-Katanga", "lub"}, \r
+                                                              {"Ganda", "lug"}, \r
+                                                              {"Macedonian", "mkd"}, \r
+                                                              {"Marshallese", "mah"}, \r
+                                                              {"Malayalam", "mal"}, \r
+                                                              {"Maori", "mri"}, \r
+                                                              {"Marathi", "mar"}, \r
+                                                              {"Malay", "msa"}, \r
+                                                              {"Malagasy", "mlg"}, \r
+                                                              {"Maltese", "mlt"}, \r
+                                                              {"Moldavian", "mol"}, \r
+                                                              {"Mongolian", "mon"}, \r
+                                                              {"Nauru", "nau"}, \r
+                                                              {"Navajo", "nav"}, \r
+                                                              {"Ndebele, South", "nbl"}, \r
+                                                              {"Ndebele, North", "nde"}, \r
+                                                              {"Ndonga", "ndo"}, \r
+                                                              {"Nepali", "nep"}, \r
+                                                              {"Norwegian Nynorsk", "nno"}, \r
+                                                              {"Norwegian BokmÃ¥l", "nob"}, \r
+                                                              {"Norsk", "nor"}, \r
+                                                              {"Chichewa; Nyanja", "nya"}, \r
+                                                              {"Occitan", "oci"}, \r
+                                                              {"Ojibwa", "oji"}, \r
+                                                              {"Oriya", "ori"}, \r
+                                                              {"Oromo", "orm"}, \r
+                                                              {"Ossetian", "oss"}, \r
+                                                              {"Panjabi", "pan"}, \r
+                                                              {"Persian", "fas"}, \r
+                                                              {"Pali", "pli"}, \r
+                                                              {"Polish", "pol"}, \r
+                                                              {"Portugues", "por"}, \r
+                                                              {"Pushto", "pus"}, \r
+                                                              {"Quechua", "que"}, \r
+                                                              {"Romansh", "roh"}, \r
+                                                              {"Romanian", "ron"}, \r
+                                                              {"Rundi", "run"}, \r
+                                                              {"Russian", "rus"}, \r
+                                                              {"Sango", "sag"}, \r
+                                                              {"Sanskrit", "san"}, \r
+                                                              {"Serbian", "srp"}, \r
+                                                              {"Hrvatski", "hrv"}, \r
+                                                              {"Sinhala", "sin"}, \r
+                                                              {"Slovak", "slk"}, \r
+                                                              {"Slovenian", "slv"}, \r
+                                                              {"Northern Sami", "sme"}, \r
+                                                              {"Samoan", "smo"}, \r
+                                                              {"Shona", "sna"}, \r
+                                                              {"Sindhi", "snd"}, \r
+                                                              {"Somali", "som"}, \r
+                                                              {"Sotho Southern", "sot"}, \r
+                                                              {"Espanol", "spa"}, \r
+                                                              {"Sardinian", "srd"}, \r
+                                                              {"Swati", "ssw"}, \r
+                                                              {"Sundanese", "sun"}, \r
+                                                              {"Swahili", "swa"}, \r
+                                                              {"Svenska", "swe"}, \r
+                                                              {"Tahitian", "tah"}, \r
+                                                              {"Tamil", "tam"}, \r
+                                                              {"Tatar", "tat"}, \r
+                                                              {"Telugu", "tel"}, \r
+                                                              {"Tajik", "tgk"}, \r
+                                                              {"Tagalog", "tgl"}, \r
+                                                              {"Thai", "tha"}, \r
+                                                              {"Tibetan", "bod"}, \r
+                                                              {"Tigrinya", "tir"}, \r
+                                                              {"Tonga", "ton"}, \r
+                                                              {"Tswana", "tsn"}, \r
+                                                              {"Tsonga", "tso"}, \r
+                                                              {"Turkmen", "tuk"}, \r
+                                                              {"Turkish", "tur"}, \r
+                                                              {"Twi", "twi"}, \r
+                                                              {"Uighur", "uig"}, \r
+                                                              {"Ukrainian", "ukr"}, \r
+                                                              {"Urdu", "urd"}, \r
+                                                              {"Uzbek", "uzb"}, \r
+                                                              {"Venda", "ven"}, \r
+                                                              {"Vietnamese", "vie"}, \r
+                                                              {"Volapük", "vol"}, \r
+                                                              {"Welsh", "cym"}, \r
+                                                              {"Walloon", "wln"}, \r
+                                                              {"Wolof", "wol"}, \r
+                                                              {"Xhosa", "xho"}, \r
+                                                              {"Yiddish", "yid"}, \r
+                                                              {"Yoruba", "yor"}, \r
+                                                              {"Zhuang", "zha"}, \r
+                                                              {"Zulu", "zul"}\r
+                                                          };\r
+            return languageMap;\r
+        }\r
 \r
-                    UpdateCheckInformation info2 = new UpdateCheckInformation() { NewVersionAvailable = latest > current, BuildInformation = reader };\r
-                    callback(new UpdateCheckResult(debug, info2));\r
+        /// <summary>\r
+        /// Get a list of available DVD drives which are ready and contain DVD content.\r
+        /// </summary>\r
+        /// <returns>A List of Drives with their details</returns>\r
+        public static List<DriveInformation> GetDrives()\r
+        {\r
+            List<DriveInformation> drives = new List<DriveInformation>();\r
+            DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();\r
+            int id = 0;\r
+            foreach (DriveInfo curDrive in theCollectionOfDrives)\r
+            {\r
+                if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady &&\r
+                    File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))\r
+                {\r
+                    drives.Add(new DriveInformation\r
+                                   {\r
+                                       Id = id,\r
+                                       VolumeLabel = curDrive.VolumeLabel,\r
+                                       RootDirectory = curDrive.RootDirectory + "VIDEO_TS"\r
+                                   });\r
+                    id++;\r
                 }\r
-                catch (Exception exc)\r
+            }\r
+            return drives;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Change a string to Title Case/\r
+        /// </summary>\r
+        /// <param name="input">\r
+        /// The input.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A string in title case.\r
+        /// </returns>\r
+        public static string TitleCase(string input)\r
+        {\r
+            string[] tokens = input.Split(' ');\r
+            StringBuilder sb = new StringBuilder(input.Length);\r
+            foreach (string s in tokens)\r
+            {\r
+                if (!string.IsNullOrEmpty(s))\r
                 {\r
-                    callback(new UpdateCheckResult(debug, new UpdateCheckInformation() { Error = exc }));\r
+                    sb.Append(s[0].ToString().ToUpper());\r
+                    sb.Append(s.Substring(1).ToLower());\r
+                    sb.Append(" ");\r
                 }\r
-            }));\r
+            }\r
+\r
+            return sb.ToString().Trim();\r
         }\r
 \r
         /// <summary>\r
-        /// \r
+        /// Show the Exception Window\r
         /// </summary>\r
-        /// <param name="result"></param>\r
-        /// <returns></returns>\r
-        public static UpdateCheckInformation EndCheckForUpdates(IAsyncResult result)\r
+        /// <param name="shortError">\r
+        /// The short error.\r
+        /// </param>\r
+        /// <param name="longError">\r
+        /// The long error.\r
+        /// </param>\r
+        public static void ShowExceptiowWindow(string shortError, string longError)\r
         {\r
-            UpdateCheckResult checkResult = (UpdateCheckResult)result;\r
-            return checkResult.Result;\r
+            errorService.ShowError(shortError, longError);\r
         }\r
 \r
         /// <summary>\r
-        /// Used in EndUpdateCheck() for update checking and the IAsyncResult design pattern.\r
+        /// Get The Source from the CLI Query\r
         /// </summary>\r
-        private class UpdateCheckResult : IAsyncResult\r
+        /// <param name="query">Full CLI Query</param>\r
+        /// <returns>The Source Path</returns>\r
+        public static string GetSourceFromQuery(string query)\r
         {\r
-            public UpdateCheckResult(object asyncState, UpdateCheckInformation info)\r
+            int startIndex = query.IndexOf("-i \"");\r
+            if (startIndex != -1)\r
             {\r
-                AsyncState = asyncState;\r
-                Result = info;\r
-            }\r
+                string input = query.Substring(startIndex).Replace("-i \"", string.Empty).Trim();\r
 \r
-            /// <summary>\r
-            /// Gets whether the check was executed in debug mode.\r
-            /// </summary>\r
-            public object AsyncState { get; private set; }\r
+                int closeIndex = input.IndexOf('"');\r
 \r
-            /// <summary>\r
-            /// Gets the result of the update check.\r
-            /// </summary>\r
-            public UpdateCheckInformation Result { get; private set; }\r
+                return closeIndex == -1 ? "Unknown" : input.Substring(0, closeIndex);\r
+            }\r
 \r
-            public WaitHandle AsyncWaitHandle { get { throw new NotImplementedException(); } }\r
-            public bool CompletedSynchronously { get { throw new NotImplementedException(); } }\r
-            public bool IsCompleted { get { throw new NotImplementedException(); } }\r
+            return "Unknown";\r
         }\r
 \r
         /// <summary>\r
-        /// Map languages and their iso639_2 value into a IDictionary\r
+        /// Get the Destination from the CLI Query\r
         /// </summary>\r
-        /// <returns></returns>\r
-        public static IDictionary<string, string> mapLanguages()\r
+        /// <param name="query">Full CLI Query</param>\r
+        /// <returns>The Destination path</returns>\r
+        public static string GetDestinationFromQuery(string query)\r
         {\r
-            IDictionary<string, string> languageMap = new Dictionary<string, string>\r
-                                                          {\r
-                                                              {"Any", "und"},\r
-                                                              {"Afar", "aar"},\r
-                                                              {"Abkhazian", "abk"},\r
-                                                              {"Afrikaans", "afr"},\r
-                                                              {"Akan", "aka"},\r
-                                                              {"Albanian", "sqi"},\r
-                                                              {"Amharic", "amh"},\r
-                                                              {"Arabic", "ara"},\r
-                                                              {"Aragonese", "arg"},\r
-                                                              {"Armenian", "hye"},\r
-                                                              {"Assamese", "asm"},\r
-                                                              {"Avaric", "ava"},\r
-                                                              {"Avestan", "ave"},\r
-                                                              {"Aymara", "aym"},\r
-                                                              {"Azerbaijani", "aze"},\r
-                                                              {"Bashkir", "bak"},\r
-                                                              {"Bambara", "bam"},\r
-                                                              {"Basque", "eus"},\r
-                                                              {"Belarusian", "bel"},\r
-                                                              {"Bengali", "ben"},\r
-                                                              {"Bihari", "bih"},\r
-                                                              {"Bislama", "bis"},\r
-                                                              {"Bosnian", "bos"},\r
-                                                              {"Breton", "bre"},\r
-                                                              {"Bulgarian", "bul"},\r
-                                                              {"Burmese", "mya"},\r
-                                                              {"Catalan", "cat"},\r
-                                                              {"Chamorro", "cha"},\r
-                                                              {"Chechen", "che"},\r
-                                                              {"Chinese", "zho"},\r
-                                                              {"Church Slavic", "chu"},\r
-                                                              {"Chuvash", "chv"},\r
-                                                              {"Cornish", "cor"},\r
-                                                              {"Corsican", "cos"},\r
-                                                              {"Cree", "cre"},\r
-                                                              {"Czech", "ces"},\r
-                                                              {"Dansk", "dan"},\r
-                                                              {"Divehi", "div"},\r
-                                                              {"Nederlands", "nld"},\r
-                                                              {"Dzongkha", "dzo"},\r
-                                                              {"English", "eng"},\r
-                                                              {"Esperanto", "epo"},\r
-                                                              {"Estonian", "est"},\r
-                                                              {"Ewe", "ewe"},\r
-                                                              {"Faroese", "fao"},\r
-                                                              {"Fijian", "fij"},\r
-                                                              {"Suomi", "fin"},\r
-                                                              {"Francais", "fra"},\r
-                                                              {"Western Frisian", "fry"},\r
-                                                              {"Fulah", "ful"},\r
-                                                              {"Georgian", "kat"},\r
-                                                              {"Deutsch", "deu"},\r
-                                                              {"Gaelic (Scots)", "gla"},\r
-                                                              {"Irish", "gle"},\r
-                                                              {"Galician", "glg"},\r
-                                                              {"Manx", "glv"},\r
-                                                              {"Greek Modern", "ell"},\r
-                                                              {"Guarani", "grn"},\r
-                                                              {"Gujarati", "guj"},\r
-                                                              {"Haitian", "hat"},\r
-                                                              {"Hausa", "hau"},\r
-                                                              {"Hebrew", "heb"},\r
-                                                              {"Herero", "her"},\r
-                                                              {"Hindi", "hin"},\r
-                                                              {"Hiri Motu", "hmo"},\r
-                                                              {"Magyar", "hun"},\r
-                                                              {"Igbo", "ibo"},\r
-                                                              {"Islenska", "isl"},\r
-                                                              {"Ido", "ido"},\r
-                                                              {"Sichuan Yi", "iii"},\r
-                                                              {"Inuktitut", "iku"},\r
-                                                              {"Interlingue", "ile"},\r
-                                                              {"Interlingua", "ina"},\r
-                                                              {"Indonesian", "ind"},\r
-                                                              {"Inupiaq", "ipk"},\r
-                                                              {"Italiano", "ita"},\r
-                                                              {"Javanese", "jav"},\r
-                                                              {"Japanese", "jpn"},\r
-                                                              {"Kalaallisut", "kal"},\r
-                                                              {"Kannada", "kan"},\r
-                                                              {"Kashmiri", "kas"},\r
-                                                              {"Kanuri", "kau"},\r
-                                                              {"Kazakh", "kaz"},\r
-                                                              {"Central Khmer", "khm"},\r
-                                                              {"Kikuyu", "kik"},\r
-                                                              {"Kinyarwanda", "kin"},\r
-                                                              {"Kirghiz", "kir"},\r
-                                                              {"Komi", "kom"},\r
-                                                              {"Kongo", "kon"},\r
-                                                              {"Korean", "kor"},\r
-                                                              {"Kuanyama", "kua"},\r
-                                                              {"Kurdish", "kur"},\r
-                                                              {"Lao", "lao"},\r
-                                                              {"Latin", "lat"},\r
-                                                              {"Latvian", "lav"},\r
-                                                              {"Limburgan", "lim"},\r
-                                                              {"Lingala", "lin"},\r
-                                                              {"Lithuanian", "lit"},\r
-                                                              {"Luxembourgish", "ltz"},\r
-                                                              {"Luba-Katanga", "lub"},\r
-                                                              {"Ganda", "lug"},\r
-                                                              {"Macedonian", "mkd"},\r
-                                                              {"Marshallese", "mah"},\r
-                                                              {"Malayalam", "mal"},\r
-                                                              {"Maori", "mri"},\r
-                                                              {"Marathi", "mar"},\r
-                                                              {"Malay", "msa"},\r
-                                                              {"Malagasy", "mlg"},\r
-                                                              {"Maltese", "mlt"},\r
-                                                              {"Moldavian", "mol"},\r
-                                                              {"Mongolian", "mon"},\r
-                                                              {"Nauru", "nau"},\r
-                                                              {"Navajo", "nav"},\r
-                                                              {"Ndebele, South", "nbl"},\r
-                                                              {"Ndebele, North", "nde"},\r
-                                                              {"Ndonga", "ndo"},\r
-                                                              {"Nepali", "nep"},\r
-                                                              {"Norwegian Nynorsk", "nno"},\r
-                                                              {"Norwegian BokmÃ¥l", "nob"},\r
-                                                              {"Norsk", "nor"},\r
-                                                              {"Chichewa; Nyanja", "nya"},\r
-                                                              {"Occitan", "oci"},\r
-                                                              {"Ojibwa", "oji"},\r
-                                                              {"Oriya", "ori"},\r
-                                                              {"Oromo", "orm"},\r
-                                                              {"Ossetian", "oss"},\r
-                                                              {"Panjabi", "pan"},\r
-                                                              {"Persian", "fas"},\r
-                                                              {"Pali", "pli"},\r
-                                                              {"Polish", "pol"},\r
-                                                              {"Portugues", "por"},\r
-                                                              {"Pushto", "pus"},\r
-                                                              {"Quechua", "que"},\r
-                                                              {"Romansh", "roh"},\r
-                                                              {"Romanian", "ron"},\r
-                                                              {"Rundi", "run"},\r
-                                                              {"Russian", "rus"},\r
-                                                              {"Sango", "sag"},\r
-                                                              {"Sanskrit", "san"},\r
-                                                              {"Serbian", "srp"},\r
-                                                              {"Hrvatski", "hrv"},\r
-                                                              {"Sinhala", "sin"},\r
-                                                              {"Slovak", "slk"},\r
-                                                              {"Slovenian", "slv"},\r
-                                                              {"Northern Sami", "sme"},\r
-                                                              {"Samoan", "smo"},\r
-                                                              {"Shona", "sna"},\r
-                                                              {"Sindhi", "snd"},\r
-                                                              {"Somali", "som"},\r
-                                                              {"Sotho Southern", "sot"},\r
-                                                              {"Espanol", "spa"},\r
-                                                              {"Sardinian", "srd"},\r
-                                                              {"Swati", "ssw"},\r
-                                                              {"Sundanese", "sun"},\r
-                                                              {"Swahili", "swa"},\r
-                                                              {"Svenska", "swe"},\r
-                                                              {"Tahitian", "tah"},\r
-                                                              {"Tamil", "tam"},\r
-                                                              {"Tatar", "tat"},\r
-                                                              {"Telugu", "tel"},\r
-                                                              {"Tajik", "tgk"},\r
-                                                              {"Tagalog", "tgl"},\r
-                                                              {"Thai", "tha"},\r
-                                                              {"Tibetan", "bod"},\r
-                                                              {"Tigrinya", "tir"},\r
-                                                              {"Tonga", "ton"},\r
-                                                              {"Tswana", "tsn"},\r
-                                                              {"Tsonga", "tso"},\r
-                                                              {"Turkmen", "tuk"},\r
-                                                              {"Turkish", "tur"},\r
-                                                              {"Twi", "twi"},\r
-                                                              {"Uighur", "uig"},\r
-                                                              {"Ukrainian", "ukr"},\r
-                                                              {"Urdu", "urd"},\r
-                                                              {"Uzbek", "uzb"},\r
-                                                              {"Venda", "ven"},\r
-                                                              {"Vietnamese", "vie"},\r
-                                                              {"Volapük", "vol"},\r
-                                                              {"Welsh", "cym"},\r
-                                                              {"Walloon", "wln"},\r
-                                                              {"Wolof", "wol"},\r
-                                                              {"Xhosa", "xho"},\r
-                                                              {"Yiddish", "yid"},\r
-                                                              {"Yoruba", "yor"},\r
-                                                              {"Zhuang", "zha"},\r
-                                                              {"Zulu", "zul"}\r
-                                                          };\r
-            return languageMap;\r
-        }\r
+            int startIndex = query.IndexOf("-o \"");\r
+            if (startIndex != -1)\r
+            {\r
+                string output = query.Substring(startIndex).Replace("-o \"", string.Empty).Trim();\r
+\r
+                int closeIndex = output.IndexOf('"');\r
 \r
+                return closeIndex == -1 ? "Unknown" : output.Substring(0, closeIndex);\r
+            }\r
+\r
+            return "Unknown";\r
+        }\r
     }\r
-}\r
+}
\ No newline at end of file
index 3018b91..790d511 100644 (file)
@@ -1,32 +1,35 @@
 ï»¿/*  PresetLoader.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Drawing;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Functions\r
 {\r
-    class PresetLoader\r
+    using System.Drawing;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// Load a preset into the main Window\r
+    /// </summary>\r
+    public class PresetLoader\r
     {\r
         /// <summary>\r
         /// This function takes in a Query which has been parsed by QueryParser and\r
         /// set's all the GUI widgets correctly.\r
         /// </summary>\r
-        /// <param name="mainWindow"></param>\r
-        /// <param name="presetQuery">The Parsed CLI Query</param>\r
-        /// <param name="name">Name of the preset</param>\r
-        /// <param name="pictureSettings">Save picture settings in the preset</param>\r
-        public static void presetLoader(frmMain mainWindow, QueryParser presetQuery, string name, Boolean pictureSettings)\r
+        /// <param name="mainWindow">\r
+        /// FrmMain window\r
+        /// </param>\r
+        /// <param name="presetQuery">\r
+        /// The Parsed CLI Query\r
+        /// </param>\r
+        /// <param name="name">\r
+        /// Name of the preset\r
+        /// </param>\r
+        public static void LoadPreset(frmMain mainWindow, QueryParser presetQuery, string name)\r
         {\r
-            // ---------------------------\r
-            // Setup the GUI\r
-            // ---------------------------\r
-\r
             #region Source\r
+\r
             // Reset some vaules to stock first to prevent errors.\r
             mainWindow.check_iPodAtom.CheckState = CheckState.Unchecked;\r
 \r
@@ -50,12 +53,12 @@ namespace Handbrake.Functions
                 {\r
                     if (mainWindow.drop_format.SelectedIndex == 0)\r
                         mainWindow.SetExtension(".mp4");\r
-                    else \r
+                    else\r
                         mainWindow.drop_format.SelectedIndex = 0;\r
                 }\r
                 else if (presetQuery.Format == "mkv")\r
                 {\r
-                    if(mainWindow.drop_format.SelectedIndex == 1)\r
+                    if (mainWindow.drop_format.SelectedIndex == 1)\r
                         mainWindow.SetExtension(".mkv");\r
                     else\r
                         mainWindow.drop_format.SelectedIndex = 1;\r
@@ -64,7 +67,9 @@ namespace Handbrake.Functions
 \r
             mainWindow.check_iPodAtom.CheckState = presetQuery.IpodAtom ? CheckState.Checked : CheckState.Unchecked;\r
 \r
-            mainWindow.check_optimiseMP4.CheckState = presetQuery.OptimizeMP4 ? CheckState.Checked : CheckState.Unchecked;\r
+            mainWindow.check_optimiseMP4.CheckState = presetQuery.OptimizeMP4\r
+                                                          ? CheckState.Checked\r
+                                                          : CheckState.Unchecked;\r
 \r
             mainWindow.check_largeFile.CheckState = presetQuery.LargeMP4 ? CheckState.Checked : CheckState.Unchecked;\r
 \r
@@ -73,31 +78,31 @@ namespace Handbrake.Functions
             #endregion\r
 \r
             #region Picture\r
+\r
             mainWindow.PictureSettings.check_autoCrop.Checked = true;\r
-            if (pictureSettings) // only Load picture settings if the perset requires it\r
+            if (presetQuery.CropValues != null)\r
             {\r
-                if (presetQuery.CropValues != null)\r
-                {\r
-                    int top, bottom, left, right;\r
-                    int.TryParse(presetQuery.CropTop, out top);\r
-                    int.TryParse(presetQuery.CropBottom, out bottom);\r
-                    int.TryParse(presetQuery.CropLeft, out left);\r
-                    int.TryParse(presetQuery.CropRight, out right);\r
-\r
-                    mainWindow.PictureSettings.check_customCrop.Checked = true;\r
-                    mainWindow.PictureSettings.crop_top.Value = top;\r
-                    mainWindow.PictureSettings.crop_bottom.Value = bottom;\r
-                    mainWindow.PictureSettings.crop_left.Value = left;\r
-                    mainWindow.PictureSettings.crop_right.Value = right;\r
-                }\r
+                int top, bottom, left, right;\r
+                int.TryParse(presetQuery.CropTop, out top);\r
+                int.TryParse(presetQuery.CropBottom, out bottom);\r
+                int.TryParse(presetQuery.CropLeft, out left);\r
+                int.TryParse(presetQuery.CropRight, out right);\r
+\r
+                mainWindow.PictureSettings.check_customCrop.Checked = true;\r
+                mainWindow.PictureSettings.crop_top.Value = top;\r
+                mainWindow.PictureSettings.crop_bottom.Value = bottom;\r
+                mainWindow.PictureSettings.crop_left.Value = left;\r
+                mainWindow.PictureSettings.crop_right.Value = right;\r
             }\r
-            \r
+\r
             // Set the anamorphic mode 0,1,2,3\r
             mainWindow.PictureSettings.drp_anamorphic.SelectedIndex = presetQuery.AnamorphicMode;\r
 \r
-            // Aspect Ratio\r
-            mainWindow.PictureSettings.check_KeepAR.CheckState = presetQuery.keepDisplayAsect ? CheckState.Checked : CheckState.Unchecked;\r
-                \r
+            // Keep Aspect Ration Anamorphic Setting.\r
+            mainWindow.PictureSettings.check_KeepAR.CheckState = presetQuery.KeepDisplayAsect\r
+                                                                     ? CheckState.Checked\r
+                                                                     : CheckState.Unchecked;\r
+\r
             // Set the Width and height as Required.\r
             if (presetQuery.Width != 0)\r
                 mainWindow.PictureSettings.text_width.Value = presetQuery.Width;\r
@@ -122,24 +127,33 @@ namespace Handbrake.Functions
                 if (mainWindow.selectedTitle != null && mainWindow.selectedTitle.Resolution.Width != 0)\r
                     mainWindow.PictureSettings.text_width.Value = mainWindow.selectedTitle.Resolution.Width;\r
 \r
+            // Aspect Ratio for non anamorphic sources\r
+            if (presetQuery.AnamorphicMode == 0)\r
+                mainWindow.PictureSettings.check_KeepAR.CheckState = presetQuery.Height == 0\r
+                                                                         ? CheckState.Checked\r
+                                                                         : CheckState.Unchecked;\r
+\r
             // Custom Anamorphic Controls\r
-            mainWindow.PictureSettings.updownDisplayWidth.Text = presetQuery.displayWidthValue.ToString();\r
-            mainWindow.PictureSettings.updownParHeight.Text = presetQuery.pixelAspectWidth.ToString();\r
-            mainWindow.PictureSettings.updownParWidth.Text = presetQuery.pixelAspectHeight.ToString();\r
-            mainWindow.PictureSettings.drp_modulus.SelectedItem = presetQuery.AnamorphicModulus;\r
+            mainWindow.PictureSettings.updownDisplayWidth.Text = presetQuery.DisplayWidthValue.ToString();\r
+            mainWindow.PictureSettings.updownParHeight.Text = presetQuery.PixelAspectHeight.ToString();\r
+            mainWindow.PictureSettings.updownParWidth.Text = presetQuery.PixelAspectWidth.ToString();\r
+            mainWindow.PictureSettings.drp_modulus.SelectedItem = presetQuery.AnamorphicModulus.ToString();\r
 \r
             #endregion\r
 \r
             #region Filters\r
-            mainWindow.Filters.setDecomb(presetQuery.Decomb);\r
-            mainWindow.Filters.setDeInterlace(presetQuery.DeInterlace);\r
-            mainWindow.Filters.setDeNoise(presetQuery.DeNoise);\r
-            mainWindow.Filters.setDeTelecine(presetQuery.DeTelecine);\r
-            mainWindow.Filters.setDeBlock(presetQuery.DeBlock);\r
-            mainWindow.Filters.setGrayScale(presetQuery.Grayscale);\r
+\r
+            mainWindow.Filters.SetDecomb(presetQuery.Decomb);\r
+            mainWindow.Filters.SetDeInterlace(presetQuery.DeInterlace);\r
+            mainWindow.Filters.SetDeNoise(presetQuery.DeNoise);\r
+            mainWindow.Filters.SetDeTelecine(presetQuery.DeTelecine);\r
+            mainWindow.Filters.SetDeBlock(presetQuery.DeBlock);\r
+            mainWindow.Filters.SetGrayScale(presetQuery.Grayscale);\r
+\r
             #endregion\r
 \r
             #region Video\r
+\r
             mainWindow.drp_videoEncoder.Text = presetQuery.VideoEncoder;\r
 \r
             if (presetQuery.AverageVideoBitrate != null)\r
@@ -154,44 +168,16 @@ namespace Handbrake.Functions
             }\r
 \r
             // Quality\r
-            if (presetQuery.VideoQuality != 0)\r
+            if (presetQuery.VideoQuality != -1)\r
             {\r
                 mainWindow.radio_cq.Checked = true;\r
-                if (presetQuery.VideoEncoder == "H.264 (x264)")\r
-                {\r
-                    double cqStep = Properties.Settings.Default.x264cqstep;\r
-                    int value;\r
-                    double x264step = cqStep;\r
-                    double presetValue = presetQuery.VideoQuality;\r
-\r
-                    double x = 51 / x264step;\r
-\r
-                    double calculated = presetValue / x264step;\r
-                    calculated = x - calculated;\r
-\r
-                    int.TryParse(calculated.ToString(), out value);\r
-\r
-                    // This will sometimes occur when the preset was generated \r
-                    // with a different granularity, so, round and try again.\r
-                    if (value == 0)\r
-                    {\r
-                        double val = Math.Round(calculated, 0);\r
-                        int.TryParse(val.ToString(), out value);\r
-                    }\r
-                    if (value < mainWindow.slider_videoQuality.Maximum)\r
-                        mainWindow.slider_videoQuality.Value = value;\r
-                }\r
-                else\r
-                {\r
-                    int presetVal;\r
-                    int.TryParse(presetQuery.VideoQuality.ToString(), out presetVal);\r
-                    mainWindow.slider_videoQuality.Value = presetVal;\r
-                }\r
+                mainWindow.slider_videoQuality.Value = QualityToSliderValue(presetQuery.VideoEncoder, presetQuery.VideoQuality);\r
             }\r
 \r
             mainWindow.check_2PassEncode.CheckState = presetQuery.TwoPass ? CheckState.Checked : CheckState.Unchecked;\r
 \r
             mainWindow.drp_videoFramerate.Text = presetQuery.VideoFramerate;\r
+            mainWindow.checkMaximumFramerate.Checked = presetQuery.Pfr;\r
 \r
             mainWindow.check_turbo.CheckState = presetQuery.TurboFirstPass ? CheckState.Checked : CheckState.Unchecked;\r
 \r
@@ -210,33 +196,45 @@ namespace Handbrake.Functions
             #endregion\r
 \r
             #region Audio\r
-            // Clear the audio listing\r
-            mainWindow.AudioSettings.ClearAudioList();\r
 \r
-            if (presetQuery.AudioInformation != null)\r
-                foreach (AudioTrack track in presetQuery.AudioInformation)\r
-                {\r
-                    ListViewItem newTrack = new ListViewItem(mainWindow.AudioSettings.GetNewID().ToString());\r
-\r
-                    newTrack.SubItems.Add("Automatic");\r
-                    newTrack.SubItems.Add(track.Encoder);\r
-                    newTrack.SubItems.Add(track.MixDown);\r
-                    newTrack.SubItems.Add(track.SampleRate);\r
-                    if (track.Encoder.Contains("AC3"))\r
-                        newTrack.SubItems.Add("Auto");\r
-                    else\r
-                        newTrack.SubItems.Add(track.Bitrate);\r
-                    newTrack.SubItems.Add(track.DRC);\r
-                    mainWindow.AudioSettings.AddTrackForPreset(newTrack);\r
-                }\r
+            mainWindow.AudioSettings.LoadTracks(presetQuery.AudioInformation);\r
+\r
             #endregion\r
 \r
             #region Other\r
-            mainWindow.x264Panel.x264Query = presetQuery.H264Query;\r
+\r
+            mainWindow.x264Panel.X264Query = presetQuery.H264Query;\r
 \r
             // Set the preset name\r
             mainWindow.labelPreset.Text = "Output Settings (Preset: " + name + ")";\r
+\r
             #endregion\r
         }\r
+\r
+        /// <summary>\r
+        /// Convert a Quality Value to a position value for the Video Quality slider\r
+        /// </summary>\r
+        /// <param name="videoEncoder">The selected video encoder</param>\r
+        /// <param name="value">The Quality value</param>\r
+        /// <returns>The position on the video quality slider</returns>\r
+        private static int QualityToSliderValue(string videoEncoder, float value)\r
+        {\r
+            int sliderValue = 0;\r
+            switch (videoEncoder)\r
+            {\r
+                case "MPEG-4 (FFmpeg)":\r
+                    sliderValue = 32 - (int)value;\r
+                    break;\r
+                case "H.264 (x264)":\r
+                    double cqStep = Properties.Settings.Default.x264cqstep;\r
+                    sliderValue = (int)((51.0 / cqStep) - (value / cqStep));\r
+                    break;\r
+                case "VP3 (Theora)":\r
+                    sliderValue = (int)value;\r
+                    break;\r
+            }\r
+\r
+            return sliderValue;\r
+        }\r
     }\r
 }
\ No newline at end of file
index 7491036..bb1c61f 100644 (file)
 ï»¿/*  QueryGenerator.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr/>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
-using System.Globalization;\r
-using System.IO;\r
-using System.Collections.Generic;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Functions\r
 {\r
-    class QueryGenerator\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Globalization;\r
+    using System.IO;\r
+    using System.Windows.Forms;\r
+\r
+    using Handbrake.Model;\r
+\r
+    /// <summary>\r
+    /// Generate a CLI Query for HandBrakeCLI\r
+    /// </summary>\r
+    public class QueryGenerator\r
     {\r
-        /// <summary>\r
-        /// Generates a full CLI query for either encoding or previe encoeds if duration and preview are defined.\r
-        /// </summary>\r
-        /// <param name="mainWindow"></param>\r
-        /// <param name="duration"></param>\r
-        /// <param name="preview"></param>\r
-        /// <returns></returns>\r
-        public string GenerateCLIQuery(frmMain mainWindow, int duration, string preview)\r
+        public static string GenerateQueryForPreset(frmMain mainWindow, QueryPictureSettingsMode mode, bool filters, int width, int height)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            query += GenerateTabbedComponentsQuery(mainWindow, filters, mode, width, height);\r
+\r
+            return query;\r
+        }\r
+\r
+        public static string GeneratePreviewQuery(frmMain mainWindow, int duration, string preview)\r
         {\r
-            string query = "";\r
+            string query = string.Empty;\r
+\r
+            query += SourceQuery(mainWindow, 3, duration, preview);\r
+\r
+            query += DestinationQuery(mainWindow, QueryEncodeMode.Preview);\r
+\r
+            query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);\r
+\r
+            return query;\r
+        }\r
+\r
+        public static string GenerateFullQuery(frmMain mainWindow)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            query += SourceQuery(mainWindow, mainWindow.drop_mode.SelectedIndex, 0, null);\r
+\r
+            query += DestinationQuery(mainWindow, QueryEncodeMode.Standard);\r
+\r
+            query += GenerateTabbedComponentsQuery(mainWindow, true, QueryPictureSettingsMode.UserInterfaceSettings, 0, 0);\r
+\r
+            return query;\r
+        }\r
+\r
+        #region Individual Query Sections\r
+\r
+        private static string GenerateTabbedComponentsQuery(frmMain mainWindow, bool filters, QueryPictureSettingsMode mode, int width, int height)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            // Output Settings\r
+            query += OutputSettingsQuery(mainWindow);\r
+\r
+            // Filters Panel\r
+            if (filters)\r
+                query += FiltersQuery(mainWindow);\r
+\r
+            // Picture Settings\r
+            query += PictureSettingsQuery(mainWindow, mode, width, height);\r
+\r
+            // Video Settings\r
+            query += VideoSettingsQuery(mainWindow);\r
+\r
+            // Audio Settings\r
+            query += AudioSettingsQuery(mainWindow);\r
+\r
+            // Subtitles Panel\r
+            query += mainWindow.Subtitles.GetCliQuery;\r
+\r
+            // Chapter Markers\r
+            query += ChapterMarkersQuery(mainWindow);\r
+\r
+            // X264 Panel\r
+            query += X264Query(mainWindow);\r
 \r
-            if (!string.IsNullOrEmpty(mainWindow.sourcePath))\r
-                if (mainWindow.sourcePath.Trim() != "Select \"Source\" to continue")\r
-                    query = " -i " + '"' + mainWindow.sourcePath + '"';\r
+            // Extra Settings\r
+            query += ExtraSettings();\r
 \r
-            if (mainWindow.drp_dvdtitle.Text != "")\r
+            return query;\r
+        }\r
+\r
+        private static string SourceQuery(frmMain mainWindow, int mode, int duration, string preview)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            if (!string.IsNullOrEmpty(mainWindow.sourcePath) &&\r
+                mainWindow.sourcePath.Trim() != "Select \"Source\" to continue")\r
+                query = " -i " + '"' + mainWindow.sourcePath + '"';\r
+\r
+            if (mainWindow.drp_dvdtitle.Text != string.Empty)\r
             {\r
                 string[] titleInfo = mainWindow.drp_dvdtitle.Text.Split(' ');\r
                 query += " -t " + titleInfo[0];\r
             }\r
 \r
-            if (!Properties.Settings.Default.noDvdNav)\r
-                if (mainWindow.drop_angle.Items.Count != 0)\r
-                    query += " --angle " + mainWindow.drop_angle.SelectedItem;\r
-\r
+            if (!Properties.Settings.Default.noDvdNav && mainWindow.drop_angle.Items.Count != 0)\r
+                query += " --angle " + mainWindow.drop_angle.SelectedItem;\r
 \r
-            if (duration != 0 && preview != null) // Preivew Query\r
+            // Decide what part of the video we want to encode.\r
+            switch (mode)\r
             {\r
-                query += " --start-at-preview " + preview;\r
-                query += " --stop-at duration:" + duration + " ";\r
+                case 0: // Chapters\r
+                    if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text &&\r
+                        mainWindow.drop_chapterStart.Text != string.Empty)\r
+                        query += string.Format(" -c {0}", mainWindow.drop_chapterStart.Text);\r
+                    else if (mainWindow.drop_chapterStart.Text != string.Empty &&\r
+                             mainWindow.drop_chapterFinish.Text != string.Empty)\r
+                        query += string.Format(" -c {0}-{1}", mainWindow.drop_chapterStart.Text,\r
+                                               mainWindow.drop_chapterFinish.Text);\r
+                    break;\r
+                case 1: // Seconds\r
+                    int start, end;\r
+                    int.TryParse(mainWindow.drop_chapterStart.Text, out start);\r
+                    int.TryParse(mainWindow.drop_chapterFinish.Text, out end);\r
+                    int calculatedDuration = end - start;\r
 \r
-                if (mainWindow.text_destination.Text != "")\r
-                    query += " -o " + '"' + mainWindow.text_destination.Text.Replace(".m", "_sample.m") + '"';\r
+                    query += string.Format(" --start-at duration:{0} --stop-at duration:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);\r
+                    break;\r
+                case 2: // Frames\r
+                    int.TryParse(mainWindow.drop_chapterStart.Text, out start);\r
+                    int.TryParse(mainWindow.drop_chapterFinish.Text, out end);\r
+                    calculatedDuration = end - start;\r
+\r
+                    query += string.Format(" --start-at frame:{0} --stop-at frame:{1}", mainWindow.drop_chapterStart.Text, calculatedDuration);\r
+                    break;\r
+                case 3: // Preview\r
+                    query += " --previews " + Properties.Settings.Default.previewScanCount + " ";\r
+                    query += " --start-at-preview " + preview;\r
+                    query += " --stop-at duration:" + duration + " ";\r
+                    break;\r
+                default:\r
+                    break;\r
             }\r
-            else // Non Preview Query\r
+\r
+            return query;\r
+        }\r
+\r
+        private static string DestinationQuery(frmMain mainWindow, QueryEncodeMode mode)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            if (mode != QueryEncodeMode.Preview)\r
+                query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text);\r
+            else\r
             {\r
-                if (mainWindow.drop_chapterFinish.Text == mainWindow.drop_chapterStart.Text && mainWindow.drop_chapterStart.Text != "")\r
-                    query += " -c " + mainWindow.drop_chapterStart.Text;\r
-                else if (mainWindow.drop_chapterStart.Text == "Auto" && mainWindow.drop_chapterFinish.Text != "Auto")\r
-                    query += " -c " + "0-" + mainWindow.drop_chapterFinish.Text;\r
-                else if (mainWindow.drop_chapterStart.Text != "Auto" && mainWindow.drop_chapterFinish.Text != "Auto" && mainWindow.drop_chapterStart.Text != "")\r
-                    query += " -c " + mainWindow.drop_chapterStart.Text + "-" + mainWindow.drop_chapterFinish.Text;\r
-\r
-                if (mainWindow.text_destination.Text != "")\r
-                    query += " -o " + '"' + mainWindow.text_destination.Text + '"';\r
+                if (mainWindow.text_destination.Text != string.Empty)\r
+                    query += string.Format(" -o \"{0}\" ", mainWindow.text_destination.Text.Replace(".m", "_sample.m"));\r
             }\r
 \r
-            query += GenerateTabbedComponentsQuery(mainWindow);\r
-\r
             return query;\r
         }\r
 \r
-        /// <summary>\r
-        /// Generates part of the CLI query, for the tabbed components only.\r
-        /// </summary>\r
-        /// <param name="mainWindow"></param>\r
-        /// <returns></returns>\r
-        public static string GenerateTabbedComponentsQuery(frmMain mainWindow)\r
+        private static string OutputSettingsQuery(frmMain mainWindow)\r
         {\r
-            string query = "";\r
+            string query = string.Empty;\r
 \r
-            #region Output Settings Box\r
-            query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", "");\r
+            query += " -f " + mainWindow.drop_format.Text.ToLower().Replace(" file", string.Empty);\r
 \r
             // These are output settings features\r
             if (mainWindow.check_largeFile.Checked)\r
@@ -87,36 +176,41 @@ namespace Handbrake.Functions
 \r
             if (mainWindow.check_optimiseMP4.Checked)\r
                 query += " -O ";\r
-            #endregion\r
 \r
-            #region Picture Settings Tab\r
+            return query;\r
+        }\r
 \r
-            // Use MaxWidth for built-in presets and width for user settings.\r
-            if (mainWindow.PictureSettings.PresetMaximumResolution.Width == 0)\r
+        private static string PictureSettingsQuery(frmMain mainWindow, QueryPictureSettingsMode mode, int width, int height)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            if (mode == QueryPictureSettingsMode.UserInterfaceSettings)\r
             {\r
                 if (mainWindow.PictureSettings.text_width.Value != 0)\r
                     if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic\r
                         query += " -w " + mainWindow.PictureSettings.text_width.Text;\r
+\r
+                if (mainWindow.PictureSettings.text_height.Value != 0 &&\r
+                    mainWindow.PictureSettings.text_height.Text != string.Empty)\r
+                    if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||\r
+                        mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic\r
+                        query += " -l " + mainWindow.PictureSettings.text_height.Text;\r
             }\r
-            else\r
+            else if (mode == QueryPictureSettingsMode.Custom) // For Add Preset Only.\r
+            {\r
+                query += " -X " + width;\r
+                query += " -Y " + height;\r
+            }\r
+            else if (mode == QueryPictureSettingsMode.SourceMaximum) // For Add Preset Only.\r
             {\r
                 if (mainWindow.PictureSettings.text_width.Value != 0)\r
-                    if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1)\r
+                    if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex != 1) // Prevent usage for strict anamorphic\r
                         query += " -X " + mainWindow.PictureSettings.text_width.Text;\r
-            }\r
 \r
-            // Use MaxHeight for built-in presets and height for user settings.\r
-            if (mainWindow.PictureSettings.PresetMaximumResolution.Height == 0)\r
-            {\r
-                if (mainWindow.PictureSettings.text_height.Value != 0)\r
-                    if (mainWindow.PictureSettings.text_height.Text != "")\r
-                        if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 || mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic\r
-                            query += " -l " + mainWindow.PictureSettings.text_height.Text;\r
-            }\r
-            else\r
-            {\r
-                if (mainWindow.PictureSettings.text_height.Value != 0)\r
-                    if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 || mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3)\r
+                if (mainWindow.PictureSettings.text_height.Value != 0 &&\r
+                    mainWindow.PictureSettings.text_height.Text != string.Empty)\r
+                    if (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 0 ||\r
+                        mainWindow.PictureSettings.drp_anamorphic.SelectedIndex == 3) // Prevent usage for strict anamorphic\r
                         query += " -Y " + mainWindow.PictureSettings.text_height.Text;\r
             }\r
 \r
@@ -125,7 +219,7 @@ namespace Handbrake.Functions
             string cropLeft = mainWindow.PictureSettings.crop_left.Text;\r
             string cropRight = mainWindow.PictureSettings.crop_right.Text;\r
 \r
-            if (mainWindow.PictureSettings.check_customCrop.Checked)\r
+            if (mainWindow.PictureSettings.check_customCrop.Checked && mode != QueryPictureSettingsMode.None)\r
             {\r
                 if (mainWindow.PictureSettings.crop_top.Text == string.Empty)\r
                     cropTop = "0";\r
@@ -141,11 +235,17 @@ namespace Handbrake.Functions
 \r
             switch (mainWindow.PictureSettings.drp_anamorphic.SelectedIndex)\r
             {\r
+                case 0:\r
+                    if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)\r
+                        query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;\r
+                    break;\r
                 case 1:\r
                     query += " --strict-anamorphic ";\r
                     break;\r
                 case 2:\r
                     query += " --loose-anamorphic ";\r
+                    if (mainWindow.PictureSettings.drp_modulus.SelectedIndex != 0)\r
+                        query += " --modulus " + mainWindow.PictureSettings.drp_modulus.SelectedItem;\r
                     break;\r
                 case 3:\r
                     query += " --custom-anamorphic ";\r
@@ -160,17 +260,24 @@ namespace Handbrake.Functions
                         query += " --keep-display-aspect ";\r
 \r
                     if (!mainWindow.PictureSettings.check_KeepAR.Checked)\r
-                        if (mainWindow.PictureSettings.updownParWidth.Text != "" && mainWindow.PictureSettings.updownParHeight.Text != "")\r
-                            query += " --pixel-aspect " + mainWindow.PictureSettings.updownParWidth.Text + ":" + mainWindow.PictureSettings.updownParHeight.Text + " ";\r
+                        if (mainWindow.PictureSettings.updownParWidth.Text != string.Empty &&\r
+                            mainWindow.PictureSettings.updownParHeight.Text != string.Empty)\r
+                            query += " --pixel-aspect " + mainWindow.PictureSettings.updownParWidth.Text + ":" +\r
+                                     mainWindow.PictureSettings.updownParHeight.Text + " ";\r
                     break;\r
             }\r
-            #endregion\r
 \r
-            #region Filters\r
-            query += mainWindow.Filters.getCLIQuery;\r
-            #endregion\r
+            return query;\r
+        }\r
 \r
-            #region Video Settings Tab\r
+        private static string FiltersQuery(frmMain mainWindow)\r
+        {\r
+            return mainWindow.Filters.GetCliQuery;\r
+        }\r
+\r
+        private static string VideoSettingsQuery(frmMain mainWindow)\r
+        {\r
+            string query = string.Empty;\r
 \r
             switch (mainWindow.drp_videoEncoder.Text)\r
             {\r
@@ -208,7 +315,7 @@ namespace Handbrake.Functions
                         break;\r
                     case "H.264 (x264)":\r
                         CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");\r
-                        value = 51 - mainWindow.slider_videoQuality.Value * cqStep;\r
+                        value = 51 - (mainWindow.slider_videoQuality.Value * cqStep);\r
                         value = Math.Round(value, 2);\r
                         query += " -q " + value.ToString(culture);\r
                         break;\r
@@ -227,11 +334,18 @@ namespace Handbrake.Functions
 \r
             if (mainWindow.drp_videoFramerate.Text != "Same as source")\r
                 query += " -r " + mainWindow.drp_videoFramerate.Text;\r
-            #endregion\r
 \r
-            #region Audio Settings Tab\r
+            if (mainWindow.checkMaximumFramerate.Checked)\r
+                query += " --pfr ";\r
+\r
+            return query;\r
+        }\r
 \r
-            ListView audioTracks = mainWindow.AudioSettings.GetAudioPanel();\r
+        private static string AudioSettingsQuery(frmMain mainWindow)\r
+        {\r
+            string query = string.Empty;\r
+\r
+            DataGridView audioTracks = mainWindow.AudioSettings.GetAudioPanel();\r
             List<string> tracks = new List<string>();\r
             List<string> codecs = new List<string>();\r
             List<string> mixdowns = new List<string>();\r
@@ -240,115 +354,124 @@ namespace Handbrake.Functions
             List<string> drcs = new List<string>();\r
 \r
             // No Audio\r
-            if (audioTracks.Items.Count == 0)\r
+            if (audioTracks.Rows.Count == 0)\r
                 query += " -a none ";\r
 \r
             // Gather information about each audio track and store them in the declared lists.\r
-            foreach (ListViewItem row in audioTracks.Items)\r
+            foreach (DataGridViewRow row in audioTracks.Rows)\r
             {\r
                 // Audio Track (-a)\r
-                if (row.SubItems[1].Text == "Automatic")\r
+                if (row.Cells[1].Value.ToString() == "Automatic")\r
                     tracks.Add("1");\r
-                else if (row.Text != "None")\r
+                else if (row.Cells[1].Value.ToString() != "None")\r
                 {\r
-                    string[] tempSub = row.SubItems[1].Text.Split(' ');\r
+                    string[] tempSub = row.Cells[1].Value.ToString().Split(' ');\r
                     tracks.Add(tempSub[0]);\r
                 }\r
 \r
                 // Audio Codec (-E)\r
-                if (row.SubItems[2].Text != String.Empty)\r
-                    codecs.Add(getAudioEncoder(row.SubItems[2].Text));\r
+                if (row.Cells[2].Value.ToString() != String.Empty)\r
+                    codecs.Add(GetAudioEncoder(row.Cells[2].Value.ToString()));\r
 \r
                 // Audio Mixdown (-6)\r
-                if (row.SubItems[3].Text != String.Empty)\r
-                    mixdowns.Add(getMixDown(row.SubItems[3].Text));\r
+                if (row.Cells[3].Value.ToString() != String.Empty)\r
+                    mixdowns.Add(GetMixDown(row.Cells[3].Value.ToString()));\r
 \r
                 // Sample Rate (-R)\r
-                if (row.SubItems[4].Text != String.Empty)\r
-                    samplerates.Add(row.SubItems[4].Text.Replace("Auto", "Auto"));\r
+                if (row.Cells[4].Value.ToString() != String.Empty)\r
+                    samplerates.Add(row.Cells[4].Value.ToString());\r
 \r
                 // Audio Bitrate (-B)\r
-                if (row.SubItems[5].Text != String.Empty)\r
-                    bitrates.Add(row.SubItems[5].Text.Replace("Auto", "auto"));\r
+                if (row.Cells[5].Value.ToString() != String.Empty)\r
+                    bitrates.Add(row.Cells[5].Value.ToString().Replace("Auto", "auto"));\r
 \r
                 // DRC (-D)\r
-                if (row.SubItems[6].Text != String.Empty)\r
-                    drcs.Add(row.SubItems[6].Text);\r
+                if (row.Cells[6].Value.ToString() != String.Empty)\r
+                    drcs.Add(row.Cells[6].Value.ToString());\r
             }\r
 \r
             // Audio Track (-a)\r
-            String audioItems = "";\r
-            Boolean firstLoop = true;\r
+            string audioItems = string.Empty;\r
+            bool firstLoop = true;\r
 \r
-            foreach (String item in tracks)\r
+            foreach (string item in tracks)\r
             {\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
             }\r
             if (audioItems.Trim() != String.Empty)\r
                 query += " -a " + audioItems;\r
-            firstLoop = true; audioItems = ""; // Reset for another pass.\r
+            firstLoop = true;\r
+            audioItems = string.Empty; // Reset for another pass.\r
 \r
             // Audio Codec (-E)\r
-            foreach (String item in codecs)\r
+            foreach (string item in codecs)\r
             {\r
-\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
             }\r
             if (audioItems.Trim() != String.Empty)\r
                 query += " -E " + audioItems;\r
-            firstLoop = true; audioItems = ""; // Reset for another pass.\r
+            firstLoop = true;\r
+            audioItems = string.Empty; // Reset for another pass.\r
 \r
             // Audio Mixdown (-6)\r
-            foreach (String item in mixdowns)\r
+            foreach (string item in mixdowns)\r
             {\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
             }\r
             if (audioItems.Trim() != String.Empty)\r
                 query += " -6 " + audioItems;\r
-            firstLoop = true; audioItems = ""; // Reset for another pass.\r
+            firstLoop = true;\r
+            audioItems = string.Empty; // Reset for another pass.\r
 \r
             // Sample Rate (-R)\r
-            foreach (String item in samplerates)\r
+            foreach (string item in samplerates)\r
             {\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
             }\r
             if (audioItems.Trim() != String.Empty)\r
                 query += " -R " + audioItems;\r
-            firstLoop = true; audioItems = ""; // Reset for another pass.\r
+            firstLoop = true;\r
+            audioItems = string.Empty; // Reset for another pass.\r
 \r
             // Audio Bitrate (-B)\r
-            foreach (String item in bitrates)\r
+            foreach (string item in bitrates)\r
             {\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
             }\r
             if (audioItems.Trim() != String.Empty)\r
                 query += " -B " + audioItems;\r
-            firstLoop = true; audioItems = ""; // Reset for another pass.\r
+            firstLoop = true;\r
+            audioItems = string.Empty; // Reset for another pass.\r
 \r
             // DRC (-D)\r
             foreach (var itm in drcs)\r
@@ -356,7 +479,8 @@ namespace Handbrake.Functions
                 string item = itm.ToString(new CultureInfo("en-US"));\r
                 if (firstLoop)\r
                 {\r
-                    audioItems = item; firstLoop = false;\r
+                    audioItems = item;\r
+                    firstLoop = false;\r
                 }\r
                 else\r
                     audioItems += "," + item;\r
@@ -364,141 +488,33 @@ namespace Handbrake.Functions
             if (audioItems.Trim() != String.Empty)\r
                 query += " -D " + audioItems;\r
 \r
-            #endregion\r
-\r
-            #region Subtitles Tab\r
-            if (mainWindow.Subtitles.lv_subList.Items.Count != 0) // If we have subtitle tracks\r
-            {\r
-                IDictionary<string, string> langMap = Main.mapLanguages();\r
-\r
-                // BitMap and CC's\r
-                string subtitleTracks = String.Empty;\r
-                string subtitleForced = String.Empty;\r
-                string subtitleBurn = String.Empty;\r
-                string subtitleDefault = String.Empty;\r
\r
-                // SRT\r
-                string srtFile = String.Empty;\r
-                string srtCodeset = String.Empty;\r
-                string srtOffset = String.Empty;\r
-                string srtLang = String.Empty;\r
-                string srtDefault = String.Empty;\r
-                int srtCount = 0;\r
-\r
-                List<Controls.SubtitleInfo> SubList = mainWindow.Subtitles.GetSubtitleInfoList();\r
-\r
-                foreach (var item in SubList)\r
-                {\r
-                    string itemToAdd, trackID;\r
-\r
-                    if (item.SrtPath != "-") // We have an SRT file\r
-                    {\r
-                        srtCount++; // SRT track id.\r
-\r
-                        srtLang += srtLang == "" ? langMap[item.SrtLang] : "," + langMap[item.SrtLang];\r
-                        srtCodeset += srtCodeset == "" ? item.SrtCharCode : "," + item.SrtCharCode;\r
-\r
-                        if (item.Default == "Yes") // default\r
-                            srtDefault = srtCount.ToString();\r
-\r
-                        itemToAdd = item.SrtPath;\r
-                        srtFile += srtFile == "" ? itemToAdd : "," + itemToAdd;\r
-\r
-                        itemToAdd = item.SrtOffset.ToString();\r
-                        srtOffset += srtOffset == "" ? itemToAdd : "," + itemToAdd;\r
-                    }\r
-                    else // We have Bitmap or CC\r
-                    {\r
-                        string[] tempSub;\r
-\r
-                        // Find --subtitle <string>\r
-                        if (item.Track.Contains("Foreign Audio Search"))\r
-                            itemToAdd = "scan";\r
-                        else\r
-                        {\r
-                            tempSub = item.Track.Split(' ');\r
-                            itemToAdd = tempSub[0];\r
-                        }\r
-\r
-                        subtitleTracks += subtitleTracks == "" ? itemToAdd : "," + itemToAdd;\r
-\r
-                        // Find --subtitle-forced\r
-                        itemToAdd = "";\r
-                        tempSub = item.Track.Split(' ');\r
-                        trackID = tempSub[0];\r
-\r
-                        if (item.Forced == "Yes")\r
-                            itemToAdd = trackID;\r
-\r
-                        if (itemToAdd != "")\r
-                            subtitleForced += subtitleForced == "" ? itemToAdd : "," + itemToAdd;\r
-\r
-                        // Find --subtitle-burn and --subtitle-default\r
-                        trackID = tempSub[0];\r
-\r
-                        if (trackID.Trim() == "Foreign")\r
-                            trackID = "scan";\r
-\r
-                        if (item.Burned == "Yes") // burn\r
-                            subtitleBurn = trackID;\r
-\r
-                        if (item.Default == "Yes") // default\r
-                            subtitleDefault = trackID;\r
-                    }\r
-                }\r
-\r
-                // Build The CLI Subtitles Query\r
-                if (subtitleTracks != "")\r
-                {\r
-                    query += " --subtitle " + subtitleTracks;\r
-\r
-                    if (subtitleForced != "")\r
-                        query += " --subtitle-forced=" + subtitleForced;\r
-                    if (subtitleBurn != "")\r
-                        query += " --subtitle-burn=" + subtitleBurn;\r
-                    if (subtitleDefault != "")\r
-                        query += " --subtitle-default=" + subtitleDefault;\r
-                }\r
-\r
-                if (srtFile != "") // SRTs\r
-                {\r
-                    query += " --srt-file " + "\"" + srtFile + "\"";\r
-\r
-                    if (srtCodeset != "")\r
-                        query += " --srt-codeset " + srtCodeset;\r
-                    if (srtOffset != "")\r
-                        query += " --srt-offset " + srtOffset;\r
-                    if (srtLang != "")\r
-                        query += " --srt-lang " + srtLang;\r
-                    if (srtDefault != "")\r
-                        query += " --srt-default=" + srtDefault;\r
-                }\r
-\r
-            }\r
-            #endregion\r
+            return query;\r
+        }\r
 \r
-            #region Chapter Markers\r
+        private static string ChapterMarkersQuery(frmMain mainWindow)\r
+        {\r
+            string query = string.Empty;\r
 \r
             // Attach Source name and dvd title to the start of the chapters.csv filename.\r
             // This is for the queue. It allows different chapter name files for each title.\r
-            string[] destName = mainWindow.text_destination.Text.Split('\\');\r
-            string dest_name = destName[destName.Length - 1];\r
-            dest_name = dest_name.Replace("\"", "");\r
-            dest_name = dest_name.Replace(".mp4", "").Replace(".m4v", "").Replace(".mkv", "");\r
+            string[] destNameSplit = mainWindow.text_destination.Text.Split('\\');\r
+            string destName = destNameSplit[destNameSplit.Length - 1];\r
+            destName = destName.Replace("\"", string.Empty);\r
+            destName = destName.Replace(".mp4", string.Empty).Replace(".m4v", string.Empty).Replace(".mkv", string.Empty);\r
 \r
-            string source_title = mainWindow.drp_dvdtitle.Text;\r
-            string[] titlesplit = source_title.Split(' ');\r
-            source_title = titlesplit[0];\r
+            string sourceTitle = mainWindow.drp_dvdtitle.Text;\r
+            string[] titlesplit = sourceTitle.Split(' ');\r
+            sourceTitle = titlesplit[0];\r
 \r
             if (mainWindow.Check_ChapterMarkers.Checked && mainWindow.Check_ChapterMarkers.Enabled)\r
             {\r
-                if (dest_name.Trim() != String.Empty)\r
+                if (destName.Trim() != String.Empty)\r
                 {\r
-                    string path = source_title != "Automatic"\r
-                                      ? Path.Combine(Path.GetTempPath(), dest_name + "-" + source_title + "-chapters.csv")\r
-                                      : Path.Combine(Path.GetTempPath(), dest_name + "-chapters.csv");\r
+                    string path = sourceTitle != "Automatic"\r
+                                      ? Path.Combine(Path.GetTempPath(), destName + "-" + sourceTitle + "-chapters.csv")\r
+                                      : Path.Combine(Path.GetTempPath(), destName + "-chapters.csv");\r
 \r
-                    if (chapterCSVSave(mainWindow, path) == false)\r
+                    if (ChapterCsvSave(mainWindow, path) == false)\r
                         query += " -m ";\r
                     else\r
                         query += " --markers=" + "\"" + path + "\"";\r
@@ -506,28 +522,41 @@ namespace Handbrake.Functions
                 else\r
                     query += " -m";\r
             }\r
-            #endregion\r
 \r
-            #region  H264 Tab\r
-            if (mainWindow.x264Panel.x264Query != "")\r
-                query += " -x " + mainWindow.x264Panel.x264Query;\r
-            #endregion\r
+            return query;\r
+        }\r
+\r
+        private static string X264Query(frmMain mainWindow)\r
+        {\r
+            if (string.IsNullOrEmpty(mainWindow.x264Panel.X264Query)) return string.Empty;\r
 \r
-            #region Processors / Other\r
-            string processors = Properties.Settings.Default.Processors;\r
-            if (processors != "Automatic")\r
-                query += " -C " + processors + " ";\r
+            return " -x " + mainWindow.x264Panel.X264Query;\r
+        }\r
+\r
+        private static string ExtraSettings()\r
+        {\r
+            string query = string.Empty;\r
 \r
-            query += " -v " + Properties.Settings.Default.verboseLevel;\r
+            // Verbosity Level\r
+            query += " --verbose=" + Properties.Settings.Default.verboseLevel;\r
 \r
+            // LibDVDNav\r
             if (Properties.Settings.Default.noDvdNav)\r
                 query += " --no-dvdnav";\r
-            #endregion\r
 \r
             return query;\r
         }\r
 \r
-        private static string getMixDown(string selectedAudio)\r
+        #endregion\r
+\r
+        #region Helpers\r
+\r
+        /// <summary>\r
+        /// Return the CLI Mixdown name\r
+        /// </summary>\r
+        /// <param name="selectedAudio">GUI mixdown name</param>\r
+        /// <returns>CLI mixdown name</returns>\r
+        private static string GetMixDown(string selectedAudio)\r
         {\r
             switch (selectedAudio)\r
             {\r
@@ -547,7 +576,17 @@ namespace Handbrake.Functions
                     return "auto";\r
             }\r
         }\r
-        private static string getAudioEncoder(string selectedEncoder)\r
+\r
+        /// <summary>\r
+        /// Get the CLI Audio Encoder name\r
+        /// </summary>\r
+        /// <param name="selectedEncoder">\r
+        /// String The GUI Encode name\r
+        /// </param>\r
+        /// <returns>\r
+        /// String CLI encoder name\r
+        /// </returns>\r
+        private static string GetAudioEncoder(string selectedEncoder)\r
         {\r
             switch (selectedEncoder)\r
             {\r
@@ -558,24 +597,33 @@ namespace Handbrake.Functions
                 case "Vorbis (vorbis)":\r
                     return "vorbis";\r
                 case "AC3 Passthru":\r
-                    return "ac3";\r
+                    return "copy:ac3";\r
                 case "DTS Passthru":\r
-                    return "dts";\r
+                    return "copy:dts";\r
+                case "AC3 (ffmpeg)":\r
+                    return "ac3";\r
                 default:\r
-                    return "";\r
+                    return string.Empty;\r
             }\r
         }\r
-        private static Boolean chapterCSVSave(frmMain mainWindow, string filePathName)\r
+\r
+        /// <summary>\r
+        /// Create a CSV file with the data from the Main Window Chapters tab\r
+        /// </summary>\r
+        /// <param name="mainWindow">Main Window</param>\r
+        /// <param name="filePathName">Path to save the csv file</param>\r
+        /// <returns>True if successful </returns>\r
+        private static bool ChapterCsvSave(frmMain mainWindow, string filePathName)\r
         {\r
             try\r
             {\r
-                string csv = "";\r
+                string csv = string.Empty;\r
 \r
                 foreach (DataGridViewRow row in mainWindow.data_chpt.Rows)\r
                 {\r
                     csv += row.Cells[0].Value.ToString();\r
                     csv += ",";\r
-                    csv += row.Cells[1].Value.ToString();\r
+                    csv += row.Cells[1].Value.ToString().Replace(",", "\\,");\r
                     csv += Environment.NewLine;\r
                 }\r
                 StreamWriter file = new StreamWriter(filePathName);\r
@@ -590,5 +638,6 @@ namespace Handbrake.Functions
                 return false;\r
             }\r
         }\r
+        #endregion\r
     }\r
 }
\ No newline at end of file
index 7230ad9..01344c8 100644 (file)
 /*  QueryParser.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Globalization;\r
-using System.Text.RegularExpressions;\r
-using System.Windows.Forms;\r
-using System.Collections;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Functions\r
 {\r
-    internal class QueryParser\r
+    using System;\r
+    using System.Collections;\r
+    using System.Globalization;\r
+    using System.Text.RegularExpressions;\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// Parse a CLI Query\r
+    /// </summary>\r
+    public class QueryParser\r
     {\r
+        /// <summary>\r
+        /// The Culture\r
+        /// </summary>\r
         private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
 \r
         #region Varibles\r
 \r
-        // Source\r
-        public int DVDTitle { get; set; }\r
-        public int DVDChapterStart { get; set; }\r
-        public int DVDChapterFinish { get; set; }\r
+        #region Source Title / Chapters\r
+        /// <summary>\r
+        /// Gets or sets Title.\r
+        /// </summary>\r
+        public int Title { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets ChapterStart.\r
+        /// </summary>\r
+        public int ChapterStart { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets ChapterFinish.\r
+        /// </summary>\r
+        public int ChapterFinish { get; set; }\r
+        #endregion\r
 \r
-        // Output Settings\r
+        #region Output Settings\r
+        /// <summary>\r
+        /// Gets or sets the file Format. e.g mkv or mp4\r
+        /// </summary>\r
         public string Format { get; set; }\r
-        public Boolean LargeMP4 { get; set; }\r
-        public Boolean IpodAtom { get; set; }\r
-        public Boolean OptimizeMP4 { get; set; }\r
 \r
-        // Picture Settings\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether LargeMP4 support is enabled.\r
+        /// This is the 64bit MP4 file that allows >4GB files\r
+        /// </summary>\r
+        public bool LargeMP4 { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether IpodAtom is inserted\r
+        /// </summary>\r
+        public bool IpodAtom { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether OptimizeMP4 is enabed for web streaming\r
+        /// </summary>\r
+        public bool OptimizeMP4 { get; set; }\r
+        #endregion\r
+\r
+        #region Picture Settings\r
+\r
+        /// <summary>\r
+        /// Gets or sets Width.\r
+        /// </summary>\r
         public int Width { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Height.\r
+        /// </summary>\r
         public int Height { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets MaxWidth.\r
+        /// </summary>\r
         public int MaxWidth { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets MaxHeight.\r
+        /// </summary>\r
         public int MaxHeight { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CropValues.\r
+        /// </summary>\r
         public string CropValues { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CropTop.\r
+        /// </summary>\r
         public string CropTop { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CropBottom.\r
+        /// </summary>\r
         public string CropBottom { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CropLeft.\r
+        /// </summary>\r
         public string CropLeft { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CropRight.\r
+        /// </summary>\r
         public string CropRight { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets AnamorphicMode.\r
+        /// </summary>\r
         public int AnamorphicMode { get; set; }\r
-        public Boolean keepDisplayAsect { get; set; }\r
-        public double displayWidthValue { get; set; }\r
-        public int pixelAspectWidth { get; set; }\r
-        public int pixelAspectHeight { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether KeepDisplayAsect.\r
+        /// </summary>\r
+        public bool KeepDisplayAsect { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets DisplayWidthValue.\r
+        /// </summary>\r
+        public double DisplayWidthValue { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets PixelAspectWidth.\r
+        /// </summary>\r
+        public int PixelAspectWidth { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets PixelAspectHeight.\r
+        /// </summary>\r
+        public int PixelAspectHeight { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets AnamorphicModulus.\r
+        /// </summary>\r
         public int AnamorphicModulus { get; set; }\r
+        #endregion\r
+\r
+        #region Video Filters\r
 \r
-        // Video Filters\r
+        /// <summary>\r
+        /// Gets or sets DeTelecine.\r
+        /// </summary>\r
         public string DeTelecine { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets DeBlock.\r
+        /// </summary>\r
         public int DeBlock { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets DeInterlace.\r
+        /// </summary>\r
         public string DeInterlace { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets DeNoise.\r
+        /// </summary>\r
         public string DeNoise { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Decomb.\r
+        /// </summary>\r
         public string Decomb { get; set; }\r
+        #endregion\r
 \r
-        // Video Settings\r
+        #region Video Settings\r
+        /// <summary>\r
+        /// Gets or sets VideoEncoder.\r
+        /// </summary>\r
         public string VideoEncoder { get; set; }\r
-        public Boolean Grayscale { get; set; }\r
-        public Boolean TwoPass { get; set; }\r
-        public Boolean TurboFirstPass { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether Grayscale.\r
+        /// </summary>\r
+        public bool Grayscale { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether TwoPass.\r
+        /// </summary>\r
+        public bool TwoPass { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether TurboFirstPass.\r
+        /// </summary>\r
+        public bool TurboFirstPass { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets VideoFramerate.\r
+        /// </summary>\r
         public string VideoFramerate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether Pfr.\r
+        /// </summary>\r
+        public bool Pfr { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets AverageVideoBitrate.\r
+        /// </summary>\r
         public string AverageVideoBitrate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets VideoTargetSize.\r
+        /// </summary>\r
         public string VideoTargetSize { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets VideoQuality.\r
+        /// </summary>\r
         public float VideoQuality { get; set; }\r
+        #endregion\r
+\r
+        #region Audio Settings\r
 \r
-        // Audio Settings\r
+        /// <summary>\r
+        /// Gets or sets AudioInformation.\r
+        /// </summary>\r
         public ArrayList AudioInformation { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Subtitles.\r
+        /// </summary>\r
         public string Subtitles { get; set; }\r
-        public Boolean ForcedSubtitles { get; set; }\r
 \r
-        // Chapter Markers\r
-        public Boolean ChapterMarkers { get; set; }\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether ForcedSubtitles.\r
+        /// </summary>\r
+        public bool ForcedSubtitles { get; set; }\r
+        #endregion\r
+\r
+        #region Other\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether ChapterMarkers.\r
+        /// </summary>\r
+        public bool ChapterMarkers { get; set; }\r
 \r
-        // Other\r
+        /// <summary>\r
+        /// Gets or sets H264Query.\r
+        /// </summary>\r
         public string H264Query { get; set; }\r
-        public Boolean Verbose { get; set; }\r
 \r
-        // Preset Information\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether Verbose.\r
+        /// </summary>\r
+        public bool Verbose { get; set; }\r
+        #endregion\r
+\r
+        #region Preset Information\r
+\r
+        /// <summary>\r
+        /// Gets or sets PresetBuildNumber.\r
+        /// </summary>\r
         public int PresetBuildNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets PresetDescription.\r
+        /// </summary>\r
         public string PresetDescription { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets PresetName.\r
+        /// </summary>\r
         public string PresetName { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Type.\r
+        /// </summary>\r
         public string Type { get; set; }\r
-        public Boolean UsesMaxPictureSettings { get; set; }\r
-        public Boolean UsesPictureFilters { get; set; }\r
-        public Boolean UsesPictureSettings { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether UsesMaxPictureSettings.\r
+        /// </summary>\r
+        public bool UsesMaxPictureSettings { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether UsesPictureFilters.\r
+        /// </summary>\r
+        public bool UsesPictureFilters { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether UsesPictureSettings.\r
+        /// </summary>\r
+        public bool UsesPictureSettings { get; set; }\r
+        #endregion\r
 \r
         #endregion\r
 \r
@@ -92,23 +297,23 @@ namespace Handbrake.Functions
         /// </summary>\r
         /// <param name="input">A ClI Query</param>\r
         /// <returns>A Parsed Query</returns>\r
-        public static QueryParser Parse(String input)\r
+        public static QueryParser Parse(string input)\r
         {\r
             var thisQuery = new QueryParser();\r
 \r
             #region Regular Expressions\r
 \r
-            //Source\r
+            // Source\r
             Match title = Regex.Match(input, @"-t ([0-9]*)");\r
             Match chapters = Regex.Match(input, @"-c ([0-9-]*)");\r
 \r
-            //Output Settings\r
+            // Output Settings\r
             Match format = Regex.Match(input, @"-f ([a-z0-9a-z0-9a-z0-9]*)");\r
             Match grayscale = Regex.Match(input, @" -g");\r
             Match largerMp4 = Regex.Match(input, @" -4");\r
             Match ipodAtom = Regex.Match(input, @" -I");\r
 \r
-            //Picture Settings Tab\r
+            // Picture Settings Tab\r
             Match width = Regex.Match(input, @"-w ([0-9]*)");\r
             Match height = Regex.Match(input, @"-l ([0-9]*)");\r
             Match maxWidth = Regex.Match(input, @"-X ([0-9]*)");\r
@@ -120,9 +325,9 @@ namespace Handbrake.Functions
             Match customAnamorphic = Regex.Match(input, @"--custom-anamorphic");\r
 \r
             Match keepDisplayAsect = Regex.Match(input, @"--keep-display-aspect");\r
-            Match displayWidth = Regex.Match(input, @"--display-width ([0-9*])");\r
+            Match displayWidth = Regex.Match(input, @"--display-width ([0-9]*)");\r
             Match pixelAspect = Regex.Match(input, @"--pixel-aspect ([0-9]*):([0-9]*)");\r
-            Match modulus = Regex.Match(input, @"--modulus ([0-9*])");\r
+            Match modulus = Regex.Match(input, @"--modulus ([0-9]*)");\r
 \r
             // Picture Settings - Filters\r
             Match decomb = Regex.Match(input, @" --decomb");\r
@@ -133,7 +338,7 @@ namespace Handbrake.Functions
             Match detelecine = Regex.Match(input, @"--detelecine");\r
             Match detelecineValue = Regex.Match(input, @" --detelecine=\""([a-zA-Z0-9.:]*)\""");\r
 \r
-            //Video Settings Tab\r
+            // Video Settings Tab\r
             Match videoEncoder = Regex.Match(input, @"-e ([a-zA-Z0-9]*)");\r
             Match videoFramerate = Regex.Match(input, @"-r ([0-9.]*)");\r
             Match videoBitrate = Regex.Match(input, @"-b ([0-9]*)");\r
@@ -142,14 +347,15 @@ namespace Handbrake.Functions
             Match twoPass = Regex.Match(input, @" -2");\r
             Match turboFirstPass = Regex.Match(input, @" -T");\r
             Match optimizeMP4 = Regex.Match(input, @" -O");\r
+            Match pfr = Regex.Match(input, @" --pfr");\r
 \r
-            //Audio Settings Tab\r
+            // Audio Settings Tab\r
             Match noAudio = Regex.Match(input, @"-a none");\r
             Match audioTracks = Regex.Match(input, @"-a ([0-9,]*)");\r
             Match audioTrackMixes = Regex.Match(input, @"-6 ([0-9a-zA-Z,]*)");\r
-            Match audioEncoders = Regex.Match(input, @"-E ([a-zA-Z0-9+,]*)");\r
-            Match audioBitrates = Regex.Match(input, @"-B ([0-9a-zA-Z,]*)");       // Auto = a-z\r
-            Match audioSampleRates = Regex.Match(input, @"-R ([0-9a-zA-Z.,]*)");  // Auto = a-z\r
+            Match audioEncoders = Regex.Match(input, @"-E ([a-zA-Z0-9+,:]*)");\r
+            Match audioBitrates = Regex.Match(input, @"-B ([0-9a-zA-Z,]*)"); // Auto = a-z\r
+            Match audioSampleRates = Regex.Match(input, @"-R ([0-9a-zA-Z.,]*)"); // Auto = a-z\r
             Match drcValues = Regex.Match(input, @"-D ([0-9.,]*)");\r
 \r
             Match subtitles = Regex.Match(input, @"-s ([0-9a-zA-Z]*)");\r
@@ -160,10 +366,10 @@ namespace Handbrake.Functions
             Match chapterMarkers = Regex.Match(input, @" -m");\r
             Match chapterMarkersFileMode = Regex.Match(input, @"--markers");\r
 \r
-            //H264 Tab\r
+            // H264 Tab\r
             Match x264 = Regex.Match(input, @"-x ([.,/a-zA-Z0-9=:-]*)");\r
 \r
-            //Program Options\r
+            // Program Options\r
             Match verbose = Regex.Match(input, @" -v");\r
 \r
             #endregion\r
@@ -175,26 +381,27 @@ namespace Handbrake.Functions
                 #region Source Tab\r
 \r
                 if (title.Success)\r
-                    thisQuery.DVDTitle = int.Parse(title.ToString().Replace("-t ", ""));\r
+                    thisQuery.Title = int.Parse(title.ToString().Replace("-t ", string.Empty));\r
 \r
                 if (chapters.Success)\r
                 {\r
-                    string[] actTitles = chapters.ToString().Replace("-c ", "").Split('-');\r
-                    thisQuery.DVDChapterStart = int.Parse(actTitles[0]);\r
+                    string[] actTitles = chapters.ToString().Replace("-c ", string.Empty).Split('-');\r
+                    thisQuery.ChapterStart = int.Parse(actTitles[0]);\r
                     if (actTitles.Length > 1)\r
                     {\r
-                        thisQuery.DVDChapterFinish = int.Parse(actTitles[1]);\r
+                        thisQuery.ChapterFinish = int.Parse(actTitles[1]);\r
                     }\r
 \r
-                    if ((thisQuery.DVDChapterStart == 1) && (thisQuery.DVDChapterFinish == 0))\r
-                        thisQuery.DVDChapterFinish = thisQuery.DVDChapterStart;\r
+                    if ((thisQuery.ChapterStart == 1) && (thisQuery.ChapterFinish == 0))\r
+                        thisQuery.ChapterFinish = thisQuery.ChapterStart;\r
                 }\r
+\r
                 #endregion\r
 \r
                 #region Output Settings\r
 \r
                 if (format.Success)\r
-                    thisQuery.Format = format.ToString().Replace("-f ", "");\r
+                    thisQuery.Format = format.ToString().Replace("-f ", string.Empty);\r
                 thisQuery.LargeMP4 = largerMp4.Success;\r
                 thisQuery.IpodAtom = ipodAtom.Success;\r
                 thisQuery.OptimizeMP4 = optimizeMP4.Success;\r
@@ -204,20 +411,20 @@ namespace Handbrake.Functions
                 #region Picture Tab\r
 \r
                 if (width.Success)\r
-                    thisQuery.Width = int.Parse(width.Groups[0].Value.Replace("-w ", ""));\r
+                    thisQuery.Width = int.Parse(width.Groups[0].Value.Replace("-w ", string.Empty));\r
 \r
                 if (height.Success)\r
-                    thisQuery.Height = int.Parse(height.Groups[0].Value.Replace("-l ", ""));\r
+                    thisQuery.Height = int.Parse(height.Groups[0].Value.Replace("-l ", string.Empty));\r
 \r
                 if (maxWidth.Success)\r
-                    thisQuery.MaxWidth = int.Parse(maxWidth.Groups[0].Value.Replace("-X ", ""));\r
+                    thisQuery.MaxWidth = int.Parse(maxWidth.Groups[0].Value.Replace("-X ", string.Empty));\r
 \r
                 if (maxHeight.Success)\r
-                    thisQuery.MaxHeight = int.Parse(maxHeight.Groups[0].Value.Replace("-Y ", ""));\r
+                    thisQuery.MaxHeight = int.Parse(maxHeight.Groups[0].Value.Replace("-Y ", string.Empty));\r
 \r
                 if (crop.Success)\r
                 {\r
-                    thisQuery.CropValues = crop.ToString().Replace("--crop ", "");\r
+                    thisQuery.CropValues = crop.ToString().Replace("--crop ", string.Empty);\r
                     string[] actCropValues = thisQuery.CropValues.Split(':');\r
                     thisQuery.CropTop = actCropValues[0];\r
                     thisQuery.CropBottom = actCropValues[1];\r
@@ -234,20 +441,20 @@ namespace Handbrake.Functions
                 else\r
                     thisQuery.AnamorphicMode = 0;\r
 \r
-                thisQuery.keepDisplayAsect = keepDisplayAsect.Success;\r
+                thisQuery.KeepDisplayAsect = keepDisplayAsect.Success;\r
 \r
                 if (displayWidth.Success)\r
-                    thisQuery.displayWidthValue = double.Parse(displayWidth.Groups[0].Value.Replace("--display-width ", ""));\r
+                    thisQuery.DisplayWidthValue =\r
+                        double.Parse(displayWidth.Groups[0].Value.Replace("--display-width ", string.Empty));\r
 \r
                 if (pixelAspect.Success)\r
-                    thisQuery.pixelAspectWidth = int.Parse(pixelAspect.Groups[1].Value.Replace("--pixel-aspect ", ""));\r
+                    thisQuery.PixelAspectWidth = int.Parse(pixelAspect.Groups[1].Value.Replace("--pixel-aspect ", string.Empty));\r
 \r
-                if (pixelAspect.Success && pixelAspect.Groups.Count >=3)\r
-                    thisQuery.pixelAspectHeight = int.Parse(pixelAspect.Groups[2].Value.Replace("--pixel-aspect ", ""));\r
+                if (pixelAspect.Success && pixelAspect.Groups.Count >= 3)\r
+                    thisQuery.PixelAspectHeight = int.Parse(pixelAspect.Groups[2].Value.Replace("--pixel-aspect ", string.Empty));\r
 \r
                 if (modulus.Success)\r
-                    thisQuery.AnamorphicModulus = int.Parse(modulus.Groups[0].Value.Replace("--modulus ", ""));\r
-\r
+                    thisQuery.AnamorphicModulus = int.Parse(modulus.Groups[0].Value.Replace("--modulus ", string.Empty));\r
 \r
                 #endregion\r
 \r
@@ -258,31 +465,33 @@ namespace Handbrake.Functions
                 {\r
                     thisQuery.Decomb = "Default";\r
                     if (decombValue.Success)\r
-                        thisQuery.Decomb = decombValue.ToString().Replace("--decomb=", "").Replace("\"", "");\r
+                        thisQuery.Decomb = decombValue.ToString().Replace("--decomb=", string.Empty).Replace("\"", string.Empty);\r
                 }\r
 \r
                 thisQuery.DeInterlace = "Off";\r
                 if (deinterlace.Success)\r
                 {\r
-                    thisQuery.DeInterlace = deinterlace.ToString().Replace("--deinterlace=", "").Replace("\"", "");\r
-                    thisQuery.DeInterlace = thisQuery.DeInterlace.Replace("fast", "Fast").Replace("slow", "Slow").Replace("slower", "Slower");\r
+                    thisQuery.DeInterlace = deinterlace.ToString().Replace("--deinterlace=", string.Empty).Replace("\"", string.Empty);\r
+                    thisQuery.DeInterlace =\r
+                        thisQuery.DeInterlace.Replace("fast", "Fast").Replace("slow", "Slow").Replace("slower", "Slower");\r
                     thisQuery.DeInterlace = thisQuery.DeInterlace.Replace("slowest", "Slowest");\r
                 }\r
 \r
                 thisQuery.DeNoise = "Off";\r
                 if (denoise.Success)\r
                 {\r
-                    thisQuery.DeNoise = denoise.ToString().Replace("--denoise=", "").Replace("\"", "");\r
-                    thisQuery.DeNoise = thisQuery.DeNoise.Replace("weak", "Weak").Replace("medium", "Medium").Replace("strong", "Strong");\r
+                    thisQuery.DeNoise = denoise.ToString().Replace("--denoise=", string.Empty).Replace("\"", string.Empty);\r
+                    thisQuery.DeNoise =\r
+                        thisQuery.DeNoise.Replace("weak", "Weak").Replace("medium", "Medium").Replace("strong", "Strong");\r
                 }\r
 \r
-                string deblockValue = "";\r
+                string deblockValue = string.Empty;\r
                 thisQuery.DeBlock = 0;\r
                 if (deblock.Success)\r
-                    deblockValue = deblock.ToString().Replace("--deblock=", "");\r
+                    deblockValue = deblock.ToString().Replace("--deblock=", string.Empty);\r
 \r
                 int dval = 0;\r
-                if (deblockValue != "")\r
+                if (deblockValue != string.Empty)\r
                     int.TryParse(deblockValue, out dval);\r
                 thisQuery.DeBlock = dval;\r
 \r
@@ -291,14 +500,14 @@ namespace Handbrake.Functions
                 {\r
                     thisQuery.DeTelecine = "Default";\r
                     if (detelecineValue.Success)\r
-                        thisQuery.DeTelecine = detelecineValue.ToString().Replace("--detelecine=", "").Replace("\"", "");\r
+                        thisQuery.DeTelecine = detelecineValue.ToString().Replace("--detelecine=", string.Empty).Replace("\"", string.Empty);\r
                 }\r
 \r
                 #endregion\r
 \r
                 #region Video Settings Tab\r
 \r
-                string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", "");\r
+                string videoEncoderConvertion = videoEncoder.ToString().Replace("-e ", string.Empty);\r
                 switch (videoEncoderConvertion)\r
                 {\r
                     case "ffmpeg":\r
@@ -315,29 +524,37 @@ namespace Handbrake.Functions
                         break;\r
                 }\r
                 thisQuery.VideoEncoder = videoEncoderConvertion;\r
-                thisQuery.VideoFramerate = videoFramerate.Success ? videoFramerate.ToString().Replace("-r ", "") : "Same as source";\r
+                thisQuery.VideoFramerate = videoFramerate.Success\r
+                                               ? videoFramerate.ToString().Replace("-r ", string.Empty)\r
+                                               : "Same as source";\r
+\r
+                thisQuery.Pfr = pfr.Success;\r
                 thisQuery.Grayscale = grayscale.Success;\r
                 thisQuery.TwoPass = twoPass.Success;\r
                 thisQuery.TurboFirstPass = turboFirstPass.Success;\r
 \r
                 if (videoBitrate.Success)\r
-                    thisQuery.AverageVideoBitrate = videoBitrate.ToString().Replace("-b ", "");\r
+                    thisQuery.AverageVideoBitrate = videoBitrate.ToString().Replace("-b ", string.Empty);\r
                 if (videoFilesize.Success)\r
-                    thisQuery.VideoTargetSize = videoFilesize.ToString().Replace("-S ", "");\r
+                    thisQuery.VideoTargetSize = videoFilesize.ToString().Replace("-S ", string.Empty);\r
 \r
                 if (videoQuality.Success)\r
                 {\r
-                    float qConvert = float.Parse(videoQuality.ToString().Replace("-q ", ""), Culture);\r
+                    float qConvert = float.Parse(videoQuality.ToString().Replace("-q ", string.Empty), Culture);\r
                     thisQuery.VideoQuality = qConvert;\r
                 }\r
+                else\r
+                    thisQuery.VideoQuality = -1;\r
+\r
                 #endregion\r
 \r
                 #region Audio Tab\r
+\r
                 // Find out how many tracks we need to add by checking how many encoders or audio tracks are selected.\r
                 int encoderCount = 0;\r
                 if (audioEncoders.Success)\r
                 {\r
-                    string[] audioDataCounters = audioEncoders.ToString().Replace("-E ", "").Split(',');\r
+                    string[] audioDataCounters = audioEncoders.ToString().Replace("-E ", string.Empty).Split(',');\r
                     encoderCount = audioDataCounters.Length;\r
                 }\r
 \r
@@ -350,69 +567,72 @@ namespace Handbrake.Functions
                 string[] trackDRCvalues = null;\r
 \r
                 if (audioTracks.Success)\r
-                    trackData = audioTracks.ToString().Replace("-a ", "").Split(',');\r
+                    trackData = audioTracks.ToString().Replace("-a ", string.Empty).Split(',');\r
                 if (audioTrackMixes.Success)\r
-                    trackMixes = audioTrackMixes.ToString().Replace("-6 ", "").Split(',');\r
+                    trackMixes = audioTrackMixes.ToString().Replace("-6 ", string.Empty).Split(',');\r
                 if (audioEncoders.Success)\r
-                    trackEncoders = audioEncoders.ToString().Replace("-E ", "").Split(',');\r
+                    trackEncoders = audioEncoders.ToString().Replace("-E ", string.Empty).Split(',');\r
                 if (audioBitrates.Success)\r
-                    trackBitrates = audioBitrates.ToString().Replace("-B ", "").Split(',');\r
+                    trackBitrates = audioBitrates.ToString().Replace("-B ", string.Empty).Split(',');\r
                 if (audioSampleRates.Success)\r
-                    trackSamplerates = audioSampleRates.ToString().Replace("-R ", "").Split(',');\r
+                    trackSamplerates = audioSampleRates.ToString().Replace("-R ", string.Empty).Split(',');\r
                 if (drcValues.Success)\r
-                    trackDRCvalues = drcValues.ToString().Replace("-D ", "").Split(',');\r
+                    trackDRCvalues = drcValues.ToString().Replace("-D ", string.Empty).Split(',');\r
 \r
                 // Create new Audio Track Classes and store them in the ArrayList\r
-                ArrayList AllAudioTrackInfo = new ArrayList();\r
+                ArrayList allAudioTrackInfo = new ArrayList();\r
                 for (int x = 0; x < encoderCount; x++)\r
                 {\r
                     AudioTrack track = new AudioTrack();\r
                     if (trackData != null)\r
-                        if (trackData.Length >= (x + 1))                         // Audio Track\r
+                        if (trackData.Length >= (x + 1)) // Audio Track\r
                             track.Track = trackData[x].Trim();\r
 \r
                     if (trackMixes != null)\r
-                        if (trackMixes.Length >= (x + 1))                        // Audio Mix\r
-                            track.MixDown = getMixDown(trackMixes[x].Trim());\r
+                        if (trackMixes.Length >= (x + 1)) // Audio Mix\r
+                            track.MixDown = GetMixDown(trackMixes[x].Trim());\r
 \r
                     if (trackEncoders != null)\r
-                        if (trackEncoders.Length >= (x + 1))                     // Audio Mix\r
-                            track.Encoder = getAudioEncoder(trackEncoders[x].Trim());\r
+                        if (trackEncoders.Length >= (x + 1)) // Audio Mix\r
+                            track.Encoder = GetAudioEncoder(trackEncoders[x].Trim());\r
 \r
                     if (trackBitrates != null)\r
-                        if (trackBitrates.Length >= (x + 1))                     // Audio Encoder\r
+                        if (trackBitrates.Length >= (x + 1)) // Audio Encoder\r
                             track.Bitrate = trackBitrates[x].Trim() == "auto" ? "Auto" : trackBitrates[x].Trim();\r
 \r
                     if (trackSamplerates != null)\r
-                        if (trackSamplerates.Length >= (x + 1))                  // Audio SampleRate\r
+                        if (trackSamplerates.Length >= (x + 1)) // Audio SampleRate\r
                             track.SampleRate = trackSamplerates[x].Trim() == "0" ? "Auto" : trackSamplerates[x].Trim();\r
 \r
                     if (trackDRCvalues != null)\r
-                        if (trackDRCvalues.Length >= (x + 1))                   // Audio DRC Values\r
+                        if (trackDRCvalues.Length >= (x + 1)) // Audio DRC Values\r
                             track.DRC = trackDRCvalues[x].Trim();\r
 \r
-                    AllAudioTrackInfo.Add(track);\r
+                    allAudioTrackInfo.Add(track);\r
                 }\r
-                thisQuery.AudioInformation = AllAudioTrackInfo;\r
+                thisQuery.AudioInformation = allAudioTrackInfo;\r
 \r
                 // Subtitle Stuff\r
                 if (subtitles.Success)\r
-                    thisQuery.Subtitles = subtitles.ToString().Replace("-s ", "");\r
+                    thisQuery.Subtitles = subtitles.ToString().Replace("-s ", string.Empty);\r
                 else\r
                     thisQuery.Subtitles = subScan.Success ? "Autoselect" : "None";\r
 \r
                 thisQuery.ForcedSubtitles = forcedSubtitles.Success;\r
+\r
                 #endregion\r
 \r
                 #region Chapters Tab\r
+\r
                 if (chapterMarkersFileMode.Success || chapterMarkers.Success)\r
                     thisQuery.ChapterMarkers = true;\r
+\r
                 #endregion\r
 \r
                 #region H.264 and other\r
 \r
                 if (x264.Success)\r
-                    thisQuery.H264Query = x264.ToString().Replace("-x ", "");\r
+                    thisQuery.H264Query = x264.ToString().Replace("-x ", string.Empty);\r
 \r
                 thisQuery.Verbose = verbose.Success;\r
 \r
@@ -420,16 +640,20 @@ namespace Handbrake.Functions
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show(\r
-                    "An error has occured in the Query Parser. Please report this error on the forum in the 'Windows' support section. \n\n" +\r
-                    exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                Main.ShowExceptiowWindow("An error has occured in the Query Parser.", exc.ToString());\r
             }\r
 \r
             #endregion\r
 \r
             return thisQuery;\r
         }\r
-        private static string getMixDown(string mixdown)\r
+\r
+        /// <summary>\r
+        /// Get the GUI equiv to a CLI mixdown\r
+        /// </summary>\r
+        /// <param name="mixdown">The Audio Mixdown</param>\r
+        /// <returns>The GUI representation of the mixdown</returns>\r
+        private static string GetMixDown(string mixdown)\r
         {\r
             switch (mixdown.Trim())\r
             {\r
@@ -447,7 +671,13 @@ namespace Handbrake.Functions
                     return "Automatic";\r
             }\r
         }\r
-        private static string getAudioEncoder(string audioEnc)\r
+\r
+        /// <summary>\r
+        /// Get the GUI equiv to a CLI audio encoder\r
+        /// </summary>\r
+        /// <param name="audioEnc">The Audio Encoder</param>\r
+        /// <returns>The GUI representation of that audio encoder</returns>\r
+        private static string GetAudioEncoder(string audioEnc)\r
         {\r
             switch (audioEnc)\r
             {\r
@@ -458,31 +688,14 @@ namespace Handbrake.Functions
                 case "vorbis":\r
                     return "Vorbis (vorbis)";\r
                 case "ac3":\r
+                    return "AC3 (ffmpeg)";\r
+                case "copy:ac3":\r
                     return "AC3 Passthru";\r
-                case "dts":\r
+                case "copy:dts":\r
                     return "DTS Passthru";\r
                 default:\r
                     return "AAC (faac)";\r
             }\r
         }\r
     }\r
-\r
-    public class AudioTrack\r
-    {\r
-        public AudioTrack()\r
-        {\r
-            // Default Values\r
-            Track = "Automatic";\r
-            MixDown = "Automatic";\r
-            SampleRate = "Auto";\r
-            Bitrate = "Auto";\r
-            DRC = "1";\r
-        }\r
-        public string Track { get; set; }\r
-        public string MixDown { get; set; }\r
-        public string Encoder { get; set; }\r
-        public string Bitrate { get; set; }\r
-        public string SampleRate { get; set; }\r
-        public string DRC { get; set; }\r
-    }\r
 }
\ No newline at end of file
diff --git a/win/C#/HandBrake.5.1.ReSharper b/win/C#/HandBrake.5.1.ReSharper
new file mode 100644 (file)
index 0000000..22ca799
--- /dev/null
@@ -0,0 +1,379 @@
+<Configuration>\r
+  <CodeStyleSettings>\r
+    <ExternalPath IsNull="False">\r
+    </ExternalPath>\r
+    <Sharing>SOLUTION</Sharing>\r
+    <CSharp>\r
+      <FormatSettings>\r
+        <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>\r
+        <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>\r
+        <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>\r
+        <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>\r
+        <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>\r
+        <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>\r
+        <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>\r
+        <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>\r
+        <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>\r
+        <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>\r
+        <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>\r
+        <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>\r
+        <MODIFIERS_ORDER IsNull="False">\r
+          <Item>public</Item>\r
+          <Item>protected</Item>\r
+          <Item>internal</Item>\r
+          <Item>private</Item>\r
+          <Item>new</Item>\r
+          <Item>abstract</Item>\r
+          <Item>virtual</Item>\r
+          <Item>override</Item>\r
+          <Item>sealed</Item>\r
+          <Item>static</Item>\r
+          <Item>readonly</Item>\r
+          <Item>extern</Item>\r
+          <Item>unsafe</Item>\r
+          <Item>volatile</Item>\r
+        </MODIFIERS_ORDER>\r
+        <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>\r
+        <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>\r
+        <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>\r
+        <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>\r
+        <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>\r
+        <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>\r
+        <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>\r
+        <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>\r
+        <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>\r
+        <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>\r
+        <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>\r
+        <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>\r
+        <STICK_COMMENT>False</STICK_COMMENT>\r
+        <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>\r
+        <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>\r
+        <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>\r
+        <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>\r
+        <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>\r
+        <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>\r
+      </FormatSettings>\r
+      <UsingsSettings>\r
+        <AddImportsToDeepestScope>True</AddImportsToDeepestScope>\r
+        <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>\r
+      </UsingsSettings>\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+        <ExceptionName IsNull="False">\r
+        </ExceptionName>\r
+        <OverrideDefaultSettings>True</OverrideDefaultSettings>\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+        <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+        <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+      </Naming2>\r
+      <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>\r
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">\r
+\r
+    <!-- Do not reorder COM interfaces -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="interface"/>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke structs -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Or>\r
+                    <Kind Is="struct"/>\r
+                    <Kind Is="class"/>\r
+                </Or>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="class"/>\r
+                <Name Is=".*NativeMethods" />\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- StyleCop pattern -->\r
+    <Pattern RemoveAllRegions="true">\r
+        <Match>\r
+            <Or Weight="1000" >\r
+                <Kind Is="class" />\r
+                <Kind Is="struct" />\r
+                <Kind Is="interface"/>\r
+            </Or>\r
+        </Match>\r
+\r
+        <!-- constants and fields -->\r
+        <Entry>\r
+            <Match>\r
+                <Or>\r
+                    <Kind Is="constant"/>\r
+                    <Kind Is="field"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Kind Order="constant field"/>\r
+                <Readonly/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Constants and Fields"/>\r
+        </Entry>\r
+\r
+        <!-- constructors -->\r
+        <Entry>\r
+            <Match>\r
+                <Or Weight="200">\r
+                    <Kind Is="constructor"/>\r
+                    <Kind Is="destructor"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Static/>\r
+                <Kind Order="constructor destructor"/>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+            </Sort>\r
+            <Group Region="Constructors and Destructors"/>\r
+        </Entry>\r
+\r
+        <!-- delegates -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="delegate"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Delegates"/>\r
+        </Entry>\r
+\r
+        <!-- events -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="event"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Events"/>\r
+        </Entry>\r
+\r
+        <!-- enum -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="enum"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Enums"/>\r
+        </Entry>\r
+\r
+        <!-- interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="interface" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Interfaces"/>\r
+        </Entry>\r
+\r
+        <!-- properties -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="property"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Properties"/>\r
+        </Entry>\r
+\r
+        <!-- indexers -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="indexer"\r
+                      Weight="300" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Indexers"/>\r
+        </Entry>\r
+\r
+        <!-- operator -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="operator"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Operators"/>\r
+        </Entry>\r
+\r
+        <!-- public methods -->\r
+        <Entry>\r
+            <Match>\r
+                <And>\r
+                    <Kind Is="method"/>\r
+                    <Access Is="public"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Public Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Implemented Interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <And Weight="500">\r
+                    <Kind Is="method"/>\r
+                    <ImplementsInterface CLRName=".*"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <ImplementsInterface />\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Implemented Interfaces">\r
+                <ImplementsInterface Region="${ImplementsInterface}" />\r
+            </Group>\r
+        </Entry>\r
+\r
+        <!-- other methods -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="method"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Nested structs -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="struct"\r
+                      Weight="600" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- Nested classes -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="class"\r
+                      Weight="700" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- all other members -->\r
+        <Entry/>\r
+\r
+    </Pattern>\r
+</Patterns>\r
+]]></CustomMemberReorderingPatterns>\r
+    </CSharp>\r
+    <VB>\r
+      <FormatSettings />\r
+      <ImportsSettings />\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      </Naming2>\r
+    </VB>\r
+    <Web>\r
+      <Naming2 />\r
+    </Web>\r
+    <Xaml>\r
+      <Naming2 />\r
+    </Xaml>\r
+    <XML>\r
+      <FormatSettings />\r
+    </XML>\r
+    <GenerateMemberBody />\r
+    <Naming2>\r
+      <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      <ExceptionName IsNull="False">\r
+      </ExceptionName>\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+      <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+      <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+    </Naming2>\r
+  </CodeStyleSettings>\r
+</Configuration>
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/EncodeProgressEventArgs.cs b/win/C#/HandBrake.ApplicationServices/EncodeProgressEventArgs.cs
new file mode 100644 (file)
index 0000000..8c46f87
--- /dev/null
@@ -0,0 +1,45 @@
+/*  EncodeProgressEventArgs.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices\r
+{\r
+    using System;\r
+\r
+    /// <summary>\r
+    /// Encode Progress Event Args\r
+    /// </summary>\r
+    public class EncodeProgressEventArgs : EventArgs\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets PercentComplete.\r
+        /// </summary>\r
+        public float PercentComplete { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets CurrentFrameRate.\r
+        /// </summary>\r
+        public float CurrentFrameRate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets AverageFrameRate.\r
+        /// </summary>\r
+        public float AverageFrameRate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets EstimatedTimeLeft.\r
+        /// </summary>\r
+        public string EstimatedTimeLeft { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Task.\r
+        /// </summary>\r
+        public int Task { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets TaskCount.\r
+        /// </summary>\r
+        public int TaskCount { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/EnumHelper.cs b/win/C#/HandBrake.ApplicationServices/Functions/EnumHelper.cs
new file mode 100644 (file)
index 0000000..6cf7342
--- /dev/null
@@ -0,0 +1,35 @@
+/*  EnumHelper.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System.ComponentModel;\r
+    using System.Reflection;\r
+    using System;\r
+\r
+    /// <summary>\r
+    /// Enum Helpers\r
+    /// </summary>\r
+    public class EnumHelper\r
+    {\r
+        /// <summary>\r
+        /// Get the description of an Enum\r
+        /// </summary>\r
+        /// <param name="value">\r
+        /// The value.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The Description string\r
+        /// </returns>\r
+        public static string GetDescription(Enum value)\r
+        {\r
+            FieldInfo fieldInfo = value.GetType().GetField(value.ToString());\r
+            DescriptionAttribute[] attributes =\r
+                  (DescriptionAttribute[])fieldInfo.GetCustomAttributes(\r
+                  typeof(DescriptionAttribute), false);\r
+            return (attributes.Length > 0) ? attributes[0].Description : value.ToString();\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs b/win/C#/HandBrake.ApplicationServices/Functions/GrowlCommunicator.cs
new file mode 100644 (file)
index 0000000..a284578
--- /dev/null
@@ -0,0 +1,119 @@
+/*  GrowlCommunicator.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System;\r
+\r
+    using Growl.Connector;\r
+\r
+    /// <summary>\r
+    /// Provides all functionality for communicating with Growl for Windows.\r
+    /// </summary>\r
+    /// <remarks>\r
+    /// This class is implemented as a static class because:\r
+    ///     1. It allows nearly all of the Growl-related code to be in one place\r
+    ///     2. It prevents the main form, queue handler, and any other part of Handbrake from having to declare\r
+    ///        or track any new instance variables\r
+    /// </remarks>\r
+    public static class GrowlCommunicator\r
+    {\r
+        /// <summary>\r
+        /// The <see cref="GrowlConnector"/> that actually talks to Growl\r
+        /// </summary>\r
+        private static GrowlConnector growl;\r
+\r
+        /// <summary>\r
+        /// The Handbrake application instance that is registered with Growl\r
+        /// </summary>\r
+        private static Application application;\r
+\r
+        /// <summary>\r
+        /// Notification shown upon completion of encoding\r
+        /// </summary>\r
+        private static NotificationType encodeOrQueueCompleted = new NotificationType("EncodeOrQueue", "HandBrake Status");\r
+\r
+        /// <summary>\r
+        /// Checks to see if Growl is currently running on the local machine.\r
+        /// </summary>\r
+        /// <returns>\r
+        /// <c>true</c> if Growl is running;\r
+        /// <c>false</c> otherwise\r
+        /// </returns>\r
+        public static bool IsRunning()\r
+        {\r
+            Initialize();\r
+\r
+            return GrowlConnector.IsGrowlRunningLocally();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Registers Handbrake with the local Growl instance\r
+        /// </summary>\r
+        /// <remarks>\r
+        /// This should usually be called at application start-up\r
+        /// </remarks>\r
+        public static void Register()\r
+        {\r
+            Initialize();\r
+            growl.Register(application, new[] {encodeOrQueueCompleted});\r
+        }\r
+\r
+        /// <summary>\r
+        /// Sends a notification to Growl. (Since Handbrake currently only supports one type of notification with\r
+        /// static text, this is a shortcut method).\r
+        /// </summary>\r
+        /// <param name="title">\r
+        /// The title.\r
+        /// </param>\r
+        /// <param name="text">\r
+        /// The text to display.\r
+        /// </param>\r
+        public static void Notify(string title, string text)\r
+        {\r
+            Notification notification = new Notification(application.Name, encodeOrQueueCompleted.Name, String.Empty, \r
+                                                         title, text);\r
+            growl.Notify(notification);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Sends a notification to Growl. (This is the more generic version that could be used in the future if \r
+        /// more notification types are implemented)\r
+        /// </summary>\r
+        /// <param name="notificationType">The <see cref="NotificationType">type</see> of notification to send</param>\r
+        /// <param name="title">The notification title</param>\r
+        /// <param name="text">The notification text</param>\r
+        /// <param name="imageUrl">The notification image as a url</param>\r
+        public static void Notify(NotificationType notificationType, string title, string text, string imageUrl)\r
+        {\r
+            Notification notification = new Notification(application.Name, notificationType.Name, String.Empty, title, \r
+                                                         text)\r
+                                            {\r
+                                                Icon = imageUrl\r
+                                            };\r
+\r
+            growl.Notify(notification);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Initializes the GrowlCommunicator\r
+        /// </summary>\r
+        private static void Initialize()\r
+        {\r
+            if (growl == null)\r
+            {\r
+                growl = new GrowlConnector\r
+                            {\r
+                                EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.PlainText\r
+                            };\r
+\r
+                application = new Application("Handbrake")\r
+                                  {\r
+                                      Icon = Properties.Resources.logo64\r
+                                  };\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/Logging.cs b/win/C#/HandBrake.ApplicationServices/Functions/Logging.cs
new file mode 100644 (file)
index 0000000..8231ba6
--- /dev/null
@@ -0,0 +1,52 @@
+/*  Logging.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    /// <summary>\r
+    /// The System Information.\r
+    /// </summary>\r
+    public class Logging\r
+    {\r
+        /// <summary>\r
+        /// Add the CLI Query to the Log File.\r
+        /// </summary>\r
+        /// <param name="encJob">\r
+        /// The Encode Job Object\r
+        /// </param>\r
+        /// <returns>\r
+        /// The create cli log header.\r
+        /// </returns>\r
+        public static string CreateCliLogHeader(Job encJob)\r
+        {\r
+            StringBuilder logHeader = new StringBuilder();\r
+\r
+            logHeader.AppendLine(String.Format("# {0}", Init.HandBrakeGuiVersionString));\r
+            logHeader.AppendLine(String.Format("# Running: {0}", Environment.OSVersion));\r
+            logHeader.AppendLine(String.Format("# CPU: {0}", SystemInfo.GetCpuCount));\r
+            logHeader.AppendLine(String.Format("# Ram: {0} MB", SystemInfo.TotalPhysicalMemory));\r
+            logHeader.AppendLine(String.Format("# Screen: {0}x{1}", SystemInfo.ScreenBounds.Bounds.Width, SystemInfo.ScreenBounds.Bounds.Height));\r
+            logHeader.AppendLine(String.Format("# Temp Dir: {0}", Path.GetTempPath()));\r
+            logHeader.AppendLine(String.Format("# Install Dir: {0}", Application.StartupPath));\r
+            logHeader.AppendLine(String.Format("# Data Dir: {0}\n", Application.UserAppDataPath));\r
+\r
+            if (encJob != null)\r
+            {\r
+                logHeader.AppendLine(String.Format("# CLI Query: {0}", encJob.Query));\r
+                logHeader.AppendLine(String.Format("# User Query: {0}", encJob.CustomQuery));\r
+            }\r
+            logHeader.AppendLine("-------------------------------------------");\r
+\r
+            return logHeader.ToString();\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/Main.cs b/win/C#/HandBrake.ApplicationServices/Functions/Main.cs
new file mode 100644 (file)
index 0000000..368065d
--- /dev/null
@@ -0,0 +1,24 @@
+/*  Main.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System.Diagnostics;\r
+\r
+    /// <summary>\r
+    /// Useful functions which various screens can use.\r
+    /// </summary>\r
+    public static class Main\r
+    {\r
+        /// <summary>\r
+        /// Get the Process ID of HandBrakeCLI for the current instance.\r
+        /// </summary>\r
+        /// <returns>A list of processes</returns>\r
+        public static Process[] GetCliProcess()\r
+        {\r
+            return Process.GetProcessesByName("HandBrakeCLI");\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/System.cs b/win/C#/HandBrake.ApplicationServices/Functions/System.cs
new file mode 100644 (file)
index 0000000..9b08a4b
--- /dev/null
@@ -0,0 +1,56 @@
+/*  System.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System.Windows.Forms;\r
+\r
+    using Microsoft.Win32;\r
+\r
+    /// <summary>\r
+    /// The System Information.\r
+    /// </summary>\r
+    public class SystemInfo\r
+    {\r
+        /// <summary>\r
+        /// Gets the total physical ram in a system\r
+        /// </summary>\r
+        /// <returns>The total memory in the system</returns>\r
+        public static ulong TotalPhysicalMemory\r
+        {\r
+            get\r
+            {\r
+                Win32.MEMORYSTATUSEX memStat = new Win32.MEMORYSTATUSEX { dwLength = 64 };\r
+                Win32.GlobalMemoryStatusEx(ref memStat);\r
+\r
+                ulong value = memStat.ullTotalPhys / 1024 / 1024;\r
+                return value;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the number of CPU Cores\r
+        /// </summary>\r
+        /// <returns>Object</returns>\r
+        public static object GetCpuCount\r
+        {\r
+            get\r
+            {\r
+                RegistryKey regKey = Registry.LocalMachine;\r
+                regKey = regKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");\r
+                return regKey == null ? 0 : regKey.GetValue("ProcessorNameString");\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the System screen size information.\r
+        /// </summary>\r
+        /// <returns>System.Windows.Forms.Scree</returns>\r
+        public static Screen ScreenBounds\r
+        {\r
+            get { return Screen.PrimaryScreen; }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/Win32.cs b/win/C#/HandBrake.ApplicationServices/Functions/Win32.cs
new file mode 100644 (file)
index 0000000..8cb464b
--- /dev/null
@@ -0,0 +1,144 @@
+/*  win32.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System;\r
+    using System.Runtime.InteropServices;\r
+\r
+    /// <summary>\r
+    /// Win32 API calls\r
+    /// </summary>\r
+    public class Win32\r
+    {\r
+        /// <summary>\r
+        /// Set the Forground Window\r
+        /// </summary>\r
+        /// <param name="hWnd">\r
+        /// The h wnd.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A Boolean true when complete.\r
+        /// </returns>\r
+        [DllImport("user32.dll")]\r
+        public static extern bool SetForegroundWindow(int hWnd);\r
+\r
+        /// <summary>\r
+        /// Lock the workstation\r
+        /// </summary>\r
+        [DllImport("user32.dll")]\r
+        public static extern void LockWorkStation();\r
+\r
+        /// <summary>\r
+        /// Exit Windows\r
+        /// </summary>\r
+        /// <param name="uFlags">\r
+        /// The u flags.\r
+        /// </param>\r
+        /// <param name="dwReason">\r
+        /// The dw reason.\r
+        /// </param>\r
+        /// <returns>\r
+        /// an integer\r
+        /// </returns>\r
+        [DllImport("user32.dll")]\r
+        public static extern int ExitWindowsEx(int uFlags, int dwReason);\r
+\r
+        /// <summary>\r
+        /// Memory Status EX Struct\r
+        /// </summary>\r
+        public struct MEMORYSTATUSEX\r
+        {\r
+            public int dwLength;\r
+            public int dwMemoryLoad;\r
+            public ulong ullTotalPhys;\r
+            public ulong ullAvailPhys;\r
+            public ulong ullTotalPageFile;\r
+            public ulong ullAvailPageFile;\r
+            public ulong ullTotalVirtual;\r
+            public ulong ullAvailVirtual;\r
+            public ulong ullAvailExtendedVirtual;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Get the System Memory information\r
+        /// </summary>\r
+        /// <param name="lpBuffer">\r
+        /// The lp buffer.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A boolean.\r
+        /// </returns>\r
+        [DllImport("kernel32.dll", SetLastError = true)]\r
+        public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer);\r
+\r
+\r
+        /// <summary>\r
+        /// Generate a Console Ctrl Event\r
+        /// </summary>\r
+        /// <param name="sigevent">\r
+        /// The sigevent.\r
+        /// </param>\r
+        /// <param name="dwProcessGroupId">\r
+        /// The dw process group id.\r
+        /// </param>\r
+        /// <returns>\r
+        /// Bool true is sucess\r
+        /// </returns>\r
+        [DllImport("kernel32.dll", SetLastError = true)]\r
+        public static extern bool GenerateConsoleCtrlEvent(ConsoleCtrlEvent sigevent, int dwProcessGroupId);\r
+\r
+        /// <summary>\r
+        /// Console Ctrl Event\r
+        /// </summary>\r
+        public enum ConsoleCtrlEvent\r
+        {\r
+            /// <summary>\r
+            /// Ctrl - C\r
+            /// </summary>\r
+            CTRL_C = 0,\r
+\r
+            /// <summary>\r
+            /// Ctrl - Break\r
+            /// </summary>\r
+            CTRL_BREAK = 1,\r
+\r
+            /// <summary>\r
+            /// Ctrl - Close\r
+            /// </summary>\r
+            CTRL_CLOSE = 2,\r
+        }\r
+\r
+        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]\r
+        static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);\r
+\r
+        /// <summary>\r
+        /// Execution State\r
+        /// </summary>\r
+        [FlagsAttribute]\r
+        public enum EXECUTION_STATE : uint\r
+        {\r
+            ES_SYSTEM_REQUIRED = 0x00000001,\r
+            ES_CONTINUOUS = 0x80000000,\r
+            ES_AWAYMODE_REQUIRED = 0x00000040\r
+        }\r
+\r
+        /// <summary>\r
+        /// Prevent the system from sleeping\r
+        /// </summary>\r
+        public static void PreventSleep()\r
+        {\r
+            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);\r
+        }\r
+\r
+        /// <summary>\r
+        ///  Allow the system to sleep.\r
+        /// </summary>\r
+        public static void AllowSleep()\r
+        {\r
+            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Functions/Win7.cs b/win/C#/HandBrake.ApplicationServices/Functions/Win7.cs
new file mode 100644 (file)
index 0000000..8d694d2
--- /dev/null
@@ -0,0 +1,73 @@
+/*  Win7.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Functions\r
+{\r
+    using System;\r
+    using Microsoft.WindowsAPICodePack.Taskbar;\r
+\r
+    /// <summary>\r
+    /// A class implimenting Windows 7 Specific features\r
+    /// </summary>\r
+    public class Win7\r
+    {\r
+        /// <summary>\r
+        /// The Windows Taskbar\r
+        /// </summary>\r
+        private TaskbarManager windowsTaskbar;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Win7"/> class.\r
+        /// </summary>\r
+        public Win7()\r
+        {\r
+            if (IsWindowsSeven)\r
+            {\r
+                windowsTaskbar = TaskbarManager.Instance;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether this is Windows Seven.\r
+        /// </summary>\r
+        public bool IsWindowsSeven\r
+        {\r
+            get\r
+            {\r
+                OperatingSystem os = Environment.OSVersion;\r
+                return os.Version.Major >= 6 && os.Version.Minor >= 1;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Set the Task Bar Percentage.\r
+        /// </summary>\r
+        /// <param name="percentage">\r
+        /// The percentage.\r
+        /// </param>\r
+        public void SetTaskBarProgress(int percentage)\r
+        {\r
+            if (!IsWindowsSeven)\r
+            {\r
+                return;\r
+            }\r
+            windowsTaskbar.SetProgressState(TaskbarProgressBarState.Normal);\r
+            windowsTaskbar.SetProgressValue(percentage, 100);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Disable Task Bar Progress\r
+        /// </summary>\r
+        public void SetTaskBarProgressToNoProgress()\r
+        {\r
+            if (!IsWindowsSeven)\r
+            {\r
+                return;\r
+            }\r
+\r
+            windowsTaskbar.SetProgressState(TaskbarProgressBarState.NoProgress);\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj b/win/C#/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj
new file mode 100644 (file)
index 0000000..8b9d7e3
--- /dev/null
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProductVersion>9.0.21022</ProductVersion>\r
+    <SchemaVersion>2.0</SchemaVersion>\r
+    <ProjectGuid>{087A2BA8-BAC2-4577-A46F-07FF9D420016}</ProjectGuid>\r
+    <OutputType>Library</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>HandBrake.ApplicationServices</RootNamespace>\r
+    <AssemblyName>HandBrake.ApplicationServices</AssemblyName>\r
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+    <FileUpgradeFlags>\r
+    </FileUpgradeFlags>\r
+    <OldToolsVersion>3.5</OldToolsVersion>\r
+    <UpgradeBackupLocation />\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NightlyBuild|AnyCPU' ">\r
+    <OutputPath>bin\NightlyBuild\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <Optimize>true</Optimize>\r
+    <DebugType>pdbonly</DebugType>\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+    <ErrorReport>prompt</ErrorReport>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>..\libraries\Growl.Connector.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="Growl.CoreLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=13e59d82e007b064, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>..\libraries\Growl.CoreLibrary.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="Microsoft.WindowsAPICodePack, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>..\libraries\Microsoft.WindowsAPICodePack.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">\r
+      <SpecificVersion>False</SpecificVersion>\r
+      <HintPath>..\libraries\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>\r
+    </Reference>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Drawing" />\r
+    <Reference Include="System.Windows.Forms" />\r
+    <Reference Include="System.Xml.Linq">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Data.DataSetExtensions">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Data" />\r
+    <Reference Include="System.Xml" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="EncodeProgressEventArgs.cs" />\r
+    <Compile Include="Functions\EnumHelper.cs" />\r
+    <Compile Include="Functions\Logging.cs" />\r
+    <Compile Include="Functions\GrowlCommunicator.cs" />\r
+    <Compile Include="Functions\Main.cs" />\r
+    <Compile Include="Functions\System.cs" />\r
+    <Compile Include="Functions\Win32.cs" />\r
+    <Compile Include="Functions\Win7.cs" />\r
+    <Compile Include="Init.cs" />\r
+    <Compile Include="Model\Cropping.cs" />\r
+    <Compile Include="Model\Job.cs" />\r
+    <Compile Include="Model\SubtitleType.cs" />\r
+    <Compile Include="Parsing\AudioTrack.cs" />\r
+    <Compile Include="Parsing\Chapter.cs" />\r
+    <Compile Include="Parsing\DVD.cs" />\r
+    <Compile Include="Parsing\Parser.cs" />\r
+    <Compile Include="Parsing\Subtitle.cs" />\r
+    <Compile Include="Parsing\Title.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="Properties\Resources.Designer.cs">\r
+      <AutoGen>True</AutoGen>\r
+      <DesignTime>True</DesignTime>\r
+      <DependentUpon>Resources.resx</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="Services\Encode.cs" />\r
+    <Compile Include="Services\Interfaces\IEncode.cs" />\r
+    <Compile Include="Services\Interfaces\IQueue.cs" />\r
+    <Compile Include="Services\Interfaces\IScan.cs" />\r
+    <Compile Include="Services\Queue.cs" />\r
+    <Compile Include="Services\Scan.cs" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="app.config" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Properties\AssemblyInfo.cs.tmpl" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <EmbeddedResource Include="Properties\Resources.resx">\r
+      <Generator>ResXFileCodeGenerator</Generator>\r
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r
+    </EmbeddedResource>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Resources\logo64.png" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\HandBrake.Framework\HandBrake.Framework.csproj">\r
+      <Project>{49AD42C1-BF9B-4D78-A644-020878FAADE6}</Project>\r
+      <Name>HandBrake.Framework</Name>\r
+    </ProjectReference>\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />\r
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
+       Other similar extension points exist, see Microsoft.Common.targets.\r
+  <Target Name="BeforeBuild">\r
+  </Target>\r
+  <Target Name="AfterBuild">\r
+  </Target>\r
+  -->\r
+  <PropertyGroup>\r
+    <PreBuildEvent>\r
+      subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"\r
+      subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"\r
+    </PreBuildEvent>\r
+  </PropertyGroup>\r
+</Project>
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Init.cs b/win/C#/HandBrake.ApplicationServices/Init.cs
new file mode 100644 (file)
index 0000000..bacf132
--- /dev/null
@@ -0,0 +1,144 @@
+/*  Init.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices\r
+{\r
+    using System;\r
+    using System.Reflection;\r
+\r
+    /// <summary>\r
+    /// Initialize ApplicationServices\r
+    /// </summary>\r
+    public class Init\r
+    {\r
+        /// <summary>\r
+        /// Setup the Settings used by the applicaiton with this library\r
+        /// </summary>\r
+        /// <param name="versionString">\r
+        /// The version / name of the application that's using this DLL.\r
+        /// </param>\r
+        /// <param name="instanceId">\r
+        /// The Instance ID\r
+        /// </param>\r
+        /// <param name="completionOption">\r
+        /// The completion option.\r
+        /// </param>\r
+        /// <param name="disableDvdNav">\r
+        /// The disable dvd nav.\r
+        /// </param>\r
+        /// <param name="growlEncode">\r
+        /// The growl encode.\r
+        /// </param>\r
+        /// <param name="growlQueue">\r
+        /// The growl queue.\r
+        /// </param>\r
+        /// <param name="processPriority">\r
+        /// The process priority.\r
+        /// </param>\r
+        /// <param name="saveLogPath">\r
+        /// The save log path.\r
+        /// </param>\r
+        /// <param name="saveLogToSpecifiedPath">\r
+        /// The save log to specified path.\r
+        /// </param>\r
+        /// <param name="saveLogWithVideo">\r
+        /// The save log with video.\r
+        /// </param>\r
+        /// <param name="showCliForInGuiEncodeStatus">\r
+        /// The show cli for in gui encode status.\r
+        /// </param>\r
+        /// <param name="preventSleep">\r
+        /// Prevent the system from sleeping\r
+        /// </param>\r
+        public static void SetupSettings(string versionString, int instanceId, string completionOption, bool disableDvdNav,\r
+                                  bool growlEncode, bool growlQueue, string processPriority, string saveLogPath, bool saveLogToSpecifiedPath,\r
+                                  bool saveLogWithVideo, bool showCliForInGuiEncodeStatus, bool preventSleep)\r
+        {\r
+            InstanceId = instanceId;\r
+            HandBrakeGuiVersionString = versionString;\r
+            CompletionOption = completionOption;\r
+            DisableDvdNav = disableDvdNav;\r
+            GrowlEncode = growlEncode;\r
+            GrowlQueue = growlQueue;\r
+            ProcessPriority = processPriority;\r
+            SaveLogPath = saveLogPath;\r
+            SaveLogToSpecifiedPath = saveLogToSpecifiedPath;\r
+            SaveLogWithVideo = saveLogWithVideo;\r
+            ShowCliForInGuiEncodeStatus = showCliForInGuiEncodeStatus;\r
+            PreventSleep = preventSleep;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the Assembly version.\r
+        /// </summary>\r
+        /// <returns>\r
+        /// Version data\r
+        /// </returns>\r
+        public static Version AssemblyVersion()\r
+        {\r
+            return Assembly.GetExecutingAssembly().GetName().Version;\r
+        }\r
+\r
+        /// <summary>\r
+        /// The instance ID used by the Main Applicaiton\r
+        /// </summary>\r
+        public static int InstanceId;\r
+\r
+        /// <summary>\r
+        /// The Applicaiton that uses this DLL can pass in it's version string.\r
+        /// </summary>\r
+        public static string HandBrakeGuiVersionString;\r
+\r
+        /// <summary>\r
+        /// What to do when the encode completes.\r
+        /// </summary>\r
+        public static string CompletionOption;\r
+\r
+        /// <summary>\r
+        /// Disable LibDvdNav\r
+        /// </summary>\r
+        public static bool DisableDvdNav;\r
+\r
+        /// <summary>\r
+        /// Growl when an encode has finished.\r
+        /// </summary>\r
+        public static bool GrowlEncode;\r
+\r
+        /// <summary>\r
+        /// Growl when a queue has finished.\r
+        /// </summary>\r
+        public static bool GrowlQueue;\r
+\r
+        /// <summary>\r
+        /// The Process Priority for HandBrakeCLI\r
+        /// </summary>\r
+        public static string ProcessPriority;\r
+\r
+        /// <summary>\r
+        /// Path to save log files to.\r
+        /// </summary>\r
+        public static string SaveLogPath;\r
+\r
+        /// <summary>\r
+        /// Copy log files to the SaveLogPath\r
+        /// </summary>\r
+        public static bool SaveLogToSpecifiedPath;\r
+\r
+        /// <summary>\r
+        /// Save a copy of the log files with the video\r
+        /// </summary>\r
+        public static bool SaveLogWithVideo;\r
+\r
+        /// <summary>\r
+        /// Show the CLI window when encoding.\r
+        /// </summary>\r
+        public static bool ShowCliForInGuiEncodeStatus;\r
+\r
+        /// <summary>\r
+        /// Prevent system sleep\r
+        /// </summary>\r
+        public static bool PreventSleep;\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Model/Cropping.cs b/win/C#/HandBrake.ApplicationServices/Model/Cropping.cs
new file mode 100644 (file)
index 0000000..ae39636
--- /dev/null
@@ -0,0 +1,56 @@
+/*  Cropping.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Model\r
+{\r
+    /// <summary>\r
+    /// Cropping T B L R\r
+    /// </summary>\r
+    public class Cropping\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets Top.\r
+        /// </summary>\r
+        public int Top { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Bottom.\r
+        /// </summary>\r
+        public int Bottom { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Left.\r
+        /// </summary>\r
+        public int Left { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Right.\r
+        /// </summary>\r
+        public int Right { get; set; }\r
+\r
+        /// <summary>\r
+        /// Create a cropping object\r
+        /// </summary>\r
+        /// <param name="top">\r
+        /// The top.\r
+        /// </param>\r
+        /// <param name="bottom">\r
+        /// The bottom.\r
+        /// </param>\r
+        /// <param name="left">\r
+        /// The left.\r
+        /// </param>\r
+        /// <param name="right">\r
+        /// The right.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A Cropping object\r
+        /// </returns>\r
+        public static Cropping CreateCroppingObject(int top, int bottom, int left, int right)\r
+        {\r
+            return new Cropping { Top = top, Bottom = bottom, Left = left, Right = right };\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Model/Job.cs b/win/C#/HandBrake.ApplicationServices/Model/Job.cs
new file mode 100644 (file)
index 0000000..a18a611
--- /dev/null
@@ -0,0 +1,70 @@
+/*  QueueItem.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Model\r
+{\r
+    /// <summary>\r
+    /// The job.\r
+    /// </summary>\r
+    public class Job\r
+    {\r
+        /// <summary>\r
+        /// the CLI Query.\r
+        /// </summary>\r
+        private string query;\r
+\r
+        /// <summary>\r
+        /// Gets or sets the job ID.\r
+        /// </summary>\r
+        public int Id { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the selected Title.\r
+        /// </summary>\r
+        public int Title { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the query string.\r
+        /// </summary>\r
+        public string Query\r
+        {\r
+            get\r
+            {\r
+                return this.query.Replace("\\\"", "\"").Replace("\\\\", "\\");\r
+            }\r
+            set\r
+            {\r
+                this.query = value;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether if this is a user or GUI generated query\r
+        /// </summary>\r
+        public bool CustomQuery { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the source file of encoding.\r
+        /// </summary>\r
+        public string Source { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the destination for the file to be encoded.\r
+        /// </summary>\r
+        public string Destination { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether or not this instance is empty.\r
+        /// </summary>\r
+        public bool IsEmpty\r
+        {\r
+            get\r
+            {\r
+                return this.Id == 0 && string.IsNullOrEmpty(this.Query) && string.IsNullOrEmpty(this.Source) &&\r
+                       string.IsNullOrEmpty(this.Destination);\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Model/SubtitleType.cs b/win/C#/HandBrake.ApplicationServices/Model/SubtitleType.cs
new file mode 100644 (file)
index 0000000..f362a4b
--- /dev/null
@@ -0,0 +1,30 @@
+/*  SubtitleType.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Model\r
+{\r
+    using System.ComponentModel;\r
+\r
+    /// <summary>\r
+    /// Subtitle Type. \r
+    /// </summary>\r
+    public enum SubtitleType\r
+    {\r
+        [Description("SSA")]\r
+        SSA,\r
+        [Description("SRT")]\r
+        SRT,\r
+        [Description("VobSub")]\r
+        VobSub,\r
+        [Description("CC")]\r
+        CC,\r
+        [Description("UTF8")]\r
+        UTF8Sub,\r
+        [Description("TX3G")]\r
+        TX3G,\r
+        [Description("Unknown")]\r
+        Unknown\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/AudioTrack.cs b/win/C#/HandBrake.ApplicationServices/Parsing/AudioTrack.cs
new file mode 100644 (file)
index 0000000..55cf524
--- /dev/null
@@ -0,0 +1,127 @@
+/*  AudioTrack.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Text.RegularExpressions;\r
+\r
+    /// <summary>\r
+    /// An object represending an AudioTrack associated with a Title, in a DVD\r
+    /// </summary>\r
+    public class AudioTrack\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets The track number of this Audio Track\r
+        /// </summary>\r
+        public int TrackNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The language (if detected) of this Audio Track\r
+        /// </summary>\r
+        public string Language { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets LanguageCode.\r
+        /// </summary>\r
+        public string LanguageCode { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Description.\r
+        /// </summary>\r
+        public string Description { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The primary format of this Audio Track\r
+        /// </summary>\r
+        public string Format { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The frequency (in MHz) of this Audio Track\r
+        /// </summary>\r
+        public int SampleRate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The bitrate (in kbps) of this Audio Track\r
+        /// </summary>\r
+        public int Bitrate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Parse the CLI input to an Audio Track object\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// An Audio Track obkect\r
+        /// </returns>\r
+        public static AudioTrack Parse(StringReader output)\r
+        {\r
+            string audioTrack = output.ReadLine();\r
+            Match m = Regex.Match(audioTrack, @"^    \+ ([0-9]*), ([A-Za-z0-9,\s]*) \((.*)\) \((.*)\)");\r
+            Match track = Regex.Match(audioTrack, @"^    \+ ([0-9]*), ([A-Za-z0-9,\s]*) \((.*)\)"); // ID and Language\r
+            Match iso639_2 = Regex.Match(audioTrack, @"iso639-2: ([a-zA-Z]*)\)");\r
+            Match samplerate = Regex.Match(audioTrack, @"([0-9]*)Hz");\r
+            Match bitrate = Regex.Match(audioTrack, @"([0-9]*)bps");\r
+\r
+            string subformat = m.Groups[4].Value.Trim().Contains("iso639") ? null : m.Groups[4].Value;\r
+            string samplerateVal = samplerate.Success ? samplerate.Groups[0].Value.Replace("Hz", string.Empty).Trim() : "0";\r
+            string bitrateVal = bitrate.Success ? bitrate.Groups[0].Value.Replace("bps", string.Empty).Trim() : "0";\r
+\r
+            if (track.Success)\r
+            {\r
+                var thisTrack = new AudioTrack\r
+                                    {\r
+                                        TrackNumber = int.Parse(track.Groups[1].Value.Trim()), \r
+                                        Language = track.Groups[2].Value, \r
+                                        Format = m.Groups[3].Value,\r
+                                        Description = subformat, \r
+                                        SampleRate = int.Parse(samplerateVal), \r
+                                        Bitrate = int.Parse(bitrateVal),\r
+                                        LanguageCode = iso639_2.Value.Replace("iso639-2: ", string.Empty).Replace(")", string.Empty)\r
+                                    };\r
+                return thisTrack;\r
+            }\r
+\r
+            return null;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Pase a list of audio tracks\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// An array of audio tracks\r
+        /// </returns>\r
+        public static AudioTrack[] ParseList(StringReader output)\r
+        {\r
+            var tracks = new List<AudioTrack>();\r
+            while (true)\r
+            {\r
+                AudioTrack thisTrack = Parse(output);\r
+                if (thisTrack != null)\r
+                    tracks.Add(thisTrack);\r
+                else\r
+                    break;\r
+            }\r
+            return tracks.ToArray();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {track #} {language} ({format}) ({sub-format})</returns>\r
+        public override string ToString()\r
+        {\r
+            if (Description == null)\r
+                return string.Format("{0} {1} ({2})", TrackNumber, Language, Format);\r
+\r
+            return string.Format("{0} {1} ({2}) ({3})", TrackNumber, Language, Format, Description);\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/Chapter.cs b/win/C#/HandBrake.ApplicationServices/Parsing/Chapter.cs
new file mode 100644 (file)
index 0000000..949b73f
--- /dev/null
@@ -0,0 +1,100 @@
+/*  Chapter.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Text.RegularExpressions;\r
+\r
+    /// <summary>\r
+    /// An object representing a Chapter aosciated with a Title, in a DVD\r
+    /// </summary>\r
+    public class Chapter\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets The number of this Chapter, in regards to it's parent Title\r
+        /// </summary>\r
+        public int ChapterNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets ChapterName.\r
+        /// </summary>\r
+        public string ChapterName { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The length in time this Chapter spans\r
+        /// </summary>\r
+        public TimeSpan Duration { get; set; }\r
+\r
+        /// <summary>\r
+        /// Parse a CLI string to a Chapter object\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A chapter Object\r
+        /// </returns>\r
+        public static Chapter Parse(StringReader output)\r
+        {\r
+            // TODO add support for reading chapter names to the regex.\r
+            Match m = Regex.Match(\r
+                                  output.ReadLine(),\r
+                                  @"^    \+ ([0-9]*): cells ([0-9]*)->([0-9]*), ([0-9]*) blocks, duration ([0-9]{2}:[0-9]{2}:[0-9]{2})");\r
+            if (m.Success)\r
+            {\r
+                var thisChapter = new Chapter\r
+                                      {\r
+                                          ChapterNumber = int.Parse(m.Groups[1].Value.Trim()), \r
+                                          ChapterName = string.Empty,\r
+                                          Duration = TimeSpan.Parse(m.Groups[5].Value)\r
+                                      };\r
+                return thisChapter;\r
+            }\r
+            return null;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Prase a list of strings / chatpers\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// An array of chapter objects\r
+        /// </returns>\r
+        public static Chapter[] ParseList(StringReader output)\r
+        {\r
+            var chapters = new List<Chapter>();\r
+\r
+            // this is to read the "  + chapters:" line from the buffer\r
+            // so we can start reading the chapters themselvs\r
+            output.ReadLine();\r
+\r
+            while (true)\r
+            {\r
+                // Start of the chapter list for this Title\r
+                Chapter thisChapter = Parse(output);\r
+\r
+                if (thisChapter != null)\r
+                    chapters.Add(thisChapter);\r
+                else\r
+                    break;\r
+            }\r
+            return chapters.ToArray();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {chapter #}</returns>\r
+        public override string ToString()\r
+        {\r
+            return ChapterNumber.ToString();\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/DVD.cs b/win/C#/HandBrake.ApplicationServices/Parsing/DVD.cs
new file mode 100644 (file)
index 0000000..c7e5a27
--- /dev/null
@@ -0,0 +1,53 @@
+/*  DVD.cs $    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+\r
+    /// <summary>\r
+    /// An object representing a scanned DVD\r
+    /// </summary>\r
+    public class DVD\r
+    {\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="DVD"/> class. \r
+        /// Default constructor for this object\r
+        /// </summary>\r
+        public DVD()\r
+        {\r
+            Titles = new List<Title>();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets Titles. A list of titles from the source\r
+        /// </summary>\r
+        public List<Title> Titles { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Parse the StreamReader output into a List of Titles\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A DVD object which contains a list of title inforamtion\r
+        /// </returns>\r
+        public static DVD Parse(StreamReader output)\r
+        {\r
+            var thisDVD = new DVD();\r
+\r
+            while (!output.EndOfStream)\r
+            {\r
+                if ((char) output.Peek() == '+')\r
+                    thisDVD.Titles.AddRange(Title.ParseList(output.ReadToEnd()));\r
+                else\r
+                    output.ReadLine();\r
+            }\r
+\r
+            return thisDVD;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/Parser.cs b/win/C#/HandBrake.ApplicationServices/Parsing/Parser.cs
new file mode 100644 (file)
index 0000000..e46afea
--- /dev/null
@@ -0,0 +1,163 @@
+/*  Parser.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System;\r
+    using System.Globalization;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Text.RegularExpressions;\r
+\r
+    /// <summary>\r
+    /// A delegate to handle custom events regarding data being parsed from the buffer\r
+    /// </summary>\r
+    /// <param name="sender">The object which raised this delegate</param>\r
+    /// <param name="data">The data parsed from the stream</param>\r
+    public delegate void DataReadEventHandler(object sender, string data);\r
+\r
+    /// <summary>\r
+    /// A delegate to handle events regarding progress during DVD scanning\r
+    /// </summary>\r
+    /// <param name="sender">The object who's raising the event</param>\r
+    /// <param name="currentTitle">The title number currently being processed</param>\r
+    /// <param name="titleCount">The total number of titiles to be processed</param>\r
+    public delegate void ScanProgressEventHandler(object sender, int currentTitle, int titleCount);\r
+\r
+    /// <summary>\r
+    /// A delegate to handle encode progress updates // EXPERIMENTAL\r
+    /// </summary>\r
+    /// <param name="sender">The object which raised the event</param>\r
+    /// <param name="currentTask">The current task being processed from the queue</param>\r
+    /// <param name="taskCount">The total number of tasks in queue</param>\r
+    /// <param name="percentComplete">The percentage this task is complete</param>\r
+    /// <param name="currentFps">The current encoding fps</param>\r
+    /// <param name="averageFps">The average encoding fps for this task</param>\r
+    /// <param name="timeRemaining">The estimated time remaining for this task to complete</param>\r
+    public delegate void EncodeProgressEventHandler(object sender, int currentTask, int taskCount, float percentComplete, float currentFps, float averageFps, string timeRemaining);\r
+\r
+    /// <summary>\r
+    /// A simple wrapper around a StreamReader to keep track of the entire output from a cli process\r
+    /// </summary>\r
+    public class Parser : StreamReader\r
+    {\r
+        /// <summary>\r
+        /// The Buffer StringBuilder\r
+        /// </summary>\r
+        private readonly StringBuilder buffer = new StringBuilder(string.Empty);\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Parser"/> class. \r
+        /// Default constructor for this object\r
+        /// </summary>\r
+        /// <param name="baseStream">\r
+        /// The stream to parse from\r
+        /// </param>\r
+        public Parser(Stream baseStream) : base(baseStream)\r
+        {\r
+        }\r
+\r
+        /// <summary>\r
+        /// Raised upon a new line being read from stdout/stderr\r
+        /// </summary>\r
+        public event DataReadEventHandler OnReadLine;\r
+\r
+        /// <summary>\r
+        /// Raised upon the entire stdout/stderr stream being read in a single call\r
+        /// </summary>\r
+        public event DataReadEventHandler OnReadToEnd;\r
+\r
+        /// <summary>\r
+        /// Raised upon the catching of a "Scanning title # of #..." in the stream\r
+        /// </summary>\r
+        public event ScanProgressEventHandler OnScanProgress;\r
+\r
+        /// <summary>\r
+        /// Raised upon the catching of a "Scanning title # of #..." in the stream\r
+        /// </summary>\r
+        public event EncodeProgressEventHandler OnEncodeProgress;\r
+\r
+        /// <summary>\r
+        /// Gets the buffer of data that came from the CLI standard input/error\r
+        /// </summary>\r
+        public StringBuilder Buffer\r
+        {\r
+            get { return buffer; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Read a line from standard in/err\r
+        /// </summary>\r
+        /// <returns>\r
+        /// The read line\r
+        /// </returns>\r
+        public override string ReadLine()\r
+        {\r
+            string tmp = base.ReadLine();\r
+\r
+            buffer.Append(tmp + Environment.NewLine);\r
+\r
+            Match m = null;\r
+            if (tmp.Contains("Scanning title"))\r
+                m = Regex.Match(tmp, "^Scanning title ([0-9]*) of ([0-9]*)");\r
+\r
+            if (OnReadLine != null)\r
+                OnReadLine(this, tmp);\r
+\r
+            if (m != null)\r
+                if (m.Success && OnScanProgress != null)\r
+                    OnScanProgress(this, int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));\r
+\r
+            return tmp;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Read to the end of the input stream\r
+        /// </summary>\r
+        /// <returns>\r
+        /// A string of the input data\r
+        /// </returns>\r
+        public override string ReadToEnd()\r
+        {\r
+            string tmp = base.ReadToEnd();\r
+\r
+            buffer.Append(tmp + Environment.NewLine);\r
+            if (OnReadToEnd != null)\r
+                OnReadToEnd(this, tmp);\r
+\r
+            return tmp;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Pase the CLI status output (from standard output)\r
+        /// </summary>\r
+        public void ReadEncodeStatus()\r
+        {\r
+            CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");\r
+            string tmp = base.ReadLine();\r
+\r
+            Match m = Regex.Match(tmp, @"^Encoding: task ([0-9]*) of ([0-9]*), ([0-9]*\.[0-9]*) %( \(([0-9]*\.[0-9]*) fps, avg ([0-9]*\.[0-9]*) fps, ETA ([0-9]{2})h([0-9]{2})m([0-9]{2})s\))?");\r
+            if (m.Success && OnEncodeProgress != null)\r
+            {\r
+                int currentTask = int.Parse(m.Groups[1].Value);\r
+                int totalTasks = int.Parse(m.Groups[2].Value);\r
+                float percent = float.Parse(m.Groups[3].Value, culture);\r
+                float currentFps = m.Groups[5].Value == string.Empty ? 0.0F : float.Parse(m.Groups[5].Value, culture);\r
+                float avgFps = m.Groups[6].Value == string.Empty ? 0.0F : float.Parse(m.Groups[6].Value, culture);\r
+                string remaining = string.Empty;\r
+                if (m.Groups[7].Value != string.Empty)\r
+                {\r
+                    remaining = m.Groups[7].Value + ":" + m.Groups[8].Value + ":" + m.Groups[9].Value;\r
+                }\r
+                if (string.IsNullOrEmpty(remaining))\r
+                {\r
+                    remaining = "Calculating ...";\r
+                }\r
+\r
+                OnEncodeProgress(this, currentTask, totalTasks, percent, currentFps, avgFps, remaining);\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/Subtitle.cs b/win/C#/HandBrake.ApplicationServices/Parsing/Subtitle.cs
new file mode 100644 (file)
index 0000000..4bf9458
--- /dev/null
@@ -0,0 +1,140 @@
+/*  Subtitle.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Text.RegularExpressions;\r
+\r
+    using HandBrake.ApplicationServices.Functions;\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    /// <summary>\r
+    /// An object that represents a subtitle associated with a Title, in a DVD\r
+    /// </summary>\r
+    public class Subtitle\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets the track number of this Subtitle\r
+        /// </summary>\r
+        public int TrackNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the The language (if detected) of this Subtitle\r
+        /// </summary>\r
+        public string Language { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Langauage Code\r
+        /// </summary>\r
+        public string LanguageCode { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Subtitle Type\r
+        /// </summary>\r
+        public SubtitleType SubtitleType { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets Subtitle Type\r
+        /// </summary>\r
+        public string TypeString\r
+        {\r
+            get\r
+            {\r
+                return EnumHelper.GetDescription(this.SubtitleType);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Parse the input strings related to subtitles\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// A Subitle object\r
+        /// </returns>\r
+        public static Subtitle Parse(StringReader output)\r
+        {\r
+            string curLine = output.ReadLine();\r
+\r
+            // + 1, English (iso639-2: eng) (Text)(SSA)\r
+            // + 1, English (iso639-2: eng) (Text)(UTF-8)\r
+            Match m = Regex.Match(curLine, @"^    \+ ([0-9]*), ([A-Za-z, ]*) \((.*)\) \(([a-zA-Z]*)\)\(([a-zA-Z0-9\-]*)\)");\r
+\r
+            if (m.Success && !curLine.Contains("HandBrake has exited."))\r
+            {\r
+                var thisSubtitle = new Subtitle\r
+                                       {\r
+                                           TrackNumber = int.Parse(m.Groups[1].Value.Trim()),\r
+                                           Language = m.Groups[2].Value,\r
+                                           LanguageCode = m.Groups[3].Value,\r
+                                       };\r
+\r
+                switch (m.Groups[5].Value)\r
+                {\r
+                    case "VOBSUB":\r
+                        thisSubtitle.SubtitleType = SubtitleType.VobSub;\r
+                        break;\r
+                    case "SRT":\r
+                        thisSubtitle.SubtitleType = SubtitleType.SRT;\r
+                        break;\r
+                    case "CC":\r
+                        thisSubtitle.SubtitleType = SubtitleType.CC;\r
+                        break;\r
+                    case "UTF-8":\r
+                        thisSubtitle.SubtitleType = SubtitleType.UTF8Sub;\r
+                        break;\r
+                    case "TX3G":\r
+                        thisSubtitle.SubtitleType = SubtitleType.TX3G;\r
+                        break;\r
+                    case "SSA":\r
+                        thisSubtitle.SubtitleType = SubtitleType.SSA;\r
+                        break;\r
+                    default:\r
+                        thisSubtitle.SubtitleType = SubtitleType.Unknown;\r
+                        break;\r
+                }\r
+\r
+                return thisSubtitle;\r
+            }\r
+            return null;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Parse a list of Subtitle tracks from an input string.\r
+        /// </summary>\r
+        /// <param name="output">\r
+        /// The output.\r
+        /// </param>\r
+        /// <returns>\r
+        /// An array of Subtitle objects\r
+        /// </returns>\r
+        public static IEnumerable<Subtitle> ParseList(StringReader output)\r
+        {\r
+            var subtitles = new List<Subtitle>();\r
+            while ((char)output.Peek() != '+')\r
+            {\r
+                Subtitle thisSubtitle = Parse(output);\r
+\r
+                if (thisSubtitle != null)\r
+                    subtitles.Add(thisSubtitle);\r
+                else\r
+                    break;\r
+            }\r
+            return subtitles.ToArray();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {track #} {language}</returns>\r
+        public override string ToString()\r
+        {\r
+            return string.Format("{0} {1} ({2})", TrackNumber, Language, TypeString);\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Parsing/Title.cs b/win/C#/HandBrake.ApplicationServices/Parsing/Title.cs
new file mode 100644 (file)
index 0000000..3f165de
--- /dev/null
@@ -0,0 +1,233 @@
+/*  Title.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Parsing\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Drawing;\r
+    using System.Globalization;\r
+    using System.IO;\r
+    using System.Text.RegularExpressions;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    /// <summary>\r
+    /// An object that represents a single Title of a DVD\r
+    /// </summary>\r
+    public class Title\r
+    {\r
+        /// <summary>\r
+        /// The Culture Info\r
+        /// </summary>\r
+        private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Title"/> class. \r
+        /// </summary>\r
+        public Title()\r
+        {\r
+            AudioTracks = new List<AudioTrack>();\r
+            Chapters = new List<Chapter>();\r
+            Subtitles = new List<Subtitle>();\r
+        }\r
+\r
+        #region Properties\r
+\r
+        /// <summary>\r
+        /// Gets or sets a Collection of chapters in this Title\r
+        /// </summary>\r
+        public List<Chapter> Chapters { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a Collection of audio tracks associated with this Title\r
+        /// </summary>\r
+        public List<AudioTrack> AudioTracks { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a Collection of subtitles associated with this Title\r
+        /// </summary>\r
+        public List<Subtitle> Subtitles { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The track number of this Title\r
+        /// </summary>\r
+        public int TitleNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the length in time of this Title\r
+        /// </summary>\r
+        public TimeSpan Duration { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the resolution (width/height) of this Title\r
+        /// </summary>\r
+        public Size Resolution { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the aspect ratio of this Title\r
+        /// </summary>\r
+        public double AspectRatio { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets AngleCount.\r
+        /// </summary>\r
+        public int AngleCount { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Par Value\r
+        /// </summary>\r
+        public Size ParVal { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the automatically detected crop region for this Title.\r
+        /// This is an int array with 4 items in it as so:\r
+        /// 0: T\r
+        /// 1: B\r
+        /// 2: L\r
+        /// 3: R\r
+        /// </summary>\r
+        public Cropping AutoCropDimensions { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the FPS of the source.\r
+        /// </summary>\r
+        public double Fps { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether this is a MainTitle.\r
+        /// </summary>\r
+        public bool MainTitle { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Source Name\r
+        /// </summary>\r
+        public string SourceName { get; set; }\r
+\r
+        #endregion\r
+\r
+        /// <summary>\r
+        /// Parse the Title Information\r
+        /// </summary>\r
+        /// <param name="output">A stingreader of output data</param>\r
+        /// <returns>A Title</returns>\r
+        public static Title Parse(StringReader output)\r
+        {\r
+            var thisTitle = new Title();\r
+            string nextLine = output.ReadLine();\r
+\r
+            // Get the Title Number\r
+            Match m = Regex.Match(nextLine, @"^\+ title ([0-9]*):");\r
+            if (m.Success)\r
+                thisTitle.TitleNumber = int.Parse(m.Groups[1].Value.Trim());\r
+            nextLine = output.ReadLine();\r
+\r
+            // Detect if this is the main feature\r
+            m = Regex.Match(nextLine, @"  \+ Main Feature");\r
+            if (m.Success)\r
+            {\r
+                thisTitle.MainTitle = true;\r
+                nextLine = output.ReadLine();\r
+            }\r
+\r
+            // Get the stream name for file import\r
+            m = Regex.Match(nextLine, @"^  \+ stream:");\r
+            if (m.Success)\r
+            {\r
+                thisTitle.SourceName = nextLine.Replace("+ stream:", string.Empty).Trim();\r
+                nextLine = output.ReadLine();\r
+            }\r
+\r
+            // Jump over the VTS and blocks line\r
+            m = Regex.Match(nextLine, @"^  \+ vts:");\r
+            if (nextLine.Contains("blocks") || nextLine.Contains("+ vts "))\r
+            {\r
+                nextLine = output.ReadLine();\r
+            }\r
+       \r
+            // Multi-Angle Support if LibDvdNav is enabled\r
+            if (!Init.DisableDvdNav)\r
+            {\r
+                m = Regex.Match(nextLine, @"  \+ angle\(s\) ([0-9])");\r
+                if (m.Success)\r
+                {\r
+                    string angleList = m.Value.Replace("+ angle(s) ", string.Empty).Trim();\r
+                    int angleCount;\r
+                    int.TryParse(angleList, out angleCount);\r
+\r
+                    thisTitle.AngleCount = angleCount;\r
+                    nextLine = output.ReadLine();\r
+                }\r
+            }\r
+\r
+            // Get duration for this title\r
+            m = Regex.Match(nextLine, @"^  \+ duration: ([0-9]{2}:[0-9]{2}:[0-9]{2})");\r
+            if (m.Success)\r
+                thisTitle.Duration = TimeSpan.Parse(m.Groups[1].Value);\r
+\r
+            // Get resolution, aspect ratio and FPS for this title\r
+            m = Regex.Match(output.ReadLine(), @"^  \+ size: ([0-9]*)x([0-9]*), pixel aspect: ([0-9]*)/([0-9]*), display aspect: ([0-9]*\.[0-9]*), ([0-9]*\.[0-9]*) fps");\r
+            if (m.Success)\r
+            {\r
+                thisTitle.Resolution = new Size(int.Parse(m.Groups[1].Value), int.Parse(m.Groups[2].Value));\r
+                thisTitle.ParVal = new Size(int.Parse(m.Groups[3].Value), int.Parse(m.Groups[4].Value));\r
+                thisTitle.AspectRatio = float.Parse(m.Groups[5].Value, Culture);\r
+                thisTitle.Fps = float.Parse(m.Groups[6].Value, Culture);\r
+            }\r
+\r
+            // Get autocrop region for this title\r
+            m = Regex.Match(output.ReadLine(), @"^  \+ autocrop: ([0-9]*)/([0-9]*)/([0-9]*)/([0-9]*)");\r
+            if (m.Success)\r
+            {\r
+                thisTitle.AutoCropDimensions = new Cropping\r
+                    {\r
+                        Top = int.Parse(m.Groups[1].Value),\r
+                        Bottom = int.Parse(m.Groups[2].Value),\r
+                        Left = int.Parse(m.Groups[3].Value),\r
+                        Right = int.Parse(m.Groups[4].Value)\r
+                    };\r
+            }\r
+\r
+            thisTitle.Chapters.AddRange(Chapter.ParseList(output));\r
+\r
+            thisTitle.AudioTracks.AddRange(AudioTrack.ParseList(output));\r
+\r
+            thisTitle.Subtitles.AddRange(Subtitle.ParseList(output));\r
+\r
+            return thisTitle;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Return a list of parsed titles\r
+        /// </summary>\r
+        /// <param name="output">The Output</param>\r
+        /// <returns>A List of titles</returns>\r
+        public static Title[] ParseList(string output)\r
+        {\r
+            var titles = new List<Title>();\r
+            var sr = new StringReader(output);\r
+\r
+            while (sr.Peek() == '+' || sr.Peek() == ' ')\r
+            {\r
+                // If the the character is a space, then chances are the line\r
+                if (sr.Peek() == ' ') // If the character is a space, then chances are it's the combing detected line.\r
+                    sr.ReadLine(); // Skip over it\r
+                else\r
+                    titles.Add(Parse(sr));\r
+            }\r
+\r
+            return titles.ToArray();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to provide an easy way to use this object in the UI\r
+        /// </summary>\r
+        /// <returns>A string representing this track in the format: {title #} (00:00:00)</returns>\r
+        public override string ToString()\r
+        {\r
+            return string.Format("{0} ({1:00}:{2:00}:{3:00})", TitleNumber, Duration.Hours, Duration.Minutes, Duration.Seconds);\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl b/win/C#/HandBrake.ApplicationServices/Properties/AssemblyInfo.cs.tmpl
new file mode 100644 (file)
index 0000000..5669415
--- /dev/null
@@ -0,0 +1,42 @@
+/*  AssemblyInfo.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+using System.Reflection;\r
+using System.Resources;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("HandBrake")]\r
+[assembly: AssemblyDescription("HandBrake is a GPL-licensed, multiplatform, multithreaded video transcoder.")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("HandBrake Team")]\r
+[assembly: AssemblyProduct("HandBrake")]\r
+[assembly: AssemblyCopyright("Copyright Â©  2011")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Setting ComVisible to false makes the types in this assembly not visible \r
+// to COM components.  If you need to access a type in this assembly from \r
+// COM, set the ComVisible attribute to true on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The following GUID is for the ID of the typelib if this project is exposed to COM\r
+[assembly: Guid("5e4e3f97-5252-41f6-aae9-3846f62cbc66")]\r
+\r
+// Version information for an assembly consists of the following four values:\r
+//\r
+//      Major Version\r
+//      Minor Version \r
+//      Build Number\r
+//      Revision\r
+//\r
+// You can specify all the values or you can default the Build and Revision Numbers \r
+// by using the '*' as shown below:\r
+// [assembly: AssemblyVersion("1.0.*")]\r
+[assembly: AssemblyVersion("0.9.5.$WCREV$")]\r
+[assembly: NeutralResourcesLanguage("")]\r
diff --git a/win/C#/HandBrake.ApplicationServices/Properties/Resources.Designer.cs b/win/C#/HandBrake.ApplicationServices/Properties/Resources.Designer.cs
new file mode 100644 (file)
index 0000000..c1dd66e
--- /dev/null
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------\r
+// <auto-generated>\r
+//     This code was generated by a tool.\r
+//     Runtime Version:4.0.30319.1\r
+//\r
+//     Changes to this file may cause incorrect behavior and will be lost if\r
+//     the code is regenerated.\r
+// </auto-generated>\r
+//------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.ApplicationServices.Properties {\r
+    using System;\r
+    \r
+    \r
+    /// <summary>\r
+    ///   A strongly-typed resource class, for looking up localized strings, etc.\r
+    /// </summary>\r
+    // This class was auto-generated by the StronglyTypedResourceBuilder\r
+    // class via a tool like ResGen or Visual Studio.\r
+    // To add or remove a member, edit your .ResX file then rerun ResGen\r
+    // with the /str option, or rebuild your VS project.\r
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]\r
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
+    internal class Resources {\r
+        \r
+        private static global::System.Resources.ResourceManager resourceMan;\r
+        \r
+        private static global::System.Globalization.CultureInfo resourceCulture;\r
+        \r
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]\r
+        internal Resources() {\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Returns the cached ResourceManager instance used by this class.\r
+        /// </summary>\r
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
+        internal static global::System.Resources.ResourceManager ResourceManager {\r
+            get {\r
+                if (object.ReferenceEquals(resourceMan, null)) {\r
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HandBrake.ApplicationServices.Properties.Resources", typeof(Resources).Assembly);\r
+                    resourceMan = temp;\r
+                }\r
+                return resourceMan;\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Overrides the current thread's CurrentUICulture property for all\r
+        ///   resource lookups using this strongly typed resource class.\r
+        /// </summary>\r
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
+        internal static global::System.Globalization.CultureInfo Culture {\r
+            get {\r
+                return resourceCulture;\r
+            }\r
+            set {\r
+                resourceCulture = value;\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap logo64 {\r
+            get {\r
+                object obj = ResourceManager.GetObject("logo64", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.ApplicationServices/Properties/Resources.resx b/win/C#/HandBrake.ApplicationServices/Properties/Resources.resx
new file mode 100644 (file)
index 0000000..2e1c284
--- /dev/null
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="logo64" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\logo64.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Resources/logo64.png b/win/C#/HandBrake.ApplicationServices/Resources/logo64.png
new file mode 100644 (file)
index 0000000..12808f6
Binary files /dev/null and b/win/C#/HandBrake.ApplicationServices/Resources/logo64.png differ
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Encode.cs b/win/C#/HandBrake.ApplicationServices/Services/Encode.cs
new file mode 100644 (file)
index 0000000..fc620ac
--- /dev/null
@@ -0,0 +1,558 @@
+/*  Encode.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services\r
+{\r
+    using System;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.Framework.Services;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+    using HandBrake.ApplicationServices.Functions;\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Parsing;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// Class which handles the CLI\r
+    /// </summary>\r
+    public class Encode : IEncode\r
+    {\r
+        #region Private Variables\r
+\r
+        /// <summary>\r
+        /// The Error Service\r
+        /// </summary>\r
+        protected IErrorService errorService;\r
+\r
+        /// <summary>\r
+        /// The Log Buffer\r
+        /// </summary>\r
+        private StringBuilder logBuffer;\r
+\r
+        /// <summary>\r
+        /// The Log file writer\r
+        /// </summary>\r
+        private StreamWriter fileWriter;\r
+\r
+        /// <summary>\r
+        /// Gets The Process Handle\r
+        /// </summary>\r
+        private IntPtr processHandle;\r
+\r
+        /// <summary>\r
+        /// Gets the Process ID\r
+        /// </summary>\r
+        private int processID;\r
+\r
+        /// <summary>\r
+        /// Windows 7 API Pack wrapper\r
+        /// </summary>\r
+        private Win7 windowsSeven = new Win7();\r
+\r
+        #endregion\r
+\r
+        /* Constructor */\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="Encode"/> class.\r
+        /// </summary>\r
+        public Encode()\r
+        {\r
+            this.EncodeStarted += Encode_EncodeStarted;\r
+            GrowlCommunicator.Register();\r
+\r
+            this.errorService = new ErrorService();\r
+        }\r
+\r
+        #region Delegates and Event Handlers\r
+\r
+        /// <summary>\r
+        /// Encode Progess Status\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EncodeProgressEventArgs.\r
+        /// </param>\r
+        public delegate void EncodeProgessStatus(object sender, EncodeProgressEventArgs e);\r
+\r
+        /* Event Handlers */\r
+\r
+        /// <summary>\r
+        /// Fires when a new CLI Job starts\r
+        /// </summary>\r
+        public event EventHandler EncodeStarted;\r
+\r
+        /// <summary>\r
+        /// Fires when a CLI job finishes.\r
+        /// </summary>\r
+        public event EventHandler EncodeEnded;\r
+\r
+        /// <summary>\r
+        /// Encode process has progressed\r
+        /// </summary>\r
+        public event EncodeProgessStatus EncodeStatusChanged;\r
+        #endregion\r
+\r
+        /* Properties */\r
+\r
+        /// <summary>\r
+        /// Gets or sets The HB Process\r
+        /// </summary>\r
+        protected Process HbProcess { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether IsEncoding.\r
+        /// </summary>\r
+        public bool IsEncoding { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets ActivityLog.\r
+        /// </summary>\r
+        public string ActivityLog\r
+        {\r
+            get\r
+            {\r
+                if (this.IsEncoding == false)\r
+                {\r
+                    try\r
+                    {\r
+                        ReadFile(); // Read the last log file back in if it exists\r
+                    }\r
+                    catch (Exception exc)\r
+                    {\r
+                        return exc.ToString();\r
+                    }\r
+                }\r
+\r
+                return string.IsNullOrEmpty(this.logBuffer.ToString()) ? "No log data available..." : this.logBuffer.ToString();\r
+            }\r
+        }\r
+\r
+        /* Public Methods */\r
+\r
+        /// <summary>\r
+        /// Create a preview sample video\r
+        /// </summary>\r
+        /// <param name="query">\r
+        /// The CLI Query\r
+        /// </param>\r
+        public void CreatePreviewSample(string query)\r
+        {\r
+            this.Run(new Job { Query = query }, false);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Execute a HandBrakeCLI process.\r
+        /// </summary>\r
+        /// <param name="encJob">\r
+        /// The enc Job.\r
+        /// </param>\r
+        /// <param name="enableLogging">\r
+        /// Enable Logging. When Disabled we onlt parse Standard Ouput for progress info. Standard Error log data is ignored.\r
+        /// </param>\r
+        protected void Run(Job encJob, bool enableLogging)\r
+        {\r
+            try\r
+            {\r
+                IsEncoding = true;\r
+\r
+                if (enableLogging)\r
+                    SetupLogging(encJob);\r
+\r
+                if (Init.PreventSleep)\r
+                {\r
+                    Win32.PreventSleep();\r
+                }\r
+\r
+                string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
+                ProcessStartInfo cliStart = new ProcessStartInfo(handbrakeCLIPath, encJob.Query)\r
+                {\r
+                    RedirectStandardOutput = true,\r
+                    RedirectStandardError = enableLogging ? true : false,\r
+                    UseShellExecute = false,\r
+                    CreateNoWindow = !Init.ShowCliForInGuiEncodeStatus ? true : false\r
+                };\r
+\r
+                this.HbProcess = Process.Start(cliStart);\r
+\r
+                if (enableLogging)\r
+                {\r
+                    this.HbProcess.ErrorDataReceived += HbProcErrorDataReceived;\r
+                    this.HbProcess.BeginErrorReadLine();\r
+                }\r
+\r
+                this.processID = HbProcess.Id;\r
+                this.processHandle = HbProcess.Handle;\r
+\r
+                // Set the process Priority\r
+                if (this.processID != -1)\r
+                {\r
+                    this.HbProcess.EnableRaisingEvents = true;\r
+                    this.HbProcess.Exited += HbProcess_Exited;\r
+                }\r
+\r
+                // Set the Process Priority\r
+                switch (Init.ProcessPriority)\r
+                {\r
+                    case "Realtime":\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.RealTime;\r
+                        break;\r
+                    case "High":\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.High;\r
+                        break;\r
+                    case "Above Normal":\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.AboveNormal;\r
+                        break;\r
+                    case "Normal":\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.Normal;\r
+                        break;\r
+                    case "Low":\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.Idle;\r
+                        break;\r
+                    default:\r
+                        this.HbProcess.PriorityClass = ProcessPriorityClass.BelowNormal;\r
+                        break;\r
+                }\r
+\r
+                // Fire the Encode Started Event\r
+                if (this.EncodeStarted != null)\r
+                    this.EncodeStarted(this, new EventArgs());\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                errorService.ShowError("It would appear that HandBrakeCLI has not started correctly." +\r
+                "You should take a look at the Activity log as it may indicate the reason why.\n\nDetailed Error Information: error occured in runCli()",\r
+                exc.ToString());\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Kill the CLI process\r
+        /// </summary>\r
+        public void Stop()\r
+        {\r
+            try\r
+            {\r
+                if (this.HbProcess != null && !this.HbProcess.HasExited)\r
+                {\r
+                    this.HbProcess.Kill();\r
+                }\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                errorService.ShowError("Unable to stop HandBrakeCLI. It may not be running.", exc.ToString());\r
+            }\r
+\r
+            if (this.EncodeEnded != null)\r
+                this.EncodeEnded(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Attempt to Safely kill a DirectRun() CLI\r
+        /// NOTE: This will not work with a MinGW CLI\r
+        /// Note: http://www.cygwin.com/ml/cygwin/2006-03/msg00330.html\r
+        /// </summary>\r
+        public void SafelyClose()\r
+        {\r
+            if ((int)this.processHandle == 0)\r
+                return;\r
+\r
+            // Allow the CLI to exit cleanly\r
+            Win32.SetForegroundWindow((int)this.processHandle);\r
+            SendKeys.Send("^C");\r
+            SendKeys.Flush();\r
+\r
+            /*/if (HbProcess != null)\r
+            //{\r
+            //    HbProcess.StandardInput.AutoFlush = true;\r
+            //    HbProcess.StandardInput.WriteLine("^c^z");\r
+            //}*/\r
+        }\r
+\r
+        /* Helpers */\r
+\r
+        /// <summary>\r
+        /// Save a copy of the log to the users desired location or a default location\r
+        /// if this feature is enabled in options.\r
+        /// </summary>\r
+        /// <param name="destination">\r
+        /// The Destination File Path\r
+        /// </param>\r
+        protected void CopyLog(string destination)\r
+        {\r
+            try\r
+            {\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +\r
+                                "\\HandBrake\\logs";\r
+                string tempLogFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));\r
+\r
+                string encodeDestinationPath = Path.GetDirectoryName(destination);\r
+                string destinationFile = Path.GetFileName(destination);\r
+                string encodeLogFile = destinationFile + " " +\r
+                                       DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + ".txt";\r
+\r
+                // Make sure the log directory exists.\r
+                if (!Directory.Exists(logDir))\r
+                    Directory.CreateDirectory(logDir);\r
+\r
+                // Copy the Log to HandBrakes log folder in the users applciation data folder.\r
+                File.Copy(tempLogFile, Path.Combine(logDir, encodeLogFile));\r
+\r
+                // Save a copy of the log file in the same location as the enocde.\r
+                if (Init.SaveLogWithVideo)\r
+                    File.Copy(tempLogFile, Path.Combine(encodeDestinationPath, encodeLogFile));\r
+\r
+                // Save a copy of the log file to a user specified location\r
+                if (Directory.Exists(Init.SaveLogPath))\r
+                    if (Init.SaveLogPath != String.Empty && Init.SaveLogToSpecifiedPath)\r
+                        File.Copy(tempLogFile, Path.Combine(Init.SaveLogPath, encodeLogFile));\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                errorService.ShowError("Unable to make a copy of the log file", exc.ToString());\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// The HandBrakeCLI process has exited.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void HbProcess_Exited(object sender, EventArgs e)\r
+        {\r
+            IsEncoding = false;\r
+            if (this.EncodeEnded != null)\r
+                this.EncodeEnded(this, new EventArgs());\r
+\r
+            if (windowsSeven.IsWindowsSeven)\r
+            {\r
+                windowsSeven.SetTaskBarProgressToNoProgress();\r
+            }\r
+\r
+            if (Init.PreventSleep)\r
+            {\r
+                Win32.AllowSleep();\r
+            }\r
+\r
+            try\r
+            {\r
+                if (fileWriter != null)\r
+                {\r
+                    fileWriter.Close();\r
+                    fileWriter.Dispose();\r
+                }\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                errorService.ShowError("Unable to close the log file wrtier", exc.ToString());\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Read the log file\r
+        /// </summary>\r
+        private void ReadFile()\r
+        {\r
+            logBuffer = new StringBuilder();\r
+            lock (logBuffer)\r
+            {\r
+                // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),\r
+                // we'll need to make a copy of it.\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
+                string logFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));\r
+                string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId));\r
+                int logFilePosition = 0;\r
+\r
+                try\r
+                {\r
+                    // Copy the log file.\r
+                    if (File.Exists(logFile))\r
+                        File.Copy(logFile, logFile2, true);\r
+                    else\r
+                        return;\r
+\r
+                    // Start the Reader\r
+                    // Only use text which continues on from the last read line\r
+                    using (StreamReader sr = new StreamReader(logFile2))\r
+                    {\r
+                        string line;\r
+                        int i = 1;\r
+                        while ((line = sr.ReadLine()) != null)\r
+                        {\r
+                            if (i > logFilePosition)\r
+                            {\r
+                                logBuffer.AppendLine(line);\r
+                                logFilePosition++;\r
+                            }\r
+                            i++;\r
+                        }\r
+                        sr.Close();\r
+                    }\r
+                }\r
+                catch (Exception exc)\r
+                {\r
+                    throw new Exception("Unable to read log file" + Environment.NewLine + exc);\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Setup the logging.\r
+        /// </summary>\r
+        /// <param name="encodeJob">\r
+        /// The encode Job.\r
+        /// </param>\r
+        private void SetupLogging(Job encodeJob)\r
+        {\r
+            string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
+            string logFile = Path.Combine(logDir, string.Format("last_encode_log{0}.txt", Init.InstanceId));\r
+            string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId));\r
+\r
+            try\r
+            {\r
+                logBuffer = new StringBuilder();\r
+\r
+                // Clear the current Encode Logs\r
+                if (File.Exists(logFile)) File.Delete(logFile);\r
+                if (File.Exists(logFile2)) File.Delete(logFile2);\r
+\r
+                fileWriter = new StreamWriter(logFile) { AutoFlush = true };\r
+\r
+                fileWriter.WriteLine(Logging.CreateCliLogHeader(encodeJob));\r
+                logBuffer.AppendLine(Logging.CreateCliLogHeader(encodeJob));\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                if (fileWriter != null)\r
+                {\r
+                    fileWriter.Close();\r
+                    fileWriter.Dispose();\r
+                }\r
+\r
+                errorService.ShowError("Error", exc.ToString());\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Recieve the Standard Error information and process it\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The Sender Object\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// DataReceived EventArgs\r
+        /// </param>\r
+        private void HbProcErrorDataReceived(object sender, DataReceivedEventArgs e)\r
+        {\r
+            if (!String.IsNullOrEmpty(e.Data))\r
+            {\r
+                try\r
+                {\r
+                    lock (logBuffer)\r
+                        logBuffer.AppendLine(e.Data);\r
+\r
+                    if (fileWriter != null && fileWriter.BaseStream.CanWrite)\r
+                    {\r
+                        fileWriter.WriteLine(e.Data);\r
+\r
+                        // If the logging grows past 100MB, kill the encode and stop.\r
+                        if (fileWriter.BaseStream.Length > 100000000)\r
+                        {\r
+                            this.Stop();\r
+                            errorService.ShowError("The encode has been stopped. The log file has grown to over 100MB which indicates a serious problem has occured with the encode.",\r
+                                "Please check the encode log for an indication of what the problem is.");\r
+                        }\r
+                    }            \r
+                }\r
+                catch (Exception exc)\r
+                {\r
+                    // errorService.ShowError("Unable to write log data...", exc.ToString());\r
+                }\r
+            }\r
+        }\r
+\r
+        #region Encode Status from Standard Output\r
+\r
+        /// <summary>\r
+        /// Encode Started\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void Encode_EncodeStarted(object sender, EventArgs e)\r
+        {\r
+            Thread monitor = new Thread(EncodeMonitor);\r
+            monitor.Start();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Monitor the Job\r
+        /// </summary>\r
+        private void EncodeMonitor()\r
+        {\r
+            try\r
+            {\r
+                Parser encode = new Parser(HbProcess.StandardOutput.BaseStream);\r
+                encode.OnEncodeProgress += EncodeOnEncodeProgress;\r
+                while (!encode.EndOfStream)\r
+                    encode.ReadEncodeStatus();\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                EncodeOnEncodeProgress(null, 0, 0, 0, 0, 0, "Unknown, status not available..");\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Displays the Encode status in the GUI\r
+        /// </summary>\r
+        /// <param name="sender">The sender</param>\r
+        /// <param name="currentTask">The current task</param>\r
+        /// <param name="taskCount">Number of tasks</param>\r
+        /// <param name="percentComplete">Percent complete</param>\r
+        /// <param name="currentFps">Current encode speed in fps</param>\r
+        /// <param name="avg">Avg encode speed</param>\r
+        /// <param name="timeRemaining">Time Left</param>\r
+        private void EncodeOnEncodeProgress(object sender, int currentTask, int taskCount, float percentComplete, float currentFps, float avg, string timeRemaining)\r
+        {\r
+            EncodeProgressEventArgs eventArgs = new EncodeProgressEventArgs\r
+                {\r
+                    AverageFrameRate = avg,\r
+                    CurrentFrameRate = currentFps,\r
+                    EstimatedTimeLeft = timeRemaining,\r
+                    PercentComplete = percentComplete,\r
+                    Task = currentTask,\r
+                    TaskCount = taskCount\r
+                };\r
+\r
+            if (this.EncodeStatusChanged != null)\r
+                this.EncodeStatusChanged(this, eventArgs);\r
+\r
+            if (windowsSeven.IsWindowsSeven)\r
+            {\r
+                int percent;\r
+                int.TryParse(Math.Round(percentComplete).ToString(), out percent);\r
+\r
+                windowsSeven.SetTaskBarProgress(percent);\r
+            }\r
+        }\r
+\r
+        #endregion\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs b/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IEncode.cs
new file mode 100644 (file)
index 0000000..9a0681c
--- /dev/null
@@ -0,0 +1,60 @@
+/*  IEncode.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services.Interfaces\r
+{\r
+    using System;\r
+\r
+    /// <summary>\r
+    /// The IEncode Interface\r
+    /// </summary>\r
+    public interface IEncode\r
+    {\r
+        /// <summary>\r
+        /// Fires when a new CLI Job starts\r
+        /// </summary>\r
+        event EventHandler EncodeStarted;\r
+\r
+        /// <summary>\r
+        /// Fires when a CLI job finishes.\r
+        /// </summary>\r
+        event EventHandler EncodeEnded;\r
+\r
+        /// <summary>\r
+        /// Encode process has progressed\r
+        /// </summary>\r
+        event Encode.EncodeProgessStatus EncodeStatusChanged;\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether IsEncoding.\r
+        /// </summary>\r
+        bool IsEncoding { get; }\r
+\r
+        /// <summary>\r
+        /// Gets ActivityLog.\r
+        /// </summary>\r
+        string ActivityLog { get; }\r
+\r
+        /// <summary>\r
+        /// Create a preview sample video\r
+        /// </summary>\r
+        /// <param name="query">\r
+        /// The CLI Query\r
+        /// </param>\r
+        void CreatePreviewSample(string query);\r
+\r
+        /// <summary>\r
+        /// Kill the CLI process\r
+        /// </summary>\r
+        void Stop();\r
+\r
+        /// <summary>\r
+        /// Attempt to Safely kill a DirectRun() CLI\r
+        /// NOTE: This will not work with a MinGW CLI\r
+        /// Note: http://www.cygwin.com/ml/cygwin/2006-03/msg00330.html\r
+        /// </summary>\r
+        void SafelyClose();\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IQueue.cs b/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IQueue.cs
new file mode 100644 (file)
index 0000000..b489f75
--- /dev/null
@@ -0,0 +1,146 @@
+/*  IQueue.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services.Interfaces\r
+{\r
+    using System;\r
+    using System.Collections.ObjectModel;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    /// <summary>\r
+    /// The IQueue Interface\r
+    /// </summary>\r
+    public interface IQueue : IEncode\r
+    {\r
+        /// <summary>\r
+        /// Fires when the Queue has started\r
+        /// </summary>\r
+        event EventHandler QueueStarted;\r
+\r
+        /// <summary>\r
+        /// Fires when a job is Added, Removed or Re-Ordered.\r
+        /// Should be used for triggering an update of the Queue Window.\r
+        /// </summary>\r
+        event EventHandler QueueListChanged;\r
+\r
+        /// <summary>\r
+        /// Fires when a pause to the encode queue has been requested.\r
+        /// </summary>\r
+        event EventHandler QueuePauseRequested;\r
+\r
+        /// <summary>\r
+        /// Fires when the entire encode queue has completed.\r
+        /// </summary>\r
+        event EventHandler QueueCompleted;\r
+\r
+        /// <summary>\r
+        /// Gets or sets the last encode that was processed.\r
+        /// </summary>\r
+        /// <returns></returns> \r
+        Job LastEncode { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether Request Pause\r
+        /// </summary>\r
+        bool Paused { get; }\r
+\r
+        /// <summary>\r
+        /// Gets the current state of the encode queue.\r
+        /// </summary>\r
+        ReadOnlyCollection<Job> CurrentQueue { get; }\r
+\r
+        /// <summary>\r
+        /// Gets the number of items in the queue.\r
+        /// </summary>\r
+        int Count { get; }\r
+\r
+        /// <summary>\r
+        /// Adds an item to the queue.\r
+        /// </summary>\r
+        /// <param name="query">\r
+        /// The query that will be passed to the HandBrake CLI.\r
+        /// </param>\r
+        /// <param name="title">\r
+        /// The title.\r
+        /// </param>\r
+        /// <param name="source">\r
+        /// The location of the source video.\r
+        /// </param>\r
+        /// <param name="destination">\r
+        /// The location where the encoded video will be.\r
+        /// </param>\r
+        /// <param name="customJob">\r
+        /// Custom job\r
+        /// </param>\r
+        void Add(string query, int title, string source, string destination, bool customJob);\r
+\r
+        /// <summary>\r
+        /// Removes an item from the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        void Remove(int index);\r
+\r
+        /// <summary>\r
+        /// Retrieve a job from the queue\r
+        /// </summary>\r
+        /// <param name="index">the job id</param>\r
+        /// <returns>A job for the given index or blank job object</returns>\r
+        Job GetJob(int index);\r
+\r
+        /// <summary>\r
+        /// Moves an item up one position in the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        void MoveUp(int index);\r
+\r
+        /// <summary>\r
+        /// Moves an item down one position in the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        void MoveDown(int index);\r
+\r
+        /// <summary>\r
+        /// Writes the current state of the queue to a file.\r
+        /// </summary>\r
+        /// <param name="file">The location of the file to write the queue to.</param>\r
+        void WriteQueueStateToFile(string file);\r
+\r
+        /// <summary>\r
+        /// Writes the current state of the queue in the form of a batch (.bat) file.\r
+        /// </summary>\r
+        /// <param name="file">\r
+        /// The location of the file to write the batch file to.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The write batch script to file.\r
+        /// </returns>\r
+        bool WriteBatchScriptToFile(string file);\r
+\r
+        /// <summary>\r
+        /// Reads a serialized XML file that represents a queue of encoding jobs.\r
+        /// </summary>\r
+        /// <param name="file">The location of the file to read the queue from.</param>\r
+        void LoadQueueFromFile(string file);\r
+\r
+        /// <summary>\r
+        /// Checks the current queue for an existing instance of the specified destination.\r
+        /// </summary>\r
+        /// <param name="destination">The destination of the encode.</param>\r
+        /// <returns>Whether or not the supplied destination is already in the queue.</returns>\r
+        bool CheckForDestinationDuplicate(string destination);\r
+\r
+        /// <summary>\r
+        /// Starts encoding the first job in the queue and continues encoding until all jobs\r
+        /// have been encoded.\r
+        /// </summary>\r
+        void Start();\r
+\r
+        /// <summary>\r
+        /// Requests a pause of the encode queue.\r
+        /// </summary>\r
+        void Pause();\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs b/win/C#/HandBrake.ApplicationServices/Services/Interfaces/IScan.cs
new file mode 100644 (file)
index 0000000..b02b8b0
--- /dev/null
@@ -0,0 +1,65 @@
+/*  IScan.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services.Interfaces\r
+{\r
+    using System;\r
+\r
+    using HandBrake.ApplicationServices.Parsing;\r
+\r
+    /// <summary>\r
+    /// The IScan Interface\r
+    /// </summary>\r
+    public interface IScan\r
+    {\r
+        /// <summary>\r
+        /// Scan has Started\r
+        /// </summary>\r
+        event EventHandler ScanStared;\r
+\r
+        /// <summary>\r
+        /// Scan has completed\r
+        /// </summary>\r
+        event EventHandler ScanCompleted;\r
+\r
+        /// <summary>\r
+        /// Scan process has changed to a new title\r
+        /// </summary>\r
+        event EventHandler ScanStatusChanged;\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether IsScanning.\r
+        /// </summary>\r
+        bool IsScanning { get; }\r
+\r
+        /// <summary>\r
+        /// Gets the Scan Status.\r
+        /// </summary>\r
+        string ScanStatus { get; }\r
+\r
+        /// <summary>\r
+        /// Gets the Souce Data.\r
+        /// </summary>\r
+        DVD SouceData { get; }\r
+\r
+        /// <summary>\r
+        /// Gets ActivityLog.\r
+        /// </summary>\r
+        string ActivityLog { get; }\r
+\r
+        /// <summary>\r
+        /// Scan a Source Path.\r
+        /// Title 0: scan all\r
+        /// </summary>\r
+        /// <param name="sourcePath">Path to the file to scan</param>\r
+        /// <param name="title">int title number. 0 for scan all</param>\r
+        void Scan(string sourcePath, int title);\r
+\r
+        /// <summary>\r
+        /// Kill the scan\r
+        /// </summary>\r
+        void Stop();\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Queue.cs b/win/C#/HandBrake.ApplicationServices/Services/Queue.cs
new file mode 100644 (file)
index 0000000..ae5c437
--- /dev/null
@@ -0,0 +1,465 @@
+/*  Queue.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Collections.ObjectModel;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+    using System.Xml.Serialization;\r
+\r
+    using HandBrake.ApplicationServices.Functions;\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// The HandBrake Queue\r
+    /// </summary>\r
+    public class Queue : Encode, IQueue\r
+    {\r
+        /// <summary>\r
+        /// The Queue Job List\r
+        /// </summary>\r
+        private readonly List<Job> queue = new List<Job>();\r
+\r
+        /// <summary>\r
+        /// An XML Serializer\r
+        /// </summary>\r
+        private static XmlSerializer serializer;\r
+\r
+        /// <summary>\r
+        /// The Next Job ID\r
+        /// </summary>\r
+        private int nextJobId;\r
+\r
+        #region Events\r
+        /// <summary>\r
+        /// Fires when the Queue has started\r
+        /// </summary>\r
+        public event EventHandler QueueStarted;\r
+\r
+        /// <summary>\r
+        /// Fires when a job is Added, Removed or Re-Ordered.\r
+        /// Should be used for triggering an update of the Queue Window.\r
+        /// </summary>\r
+        public event EventHandler QueueListChanged;\r
+\r
+        /// <summary>\r
+        /// Fires when a pause to the encode queue has been requested.\r
+        /// </summary>\r
+        public event EventHandler QueuePauseRequested;\r
+\r
+        /// <summary>\r
+        /// Fires when the entire encode queue has completed.\r
+        /// </summary>\r
+        public event EventHandler QueueCompleted;\r
+        #endregion\r
+\r
+        #region Properties\r
+        /// <summary>\r
+        /// Gets or sets the last encode that was processed.\r
+        /// </summary>\r
+        /// <returns></returns> \r
+        public Job LastEncode { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether Request Pause\r
+        /// </summary>\r
+        public bool Paused { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets the current state of the encode queue.\r
+        /// </summary>\r
+        public ReadOnlyCollection<Job> CurrentQueue\r
+        {\r
+            get { return this.queue.AsReadOnly(); }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the number of items in the queue.\r
+        /// </summary>\r
+        public int Count\r
+        {\r
+            get { return this.queue.Count; }\r
+        }\r
+        #endregion\r
+\r
+        #region Queue\r
+\r
+        /// <summary>\r
+        /// Gets and removes the next job in the queue.\r
+        /// </summary>\r
+        /// <returns>The job that was removed from the queue.</returns>\r
+        private Job GetNextJob()\r
+        {\r
+            Job job = this.queue[0];\r
+            this.LastEncode = job;\r
+            this.Remove(0); // Remove the item which we are about to pass out.\r
+\r
+            this.SaveQueue();\r
+\r
+            return job;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Adds an item to the queue.\r
+        /// </summary>\r
+        /// <param name="query">\r
+        /// The query that will be passed to the HandBrake CLI.\r
+        /// </param>\r
+        /// <param name="title">\r
+        /// The title.\r
+        /// </param>\r
+        /// <param name="source">\r
+        /// The location of the source video.\r
+        /// </param>\r
+        /// <param name="destination">\r
+        /// The location where the encoded video will be.\r
+        /// </param>\r
+        /// <param name="customJob">\r
+        /// Custom job\r
+        /// </param>\r
+        public void Add(string query, int title, string source, string destination, bool customJob)\r
+        {\r
+            Job newJob = new Job\r
+                             {\r
+                                 Id = this.nextJobId++,\r
+                                 Title = title,\r
+                                 Query = query,\r
+                                 Source = source,\r
+                                 Destination = destination,\r
+                                 CustomQuery = customJob\r
+                             };\r
+\r
+            this.queue.Add(newJob);\r
+            this.SaveQueue();\r
+\r
+            if (this.QueueListChanged != null)\r
+                this.QueueListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Removes an item from the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        public void Remove(int index)\r
+        {\r
+            this.queue.RemoveAt(index);\r
+            this.SaveQueue();\r
+\r
+            if (this.QueueListChanged != null)\r
+                this.QueueListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Retrieve a job from the queue\r
+        /// </summary>\r
+        /// <param name="index">the job id</param>\r
+        /// <returns>A job for the given index or blank job object</returns>\r
+        public Job GetJob(int index)\r
+        {\r
+            if (this.queue.Count >= (index + 1))\r
+                return this.queue[index];\r
+\r
+            return new Job();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Moves an item up one position in the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        public void MoveUp(int index)\r
+        {\r
+            if (index > 0)\r
+            {\r
+                Job item = queue[index];\r
+\r
+                queue.RemoveAt(index);\r
+                queue.Insert((index - 1), item);\r
+            }\r
+\r
+            this.SaveQueue(); // Update the queue recovery file\r
+\r
+            if (this.QueueListChanged != null)\r
+                this.QueueListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Moves an item down one position in the queue.\r
+        /// </summary>\r
+        /// <param name="index">The zero-based location of the job in the queue.</param>\r
+        public void MoveDown(int index)\r
+        {\r
+            if (index < this.queue.Count - 1)\r
+            {\r
+                Job item = this.queue[index];\r
+\r
+                this.queue.RemoveAt(index);\r
+                this.queue.Insert((index + 1), item);\r
+            }\r
+\r
+            this.SaveQueue(); // Update the queue recovery file\r
+\r
+            if (this.QueueListChanged != null)\r
+                this.QueueListChanged(this, new EventArgs());\r
+        }\r
+        \r
+        /// <summary>\r
+        /// Save any updates to the main queue file.\r
+        /// </summary>\r
+        public void SaveQueue()\r
+        {\r
+            string file = Init.InstanceId == 0\r
+                              ? "hb_queue_recovery.xml"\r
+                              : string.Format("hb_queue_recovery{0}.xml", Init.InstanceId);\r
+            this.WriteQueueStateToFile(file);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Writes the current state of the queue to a file.\r
+        /// </summary>\r
+        /// <param name="file">The location of the file to write the queue to.</param>\r
+        public void WriteQueueStateToFile(string file)\r
+        {\r
+            string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");\r
+            string tempPath = file.Contains("hb_queue_recovery") ? appDataPath + file : file;\r
+\r
+            try\r
+            {\r
+                using (FileStream strm = new FileStream(tempPath, FileMode.Create, FileAccess.Write))\r
+                {\r
+                    if (serializer == null)\r
+                        serializer = new XmlSerializer(typeof(List<Job>));\r
+                    serializer.Serialize(strm, queue);\r
+                    strm.Close();\r
+                    strm.Dispose();\r
+                }\r
+            }\r
+            catch (Exception)\r
+            {\r
+                return;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Writes the current state of the queue in the form of a batch (.bat) file.\r
+        /// </summary>\r
+        /// <param name="file">\r
+        /// The location of the file to write the batch file to.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The write batch script to file.\r
+        /// </returns>\r
+        public bool WriteBatchScriptToFile(string file)\r
+        {\r
+            string queries = string.Empty;\r
+            foreach (Job queueItem in this.queue)\r
+            {\r
+                string qItem = queueItem.Query;\r
+                string fullQuery = '"' + Application.StartupPath + "\\HandBrakeCLI.exe" + '"' + qItem;\r
+\r
+                if (queries == string.Empty)\r
+                    queries = queries + fullQuery;\r
+                else\r
+                    queries = queries + " && " + fullQuery;\r
+            }\r
+            string strCmdLine = queries;\r
+\r
+            if (file != string.Empty)\r
+            {\r
+                try\r
+                {\r
+                    // Create a StreamWriter and open the file, Write the batch file query to the file and \r
+                    // Close the stream\r
+                    using (StreamWriter line = new StreamWriter(file))\r
+                    {\r
+                        line.WriteLine(strCmdLine);\r
+                    }\r
+\r
+                    return true;\r
+                }\r
+                catch (Exception exc)\r
+                {\r
+                    errorService.ShowError("Unable to write to the file. Please make sure that the location has the correct permissions for file writing.", exc.ToString());\r
+                }\r
+            }\r
+            return false;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Reads a serialized XML file that represents a queue of encoding jobs.\r
+        /// </summary>\r
+        /// <param name="file">The location of the file to read the queue from.</param>\r
+        public void LoadQueueFromFile(string file)\r
+        {\r
+            string appDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\");\r
+            string tempPath = file.Contains("hb_queue_recovery") ? appDataPath + file : file;\r
+\r
+            if (File.Exists(tempPath))\r
+            {\r
+                using (FileStream strm = new FileStream(tempPath, FileMode.Open, FileAccess.Read))\r
+                {\r
+                    if (strm.Length != 0)\r
+                    {\r
+                        if (serializer == null)\r
+                            serializer = new XmlSerializer(typeof(List<Job>));\r
+\r
+                        List<Job> list = serializer.Deserialize(strm) as List<Job>;\r
+\r
+                        if (list != null)\r
+                            foreach (Job item in list)\r
+                                this.queue.Add(item);\r
+\r
+                        if (!file.Contains("hb_queue_recovery"))\r
+                            this.SaveQueue();\r
+\r
+                        if (this.QueueListChanged != null)\r
+                            this.QueueListChanged(this, new EventArgs());\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Checks the current queue for an existing instance of the specified destination.\r
+        /// </summary>\r
+        /// <param name="destination">The destination of the encode.</param>\r
+        /// <returns>Whether or not the supplied destination is already in the queue.</returns>\r
+        public bool CheckForDestinationDuplicate(string destination)\r
+        {\r
+            return this.queue.Any(checkItem => checkItem.Destination.Contains(destination.Replace("\\\\", "\\")));\r
+        }\r
+\r
+        #endregion\r
+\r
+        #region Encoding\r
+\r
+        /// <summary>\r
+        /// Starts encoding the first job in the queue and continues encoding until all jobs\r
+        /// have been encoded.\r
+        /// </summary>\r
+        public void Start()\r
+        {\r
+            if (this.Count != 0)\r
+            {\r
+                if (this.Paused)\r
+                    this.Paused = false;\r
+                else\r
+                {\r
+                    this.Paused = false;\r
+                    try\r
+                    {\r
+                        Thread theQueue = new Thread(this.StartQueue) { IsBackground = true };\r
+                        theQueue.Start();\r
+\r
+                        if (this.QueueStarted != null)\r
+                            this.QueueStarted(this, new EventArgs());\r
+                    }\r
+                    catch (Exception exc)\r
+                    {\r
+                        errorService.ShowError("Unable to Start Queue", exc.ToString());\r
+                    }\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Requests a pause of the encode queue.\r
+        /// </summary>\r
+        public void Pause()\r
+        {\r
+            this.Paused = true;\r
+\r
+            if (this.QueuePauseRequested != null)\r
+                this.QueuePauseRequested(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Run through all the jobs on the queue.\r
+        /// </summary>\r
+        /// <param name="state">Object State</param>\r
+        private void StartQueue(object state)\r
+        {\r
+            // Run through each item on the queue\r
+            while (this.Count != 0)\r
+            {\r
+                Job encJob = this.GetNextJob();\r
+                this.SaveQueue(); // Update the queue recovery file\r
+\r
+                Run(encJob, true);\r
+\r
+                if (HbProcess == null)\r
+                {\r
+                    return;\r
+                }\r
+                HbProcess.WaitForExit();\r
+\r
+                this.CopyLog(this.LastEncode.Destination);\r
+\r
+                HbProcess.Close();\r
+                HbProcess.Dispose();\r
+\r
+                // Growl\r
+                if (Init.GrowlEncode)\r
+                    GrowlCommunicator.Notify("Encode Completed",\r
+                                             "Put down that cocktail...\nyour Handbrake encode is done.");\r
+\r
+                while (this.Paused) // Need to find a better way of doing this.\r
+                {\r
+                    Thread.Sleep(2000);\r
+                }\r
+            }\r
+            this.LastEncode = new Job();\r
+\r
+            if (this.QueueCompleted != null)\r
+                this.QueueCompleted(this, new EventArgs());\r
+\r
+            // After the encode is done, we may want to shutdown, suspend etc.\r
+            Finish();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Perform an action after an encode. e.g a shutdown, standby, restart etc.\r
+        /// </summary>\r
+        private void Finish()\r
+        {\r
+            // Growl\r
+            if (Init.GrowlQueue)\r
+                GrowlCommunicator.Notify("Queue Completed", "Put down that cocktail...\nyour Handbrake queue is done.");\r
+\r
+            // Do something whent he encode ends.\r
+            switch (Init.CompletionOption)\r
+            {\r
+                case "Shutdown":\r
+                    Process.Start("Shutdown", "-s -t 60");\r
+                    break;\r
+                case "Log Off":\r
+                    Win32.ExitWindowsEx(0, 0);\r
+                    break;\r
+                case "Suspend":\r
+                    Application.SetSuspendState(PowerState.Suspend, true, true);\r
+                    break;\r
+                case "Hibernate":\r
+                    Application.SetSuspendState(PowerState.Hibernate, true, true);\r
+                    break;\r
+                case "Lock System":\r
+                    Win32.LockWorkStation();\r
+                    break;\r
+                case "Quit HandBrake":\r
+                    Application.Exit();\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+        }\r
+\r
+        #endregion\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Services/Scan.cs b/win/C#/HandBrake.ApplicationServices/Services/Scan.cs
new file mode 100644 (file)
index 0000000..2a5188a
--- /dev/null
@@ -0,0 +1,334 @@
+/*  Scan.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.ApplicationServices.Services\r
+{\r
+    using System;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.Framework.Services;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+    using HandBrake.ApplicationServices.Functions;\r
+    using HandBrake.ApplicationServices.Parsing;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// Scan a Source\r
+    /// </summary>\r
+    public class ScanService : IScan\r
+    {\r
+        /* Private Variables */\r
+\r
+        /// <summary>\r
+        /// The Error Service\r
+        /// </summary>\r
+        private readonly IErrorService errorService;\r
+\r
+        /// <summary>\r
+        /// A Lock object\r
+        /// </summary>\r
+        private static readonly object locker = new object();\r
+\r
+        /// <summary>\r
+        /// The CLI data parser\r
+        /// </summary>\r
+        private Parser readData;\r
+\r
+        /// <summary>\r
+        /// The Log Buffer\r
+        /// </summary>\r
+        private StringBuilder logBuffer;\r
+\r
+        /// <summary>\r
+        /// The line number thats been read to in the log file\r
+        /// </summary>\r
+        private int logFilePosition;\r
+\r
+        /// <summary>\r
+        /// The Process belonging to the CLI\r
+        /// </summary>\r
+        private Process hbProc;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="ScanService"/> class.\r
+        /// </summary>\r
+        public ScanService()\r
+        {\r
+            this.errorService = new ErrorService();\r
+        }\r
+\r
+        /* Event Handlers */\r
+\r
+        /// <summary>\r
+        /// Scan has Started\r
+        /// </summary>\r
+        public event EventHandler ScanStared;\r
+\r
+        /// <summary>\r
+        /// Scan has completed\r
+        /// </summary>\r
+        public event EventHandler ScanCompleted;\r
+\r
+        /// <summary>\r
+        /// Scan process has changed to a new title\r
+        /// </summary>\r
+        public event EventHandler ScanStatusChanged;\r
+\r
+        /* Properties */\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether IsScanning.\r
+        /// </summary>\r
+        public bool IsScanning { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets the Scan Status.\r
+        /// </summary>\r
+        public string ScanStatus { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets the Souce Data.\r
+        /// </summary>\r
+        public DVD SouceData { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets ActivityLog.\r
+        /// </summary>\r
+        public string ActivityLog\r
+        {\r
+            get\r
+            {\r
+                if (IsScanning)\r
+                    return readData.Buffer.ToString();\r
+\r
+                if (logBuffer == null)\r
+                {\r
+                    ResetLogReader(false);\r
+                    ReadLastScanFile();  \r
+                }\r
+\r
+                return logBuffer != null ? logBuffer.ToString() : string.Empty;\r
+            }\r
+        }\r
+\r
+        /* Public Methods */\r
+\r
+        /// <summary>\r
+        /// Scan a Source Path.\r
+        /// Title 0: scan all\r
+        /// </summary>\r
+        /// <param name="sourcePath">Path to the file to scan</param>\r
+        /// <param name="title">int title number. 0 for scan all</param>\r
+        public void Scan(string sourcePath, int title)\r
+        {\r
+            Thread t = new Thread(unused => this.ScanSource(sourcePath, title));\r
+            t.Start();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Kill the scan\r
+        /// </summary>\r
+        public void Stop()\r
+        {\r
+            try\r
+            {\r
+                this.readData.OnScanProgress -= this.OnScanProgress;\r
+\r
+                if (hbProc != null && !hbProc.HasExited)\r
+                    hbProc.Kill();\r
+            }\r
+            catch (Exception ex)\r
+            {\r
+                errorService.ShowError("Unable to kill HandBrakeCLI.exe \n" +\r
+                "You may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically" + \r
+                " within the next few minutes. ", ex.ToString());\r
+            }\r
+        }\r
+\r
+        /* Private Methods */\r
+\r
+        /// <summary>\r
+        /// Start a scan for a given source path and title\r
+        /// </summary>\r
+        /// <param name="sourcePath">Path to the source file</param>\r
+        /// <param name="title">the title number to look at</param>\r
+        private void ScanSource(object sourcePath, int title)\r
+        {\r
+            try\r
+            {\r
+                IsScanning = true;\r
+                if (this.ScanStared != null)\r
+                    this.ScanStared(this, new EventArgs());\r
+\r
+                ResetLogReader(true);\r
+\r
+                string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +\r
+                                "\\HandBrake\\logs";\r
+                string dvdInfoPath = Path.Combine(logDir, string.Format("last_scan_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));\r
+\r
+                // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)\r
+                if (File.Exists(dvdInfoPath))\r
+                    File.Delete(dvdInfoPath);\r
+\r
+                string extraArguments = string.Empty;\r
+                if (Init.DisableDvdNav)\r
+                    extraArguments = " --no-dvdnav";\r
+\r
+                if (title > 0)\r
+                    extraArguments += " --scan ";\r
+\r
+                // Quick fix for "F:\\" style paths. Just get rid of the \\ so the CLI doesn't fall over.\r
+                // Sould probably clean up the escaping of the strings later.\r
+                if (sourcePath.ToString().EndsWith("\\"))\r
+                {\r
+                    sourcePath = sourcePath.ToString().Replace("\\", string.Empty);\r
+                }\r
+\r
+                string source = "\"" + sourcePath + "\"";\r
+                string command = String.Format(@" -i {0} -t{1} {2} -v ", source, title, extraArguments);\r
+\r
+                this.hbProc = new Process\r
+                                  {\r
+                                      StartInfo =\r
+                                          {\r
+                                              FileName = handbrakeCLIPath,\r
+                                              Arguments = command,\r
+                                              RedirectStandardOutput = true,\r
+                                              RedirectStandardError = true,\r
+                                              UseShellExecute = false,\r
+                                              CreateNoWindow = true\r
+                                          }\r
+                                  };\r
+\r
+                // Start the Scan\r
+                this.hbProc.Start();\r
+\r
+                this.readData = new Parser(this.hbProc.StandardError.BaseStream);\r
+                this.readData.OnScanProgress += this.OnScanProgress;\r
+                this.SouceData = DVD.Parse(this.readData);\r
+\r
+                // Write the Buffer out to file.\r
+                using (StreamWriter scanLog = new StreamWriter(dvdInfoPath))\r
+                {\r
+                    // Only write the log file to disk if it's less than 100MB.\r
+                    if (this.readData.Buffer.Length < 100000000)\r
+                    {\r
+                        scanLog.WriteLine(Logging.CreateCliLogHeader(null));\r
+                        scanLog.WriteLine("Query: " + command);\r
+                        scanLog.Write(this.readData.Buffer);\r
+\r
+                        logBuffer.AppendLine("Query: " + command);\r
+                        logBuffer.AppendLine(this.readData.Buffer.ToString());\r
+                    }\r
+                    else\r
+                    {\r
+                        throw new Exception(\r
+                            "The Log file has not been written to disk as it has grown above the 100MB limit. This indicates there was a problem during the scan process.");\r
+                    }\r
+                }\r
+\r
+                IsScanning = false;\r
+\r
+                if (this.ScanCompleted != null)\r
+                    this.ScanCompleted(this, new EventArgs()); \r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                this.Stop();\r
+\r
+                errorService.ShowError("An error has occured during the scan process.", exc.ToString());\r
+\r
+                if (this.ScanCompleted != null)\r
+                    this.ScanCompleted(this, new EventArgs());   \r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Read the log file\r
+        /// </summary>\r
+        private void ReadLastScanFile()\r
+        {\r
+            lock (locker)\r
+            {\r
+                // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),\r
+                // we'll need to make a copy of it.\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) +\r
+                                "\\HandBrake\\logs";\r
+                string logFile = Path.Combine(logDir, string.Format("last_scan_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));\r
+                string logFile2 = Path.Combine(logDir, string.Format("tmp_appReadable_log{0}.txt", Init.InstanceId == 0 ? string.Empty : Init.InstanceId.ToString()));\r
+\r
+                try\r
+                {\r
+                    // Make sure the application readable log file does not already exist. FileCopy fill fail if it does.\r
+                    if (File.Exists(logFile2))\r
+                        File.Delete(logFile2);\r
+\r
+                    // Copy the log file.\r
+                    if (File.Exists(logFile))\r
+                        File.Copy(logFile, logFile2, true);\r
+                    else\r
+                    {\r
+                        ResetLogReader(true);\r
+                        return;\r
+                    }\r
+\r
+                    // Start the Reader\r
+                    // Only use text which continues on from the last read line\r
+                    StreamReader sr = new StreamReader(logFile2);\r
+                    string line;\r
+                    int i = 1;\r
+                    while ((line = sr.ReadLine()) != null)\r
+                    {\r
+                        if (i > logFilePosition)\r
+                        {\r
+                            logBuffer.AppendLine(line);\r
+                            logFilePosition++;\r
+                        }\r
+                        i++;\r
+                    }\r
+                    sr.Close();\r
+                    sr.Dispose();\r
+                }\r
+                catch (Exception exc)\r
+                {\r
+                    Console.WriteLine(exc.ToString());\r
+                    ResetLogReader(true);\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Reset the Log Reader\r
+        /// </summary>\r
+        /// <param name="addHeader">\r
+        /// The add Header.\r
+        /// </param>\r
+        private void ResetLogReader(bool addHeader)\r
+        {\r
+            logFilePosition = 0;\r
+            logBuffer = new StringBuilder();\r
+            if (addHeader)\r
+                logBuffer.AppendLine(Logging.CreateCliLogHeader(null));\r
+        }\r
+\r
+        /// <summary>\r
+        /// Fire an event when the scan process progresses\r
+        /// </summary>\r
+        /// <param name="sender">the sender</param>\r
+        /// <param name="currentTitle">the current title being scanned</param>\r
+        /// <param name="titleCount">the total number of titles</param>\r
+        private void OnScanProgress(object sender, int currentTitle, int titleCount)\r
+        {\r
+            this.ScanStatus = string.Format("Processing Title: {0} of {1}", currentTitle, titleCount);\r
+            if (this.ScanStatusChanged != null)\r
+                this.ScanStatusChanged(this, new EventArgs());\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/Settings.StyleCop b/win/C#/HandBrake.ApplicationServices/Settings.StyleCop
new file mode 100644 (file)
index 0000000..e61afbf
--- /dev/null
@@ -0,0 +1,14 @@
+<StyleCopSettings Version="4.3">\r
+  <Analyzers>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.DocumentationRules">\r
+      <Rules>\r
+        <Rule Name="ElementsMustBeDocumented">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+  </Analyzers>\r
+</StyleCopSettings>
\ No newline at end of file
diff --git a/win/C#/HandBrake.ApplicationServices/app.config b/win/C#/HandBrake.ApplicationServices/app.config
new file mode 100644 (file)
index 0000000..4bb66af
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" ?>\r
+<configuration>\r
+    <configSections>\r
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >\r
+            <section name="HandBrake.ApplicationServices.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />\r
+        </sectionGroup>\r
+    </configSections>\r
+    <userSettings>\r
+        <HandBrake.ApplicationServices.Properties.Settings>\r
+            <setting name="disableDvdNav" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="saveLogWithVideo" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="saveLogPath" serializeAs="String">\r
+                <value />\r
+            </setting>\r
+            <setting name="saveLogToSpecifiedPath" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="growlQueue" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="CompletionOption" serializeAs="String">\r
+                <value />\r
+            </setting>\r
+            <setting name="processPriority" serializeAs="String">\r
+                <value />\r
+            </setting>\r
+            <setting name="showCliForInGuiEncodeStatus" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="growlEncode" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+            <setting name="preventSleep" serializeAs="String">\r
+                <value>False</value>\r
+            </setting>\r
+        </HandBrake.ApplicationServices.Properties.Settings>\r
+    </userSettings>\r
+</configuration>
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/HandBrake.Framework.csproj b/win/C#/HandBrake.Framework/HandBrake.Framework.csproj
new file mode 100644 (file)
index 0000000..8d806e5
--- /dev/null
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProductVersion>8.0.30703</ProductVersion>\r
+    <SchemaVersion>2.0</SchemaVersion>\r
+    <ProjectGuid>{49AD42C1-BF9B-4D78-A644-020878FAADE6}</ProjectGuid>\r
+    <OutputType>Library</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>HandBrake.Framework</RootNamespace>\r
+    <AssemblyName>HandBrake.Framework</AssemblyName>\r
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+    <FileUpgradeFlags>\r
+    </FileUpgradeFlags>\r
+    <OldToolsVersion>3.5</OldToolsVersion>\r
+    <UpgradeBackupLocation />\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'NightlyBuild|AnyCPU' ">\r
+    <OutputPath>bin\NightlyBuild\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <Optimize>true</Optimize>\r
+    <DebugType>pdbonly</DebugType>\r
+    <PlatformTarget>AnyCPU</PlatformTarget>\r
+    <ErrorReport>prompt</ErrorReport>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core" />\r
+    <Reference Include="System.Drawing" />\r
+    <Reference Include="System.Windows.Forms" />\r
+    <Reference Include="System.Xml.Linq" />\r
+    <Reference Include="System.Data.DataSetExtensions" />\r
+    <Reference Include="System.Data" />\r
+    <Reference Include="System.Xml" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="Services\AppcastReader.cs" />\r
+    <Compile Include="Model\UpdateCheckResult.cs" />\r
+    <Compile Include="Model\UpdateCheckInformation.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="Properties\Resources.Designer.cs">\r
+      <AutoGen>True</AutoGen>\r
+      <DesignTime>True</DesignTime>\r
+      <DependentUpon>Resources.resx</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="Services\ErrorService.cs" />\r
+    <Compile Include="Services\Interfaces\IAppcastReader.cs" />\r
+    <Compile Include="Services\Interfaces\IErrorService.cs" />\r
+    <Compile Include="Services\UpdateService.cs" />\r
+    <Compile Include="Views\ExceptionWindow.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="Views\ExceptionWindow.designer.cs">\r
+      <DependentUpon>ExceptionWindow.cs</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="Views\DownloadUpdate.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="Views\DownloadUpdate.Designer.cs">\r
+      <DependentUpon>DownloadUpdate.cs</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="Views\UpdateInfo.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="Views\UpdateInfo.Designer.cs">\r
+      <DependentUpon>UpdateInfo.cs</DependentUpon>\r
+    </Compile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <EmbeddedResource Include="Properties\Resources.resx">\r
+      <Generator>ResXFileCodeGenerator</Generator>\r
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r
+    </EmbeddedResource>\r
+    <EmbeddedResource Include="Views\ExceptionWindow.resx">\r
+      <DependentUpon>ExceptionWindow.cs</DependentUpon>\r
+    </EmbeddedResource>\r
+    <EmbeddedResource Include="Views\DownloadUpdate.resx">\r
+      <DependentUpon>DownloadUpdate.cs</DependentUpon>\r
+      <SubType>Designer</SubType>\r
+    </EmbeddedResource>\r
+    <EmbeddedResource Include="Views\UpdateInfo.resx">\r
+      <DependentUpon>UpdateInfo.cs</DependentUpon>\r
+      <SubType>Designer</SubType>\r
+    </EmbeddedResource>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Resources\copy.png" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Resources\errorx.png" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Resources\logo64.png" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="Resources\download.png" />\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />\r
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
+       Other similar extension points exist, see Microsoft.Common.targets.\r
+  <Target Name="BeforeBuild">\r
+  </Target>\r
+  <Target Name="AfterBuild">\r
+  </Target>\r
+  -->\r
+</Project>
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Model/UpdateCheckInformation.cs b/win/C#/HandBrake.Framework/Model/UpdateCheckInformation.cs
new file mode 100644 (file)
index 0000000..ff59dce
--- /dev/null
@@ -0,0 +1,39 @@
+/*  UpdateCheckInformation.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Model\r
+{\r
+    using System;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// Provides information about an update check.\r
+    /// </summary>\r
+    public struct UpdateCheckInformation\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets a value indicating whether a New Version is Available.\r
+        /// </summary>\r
+        public bool NewVersionAvailable { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether an Error Occured.\r
+        /// </summary>\r
+        public bool ErrorOccured\r
+        {\r
+            get { return this.Error != null; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets or sets information about the new build, if any. This will be null if there is no new verison.\r
+        /// </summary>\r
+        public IAppcastReader BuildInformation { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the error that occurred, if any. This will be null if no error occured.\r
+        /// </summary>\r
+        public Exception Error { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Model/UpdateCheckResult.cs b/win/C#/HandBrake.Framework/Model/UpdateCheckResult.cs
new file mode 100644 (file)
index 0000000..ba04100
--- /dev/null
@@ -0,0 +1,71 @@
+/*  UpdateCheckResult.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Model\r
+{\r
+    using System;\r
+    using System.Threading;\r
+\r
+    /// <summary>\r
+    /// Used in EndUpdateCheck() for update checking and the IAsyncResult design pattern.\r
+    /// </summary>\r
+    public class UpdateCheckResult : IAsyncResult\r
+    {\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="HandBrake.Framework.Model.UpdateCheckResult"/> class.\r
+        /// </summary>\r
+        /// <param name="asyncState">\r
+        /// The async state.\r
+        /// </param>\r
+        /// <param name="info">\r
+        /// The info.\r
+        /// </param>\r
+        public UpdateCheckResult(object asyncState, UpdateCheckInformation info)\r
+        {\r
+            this.AsyncState = asyncState;\r
+            this.Result = info;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets whether the check was executed in debug mode.\r
+        /// </summary>\r
+        public object AsyncState { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets the result of the update check.\r
+        /// </summary>\r
+        public UpdateCheckInformation Result { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets AsyncWaitHandle.\r
+        /// </summary>\r
+        /// <exception cref="NotImplementedException">\r
+        /// </exception>\r
+        public WaitHandle AsyncWaitHandle\r
+        {\r
+            get { throw new NotImplementedException(); }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether CompletedSynchronously.\r
+        /// </summary>\r
+        /// <exception cref="NotImplementedException">\r
+        /// </exception>\r
+        public bool CompletedSynchronously\r
+        {\r
+            get { throw new NotImplementedException(); }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether IsCompleted.\r
+        /// </summary>\r
+        /// <exception cref="NotImplementedException">\r
+        /// </exception>\r
+        public bool IsCompleted\r
+        {\r
+            get { throw new NotImplementedException(); }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Properties/AssemblyInfo.cs b/win/C#/HandBrake.Framework/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..d6b958c
--- /dev/null
@@ -0,0 +1,36 @@
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("HandBrake.Framework")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("HandBrake Team")]\r
+[assembly: AssemblyProduct("HandBrake.Framework")]\r
+[assembly: AssemblyCopyright("Copyright Â© HandBrake Team")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Setting ComVisible to false makes the types in this assembly not visible \r
+// to COM components.  If you need to access a type in this assembly from \r
+// COM, set the ComVisible attribute to true on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The following GUID is for the ID of the typelib if this project is exposed to COM\r
+[assembly: Guid("85248e69-53e0-4a37-a1a6-95c2e99fc750")]\r
+\r
+// Version information for an assembly consists of the following four values:\r
+//\r
+//      Major Version\r
+//      Minor Version \r
+//      Build Number\r
+//      Revision\r
+//\r
+// You can specify all the values or you can default the Build and Revision Numbers \r
+// by using the '*' as shown below:\r
+// [assembly: AssemblyVersion("1.0.*")]\r
+[assembly: AssemblyVersion("0.9.5.0")]\r
+[assembly: AssemblyFileVersion("0.9.5.0")]\r
diff --git a/win/C#/HandBrake.Framework/Properties/Resources.Designer.cs b/win/C#/HandBrake.Framework/Properties/Resources.Designer.cs
new file mode 100644 (file)
index 0000000..5d5e113
--- /dev/null
@@ -0,0 +1,91 @@
+//------------------------------------------------------------------------------\r
+// <auto-generated>\r
+//     This code was generated by a tool.\r
+//     Runtime Version:4.0.30319.1\r
+//\r
+//     Changes to this file may cause incorrect behavior and will be lost if\r
+//     the code is regenerated.\r
+// </auto-generated>\r
+//------------------------------------------------------------------------------\r
+\r
+namespace HandBrake.Framework.Properties {\r
+    using System;\r
+    \r
+    \r
+    /// <summary>\r
+    ///   A strongly-typed resource class, for looking up localized strings, etc.\r
+    /// </summary>\r
+    // This class was auto-generated by the StronglyTypedResourceBuilder\r
+    // class via a tool like ResGen or Visual Studio.\r
+    // To add or remove a member, edit your .ResX file then rerun ResGen\r
+    // with the /str option, or rebuild your VS project.\r
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]\r
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
+    internal class Resources {\r
+        \r
+        private static global::System.Resources.ResourceManager resourceMan;\r
+        \r
+        private static global::System.Globalization.CultureInfo resourceCulture;\r
+        \r
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]\r
+        internal Resources() {\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Returns the cached ResourceManager instance used by this class.\r
+        /// </summary>\r
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
+        internal static global::System.Resources.ResourceManager ResourceManager {\r
+            get {\r
+                if (object.ReferenceEquals(resourceMan, null)) {\r
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HandBrake.Framework.Properties.Resources", typeof(Resources).Assembly);\r
+                    resourceMan = temp;\r
+                }\r
+                return resourceMan;\r
+            }\r
+        }\r
+        \r
+        /// <summary>\r
+        ///   Overrides the current thread's CurrentUICulture property for all\r
+        ///   resource lookups using this strongly typed resource class.\r
+        /// </summary>\r
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\r
+        internal static global::System.Globalization.CultureInfo Culture {\r
+            get {\r
+                return resourceCulture;\r
+            }\r
+            set {\r
+                resourceCulture = value;\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap copy {\r
+            get {\r
+                object obj = ResourceManager.GetObject("copy", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap download {\r
+            get {\r
+                object obj = ResourceManager.GetObject("download", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap ErrorX {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ErrorX", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap logo64 {\r
+            get {\r
+                object obj = ResourceManager.GetObject("logo64", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Properties/Resources.resx b/win/C#/HandBrake.Framework/Properties/Resources.resx
new file mode 100644 (file)
index 0000000..40e6440
--- /dev/null
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="copy" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\copy.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ErrorX" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\errorx.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="logo64" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\logo64.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="download" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Resources/copy.png b/win/C#/HandBrake.Framework/Resources/copy.png
new file mode 100644 (file)
index 0000000..c11c6a7
Binary files /dev/null and b/win/C#/HandBrake.Framework/Resources/copy.png differ
diff --git a/win/C#/HandBrake.Framework/Resources/download.png b/win/C#/HandBrake.Framework/Resources/download.png
new file mode 100644 (file)
index 0000000..c320662
Binary files /dev/null and b/win/C#/HandBrake.Framework/Resources/download.png differ
diff --git a/win/C#/HandBrake.Framework/Resources/errorx.png b/win/C#/HandBrake.Framework/Resources/errorx.png
new file mode 100644 (file)
index 0000000..75c63c0
Binary files /dev/null and b/win/C#/HandBrake.Framework/Resources/errorx.png differ
diff --git a/win/C#/HandBrake.Framework/Resources/logo64.png b/win/C#/HandBrake.Framework/Resources/logo64.png
new file mode 100644 (file)
index 0000000..12808f6
Binary files /dev/null and b/win/C#/HandBrake.Framework/Resources/logo64.png differ
diff --git a/win/C#/HandBrake.Framework/Services/AppcastReader.cs b/win/C#/HandBrake.Framework/Services/AppcastReader.cs
new file mode 100644 (file)
index 0000000..31bd853
--- /dev/null
@@ -0,0 +1,121 @@
+/*  AppcastReader.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Services\r
+{\r
+    using System;\r
+    using System.IO;\r
+    using System.Text.RegularExpressions;\r
+    using System.Xml;\r
+\r
+    using HandBrake.Framework.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// Appcast Reader - Used for parsing HandBrakes update file\r
+    /// </summary>\r
+    public class AppcastReader : IAppcastReader\r
+    {\r
+        /// <summary>\r
+        /// Gets Information about an update to HandBrake\r
+        /// </summary>\r
+        public Uri DescriptionUrl { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets HandBrake's version from the appcast.xml file.\r
+        /// </summary>\r
+        public string Version { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets HandBrake's Build from the appcast.xml file.\r
+        /// </summary>\r
+        public string Build { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Gets the URL for update file.\r
+        /// </summary>\r
+        public string DownloadFile { get; private set; }\r
+\r
+        /// <summary>\r
+        /// Get the build information from the required appcasts. Run before accessing the public vars.\r
+        /// </summary>\r
+        /// <param name="input">\r
+        /// The input.\r
+        /// </param>\r
+        public void GetUpdateInfo(string input)\r
+        {\r
+            try\r
+            {\r
+                // Get the correct Appcast and set input.\r
+                XmlNode nodeItem = ReadRss(new XmlTextReader(new StringReader(input)));\r
+                string result = nodeItem.InnerXml;\r
+\r
+                // Regular Expressions\r
+                Match ver = Regex.Match(result, @"sparkle:version=""([0-9]*)\""");\r
+                Match verShort = Regex.Match(result, @"sparkle:shortVersionString=""(([svn]*)([0-9.\s]*))\""");\r
+\r
+                this.Build = ver.ToString().Replace("sparkle:version=", string.Empty).Replace("\"", string.Empty);\r
+                this.Version = verShort.ToString().Replace("sparkle:shortVersionString=", string.Empty).Replace(\r
+                    "\"", string.Empty);\r
+                this.DownloadFile = nodeItem["windows"].InnerText;\r
+                this.DescriptionUrl = new Uri(nodeItem["sparkle:releaseNotesLink"].InnerText);\r
+            }\r
+            catch (Exception)\r
+            {\r
+                return;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Read the RSS file.\r
+        /// </summary>\r
+        /// <param name="rssReader">\r
+        /// The RSS reader\r
+        /// </param>\r
+        /// <returns>\r
+        /// The read rss.\r
+        /// </returns>\r
+        private static XmlNode ReadRss(XmlReader rssReader)\r
+        {\r
+            XmlNode nodeItem = null;\r
+            XmlNode nodeChannel = null;\r
+            XmlNode nodeRss = null;\r
+\r
+            XmlDocument rssDoc = new XmlDocument();\r
+            rssDoc.Load(rssReader);\r
+\r
+            foreach (XmlNode t in rssDoc.ChildNodes)\r
+            {\r
+                if (t.Name == "rss")\r
+                {\r
+                    nodeRss = t;\r
+                }\r
+            }\r
+\r
+            if (nodeRss != null)\r
+            {\r
+                foreach (XmlNode t in nodeRss.ChildNodes)\r
+                {\r
+                    if (t.Name == "channel")\r
+                    {\r
+                        nodeChannel = t;\r
+                    }\r
+                }\r
+            }\r
+\r
+            if (nodeChannel != null)\r
+            {\r
+                foreach (XmlNode t in nodeChannel.ChildNodes)\r
+                {\r
+                    if (t.Name == "item")\r
+                    {\r
+                        nodeItem = t;\r
+                    }\r
+                }\r
+            }\r
+\r
+            return nodeItem;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Services/ErrorService.cs b/win/C#/HandBrake.Framework/Services/ErrorService.cs
new file mode 100644 (file)
index 0000000..3858f16
--- /dev/null
@@ -0,0 +1,109 @@
+/*  ErrorService.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Services\r
+{\r
+    using System;\r
+    using System.IO;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.Framework.Services.Interfaces;\r
+    using HandBrake.Framework.Views;\r
+\r
+    /// <summary>\r
+    /// The Error Service\r
+    /// </summary>\r
+    public class ErrorService : IErrorService\r
+    {\r
+        private int exceptionCount;\r
+\r
+        /// <summary>\r
+        /// Show an Error Window\r
+        /// </summary>\r
+        /// <param name="shortError">\r
+        /// The short error message for the user to read\r
+        /// </param>\r
+        /// <param name="longError">\r
+        /// Exception string or advanced details\r
+        /// </param>\r
+        public void ShowError(string shortError, string longError)\r
+        {\r
+            exceptionCount++;\r
+\r
+            try\r
+            {\r
+                Thread newThread = new Thread(new ParameterizedThreadStart(this.LogError));\r
+                newThread.Start(shortError + Environment.NewLine + longError);\r
+            }\r
+            catch (Exception)\r
+            {\r
+                // Do Nothing\r
+            }\r
+\r
+            if (exceptionCount > 30)\r
+            {\r
+                // If we are getting a large number of exceptions, just die out. We don't want to fill the users drive with a ton \r
+                // of exception files.\r
+                return;\r
+            }\r
+\r
+            ExceptionWindow window = new ExceptionWindow();\r
+            window.Setup(shortError, longError);\r
+\r
+            // This seems far from ideal so maybe have a think about a better way of doing this.\r
+            // This method can be called from UI and worker threads, so the ExcWindow needs to be called on the UI thread or on it's on UI thread.\r
+            Application.Run(window); \r
+        }\r
+\r
+        /// <summary>\r
+        /// Show a Notice or Warning Message.\r
+        /// </summary>\r
+        /// <param name="notice">\r
+        /// The text to display to the user\r
+        /// </param>\r
+        /// <param name="isWarning">\r
+        /// Is a warning window, show the warning icon instead of the notice\r
+        /// </param>\r
+        public void ShowNotice(string notice, bool isWarning)\r
+        {\r
+            throw new NotImplementedException();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Write Exceptions out to log files\r
+        /// </summary>\r
+        /// <param name="state">\r
+        /// The state.\r
+        /// </param>\r
+        public void LogError(object state)\r
+        {\r
+            try\r
+            {\r
+                if (exceptionCount > 30)\r
+                {\r
+                    // If we are getting a large number of exceptions, just die out. We don't want to fill the users drive with a ton \r
+                    // of exception files.\r
+                    return;\r
+                }\r
+\r
+                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
+                string file = Path.Combine(logDir, string.Format("Exception_{0}.txt", DateTime.Now.Ticks));\r
+\r
+                if (!File.Exists(file))\r
+                {\r
+                    using (StreamWriter streamWriter = new StreamWriter(file))\r
+                    {\r
+                        streamWriter.WriteLine(state.ToString());\r
+                    }\r
+                }\r
+            }\r
+            catch\r
+            {\r
+                return; // Game over. Stop digging.\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Services/Interfaces/IAppcastReader.cs b/win/C#/HandBrake.Framework/Services/Interfaces/IAppcastReader.cs
new file mode 100644 (file)
index 0000000..7064a08
--- /dev/null
@@ -0,0 +1,35 @@
+namespace HandBrake.Framework.Services.Interfaces\r
+{\r
+    using System;\r
+\r
+    public interface IAppcastReader\r
+    {\r
+        /// <summary>\r
+        /// Gets Information about an update to HandBrake\r
+        /// </summary>\r
+        Uri DescriptionUrl { get; }\r
+\r
+        /// <summary>\r
+        /// Gets HandBrake's version from the appcast.xml file.\r
+        /// </summary>\r
+        string Version { get; }\r
+\r
+        /// <summary>\r
+        /// Gets HandBrake's Build from the appcast.xml file.\r
+        /// </summary>\r
+        string Build { get; }\r
+\r
+        /// <summary>\r
+        /// Gets the URL for update file.\r
+        /// </summary>\r
+        string DownloadFile { get; }\r
+\r
+        /// <summary>\r
+        /// Get the build information from the required appcasts. Run before accessing the public vars.\r
+        /// </summary>\r
+        /// <param name="input">\r
+        /// The input.\r
+        /// </param>\r
+        void GetUpdateInfo(string input);\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Services/Interfaces/IErrorService.cs b/win/C#/HandBrake.Framework/Services/Interfaces/IErrorService.cs
new file mode 100644 (file)
index 0000000..9eceead
--- /dev/null
@@ -0,0 +1,41 @@
+/*  IErrorService.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Services.Interfaces\r
+{\r
+    /// <summary>\r
+    /// The Error service for showing the exception window.\r
+    /// </summary>\r
+    public interface IErrorService\r
+    {\r
+        /// <summary>\r
+        /// Show an Error Window\r
+        /// </summary>\r
+        /// <param name="shortError">\r
+        /// The short error message for the user to read\r
+        /// </param>\r
+        /// <param name="longError">\r
+        /// Exception string or advanced details\r
+        /// </param>\r
+        void ShowError(string shortError, string longError);\r
+\r
+        /// <summary>\r
+        /// Show a Notice or Warning Message.\r
+        /// </summary>\r
+        /// <param name="notice">\r
+        /// The text to display to the user\r
+        /// </param>\r
+        /// <param name="isWarning">\r
+        /// Is a warning window, show the warning icon instead of the notice\r
+        /// </param>\r
+        void ShowNotice(string notice, bool isWarning);\r
+\r
+        /// <summary>\r
+        /// Log the error\r
+        /// </summary>\r
+        /// <param name="state">The error message</param>\r
+        void LogError(object state);\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Services/UpdateService.cs b/win/C#/HandBrake.Framework/Services/UpdateService.cs
new file mode 100644 (file)
index 0000000..0bbd781
--- /dev/null
@@ -0,0 +1,101 @@
+/*  UpdateService.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Services\r
+{\r
+    using System;\r
+    using System.IO;\r
+    using System.Net;\r
+    using System.Threading;\r
+\r
+    using HandBrake.Framework.Model;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+\r
+    public class UpdateService\r
+    {\r
+        /// <summary>\r
+        /// Begins checking for an update to HandBrake.\r
+        /// </summary>\r
+        /// <param name="callback">\r
+        /// The method that will be called when the check is finished.\r
+        /// </param>\r
+        /// <param name="debug">\r
+        /// Whether or not to execute this in debug mode.\r
+        /// </param>\r
+        /// <param name="url">\r
+        /// The url.\r
+        /// </param>\r
+        /// <param name="currentBuild">\r
+        /// The current Build.\r
+        /// </param>\r
+        /// <param name="skipBuild">\r
+        /// The skip Build.\r
+        /// </param>\r
+        /// <param name="currentVersion">\r
+        /// The current Version.\r
+        /// </param>\r
+        public static void BeginCheckForUpdates(AsyncCallback callback, bool debug, string url, int currentBuild, int skipBuild, string currentVersion)\r
+        {\r
+            ThreadPool.QueueUserWorkItem(new WaitCallback(delegate\r
+            {\r
+                try\r
+                {\r
+                    // Initialize variables\r
+                    WebRequest request = WebRequest.Create(url);\r
+                    WebResponse response = request.GetResponse();\r
+                    IAppcastReader reader = new AppcastReader();\r
+\r
+                    // Get the data, convert it to a string, and parse it into the AppcastReader\r
+                    reader.GetUpdateInfo(new StreamReader(response.GetResponseStream()).ReadToEnd());\r
+\r
+                    // Further parse the information\r
+                    string build = reader.Build;\r
+\r
+                    int latest = int.Parse(build);\r
+                    int current = currentBuild;\r
+                    int skip = skipBuild;\r
+\r
+                    // If the user wanted to skip this version, don't report the update\r
+                    if (latest == skip)\r
+                    {\r
+                        UpdateCheckInformation info =\r
+                            new UpdateCheckInformation\r
+                            {\r
+                                NewVersionAvailable = false,\r
+                                BuildInformation = null\r
+                            };\r
+                        callback(new UpdateCheckResult(debug, info));\r
+                        return;\r
+                    }\r
+\r
+                    UpdateCheckInformation info2 = new UpdateCheckInformation\r
+                        {\r
+                            NewVersionAvailable = latest > current,\r
+                            BuildInformation = reader\r
+                        };\r
+                    callback(new UpdateCheckResult(debug, info2));\r
+                }\r
+                catch (Exception exc)\r
+                {\r
+                    callback(new UpdateCheckResult(debug, new UpdateCheckInformation { Error = exc }));\r
+                }\r
+            }));\r
+        }\r
+\r
+        /// <summary>\r
+        /// End Check for Updates\r
+        /// </summary>\r
+        /// <param name="result">\r
+        /// The result.\r
+        /// </param>\r
+        /// <returns>\r
+        /// Update Check information\r
+        /// </returns>\r
+        public static UpdateCheckInformation EndCheckForUpdates(IAsyncResult result)\r
+        {\r
+            return ((UpdateCheckResult)result).Result;\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Settings.StyleCop b/win/C#/HandBrake.Framework/Settings.StyleCop
new file mode 100644 (file)
index 0000000..7f55ce6
--- /dev/null
@@ -0,0 +1 @@
+<StyleCopSettings Version="4.3" />
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/DownloadUpdate.Designer.cs b/win/C#/HandBrake.Framework/Views/DownloadUpdate.Designer.cs
new file mode 100644 (file)
index 0000000..3159034
--- /dev/null
@@ -0,0 +1,111 @@
+/*  frmDownload.Designer.cs \r
+       \r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Views\r
+{\r
+    partial class DownloadUpdate\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DownloadUpdate));\r
+            this.lblProgress = new System.Windows.Forms.Label();\r
+            this.progress_download = new System.Windows.Forms.ProgressBar();\r
+            this.btn_cancel = new System.Windows.Forms.Button();\r
+            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+            this.PictureBox1 = new System.Windows.Forms.PictureBox();\r
+            this.tableLayoutPanel1.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();\r
+            this.SuspendLayout();\r
+            // \r
+            // lblProgress\r
+            // \r
+            resources.ApplyResources(this.lblProgress, "lblProgress");\r
+            this.lblProgress.Name = "lblProgress";\r
+            // \r
+            // progress_download\r
+            // \r
+            resources.ApplyResources(this.progress_download, "progress_download");\r
+            this.progress_download.Name = "progress_download";\r
+            this.progress_download.Style = System.Windows.Forms.ProgressBarStyle.Continuous;\r
+            // \r
+            // btn_cancel\r
+            // \r
+            resources.ApplyResources(this.btn_cancel, "btn_cancel");\r
+            this.btn_cancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_cancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_cancel.Name = "btn_cancel";\r
+            this.btn_cancel.TabStop = false;\r
+            this.btn_cancel.UseVisualStyleBackColor = true;\r
+            this.btn_cancel.Click += new System.EventHandler(this.BtnCancelClick);\r
+            // \r
+            // tableLayoutPanel1\r
+            // \r
+            resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");\r
+            this.tableLayoutPanel1.Controls.Add(this.PictureBox1, 0, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.btn_cancel, 1, 2);\r
+            this.tableLayoutPanel1.Controls.Add(this.progress_download, 1, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.lblProgress, 1, 1);\r
+            this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
+            // \r
+            // PictureBox1\r
+            // \r
+            this.PictureBox1.Image = global::HandBrake.Framework.Properties.Resources.download;\r
+            resources.ApplyResources(this.PictureBox1, "PictureBox1");\r
+            this.PictureBox1.Name = "PictureBox1";\r
+            this.tableLayoutPanel1.SetRowSpan(this.PictureBox1, 3);\r
+            this.PictureBox1.TabStop = false;\r
+            // \r
+            // DownloadUpdate\r
+            // \r
+            resources.ApplyResources(this, "$this");\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.Controls.Add(this.tableLayoutPanel1);\r
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r
+            this.MaximizeBox = false;\r
+            this.MinimizeBox = false;\r
+            this.Name = "DownloadUpdate";\r
+            this.ShowIcon = false;\r
+            this.ShowInTaskbar = false;\r
+            this.tableLayoutPanel1.ResumeLayout(false);\r
+            this.tableLayoutPanel1.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Label lblProgress;\r
+        private System.Windows.Forms.ProgressBar progress_download;\r
+        internal System.Windows.Forms.Button btn_cancel;\r
+        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+        internal System.Windows.Forms.PictureBox PictureBox1;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/DownloadUpdate.cs b/win/C#/HandBrake.Framework/Views/DownloadUpdate.cs
new file mode 100644 (file)
index 0000000..3b12a64
--- /dev/null
@@ -0,0 +1,122 @@
+/*  DownloadUpdate.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Views\r
+{\r
+    using System;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Net;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// The Download Window\r
+    /// </summary>\r
+    public partial class DownloadUpdate : Form\r
+    {\r
+        private readonly Thread downloadThread;\r
+        private Stream responceStream;\r
+        private Stream localStream;\r
+        private HttpWebRequest webRequest;\r
+        private HttpWebResponse webResponse;\r
+        private static int progress;\r
+        private bool killThread;\r
+\r
+        private delegate void UpdateProgessCallback(long bytesRead, long totalBytes);\r
+\r
+        private delegate void DownloadCompleteCallback();\r
+\r
+        private delegate void DownloadFailedCallback();\r
+\r
+        public DownloadUpdate(string filename)\r
+        {\r
+            InitializeComponent();\r
+\r
+            this.downloadThread = new Thread(Download);\r
+            this.downloadThread.Start(filename);\r
+        }\r
+\r
+        private void Download(object file)\r
+        {\r
+            string tempPath = Path.Combine(Path.GetTempPath(), "handbrake-setup.exe");\r
+            string hbUpdate = (string)file;\r
+            WebClient wcDownload = new WebClient();\r
+\r
+            try\r
+            {\r
+                if (File.Exists(tempPath))\r
+                    File.Delete(tempPath);\r
+\r
+                this.webRequest = (HttpWebRequest)WebRequest.Create(hbUpdate);\r
+                this.webRequest.Credentials = CredentialCache.DefaultCredentials;\r
+                this.webResponse = (HttpWebResponse)this.webRequest.GetResponse();\r
+                long fileSize = this.webResponse.ContentLength;\r
+\r
+                this.responceStream = wcDownload.OpenRead(hbUpdate);\r
+                this.localStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.None);\r
+\r
+                int bytesSize;\r
+                byte[] downBuffer = new byte[2048];\r
+\r
+                long flength = 0;\r
+                while ((bytesSize = this.responceStream.Read(downBuffer, 0, downBuffer.Length)) > 0)\r
+                {\r
+                    if (this.killThread)\r
+                        return;\r
+                    this.localStream.Write(downBuffer, 0, bytesSize);\r
+                    flength = this.localStream.Length;\r
+                    Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] {this.localStream.Length, fileSize});\r
+                }\r
+\r
+                this.responceStream.Close();\r
+                this.localStream.Close();\r
+\r
+                if (flength != fileSize)\r
+                    Invoke(new DownloadFailedCallback(this.DownloadFailed));\r
+                else\r
+                    Invoke(new DownloadCompleteCallback(this.DownloadComplete));\r
+            }\r
+            catch\r
+            {\r
+                lblProgress.Text = "An Error Occured. Please try again later.";\r
+            }\r
+        }\r
+\r
+        private void UpdateProgress(long bytesRead, long totalBytes)\r
+        {\r
+            long p = (bytesRead * 100) / totalBytes;\r
+            int.TryParse(p.ToString(), out progress);\r
+            progress_download.Value = progress;\r
+            lblProgress.Text = (bytesRead / 1024) + "k of " + (totalBytes / 1024) + "k ";\r
+        }\r
+\r
+        private void DownloadComplete()\r
+        {\r
+            lblProgress.Text = "Download Complete";\r
+            btn_cancel.Text = "Close";\r
+\r
+            Process.Start(Path.Combine(Path.GetTempPath(), "handbrake-setup.exe"));\r
+            this.Close();\r
+            Application.Exit();\r
+        }\r
+\r
+        private void DownloadFailed()\r
+        {\r
+            lblProgress.Text = "Download Failed";\r
+            btn_cancel.Text = "Close";\r
+        }\r
+\r
+        private void BtnCancelClick(object sender, EventArgs e)\r
+        {\r
+            this.killThread = true;\r
+            lblProgress.Text = "Cancelling ...";\r
+            if (this.webResponse != null) this.webResponse.Close();\r
+            if (this.responceStream != null) this.responceStream.Close();\r
+            if (this.localStream != null) this.localStream.Close();\r
+            this.Close();\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/DownloadUpdate.resx b/win/C#/HandBrake.Framework/Views/DownloadUpdate.resx
new file mode 100644 (file)
index 0000000..db07d3c
--- /dev/null
@@ -0,0 +1,670 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="lblProgress.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="lblProgress.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>73, 29</value>\r
+  </data>\r
+  <data name="lblProgress.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>98, 13</value>\r
+  </data>\r
+  <data name="lblProgress.TabIndex" type="System.Int32, mscorlib">\r
+    <value>10</value>\r
+  </data>\r
+  <data name="lblProgress.Text" xml:space="preserve">\r
+    <value>Awaiting Download</value>\r
+  </data>\r
+  <data name="&gt;&gt;lblProgress.Name" xml:space="preserve">\r
+    <value>lblProgress</value>\r
+  </data>\r
+  <data name="&gt;&gt;lblProgress.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;lblProgress.Parent" xml:space="preserve">\r
+    <value>tableLayoutPanel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;lblProgress.ZOrder" xml:space="preserve">\r
+    <value>3</value>\r
+  </data>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="progress_download.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
+    <value>Left, Right</value>\r
+  </data>\r
+  <data name="progress_download.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>73, 3</value>\r
+  </data>\r
+  <data name="progress_download.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>277, 23</value>\r
+  </data>\r
+  <data name="progress_download.TabIndex" type="System.Int32, mscorlib">\r
+    <value>9</value>\r
+  </data>\r
+  <data name="&gt;&gt;progress_download.Name" xml:space="preserve">\r
+    <value>progress_download</value>\r
+  </data>\r
+  <data name="&gt;&gt;progress_download.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ProgressBar, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;progress_download.Parent" xml:space="preserve">\r
+    <value>tableLayoutPanel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;progress_download.ZOrder" xml:space="preserve">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="btn_cancel.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">\r
+    <value>Right</value>\r
+  </data>\r
+  <data name="btn_cancel.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_cancel.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>279, 46</value>\r
+  </data>\r
+  <data name="btn_cancel.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>71, 22</value>\r
+  </data>\r
+  <data name="btn_cancel.TabIndex" type="System.Int32, mscorlib">\r
+    <value>26</value>\r
+  </data>\r
+  <data name="btn_cancel.Text" xml:space="preserve">\r
+    <value>Cancel</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_cancel.Name" xml:space="preserve">\r
+    <value>btn_cancel</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_cancel.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_cancel.Parent" xml:space="preserve">\r
+    <value>tableLayoutPanel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_cancel.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">\r
+    <value />\r
+  </data>\r
+  <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>3, 3</value>\r
+  </data>\r
+  <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>64, 64</value>\r
+  </data>\r
+  <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>25</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">\r
+    <value>PictureBox1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">\r
+    <value>tableLayoutPanel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Fill</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>9, 9</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">\r
+    <value>3</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>353, 73</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>27</value>\r
+  </data>\r
+  <data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">\r
+    <value>tableLayoutPanel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">\r
+    <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="PictureBox1" Row="0" RowSpan="3" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="btn_cancel" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="progress_download" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="lblProgress" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>\r
+  </data>\r
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">\r
+    <value>6, 13</value>\r
+  </data>\r
+  <data name="$this.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">\r
+    <value>371, 91</value>\r
+  </data>\r
+  <data name="$this.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 8.25pt</value>\r
+  </data>\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+  <data name="$this.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
+    <value>9, 9, 9, 9</value>\r
+  </data>\r
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">\r
+    <value>CenterScreen</value>\r
+  </data>\r
+  <data name="$this.Text" xml:space="preserve">\r
+    <value>Downloading Update</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
+    <value>DownloadUpdate</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/ExceptionWindow.cs b/win/C#/HandBrake.Framework/Views/ExceptionWindow.cs
new file mode 100644 (file)
index 0000000..25dc6fd
--- /dev/null
@@ -0,0 +1,81 @@
+/*  ExceptionWindow.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Views\r
+{\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// A window to display Exceptions in a form which can be easily copied and reported by users.\r
+    /// </summary>\r
+    public partial class ExceptionWindow : Form\r
+    {\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="ExceptionWindow"/> class.\r
+        /// </summary>\r
+        public ExceptionWindow()\r
+        {\r
+            InitializeComponent();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Setup the window with the error message.\r
+        /// </summary>\r
+        /// <param name="shortError">\r
+        /// The short error.\r
+        /// </param>\r
+        /// <param name="longError">\r
+        /// The long error.\r
+        /// </param>\r
+        public void Setup(string shortError, string longError)\r
+        {\r
+            lbl_shortError.Text = shortError;\r
+            rtf_exceptionFull.Text = shortError + Environment.NewLine + longError;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Copy the Exception Information to the Clipboard.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnCopyClick(object sender, EventArgs e)\r
+        {\r
+            Clipboard.SetDataObject(rtf_exceptionFull.SelectedText != string.Empty ? rtf_exceptionFull.SelectedText : rtf_exceptionFull.Text, true);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Copy from the right click menu\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuCopyLogClick(object sender, EventArgs e)\r
+        {\r
+            Clipboard.SetDataObject(rtf_exceptionFull.SelectedText != string.Empty ? rtf_exceptionFull.SelectedText : rtf_exceptionFull.Text, true);\r
+        } \r
+\r
+        /// <summary>\r
+        /// Close the window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnCloseClick(object sender, EventArgs e)\r
+        {\r
+            this.Close();\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/HandBrake.Framework/Views/ExceptionWindow.designer.cs b/win/C#/HandBrake.Framework/Views/ExceptionWindow.designer.cs
new file mode 100644 (file)
index 0000000..f8df557
--- /dev/null
@@ -0,0 +1,187 @@
+namespace HandBrake.Framework.Views\r
+{\r
+    partial class ExceptionWindow\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ExceptionWindow));\r
+            this.panel1 = new System.Windows.Forms.Panel();\r
+            this.panel2 = new System.Windows.Forms.Panel();\r
+            this.PictureBox1 = new System.Windows.Forms.PictureBox();\r
+            this.label3 = new System.Windows.Forms.Label();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.lbl_shortError = new System.Windows.Forms.Label();\r
+            this.panel3 = new System.Windows.Forms.Panel();\r
+            this.panel5 = new System.Windows.Forms.Panel();\r
+            this.panel4 = new System.Windows.Forms.Panel();\r
+            this.panel6 = new System.Windows.Forms.Panel();\r
+            this.btn_close = new System.Windows.Forms.Button();\r
+            this.btn_copy = new System.Windows.Forms.Button();\r
+            this.rtf_exceptionFull = new System.Windows.Forms.RichTextBox();\r
+            this.mnu_copy_log = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.panel1.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();\r
+            this.panel4.SuspendLayout();\r
+            this.panel6.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // panel1\r
+            // \r
+            this.panel1.BackColor = System.Drawing.Color.White;\r
+            this.panel1.Controls.Add(this.panel2);\r
+            this.panel1.Controls.Add(this.PictureBox1);\r
+            this.panel1.Controls.Add(this.label3);\r
+            this.panel1.Controls.Add(this.label1);\r
+            this.panel1.Controls.Add(this.lbl_shortError);\r
+            resources.ApplyResources(this.panel1, "panel1");\r
+            this.panel1.Name = "panel1";\r
+            // \r
+            // panel2\r
+            // \r
+            this.panel2.BackColor = System.Drawing.SystemColors.Control;\r
+            resources.ApplyResources(this.panel2, "panel2");\r
+            this.panel2.MaximumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.MinimumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.Name = "panel2";\r
+            // \r
+            // PictureBox1\r
+            // \r
+            this.PictureBox1.Image = global::HandBrake.Framework.Properties.Resources.ErrorX;\r
+            resources.ApplyResources(this.PictureBox1, "PictureBox1");\r
+            this.PictureBox1.Name = "PictureBox1";\r
+            this.PictureBox1.TabStop = false;\r
+            // \r
+            // label3\r
+            // \r
+            resources.ApplyResources(this.label3, "label3");\r
+            this.label3.Name = "label3";\r
+            // \r
+            // label1\r
+            // \r
+            resources.ApplyResources(this.label1, "label1");\r
+            this.label1.Name = "label1";\r
+            // \r
+            // lbl_shortError\r
+            // \r
+            resources.ApplyResources(this.lbl_shortError, "lbl_shortError");\r
+            this.lbl_shortError.Name = "lbl_shortError";\r
+            // \r
+            // panel3\r
+            // \r
+            resources.ApplyResources(this.panel3, "panel3");\r
+            this.panel3.Name = "panel3";\r
+            // \r
+            // panel5\r
+            // \r
+            resources.ApplyResources(this.panel5, "panel5");\r
+            this.panel5.Name = "panel5";\r
+            // \r
+            // panel4\r
+            // \r
+            this.panel4.Controls.Add(this.panel6);\r
+            resources.ApplyResources(this.panel4, "panel4");\r
+            this.panel4.Name = "panel4";\r
+            // \r
+            // panel6\r
+            // \r
+            this.panel6.Controls.Add(this.btn_close);\r
+            this.panel6.Controls.Add(this.btn_copy);\r
+            resources.ApplyResources(this.panel6, "panel6");\r
+            this.panel6.Name = "panel6";\r
+            // \r
+            // btn_close\r
+            // \r
+            this.btn_close.BackColor = System.Drawing.Color.Transparent;\r
+            this.btn_close.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            resources.ApplyResources(this.btn_close, "btn_close");\r
+            this.btn_close.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_close.Name = "btn_close";\r
+            this.btn_close.UseVisualStyleBackColor = false;\r
+            this.btn_close.Click += new System.EventHandler(this.BtnCloseClick);\r
+            // \r
+            // btn_copy\r
+            // \r
+            this.btn_copy.BackColor = System.Drawing.Color.Transparent;\r
+            this.btn_copy.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            resources.ApplyResources(this.btn_copy, "btn_copy");\r
+            this.btn_copy.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_copy.Image = global::HandBrake.Framework.Properties.Resources.copy;\r
+            this.btn_copy.Name = "btn_copy";\r
+            this.btn_copy.UseVisualStyleBackColor = false;\r
+            this.btn_copy.Click += new System.EventHandler(this.BtnCopyClick);\r
+            // \r
+            // rtf_exceptionFull\r
+            // \r
+            resources.ApplyResources(this.rtf_exceptionFull, "rtf_exceptionFull");\r
+            this.rtf_exceptionFull.Name = "rtf_exceptionFull";\r
+            // \r
+            // mnu_copy_log\r
+            // \r
+            this.mnu_copy_log.Image = global::HandBrake.Framework.Properties.Resources.copy;\r
+            this.mnu_copy_log.Name = "mnu_copy_log";\r
+            resources.ApplyResources(this.mnu_copy_log, "mnu_copy_log");\r
+            this.mnu_copy_log.Click += new System.EventHandler(this.MnuCopyLogClick);\r
+            // \r
+            // ExceptionWindow\r
+            // \r
+            resources.ApplyResources(this, "$this");\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.Controls.Add(this.rtf_exceptionFull);\r
+            this.Controls.Add(this.panel3);\r
+            this.Controls.Add(this.panel5);\r
+            this.Controls.Add(this.panel4);\r
+            this.Controls.Add(this.panel1);\r
+            this.Name = "ExceptionWindow";\r
+            this.TopMost = true;\r
+            this.panel1.ResumeLayout(false);\r
+            this.panel1.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();\r
+            this.panel4.ResumeLayout(false);\r
+            this.panel6.ResumeLayout(false);\r
+            this.ResumeLayout(false);\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Panel panel1;\r
+        private System.Windows.Forms.Panel panel2;\r
+        internal System.Windows.Forms.PictureBox PictureBox1;\r
+        private System.Windows.Forms.Label label3;\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.Label lbl_shortError;\r
+        private System.Windows.Forms.Panel panel3;\r
+        private System.Windows.Forms.Panel panel5;\r
+        private System.Windows.Forms.Panel panel4;\r
+        private System.Windows.Forms.RichTextBox rtf_exceptionFull;\r
+        internal System.Windows.Forms.Button btn_close;\r
+        private System.Windows.Forms.Panel panel6;\r
+        internal System.Windows.Forms.Button btn_copy;\r
+        private System.Windows.Forms.ContextMenuStrip rightClickMenu;\r
+        private System.Windows.Forms.ToolStripMenuItem mnu_copy_log;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/ExceptionWindow.resx b/win/C#/HandBrake.Framework/Views/ExceptionWindow.resx
new file mode 100644 (file)
index 0000000..6492d07
--- /dev/null
@@ -0,0 +1,868 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Bottom</value>\r
+  </data>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 87</value>\r
+  </data>\r
+  <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>669, 10</value>\r
+  </data>\r
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="panel2.TabIndex" type="System.Int32, mscorlib">\r
+    <value>59</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Name" xml:space="preserve">\r
+    <value>panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">\r
+    <value />\r
+  </data>\r
+  <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>12, 12</value>\r
+  </data>\r
+  <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>64, 64</value>\r
+  </data>\r
+  <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>24</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">\r
+    <value>PictureBox1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="label3.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="label3.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="label3.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 63</value>\r
+  </data>\r
+  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>80, 13</value>\r
+  </data>\r
+  <data name="label3.TabIndex" type="System.Int32, mscorlib">\r
+    <value>57</value>\r
+  </data>\r
+  <data name="label3.Text" xml:space="preserve">\r
+    <value>Error Details:</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Name" xml:space="preserve">\r
+    <value>label3</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="label1.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 9.75pt, style=Bold</value>\r
+  </data>\r
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 12</value>\r
+  </data>\r
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>150, 16</value>\r
+  </data>\r
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>25</value>\r
+  </data>\r
+  <data name="label1.Text" xml:space="preserve">\r
+    <value>An Error has occured.</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Name" xml:space="preserve">\r
+    <value>label1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">\r
+    <value>3</value>\r
+  </data>\r
+  <data name="lbl_shortError.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 33</value>\r
+  </data>\r
+  <data name="lbl_shortError.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>573, 30</value>\r
+  </data>\r
+  <data name="lbl_shortError.TabIndex" type="System.Int32, mscorlib">\r
+    <value>58</value>\r
+  </data>\r
+  <data name="lbl_shortError.Text" xml:space="preserve">\r
+    <value>An Unknown Error has occured.</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_shortError.Name" xml:space="preserve">\r
+    <value>lbl_shortError</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_shortError.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_shortError.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_shortError.ZOrder" xml:space="preserve">\r
+    <value>4</value>\r
+  </data>\r
+  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Top</value>\r
+  </data>\r
+  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 0</value>\r
+  </data>\r
+  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>669, 97</value>\r
+  </data>\r
+  <data name="panel1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>61</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Name" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">\r
+    <value>4</value>\r
+  </data>\r
+  <data name="panel3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Left</value>\r
+  </data>\r
+  <data name="panel3.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 97</value>\r
+  </data>\r
+  <data name="panel3.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>76, 216</value>\r
+  </data>\r
+  <data name="panel3.TabIndex" type="System.Int32, mscorlib">\r
+    <value>68</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Name" xml:space="preserve">\r
+    <value>panel3</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="panel5.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Right</value>\r
+  </data>\r
+  <data name="panel5.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>640, 97</value>\r
+  </data>\r
+  <data name="panel5.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>29, 216</value>\r
+  </data>\r
+  <data name="panel5.TabIndex" type="System.Int32, mscorlib">\r
+    <value>69</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Name" xml:space="preserve">\r
+    <value>panel5</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.ZOrder" xml:space="preserve">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="btn_close.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Verdana, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_close.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>105, 8</value>\r
+  </data>\r
+  <data name="btn_close.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>70, 25</value>\r
+  </data>\r
+  <data name="btn_close.TabIndex" type="System.Int32, mscorlib">\r
+    <value>56</value>\r
+  </data>\r
+  <data name="btn_close.Text" xml:space="preserve">\r
+    <value>OK</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_close.Name" xml:space="preserve">\r
+    <value>btn_close</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_close.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_close.Parent" xml:space="preserve">\r
+    <value>panel6</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_close.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="btn_copy.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Verdana, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_copy.ImageAlign" type="System.Drawing.ContentAlignment, System.Drawing">\r
+    <value>MiddleLeft</value>\r
+  </data>\r
+  <data name="btn_copy.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>14, 8</value>\r
+  </data>\r
+  <data name="btn_copy.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>85, 25</value>\r
+  </data>\r
+  <data name="btn_copy.TabIndex" type="System.Int32, mscorlib">\r
+    <value>57</value>\r
+  </data>\r
+  <data name="btn_copy.Text" xml:space="preserve">\r
+    <value>Copy</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_copy.Name" xml:space="preserve">\r
+    <value>btn_copy</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_copy.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_copy.Parent" xml:space="preserve">\r
+    <value>panel6</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_copy.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="panel6.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Right</value>\r
+  </data>\r
+  <data name="panel6.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>491, 0</value>\r
+  </data>\r
+  <data name="panel6.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>178, 42</value>\r
+  </data>\r
+  <data name="panel6.TabIndex" type="System.Int32, mscorlib">\r
+    <value>58</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel6.Name" xml:space="preserve">\r
+    <value>panel6</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel6.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel6.Parent" xml:space="preserve">\r
+    <value>panel4</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel6.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="panel4.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Bottom</value>\r
+  </data>\r
+  <data name="panel4.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 313</value>\r
+  </data>\r
+  <data name="panel4.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>669, 42</value>\r
+  </data>\r
+  <data name="panel4.TabIndex" type="System.Int32, mscorlib">\r
+    <value>69</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel4.Name" xml:space="preserve">\r
+    <value>panel4</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel4.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel4.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel4.ZOrder" xml:space="preserve">\r
+    <value>3</value>\r
+  </data>\r
+  <data name="rtf_exceptionFull.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Fill</value>\r
+  </data>\r
+  <data name="rtf_exceptionFull.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>76, 97</value>\r
+  </data>\r
+  <data name="rtf_exceptionFull.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>564, 216</value>\r
+  </data>\r
+  <data name="rtf_exceptionFull.TabIndex" type="System.Int32, mscorlib">\r
+    <value>70</value>\r
+  </data>\r
+  <data name="rtf_exceptionFull.Text" xml:space="preserve">\r
+    <value />\r
+  </data>\r
+  <data name="&gt;&gt;rtf_exceptionFull.Name" xml:space="preserve">\r
+    <value>rtf_exceptionFull</value>\r
+  </data>\r
+  <data name="&gt;&gt;rtf_exceptionFull.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;rtf_exceptionFull.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;rtf_exceptionFull.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="mnu_copy_log.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>152, 22</value>\r
+  </data>\r
+  <data name="mnu_copy_log.Text" xml:space="preserve">\r
+    <value>Copy</value>\r
+  </data>\r
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">\r
+    <value>6, 13</value>\r
+  </data>\r
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">\r
+    <value>669, 355</value>\r
+  </data>\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+  <data name="$this.Text" xml:space="preserve">\r
+    <value>Error</value>\r
+  </data>\r
+  <data name="&gt;&gt;mnu_copy_log.Name" xml:space="preserve">\r
+    <value>mnu_copy_log</value>\r
+  </data>\r
+  <data name="&gt;&gt;mnu_copy_log.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
+    <value>ExceptionWindow</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/UpdateInfo.Designer.cs b/win/C#/HandBrake.Framework/Views/UpdateInfo.Designer.cs
new file mode 100644 (file)
index 0000000..6400a87
--- /dev/null
@@ -0,0 +1,236 @@
+/*  frmUpdater.Designer.cs \r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Views\r
+{\r
+    partial class UpdateInfo\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UpdateInfo));\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.label6 = new System.Windows.Forms.Label();\r
+            this.btn_skip = new System.Windows.Forms.Button();\r
+            this.btn_installUpdate = new System.Windows.Forms.Button();\r
+            this.btn_remindLater = new System.Windows.Forms.Button();\r
+            this.label3 = new System.Windows.Forms.Label();\r
+            this.lbl_update_text = new System.Windows.Forms.Label();\r
+            this.panel1 = new System.Windows.Forms.Panel();\r
+            this.panel2 = new System.Windows.Forms.Panel();\r
+            this.PictureBox1 = new System.Windows.Forms.PictureBox();\r
+            this.statusStrip1 = new System.Windows.Forms.StatusStrip();\r
+            this.panel3 = new System.Windows.Forms.Panel();\r
+            this.panel5 = new System.Windows.Forms.Panel();\r
+            this.wBrowser = new System.Windows.Forms.WebBrowser();\r
+            this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
+            this.button_container = new System.Windows.Forms.SplitContainer();\r
+            this.panel1.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();\r
+            this.splitContainer1.Panel1.SuspendLayout();\r
+            this.splitContainer1.Panel2.SuspendLayout();\r
+            this.splitContainer1.SuspendLayout();\r
+            this.button_container.Panel1.SuspendLayout();\r
+            this.button_container.Panel2.SuspendLayout();\r
+            this.button_container.SuspendLayout();\r
+            this.SuspendLayout();\r
+            // \r
+            // label1\r
+            // \r
+            resources.ApplyResources(this.label1, "label1");\r
+            this.label1.Name = "label1";\r
+            // \r
+            // label6\r
+            // \r
+            resources.ApplyResources(this.label6, "label6");\r
+            this.label6.Name = "label6";\r
+            // \r
+            // btn_skip\r
+            // \r
+            resources.ApplyResources(this.btn_skip, "btn_skip");\r
+            this.btn_skip.BackColor = System.Drawing.Color.Transparent;\r
+            this.btn_skip.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_skip.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_skip.Name = "btn_skip";\r
+            this.btn_skip.UseVisualStyleBackColor = false;\r
+            this.btn_skip.Click += new System.EventHandler(this.BtnSkipClick);\r
+            // \r
+            // btn_installUpdate\r
+            // \r
+            resources.ApplyResources(this.btn_installUpdate, "btn_installUpdate");\r
+            this.btn_installUpdate.BackColor = System.Drawing.Color.Transparent;\r
+            this.btn_installUpdate.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_installUpdate.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_installUpdate.Name = "btn_installUpdate";\r
+            this.btn_installUpdate.UseVisualStyleBackColor = false;\r
+            this.btn_installUpdate.Click += new System.EventHandler(this.BtnInstallUpdateClick);\r
+            // \r
+            // btn_remindLater\r
+            // \r
+            resources.ApplyResources(this.btn_remindLater, "btn_remindLater");\r
+            this.btn_remindLater.BackColor = System.Drawing.Color.Transparent;\r
+            this.btn_remindLater.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_remindLater.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_remindLater.Name = "btn_remindLater";\r
+            this.btn_remindLater.UseVisualStyleBackColor = false;\r
+            this.btn_remindLater.Click += new System.EventHandler(this.BtnRemindLaterClick);\r
+            // \r
+            // label3\r
+            // \r
+            resources.ApplyResources(this.label3, "label3");\r
+            this.label3.Name = "label3";\r
+            // \r
+            // lbl_update_text\r
+            // \r
+            resources.ApplyResources(this.lbl_update_text, "lbl_update_text");\r
+            this.lbl_update_text.Name = "lbl_update_text";\r
+            // \r
+            // panel1\r
+            // \r
+            this.panel1.BackColor = System.Drawing.Color.White;\r
+            this.panel1.Controls.Add(this.panel2);\r
+            this.panel1.Controls.Add(this.PictureBox1);\r
+            this.panel1.Controls.Add(this.label3);\r
+            this.panel1.Controls.Add(this.label1);\r
+            this.panel1.Controls.Add(this.lbl_update_text);\r
+            this.panel1.Controls.Add(this.label6);\r
+            resources.ApplyResources(this.panel1, "panel1");\r
+            this.panel1.Name = "panel1";\r
+            // \r
+            // panel2\r
+            // \r
+            this.panel2.BackColor = System.Drawing.SystemColors.Control;\r
+            resources.ApplyResources(this.panel2, "panel2");\r
+            this.panel2.MaximumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.MinimumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.Name = "panel2";\r
+            // \r
+            // PictureBox1\r
+            // \r
+            this.PictureBox1.Image = global::HandBrake.Framework.Properties.Resources.logo64;\r
+            resources.ApplyResources(this.PictureBox1, "PictureBox1");\r
+            this.PictureBox1.Name = "PictureBox1";\r
+            this.PictureBox1.TabStop = false;\r
+            // \r
+            // statusStrip1\r
+            // \r
+            resources.ApplyResources(this.statusStrip1, "statusStrip1");\r
+            this.statusStrip1.Name = "statusStrip1";\r
+            // \r
+            // panel3\r
+            // \r
+            resources.ApplyResources(this.panel3, "panel3");\r
+            this.panel3.Name = "panel3";\r
+            // \r
+            // panel5\r
+            // \r
+            resources.ApplyResources(this.panel5, "panel5");\r
+            this.panel5.Name = "panel5";\r
+            // \r
+            // wBrowser\r
+            // \r
+            resources.ApplyResources(this.wBrowser, "wBrowser");\r
+            this.wBrowser.MinimumSize = new System.Drawing.Size(20, 20);\r
+            this.wBrowser.Name = "wBrowser";\r
+            // \r
+            // splitContainer1\r
+            // \r
+            resources.ApplyResources(this.splitContainer1, "splitContainer1");\r
+            this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r
+            this.splitContainer1.Name = "splitContainer1";\r
+            // \r
+            // splitContainer1.Panel1\r
+            // \r
+            this.splitContainer1.Panel1.Controls.Add(this.wBrowser);\r
+            // \r
+            // splitContainer1.Panel2\r
+            // \r
+            this.splitContainer1.Panel2.Controls.Add(this.button_container);\r
+            // \r
+            // button_container\r
+            // \r
+            resources.ApplyResources(this.button_container, "button_container");\r
+            this.button_container.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;\r
+            this.button_container.Name = "button_container";\r
+            // \r
+            // button_container.Panel1\r
+            // \r
+            this.button_container.Panel1.Controls.Add(this.btn_skip);\r
+            // \r
+            // button_container.Panel2\r
+            // \r
+            this.button_container.Panel2.Controls.Add(this.btn_remindLater);\r
+            this.button_container.Panel2.Controls.Add(this.btn_installUpdate);\r
+            // \r
+            // UpdateInfo\r
+            // \r
+            resources.ApplyResources(this, "$this");\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.Controls.Add(this.splitContainer1);\r
+            this.Controls.Add(this.panel5);\r
+            this.Controls.Add(this.panel3);\r
+            this.Controls.Add(this.statusStrip1);\r
+            this.Controls.Add(this.panel1);\r
+            this.MaximizeBox = false;\r
+            this.Name = "UpdateInfo";\r
+            this.panel1.ResumeLayout(false);\r
+            this.panel1.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).EndInit();\r
+            this.splitContainer1.Panel1.ResumeLayout(false);\r
+            this.splitContainer1.Panel2.ResumeLayout(false);\r
+            this.splitContainer1.ResumeLayout(false);\r
+            this.button_container.Panel1.ResumeLayout(false);\r
+            this.button_container.Panel1.PerformLayout();\r
+            this.button_container.Panel2.ResumeLayout(false);\r
+            this.button_container.Panel2.PerformLayout();\r
+            this.button_container.ResumeLayout(false);\r
+            this.ResumeLayout(false);\r
+            this.PerformLayout();\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        internal System.Windows.Forms.PictureBox PictureBox1;\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.Label label6;\r
+        internal System.Windows.Forms.Button btn_skip;\r
+        internal System.Windows.Forms.Button btn_installUpdate;\r
+        internal System.Windows.Forms.Button btn_remindLater;\r
+        private System.Windows.Forms.Label label3;\r
+        private System.Windows.Forms.Label lbl_update_text;\r
+        private System.Windows.Forms.Panel panel1;\r
+        private System.Windows.Forms.StatusStrip statusStrip1;\r
+        private System.Windows.Forms.Panel panel3;\r
+        private System.Windows.Forms.Panel panel5;\r
+        private System.Windows.Forms.WebBrowser wBrowser;\r
+        private System.Windows.Forms.SplitContainer splitContainer1;\r
+        private System.Windows.Forms.SplitContainer button_container;\r
+        private System.Windows.Forms.Panel panel2;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/UpdateInfo.cs b/win/C#/HandBrake.Framework/Views/UpdateInfo.cs
new file mode 100644 (file)
index 0000000..906f117
--- /dev/null
@@ -0,0 +1,125 @@
+/*  UpdateInfo.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace HandBrake.Framework.Views\r
+{\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.Framework.Services.Interfaces;\r
+\r
+    /// <summary>\r
+    /// A window to display update information.\r
+    /// </summary>\r
+    public partial class UpdateInfo : Form\r
+    {\r
+        /// <summary>\r
+        /// An instance of the Appcast Reader\r
+        /// </summary>\r
+        private readonly IAppcastReader appcast;\r
+\r
+        /// <summary>\r
+        /// The Current Version\r
+        /// </summary>\r
+        private readonly string currentVersion;\r
+\r
+        /// <summary>\r
+        /// The Current Build\r
+        /// </summary>\r
+        private readonly string currentBuild;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="UpdateInfo"/> class.\r
+        /// </summary>\r
+        /// <param name="reader">\r
+        /// The appcast reader.\r
+        /// </param>\r
+        /// <param name="currentVersion">\r
+        /// The current Version.\r
+        /// </param>\r
+        /// <param name="currentBuild">\r
+        /// The current Build.\r
+        /// </param>\r
+        public UpdateInfo(IAppcastReader reader, string currentVersion, string currentBuild)\r
+        {\r
+            InitializeComponent();\r
+\r
+            appcast = reader;\r
+            this.currentVersion = currentVersion;\r
+            this.currentBuild = currentBuild;\r
+            GetRss();\r
+            SetVersions();\r
+        }\r
+        \r
+        /// <summary>\r
+        /// Gets the SkipVersion number\r
+        /// </summary>\r
+        public int SkipVersion { get; private set; }\r
+\r
+\r
+        /// <summary>\r
+        /// Get the RSS feed\r
+        /// </summary>\r
+        private void GetRss()\r
+        {\r
+            wBrowser.Url = appcast.DescriptionUrl;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Set the versions\r
+        /// </summary>\r
+        private void SetVersions()\r
+        {\r
+            string old = string.Format("(You have: {0} / {1})", this.currentVersion, this.currentBuild);\r
+            string newBuild = appcast.Version.Trim() + " (" + appcast.Build + ")";\r
+            lbl_update_text.Text = string.Format("HandBrake {0} is now available. {1}", newBuild, old);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handle the Install Update button click event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void BtnInstallUpdateClick(object sender, EventArgs e)\r
+        {\r
+            DownloadUpdate download = new DownloadUpdate(appcast.DownloadFile);\r
+            download.ShowDialog();\r
+            this.DialogResult = DialogResult.OK;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handle the Remind Later button click event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void BtnRemindLaterClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.Cancel;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handle the Skip update button click event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnSkipClick(object sender, EventArgs e)\r
+        {\r
+            this.SkipVersion = int.Parse(appcast.Build);\r
+            this.DialogResult = DialogResult.OK;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/HandBrake.Framework/Views/UpdateInfo.resx b/win/C#/HandBrake.Framework/Views/UpdateInfo.resx
new file mode 100644 (file)
index 0000000..ab5aac9
--- /dev/null
@@ -0,0 +1,1021 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="label1.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="label1.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 9.75pt, style=Bold</value>\r
+  </data>\r
+  <data name="label1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 12</value>\r
+  </data>\r
+  <data name="label1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>273, 16</value>\r
+  </data>\r
+  <data name="label1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>25</value>\r
+  </data>\r
+  <data name="label1.Text" xml:space="preserve">\r
+    <value>A New Version of Handbrake is available!</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Name" xml:space="preserve">\r
+    <value>label1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label1.ZOrder" xml:space="preserve">\r
+    <value>3</value>\r
+  </data>\r
+  <data name="label6.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="label6.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 46</value>\r
+  </data>\r
+  <data name="label6.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>175, 13</value>\r
+  </data>\r
+  <data name="label6.TabIndex" type="System.Int32, mscorlib">\r
+    <value>30</value>\r
+  </data>\r
+  <data name="label6.Text" xml:space="preserve">\r
+    <value>Would you like to download it now?</value>\r
+  </data>\r
+  <data name="&gt;&gt;label6.Name" xml:space="preserve">\r
+    <value>label6</value>\r
+  </data>\r
+  <data name="&gt;&gt;label6.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;label6.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label6.ZOrder" xml:space="preserve">\r
+    <value>5</value>\r
+  </data>\r
+  <data name="btn_skip.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />\r
+  <data name="btn_skip.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">\r
+    <value>GrowAndShrink</value>\r
+  </data>\r
+  <data name="btn_skip.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Verdana, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_skip.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 3</value>\r
+  </data>\r
+  <data name="btn_skip.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>129, 23</value>\r
+  </data>\r
+  <data name="btn_skip.TabIndex" type="System.Int32, mscorlib">\r
+    <value>54</value>\r
+  </data>\r
+  <data name="btn_skip.Text" xml:space="preserve">\r
+    <value>Skip This Version</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_skip.Name" xml:space="preserve">\r
+    <value>btn_skip</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_skip.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_skip.Parent" xml:space="preserve">\r
+    <value>button_container.Panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_skip.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="btn_installUpdate.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="btn_installUpdate.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">\r
+    <value>GrowAndShrink</value>\r
+  </data>\r
+  <data name="btn_installUpdate.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Verdana, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_installUpdate.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>153, 3</value>\r
+  </data>\r
+  <data name="btn_installUpdate.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>109, 23</value>\r
+  </data>\r
+  <data name="btn_installUpdate.TabIndex" type="System.Int32, mscorlib">\r
+    <value>55</value>\r
+  </data>\r
+  <data name="btn_installUpdate.Text" xml:space="preserve">\r
+    <value>Install Update</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_installUpdate.Name" xml:space="preserve">\r
+    <value>btn_installUpdate</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_installUpdate.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_installUpdate.Parent" xml:space="preserve">\r
+    <value>button_container.Panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_installUpdate.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="btn_remindLater.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="btn_remindLater.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">\r
+    <value>GrowAndShrink</value>\r
+  </data>\r
+  <data name="btn_remindLater.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Verdana, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="btn_remindLater.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>19, 3</value>\r
+  </data>\r
+  <data name="btn_remindLater.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>127, 23</value>\r
+  </data>\r
+  <data name="btn_remindLater.TabIndex" type="System.Int32, mscorlib">\r
+    <value>56</value>\r
+  </data>\r
+  <data name="btn_remindLater.Text" xml:space="preserve">\r
+    <value>Remind me Later</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_remindLater.Name" xml:space="preserve">\r
+    <value>btn_remindLater</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_remindLater.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_remindLater.Parent" xml:space="preserve">\r
+    <value>button_container.Panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;btn_remindLater.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="label3.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="label3.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 8.25pt, style=Bold</value>\r
+  </data>\r
+  <data name="label3.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 63</value>\r
+  </data>\r
+  <data name="label3.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>90, 13</value>\r
+  </data>\r
+  <data name="label3.TabIndex" type="System.Int32, mscorlib">\r
+    <value>57</value>\r
+  </data>\r
+  <data name="label3.Text" xml:space="preserve">\r
+    <value>Release Notes:</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Name" xml:space="preserve">\r
+    <value>label3</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;label3.ZOrder" xml:space="preserve">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="lbl_update_text.AutoSize" type="System.Boolean, mscorlib">\r
+    <value>True</value>\r
+  </data>\r
+  <data name="lbl_update_text.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>84, 33</value>\r
+  </data>\r
+  <data name="lbl_update_text.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>409, 13</value>\r
+  </data>\r
+  <data name="lbl_update_text.TabIndex" type="System.Int32, mscorlib">\r
+    <value>58</value>\r
+  </data>\r
+  <data name="lbl_update_text.Text" xml:space="preserve">\r
+    <value>HandBrake {0.0.0} (000000000) is now available. (You have: {0.0.0} (000000000))</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_update_text.Name" xml:space="preserve">\r
+    <value>lbl_update_text</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_update_text.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_update_text.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;lbl_update_text.ZOrder" xml:space="preserve">\r
+    <value>4</value>\r
+  </data>\r
+  <data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Bottom</value>\r
+  </data>\r
+  <data name="panel2.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 87</value>\r
+  </data>\r
+  <data name="panel2.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>710, 10</value>\r
+  </data>\r
+  <data name="panel2.TabIndex" type="System.Int32, mscorlib">\r
+    <value>59</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Name" xml:space="preserve">\r
+    <value>panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel2.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="PictureBox1.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">\r
+    <value />\r
+  </data>\r
+  <data name="PictureBox1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>12, 12</value>\r
+  </data>\r
+  <data name="PictureBox1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>64, 64</value>\r
+  </data>\r
+  <data name="PictureBox1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>24</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Name" xml:space="preserve">\r
+    <value>PictureBox1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.Parent" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;PictureBox1.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Top</value>\r
+  </data>\r
+  <data name="panel1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 0</value>\r
+  </data>\r
+  <data name="panel1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>710, 97</value>\r
+  </data>\r
+  <data name="panel1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>60</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Name" xml:space="preserve">\r
+    <value>panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">\r
+    <value>4</value>\r
+  </data>\r
+  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>17, 17</value>\r
+  </metadata>\r
+  <data name="statusStrip1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 346</value>\r
+  </data>\r
+  <data name="statusStrip1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>710, 22</value>\r
+  </data>\r
+  <data name="statusStrip1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>65</value>\r
+  </data>\r
+  <data name="statusStrip1.Text" xml:space="preserve">\r
+    <value>statusStrip1</value>\r
+  </data>\r
+  <data name="&gt;&gt;statusStrip1.Name" xml:space="preserve">\r
+    <value>statusStrip1</value>\r
+  </data>\r
+  <data name="&gt;&gt;statusStrip1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;statusStrip1.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;statusStrip1.ZOrder" xml:space="preserve">\r
+    <value>3</value>\r
+  </data>\r
+  <data name="panel3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Left</value>\r
+  </data>\r
+  <data name="panel3.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 97</value>\r
+  </data>\r
+  <data name="panel3.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>87, 249</value>\r
+  </data>\r
+  <data name="panel3.TabIndex" type="System.Int32, mscorlib">\r
+    <value>67</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Name" xml:space="preserve">\r
+    <value>panel3</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel3.ZOrder" xml:space="preserve">\r
+    <value>2</value>\r
+  </data>\r
+  <data name="panel5.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Right</value>\r
+  </data>\r
+  <data name="panel5.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>681, 97</value>\r
+  </data>\r
+  <data name="panel5.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>29, 249</value>\r
+  </data>\r
+  <data name="panel5.TabIndex" type="System.Int32, mscorlib">\r
+    <value>68</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Name" xml:space="preserve">\r
+    <value>panel5</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Panel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;panel5.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="wBrowser.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Fill</value>\r
+  </data>\r
+  <data name="wBrowser.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 0</value>\r
+  </data>\r
+  <data name="wBrowser.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>594, 203</value>\r
+  </data>\r
+  <data name="wBrowser.TabIndex" type="System.Int32, mscorlib">\r
+    <value>31</value>\r
+  </data>\r
+  <data name="&gt;&gt;wBrowser.Name" xml:space="preserve">\r
+    <value>wBrowser</value>\r
+  </data>\r
+  <data name="&gt;&gt;wBrowser.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.WebBrowser, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;wBrowser.Parent" xml:space="preserve">\r
+    <value>splitContainer1.Panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;wBrowser.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="splitContainer1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Fill</value>\r
+  </data>\r
+  <data name="splitContainer1.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>87, 97</value>\r
+  </data>\r
+  <data name="splitContainer1.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">\r
+    <value>0, 0, 0, 0</value>\r
+  </data>\r
+  <data name="splitContainer1.Orientation" type="System.Windows.Forms.Orientation, System.Windows.Forms">\r
+    <value>Horizontal</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel1.Name" xml:space="preserve">\r
+    <value>splitContainer1.Panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel1.Parent" xml:space="preserve">\r
+    <value>splitContainer1</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel1.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="button_container.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">\r
+    <value>Fill</value>\r
+  </data>\r
+  <data name="button_container.Location" type="System.Drawing.Point, System.Drawing">\r
+    <value>0, 0</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel1.Name" xml:space="preserve">\r
+    <value>button_container.Panel1</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel1.Parent" xml:space="preserve">\r
+    <value>button_container</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel1.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel2.Name" xml:space="preserve">\r
+    <value>button_container.Panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel2.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel2.Parent" xml:space="preserve">\r
+    <value>button_container</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Panel2.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="button_container.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>594, 42</value>\r
+  </data>\r
+  <data name="button_container.SplitterDistance" type="System.Int32, mscorlib">\r
+    <value>318</value>\r
+  </data>\r
+  <data name="button_container.TabIndex" type="System.Int32, mscorlib">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Name" xml:space="preserve">\r
+    <value>button_container</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.Parent" xml:space="preserve">\r
+    <value>splitContainer1.Panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;button_container.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel2.Name" xml:space="preserve">\r
+    <value>splitContainer1.Panel2</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel2.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel2.Parent" xml:space="preserve">\r
+    <value>splitContainer1</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Panel2.ZOrder" xml:space="preserve">\r
+    <value>1</value>\r
+  </data>\r
+  <data name="splitContainer1.Size" type="System.Drawing.Size, System.Drawing">\r
+    <value>594, 249</value>\r
+  </data>\r
+  <data name="splitContainer1.SplitterDistance" type="System.Int32, mscorlib">\r
+    <value>203</value>\r
+  </data>\r
+  <data name="splitContainer1.TabIndex" type="System.Int32, mscorlib">\r
+    <value>69</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Name" xml:space="preserve">\r
+    <value>splitContainer1</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.Parent" xml:space="preserve">\r
+    <value>$this</value>\r
+  </data>\r
+  <data name="&gt;&gt;splitContainer1.ZOrder" xml:space="preserve">\r
+    <value>0</value>\r
+  </data>\r
+  <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
+  <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">\r
+    <value>6, 13</value>\r
+  </data>\r
+  <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">\r
+    <value>710, 368</value>\r
+  </data>\r
+  <data name="$this.Font" type="System.Drawing.Font, System.Drawing">\r
+    <value>Tahoma, 8.25pt</value>\r
+  </data>\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+  <data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">\r
+    <value>540, 300</value>\r
+  </data>\r
+  <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">\r
+    <value>CenterScreen</value>\r
+  </data>\r
+  <data name="$this.Text" xml:space="preserve">\r
+    <value>Update</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Name" xml:space="preserve">\r
+    <value>UpdateInfo</value>\r
+  </data>\r
+  <data name="&gt;&gt;$this.Type" xml:space="preserve">\r
+    <value>System.Windows.Forms.Form, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/HandBrake.sln b/win/C#/HandBrake.sln
new file mode 100644 (file)
index 0000000..c51ae7b
--- /dev/null
@@ -0,0 +1,66 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeCS", "HandBrakeCS.csproj", "{A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.ApplicationServices", "HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj", "{087A2BA8-BAC2-4577-A46F-07FF9D420016}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.Framework", "HandBrake.Framework\HandBrake.Framework.csproj", "{49AD42C1-BF9B-4D78-A644-020878FAADE6}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Debug|x86 = Debug|x86\r
+               Install|Any CPU = Install|Any CPU\r
+               Install|x86 = Install|x86\r
+               NightlyBuild|Any CPU = NightlyBuild|Any CPU\r
+               NightlyBuild|x86 = NightlyBuild|x86\r
+               Release|Any CPU = Release|Any CPU\r
+               Release|x86 = Release|x86\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.ActiveCfg = Debug|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.Build.0 = Debug|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.ActiveCfg = Install|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.Build.0 = Install|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.ActiveCfg = Install|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.Build.0 = Install|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.ActiveCfg = NightlyBuild|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.Build.0 = NightlyBuild|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.ActiveCfg = Release|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.Build.0 = Release|x86\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|x86.ActiveCfg = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.Build.0 = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|x86.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|x86.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|x86.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|x86.ActiveCfg = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|x86.ActiveCfg = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|x86.ActiveCfg = NightlyBuild|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|x86.ActiveCfg = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win/C#/HandBrake10.5.1.ReSharper b/win/C#/HandBrake10.5.1.ReSharper
new file mode 100644 (file)
index 0000000..781e47d
--- /dev/null
@@ -0,0 +1,385 @@
+<Configuration>\r
+  <CodeStyleSettings>\r
+    <ExternalPath IsNull="False">\r
+    </ExternalPath>\r
+    <Sharing>SOLUTION</Sharing>\r
+    <CSharp>\r
+      <FormatSettings>\r
+        <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>\r
+        <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>\r
+        <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>\r
+        <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>\r
+        <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>\r
+        <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>\r
+        <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>\r
+        <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>\r
+        <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>\r
+        <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>\r
+        <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>\r
+        <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>\r
+        <MODIFIERS_ORDER IsNull="False">\r
+          <Item>public</Item>\r
+          <Item>protected</Item>\r
+          <Item>internal</Item>\r
+          <Item>private</Item>\r
+          <Item>new</Item>\r
+          <Item>abstract</Item>\r
+          <Item>virtual</Item>\r
+          <Item>override</Item>\r
+          <Item>sealed</Item>\r
+          <Item>static</Item>\r
+          <Item>readonly</Item>\r
+          <Item>extern</Item>\r
+          <Item>unsafe</Item>\r
+          <Item>volatile</Item>\r
+        </MODIFIERS_ORDER>\r
+        <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>\r
+        <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>\r
+        <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>\r
+        <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>\r
+        <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>\r
+        <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>\r
+        <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>\r
+        <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>\r
+        <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>\r
+        <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>\r
+        <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>\r
+        <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>\r
+        <STICK_COMMENT>False</STICK_COMMENT>\r
+        <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>\r
+        <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>\r
+        <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>\r
+        <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>\r
+        <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>\r
+        <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>\r
+      </FormatSettings>\r
+      <UsingsSettings>\r
+        <AddImportsToDeepestScope>True</AddImportsToDeepestScope>\r
+        <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>\r
+      </UsingsSettings>\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+        <ExceptionName IsNull="False">\r
+        </ExceptionName>\r
+        <OverrideDefaultSettings>True</OverrideDefaultSettings>\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+        <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+        <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+        <Abbreviation Text="SSA" />\r
+        <Abbreviation Text="CC" />\r
+        <Abbreviation Text="UTF" />\r
+        <Abbreviation Text="TX" />\r
+        <Abbreviation Text="SRT" />\r
+        <Abbreviation Text="CLI" />\r
+      </Naming2>\r
+      <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>\r
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">\r
+\r
+    <!-- Do not reorder COM interfaces -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="interface"/>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke structs -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Or>\r
+                    <Kind Is="struct"/>\r
+                    <Kind Is="class"/>\r
+                </Or>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="class"/>\r
+                <Name Is=".*NativeMethods" />\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- StyleCop pattern -->\r
+    <Pattern RemoveAllRegions="true">\r
+        <Match>\r
+            <Or Weight="1000" >\r
+                <Kind Is="class" />\r
+                <Kind Is="struct" />\r
+                <Kind Is="interface"/>\r
+            </Or>\r
+        </Match>\r
+\r
+        <!-- constants and fields -->\r
+        <Entry>\r
+            <Match>\r
+                <Or>\r
+                    <Kind Is="constant"/>\r
+                    <Kind Is="field"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Kind Order="constant field"/>\r
+                <Readonly/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Constants and Fields"/>\r
+        </Entry>\r
+\r
+        <!-- constructors -->\r
+        <Entry>\r
+            <Match>\r
+                <Or Weight="200">\r
+                    <Kind Is="constructor"/>\r
+                    <Kind Is="destructor"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Static/>\r
+                <Kind Order="constructor destructor"/>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+            </Sort>\r
+            <Group Region="Constructors and Destructors"/>\r
+        </Entry>\r
+\r
+        <!-- delegates -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="delegate"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Delegates"/>\r
+        </Entry>\r
+\r
+        <!-- events -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="event"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Events"/>\r
+        </Entry>\r
+\r
+        <!-- enum -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="enum"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Enums"/>\r
+        </Entry>\r
+\r
+        <!-- interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="interface" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Interfaces"/>\r
+        </Entry>\r
+\r
+        <!-- properties -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="property"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Properties"/>\r
+        </Entry>\r
+\r
+        <!-- indexers -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="indexer"\r
+                      Weight="300" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Indexers"/>\r
+        </Entry>\r
+\r
+        <!-- operator -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="operator"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Operators"/>\r
+        </Entry>\r
+\r
+        <!-- public methods -->\r
+        <Entry>\r
+            <Match>\r
+                <And>\r
+                    <Kind Is="method"/>\r
+                    <Access Is="public"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Public Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Implemented Interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <And Weight="500">\r
+                    <Kind Is="method"/>\r
+                    <ImplementsInterface CLRName=".*"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <ImplementsInterface />\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Implemented Interfaces">\r
+                <ImplementsInterface Region="${ImplementsInterface}" />\r
+            </Group>\r
+        </Entry>\r
+\r
+        <!-- other methods -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="method"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Nested structs -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="struct"\r
+                      Weight="600" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- Nested classes -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="class"\r
+                      Weight="700" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- all other members -->\r
+        <Entry/>\r
+\r
+    </Pattern>\r
+</Patterns>\r
+]]></CustomMemberReorderingPatterns>\r
+    </CSharp>\r
+    <VB>\r
+      <FormatSettings />\r
+      <ImportsSettings />\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      </Naming2>\r
+    </VB>\r
+    <Web>\r
+      <Naming2 />\r
+    </Web>\r
+    <Xaml>\r
+      <Naming2 />\r
+    </Xaml>\r
+    <XML>\r
+      <FormatSettings />\r
+    </XML>\r
+    <GenerateMemberBody />\r
+    <Naming2>\r
+      <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      <ExceptionName IsNull="False">\r
+      </ExceptionName>\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+      <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+      <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+    </Naming2>\r
+  </CodeStyleSettings>\r
+</Configuration>
\ No newline at end of file
diff --git a/win/C#/HandBrake10.sln b/win/C#/HandBrake10.sln
new file mode 100644 (file)
index 0000000..84de6f5
--- /dev/null
@@ -0,0 +1,66 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeCS", "HandBrakeCS.csproj", "{A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.ApplicationServices", "HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj", "{087A2BA8-BAC2-4577-A46F-07FF9D420016}"\r
+EndProject\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrake.Framework", "HandBrake.Framework\HandBrake.Framework.csproj", "{49AD42C1-BF9B-4D78-A644-020878FAADE6}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Debug|x86 = Debug|x86\r
+               Install|Any CPU = Install|Any CPU\r
+               Install|x86 = Install|x86\r
+               NightlyBuild|Any CPU = NightlyBuild|Any CPU\r
+               NightlyBuild|x86 = NightlyBuild|x86\r
+               Release|Any CPU = Release|Any CPU\r
+               Release|x86 = Release|x86\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.ActiveCfg = Debug|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Debug|x86.Build.0 = Debug|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.ActiveCfg = Install|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|Any CPU.Build.0 = Install|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.ActiveCfg = Install|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Install|x86.Build.0 = Install|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.ActiveCfg = NightlyBuild|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.NightlyBuild|x86.Build.0 = NightlyBuild|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.ActiveCfg = Release|x86\r
+               {A2923D42-C38B-4B12-8CBA-B8D93D6B13A3}.Release|x86.Build.0 = Release|x86\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Debug|x86.ActiveCfg = Debug|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|Any CPU.Build.0 = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Install|x86.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.ActiveCfg = NightlyBuild|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|Any CPU.Build.0 = NightlyBuild|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.NightlyBuild|x86.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {087A2BA8-BAC2-4577-A46F-07FF9D420016}.Release|x86.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Debug|x86.ActiveCfg = Debug|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|Any CPU.Build.0 = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Install|x86.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|Any CPU.Build.0 = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.NightlyBuild|x86.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|Any CPU.Build.0 = Release|Any CPU\r
+               {49AD42C1-BF9B-4D78-A644-020878FAADE6}.Release|x86.ActiveCfg = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win/C#/HandBrakeCS.5.0.ReSharper b/win/C#/HandBrakeCS.5.0.ReSharper
new file mode 100644 (file)
index 0000000..59f6819
--- /dev/null
@@ -0,0 +1,388 @@
+<Configuration>\r
+  <CodeStyleSettings>\r
+    <ExternalPath IsNull="False">\r
+    </ExternalPath>\r
+    <Sharing>SOLUTION</Sharing>\r
+    <CSharp>\r
+      <FormatSettings>\r
+        <ALIGN_MULTILINE_ARGUMENT>False</ALIGN_MULTILINE_ARGUMENT>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_FIELD>1</BLANK_LINES_AROUND_SINGLE_LINE_FIELD>\r
+        <BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>1</BLANK_LINES_AROUND_SINGLE_LINE_INVOCABLE>\r
+        <BLANK_LINES_BETWEEN_USING_GROUPS>1</BLANK_LINES_BETWEEN_USING_GROUPS>\r
+        <FORCE_ATTRIBUTE_STYLE>SEPARATE</FORCE_ATTRIBUTE_STYLE>\r
+        <FORCE_FOR_BRACES_STYLE>ALWAYS_ADD</FORCE_FOR_BRACES_STYLE>\r
+        <FORCE_FOREACH_BRACES_STYLE>ALWAYS_ADD</FORCE_FOREACH_BRACES_STYLE>\r
+        <FORCE_IFELSE_BRACES_STYLE>ALWAYS_ADD</FORCE_IFELSE_BRACES_STYLE>\r
+        <FORCE_WHILE_BRACES_STYLE>ALWAYS_ADD</FORCE_WHILE_BRACES_STYLE>\r
+        <INDENT_ANONYMOUS_METHOD_BLOCK>False</INDENT_ANONYMOUS_METHOD_BLOCK>\r
+        <INDENT_EMBRACED_INITIALIZER_BLOCK>False</INDENT_EMBRACED_INITIALIZER_BLOCK>\r
+        <KEEP_BLANK_LINES_IN_CODE>1</KEEP_BLANK_LINES_IN_CODE>\r
+        <KEEP_BLANK_LINES_IN_DECLARATIONS>1</KEEP_BLANK_LINES_IN_DECLARATIONS>\r
+        <KEEP_USER_LINEBREAKS>False</KEEP_USER_LINEBREAKS>\r
+        <MODIFIERS_ORDER IsNull="False">\r
+          <Item>public</Item>\r
+          <Item>protected</Item>\r
+          <Item>internal</Item>\r
+          <Item>private</Item>\r
+          <Item>new</Item>\r
+          <Item>abstract</Item>\r
+          <Item>virtual</Item>\r
+          <Item>override</Item>\r
+          <Item>sealed</Item>\r
+          <Item>static</Item>\r
+          <Item>readonly</Item>\r
+          <Item>extern</Item>\r
+          <Item>unsafe</Item>\r
+          <Item>volatile</Item>\r
+        </MODIFIERS_ORDER>\r
+        <PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>False</PLACE_CONSTRUCTOR_INITIALIZER_ON_SAME_LINE>\r
+        <PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>False</PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE>\r
+        <PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>False</PLACE_SIMPLE_ACCESSOR_ON_SINGLE_LINE>\r
+        <PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>False</PLACE_TYPE_CONSTRAINTS_ON_SAME_LINE>\r
+        <PLACE_WHILE_ON_NEW_LINE>True</PLACE_WHILE_ON_NEW_LINE>\r
+        <REDUNDANT_THIS_QUALIFIER_STYLE>ALWAYS_USE</REDUNDANT_THIS_QUALIFIER_STYLE>\r
+        <SIMPLE_EMBEDDED_STATEMENT_STYLE>ON_SINGLE_LINE</SIMPLE_EMBEDDED_STATEMENT_STYLE>\r
+        <SPACE_AFTER_TYPECAST_PARENTHESES>False</SPACE_AFTER_TYPECAST_PARENTHESES>\r
+        <SPACE_AROUND_MULTIPLICATIVE_OP>True</SPACE_AROUND_MULTIPLICATIVE_OP>\r
+        <SPACE_BEFORE_SIZEOF_PARENTHESES>False</SPACE_BEFORE_SIZEOF_PARENTHESES>\r
+        <SPACE_BEFORE_TYPEOF_PARENTHESES>False</SPACE_BEFORE_TYPEOF_PARENTHESES>\r
+        <SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>True</SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES>\r
+        <STICK_COMMENT>False</STICK_COMMENT>\r
+        <WRAP_AFTER_DECLARATION_LPAR>True</WRAP_AFTER_DECLARATION_LPAR>\r
+        <WRAP_AFTER_INVOCATION_LPAR>True</WRAP_AFTER_INVOCATION_LPAR>\r
+        <WRAP_ARGUMENTS_STYLE>CHOP_IF_LONG</WRAP_ARGUMENTS_STYLE>\r
+        <WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>True</WRAP_BEFORE_FIRST_TYPE_PARAMETER_CONSTRAINT>\r
+        <WRAP_EXTENDS_LIST_STYLE>CHOP_IF_LONG</WRAP_EXTENDS_LIST_STYLE>\r
+        <WRAP_PARAMETERS_STYLE>CHOP_IF_LONG</WRAP_PARAMETERS_STYLE>\r
+      </FormatSettings>\r
+      <UsingsSettings>\r
+        <AddImportsToDeepestScope>True</AddImportsToDeepestScope>\r
+        <QualifiedUsingAtNestedScope>True</QualifiedUsingAtNestedScope>\r
+      </UsingsSettings>\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+        <ExceptionName IsNull="False">\r
+        </ExceptionName>\r
+        <OverrideDefaultSettings>True</OverrideDefaultSettings>\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+        <PredefinedRule Inspect="True" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+        <PredefinedRule Inspect="True" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+        <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+      </Naming2>\r
+      <CustomMemberReorderingPatterns><![CDATA[<?xml version="1.0" encoding="utf-8"?>\r
+<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns">\r
+\r
+    <!-- Do not reorder COM interfaces -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="interface"/>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke structs -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Or>\r
+                    <Kind Is="struct"/>\r
+                    <Kind Is="class"/>\r
+                </Or>\r
+                <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"\r
+                              Inherit="true"/>\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) -->\r
+    <Pattern>\r
+        <Match>\r
+            <And Weight="2000">\r
+                <Kind Is="class"/>\r
+                <Name Is=".*NativeMethods" />\r
+            </And>\r
+        </Match>\r
+    </Pattern>\r
+\r
+    <!-- StyleCop pattern -->\r
+    <Pattern RemoveAllRegions="true">\r
+        <Match>\r
+            <Or Weight="1000" >\r
+                <Kind Is="class" />\r
+                <Kind Is="struct" />\r
+                <Kind Is="interface"/>\r
+            </Or>\r
+        </Match>\r
+\r
+        <!-- constants and fields -->\r
+        <Entry>\r
+            <Match>\r
+                <Or>\r
+                    <Kind Is="constant"/>\r
+                    <Kind Is="field"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Kind Order="constant field"/>\r
+                <Readonly/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Constants and Fields"/>\r
+        </Entry>\r
+\r
+        <!-- constructors -->\r
+        <Entry>\r
+            <Match>\r
+                <Or Weight="200">\r
+                    <Kind Is="constructor"/>\r
+                    <Kind Is="destructor"/>\r
+                </Or>\r
+            </Match>\r
+            <Sort>\r
+                <Static/>\r
+                <Kind Order="constructor destructor"/>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+            </Sort>\r
+            <Group Region="Constructors and Destructors"/>\r
+        </Entry>\r
+\r
+        <!-- delegates -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="delegate"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Delegates"/>\r
+        </Entry>\r
+\r
+        <!-- events -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="event"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Events"/>\r
+        </Entry>\r
+\r
+        <!-- enum -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="enum"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Enums"/>\r
+        </Entry>\r
+\r
+        <!-- interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="interface" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Interfaces"/>\r
+        </Entry>\r
+\r
+        <!-- properties -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="property"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Properties"/>\r
+        </Entry>\r
+\r
+        <!-- indexers -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="indexer"\r
+                      Weight="300" />\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Indexers"/>\r
+        </Entry>\r
+\r
+        <!-- operator -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="operator"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Operators"/>\r
+        </Entry>\r
+\r
+        <!-- public methods -->\r
+        <Entry>\r
+            <Match>\r
+                <And>\r
+                    <Kind Is="method"/>\r
+                    <Access Is="public"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Public Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Implemented Interfaces -->\r
+        <Entry>\r
+            <Match>\r
+                <And Weight="500">\r
+                    <Kind Is="method"/>\r
+                    <ImplementsInterface CLRName=".*"/>\r
+                </And>\r
+            </Match>\r
+            <Sort>\r
+                <ImplementsInterface />\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Implemented Interfaces">\r
+                <ImplementsInterface Region="${ImplementsInterface}" />\r
+            </Group>\r
+        </Entry>\r
+\r
+        <!-- other methods -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="method"/>\r
+            </Match>\r
+            <Sort>\r
+                <Access Order="public internal protected-internal protected private"/>\r
+                <Static/>\r
+                <Name/>\r
+            </Sort>\r
+            <Group Region="Methods"/>\r
+        </Entry>\r
+\r
+        <!-- Nested structs -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="struct"\r
+                      Weight="600" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- Nested classes -->\r
+        <Entry>\r
+            <Match>\r
+                <Kind Is="class"\r
+                      Weight="700" />\r
+            </Match>\r
+            <Sort>\r
+                <Static />\r
+                <Access Order="public internal protected-internal protected private" />\r
+                <Name/>\r
+            </Sort>\r
+        </Entry>\r
+\r
+        <!-- all other members -->\r
+        <Entry/>\r
+\r
+    </Pattern>\r
+</Patterns>\r
+]]></CustomMemberReorderingPatterns>\r
+    </CSharp>\r
+    <VB>\r
+      <FormatSettings />\r
+      <ImportsSettings />\r
+      <Naming2>\r
+        <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+        <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      </Naming2>\r
+    </VB>\r
+    <Web>\r
+      <Naming2 />\r
+    </Web>\r
+    <Xaml>\r
+      <Naming2 />\r
+    </Xaml>\r
+    <XML>\r
+      <FormatSettings />\r
+    </XML>\r
+    <FileHeader><![CDATA[/*  file.cs$\r
+        This file is part of the HandBrake source code.\r
+        Homepage: <http://handbrake.fr/>\r
+        It may be used under the terms of the GNU General Public License. */]]></FileHeader>\r
+    <GenerateMemberBody />\r
+    <Naming2>\r
+      <EventHandlerPatternLong>$object$_On$event$</EventHandlerPatternLong>\r
+      <EventHandlerPatternShort>$event$Handler</EventHandlerPatternShort>\r
+      <ExceptionName IsNull="False">\r
+      </ExceptionName>\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Locals" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="Parameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="TypesAndNamespaces" />\r
+      <PredefinedRule Inspect="False" Prefix="I" Suffix="" Style="AaBb" ElementKind="Interfaces" />\r
+      <PredefinedRule Inspect="False" Prefix="T" Suffix="" Style="AaBb" ElementKind="TypeParameters" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="MethodPropertyEvent" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="aaBb" ElementKind="LocalConstants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="PublicFields" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Constants" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="StaticReadonly" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="EnumMember" />\r
+      <PredefinedRule Inspect="False" Prefix="" Suffix="" Style="AaBb" ElementKind="Other" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateConstants" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateInstanceFields" />\r
+      <PredefinedRule Inspect="True" Prefix="_" Suffix="" Style="aaBb" ElementKind="PrivateStaticFields" />\r
+      <PredefinedRule Inspect="True" Prefix="" Suffix="" Style="AaBb" ElementKind="PrivateStaticReadonly" />\r
+      <Abbreviation Text="CLI" />\r
+      <Abbreviation Text="DRC" />\r
+      <Abbreviation Text="ID" />\r
+      <Abbreviation Text="MP" />\r
+      <Abbreviation Text="DVD" />\r
+    </Naming2>\r
+  </CodeStyleSettings>\r
+</Configuration>
\ No newline at end of file
index 4c3a4f8..46323ad 100644 (file)
@@ -1,4 +1,5 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">\r
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">\r
   <PropertyGroup>\r
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
@@ -17,8 +18,8 @@
     </FileUpgradeFlags>\r
     <UpgradeBackupLocation>\r
     </UpgradeBackupLocation>\r
-    <OldToolsVersion>2.0</OldToolsVersion>\r
-    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\r
+    <OldToolsVersion>3.5</OldToolsVersion>\r
+    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\r
     <IsWebBootstrapper>false</IsWebBootstrapper>\r
     <SignManifests>false</SignManifests>\r
     <PublishUrl>publish\</PublishUrl>\r
@@ -35,8 +36,6 @@
     <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\r
     <UseApplicationTrust>false</UseApplicationTrust>\r
     <BootstrapperEnabled>true</BootstrapperEnabled>\r
-    <TargetFrameworkSubset>\r
-    </TargetFrameworkSubset>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
     <DebugSymbols>true</DebugSymbols>\r
@@ -52,6 +51,7 @@
     <DocumentationFile>\r
     </DocumentationFile>\r
     <PlatformTarget>x86</PlatformTarget>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
     <DebugType>full</DebugType>\r
     <DebugSymbols>true</DebugSymbols>\r
     <FileAlignment>512</FileAlignment>\r
     <PlatformTarget>x86</PlatformTarget>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">\r
     <PlatformTarget>x86</PlatformTarget>\r
     <OutputPath>bin\x86\Debug\</OutputPath>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">\r
     <PlatformTarget>x86</PlatformTarget>\r
@@ -80,6 +82,7 @@
     <UseVSHostingProcess>false</UseVSHostingProcess>\r
     <DefineConstants>TRACE;DEBUG</DefineConstants>\r
     <Optimize>true</Optimize>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Build|AnyCPU' ">\r
     <OutputPath>bin\Build\</OutputPath>\r
     <DebugType>pdbonly</DebugType>\r
     <PlatformTarget>x86</PlatformTarget>\r
     <ErrorReport>prompt</ErrorReport>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Build|x86' ">\r
     <OutputPath>bin\x86\Build\</OutputPath>\r
     <PlatformTarget>x86</PlatformTarget>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Install|AnyCPU'">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <OutputPath>bin\Install\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>\r
+    <Optimize>true</Optimize>\r
+    <DebugType>full</DebugType>\r
+    <PlatformTarget>x86</PlatformTarget>\r
+    <CodeAnalysisLogFile>bin\Release\Handbrake.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>\r
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\r
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\r
+    <UseVSHostingProcess>false</UseVSHostingProcess>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>\r
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>\r
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Install|x86'">\r
+    <OutputPath>bin\x86\Install\</OutputPath>\r
+    <DefineConstants>TRACE;DEBUG</DefineConstants>\r
+    <Optimize>true</Optimize>\r
+    <PlatformTarget>x86</PlatformTarget>\r
+    <CodeAnalysisLogFile>bin\x86\Release\Handbrake.exe.CodeAnalysisLog.xml</CodeAnalysisLogFile>\r
+    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\r
+    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\r
+    <UseVSHostingProcess>false</UseVSHostingProcess>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRuleSetDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\\Rule Sets</CodeAnalysisRuleSetDirectories>\r
+    <CodeAnalysisIgnoreBuiltInRuleSets>false</CodeAnalysisIgnoreBuiltInRuleSets>\r
+    <CodeAnalysisRuleDirectories>;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>\r
+    <CodeAnalysisIgnoreBuiltInRules>false</CodeAnalysisIgnoreBuiltInRules>\r
+    <CodeAnalysisFailOnMissingRules>false</CodeAnalysisFailOnMissingRules>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'NightlyBuild|AnyCPU'">\r
+    <OutputPath>bin\NightlyBuild\</OutputPath>\r
+    <Optimize>true</Optimize>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'NightlyBuild|x86'">\r
+    <OutputPath>bin\x86\NightlyBuild\</OutputPath>\r
+    <DefineConstants>TRACE;DEBUG</DefineConstants>\r
+    <Optimize>true</Optimize>\r
   </PropertyGroup>\r
   <ItemGroup>\r
     <Reference Include="Growl.Connector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=980c2339411be384, processorArchitecture=x86">\r
       <HintPath>libraries\Growl.CoreLibrary.dll</HintPath>\r
       <Private>True</Private>\r
     </Reference>\r
+    <Reference Include="PresentationCore">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="PresentationFramework">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
     <Reference Include="System" />\r
+    <Reference Include="System.Core">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
     <Reference Include="System.Data" />\r
     <Reference Include="System.Deployment" />\r
     <Reference Include="System.Design" />\r
     <Reference Include="System.Messaging" />\r
     <Reference Include="System.Windows.Forms" />\r
     <Reference Include="System.XML" />\r
-    <Reference Include="UIAutomationProvider, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />\r
-    <Reference Include="WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />\r
-    <Reference Include="WindowsFormsIntegration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />\r
+    <Reference Include="UIAutomationProvider, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <Compile Include="Controls\AudioPanel.cs">\r
     <Compile Include="Controls\x264Panel.Designer.cs">\r
       <DependentUpon>x264Panel.cs</DependentUpon>\r
     </Compile>\r
+    <Compile Include="Model\ActivityLogMode.cs" />\r
+    <Compile Include="Model\QueryPictureSettingsMode.cs" />\r
+    <Compile Include="Model\QueryEncodeMode.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
     <Compile Include="frmPreview.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="frmPreview.Designer.cs">\r
       <DependentUpon>frmPreview.cs</DependentUpon>\r
     </Compile>\r
-    <Compile Include="frmActivityWindow.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="frmActivityWindow.Designer.cs">\r
-      <DependentUpon>frmActivityWindow.cs</DependentUpon>\r
-    </Compile>\r
     <Compile Include="frmAbout.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="frmAddPreset.Designer.cs">\r
       <DependentUpon>frmAddPreset.cs</DependentUpon>\r
     </Compile>\r
-    <Compile Include="frmDownload.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="frmDownload.Designer.cs">\r
-      <DependentUpon>frmDownload.cs</DependentUpon>\r
-    </Compile>\r
     <Compile Include="frmMain.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="frmQueue.Designer.cs">\r
       <DependentUpon>frmQueue.cs</DependentUpon>\r
     </Compile>\r
-    <Compile Include="frmUpdater.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="frmUpdater.designer.cs">\r
-      <DependentUpon>frmUpdater.cs</DependentUpon>\r
-    </Compile>\r
-    <Compile Include="Functions\GrowlCommunicator.cs" />\r
     <Compile Include="Functions\PresetLoader.cs" />\r
     <Compile Include="Functions\QueryGenerator.cs" />\r
     <Compile Include="Functions\Main.cs" />\r
-    <Compile Include="Functions\UpdateCheckInformation.cs" />\r
-    <Compile Include="Functions\Win32.cs" />\r
-    <Compile Include="Presets\Import.cs" />\r
-    <Compile Include="Presets\preset.cs" />\r
+    <Compile Include="frmActivityWindow.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="frmActivityWindow.Designer.cs">\r
+      <DependentUpon>frmActivityWindow.cs</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="Model\AudioTrack.cs" />\r
+    <Compile Include="Model\DriveInformation.cs" />\r
+    <Compile Include="Model\SourceType.cs" />\r
+    <Compile Include="Model\Subtitle.cs" />\r
+    <Compile Include="Presets\PlistPresetHandler.cs" />\r
+    <Compile Include="Presets\Preset.cs" />\r
     <Compile Include="Presets\PresetsHandler.cs" />\r
-    <Compile Include="EncodeQueue\EncodeAndQueueHandler.cs" />\r
-    <Compile Include="Functions\AppcastReader.cs" />\r
     <Compile Include="Functions\QueryParser.cs" />\r
-    <Compile Include="Parsing\AudioTrack.cs" />\r
-    <Compile Include="Parsing\Chapter.cs" />\r
-    <Compile Include="Parsing\DVD.cs" />\r
-    <Compile Include="Parsing\Parser.cs" />\r
-    <Compile Include="Parsing\Subtitle.cs" />\r
-    <Compile Include="Parsing\Title.cs" />\r
     <Compile Include="Program.cs" />\r
-    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="ToolWindows\BatchAdd.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="ToolWindows\BatchAdd.Designer.cs">\r
+      <DependentUpon>BatchAdd.cs</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="ToolWindows\PreviewOverlay.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="ToolWindows\PreviewOverlay.Designer.cs">\r
+      <DependentUpon>PreviewOverlay.cs</DependentUpon>\r
+    </Compile>\r
+    <Compile Include="ToolWindows\TitleSpecificScan.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
+    <Compile Include="ToolWindows\TitleSpecificScan.Designer.cs">\r
+      <DependentUpon>TitleSpecificScan.cs</DependentUpon>\r
+    </Compile>\r
     <EmbeddedResource Include="Controls\AudioPanel.resx">\r
       <DependentUpon>AudioPanel.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
       <DependentUpon>frmPreview.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
-    <EmbeddedResource Include="frmActivityWindow.resx">\r
-      <DependentUpon>frmActivityWindow.cs</DependentUpon>\r
-      <SubType>Designer</SubType>\r
-    </EmbeddedResource>\r
     <EmbeddedResource Include="frmAbout.resx">\r
       <SubType>Designer</SubType>\r
       <DependentUpon>frmAbout.cs</DependentUpon>\r
       <DependentUpon>frmAddPreset.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
-    <EmbeddedResource Include="frmDownload.resx">\r
-      <SubType>Designer</SubType>\r
-      <DependentUpon>frmDownload.cs</DependentUpon>\r
-    </EmbeddedResource>\r
     <EmbeddedResource Include="frmMain.resx">\r
       <SubType>Designer</SubType>\r
       <DependentUpon>frmMain.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
       <DependentUpon>frmQueue.cs</DependentUpon>\r
     </EmbeddedResource>\r
-    <EmbeddedResource Include="frmUpdater.resx">\r
-      <DependentUpon>frmUpdater.cs</DependentUpon>\r
+    <EmbeddedResource Include="frmActivityWindow.resx">\r
+      <DependentUpon>frmActivityWindow.cs</DependentUpon>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
     <EmbeddedResource Include="Properties\Resources.resx">\r
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>\r
       <SubType>Designer</SubType>\r
     </EmbeddedResource>\r
-    <EmbeddedResource Include="frmSplashScreen.resx">\r
-      <SubType>Designer</SubType>\r
-      <DependentUpon>frmSplashScreen.cs</DependentUpon>\r
-    </EmbeddedResource>\r
     <Compile Include="Properties\Resources.Designer.cs">\r
       <AutoGen>True</AutoGen>\r
       <DependentUpon>Resources.resx</DependentUpon>\r
       <DesignTime>True</DesignTime>\r
     </Compile>\r
+    <EmbeddedResource Include="ToolWindows\BatchAdd.resx">\r
+      <DependentUpon>BatchAdd.cs</DependentUpon>\r
+    </EmbeddedResource>\r
+    <EmbeddedResource Include="ToolWindows\PreviewOverlay.resx">\r
+      <DependentUpon>PreviewOverlay.cs</DependentUpon>\r
+    </EmbeddedResource>\r
+    <EmbeddedResource Include="ToolWindows\TitleSpecificScan.resx">\r
+      <DependentUpon>TitleSpecificScan.cs</DependentUpon>\r
+    </EmbeddedResource>\r
     <None Include="app.config" />\r
+    <None Include="Installer\MakeNightly.nsi.tmpl" />\r
+    <None Include="Installer\MakeNightly.nsi" />\r
+    <None Include="Installer\Installer.nsi" />\r
     <None Include="Properties\Settings.settings">\r
       <Generator>SettingsSingleFileGenerator</Generator>\r
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>\r
       <DependentUpon>Settings.settings</DependentUpon>\r
       <DesignTimeSharedInput>True</DesignTimeSharedInput>\r
     </Compile>\r
-    <Compile Include="frmSplashScreen.cs">\r
-      <SubType>Form</SubType>\r
-    </Compile>\r
-    <Compile Include="frmSplashScreen.Designer.cs">\r
-      <DependentUpon>frmSplashScreen.cs</DependentUpon>\r
-    </Compile>\r
-    <Compile Include="EncodeQueue\Job.cs" />\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <Content Include="Changelog.html" />\r
     <Content Include="handbrakepineapple.ico" />\r
+    <None Include="Properties\AssemblyInfo.cs.tmpl" />\r
     <None Include="Resources\logo64.png" />\r
     <None Include="Resources\logo128.png" />\r
     <None Include="Resources\ActivityWindow.png" />\r
     <None Include="Resources\Help16.png" />\r
     <None Include="Resources\info16.png" />\r
     <None Include="Resources\folder.png" />\r
+    <None Include="Resources\download.png" />\r
+    <None Include="Resources\ErrorX.png" />\r
     <Content Include="Resources\Output_Small.png" />\r
     <None Include="Resources\Pause.png" />\r
     <None Include="Resources\Play.png" />\r
     <Content Include="Resources\window.png" />\r
     <None Include="Resources\save.png" />\r
     <None Include="Resources\stop.png" />\r
-    <None Include="Resources\SplashScreen.jpg" />\r
     <None Include="Resources\Movies.png" />\r
     <None Include="Resources\General Preferences.png" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <BootstrapperPackage Include="Microsoft.Net.Client.3.5">\r
       <Visible>False</Visible>\r
-      <ProductName>.NET Framework Client Profile</ProductName>\r
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>\r
       <Install>false</Install>\r
     </BootstrapperPackage>\r
     <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">\r
       <Isolated>False</Isolated>\r
     </COMReference>\r
   </ItemGroup>\r
+  <ItemGroup>\r
+    <ProjectReference Include="HandBrake.ApplicationServices\HandBrake.ApplicationServices.csproj">\r
+      <Project>{087A2BA8-BAC2-4577-A46F-07FF9D420016}</Project>\r
+      <Name>HandBrake.ApplicationServices</Name>\r
+    </ProjectReference>\r
+    <ProjectReference Include="HandBrake.Framework\HandBrake.Framework.csproj">\r
+      <Project>{49AD42C1-BF9B-4D78-A644-020878FAADE6}</Project>\r
+      <Name>HandBrake.Framework</Name>\r
+    </ProjectReference>\r
+  </ItemGroup>\r
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />\r
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
        Other similar extension points exist, see Microsoft.Common.targets.\r
   <Target Name="AfterBuild">\r
   </Target>\r
   -->\r
+  <Import Project="$(ProgramFiles)\MSBuild\Microsoft\StyleCop\v4.4\Microsoft.StyleCop.targets" />\r
+  <PropertyGroup Condition=" '$(Configuration)' == 'Install' ">\r
+    <PostBuildEvent>\r
+       cd ../../\r
+       copy Installer\Installer.nsi bin\Install /Y\r
+       copy handbrakepineapple.ico bin\Install /Y\r
+       xcopy doc bin\Install\doc /I /Y\r
+       cd bin\Install\r
+       makensis Installer.nsi\r
+       </PostBuildEvent>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)' == 'NightlyBuild' ">\r
+    <PostBuildEvent>\r
+       cd ../../\r
+       copy Installer\MakeNightly.nsi bin\NightlyBuild /Y\r
+       copy handbrakepineapple.ico bin\NightlyBuild /Y\r
+       xcopy doc bin\NightlyBuild\doc /I /Y\r
+       cd bin\NightlyBuild\r
+       makensis MakeNightly.nsi\r
+       </PostBuildEvent>\r
+  </PropertyGroup>\r
+  <PropertyGroup>\r
+    <PreBuildEvent>\r
+       subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"\r
+       subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.cs.tmpl" "$(ProjectDir)Properties\AssemblyInfo.cs"\r
+subwcrev.exe "$(ProjectDir)." "$(ProjectDir)Installer\MakeNightly.nsi.tmpl" "$(ProjectDir)Installer\MakeNightly.nsi"</PreBuildEvent>\r
+  </PropertyGroup>\r
 </Project>
\ No newline at end of file
index 5f0cad7..0ea0cb9 100644 (file)
@@ -7,13 +7,18 @@
 ; Script generated by the HM NIS Edit Script Wizard.\r
 \r
 ; HM NIS Edit Wizard helper defines\r
-!define PRODUCT_NAME "Handbrake"\r
-!define PRODUCT_VERSION "SVN 2754 Snapshot"\r
-!define PRODUCT_VERSION_NUMBER "svn2754"\r
+!define PRODUCT_NAME "HandBrake"\r
+!define PRODUCT_VERSION "0.9.5"\r
+!define PRODUCT_VERSION_NUMBER "0.9.5"\r
 !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Handbrake.exe"\r
 !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"\r
 !define PRODUCT_UNINST_ROOT_KEY "HKLM"\r
 \r
+;Required .NET framework\r
+!define MIN_FRA_MAJOR "3"\r
+!define MIN_FRA_MINOR "5"\r
+!define MIN_FRA_BUILD "*"\r
+\r
 SetCompressor lzma\r
 \r
 ; MUI 1.67 compatible ------\r
@@ -25,7 +30,7 @@ SetCompressor lzma
 !define MUI_UNICON "handbrakepineapple.ico"\r
 \r
 ; Welcome page\r
-!insertmacro MUI_PAGE_WELCOME\r
+!insertmacro MUI_PAGE_WELCOME \r
 ; License page\r
 !insertmacro MUI_PAGE_LICENSE "doc\COPYING"\r
 ; Directory page\r
@@ -45,51 +50,78 @@ SetCompressor lzma
 ; MUI end ------\r
 \r
 Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
-OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI_CLI.exe"\r
+OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe"\r
 \r
 !include WordFunc.nsh\r
 !insertmacro VersionCompare\r
 !include LogicLib.nsh\r
 \r
-; Check to see if .NET Framework 2.0 or above is Installed.\r
+InstallDir "$PROGRAMFILES\Handbrake"\r
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
+ShowInstDetails show\r
+ShowUnInstDetails show\r
+\r
+Var InstallDotNET\r
+\r
 Function .onInit\r
-  Call GetDotNETVersion\r
-  Pop $0\r
-  ${If} $0 == "not found"\r
-    MessageBox MB_OK|MB_ICONSTOP ".NET runtime library is not installed. $\r$\n You can download .Net Framework 2.0 redistributable from the microsoft website. $\r$\n Alternatively you can use google for a direct download URL"\r
-    Abort\r
-  ${EndIf}\r
 \r
-  StrCpy $0 $0 "" 1 # skip "v"\r
+  ; Begin Only allow one version\r
+  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'\r
+  Pop $R0\r
 \r
-  ${VersionCompare} $0 "2.0" $1\r
-  ${If} $1 == 2\r
-    MessageBox MB_OK|MB_ICONSTOP ".NET runtime library v2.0 or newer is required. You have $0. $\r$\n You can download .Net Framework 2.0 redistributable from the Microsoft website. $\r$\n Alternatively you can use google for a direct download URL"\r
-    Abort\r
-  ${EndIf}\r
-FunctionEnd\r
+  StrCmp $R0 0 +3\r
+  MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."\r
+  Abort\r
 \r
-Function GetDotNETVersion\r
-  Push $0\r
-  Push $1\r
+  ;Remove previous version\r
+  ReadRegStr $R0 HKLM \\r
+  "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \\r
+  "UninstallString"\r
+  StrCmp $R0 "" done\r
 \r
-  System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u"\r
-  StrCmp $1 "error" 0 +2\r
-    StrCpy $0 "not found"\r
+  MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \\r
+  "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \\r
+  previous version or `Cancel` to continue." \\r
+  IDOK uninst\r
+  goto done\r
 \r
-  Pop $1\r
-  Exch $0\r
+ ;Run the uninstaller\r
+  uninst:\r
+   Exec $INSTDIR\uninst.exe\r
+  done:\r
 FunctionEnd\r
 \r
 \r
-InstallDir "$PROGRAMFILES\Handbrake"\r
-InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
-ShowInstDetails show\r
-ShowUnInstDetails show\r
-\r
 Section "Handbrake" SEC01\r
   SetOutPath "$INSTDIR"\r
   SetOverwrite ifnewer\r
+  \r
+  ; Begin Check .NET version\r
+  StrCpy $InstallDotNET "No"\r
+  Call CheckFramework\r
+     StrCmp $0 "1" +3\r
+        StrCpy $InstallDotNET "Yes"\r
+      MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 3.5 SP1 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}."\r
+     Pop $0\r
+\r
+  ; Get .NET if required\r
+  ${If} $InstallDotNET == "Yes"\r
+     SetDetailsView hide\r
+     inetc::get /caption "Downloading .NET Framework 3.5" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=ab99342f-5d1a-413d-8319-81da479ab0d7&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f0%2f6%2f1%2f061f001c-8752-4600-a198-53214c69b51f%2fdotnetfx35setup.exe" "$INSTDIR\dotnetfx.exe" /end\r
+     Pop $1\r
+\r
+     ${If} $1 != "OK"\r
+           Delete "$INSTDIR\dotnetfx.exe"\r
+           Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 3.5 Framework"\r
+     ${EndIf}\r
+\r
+     ExecWait "$INSTDIR\dotnetfx.exe"\r
+     Delete "$INSTDIR\dotnetfx.exe"\r
+\r
+     SetDetailsView show\r
+  ${EndIf}\r
+\r
+  ; Install Files\r
   File "Handbrake.exe"\r
   CreateDirectory "$SMPROGRAMS\Handbrake"\r
   CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe"\r
@@ -99,11 +131,22 @@ Section "Handbrake" SEC01
   File "AxInterop.QTOControlLib.dll"\r
   File "Growl.Connector.dll"\r
   File "Growl.CoreLibrary.dll"\r
-  File "libgcc_s_sjlj-1.dll"\r
   File "HandBrakeCLI.exe"\r
   File "Handbrake.exe.config"\r
   File "handbrakepineapple.ico"\r
+  File "HandBrake.ApplicationServices.dll"\r
+  File "HandBrake.Framework.dll"\r
+  File "Microsoft.WindowsAPICodePack.Shell.dll"\r
+  File "Microsoft.WindowsAPICodePack.dll"\r
 \r
+  ;File "Caliburn.Castle.dll"\r
+  ;File "Caliburn.Core.dll"\r
+  ;File "Castle.Core.dll"\r
+  ;File "Castle.DynamicProxy2.dll"\r
+  ;File "Castle.MicroKernel.dll"\r
+  ;File "Castle.Windsor.dll"\r
+  ;File "Microsoft.Practices.ServiceLocation.dll"\r
\r
   SetOutPath "$INSTDIR\doc"\r
   SetOverwrite ifnewer\r
   File "doc\AUTHORS"\r
@@ -127,7 +170,6 @@ Section -Post
   WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"\r
 SectionEnd\r
 \r
-\r
 Function un.onUninstSuccess\r
   HideWindow\r
   MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."\r
@@ -151,6 +193,19 @@ Section Uninstall
   Delete "$INSTDIR\Growl.Connector.dll"\r
   Delete "$INSTDIR\Growl.CoreLibrary.dll"\r
   Delete "$INSTDIR\libgcc_s_sjlj-1.dll"\r
+  Delete "$INSTDIR\HandBrake.ApplicationServices.dll"\r
+  Delete "$INSTDIR\HandBrake.Framework.dll"\r
+  Delete "$INSTDIR\Microsoft.WindowsAPICodePack.Shell.dll"\r
+  Delete "$INSTDIR\Microsoft.WindowsAPICodePack.dll"\r
+\r
+  Delete "$INSTDIR\Caliburn.Castle.dll"\r
+  Delete "$INSTDIR\Caliburn.Core.dll"\r
+  Delete "$INSTDIR\Castle.Core.dll"\r
+  Delete "$INSTDIR\Castle.DynamicProxy2.dll"\r
+  Delete "$INSTDIR\Castle.MicroKernel.dll"\r
+  Delete "$INSTDIR\Castle.Windsor.dll"\r
+  Delete "$INSTDIR\Microsoft.Practices.ServiceLocation.dll"\r
+\r
   Delete "$INSTDIR\doc\AUTHORS"\r
   Delete "$INSTDIR\doc\COPYING"\r
   Delete "$INSTDIR\doc\CREDITS"\r
@@ -167,4 +222,138 @@ Section Uninstall
   DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"\r
   DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"\r
   SetAutoClose true\r
-SectionEnd
\ No newline at end of file
+SectionEnd\r
+\r
+;Check for .NET framework\r
+Function CheckFrameWork\r
+\r
+   ;Save the variables in case something else is using them\r
+  Push $0\r
+  Push $1\r
+  Push $2\r
+  Push $3\r
+  Push $4\r
+  Push $R1\r
+  Push $R2\r
+  Push $R3\r
+  Push $R4\r
+  Push $R5\r
+  Push $R6\r
+  Push $R7\r
+  Push $R8\r
+\r
+  StrCpy $R5 "0"\r
+  StrCpy $R6 "0"\r
+  StrCpy $R7 "0"\r
+  StrCpy $R8 "0.0.0"\r
+  StrCpy $0 0\r
+\r
+  loop:\r
+\r
+  ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP"\r
+  EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0\r
+  StrCmp $1 "" done ;jump to end if no more registry keys\r
+  IntOp $0 $0 + 1\r
+  StrCpy $2 $1 1 ;Cut off the first character\r
+  StrCpy $3 $1 "" 1 ;Remainder of string\r
+\r
+  ;Loop if first character is not a 'v'\r
+  StrCmpS $2 "v" start_parse loop\r
+\r
+  ;Parse the string\r
+  start_parse:\r
+  StrCpy $R1 ""\r
+  StrCpy $R2 ""\r
+  StrCpy $R3 ""\r
+  StrCpy $R4 $3\r
+\r
+  StrCpy $4 1\r
+\r
+  parse:\r
+  StrCmp $3 "" parse_done ;If string is empty, we are finished\r
+  StrCpy $2 $3 1 ;Cut off the first character\r
+  StrCpy $3 $3 "" 1 ;Remainder of string\r
+  StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot\r
+\r
+  is_dot:\r
+  IntOp $4 $4 + 1 ; Move to the next section\r
+  goto parse ;Carry on parsing\r
+\r
+  not_dot:\r
+  IntCmp $4 1 major_ver\r
+  IntCmp $4 2 minor_ver\r
+  IntCmp $4 3 build_ver\r
+  IntCmp $4 4 parse_done\r
+\r
+  major_ver:\r
+  StrCpy $R1 $R1$2\r
+  goto parse ;Carry on parsing\r
+\r
+  minor_ver:\r
+  StrCpy $R2 $R2$2\r
+  goto parse ;Carry on parsing\r
+\r
+  build_ver:\r
+  StrCpy $R3 $R3$2\r
+  goto parse ;Carry on parsing\r
+\r
+  parse_done:\r
+\r
+  IntCmp $R1 $R5 this_major_same loop this_major_more\r
+  this_major_more:\r
+  StrCpy $R5 $R1\r
+  StrCpy $R6 $R2\r
+  StrCpy $R7 $R3\r
+  StrCpy $R8 $R4\r
+\r
+  goto loop\r
+\r
+  this_major_same:\r
+  IntCmp $R2 $R6 this_minor_same loop this_minor_more\r
+  this_minor_more:\r
+  StrCpy $R6 $R2\r
+  StrCpy $R7 R3\r
+  StrCpy $R8 $R4\r
+  goto loop\r
+\r
+  this_minor_same:\r
+  IntCmp $R3 $R7 loop loop this_build_more\r
+  this_build_more:\r
+  StrCpy $R7 $R3\r
+  StrCpy $R8 $R4\r
+  goto loop\r
+\r
+  done:\r
+\r
+  ;Have we got the framework we need?\r
+  IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK\r
+  max_major_same:\r
+  IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK\r
+  max_minor_same:\r
+  IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK\r
+\r
+  ;Version on machine is greater than what we need\r
+  OK:\r
+  StrCpy $0 "1"\r
+  goto end\r
+\r
+  fail:\r
+  StrCmp $R8 "0.0.0" end\r
+\r
+\r
+  end:\r
+\r
+  ;Pop the variables we pushed earlier\r
+  Pop $R8\r
+  Pop $R7\r
+  Pop $R6\r
+  Pop $R5\r
+  Pop $R4\r
+  Pop $R3\r
+  Pop $R2\r
+  Pop $R1\r
+  Pop $4\r
+  Pop $3\r
+  Pop $2\r
+  Pop $1\r
+FunctionEnd
\ No newline at end of file
diff --git a/win/C#/Installer/MakeNightly.nsi.tmpl b/win/C#/Installer/MakeNightly.nsi.tmpl
new file mode 100644 (file)
index 0000000..55db341
--- /dev/null
@@ -0,0 +1,359 @@
+/*  Resources.Designer.cs $\r
+\r
+          This file is part of the HandBrake source code.\r
+          Homepage: <http://handbrake.fr/>.\r
+          It may be used under the terms of the GNU General Public License. */\r
+\r
+; Script generated by the HM NIS Edit Script Wizard.\r
+\r
+; HM NIS Edit Wizard helper defines\r
+!define PRODUCT_NAME "Handbrake"\r
+!define PRODUCT_VERSION "$WCREV$ Nightly"\r
+!define PRODUCT_VERSION_NUMBER "svn$WCREV$"\r
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Handbrake.exe"\r
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"\r
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"\r
+\r
+;Required .NET framework\r
+!define MIN_FRA_MAJOR "3"\r
+!define MIN_FRA_MINOR "5"\r
+!define MIN_FRA_BUILD "*"\r
+\r
+SetCompressor lzma\r
+\r
+; MUI 1.67 compatible ------\r
+!include "MUI.nsh"\r
+\r
+; MUI Settings\r
+!define MUI_ABORTWARNING\r
+!define MUI_ICON "handbrakepineapple.ico"\r
+!define MUI_UNICON "handbrakepineapple.ico"\r
+\r
+; Welcome page\r
+!insertmacro MUI_PAGE_WELCOME\r
+; License page\r
+!insertmacro MUI_PAGE_LICENSE "doc\COPYING"\r
+; Directory page\r
+!insertmacro MUI_PAGE_DIRECTORY\r
+; Instfiles page\r
+!insertmacro MUI_PAGE_INSTFILES\r
+; Finish page\r
+!define MUI_FINISHPAGE_RUN "$INSTDIR\Handbrake.exe"\r
+!insertmacro MUI_PAGE_FINISH\r
+\r
+; Uninstaller pages\r
+!insertmacro MUI_UNPAGE_INSTFILES\r
+\r
+; Language files\r
+!insertmacro MUI_LANGUAGE "English"\r
+\r
+; MUI end ------\r
+\r
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"\r
+OutFile "HandBrake-${PRODUCT_VERSION_NUMBER}-Win_GUI.exe"\r
+\r
+!include WordFunc.nsh\r
+!insertmacro VersionCompare\r
+!include LogicLib.nsh\r
+\r
+InstallDir "$PROGRAMFILES\Handbrake"\r
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""\r
+ShowInstDetails show\r
+ShowUnInstDetails show\r
+\r
+Var InstallDotNET\r
+\r
+Function .onInit\r
+\r
+  ; Begin Only allow one version\r
+  System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'\r
+  Pop $R0\r
+\r
+  StrCmp $R0 0 +3\r
+  MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."\r
+  Abort\r
+\r
+  ;Remove previous version\r
+  ReadRegStr $R0 HKLM \\r
+  "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}\" \\r
+  "UninstallString"\r
+  StrCmp $R0 "" done\r
+\r
+  MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \\r
+  "${PRODUCT_NAME} is already installed. $\n$\nClick `OK` to remove the \\r
+  previous version or `Cancel` to continue." \\r
+  IDOK uninst\r
+  goto done\r
+\r
+ ;Run the uninstaller\r
+  uninst:\r
+   Exec $INSTDIR\uninst.exe\r
+  done:\r
+FunctionEnd\r
+\r
+Section "Handbrake" SEC01\r
+  SetOutPath "$INSTDIR"\r
+  SetOverwrite ifnewer\r
+\r
+  ; Begin Check .NET version\r
+  StrCpy $InstallDotNET "No"\r
+  Call CheckFramework\r
+     StrCmp $0 "1" +3\r
+        StrCpy $InstallDotNET "Yes"\r
+      MessageBox MB_OK|MB_ICONINFORMATION "${PRODUCT_NAME} requires that the .NET Framework 3.5 SP1 is installed. The latest .NET Framework will be downloaded and installed automatically during installation of ${PRODUCT_NAME}."\r
+     Pop $0\r
+\r
+  ; Get .NET if required\r
+  ${If} $InstallDotNET == "Yes"\r
+     SetDetailsView hide\r
+     inetc::get /caption "Downloading .NET Framework 3.5" /canceltext "Cancel" "http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=ab99342f-5d1a-413d-8319-81da479ab0d7&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f0%2f6%2f1%2f061f001c-8752-4600-a198-53214c69b51f%2fdotnetfx35setup.exe" "$INSTDIR\dotnetfx.exe" /end\r
+     Pop $1\r
+\r
+     ${If} $1 != "OK"\r
+           Delete "$INSTDIR\dotnetfx.exe"\r
+           Abort "Installation cancelled, ${PRODUCT_NAME} requires the .NET 3.5 Framework"\r
+     ${EndIf}\r
+\r
+     ExecWait "$INSTDIR\dotnetfx.exe"\r
+     Delete "$INSTDIR\dotnetfx.exe"\r
+\r
+     SetDetailsView show\r
+  ${EndIf}\r
+  \r
+  ; Install Files\r
+  File "Handbrake.exe"\r
+  File "HandBrakeCLI.exe"\r
+  CreateDirectory "$SMPROGRAMS\Handbrake"\r
+  CreateShortCut "$SMPROGRAMS\Handbrake\Handbrake.lnk" "$INSTDIR\Handbrake.exe"\r
+  CreateShortCut "$DESKTOP\Handbrake.lnk" "$INSTDIR\Handbrake.exe"\r
+  File "Interop.QTOLibrary.dll"\r
+  File "Interop.QTOControlLib.dll"\r
+  File "AxInterop.QTOControlLib.dll"\r
+  File "Growl.Connector.dll"\r
+  File "Growl.CoreLibrary.dll"\r
+  File "Handbrake.exe.config"\r
+  File "HandBrake.ApplicationServices.dll"\r
+  File "HandBrake.Framework.dll"\r
+  File "Microsoft.WindowsAPICodePack.Shell.dll"\r
+  File "Microsoft.WindowsAPICodePack.dll"\r
+\r
+  ;File "Caliburn.Castle.dll"\r
+  ;File "Caliburn.Core.dll"\r
+  ;File "Castle.Core.dll"\r
+  ;File "Castle.DynamicProxy2.dll"\r
+  ;File "Castle.MicroKernel.dll"\r
+  ;File "Castle.Windsor.dll"\r
+  ;File "Microsoft.Practices.ServiceLocation.dll"\r
+\r
+  ; Copy the standard doc set into the doc folder\r
+  SetOutPath "$INSTDIR\doc"\r
+  SetOverwrite ifnewer\r
+  File "doc\AUTHORS"\r
+  File "doc\COPYING"\r
+  File "doc\CREDITS"\r
+  File "doc\NEWS"\r
+  File "doc\THANKS"\r
+  File "doc\TRANSLATIONS"\r
+SectionEnd\r
+\r
+Section -AdditionalIcons\r
+  CreateShortCut "$SMPROGRAMS\Handbrake\Uninstall.lnk" "$INSTDIR\uninst.exe"\r
+SectionEnd\r
+\r
+Section -Post\r
+  WriteUninstaller "$INSTDIR\uninst.exe"\r
+  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Handbrake.exe"\r
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"\r
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"\r
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Handbrake.exe"\r
+  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"\r
+SectionEnd\r
+\r
+\r
+Function un.onUninstSuccess\r
+  HideWindow\r
+  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer."\r
+FunctionEnd\r
+\r
+Function un.onInit\r
+  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name) and all of its components?" IDYES +2\r
+  Abort\r
+FunctionEnd\r
+\r
+Section Uninstall\r
+  Delete "$INSTDIR\uninst.exe"\r
+  \r
+  Delete "$INSTDIR\Interop.QTOLibrary.dll"\r
+  Delete "$INSTDIR\Interop.QTOControlLib.dll"\r
+  Delete "$INSTDIR\AxInterop.QTOControlLib.dll"\r
+  Delete "$INSTDIR\HandBrakeCLI.exe"\r
+  Delete "$INSTDIR\handbrakepineapple.ico"\r
+  Delete "$INSTDIR\Handbrake.exe"\r
+  Delete "$INSTDIR\Handbrake.exe.config"\r
+  Delete "$INSTDIR\Growl.Connector.dll"\r
+  Delete "$INSTDIR\Growl.CoreLibrary.dll"\r
+  Delete "$INSTDIR\libgcc_s_sjlj-1.dll"\r
+  Delete "$INSTDIR\HandBrake.ApplicationServices.dll"\r
+  Delete "$INSTDIR\HandBrake.Framework.dll"\r
+  Delete "$INSTDIR\Microsoft.WindowsAPICodePack.Shell.dll"\r
+  Delete "$INSTDIR\Microsoft.WindowsAPICodePack.dll"\r
+\r
+  Delete "$INSTDIR\Caliburn.Castle.dll"\r
+  Delete "$INSTDIR\Caliburn.Core.dll"\r
+  Delete "$INSTDIR\Castle.Core.dll"\r
+  Delete "$INSTDIR\Castle.DynamicProxy2.dll"\r
+  Delete "$INSTDIR\Castle.MicroKernel.dll"\r
+  Delete "$INSTDIR\Castle.Windsor.dll"\r
+  Delete "$INSTDIR\Microsoft.Practices.ServiceLocation.dll"\r
+\r
+  Delete "$INSTDIR\doc\AUTHORS"\r
+  Delete "$INSTDIR\doc\COPYING"\r
+  Delete "$INSTDIR\doc\CREDITS"\r
+  Delete "$INSTDIR\doc\NEWS"\r
+  Delete "$INSTDIR\doc\THANKS"\r
+  Delete "$INSTDIR\doc\TRANSLATIONS"\r
+  RMDir  "$INSTDIR"\r
+  Delete "$SMPROGRAMS\Handbrake\Uninstall.lnk"\r
+  Delete "$DESKTOP\Handbrake.lnk"\r
+  Delete "$SMPROGRAMS\Handbrake\Handbrake.lnk"\r
+  RMDir  "$SMPROGRAMS\Handbrake"\r
+  RMDir  "$INSTDIR"\r
+\r
+  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"\r
+  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"\r
+  SetAutoClose true\r
+SectionEnd\r
+\r
+;Check for .NET framework\r
+Function CheckFrameWork\r
+\r
+   ;Save the variables in case something else is using them\r
+  Push $0\r
+  Push $1\r
+  Push $2\r
+  Push $3\r
+  Push $4\r
+  Push $R1\r
+  Push $R2\r
+  Push $R3\r
+  Push $R4\r
+  Push $R5\r
+  Push $R6\r
+  Push $R7\r
+  Push $R8\r
+\r
+  StrCpy $R5 "0"\r
+  StrCpy $R6 "0"\r
+  StrCpy $R7 "0"\r
+  StrCpy $R8 "0.0.0"\r
+  StrCpy $0 0\r
+\r
+  loop:\r
+\r
+  ;Get each sub key under "SOFTWARE\Microsoft\NET Framework Setup\NDP"\r
+  EnumRegKey $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP" $0\r
+  StrCmp $1 "" done ;jump to end if no more registry keys\r
+  IntOp $0 $0 + 1\r
+  StrCpy $2 $1 1 ;Cut off the first character\r
+  StrCpy $3 $1 "" 1 ;Remainder of string\r
+\r
+  ;Loop if first character is not a 'v'\r
+  StrCmpS $2 "v" start_parse loop\r
+\r
+  ;Parse the string\r
+  start_parse:\r
+  StrCpy $R1 ""\r
+  StrCpy $R2 ""\r
+  StrCpy $R3 ""\r
+  StrCpy $R4 $3\r
+\r
+  StrCpy $4 1\r
+\r
+  parse:\r
+  StrCmp $3 "" parse_done ;If string is empty, we are finished\r
+  StrCpy $2 $3 1 ;Cut off the first character\r
+  StrCpy $3 $3 "" 1 ;Remainder of string\r
+  StrCmp $2 "." is_dot not_dot ;Move to next part if it's a dot\r
+\r
+  is_dot:\r
+  IntOp $4 $4 + 1 ; Move to the next section\r
+  goto parse ;Carry on parsing\r
+\r
+  not_dot:\r
+  IntCmp $4 1 major_ver\r
+  IntCmp $4 2 minor_ver\r
+  IntCmp $4 3 build_ver\r
+  IntCmp $4 4 parse_done\r
+\r
+  major_ver:\r
+  StrCpy $R1 $R1$2\r
+  goto parse ;Carry on parsing\r
+\r
+  minor_ver:\r
+  StrCpy $R2 $R2$2\r
+  goto parse ;Carry on parsing\r
+\r
+  build_ver:\r
+  StrCpy $R3 $R3$2\r
+  goto parse ;Carry on parsing\r
+\r
+  parse_done:\r
+\r
+  IntCmp $R1 $R5 this_major_same loop this_major_more\r
+  this_major_more:\r
+  StrCpy $R5 $R1\r
+  StrCpy $R6 $R2\r
+  StrCpy $R7 $R3\r
+  StrCpy $R8 $R4\r
+\r
+  goto loop\r
+\r
+  this_major_same:\r
+  IntCmp $R2 $R6 this_minor_same loop this_minor_more\r
+  this_minor_more:\r
+  StrCpy $R6 $R2\r
+  StrCpy $R7 R3\r
+  StrCpy $R8 $R4\r
+  goto loop\r
+\r
+  this_minor_same:\r
+  IntCmp $R3 $R7 loop loop this_build_more\r
+  this_build_more:\r
+  StrCpy $R7 $R3\r
+  StrCpy $R8 $R4\r
+  goto loop\r
+\r
+  done:\r
+\r
+  ;Have we got the framework we need?\r
+  IntCmp $R5 ${MIN_FRA_MAJOR} max_major_same fail OK\r
+  max_major_same:\r
+  IntCmp $R6 ${MIN_FRA_MINOR} max_minor_same fail OK\r
+  max_minor_same:\r
+  IntCmp $R7 ${MIN_FRA_BUILD} OK fail OK\r
+\r
+  ;Version on machine is greater than what we need\r
+  OK:\r
+  StrCpy $0 "1"\r
+  goto end\r
+\r
+  fail:\r
+  StrCmp $R8 "0.0.0" end\r
+\r
+\r
+  end:\r
+\r
+  ;Pop the variables we pushed earlier\r
+  Pop $R8\r
+  Pop $R7\r
+  Pop $R6\r
+  Pop $R5\r
+  Pop $R4\r
+  Pop $R3\r
+  Pop $R2\r
+  Pop $R1\r
+  Pop $4\r
+  Pop $3\r
+  Pop $2\r
+  Pop $1\r
+FunctionEnd
\ No newline at end of file
diff --git a/win/C#/Model/ActivityLogMode.cs b/win/C#/Model/ActivityLogMode.cs
new file mode 100644 (file)
index 0000000..1ab699e
--- /dev/null
@@ -0,0 +1,23 @@
+/*  ActivityLogMode.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// The Log Mode, either scan or encode\r
+    /// </summary>\r
+    public enum ActivityLogMode\r
+    {\r
+        /// <summary>\r
+        /// Scan Mode\r
+        /// </summary>\r
+        Scan,\r
+\r
+        /// <summary>\r
+        /// Encode mode\r
+        /// </summary>\r
+        Encode\r
+    }\r
+}\r
diff --git a/win/C#/Model/AudioTrack.cs b/win/C#/Model/AudioTrack.cs
new file mode 100644 (file)
index 0000000..04b12ce
--- /dev/null
@@ -0,0 +1,56 @@
+/*  AudioTrack.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// An Audio Track for the Audio Panel\r
+    /// </summary>\r
+    public class AudioTrack\r
+    {\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="AudioTrack"/> class. \r
+        /// </summary>\r
+        public AudioTrack()\r
+        {\r
+            // Default Values\r
+            this.Track = "Automatic";\r
+            this.MixDown = "Automatic";\r
+            this.SampleRate = "Auto";\r
+            this.Bitrate = "Auto";\r
+            this.DRC = "1";\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Audio Track Name\r
+        /// </summary>\r
+        public string Track { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Audio Mixdown\r
+        /// </summary>\r
+        public string MixDown { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Audio Encoder\r
+        /// </summary>\r
+        public string Encoder { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Audio Bitrate\r
+        /// </summary>\r
+        public string Bitrate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Audio SampleRate\r
+        /// </summary>\r
+        public string SampleRate { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets Dynamic Range Compression\r
+        /// </summary>\r
+        public string DRC { get; set; }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Model/DriveInformation.cs b/win/C#/Model/DriveInformation.cs
new file mode 100644 (file)
index 0000000..d7cef0e
--- /dev/null
@@ -0,0 +1,39 @@
+/*  DriveInformation.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// Information about a DVD drive\r
+    /// </summary>\r
+    public class DriveInformation\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets A Unique ID That represemts this model.\r
+        /// </summary>\r
+        public int Id { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The Drive Volume Name\r
+        /// </summary>\r
+        public string VolumeLabel { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets The Root Directory\r
+        /// </summary>\r
+        public string RootDirectory { get; set; }\r
+\r
+        /// <summary>\r
+        /// Returns  "Drive" + Id  (e.g  Drive2)\r
+        /// </summary>\r
+        /// <returns>\r
+        /// A String that contrains "Drive" and it's ID\r
+        /// </returns>\r
+        public override string ToString()\r
+        {\r
+            return "Drive" + Id;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Model/QueryEncodeMode.cs b/win/C#/Model/QueryEncodeMode.cs
new file mode 100644 (file)
index 0000000..63e6ecc
--- /dev/null
@@ -0,0 +1,16 @@
+/*  AddPresetMode.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// Picture Settings Mode when adding presets\r
+    /// </summary>\r
+    public enum QueryEncodeMode\r
+    {\r
+        Preview,\r
+        Standard\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Model/QueryPictureSettingsMode.cs b/win/C#/Model/QueryPictureSettingsMode.cs
new file mode 100644 (file)
index 0000000..5390271
--- /dev/null
@@ -0,0 +1,18 @@
+/*  AddPresetMode.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// Picture Settings Mode when adding presets\r
+    /// </summary>\r
+    public enum QueryPictureSettingsMode\r
+    {\r
+        None,\r
+        Custom,\r
+        SourceMaximum,\r
+        UserInterfaceSettings\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Model/SourceType.cs b/win/C#/Model/SourceType.cs
new file mode 100644 (file)
index 0000000..2081ce9
--- /dev/null
@@ -0,0 +1,33 @@
+/*  SourceType.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    /// <summary>\r
+    /// The Type of source that the user has scanned\r
+    /// </summary>\r
+    public enum SourceType\r
+    {\r
+        /// <summary>\r
+        /// No Source Selected\r
+        /// </summary>\r
+        None = 0, \r
+\r
+        /// <summary>\r
+        /// The soruce selected is a folder\r
+        /// </summary>\r
+        Folder, \r
+\r
+        /// <summary>\r
+        /// The source selected is a DVD drive\r
+        /// </summary>\r
+        DvdDrive, \r
+\r
+        /// <summary>\r
+        /// The source selected is a Video File\r
+        /// </summary>\r
+        VideoFile\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Model/Subtitle.cs b/win/C#/Model/Subtitle.cs
new file mode 100644 (file)
index 0000000..605e3da
--- /dev/null
@@ -0,0 +1,93 @@
+/*  Subtitle.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Model\r
+{\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+\r
+    /// <summary>\r
+    /// Subtitle Information\r
+    /// </summary>\r
+    public class SubtitleInfo\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets the Subtitle Track\r
+        /// </summary>\r
+        public string Track { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Forced Subtitle\r
+        /// </summary>\r
+        public bool Forced { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Burned In Subtitle\r
+        /// </summary>\r
+        public bool Burned { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Default Subtitle Track\r
+        /// </summary>\r
+        public bool Default { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the SRT Language\r
+        /// </summary>\r
+        public string SrtLang { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the SRT Character Code\r
+        /// </summary>\r
+        public string SrtCharCode { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the SRT Offset\r
+        /// </summary>\r
+        public int SrtOffset { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Path to the SRT file\r
+        /// </summary>\r
+        public string SrtPath { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the SRT Filename\r
+        /// </summary>\r
+        public string SrtFileName { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets a value indicating whether this is an SRT subtitle.\r
+        /// </summary>\r
+        public bool IsSrtSubtitle\r
+        {\r
+            get { return this.SrtFileName != "-"; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the type of the subtitle\r
+        /// </summary>\r
+        public SubtitleType SubtitleType { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets A ListViewItem Containing information about this subitlte\r
+        /// </summary>\r
+        public ListViewItem ListView\r
+        {\r
+            get\r
+            {\r
+                var listTrack = new ListViewItem(this.Track);\r
+                listTrack.SubItems.Add(this.Forced ? "Yes" : "No");\r
+                listTrack.SubItems.Add(this.Burned ? "Yes" : "No");\r
+                listTrack.SubItems.Add(this.Default ? "Yes" : "No");\r
+                listTrack.SubItems.Add(this.SrtLang);\r
+                listTrack.SubItems.Add(this.SrtCharCode);\r
+                listTrack.SubItems.Add(this.SrtOffset.ToString());\r
+                return listTrack;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/Presets/PlistPresetHandler.cs b/win/C#/Presets/PlistPresetHandler.cs
new file mode 100644 (file)
index 0000000..87a29cc
--- /dev/null
@@ -0,0 +1,645 @@
+/*  PlistPresetHandler.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.Presets\r
+{\r
+    using System;\r
+    using System.Collections;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Windows.Forms;\r
+    using System.Xml;\r
+    using Functions;\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// Plist Preset Converter\r
+    /// </summary>\r
+    public class PlistPresetHandler\r
+    {\r
+        #region Import\r
+\r
+        public static QueryParser Import(string filename)\r
+        {\r
+            XmlNode root = loadFile(filename);\r
+            if (root == null) return null;\r
+\r
+            // We'll query a query parser object and use it's public var structures to store all the data.\r
+            // This will allow the preset loader logic to be used instead of writing custom logic just for this file.\r
+            QueryParser queryParsed = new QueryParser();\r
+            string qualityMode = string.Empty;\r
+\r
+            #region Get a List of Audio Track Objects\r
+            XmlNode audioListDict = root.ChildNodes[2].ChildNodes[0].FirstChild.ChildNodes[1];\r
+            ArrayList audioTracks = new ArrayList();\r
+\r
+            for (int i = 0; i < audioListDict.ChildNodes.Count; i++)\r
+            {\r
+                XmlNode audioChannel = audioListDict.ChildNodes[i];\r
+                AudioTrack track = new AudioTrack();\r
+\r
+                for (int subi = 0; subi < audioChannel.ChildNodes.Count; subi += 2)\r
+                {\r
+                    // Audio Channel Information is here.\r
+                    string key = audioChannel.ChildNodes[subi].InnerText;\r
+                    string value = audioChannel.ChildNodes[subi + 1].InnerText;\r
+                    switch (key)\r
+                    {\r
+                        case "AudioBitrate":\r
+                            track.Bitrate = value;\r
+                            break;\r
+                        case "AudioEncoder":\r
+                            track.Encoder = value.Replace("AAC (CoreAudio)", "AAC (faac)");\r
+                            break;\r
+                        case "AudioMixdown":\r
+                            track.MixDown = value;\r
+                            break;\r
+                        case "AudioSamplerate":\r
+                            track.SampleRate = value;\r
+                            break;\r
+                        case "AudioTrack":\r
+                            track.Track = value;\r
+                            break;\r
+                        case "AudioTrackDRCSlider":\r
+                            track.DRC = value;\r
+                            break;\r
+                    }\r
+                }\r
+                audioTracks.Add(track);\r
+                queryParsed.AudioInformation = audioTracks;\r
+            }\r
+            #endregion\r
+\r
+            #region Parse the reset of the plist keys into local variables\r
+\r
+            XmlNode presetSettings = root.ChildNodes[2].ChildNodes[0].FirstChild;\r
+\r
+            // Start from 2 to avoid the audio settings which we don't need.\r
+            for (int i = 2; i < presetSettings.ChildNodes.Count; i += 2)\r
+            {\r
+                string key = presetSettings.ChildNodes[i].InnerText;\r
+                string value = presetSettings.ChildNodes[i + 1].InnerText;\r
+\r
+                switch (key)\r
+                {\r
+                    // Output Settings\r
+                    case "FileFormat":\r
+                        queryParsed.Format = value;\r
+                        break;\r
+                    case "Mp4HttpOptimize":\r
+                        queryParsed.OptimizeMP4 = value == "1";\r
+                        break;\r
+                    case "Mp4LargeFile":\r
+                        queryParsed.LargeMP4 = value == "1";\r
+                        break;\r
+                    case "Mp4iPodCompatible":\r
+                        queryParsed.IpodAtom = value == "1";\r
+                        break;\r
+\r
+                    // Picture Settings\r
+                    case "PictureAutoCrop":\r
+                        // Not used\r
+                        break;\r
+                    case "PictureTopCrop":\r
+                        queryParsed.CropTop = value;\r
+                        break;\r
+                    case "PictureBottomCrop":\r
+                        queryParsed.CropBottom = value;\r
+                        break;\r
+                    case "PictureLeftCrop":\r
+                        queryParsed.CropLeft = value;\r
+                        break;\r
+                    case "PictureRightCrop":\r
+                        queryParsed.CropRight = value;\r
+                        break;\r
+                    case "PictureHeight":\r
+                        queryParsed.Height = int.Parse(value);\r
+                        break;\r
+                    case "PictureWidth":\r
+                        queryParsed.Width = int.Parse(value);\r
+                        break;\r
+                    case "PictureKeepRatio":\r
+                        queryParsed.KeepDisplayAsect = value == "1";\r
+                        break;\r
+                    case "PicturePAR":\r
+                        queryParsed.AnamorphicMode = int.Parse(value);\r
+                        break;\r
+\r
+                    // Filters\r
+                    case "PictureDeblock":\r
+                        queryParsed.DeBlock = int.Parse(value);\r
+                        break;\r
+                    case "PictureDecomb":\r
+                        queryParsed.Decomb = "Off";\r
+                        // Don't place custom here as it's handled in the filter panel\r
+                        if (value == "2") queryParsed.Decomb = "Default";\r
+                        break;\r
+                    case "PictureDecombCustom":\r
+                        if (value != string.Empty)\r
+                            queryParsed.Decomb = value;\r
+                        break;\r
+                    case "PictureDecombDeinterlace":\r
+                        // Not Used\r
+                        break;\r
+                    case "PictureDeinterlace":\r
+                        switch (value)\r
+                        {\r
+                            case "0":\r
+                                queryParsed.DeInterlace = "Off";\r
+                                break;\r
+                            // Don't place custom here as it's handled in the filter panel\r
+                            case "2":\r
+                                queryParsed.DeInterlace = "Fast";\r
+                                break;\r
+                            case "3":\r
+                                queryParsed.DeInterlace = "Slow";\r
+                                break;\r
+                            case "4":\r
+                                queryParsed.DeInterlace = "Slowest";\r
+                                break;\r
+                        }\r
+                        break;\r
+                    case "PictureDeinterlaceCustom":\r
+                        if (value != string.Empty)\r
+                            queryParsed.DeInterlace = value;\r
+                        break;\r
+                    case "PictureDenoise":\r
+                        switch (value)\r
+                        {\r
+                            case "0":\r
+                                queryParsed.DeNoise = "Off";\r
+                                break;\r
+                            // Don't place custom here as it's handled in the filter panel\r
+                            case "2":\r
+                                queryParsed.DeNoise = "Weak";\r
+                                break;\r
+                            case "3":\r
+                                queryParsed.DeNoise = "Medium";\r
+                                break;\r
+                            case "4":\r
+                                queryParsed.DeNoise = "Strong";\r
+                                break;\r
+                        }\r
+\r
+                        break;\r
+                    case "PictureDenoiseCustom":\r
+                        if (value != string.Empty)\r
+                            queryParsed.DeNoise = value;\r
+                        break;\r
+                    case "PictureDetelecine":\r
+                        queryParsed.DeTelecine = "Off";\r
+                        if (value == "1") queryParsed.DeTelecine = "Default";\r
+                        break;\r
+                    case "PictureDetelecineCustom":\r
+                        if (value != string.Empty)\r
+                            queryParsed.DeTelecine = value;\r
+                        break;\r
+\r
+                    // Video Tab\r
+                    case "VideoAvgBitrate":\r
+                        queryParsed.AverageVideoBitrate = value;\r
+                        break;\r
+                    case "VideoEncoder":\r
+                        queryParsed.VideoEncoder = value;\r
+                        break;\r
+                    case "VideoFramerate":\r
+                        queryParsed.VideoFramerate = value;\r
+                        break;\r
+                    case "VideoGrayScale":\r
+                        queryParsed.Grayscale = value == "1";\r
+                        break;\r
+                    case "VideoQualitySlider":\r
+                        queryParsed.VideoQuality = float.Parse(value);\r
+                        break;\r
+                    case "VideoQualityType": // The Type of Quality Mode used\r
+                        qualityMode = value;\r
+                        break;\r
+                    case "VideoTargetSize":\r
+                        queryParsed.VideoTargetSize = value;\r
+                        break;\r
+                    case "VideoTurboTwoPass":\r
+                        queryParsed.TurboFirstPass = value == "1";\r
+                        break;\r
+                    case "VideoTwoPass":\r
+                        queryParsed.TwoPass = value == "1";\r
+                        break;\r
+\r
+                    // Chapter Markers Tab\r
+                    case "ChapterMarkers":\r
+                        queryParsed.ChapterMarkers = value == "1";\r
+                        break;\r
+\r
+                    // Advanced x264 tab\r
+                    case "x264Option":\r
+                        queryParsed.H264Query = value;\r
+                        break;\r
+\r
+                    // Preset Information\r
+                    case "PresetBuildNumber":\r
+                        queryParsed.PresetBuildNumber = int.Parse(value);\r
+                        break;\r
+                    case "PresetDescription":\r
+                        queryParsed.PresetDescription = value;\r
+                        break;\r
+                    case "PresetName":\r
+                        queryParsed.PresetName = value;\r
+                        break;\r
+                    case "Type":\r
+                        queryParsed.Type = value;\r
+                        break;\r
+                    case "UsesMaxPictureSettings":\r
+                        queryParsed.UsesMaxPictureSettings = value == "1";\r
+                        break;\r
+                    case "UsesPictureFilters":\r
+                        queryParsed.UsesPictureFilters = value == "1";\r
+                        break;\r
+                    case "UsesPictureSettings":\r
+                        queryParsed.UsesPictureSettings = value == "1";\r
+                        break;\r
+                }\r
+            }\r
+\r
+            // Kill any Quality values we don't need.\r
+            switch (qualityMode)\r
+            {\r
+                case "0": // FileSize\r
+                    queryParsed.VideoQuality = -1;\r
+                    queryParsed.AverageVideoBitrate = null;\r
+                    break;\r
+                case "1": // Avg Bitrate\r
+                    queryParsed.VideoQuality = -1;\r
+                    queryParsed.VideoTargetSize = null;\r
+                    break;\r
+                case "2": // CQ\r
+                    queryParsed.AverageVideoBitrate = null;\r
+                    queryParsed.VideoTargetSize = null;\r
+                    break;\r
+            }\r
+            #endregion\r
+\r
+            return queryParsed;\r
+        }\r
+\r
+        private static XmlNode loadFile(string filename)\r
+        {\r
+            try\r
+            {\r
+                XmlNode root;\r
+\r
+                if (!File.Exists(filename))\r
+                    return null;\r
+\r
+                StreamReader sr = File.OpenText(filename);\r
+                string fromfile = string.Empty;\r
+                int fileChar;\r
+                while ((fileChar = sr.Read()) != -1)\r
+                    fromfile += Convert.ToChar(fileChar);\r
+\r
+                XmlDocument doc = new XmlDocument();\r
+                doc.LoadXml(fromfile);\r
+\r
+                root = doc;\r
+                if (!root.HasChildNodes)\r
+                {\r
+                    MessageBox.Show(\r
+                        "The Preset file you selected appears to be invlaid or from an older version of HandBrake",\r
+                        "Error",\r
+                        MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                    return null;\r
+                }\r
+\r
+                return root;\r
+            }\r
+            catch (Exception)\r
+            {\r
+                MessageBox.Show(\r
+                    "The Preset file you selected appears to be invlaid or from an older version of HandBrake.\n\n Please note, if you are exporting from the MacGui you may need to rebuild your preset so that it uses the current preset plist format.\n The MacGui does not currently update user presets automatically.",\r
+                    "Error",\r
+                    MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                return null;\r
+            }\r
+        }\r
+        #endregion\r
+\r
+        #region Export\r
+\r
+        /// <summary>\r
+        /// Export a MacGui style plist preset.\r
+        /// </summary>\r
+        /// <param name="path">\r
+        /// The path.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        public static void Export(string path, Preset preset)\r
+        {\r
+            QueryParser parsed = QueryParser.Parse(preset.Query);\r
+            XmlTextWriter xmlWriter = new XmlTextWriter(path, Encoding.UTF8) { Formatting = Formatting.Indented };\r
+\r
+            // Header\r
+            xmlWriter.WriteStartDocument();\r
+            xmlWriter.WriteDocType("plist", "-//Apple//DTD PLIST 1.0//EN",\r
+                                @"http://www.apple.com/DTDs/PropertyList-1.0.dtd", null);\r
+\r
+            xmlWriter.WriteStartElement("plist");\r
+            xmlWriter.WriteStartElement("array");\r
+\r
+            // Add New Preset Here. Can write multiple presets here if required in future.\r
+            WritePreset(xmlWriter, parsed, preset);\r
+\r
+            // Footer\r
+            xmlWriter.WriteEndElement();\r
+            xmlWriter.WriteEndElement();\r
+\r
+            xmlWriter.WriteEndDocument();\r
+\r
+            // Closeout\r
+            xmlWriter.Close();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Write the Preset to a file\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        private static void WritePreset(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset)\r
+        {\r
+            xmlWriter.WriteStartElement("dict");\r
+            AudioListArrayDict(xmlWriter, parsed);\r
+            AddEncodeSettings(xmlWriter, parsed, preset);\r
+\r
+            xmlWriter.WriteEndElement();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add the encode settings to the preset\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        /// <param name="preset">\r
+        /// The preset.\r
+        /// </param>\r
+        private static void AddEncodeSettings(XmlTextWriter xmlWriter, QueryParser parsed, Preset preset)\r
+        {\r
+            AddEncodeElement(xmlWriter, "ChapterMarkers", "integer", parsed.ChapterMarkers ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Default", "integer", "0");\r
+            AddEncodeElement(xmlWriter, "FileFormat", "string", parsed.Format.ToUpper() + " file");\r
+            AddBooleanElement(xmlWriter, "Folder", false);\r
+            AddEncodeElement(xmlWriter, "Mp4HttpOptimize", "integer", parsed.OptimizeMP4 ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Mp4LargeFile", "integer", parsed.LargeMP4 ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "Mp4iPodCompatible", "integer", parsed.IpodAtom ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "PictureAutoCrop", "integer", "1");\r
+            AddEncodeElement(xmlWriter, "PictureBottomCrop", "integer", parsed.CropBottom);\r
+\r
+            // Filters\r
+            AddEncodeElement(xmlWriter, "PictureDeblock", "integer", parsed.DeBlock.ToString());\r
+\r
+            switch (parsed.Decomb)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);\r
+                    break;\r
+                case "Default":\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDecomb", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDecombCustom", "string", parsed.Decomb);\r
+                    break;\r
+            }\r
+            AddEncodeElement(xmlWriter, "PictureDecombDeinterlace", "integer", parsed.Decomb != "Off" ? "0" : "1"); \r
+\r
+            switch (parsed.DeInterlace)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Fast":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Slow":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                case "Slower":\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "3");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlace", "integer", "4");\r
+                    AddEncodeElement(xmlWriter, "PictureDeinterlaceCustom", "string", parsed.DeInterlace);\r
+                    break;\r
+            }\r
+\r
+            switch (parsed.DeNoise)\r
+            {\r
+                case "Off":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "0");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Weak":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "1");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Medium":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "2");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                case "Strong":\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "3");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", string.Empty);\r
+                    break;\r
+                default:\r
+                    AddEncodeElement(xmlWriter, "PictureDenoise", "integer", "4");\r
+                    AddEncodeElement(xmlWriter, "PictureDenoiseCustom", "string", parsed.DeNoise);\r
+                    break;\r
+            }\r
+\r
+            int detelecine;\r
+            switch (parsed.DeTelecine)\r
+            {\r
+                case "Off":\r
+                    detelecine = 0;\r
+                    break;\r
+                case "Default":\r
+                    detelecine = 2;\r
+                    break;\r
+                default:\r
+                    detelecine = 1;\r
+                    break;\r
+            }\r
+            AddEncodeElement(xmlWriter, "PictureDetelecine", "integer", detelecine.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureDetelecineCustom", "string", detelecine == 1 ? parsed.DeTelecine : string.Empty);\r
+\r
+            // Picture Settings\r
+            AddEncodeElement(xmlWriter, "PictureHeight", "integer", parsed.Height.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureKeepRatio", "integer", parsed.KeepDisplayAsect ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "PictureLeftCrop", "integer", parsed.CropLeft);\r
+            AddEncodeElement(xmlWriter, "PictureModulus", "integer", parsed.AnamorphicModulus.ToString());\r
+            AddEncodeElement(xmlWriter, "PicturePAR", "integer", parsed.AnamorphicMode.ToString());\r
+            AddEncodeElement(xmlWriter, "PictureRightCrop", "integer", parsed.CropRight);\r
+            AddEncodeElement(xmlWriter, "PictureTopCrop", "integer", parsed.CropTop);\r
+            AddEncodeElement(xmlWriter, "PictureWidth", "integer", parsed.Width.ToString());\r
+\r
+            // Preset Information\r
+            AddEncodeElement(xmlWriter, "PresetBuildNumber", "string", Properties.Settings.Default.hb_build.ToString());\r
+            AddEncodeElement(xmlWriter, "PresetDescription", "string", "No Description");\r
+            AddEncodeElement(xmlWriter, "PresetName", "string", preset.Name);\r
+            AddEncodeElement(xmlWriter, "Type", "integer", "1"); // 1 is user preset, 0 is built in\r
+\r
+            // Preset Settings\r
+            AddEncodeElement(xmlWriter, "UsesMaxPictureSettings", "integer", (parsed.MaxWidth != 0 || parsed.MaxHeight != 0) ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "UsesPictureFilters", "integer", "1");\r
+            AddEncodeElement(xmlWriter, "UsesPictureSettings", "integer", "2");\r
+\r
+            // Video Settings\r
+            AddEncodeElement(xmlWriter, "VideoAvgBitrate", "string", parsed.AverageVideoBitrate);\r
+            AddEncodeElement(xmlWriter, "VideoEncoder", "string", parsed.VideoEncoder);\r
+            AddEncodeElement(xmlWriter, "VideoFramerate", "string", parsed.VideoFramerate);\r
+            AddEncodeElement(xmlWriter, "VideFrameratePFR", "integer", parsed.Pfr ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "VideoGrayScale", "integer", parsed.Grayscale ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "VideoQualitySlider", "real", parsed.VideoQuality.ToString());\r
+\r
+            int videoQualityType = 0;\r
+            if (!string.IsNullOrEmpty(parsed.VideoTargetSize)) videoQualityType = 0;\r
+            else if (!string.IsNullOrEmpty(parsed.AverageVideoBitrate)) videoQualityType = 1;\r
+            else if (parsed.VideoQuality != 0) videoQualityType = 2;\r
+\r
+            AddEncodeElement(xmlWriter, "VideoQualityType", "integer", videoQualityType.ToString());\r
+            AddEncodeElement(xmlWriter, "VideoTargetSize", "string", parsed.VideoTargetSize);\r
+            AddEncodeElement(xmlWriter, "VideoTurboTwoPass", "integer", parsed.TurboFirstPass ? "1" : "0");\r
+            AddEncodeElement(xmlWriter, "VideoTwoPass", "integer", parsed.TwoPass ? "1" : "0");\r
+\r
+            // x264 string\r
+            AddEncodeElement(xmlWriter, "x264Option", "string", parsed.H264Query);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add a boolean element\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="keyName">\r
+        /// The key name.\r
+        /// </param>\r
+        /// <param name="value">\r
+        /// The value.\r
+        /// </param>\r
+        private static void AddBooleanElement(XmlTextWriter xmlWriter, string keyName, bool value)\r
+        {\r
+            xmlWriter.WriteStartElement("key");\r
+            xmlWriter.WriteString(keyName);\r
+            xmlWriter.WriteEndElement();\r
+            xmlWriter.WriteStartElement(value ? "true" : "false");\r
+            xmlWriter.WriteEndElement();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add an encode setting element\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="keyName">\r
+        /// The key name.\r
+        /// </param>\r
+        /// <param name="type">\r
+        /// The type.\r
+        /// </param>\r
+        /// <param name="value">\r
+        /// The value.\r
+        /// </param>\r
+        private static void AddEncodeElement(XmlTextWriter xmlWriter, string keyName, string type, string value)\r
+        {\r
+            xmlWriter.WriteElementString("key", keyName);\r
+\r
+            // This is a hack for Apples XML parser. It doesn't understand <integer /> so instead, always set a default value\r
+            // of 0 if the value is empty.\r
+            if (type == "integer" && string.IsNullOrEmpty(value))\r
+            {\r
+                value = "0";\r
+            }\r
+            xmlWriter.WriteElementString(type, value);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add an Audio Track Array Dict\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="parsed">\r
+        /// The parsed.\r
+        /// </param>\r
+        private static void AudioListArrayDict(XmlTextWriter xmlWriter, QueryParser parsed)\r
+        {\r
+            xmlWriter.WriteStartElement("key");\r
+            xmlWriter.WriteString("AudioList");\r
+            xmlWriter.WriteEndElement();\r
+\r
+            xmlWriter.WriteStartElement("array");\r
+            foreach (AudioTrack track in parsed.AudioInformation)\r
+            {\r
+                AddAudioItem(xmlWriter, track);\r
+            }\r
+            xmlWriter.WriteEndElement();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add an audio track\r
+        /// </summary>\r
+        /// <param name="xmlWriter">\r
+        /// The xml writer.\r
+        /// </param>\r
+        /// <param name="audioTrack">\r
+        /// The audio track.\r
+        /// </param>\r
+        private static void AddAudioItem(XmlTextWriter xmlWriter, AudioTrack audioTrack)\r
+        {\r
+            xmlWriter.WriteStartElement("dict");\r
+\r
+            xmlWriter.WriteElementString("key", "AudioBitrate");\r
+            xmlWriter.WriteElementString("string", audioTrack.Bitrate);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioEncoder");\r
+            xmlWriter.WriteElementString("string", audioTrack.Encoder);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioMixdown");\r
+            xmlWriter.WriteElementString("string", audioTrack.MixDown);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioSamplerate");\r
+            xmlWriter.WriteElementString("string",  audioTrack.SampleRate);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioTrack");\r
+            xmlWriter.WriteElementString("integer", audioTrack.Track);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioTrackDRCSlider");\r
+            xmlWriter.WriteElementString("real", audioTrack.DRC);\r
+\r
+            xmlWriter.WriteElementString("key", "AudioTrackDescription");\r
+            xmlWriter.WriteElementString("string", "Unknown");\r
+\r
+            xmlWriter.WriteEndElement();\r
+        }\r
+        #endregion\r
+    }\r
+}
\ No newline at end of file
index 1609c1f..456cdfd 100644 (file)
@@ -1,40 +1,87 @@
 ï»¿/*  PresetHandler.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-using System;\r
-using System.Collections.Generic;\r
-using System.Drawing;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using System.Text.RegularExpressions;\r
-using System.Diagnostics;\r
-using System.Xml.Serialization;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Presets\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Diagnostics;\r
+    using System.Drawing;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Text.RegularExpressions;\r
+    using System.Windows.Forms;\r
+    using System.Xml.Serialization;\r
+\r
+    /// <summary>\r
+    /// The Preset Handler Class\r
+    /// </summary>\r
     public class PresetsHandler\r
     {\r
-        List<Preset> _presets = new List<Preset>();\r
-        List<Preset> _userPresets = new List<Preset>();\r
+        /// <summary>\r
+        /// The User Preset file\r
+        /// </summary>\r
+        private readonly string userPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\user_presets.xml";\r
+\r
+        /// <summary>\r
+        /// The Built In Presets File\r
+        /// </summary>\r
+        private readonly string hbPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\presets.xml";\r
+\r
+        /// <summary>\r
+        /// XML Serializer\r
+        /// </summary>\r
         private static readonly XmlSerializer Ser = new XmlSerializer(typeof(List<Preset>));\r
-        readonly string _userPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\user_presets.xml";\r
-        readonly string _hbPresetFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\presets.xml";\r
+\r
+        /// <summary>\r
+        /// A List of built-in presets\r
+        /// </summary>\r
+        private List<Preset> presets = new List<Preset>();\r
+\r
+        /// <summary>\r
+        /// A List of user presets\r
+        /// </summary>\r
+        private List<Preset> userPresets = new List<Preset>();\r
+\r
+        /// <summary>\r
+        ///  Gets or sets the Last preset added\r
+        /// </summary>\r
+        public Preset LastPresetAdded { get; set; }\r
 \r
         /// <summary>\r
         /// Add a new preset to the system\r
         /// </summary>\r
-        /// <param name="presetName">String, The name of the new preset</param>\r
-        /// <param name="query">String, the CLI query for the new preset</param>\r
-        /// <param name="pictureSettings"> Bool, store crop/picture sizes in the _presets</param>\r
-        public Boolean Add(string presetName, string query, Boolean pictureSettings)\r
+        /// <param name="presetName">\r
+        /// String, The name of the new preset\r
+        /// </param>\r
+        /// <param name="query">\r
+        /// String, the CLI query for the new preset\r
+        /// </param>\r
+        /// <param name="pictureSettings">\r
+        /// Bool, store crop/picture sizes in the Presets\r
+        /// </param>\r
+        /// <param name="description">\r
+        /// The description.\r
+        /// </param>\r
+        /// <returns>\r
+        /// The add.\r
+        /// </returns>\r
+        public bool Add(string presetName, string query, bool pictureSettings, string description)\r
         {\r
-            if (CheckIfPresetExists(presetName) == false)\r
+            if (this.CheckIfPresetExists(presetName) == false)\r
             {\r
-                Preset newPreset = new Preset { Name = presetName, Query = query, PictureSettings = pictureSettings, Version = Properties.Settings.Default.hb_version };\r
-                _userPresets.Add(newPreset);\r
-                UpdatePresetFiles();\r
+                Preset newPreset = new Preset\r
+                                       {\r
+                                           Name = presetName, \r
+                                           Query = query, \r
+                                           CropSettings = pictureSettings, \r
+                                           Version = Properties.Settings.Default.hb_version\r
+                                       };\r
+                this.userPresets.Add(newPreset);\r
+                this.UpdatePresetFiles();\r
+                this.LastPresetAdded = newPreset;\r
                 return true;\r
             }\r
             return false;\r
@@ -50,37 +97,36 @@ namespace Handbrake.Presets
             List<Preset> newUserPresets = new List<Preset>();\r
 \r
             // Built In Presets\r
-            foreach (Preset item in _presets)\r
+            foreach (Preset item in this.presets)\r
             {\r
                 if (item.Name != name)\r
                 {\r
                     newPresets.Add(item);\r
                 }\r
             }\r
-            _presets = newPresets;\r
+            this.presets = newPresets;\r
 \r
             // User Presets\r
-            foreach (Preset item in _userPresets)\r
+            foreach (Preset item in this.userPresets)\r
             {\r
                 if (item.Name != name)\r
                 {\r
                     newUserPresets.Add(item);\r
                 }\r
             }\r
-            _userPresets = newUserPresets;\r
+            this.userPresets = newUserPresets;\r
 \r
-            // Rebuild the _userPresets.xml file\r
-            UpdatePresetFiles();\r
-            UpdatePresetFiles();\r
+            // Rebuild the Preset XML files\r
+            this.UpdatePresetFiles();\r
         }\r
 \r
         /// <summary>\r
-        /// Remove all built in _presets;\r
+        /// Remove all built in Presets;\r
         /// </summary>\r
         public void RemoveBuiltInPresets()\r
         {\r
-            _presets.Clear();\r
-            UpdatePresetFiles();\r
+            this.presets.Clear();\r
+            this.UpdatePresetFiles();\r
         }\r
 \r
         /// <summary>\r
@@ -89,17 +135,21 @@ namespace Handbrake.Presets
         /// <param name="presetName">String, The name of the new preset</param>\r
         /// <param name="query">String, the CLI query for the new preset</param>\r
         /// <param name="pictureSettings"> Bool, store crop/picture sizes in the preset</param>\r
-        public void Update(string presetName, string query, Boolean pictureSettings)\r
+        public void Update(string presetName, string query, bool pictureSettings)\r
         {\r
             // User Presets\r
-            foreach (Preset item in _userPresets)\r
+            foreach (Preset item in this.userPresets)\r
             {\r
                 if (item.Name == presetName)\r
                 {\r
                     item.Query = query;\r
-                    item.PictureSettings = pictureSettings;\r
-                    MessageBox.Show("Changes to \"" + presetName + "\" Saved", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
-                    UpdatePresetFiles();\r
+                    item.CropSettings = pictureSettings;\r
+                    MessageBox.Show(\r
+                        "Changes to \"" + presetName + "\" Saved",\r
+                                    "Success",\r
+                                    MessageBoxButtons.OK, \r
+                                    MessageBoxIcon.Information);\r
+                    this.UpdatePresetFiles();\r
                 }\r
             }\r
         }\r
@@ -112,33 +162,30 @@ namespace Handbrake.Presets
         public Preset GetPreset(string name)\r
         {\r
             // Built In Presets\r
-            foreach (Preset item in _presets)\r
+            foreach (Preset item in this.presets)\r
             {\r
                 if (item.Name == name)\r
                     return item;\r
             }\r
 \r
             // User Presets\r
-            foreach (Preset item in _userPresets)\r
-            {\r
-                if (item.Name == name)\r
-                    return item;\r
-            }\r
-\r
-            return null;\r
+            return this.userPresets.FirstOrDefault(item => item.Name == name);\r
         }\r
 \r
         /// <summary>\r
-        /// Reads the CLI's CLI output format and load's them into the preset List<Preset>\r
+        /// Reads the CLI's CLI output format and load's them into the preset List Preset\r
         /// </summary>\r
         public void UpdateBuiltInPresets()\r
         {\r
-            // Create a new tempory file and execute the CLI to get the built in _presets.\r
+            // Create a new tempory file and execute the CLI to get the built in Presets.\r
             string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
             string presetsPath = Path.Combine(Path.GetTempPath(), "temp_presets.dat");\r
             string strCmdLine = String.Format(@"cmd /c """"{0}"" --preset-list >""{1}"" 2>&1""", handbrakeCLIPath, presetsPath);\r
 \r
-            ProcessStartInfo hbGetPresets = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };\r
+            ProcessStartInfo hbGetPresets = new ProcessStartInfo("CMD.exe", strCmdLine)\r
+                                                {\r
+                                                   WindowStyle = ProcessWindowStyle.Hidden\r
+                                                };\r
             Process hbproc = Process.Start(hbGetPresets);\r
             if (hbproc != null)\r
             {\r
@@ -147,8 +194,8 @@ namespace Handbrake.Presets
                 hbproc.Close();\r
             }\r
 \r
-            // Clear the current built in _presets and now parse the tempory _presets file.\r
-            _presets.Clear();\r
+            // Clear the current built in Presets and now parse the tempory Presets file.\r
+            this.presets.Clear();\r
 \r
             if (File.Exists(presetsPath))\r
             {\r
@@ -160,106 +207,190 @@ namespace Handbrake.Presets
                 {\r
                     string line = presetInput.ReadLine();\r
                     if (line.Contains("<") && !line.Contains("<<")) // Found the beginning of a preset block \r
-                        category = line.Replace("<", "").Trim();\r
+                        category = line.Replace("<", string.Empty).Trim();\r
 \r
                     if (line.Contains("+")) // A Preset\r
                     {\r
                         Regex r = new Regex("(:  )"); // Split on hyphens. \r
                         string[] presetName = r.Split(line);\r
 \r
+                        bool pic = false;\r
+                        if (presetName[2].Contains("crop"))\r
+                            pic = true;\r
+\r
                         Preset newPreset = new Preset\r
-                                               {   Category = category,\r
-                                                   Name = presetName[0].Replace("+", "").Trim(),\r
-                                                   Query = presetName[2],\r
-                                                   Version = Properties.Settings.Default.hb_version,\r
-                                                   PictureSettings = true\r
+                                               {\r
+                                                   Category = category, \r
+                                                   Name = presetName[0].Replace("+", string.Empty).Trim(), \r
+                                                   Query = presetName[2], \r
+                                                   Version = Properties.Settings.Default.hb_version, \r
+                                                   CropSettings = pic,\r
+                                                   Description = string.Empty // Maybe one day we will populate this.\r
                                                };\r
-                        _presets.Add(newPreset);\r
+                        this.presets.Add(newPreset);\r
                     }\r
                 }\r
                 presetInput.Close();\r
                 presetInput.Dispose();\r
             }\r
 \r
-            // Finally, Create a new or update the current _presets.xml file\r
-            UpdatePresetFiles();\r
+            // Finally, Create a new or update the current Presets.xml file\r
+            this.UpdatePresetFiles();\r
         }\r
 \r
         /// <summary>\r
-        /// Load in the preset data from _presets.xml and _userPresets.xml\r
-        /// Load it into the 2 arraylist's _presets and _userPresets\r
+        /// Setup the frmMain preset panel\r
         /// </summary>\r
-        private void LoadPresetData()\r
+        /// <param name="presetPanel">The Preset Panel from the Main Window</param>\r
+        public void GetPresetPanel(ref TreeView presetPanel)\r
         {\r
-            // First clear the _presets arraylists\r
-            _presets.Clear();\r
-            _userPresets.Clear();\r
+            this.LoadPresetData();\r
+            presetPanel.Nodes.Clear();\r
+            string category = string.Empty; // The category we are currnetly processing\r
+            TreeNode rootNode = null;\r
 \r
-            // Load in the users _presets from _userPresets.xml\r
-            if (File.Exists(_hbPresetFile))\r
+            if (this.presets.Count != 0) // Built In Presets\r
             {\r
-                using (FileStream strm = new FileStream(_hbPresetFile, FileMode.Open, FileAccess.Read))\r
+                foreach (Preset preset in this.presets)\r
                 {\r
-                    if (strm.Length != 0)\r
+                    // If the category of this preset doesn't match the current category we are processing\r
+                    // Then we need to create a new root node.\r
+                    if (preset.Category != category)\r
                     {\r
-                        List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
-\r
-                        if (list != null)\r
-                            foreach (Preset preset in list)\r
-                                _presets.Add(preset);\r
+                        rootNode = new TreeNode(preset.Category);\r
+                        presetPanel.Nodes.Add(rootNode);\r
+                        category = preset.Category;\r
                     }\r
+\r
+                    if (preset.Category == category && rootNode != null)\r
+                        rootNode.Nodes.Add(new TreeNode(preset.Name) { ToolTipText = preset.Description });\r
                 }\r
             }\r
 \r
-            // Load in the users _presets from _userPresets.xml\r
-            if (File.Exists(_userPresetFile))\r
+            rootNode = null;\r
+            category = null;\r
+            foreach (Preset preset in this.userPresets) // User Presets\r
             {\r
-                using (FileStream strm = new FileStream(_userPresetFile, FileMode.Open, FileAccess.Read))\r
+                if (preset.Category != category && preset.Category != string.Empty)\r
                 {\r
-                    if (strm.Length != 0)\r
-                    {\r
-                        List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
-\r
-                        if (list != null)\r
-                            foreach (Preset preset in list)\r
-                                _userPresets.Add(preset);\r
-                    }\r
+                    rootNode = new TreeNode(preset.Category) {ForeColor = Color.Black};\r
+                    presetPanel.Nodes.Add(rootNode);\r
+                    category = preset.Category;\r
                 }\r
+\r
+                if (preset.Category == category && rootNode != null)\r
+                    rootNode.Nodes.Add(new TreeNode(preset.Name) {ForeColor = Color.Black, ToolTipText = preset.Description});\r
+                else\r
+                    presetPanel.Nodes.Add(new TreeNode(preset.Name) { ForeColor = Color.Black, ToolTipText = preset.Description });\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Setup the frmMain preset panel\r
+        /// Check if the user preset "name" exists in UserPresets list.\r
         /// </summary>\r
-        /// <param name="presetPanel"></param>\r
-        public void GetPresetPanel(ref TreeView presetPanel)\r
+        /// <param name="name">Name of the preset</param>\r
+        /// <returns>true if found</returns>\r
+        public bool CheckIfUserPresetExists(string name)\r
+        {\r
+            return name != string.Empty && this.userPresets.Any(item => item.Name == name);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Check if the built in Presets stored are not out of date.\r
+        /// Update them if they are.\r
+        /// </summary>\r
+        /// <returns>true if out of date</returns>\r
+        public bool CheckIfPresetsAreOutOfDate()\r
         {\r
             this.LoadPresetData();\r
-            presetPanel.Nodes.Clear();\r
+            // Update built-in Presets if the built-in Presets belong to an older version.\r
+            if (this.presets.Count != 0)\r
+                if (this.presets[0].Version != Properties.Settings.Default.hb_version)\r
+                {\r
+                    this.UpdateBuiltInPresets();\r
+                    return true;\r
+                }\r
 \r
-            if (_presets.Count != 0) // Built In Presets\r
-            {\r
-                string category = string.Empty;\r
-                TreeNode rootNode = null;\r
+            return false;\r
+        }\r
 \r
-                foreach (Preset preset in _presets)\r
+        /// <summary>\r
+        /// Load in the preset data from Presets.xml and UserPresets.xml\r
+        /// Load it into the 2 arraylist's Presets and UserPresets\r
+        /// </summary>\r
+        private void LoadPresetData()\r
+        {\r
+            // First clear the Presets arraylists\r
+            this.presets.Clear();\r
+            this.userPresets.Clear();\r
+\r
+            try\r
+            {\r
+                // Load in the users Presets from UserPresets.xml\r
+                if (File.Exists(this.hbPresetFile))\r
                 {\r
-                    if (preset.Category != category)\r
+                    using (FileStream strm = new FileStream(this.hbPresetFile, FileMode.Open, FileAccess.Read))\r
                     {\r
-                        rootNode = new TreeNode(preset.Category);\r
-                        presetPanel.Nodes.Add(rootNode);\r
-                        category = preset.Category;\r
+                        if (strm.Length != 0)\r
+                        {\r
+                            List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
+\r
+                            if (list != null)\r
+                                foreach (Preset preset in list)\r
+                                    this.presets.Add(preset);\r
+                        }\r
                     }\r
-\r
-                    if (preset.Category == category && rootNode != null)\r
-                        rootNode.Nodes.Add(preset.Name);\r
                 }\r
             }\r
+            catch (Exception)\r
+            {\r
+                MessageBox.Show(\r
+                    "HandBrakes preset file appears to have been corrupted. This file will now be re-generated!\n" +\r
+                    "If the problem presists, please delete the file: \n\n" + this.hbPresetFile, \r
+                    "Error",\r
+                    MessageBoxButtons.OK, \r
+                    MessageBoxIcon.Error);\r
+                this.UpdateBuiltInPresets();\r
+            }\r
 \r
-            foreach (Preset preset in _userPresets) // User Presets\r
+            try\r
+            {\r
+                // Load in the users Presets from UserPresets.xml\r
+                if (File.Exists(this.userPresetFile))\r
+                {\r
+                    using (FileStream strm = new FileStream(this.userPresetFile, FileMode.Open, FileAccess.Read))\r
+                    {\r
+                        if (strm.Length != 0)\r
+                        {\r
+                            List<Preset> list = Ser.Deserialize(strm) as List<Preset>;\r
+\r
+                            if (list != null)\r
+                                foreach (Preset preset in list)\r
+                                    this.userPresets.Add(preset);\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+            catch (Exception)\r
             {\r
-                TreeNode presetTreeview = new TreeNode(preset.Name) { ForeColor = Color.Black };\r
-                presetPanel.Nodes.Add(presetTreeview);\r
+                MessageBox.Show(\r
+                    "Your User presets file appears to have been corrupted.\n" +\r
+                    "Your presets will not be loaded. You may need to re-create your presets.\n\n" +\r
+                    "Your user presets file has been renamed to 'user_presets.xml.old' and is located in:\n " +\r
+                    Path.GetDirectoryName(this.userPresetFile) + "\n" + \r
+                    "You may be able to recover some presets if you know the XML language.", \r
+                    "Error",\r
+                    MessageBoxButtons.OK, \r
+                    MessageBoxIcon.Error);\r
+\r
+                // Recover from Error.\r
+                if (File.Exists(this.userPresetFile))\r
+                {\r
+                    string disabledFile = this.userPresetFile + ".old";\r
+                    if (File.Exists(disabledFile))\r
+                        File.Delete(disabledFile);\r
+                    File.Move(this.userPresetFile, disabledFile);\r
+                }\r
             }\r
         }\r
 \r
@@ -270,90 +401,50 @@ namespace Handbrake.Presets
         {\r
             try\r
             {\r
-                using (FileStream strm = new FileStream(_hbPresetFile, FileMode.Create, FileAccess.Write))\r
+                using (FileStream strm = new FileStream(this.hbPresetFile, FileMode.Create, FileAccess.Write))\r
                 {\r
-                    Ser.Serialize(strm, _presets);\r
+                    Ser.Serialize(strm, this.presets);\r
                     strm.Close();\r
                     strm.Dispose();\r
                 }\r
 \r
-                using (FileStream strm = new FileStream(_userPresetFile, FileMode.Create, FileAccess.Write))\r
+                using (FileStream strm = new FileStream(this.userPresetFile, FileMode.Create, FileAccess.Write))\r
                 {\r
-                    Ser.Serialize(strm, _userPresets);\r
+                    Ser.Serialize(strm, this.userPresets);\r
                     strm.Close();\r
                     strm.Dispose();\r
                 }\r
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("Unable to write to the file. Please make sure the location has the correct permissions for file writing.\n Error Information: \n\n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
+                MessageBox.Show(\r
+                    "Unable to write to the file. Please make sure the location has the correct permissions for file writing.\n Error Information: \n\n" +\r
+                    exc, \r
+                    "Error", \r
+                    MessageBoxButtons.OK, \r
+                    MessageBoxIcon.Hand);\r
             }\r
         }\r
 \r
         /// <summary>\r
-        /// Check if the preset "name" exists in either _presets or _userPresets lists.\r
+        /// Check if the preset "name" exists in either Presets or UserPresets lists.\r
         /// </summary>\r
-        /// <param name="name"></param>\r
-        /// <returns></returns>\r
-        private Boolean CheckIfPresetExists(string name)\r
+        /// <param name="name">Name of the preset</param>\r
+        /// <returns>True if found</returns>\r
+        private bool CheckIfPresetExists(string name)\r
         {\r
             if (name == string.Empty)\r
                 return true;\r
 \r
             // Built In Presets\r
-            foreach (Preset item in _presets)\r
+            foreach (Preset item in this.presets)\r
             {\r
                 if (item.Name == name)\r
                     return true;\r
             }\r
 \r
             // User Presets\r
-            foreach (Preset item in _userPresets)\r
-            {\r
-                if (item.Name == name)\r
-                    return true;\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// Check if the user preset "name" exists in _userPresets list.\r
-        /// </summary>\r
-        /// <param name="name"></param>\r
-        /// <returns></returns>\r
-        public Boolean CheckIfUserPresetExists(string name)\r
-        {\r
-            if (name == string.Empty)\r
-                return false;\r
-\r
-            // User Presets\r
-            foreach (Preset item in _userPresets)\r
-            {\r
-                if (item.Name == name)\r
-                    return true;\r
-            }\r
-\r
-            return false;\r
-        }\r
-\r
-        /// <summary>\r
-        /// Check if the built in _presets stored are not out of date.\r
-        /// Update them if they are.\r
-        /// </summary>\r
-        /// <returns></returns>\r
-        public Boolean CheckIfPresetsAreOutOfDate()\r
-        {\r
-            LoadPresetData();\r
-            // Update built-in _presets if the built-in _presets belong to an older version.\r
-            if (_presets.Count != 0)\r
-                if (_presets[0].Version != Properties.Settings.Default.hb_version)\r
-                {\r
-                    UpdateBuiltInPresets();\r
-                    return true;\r
-                }\r
-\r
-            return false;\r
+            return this.userPresets.Any(item => item.Name == name);\r
         }\r
     }\r
 }
\ No newline at end of file
index 088d39c..b6151a3 100644 (file)
@@ -1,38 +1,43 @@
 ï»¿/*  Preset.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Presets\r
 {\r
-    public class Preset\r
+    /// <summary>\r
+    /// A Preset\r
+    /// </summary>\r
+    public class Preset \r
     {\r
         /// <summary>\r
-        /// Get or Set the category which the preset resides under\r
+        /// Gets or sets the category which the preset resides under\r
         /// </summary>\r
         public string Category { get; set; }\r
 \r
         /// <summary>\r
-        /// Get or Set the preset name\r
+        /// Gets or sets the preset name\r
         /// </summary>\r
         public string Name { get; set; }\r
 \r
         /// <summary>\r
-        /// Get or set the preset query\r
+        /// Gets or sets the preset query\r
         /// </summary>\r
         public string Query { get; set; }\r
 \r
         /// <summary>\r
-        /// Get or set the usage of Picture Settings in presets.\r
+        /// Gets or sets a value indicating whether to use picture Settings in presets.\r
         /// </summary>\r
-        public Boolean PictureSettings { get; set; }\r
+        public bool CropSettings { get; set; }\r
 \r
         /// <summary>\r
-        /// The version number which associates this preset with a HB build\r
+        /// Gets or sets The version number which associates this preset with a HB build\r
         /// </summary>\r
         public string Version { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the Description for the preset\r
+        /// </summary>\r
+        public string Description { get; set; }\r
     }\r
 }
\ No newline at end of file
index 282f9f5..c147542 100644 (file)
@@ -1,27 +1,80 @@
-/*  Program.cs \r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using Handbrake.Presets;\r
+/*  Program.cs\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
-    static class Program\r
+    using System;\r
+    using System.Diagnostics;\r
+    using System.Drawing;\r
+    using System.IO;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.ApplicationServices;\r
+\r
+    using Handbrake.Presets;\r
+    using Handbrake.Properties;\r
+\r
+    /// <summary>\r
+    /// HandBrake Starts Here\r
+    /// </summary>\r
+    public static class Program\r
     {\r
         /// <summary>\r
         /// The main entry point for the application.\r
         /// </summary>\r
+        /// <param name="args">\r
+        /// The args.\r
+        /// </param>\r
         [STAThread]\r
-        static void Main()\r
+        public static void Main(string[] args)\r
         {\r
+            InstanceId = Process.GetProcessesByName("HandBrake").Length;\r
+\r
+            // Handle any unhandled exceptions\r
+            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomainUnhandledException);\r
+\r
+            // Attempt to upgrade / keep the users settings between versions\r
+            if (Settings.Default.UpdateRequired)\r
+            {\r
+                Settings.Default.Upgrade();\r
+                Settings.Default.UpdateRequired = false;\r
+                Functions.Main.SetCliVersionData();\r
+            }\r
+\r
+            // Make sure we have any pre-requesits before trying to launch\r
+            string failedInstall = "HandBrake is not installed properly. Please reinstall HandBrake. \n\n";\r
+            string missingFiles = string.Empty;\r
+\r
+            // Verify HandBrakeCLI.exe exists\r
+            if (!File.Exists(Path.Combine(Application.StartupPath, "HandBrakeCLI.exe")))\r
+            {\r
+                missingFiles += "\"HandBrakeCLI.exe\" was not found.";\r
+            }\r
+\r
+            if (missingFiles != string.Empty)\r
+            {\r
+                MessageBox.Show(\r
+                    failedInstall + missingFiles,\r
+                    "Error",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Error);\r
+                return;\r
+            }\r
+\r
+            // Check were not running on a screen that's going to cause some funnies to happen.\r
             Screen scr = Screen.PrimaryScreen;\r
             if ((scr.Bounds.Width < 1024) || (scr.Bounds.Height < 620))\r
-                MessageBox.Show("Your system does not meet the minimum requirements for HandBrake. \n" + "Your screen is running at: " + scr.Bounds.Width + "x" + scr.Bounds.Height + " \nScreen resolution is too Low. Must be 1024x620 or greater", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+            {\r
+                MessageBox.Show(\r
+                    "Your system does not meet the minimum requirements for HandBrake. \n" +\r
+                    "Your screen is running at: " + scr.Bounds.Width + "x" + scr.Bounds.Height +\r
+                    " \nScreen resolution is too Low. Must be 1024x620 or greater.\n\n",\r
+                    "Error",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Error);\r
+            } \r
             else\r
             {\r
                 string logDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"HandBrake\logs");\r
@@ -34,11 +87,40 @@ namespace Handbrake
                     x.UpdateBuiltInPresets();\r
                 }\r
 \r
+                InitializeApplicationServices();\r
+\r
                 Application.EnableVisualStyles();\r
                 Application.SetCompatibleTextRenderingDefault(false);\r
-                Application.Run(new frmMain());\r
+                Application.Run(new frmMain(args));\r
             }\r
         }\r
-    }\r
 \r
+        /// <summary>\r
+        /// Initialize App Services\r
+        /// </summary>\r
+        private static void InitializeApplicationServices()\r
+        {\r
+            string versionId = String.Format("Windows GUI {1} {0}", Settings.Default.hb_build, Settings.Default.hb_version);\r
+            Init.SetupSettings(versionId, InstanceId, Settings.Default.CompletionOption, Settings.Default.noDvdNav,\r
+                               Settings.Default.growlEncode, Settings.Default.growlQueue,\r
+                               Settings.Default.processPriority, Settings.Default.saveLogPath, Settings.Default.saveLogToSpecifiedPath,\r
+                               Settings.Default.saveLogWithVideo, Settings.Default.showCliForInGuiEncodeStatus, Settings.Default.preventSleep);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Throw up an error message for any unhandled exceptions.\r
+        /// </summary>\r
+        /// <param name="sender">The sender</param>\r
+        /// <param name="e">Unhandled Exception EventArgs </param>\r
+        private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)\r
+        {\r
+            MessageBox.Show(\r
+                "An Unknown Error has occured. \n\n Exception:" + e.ExceptionObject,\r
+                "Unhandled Exception",\r
+                MessageBoxButtons.OK,\r
+                MessageBoxIcon.Error);\r
+        }\r
+\r
+        public static int InstanceId;\r
+    }\r
 }
\ No newline at end of file
diff --git a/win/C#/Properties/AssemblyInfo.cs.tmpl b/win/C#/Properties/AssemblyInfo.cs.tmpl
new file mode 100644 (file)
index 0000000..5e3c9f9
--- /dev/null
@@ -0,0 +1,42 @@
+/*  AssemblyInfo.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+using System.Reflection;\r
+using System.Resources;\r
+using System.Runtime.InteropServices;\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+\r
+[assembly: AssemblyTitle("HandBrake")]\r
+[assembly: AssemblyDescription("HandBrake is a GPL-licensed, multiplatform, multithreaded video transcoder.")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("HandBrake")]\r
+[assembly: AssemblyProduct("HandBrake")]\r
+[assembly: AssemblyCopyright("Copyright Â©  2011")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Setting ComVisible to false makes the types in this assembly not visible \r
+// to COM components.  If you need to access a type in this assembly from \r
+// COM, set the ComVisible attribute to true on that type.\r
+\r
+[assembly: ComVisible(false)]\r
+\r
+// The following GUID is for the ID of the typelib if this project is exposed to COM\r
+\r
+[assembly: Guid("5e4e3f97-5252-41f6-aae9-3846f62cbc66")]\r
+\r
+// Version information for an assembly consists of the following four values:\r
+//\r
+//      Major Version\r
+//      Minor Version \r
+//      Build Number\r
+//      Revision\r
+//\r
+\r
+[assembly: AssemblyVersion("0.9.5.$WCREV$")]\r
+[assembly: NeutralResourcesLanguage("")]
\ No newline at end of file
index 36b3388..1a36ab3 100644 (file)
@@ -1,7 +1,7 @@
 ï»¿//------------------------------------------------------------------------------\r
 // <auto-generated>\r
 //     This code was generated by a tool.\r
-//     Runtime Version:2.0.50727.1433\r
+//     Runtime Version:4.0.30319.1\r
 //\r
 //     Changes to this file may cause incorrect behavior and will be lost if\r
 //     the code is regenerated.\r
@@ -19,7 +19,7 @@ namespace Handbrake.Properties {
     // class via a tool like ResGen or Visual Studio.\r
     // To add or remove a member, edit your .ResX file then rerun ResGen\r
     // with the /str option, or rebuild your VS project.\r
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]\r
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]\r
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
     internal class Resources {\r
@@ -102,6 +102,20 @@ namespace Handbrake.Properties {
             }\r
         }\r
         \r
+        internal static System.Drawing.Bitmap Download {\r
+            get {\r
+                object obj = ResourceManager.GetObject("Download", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
+        internal static System.Drawing.Bitmap ErrorX {\r
+            get {\r
+                object obj = ResourceManager.GetObject("ErrorX", resourceCulture);\r
+                return ((System.Drawing.Bitmap)(obj));\r
+            }\r
+        }\r
+        \r
         internal static System.Drawing.Bitmap folder {\r
             get {\r
                 object obj = ResourceManager.GetObject("folder", resourceCulture);\r
@@ -228,16 +242,16 @@ namespace Handbrake.Properties {
             }\r
         }\r
         \r
-        internal static System.Drawing.Bitmap save {\r
+        internal static System.Drawing.Bitmap Restore {\r
             get {\r
-                object obj = ResourceManager.GetObject("save", resourceCulture);\r
+                object obj = ResourceManager.GetObject("Restore", resourceCulture);\r
                 return ((System.Drawing.Bitmap)(obj));\r
             }\r
         }\r
         \r
-        internal static System.Drawing.Bitmap SplashScreen {\r
+        internal static System.Drawing.Bitmap save {\r
             get {\r
-                object obj = ResourceManager.GetObject("SplashScreen", resourceCulture);\r
+                object obj = ResourceManager.GetObject("save", resourceCulture);\r
                 return ((System.Drawing.Bitmap)(obj));\r
             }\r
         }\r
index d5524c8..6831265 100644 (file)
   <data name="Pref_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\Pref_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
-  <data name="logo128" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
-    <value>..\Resources\logo128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
-  </data>\r
   <data name="ActivityWindow" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\ActivityWindow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
   <data name="Pause" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\Pause.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
-  <data name="SplashScreen" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
-    <value>..\Resources\SplashScreen.jpg;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
-  </data>\r
   <data name="Output_Small" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\Output_Small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
   <data name="Play_small" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
     <value>..\Resources\Play_small.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
   </data>\r
+  <data name="Download" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\download.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="Restore" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\Restore.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="logo128" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\logo128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
+  <data name="ErrorX" type="System.Resources.ResXFileRef, System.Windows.Forms">\r
+    <value>..\Resources\ErrorX.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>\r
+  </data>\r
 </root>
\ No newline at end of file
index af174ab..e02976a 100644 (file)
@@ -1,7 +1,7 @@
 ï»¿//------------------------------------------------------------------------------\r
 // <auto-generated>\r
 //     This code was generated by a tool.\r
-//     Runtime Version:2.0.50727.4927\r
+//     Runtime Version:4.0.30319.1\r
 //\r
 //     Changes to this file may cause incorrect behavior and will be lost if\r
 //     the code is regenerated.\r
@@ -12,7 +12,7 @@ namespace Handbrake.Properties {
     \r
     \r
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\r
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]\r
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]\r
     internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\r
         \r
         private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\r
@@ -37,18 +37,6 @@ namespace Handbrake.Properties {
         \r
         [global::System.Configuration.UserScopedSettingAttribute()]\r
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("Automatic")]\r
-        public string Processors {\r
-            get {\r
-                return ((string)(this["Processors"]));\r
-            }\r
-            set {\r
-                this["Processors"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
         [global::System.Configuration.DefaultSettingValueAttribute("True")]\r
         public bool updateStatus {\r
             get {\r
@@ -181,18 +169,6 @@ namespace Handbrake.Properties {
         \r
         [global::System.Configuration.UserScopedSettingAttribute()]\r
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool cli_minimized {\r
-            get {\r
-                return ((bool)(this["cli_minimized"]));\r
-            }\r
-            set {\r
-                this["cli_minimized"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
         [global::System.Configuration.DefaultSettingValueAttribute("{source}-{title}")]\r
         public string autoNameFormat {\r
             get {\r
@@ -325,18 +301,6 @@ namespace Handbrake.Properties {
         \r
         [global::System.Configuration.UserScopedSettingAttribute()]\r
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool enocdeStatusInGui {\r
-            get {\r
-                return ((bool)(this["enocdeStatusInGui"]));\r
-            }\r
-            set {\r
-                this["enocdeStatusInGui"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
         [global::System.Configuration.DefaultSettingValueAttribute("True")]\r
         public bool trayIconAlerts {\r
             get {\r
@@ -408,13 +372,13 @@ namespace Handbrake.Properties {
         \r
         [global::System.Configuration.UserScopedSettingAttribute()]\r
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool DubAudio {\r
+        [global::System.Configuration.DefaultSettingValueAttribute("0")]\r
+        public int DubMode {\r
             get {\r
-                return ((bool)(this["DubAudio"]));\r
+                return ((int)(this["DubMode"]));\r
             }\r
             set {\r
-                this["DubAudio"] = value;\r
+                this["DubMode"] = value;\r
             }\r
         }\r
         \r
@@ -433,18 +397,6 @@ namespace Handbrake.Properties {
         [global::System.Configuration.UserScopedSettingAttribute()]\r
         [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
         [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
-        public bool disableResCalc {\r
-            get {\r
-                return ((bool)(this["disableResCalc"]));\r
-            }\r
-            set {\r
-                this["disableResCalc"] = value;\r
-            }\r
-        }\r
-        \r
-        [global::System.Configuration.UserScopedSettingAttribute()]\r
-        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
-        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
         public bool growlQueue {\r
             get {\r
                 return ((bool)(this["growlQueue"]));\r
@@ -476,5 +428,137 @@ namespace Handbrake.Properties {
                 this["cliLastModified"] = value;\r
             }\r
         }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("10")]\r
+        public int previewScanCount {\r
+            get {\r
+                return ((int)(this["previewScanCount"]));\r
+            }\r
+            set {\r
+                this["previewScanCount"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool clearOldLogs {\r
+            get {\r
+                return ((bool)(this["clearOldLogs"]));\r
+            }\r
+            set {\r
+                this["clearOldLogs"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool showCliForInGuiEncodeStatus {\r
+            get {\r
+                return ((bool)(this["showCliForInGuiEncodeStatus"]));\r
+            }\r
+            set {\r
+                this["showCliForInGuiEncodeStatus"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool AutoNameTitleCase {\r
+            get {\r
+                return ((bool)(this["AutoNameTitleCase"]));\r
+            }\r
+            set {\r
+                this["AutoNameTitleCase"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool AutoNameRemoveUnderscore {\r
+            get {\r
+                return ((bool)(this["AutoNameRemoveUnderscore"]));\r
+            }\r
+            set {\r
+                this["AutoNameRemoveUnderscore"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]\r
+        public bool UpdateRequired {\r
+            get {\r
+                return ((bool)(this["UpdateRequired"]));\r
+            }\r
+            set {\r
+                this["UpdateRequired"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("0")]\r
+        public int ActivityWindowLastMode {\r
+            get {\r
+                return ((int)(this["ActivityWindowLastMode"]));\r
+            }\r
+            set {\r
+                this["ActivityWindowLastMode"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool preventSleep {\r
+            get {\r
+                return ((bool)(this["preventSleep"]));\r
+            }\r
+            set {\r
+                this["preventSleep"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]\r
+        public bool useClosedCaption {\r
+            get {\r
+                return ((bool)(this["useClosedCaption"]));\r
+            }\r
+            set {\r
+                this["useClosedCaption"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("35")]\r
+        public int batchMinDuration {\r
+            get {\r
+                return ((int)(this["batchMinDuration"]));\r
+            }\r
+            set {\r
+                this["batchMinDuration"] = value;\r
+            }\r
+        }\r
+        \r
+        [global::System.Configuration.UserScopedSettingAttribute()]\r
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\r
+        [global::System.Configuration.DefaultSettingValueAttribute("47")]\r
+        public int batchMaxDuration {\r
+            get {\r
+                return ((int)(this["batchMaxDuration"]));\r
+            }\r
+            set {\r
+                this["batchMaxDuration"] = value;\r
+            }\r
+        }\r
     }\r
 }\r
index f1c0263..563a4ec 100644 (file)
@@ -5,9 +5,6 @@
     <Setting Name="processPriority" Type="System.String" Scope="User">\r
       <Value Profile="(Default)">Below Normal</Value>\r
     </Setting>\r
-    <Setting Name="Processors" Type="System.String" Scope="User">\r
-      <Value Profile="(Default)">Automatic</Value>\r
-    </Setting>\r
     <Setting Name="updateStatus" Type="System.Boolean" Scope="User">\r
       <Value Profile="(Default)">True</Value>\r
     </Setting>\r
@@ -41,9 +38,6 @@
     <Setting Name="appcast_unstable" Type="System.String" Scope="User">\r
       <Value Profile="(Default)">http://handbrake.fr/appcast_unstable.xml</Value>\r
     </Setting>\r
-    <Setting Name="cli_minimized" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
-    </Setting>\r
     <Setting Name="autoNameFormat" Type="System.String" Scope="User">\r
       <Value Profile="(Default)">{source}-{title}</Value>\r
     </Setting>\r
@@ -77,9 +71,6 @@
     <Setting Name="presetNotification" Type="System.Boolean" Scope="User">\r
       <Value Profile="(Default)">False</Value>\r
     </Setting>\r
-    <Setting Name="enocdeStatusInGui" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
-    </Setting>\r
     <Setting Name="trayIconAlerts" Type="System.Boolean" Scope="User">\r
       <Value Profile="(Default)">True</Value>\r
     </Setting>\r
     <Setting Name="NativeLanguage" Type="System.String" Scope="User">\r
       <Value Profile="(Default)">Any</Value>\r
     </Setting>\r
-    <Setting Name="DubAudio" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
+    <Setting Name="DubMode" Type="System.Int32" Scope="User">\r
+      <Value Profile="(Default)">0</Value>\r
     </Setting>\r
     <Setting Name="hb_platform" Type="System.String" Scope="User">\r
       <Value Profile="(Default)" />\r
     </Setting>\r
-    <Setting Name="disableResCalc" Type="System.Boolean" Scope="User">\r
-      <Value Profile="(Default)">False</Value>\r
-    </Setting>\r
     <Setting Name="growlQueue" Type="System.Boolean" Scope="User">\r
       <Value Profile="(Default)">False</Value>\r
     </Setting>\r
     <Setting Name="cliLastModified" Type="System.DateTime" Scope="User">\r
       <Value Profile="(Default)" />\r
     </Setting>\r
+    <Setting Name="previewScanCount" Type="System.Int32" Scope="User">\r
+      <Value Profile="(Default)">10</Value>\r
+    </Setting>\r
+    <Setting Name="clearOldLogs" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="showCliForInGuiEncodeStatus" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="AutoNameTitleCase" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="AutoNameRemoveUnderscore" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="UpdateRequired" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">True</Value>\r
+    </Setting>\r
+    <Setting Name="ActivityWindowLastMode" Type="System.Int32" Scope="User">\r
+      <Value Profile="(Default)">0</Value>\r
+    </Setting>\r
+    <Setting Name="preventSleep" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="useClosedCaption" Type="System.Boolean" Scope="User">\r
+      <Value Profile="(Default)">False</Value>\r
+    </Setting>\r
+    <Setting Name="batchMinDuration" Type="System.Int32" Scope="User">\r
+      <Value Profile="(Default)">35</Value>\r
+    </Setting>\r
+    <Setting Name="batchMaxDuration" Type="System.Int32" Scope="User">\r
+      <Value Profile="(Default)">47</Value>\r
+    </Setting>\r
   </Settings>\r
 </SettingsFile>
\ No newline at end of file
diff --git a/win/C#/Resources/ErrorX.png b/win/C#/Resources/ErrorX.png
new file mode 100644 (file)
index 0000000..75c63c0
Binary files /dev/null and b/win/C#/Resources/ErrorX.png differ
diff --git a/win/C#/Resources/Restore.png b/win/C#/Resources/Restore.png
new file mode 100644 (file)
index 0000000..d0e2f3b
Binary files /dev/null and b/win/C#/Resources/Restore.png differ
diff --git a/win/C#/Resources/download.png b/win/C#/Resources/download.png
new file mode 100644 (file)
index 0000000..c320662
Binary files /dev/null and b/win/C#/Resources/download.png differ
index 41fa2c6..a54316e 100644 (file)
Binary files a/win/C#/Resources/folder.png and b/win/C#/Resources/folder.png differ
diff --git a/win/C#/Settings.StyleCop b/win/C#/Settings.StyleCop
new file mode 100644 (file)
index 0000000..a9622d8
--- /dev/null
@@ -0,0 +1,244 @@
+<StyleCopSettings Version="4.3">\r
+  <Parsers>\r
+    <Parser ParserId="Microsoft.StyleCop.CSharp.CsParser">\r
+      <ParserSettings>\r
+        <BooleanProperty Name="AnalyzeDesignerFiles">False</BooleanProperty>\r
+      </ParserSettings>\r
+    </Parser>\r
+  </Parsers>\r
+  <Analyzers>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.DocumentationRules">\r
+      <Rules>\r
+        <Rule Name="PropertyDocumentationMustHaveValueText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="DocumentationTextMustMeetMinimumCharacterLength">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="DocumentationTextMustContainWhitespace">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="EnumerationItemsMustBeDocumented">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileMustHaveHeader">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustShowCopyright">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustHaveCopyrightText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustContainFileName">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustHaveValidCompanyText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ElementsMustBeDocumented">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings>\r
+        <StringProperty Name="CompanyName">HandBrake Project (http://handbrake.fr)</StringProperty>\r
+        <StringProperty Name="Copyright">This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.</StringProperty>\r
+      </AnalyzerSettings>\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">\r
+      <Rules>\r
+        <Rule Name="StatementMustNotUseUnnecessaryParenthesis">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FieldsMustBePrivate">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ArithmeticExpressionsMustDeclarePrecedence">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="AccessModifierMustBeDeclared">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.SpacingRules">\r
+      <Rules>\r
+        <Rule Name="OpeningCurlyBracketsMustBeSpacedCorrectly">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ClosingCurlyBracketsMustBeSpacedCorrectly">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ClosingParenthesisMustBeSpacedCorrectly">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.LayoutRules">\r
+      <Rules>\r
+        <Rule Name="SingleLineCommentsMustNotBeFollowedByBlankLine">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="SingleLineCommentMustBePrecededByBlankLine">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ClosingCurlyBracketMustBeFollowedByBlankLine">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="CurlyBracketsMustNotBeOmitted">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ElementsMustBeSeparatedByBlankLine">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.ReadabilityRules">\r
+      <Rules>\r
+        <Rule Name="BlockStatementsMustNotContainEmbeddedComments">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="DoNotPlaceRegionsWithinElements">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ParametersMustBeOnSameLineOrSeparateLines">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ParameterMustFollowComma">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="SplitParametersMustStartOnLineAfterDeclaration">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="UseBuiltInTypeAlias">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="PrefixLocalCallsWithThis">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="CommentsMustContainText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.NamingRules">\r
+      <Rules>\r
+        <Rule Name="FieldNamesMustNotUseHungarianNotation">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ElementMustBeginWithUpperCaseLetter">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="AccessibleFieldsMustBeginWithUpperCaseLetter">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FieldNamesMustBeginWithLowerCaseLetter">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.OrderingRules">\r
+      <Rules>\r
+        <Rule Name="ElementsMustBeOrderedByAccess">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="ElementsMustAppearInTheCorrectOrder">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="StaticElementsMustAppearBeforeInstanceElements">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="UsingDirectivesMustBeOrderedAlphabeticallyByNamespace">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings />\r
+    </Analyzer>\r
+  </Analyzers>\r
+</StyleCopSettings>
\ No newline at end of file
diff --git a/win/C#/ToolWindows/BatchAdd.Designer.cs b/win/C#/ToolWindows/BatchAdd.Designer.cs
new file mode 100644 (file)
index 0000000..e8f8323
--- /dev/null
@@ -0,0 +1,157 @@
+namespace Handbrake.ToolWindows\r
+{\r
+    partial class BatchAdd\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BatchAdd));\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.minDuration = new System.Windows.Forms.TextBox();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.btnAdd = new System.Windows.Forms.Button();\r
+            this.btnCancel = new System.Windows.Forms.Button();\r
+            this.maxDuration = new System.Windows.Forms.TextBox();\r
+            this.label3 = new System.Windows.Forms.Label();\r
+            this.label4 = new System.Windows.Forms.Label();\r
+            this.SuspendLayout();\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(12, 9);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(114, 13);\r
+            this.label1.TabIndex = 1;\r
+            this.label1.Text = "Add all Titles between:";\r
+            // \r
+            // minDuration\r
+            // \r
+            this.minDuration.Location = new System.Drawing.Point(53, 34);\r
+            this.minDuration.Name = "minDuration";\r
+            this.minDuration.Size = new System.Drawing.Size(51, 20);\r
+            this.minDuration.TabIndex = 2;\r
+            this.minDuration.Text = "0";\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(17, 68);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(250, 26);\r
+            this.label2.TabIndex = 3;\r
+            this.label2.Text = "Warning: This may lead to wasted encodes.\r\nDifferent titles may require different" +\r
+                " encode settings.";\r
+            // \r
+            // btnAdd\r
+            // \r
+            this.btnAdd.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btnAdd.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btnAdd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btnAdd.Location = new System.Drawing.Point(232, 108);\r
+            this.btnAdd.Name = "btnAdd";\r
+            this.btnAdd.Size = new System.Drawing.Size(90, 22);\r
+            this.btnAdd.TabIndex = 4;\r
+            this.btnAdd.TabStop = false;\r
+            this.btnAdd.Text = "Add Titles";\r
+            this.btnAdd.UseVisualStyleBackColor = true;\r
+            this.btnAdd.Click += new System.EventHandler(this.BtnScanClick);\r
+            // \r
+            // btnCancel\r
+            // \r
+            this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btnCancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btnCancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btnCancel.Location = new System.Drawing.Point(15, 108);\r
+            this.btnCancel.Name = "btnCancel";\r
+            this.btnCancel.Size = new System.Drawing.Size(60, 22);\r
+            this.btnCancel.TabIndex = 5;\r
+            this.btnCancel.TabStop = false;\r
+            this.btnCancel.Text = "Cancel";\r
+            this.btnCancel.UseVisualStyleBackColor = true;\r
+            this.btnCancel.Click += new System.EventHandler(this.BtnCancelClick);\r
+            // \r
+            // maxDuration\r
+            // \r
+            this.maxDuration.Location = new System.Drawing.Point(141, 34);\r
+            this.maxDuration.Name = "maxDuration";\r
+            this.maxDuration.Size = new System.Drawing.Size(51, 20);\r
+            this.maxDuration.TabIndex = 6;\r
+            this.maxDuration.Text = "0";\r
+            // \r
+            // label3\r
+            // \r
+            this.label3.AutoSize = true;\r
+            this.label3.Location = new System.Drawing.Point(110, 37);\r
+            this.label3.Name = "label3";\r
+            this.label3.Size = new System.Drawing.Size(25, 13);\r
+            this.label3.TabIndex = 7;\r
+            this.label3.Text = "and";\r
+            // \r
+            // label4\r
+            // \r
+            this.label4.AutoSize = true;\r
+            this.label4.Location = new System.Drawing.Point(198, 37);\r
+            this.label4.Name = "label4";\r
+            this.label4.Size = new System.Drawing.Size(69, 13);\r
+            this.label4.TabIndex = 8;\r
+            this.label4.Text = "minutes long.";\r
+            // \r
+            // BatchAdd\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.ClientSize = new System.Drawing.Size(334, 137);\r
+            this.Controls.Add(this.label4);\r
+            this.Controls.Add(this.label3);\r
+            this.Controls.Add(this.maxDuration);\r
+            this.Controls.Add(this.btnCancel);\r
+            this.Controls.Add(this.btnAdd);\r
+            this.Controls.Add(this.label2);\r
+            this.Controls.Add(this.minDuration);\r
+            this.Controls.Add(this.label1);\r
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;\r
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.Name = "BatchAdd";\r
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
+            this.Text = "Batch Add";\r
+            this.ResumeLayout(false);\r
+            this.PerformLayout();\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.TextBox minDuration;\r
+        private System.Windows.Forms.Label label2;\r
+        internal System.Windows.Forms.Button btnAdd;\r
+        internal System.Windows.Forms.Button btnCancel;\r
+        private System.Windows.Forms.TextBox maxDuration;\r
+        private System.Windows.Forms.Label label3;\r
+        private System.Windows.Forms.Label label4;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/BatchAdd.cs b/win/C#/ToolWindows/BatchAdd.cs
new file mode 100644 (file)
index 0000000..08bf620
--- /dev/null
@@ -0,0 +1,73 @@
+/*  TitleSpecificScan.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.ToolWindows\r
+{\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// Title Specific Scan\r
+    /// </summary>\r
+    public partial class BatchAdd : Form\r
+    {\r
+        public BatchAdd()\r
+        {\r
+            InitializeComponent();\r
+\r
+            // Get the Default values for batch encoding.\r
+            this.minDuration.Text = Properties.Settings.Default.batchMinDuration.ToString();\r
+            this.maxDuration.Text = Properties.Settings.Default.batchMaxDuration.ToString();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Button Cancel Click Event Handler\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void BtnCancelClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.Cancel;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Button Scan Click Event Handler\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void BtnScanClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.OK;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the minimum duration that the user entered.\r
+        /// </summary>\r
+        public int Min\r
+        {\r
+            get\r
+            {\r
+                int title;\r
+                int.TryParse(this.minDuration.Text, out title);\r
+\r
+                return title;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the maximum duration that the user entered.\r
+        /// </summary>\r
+        public int Max\r
+        {\r
+            get\r
+            {\r
+                int title;\r
+                int.TryParse(this.maxDuration.Text, out title);\r
+\r
+                return title;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/BatchAdd.resx b/win/C#/ToolWindows/BatchAdd.resx
new file mode 100644 (file)
index 0000000..ff217dc
--- /dev/null
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/ToolWindows/PreviewOverlay.Designer.cs b/win/C#/ToolWindows/PreviewOverlay.Designer.cs
new file mode 100644 (file)
index 0000000..0ce54f8
--- /dev/null
@@ -0,0 +1,143 @@
+namespace Handbrake.ToolWindows\r
+{\r
+    partial class PreviewOverlay\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PreviewOverlay));\r
+            this.PlayWithQT = new System.Windows.Forms.Button();\r
+            this.progressBar1 = new System.Windows.Forms.ProgressBar();\r
+            this.drp_preview = new System.Windows.Forms.ComboBox();\r
+            this.drp_duration = new System.Windows.Forms.ComboBox();\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.label3 = new System.Windows.Forms.Label();\r
+            this.SuspendLayout();\r
+            // \r
+            // PlayWithQT\r
+            // \r
+            this.PlayWithQT.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.PlayWithQT.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.PlayWithQT.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.PlayWithQT.Location = new System.Drawing.Point(347, 45);\r
+            this.PlayWithQT.Name = "PlayWithQT";\r
+            this.PlayWithQT.Size = new System.Drawing.Size(90, 22);\r
+            this.PlayWithQT.TabIndex = 4;\r
+            this.PlayWithQT.TabStop = false;\r
+            this.PlayWithQT.Text = "Play";\r
+            this.PlayWithQT.UseVisualStyleBackColor = true;\r
+            this.PlayWithQT.Click += new System.EventHandler(this.PlayWithQtClick);\r
+            // \r
+            // progressBar1\r
+            // \r
+            this.progressBar1.Location = new System.Drawing.Point(12, 12);\r
+            this.progressBar1.Name = "progressBar1";\r
+            this.progressBar1.Size = new System.Drawing.Size(425, 10);\r
+            this.progressBar1.TabIndex = 6;\r
+            // \r
+            // drp_preview\r
+            // \r
+            this.drp_preview.FormattingEnabled = true;\r
+            this.drp_preview.Location = new System.Drawing.Point(63, 47);\r
+            this.drp_preview.Name = "drp_preview";\r
+            this.drp_preview.Size = new System.Drawing.Size(56, 21);\r
+            this.drp_preview.TabIndex = 7;\r
+            // \r
+            // drp_duration\r
+            // \r
+            this.drp_duration.FormattingEnabled = true;\r
+            this.drp_duration.Location = new System.Drawing.Point(195, 47);\r
+            this.drp_duration.Name = "drp_duration";\r
+            this.drp_duration.Size = new System.Drawing.Size(73, 21);\r
+            this.drp_duration.TabIndex = 8;\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(125, 50);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(64, 13);\r
+            this.label1.TabIndex = 9;\r
+            this.label1.Text = "Duration (s):";\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(12, 50);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(48, 13);\r
+            this.label2.TabIndex = 10;\r
+            this.label2.Text = "Preview:";\r
+            // \r
+            // label3\r
+            // \r
+            this.label3.AutoSize = true;\r
+            this.label3.Location = new System.Drawing.Point(12, 25);\r
+            this.label3.Name = "label3";\r
+            this.label3.Size = new System.Drawing.Size(140, 13);\r
+            this.label3.TabIndex = 11;\r
+            this.label3.Text = "Select a frame and duration:";\r
+            // \r
+            // PreviewOverlay\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.ClientSize = new System.Drawing.Size(453, 80);\r
+            this.Controls.Add(this.label3);\r
+            this.Controls.Add(this.label2);\r
+            this.Controls.Add(this.label1);\r
+            this.Controls.Add(this.drp_duration);\r
+            this.Controls.Add(this.drp_preview);\r
+            this.Controls.Add(this.progressBar1);\r
+            this.Controls.Add(this.PlayWithQT);\r
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;\r
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.MaximizeBox = false;\r
+            this.MinimizeBox = false;\r
+            this.Name = "PreviewOverlay";\r
+            this.Opacity = 0.75D;\r
+            this.ShowIcon = false;\r
+            this.ShowInTaskbar = false;\r
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
+            this.Text = "Title Scan";\r
+            this.TopMost = true;\r
+            this.ResumeLayout(false);\r
+            this.PerformLayout();\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        internal System.Windows.Forms.Button PlayWithQT;\r
+        private System.Windows.Forms.ProgressBar progressBar1;\r
+        private System.Windows.Forms.ComboBox drp_preview;\r
+        private System.Windows.Forms.ComboBox drp_duration;\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.Label label2;\r
+        private System.Windows.Forms.Label label3;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/PreviewOverlay.cs b/win/C#/ToolWindows/PreviewOverlay.cs
new file mode 100644 (file)
index 0000000..fda9716
--- /dev/null
@@ -0,0 +1,59 @@
+/*  TitleSpecificScan.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.ToolWindows\r
+{\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// Title Specific Scan\r
+    /// </summary>\r
+    public partial class PreviewOverlay : Form\r
+    {\r
+        public PreviewOverlay()\r
+        {\r
+            InitializeComponent();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the preview frame that the user entered.\r
+        /// </summary>\r
+        public int Preview\r
+        {\r
+            get\r
+            {\r
+                int value;\r
+                int.TryParse(drp_preview.SelectedItem.ToString(), out value);\r
+\r
+                return value;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the duration that the user entered.\r
+        /// </summary>\r
+        public int Duration\r
+        {\r
+            get\r
+            {\r
+                int value;\r
+                int.TryParse(drp_preview.SelectedItem.ToString(), out value);\r
+\r
+                return value;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Play the video with Quicktime\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void PlayWithQtClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.OK;\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/PreviewOverlay.resx b/win/C#/ToolWindows/PreviewOverlay.resx
new file mode 100644 (file)
index 0000000..ff217dc
--- /dev/null
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+</root>
\ No newline at end of file
diff --git a/win/C#/ToolWindows/TitleSpecificScan.Designer.cs b/win/C#/ToolWindows/TitleSpecificScan.Designer.cs
new file mode 100644 (file)
index 0000000..61976f9
--- /dev/null
@@ -0,0 +1,121 @@
+namespace Handbrake.ToolWindows\r
+{\r
+    partial class TitleSpecificScan\r
+    {\r
+        /// <summary>\r
+        /// Required designer variable.\r
+        /// </summary>\r
+        private System.ComponentModel.IContainer components = null;\r
+\r
+        /// <summary>\r
+        /// Clean up any resources being used.\r
+        /// </summary>\r
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>\r
+        protected override void Dispose(bool disposing)\r
+        {\r
+            if (disposing && (components != null))\r
+            {\r
+                components.Dispose();\r
+            }\r
+            base.Dispose(disposing);\r
+        }\r
+\r
+        #region Windows Form Designer generated code\r
+\r
+        /// <summary>\r
+        /// Required method for Designer support - do not modify\r
+        /// the contents of this method with the code editor.\r
+        /// </summary>\r
+        private void InitializeComponent()\r
+        {\r
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TitleSpecificScan));\r
+            this.label1 = new System.Windows.Forms.Label();\r
+            this.titleNumber = new System.Windows.Forms.TextBox();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.btnScan = new System.Windows.Forms.Button();\r
+            this.btnCancel = new System.Windows.Forms.Button();\r
+            this.SuspendLayout();\r
+            // \r
+            // label1\r
+            // \r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(12, 9);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(92, 13);\r
+            this.label1.TabIndex = 1;\r
+            this.label1.Text = "Scan title number:";\r
+            // \r
+            // titleNumber\r
+            // \r
+            this.titleNumber.Location = new System.Drawing.Point(110, 6);\r
+            this.titleNumber.Name = "titleNumber";\r
+            this.titleNumber.Size = new System.Drawing.Size(51, 20);\r
+            this.titleNumber.TabIndex = 2;\r
+            this.titleNumber.Text = "0";\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(12, 29);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(309, 13);\r
+            this.label2.TabIndex = 3;\r
+            this.label2.Text = "Note: (entering 0 or leaving blank will result in a full source scan)";\r
+            // \r
+            // btnScan\r
+            // \r
+            this.btnScan.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btnScan.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btnScan.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btnScan.Location = new System.Drawing.Point(231, 56);\r
+            this.btnScan.Name = "btnScan";\r
+            this.btnScan.Size = new System.Drawing.Size(90, 22);\r
+            this.btnScan.TabIndex = 4;\r
+            this.btnScan.TabStop = false;\r
+            this.btnScan.Text = "Open Title";\r
+            this.btnScan.UseVisualStyleBackColor = true;\r
+            this.btnScan.Click += new System.EventHandler(this.BtnScanClick);\r
+            // \r
+            // btnCancel\r
+            // \r
+            this.btnCancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btnCancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btnCancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btnCancel.Location = new System.Drawing.Point(15, 56);\r
+            this.btnCancel.Name = "btnCancel";\r
+            this.btnCancel.Size = new System.Drawing.Size(60, 22);\r
+            this.btnCancel.TabIndex = 5;\r
+            this.btnCancel.TabStop = false;\r
+            this.btnCancel.Text = "Cancel";\r
+            this.btnCancel.UseVisualStyleBackColor = true;\r
+            this.btnCancel.Click += new System.EventHandler(this.BtnCancelClick);\r
+            // \r
+            // TitleSpecificScan\r
+            // \r
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.ClientSize = new System.Drawing.Size(334, 89);\r
+            this.Controls.Add(this.btnCancel);\r
+            this.Controls.Add(this.btnScan);\r
+            this.Controls.Add(this.label2);\r
+            this.Controls.Add(this.titleNumber);\r
+            this.Controls.Add(this.label1);\r
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;\r
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.Name = "TitleSpecificScan";\r
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
+            this.Text = "Title Scan";\r
+            this.ResumeLayout(false);\r
+            this.PerformLayout();\r
+\r
+        }\r
+\r
+        #endregion\r
+\r
+        private System.Windows.Forms.Label label1;\r
+        private System.Windows.Forms.TextBox titleNumber;\r
+        private System.Windows.Forms.Label label2;\r
+        internal System.Windows.Forms.Button btnScan;\r
+        internal System.Windows.Forms.Button btnCancel;\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/TitleSpecificScan.cs b/win/C#/ToolWindows/TitleSpecificScan.cs
new file mode 100644 (file)
index 0000000..6c93834
--- /dev/null
@@ -0,0 +1,55 @@
+/*  TitleSpecificScan.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
+\r
+namespace Handbrake.ToolWindows\r
+{\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// Title Specific Scan\r
+    /// </summary>\r
+    public partial class TitleSpecificScan : Form\r
+    {\r
+        public TitleSpecificScan()\r
+        {\r
+            InitializeComponent();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Button Cancel Click Event Handler\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void BtnCancelClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.Cancel;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Button Scan Click Event Handler\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void BtnScanClick(object sender, EventArgs e)\r
+        {\r
+            this.DialogResult = DialogResult.OK;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the title that the user entered.\r
+        /// </summary>\r
+        public int Title\r
+        {\r
+            get\r
+            {\r
+                int title;\r
+                int.TryParse(this.titleNumber.Text, out title);\r
+\r
+                return title;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/ToolWindows/TitleSpecificScan.resx b/win/C#/ToolWindows/TitleSpecificScan.resx
new file mode 100644 (file)
index 0000000..ff217dc
--- /dev/null
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+  <!-- \r
+    Microsoft ResX Schema \r
+    \r
+    Version 2.0\r
+    \r
+    The primary goals of this format is to allow a simple XML format \r
+    that is mostly human readable. The generation and parsing of the \r
+    various data types are done through the TypeConverter classes \r
+    associated with the data types.\r
+    \r
+    Example:\r
+    \r
+    ... ado.net/XML headers & schema ...\r
+    <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+    <resheader name="version">2.0</resheader>\r
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+        <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+    </data>\r
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+        <comment>This is a comment</comment>\r
+    </data>\r
+                \r
+    There are any number of "resheader" rows that contain simple \r
+    name/value pairs.\r
+    \r
+    Each data row contains a name, and value. The row also contains a \r
+    type or mimetype. Type corresponds to a .NET class that support \r
+    text/value conversion through the TypeConverter architecture. \r
+    Classes that don't support this are serialized and stored with the \r
+    mimetype set.\r
+    \r
+    The mimetype is used for serialized objects, and tells the \r
+    ResXResourceReader how to depersist the object. This is currently not \r
+    extensible. For a given mimetype the value must be set accordingly:\r
+    \r
+    Note - application/x-microsoft.net.object.binary.base64 is the format \r
+    that the ResXResourceWriter will generate, however the reader can \r
+    read any of the formats listed below.\r
+    \r
+    mimetype: application/x-microsoft.net.object.binary.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+            : and then encoded with base64 encoding.\r
+    \r
+    mimetype: application/x-microsoft.net.object.soap.base64\r
+    value   : The object must be serialized with \r
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+            : and then encoded with base64 encoding.\r
+\r
+    mimetype: application/x-microsoft.net.object.bytearray.base64\r
+    value   : The object must be serialized into a byte array \r
+            : using a System.ComponentModel.TypeConverter\r
+            : and then encoded with base64 encoding.\r
+    -->\r
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+    <xsd:element name="root" msdata:IsDataSet="true">\r
+      <xsd:complexType>\r
+        <xsd:choice maxOccurs="unbounded">\r
+          <xsd:element name="metadata">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" use="required" type="xsd:string" />\r
+              <xsd:attribute name="type" type="xsd:string" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="assembly">\r
+            <xsd:complexType>\r
+              <xsd:attribute name="alias" type="xsd:string" />\r
+              <xsd:attribute name="name" type="xsd:string" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="data">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+              <xsd:attribute ref="xml:space" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+          <xsd:element name="resheader">\r
+            <xsd:complexType>\r
+              <xsd:sequence>\r
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+              </xsd:sequence>\r
+              <xsd:attribute name="name" type="xsd:string" use="required" />\r
+            </xsd:complexType>\r
+          </xsd:element>\r
+        </xsd:choice>\r
+      </xsd:complexType>\r
+    </xsd:element>\r
+  </xsd:schema>\r
+  <resheader name="resmimetype">\r
+    <value>text/microsoft-resx</value>\r
+  </resheader>\r
+  <resheader name="version">\r
+    <value>2.0</value>\r
+  </resheader>\r
+  <resheader name="reader">\r
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <resheader name="writer">\r
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+  </resheader>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
+        IACoJQAAHh0AACAgAAABACAAqBAAAMZCAAAQEAAAAQAgAGgEAABuUwAAKAAAADAAAABgAAAAAQAIAAAA\r
+        AACACgAAAAAAAAAAAAAAAQAAAAAAAAAAAAD///8A/wAAAAD/AAAAAIAAgICAAICAAAAAgAAAAICAAIAA\r
+        AACAAIAAgP//ACAgIADg4OAAIAAAAAAgAABg4CAAQOBAAGBgYAAgYAAAQKDgAAAAIABAwCAAIEAAAECg\r
+        AABg4AAAIGCAAECAoABgoMAAYECgAGDAAABgICAAoKCgAOAAAAAgIAAAAGAAAEDgAABgAAAAIAAgAEAg\r
+        IAAgQGAAIIDAAADg4ABgAGAAgOD/ACCA/wCgAAAAQGAAACCAAAAAoAAAYCAAAAAgIAAgIEAAYGBAAEBg\r
+        YAAAIIAAAGCAAGCAgABAAKAAAICgAACgoACAoKAAIKDAAECgwAAAAOAAQADgAADA4ABgwOAAIODgAADg\r
+        AADA4AAAAEAgAKDgIAAA4EAAYABAAABAYACAAGAAgCBgAGAggABA4KAAAECgAGBAwADgIOAAIEDgAACA\r
+        4ADgoOAAYAD/ACBg/wAAoP8A4KD/AGD//wAICAgACAAAAAgIAAAAAJgACAAIAAAACAAACAAACBAQACA4\r
+        SAAgYIgAOHCIADhw+AAIGAAAEBAIACg4QAAwYHgAAACIACA4QAAoQFAAKFh4AHh4eAAwaIAAIGiQADh4\r
+        mAAACAgAEAgIABAYGAAgGBgASEhIABhIYAAoUGAAIFBoAChQaAAoWGgAMFhoAChoiAAweJgAKHioACiA\r
+        sAAIEAAACAgQAAgQGAAQGCAAGCAoABhAUAAoSFgAaGhoABhQcAAgWHAAKFhwADhgcAAYWIAAOGiAAIiI\r
+        iAAoaJAAKHCYACh4oAA4gKAAMICoAKioqAAwmNAAEDgAAChYAAAweAAAMIgQAAgYGAAYGBgACBggABAg\r
+        KAAgKCgAKCgoACAwOAA4ODgAKDhIADBQWABYWFgAGEhoADBYcAAYUHgAGFh4ACBYeAAoYHgAKGCAABhY\r
+        iAAgaJgAKICoACiIuAC4uLgAMJDIADiw6AAQCAAAABgAAAggAAAAOAAAMGgAABgQCAAwgAgAEAgQABgQ\r
+        EAAwmBgAGBggAAgYKAAAICgACCAoABgoMAAgKDAAGDBAABg4QAAYOFAAEEBYACBIWAAwSFgAOEhYACBI\r
+        YAAQSGgAOFhoABhIcAAoUHAAQFhwACBgeABAaIAAIGiIADBwiABAcIgAGGCQADhwkABYeJAACBCgAChw\r
+        oAAweKAAKIC4ACiQwAAwmMgAOKjgADBg6ABAsOgAELD4AAgoAAAIMAAAGDAAABhIAAAYUAAAKHgAAACY\r
+        AAAwmAAAAMgAABAACAAIEAgAEBgIABA4CAAYOAgAMHgIABAYEAAYGBAAIBgQACh4EAAwmBAAEBAYABgg\r
+        GAAoIBgAGCAgAAgIKAAgICgAGAgwAAggMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAn2KfdXV1XAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoo2+QIJCJb28Sd3em\r
+        nQAAAFuKqW0aqsd6Y5/DXAAAAAAAAAAAAAAAAAAAAAAAAAB3kAWQkG8SpqaJb28gsncAbIeSroyii21x\r
+        kczIwwAAAAAAAAAAAAAAAAAAAAAAAABoo4mJkLKylm9vb5BvdwwAcZO/fox7z2NjqsOss2MAWwAAAAAA\r
+        AAAAAAAAAAAAAAAAvaGmo5ANlgUFEiBvo1xjq3p6qMTJroBkxXt9cGzFnAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAL2ylgV3vQAAAGOvxMXXq41uh6yVjxqp1YhknwAAAAAAAAAAAAAAAAAAAAAAAAAAAABvsolbAAAA\r
+        +5KneouS2Kx4pZF9ndywsXuvkocAAAAAAAAAAAAAAAAAAAAAAAAAAAB3sncAAAAAdayHca95bH9+cKmv\r
+        fMVucG2B4MYAAAAAAAAAAAAAAAAAAAAAAAAAAAChsqMAAAAAe3VkyHF5kW59cN3eZc/XyXutyot7AAAA\r
+        AAAAAAAAAAAAAAAAAAAAAACjIKEAAACgfv94gX+PituLDI0/aoBxqxqOY8PgbQAAAAAAAAAAAAAAAAAA\r
+        AAAAAAChkAwAAACieap4k3CVZIB/apWlxNTgepXbf4caagAAAAAAAAAAAAAAAAAAAAAAAAChkJ0AAABc\r
+        es1kxaLVl5eNkqnebHp6eK20amSvxlsAAAAAAAAAAAAAAAAAAAAAAACjlqMAAABcY5VurYBlfcuUgciB\r
+        fWSRxceHepPbgAAAAAAAAAAAAAAAAAAAAAAAAACJsqMAAACdeWOIgMeXbcN+35esZdeAedtxxYG0q54A\r
+        AAAAAAAAAAAAAAAAAAAAAKGyshJbAAD/ZGNp2LGUi9caennJh+DYi2Rx1J6LipMAAAAAAAAAAAAAAAAA\r
+        AAAAAKNvEqa9AACGccdxe3Jw1KmBioqAkm1pi5ezkofQq7BcAAAAAAAAAAAAAAAAvaUIPEI+QkI+esFc\r
+        asenr9X9bt6zqoDPsYeX1X7gq2SOfhrAAAAAAAAAAAAAAGJlQ+Mq4+PjKioqREOxS4aI3nJueox6eN7e\r
+        ktWO3WV4ybHb38NiAAAAAAAAAABcSxws4+MtZi3j4+Pj4+MNQzhszH1kjmp72Hnfen+OgHxtgXyXZXLG\r
+        AAAAAAAAAADNLCxYLWZmZmYtZi3jLS0UAUM4o4bYs4+BqYFjcH2Xl86UjpNqjJOtAAAAAAAAAM1DDWYt\r
+        U1Bm4eFmZmYtZuHaFEMpx63MiKR+25WPsX+NcNa0eLNpeZN5AAAAAAAAFWYNQ2ZmUF5m4V7hZmbhZuFe\r
+        a0sI/4aOampq1XIbzd0/bGVy4mVw0xtpAAAAAAAANywNZlNQ2l7a2l7aUOFT2tpeBMg7xTZyZWTXfaDV\r
+        l7SUfo5lZXDIZMpbAAAAAAAA2w2y2l5eXl5eXl5eXtraXl5eXl5reyw2jXHIZZFuj+J9sa/iaWWX4GwA\r
+        AAAAAAAAUA2WXl5eXl5ra2trXl5eXl5eBMU5Cws2aZU/2HHN4sptleKUbnIbcs4AAAAAAACDa1myBP7+\r
+        /v4EBAQ0///+NAQ0PQsLPWNppXqNY5eX4o+z2KWop9ulG8kAAAAAAAAA/BwNBAQ3Lh832tra0gg0NzSl\r
+        Cwul/ASGcM2zfXySiJTN23LLtLGNGwAAAAAAAAAAvTcNUdo0LjTa2tprNDzHBDekCxz8BP4Axty0G39x\r
+        sWW039gbGxvK+wAAAAAAAAAAW1umlvwnCcAENzQ3/giqNMe8pT0EXmAAAHZ8eZeK4G0blaE2ozXxYQAA\r
+        AAAAAAAAAAAAIG0lCWGj+gAAAMYIXF1bAMhL/FwAAAAAW9Xg4tN3menrvvf2t/EAAAAAAAAAAAAA/WkO\r
+        umB3vwBgAHNLYlsAAMI8QjgAAAAAAABg+Ofr6xj3vr6bmea3AAAAAAAAAAAAALUuaAANiQAAALU8xlw2\r
+        bFzBKkLBAAAAAADm9haa9773uZqZ7wAAAAAAAAAAAAAA/zc081uJEgBbW1zSCHYLHADBQjycAAAAAGH2\r
+        vru5FpoW95nnmABgAAAAAAAAAAAVUFNTN1tidQyhoAzGPAB3bcY8PsMAAAAAAObwgua5FrubEZu5F4IA\r
+        AAAAAAAAwJ68NzfaNwAAAAAAAABbPMgAxjg4AAAAAAAAAAAAt+e5vpuavhbp6GcAAAAAAACi2dPZ2dnR\r
+        hQAAAAAAAAAACM0AAAAAAAAAAAAAAAAAAOmam/K7ufbwmGdbXwAAAACk2dFt2c7Ry9NpAAAAAAAA7rjk\r
+        uOTuAAAAAAAAAAAA8euZ6bnpmpmCAAAAAAAAAADKLLI5DQ09xM7ZhgAAAGEj7Afs6gfquOQAAAAAAADw\r
+        6ZhnE5no6JmZZwAAAAAAAAAAwzlvErIFlhyiYgAAAOXqMeoxI+oHB4IAAAAAYGcTtwCY6LeY54K55QAA\r
+        AAAAAAAAAB8nCTYSPRzEAAAAXyMHIyO4YWEAAAAAAAAAAAAAAACYYQBnmABntwAAAAAAAAAAAAAOJQAA\r
+        AAAAAAAAALa4XAD/xgAAAAAAAAAAAAAAAFsAAAAAt10AAAAAAAAAAAAAAARBOgAAAAAAAAAAAAAAAAAI\r
+        PAAAAAAAAAAAAAAAAFsAAAAAgmEAAAAAAAAAAAAAAEFZUf4AAAAAAAAAAAAAAADCCAAAAAAAAAAAAAAA\r
+        AAAAAAAAWwAAAAAAAAAAAAAAADpROoMAAAAAAAAAAAAAAAAAnGIAAAAAAAAAAAAAAAAAAAAAAFsAAAAA\r
+        AAAAAAAAAAD+YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFxbAAAAAAD///////8AAP//\r
+        /////wAA//4/////AAD/wAPgA/8AAP+AAAAA/wAA/wAAAAB/AAD/gAAAAD8AAP/AAAAAPwAA//AGAAA/\r
+        AAD//BwAAD8AAP/+PAAAHwAA//48AAAfAAD//jgAAA8AAP/+OAAADwAA//44AAAHAAD//jgAAAcAAP/8\r
+        OAAABwAA//wYAAADAAD/+BgAAAMAAP/AAAAAAwAA/wAAAAADAAD8AAAAAAMAAPwAAAAAAwAA+AAAAAAD\r
+        AADwAAAAAAMAAPAAAAAAAwAA8AAAAAADAADwAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAQAA8AAPAA\r
+        ABgADwAA+AAAHgAHAAD8AAAfgAMAAP4QAA+ADwAA/gAADgADAAD8AAAfAAMAAPAfxD/ABwAA4B/n/+AB\r
+        AADgB+B/wB8AAOADgB+ADwAA8AOAHhAPAAD4BwB/8kcAAPz/gf/nLwAA+P/5/+8/AADwf/n//z8AAPh/\r
+        /P//vwAA+P////+fAAAoAAAAIAAAAEAAAAABAAgAAAAAAIAEAAAAAAAAAAAAAAABAAAAAAAAAAAAAP//\r
+        /wAAAP8AAP//AAAAgACAgIAAgAAAAACAAAAAgIAAgIAAAECg4ABAgKAAYOAgAEDgQAAAIAAAACAgACAg\r
+        IABgIIAAIAAAACBAAAAAYAAAIIAAAGAgIABAYGAAAACgAGCAoACgoKAA4ODgAGDAAAAAACAAYABgAIAg\r
+        YAAAYMAAICAAACBgAABgYAAAQKAAAKDAAAAA4AAAYOAAAABAIAAgQCAAYAAgACBAQABgYEAAIABgACAg\r
+        YAAgQGAAYGBgACBggABgYIAAgACgAKCAoABgIMAAQKDAAGCgwAAgwMAAAADgAIDA4ACgwOAAAODgAIDg\r
+        4ACA4AAAgIAgAEDgIACgACAAQABgAIAggAAgYP8AAKD/AAgIAAAICAgACAAAABhAWAAoUGAAaGhoADBg\r
+        eAAoaIgAMICoAChggAAACAgAEAgIABgYGAAoUGgAKFhwAChwkAAIGAgACBAQABAgKAAQKDgAIEhgACBQ\r
+        aAAAAHgAIFh4AChgeAAAeHgAeHh4AChogAAwaIAAIGCIADBoiAA4cIgAIGiQADhwkAAoeKgAKICwAAgQ\r
+        AAAIIAAACAAIABhICAAICBAAMIgQABAYGAAYICgAGCgwAEhISAAwSFgAGFBoAChYaAAICHgAOGiAACh4\r
+        oAAweKAAGAAAAAAIAAAAGAAACBgAABAoAAAYUAAAKGAAAChoAAAAeAAAAAAIAAgQCAAQEAgAGP8IACAY\r
+        EAAIEBgAMJAYABggIAAAACgACBAoACgwMAAAKDgAEDA4ADg4OAAoOEAAGDhIACA4SAAAQEgAMEBIAEhQ\r
+        UAAISFgAIEhYAChIWAAwUFgAIEhoAEhYaAAYUHAAMFhwABhYeAAoWHgAIFiAAEhwgACIiIgAGGCQAAAA\r
+        mAAgcJgAKHCYADB4mACYmJgAACjIAEBw+ACo//8ASAAAAFgAAABoAAAAeAAAABAIAABICAAAGCgAAAA4\r
+        AAAYOAAACEAAAAhIAAAoUAAAAFgAACBYAAAAaAAAIGgAADB4AAAAiAAAMIgAAGiIAACAmAAAGAAIADAI\r
+        CABgCAgAEBgIAAggCAAQIAgAECgIAAgwCAAQMAgAODAIABA4CAAYOAgAEEAIABhACAAgQAgAIFAIAChg\r
+        CAAwgAgAMJAIADCoCAAACBAAGBAQABggEAAoIBAAKGAQAChoEAAgeBAAKHgQAEh4EAAY+BAACAAYAAAI\r
+        GAAICBgAEAgYAAAQGAAQEBgAABgYAAgYGAAYMBgAKHgYADCYGAAwoBgAMKgYAGj/GABgCCAACBAgAAgY\r
+        IAAQGCAAGBggACggIABIcCAACAAoABAAKAAAECgAEBAoAAggKAAACDAASAgwAAgQMAAIKDAAECgwAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAARxBSUlJHAAAAAABYWFlY8kYAAAAAAAAAAAAAAAAAAJFgqqRLSzAwBXMAkKJbW1pdSVmE\r
+        AAAAAAAAAAAAAAAAEJdLqhpgYKQFkf9NmVRanHVJVZRQAAAAAAAAAAAAAAAAUY6RO6qXMHNYW5MxdFpm\r
+        TVtPSpAAAAAAAAAAAAAAAAAAAAAFpIYAAFSeW09PU15KU05MaEkAAAAAAAAAAAAAAAAAAEtgAAAAk55j\r
+        ml5Mp2haXUqpW3IAAAAAAAAAAAAAAAAAS0sAAEpJoE5PpZpMZVWnMZyZVQAAAAAAAAAAAAAAAABLMAAA\r
+        cqCeSnppZGZKWzFNaV2ecAAAAAAAAAAAAAAAAEtLAACLVF6iZHROp2eiW1paeWnxAAAAAAAAAAAAAABI\r
+        GmAAAElJSmh6SWNVSk5hZqJ1VXUAAAAAAAAAAAAAlpmjeJAAk12eZXZ5p3WndnZpaUlbZgAAAAAAAAAA\r
+        m2lFRTw8PDZeWV1OlE0xeWlNeVVdZmmZUAAAAAAAjzYKRaysRUVFRa02SXSnYaFNTUxpTFSoTmKTAAAA\r
+        AI8KOkSrrKysrKxErDullF6fVWhiVakLaVWbVZoAAAAAqK2sRKZEqyCsRKummKBZT0xPTHppZVMLqVN4\r
+        cQAAAAA6O6sYGKYYGKsYphgELjejY09KTTZNaWdMNpkAAAAA+zc6XFxcd3d3XASmXEw6PZZiZ6g2ZUw2\r
+        T2QLnwAAAAAdoTtcLcV3pndfLi2jraMtcmNkT05np0xnaXhUAAAAAAD5NKL87xgYd1+eLZ06+1wAVE6o\r
+        p2cKZ2WjjgAAAAAAAAAQo67EcuZuj5jkACue9gAAkTEKeJfbioptRgAAAAAAAACIr0dLVwBXmEeL5Qg4\r
+        AAAAAOnqwNbVb9O5AAAAAAAAAP38RmDae3tfkDqIX0UAAABq3W9v6+2BtssAAAAAAAD9q6v7AFl1dV9f\r
+        mpgIXwAAAABrtG9v7O2BagAAAACSF52fL/AAAAAAAHUAAAAAAAAAAACC1NS+3s/ZzAAAAJ03MjqjdJ0A\r
+        AAC3FIMUtwAAAAAAzr27goK5awAAAAAAWaNgGho3dAAAyr+/v4ODtQAAAMmAAM+2zxMTawAAAAAAAK6z\r
+        kZ1xAAC1un3HVwAAAAAAAAAAawB/ftAAAAAAAABCNUIAAAAAAAAAAF8AAAAAAAAAAEcAAGpGAAAAAAAA\r
+        AEKsEQAAAAAAAAAAlZUAAAAAAAAAAAAAAEgAAAAAAAAAAC3hAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAA\r
+        AAD///////////4BwH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAA\r
+        AAHgAAAB4AAAAeAAAAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9\r
+        /s/j/P/v8///7ygAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAEAAAAAAAAAAAAA////AFEl\r
+        swBJDW0ABEMwAAJHSQAFDwIAXl9ZAHJtagBwfYQAQVNqAAFtAAAAZgAAAz0CABQ/AQAXQwAAGkAAAA8g\r
+        AQAhSJQAM1SRABw6fgAFVk0ADE48AAplaQAgWgIAMYcMACl7CwAOJwMAAAMtABwPNwAhIQAABxACAA9S\r
+        UAAnQUgAAISfACRoDAAxmwQAK4MHABMpAAA8P1kATBMbACQSVwAKL1EADS5CADFMVQABIF4AJ3CGADB2\r
+        kAAzdlEAMnY1ABMnEwBARooAVVq5ABgATwAWBn0ABh56AAULaQBOeKYAT3WSACpNZwAucpgAMHifADFx\r
+        nwA1b5YAMF93AEBalgBvjecADCLAAAkPpQAbJr4AFiLGAAAJjgAzbIEANGh8AClhgAAzfKEAMHWWADJz\r
+        kwAsW3MAQ4mvADyY9AAtgf8AIpr/ACuk/wBdk9UAG0tkACladQAqbI4AK3GUAC5vjwArbpEALWJ7ACdl\r
+        aAAOaoQAJJ20ABx0gQAeTF8AJ116ACViggAgZosAJmeJAChvlAAhZIgAH1ZyAHVmYwAaPVMAJ19+ACto\r
+        hgAmaIwAKGB9ACFdfAAgY4YAGU5qAFtgYQAYQVgAIVx7ACtrjgAtZYIAJmKAACNhgQAmX3wAIUpdAHp6\r
+        ewARN0wAH1R0ACdXcgApXnoAJ2B+ACligQAdSmAAKiopAGZlZQCRkZEAbm9vAFFSUwAWO08AJFRuACFP\r
+        agAhUm0AHD9RAAMKDgA3NjUAWlpaADk5OQA3NzcAPDk3AAYSGQAVNUgAFjFAAA8jLwABAgQAVQAAAP//\r
+        /wBWAAAA/f//AFcAAAD8//8AWAAAAPz//wBZAAAA/P//AFoAAAD9//8AWwAAAP7//wBcAAAA////AF4A\r
+        AAABAAAAXwAAAAEAAABgAAAAAQAAAGEAAAABAAAAYgAAAAEAAAB3IFIAbWFuAAAAAAAAAAAAAAAAAAAA\r
+        AAC0VWMAtFVjALwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAEAAAAAADgDAACfAQAAPwAAAAEA\r
+        AABAAAAAAQAAAEEAAAABAAAAQgAAAAEAAABFAAAA////AEYAAAD+//8ARwAAAP3//wBIAAAA/P//AEkA\r
+        AAD8//8ASgAAAPz//wBLAAAA/f//AEwAAAD///8ATQAAAAMAAABOAAAABwAAAE8AAAALAAAAUAAAABAA\r
+        AABRAAAAFQAAAFIAAAAZAAAAUwAAABwAAABUAAAAHgAAAFUAAAAeAAAAVgAAAB0AAABXAAAAGgAAAFgA\r
+        AAAWAAAAWQAAABIAAABaAAAADQAAAFsAAAAIAAAAXAAAAAQAAABeAAAA/v//AF8AAAD8//8AAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAI2Oj5CRkpOUlZYAAAAAAACCg4SFhoeIiYqLjAAAAAAAAAB6AHt8fX5/gIEAAAAA\r
+        AAAAcQByc3R1dnd4eQAAAAAAAGgAaWprbG1ub3AAAAAAXF1eX2BhYmNkZWZnAAAAT1BRUlNUVVZXWFla\r
+        WwAAQUJDREVGR0hJSktMTU4AADM0NTY3ODk6Ozw9Pj9AAAAAJygpKissLQAuLzAxMgAAABwdHh8gISIA\r
+        ACMkJSYAABITFAAAFRYXAAAYGRobAAAHCAkKAAsMDQAADg8QEQAAAAMAAAAEBQAAAAAABgAAAAACAAAA\r
+        AAAAAAAAAAAAAP//AADgBwAA4AMAAPoDAAD6AQAA+gEAAOABAADAAQAAgAEAAIABAADAQQAAwGEAAIxh\r
+        AACEYQAA3PsAAN//AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAAGAAAACAAA\r
+        AAcAAAAHAAAABgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxIOAwgFBAEOAQAAEgAA\r
+        ABgAAAAbAAAAHQAAAB0AAAAcAQEAGQAAABYAAAAQAAAADQAAAAwAAAAKAAAACgAAAAsAAAAQAAAAFwMH\r
+        CRwBAgMhAAMEIwEEBSUAAgMmAQICIwEBAR8AAAAYAAAAEQAAAAkAAAADAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQICAAgBAgATAQEBIAcI\r
+        CCwFBgc2BQUGQAYGBkgGBgVOBAQEVQUFBVUEBARTAQICTQcHB0UGBgY+BwcHNgICAi4AAAAoAAAAJAAA\r
+        ACcBAgIsAAABKQAAADAAAAA7AAAARwAAAE0BAABOAAAATAAAAEgAAAJCAQUHOAEAACwAAAAeAAAAEgAA\r
+        AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGRIMEgAA\r
+        AB8AAAAxAAAAOwAAAFUAAAB2AAAAjQAAAKgAAAC1AAAAsQAAALIAAACrAAAAmQAAAIcAAABuAAAAWgAA\r
+        AEoAAABAAAAAQQABAzwAAAA8AAAAfA4eJZoGDA/AEx8m2A8YHNoSFxjaEBgbxwcAAJgDAACDAAAAagAA\r
+        AFUAAABHAAAAMwAAACAAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAQBQMCIAAAADMBAABMEA4Nkjc2Ndh9e3r4kI+P/J+fn/+IiIn/b29v/3Jycv9xcnL/Xlxb+0lK\r
+        SvJGRkbaUVBQzBoaGqIAAAB4AAAAUwEAAF4MCwu/G1Fw/xtTdf8iQVD/ImCB/xtXdv8YN0n/HE1s/x46\r
+        S/8QIy35EiUw4QoDAKMAAABwAAAAXAIAAEIAAAArAAAAGAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAQAAAASAAAAIwUFBjIAAABkQ0ND/46Ojv9/gID8hoaG/YmJif1ycnL8YWJh/VVV\r
+        Vf1bW1v+ZGVl/nNzc/94eHj/np+f/7Ozs/9HSEn6AAECmR41QuYaP1L/KW2V+xZbh/spVm38Gi85/B1X\r
+        dPwpQE78H2OO/CZoj/0eSmP+Dz1a/w8oN/0AAACtAAABdgAAAGAAAABEAAAAKwAAABcAAAAGAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAMAAAAGwEBAC4AAAA9Dg0LtDUzMv9nZ2b/bm5u/oWF\r
+        hfu7u7v9v7+//qioqP5xcXH+cnJy/nl5efuQkJD6cXFx/FBQUP8kJCLuAwAAvyJpj/8mdJ77FRsd/ipp\r
+        iv4sW3L+KFNs/hZLbf4kOUb/HDlJ/htae/4XKjX+KF17/DCTxf4jPEj5AQAAyQUEBHEAAABRAAAAOgAA\r
+        ACIAAAAPAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAABgAAAAlAAAANhMQ\r
+        DoYqKCfbVVNT/zIxMf+Li4v/4uPi/qurq/99fX3+fX19/2FhYf+UlZX/fHt8/zIzNNEFAQCqHjdF8yNZ\r
+        dvwkUGj+Hk1q/y9adP8hKi3/IERa/xhah/8kdKT/IGOG/xEwQP4lUWj/MlVo/zJmfP4hNT3+Ey88/wkV\r
+        G9MAAABZAAIDPAAAACYAAAATAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAIAAAAJAAAAEQAAABAAAAAlAAAAUAAAAH4TExPdtbW1/qysrPx+fn7+QUBA9RUUE48AAABzSFNQRQAA\r
+        AEseOkvoI2iW/yArMf0TM0P/G2SS/h5VeP41XXH/J1d0/h0+UP8rYXz/NISq/zxrf/8hXH/+FFB4/ixt\r
+        jP8oSFn+IWKJ+w0iK/8DBAScAAMFOQAAASEAAAARAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAABMREANaW1oDDQsJAQcICAAEAwNqdHR0/8PDxPhmZmf/DAwMmHt6\r
+        egAiLzUAbImSABsgIZQoc5z/G0hn+iNQaP8fU27+Jm+W/zFwkP8qXXv/GUJc/y9QXv8papD/MFZq/xca\r
+        Gv8zfKD/KH6q/zSMtv4sUmj/G2WX+ydxlf4aPE3MAAAAHAoYHxcAAAAIMSgjAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQEAAgIBAgAAAAMAAAArSEhI+8TE\r
+        xP1LTEz7AAAAMwAAAAIbLDUHJj9NABAVGK8oYHz+F0BV+xxkkv4kapr/Jkte/yA1Pv8veJv/KWmH/zRo\r
+        g/8TTXb/ImyW/ydVaf8ZMkP/Klx4/zFmfv8nQ07+L4ex/jap4P0WNUP1AAAAUgAAAQAAAAACfmteAAoJ\r
+        CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOrr\r
+        6gD+/v4ELzAw0rS0tP8xMTHkAgECDl5eXgARBwEADwcBLiZRZ/EOGBz+H2KH/RM/W/8eYpH/LU9f/yZk\r
+        jf8kWHf/MlRh/zFmf/8mg7r/K43C/zZviP8VSG//G2KR/x1FV/8mU2z/LWGE/y5LV/0jWXL+K1Rm9ggA\r
+        AEofEA4AJx8aAQoFAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAKSlpQGvsLAAMDExqJubm/4oJya3eHp7AGRsbwUrRVEAHSYpkClqjP8KJzf6GEpk/yeB\r
+        r/8sdZz/OGV6/xVMbv8icKP/I1Zt/x0cHP83YHD/OpC2/zNjef8idaT/IGmP/yJcdf8kWn//FlSA/iM6\r
+        Rv8RKjb8Oqnb/yRCUOMnHBgMIBsYAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDQwJFRUUALi4uh42Ojv8cHR6hRkhJAEFVXgWh3uQAHy0zuiZL\r
+        Xv4YVXv7F0Ri/iR6ov80aYH/MYCl/xxijP8hcqb/MXma/y5edv82hK3/MU9b/yUtMv8eZof/M6vj/x9O\r
+        Yv8ufqf/IXOh/y90lf4XP1T+IV+A/C1hef8AAAI7AAECAA4REQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKampgGysrIALS4uopGRkf4VFRWhNTc5ACQm\r
+        JwYsIBcADAQBqh9Sbf8TSGr7H16H/xsyPP8iMjn/MW+L/zCazf81ndH/OV5t/yVwnP8TUnv/MY28/yM5\r
+        Qf8iU23/HlFp/xhIXv8pZoH/Oa/l/zBjev8cXYX+IGaZ+Ro2RP4IBQZgCQYGAAwMCwMbEgwAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAG5ubgDIyMgIPTw83KWl\r
+        pv80MzPEw8TFAXt7egQBAAAACAQDZx84Rv8tfaj7JFp1/ydef/8reKf/NG2I/y9UZP83TFX/NoGj/yR9\r
+        sv8QOVr/K4Ox/zRVZf8eXIX/JmeR/xgyPf8UO07/Gz5O/yBQZv8hdKH/JHKj+iZ8pv4AAACbAgoOAAYT\r
+        GgIQCgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCgkAERAPBAAA\r
+        AAAAAABWZ2Zm/7Ozs/46OzvvCwsLFrq9vwEuQT8AGRscdypNX/8kOkT7J0hW/yV5qf8LME//NZ/X/yVE\r
+        Uf8UJzH/KWmG/zCXyf8zmNH/K2B4/ztwiv8ZYI7/J3al/yVOYv8gcp7/IWqT/w4vPv8og67+Nq/o/R1c\r
+        ef4JGyPuCQ4SHQYDBAAIBAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA\r
+        AAQNEBABHSIjACAkJQovLi7YwcDA/bS0tPpeXl7/CQkJZAAAAADA9f8CCR4txhxeif8cOEX7JTpD/zdz\r
+        kP8lhbX/NoCj/yRWbv8bZI7/Hl6D/yJPZP8kUWT/HEda/x9BT/89q+D/NXKN/yNZc/8bXYn/HmKQ/x9l\r
+        if8JGB//H1lz/hlVcPwldpz/AQAAZQEAAAAECgwHAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA\r
+        AAH/AAEDERgdAAAAAAAKAAABAAAANwAAAKw1ODr/cnR1/F1fYf1OUVP9FRMT6wkAAEA+eaMAFCAnqyFk\r
+        j/8TO1L7H2OP/y1PZ/84eZb/K2V//yBliP8YUHX/Jnyx/xpTbv8ZUnD/JXyn/yVzmP8lQk7/KDY8/xxW\r
+        cv8wnNL/L5LH/yRxlf8XPVH/JlFv/iFadvonf6j+BQECgwYFBQAMFBoIAAAAAAAAAAAAAAAAAAAAAABs\r
+        ogACAAAAAAIDA/8CAgCBAAAAAAAAJBQRFGstTlnBBnOK/wCYtv8ArtX9AKLM/wCkz/8ArNX+CJa6/x5Y\r
+        aPwAJS6sBwICty1gff8VO1D8Fkdn/x1uof8xbIj/HSMm/yRbdf8rkMT/LZPF/xtbd/8ne6v/F0lz/yqH\r
+        t/8XPEz/M57V/zBui/8maIb/NKvi/x9cef8dX4f/GlmE/ytkhPsfYHz/CBslmhVIYQAMICoIAAAAAAAA\r
+        AAAAAAAAJNT/AABilAACAAECAgABAAQAABcADRSWPHWH9Fu00P8dxPT/BNT//RG8//wOvf//B9D//gHX\r
+        //4C0///BNb//SrU//5tzO//L5Kr/wNBU/8XIyr/KElb/yuOv/84eZb/J1Z0/yROZ/8lWXL/GlFq/xtL\r
+        Yf8qjb//K4zE/yd0mf8vb47/GViE/ymDtv81b4r/GUlg/yBEU/8rhrX/IXKh/jiVwvwbKzP/AgwRxxeB\r
+        tgEHGyUFAAAAAAAAAAADBgoAJ+b/AAA6VwEAAAAACAAAUwBBVuBbr8z/ddn//w66//sVnfn9JJD0/jps\r
+        9f4jkvT+EK/2/xan9/8Psvn+D7P4/wmm9f4luP38xOX//WnG7v8AUHb+HjVB/yFKXv8xVWX/HV2F/xZX\r
+        gv8yXnT/J1Jn/zNwkv8kTWD/LZjJ/yFRaP8udZn/GFmB/yZ5p/8nVWv/ID9O/y6BsP8qVmr/MZ/S/zZx\r
+        i/09eJP/GzZC8gAAABwJAgAAAAAAAAAAAAAAAAAABSAtAQE0TgAKAQE7AEty/2/P//+Bz//6B6D0/TCA\r
+        +P48cvn+O2z5/jtw+v87dvv/LIP1/ztt9/8lj/b/HJz4/i+J+P8XiPb+ZY32/vnv//9lyf/+AGeR/zI7\r
+        PP8bIyb/NG+N/zSUxP83aH3/KoCt/xZPev8sgbL/HThE/zJngP8yW2z/Mp3Q/zCf1P81Wmr/OYGo/xVW\r
+        g/8sdJ3/LWJ5/ytbcf0neqD/KmN/9QAAACIAAAAAAAAAAAYFBwAAAAAABBkqAQggKxIAS3DeUsb//s3M\r
+        +vsrefP/Lob8/ilE1v4ULbz/PXr//zRm8f8vXun/PnL9/zls9/82c/f/L4b6/0Bz//8uU9//ESq7/2+O\r
+        8v+Qo/D/IHPN/xc0Tf8nYYT/Ikpf/ypJVv8oPEX/LGuM/x5wov8tfaj/OWyD/ymFtP8vdJf/NV5u/zFl\r
+        fP89cIf/O7Lv/xdEX/8vk8b/KDtC/yxQX/0mdpz/KVFi6WJRShIAAAAAAAAAAAYFBgAyWHQCD0h0AAIH\r
+        Ioc6fOD/4ev/+3ma+f8uZ/r+RoD//xYuvf8AAJP/OXL5/yxV4P8DCZr/MWbv/z15//87cvv/MVzp/zdx\r
+        +P8sWOH/AACV/wAAiP8ANF3/AnSB/wUmOf8VHiv/GlyB/zBid/8yY3z/L2F5/y5xkP86epb/RYyw/xJG\r
+        bP8rgrb/Q5zE/x82Qf80a4f/O3mV/0G17P82cIn/LWOE/z9nffxNjan/JjtCwqHT5gBhf4oGAAAAAAYE\r
+        AwAvS0wAE1NlFwwsd++PrP/91dbz/Txx9P4lUd7/FCu5/wwYrf8AAJX/Bw6l/wkTqP8AAJH/Chaq/xUt\r
+        u/8vX+j/HT3J/wcPoP8KFqn/AACg/wIBZP8MPFr/Enyp/wEuQf9CW1T/NHaW/zxxiP8lYob/G2KQ/zFX\r
+        af8eJCX/MHGP/zOb0/80q+n/O4Cf/yRlif8XVn3/PG2J/ztvhP8zZoH/Ez1d/iJhh/stSFT+BgcHeAoa\r
+        IAAFBwcHAAAAAAkVLgIAAAAAAAAAOSNTuv/C1//9oKDd/gUNov4CBJr/AACQ/wAAlf8AAJr/AACZ/wAA\r
+        mP8AAJ7/AACb/wAAkv8FDKH/DRus/wAAkf8AAJT/AACY/wECp/8CAKL/CgiI/y1Ja/+V6uX/PVxf/zNd\r
+        cf8eZ47/EkBd/ztwiv8sao7/J1l2/zhofP9Jrtn/L1ls/yyHu/8cZpf/PrDp/yU4P/83cIr/MpzT/jqq\r
+        4/sgNj//AwMEZgMAAAAGBgUHAAAAAAAEJwIAAQgAAAEDQRIrof7I2f38l5rd/QAAmP8AAKP/AACd/wAA\r
+        oP8AAJf/AQGJ/wEBi/8AAIr/AACL/wAAlP8AAJr/AACb/wAAof8AAKX/AACc/wAAYf8XJk7/UIOF/p77\r
+        +P+g/Pj+OlhZ/iQ4Q/41gqb+QZ7K/jl0kf8iZpP/E0lr/0Cx6P80SlT/JT5K/zB/pP9Dwfb/OX6e/yta\r
+        ef87dZn+SY2r/Td3lPw1V2T8BAMDSgUFAwALDQ0FAAAAAAQCNAMFBCkACAcXVQAAhf6zuvP6rbLl/QAA\r
+        cv8EA1D+BwlD/xoBLf8aBDX/Dw1r/w0LZf8QDmT/FhBX/wcjO/8BFUP/CgRF/wgIV/8EA2L/CxJJ/2Og\r
+        lf+a+vD/q////3W3sf8iOUf+LDVB/jFTYPwhUW3/Ol5y/h45Rv4vmM//NpvR/0G79v82aYD/NZLD/zJw\r
+        lf8uTFj/Mltv/xdIav4hcKH/MU1a+kCJqv8aRVi+JFlxACtPXwEAAAAAAAAAAAICHgIBARMAAAAUPwIB\r
+        Q/52ebj72OD5/QcHdf0CAYT9BhV3/pgEAP9RDCj+FRqM/yYdkP8GB6f+GQmP/xRncv4CmIf+HQZS/xMW\r
+        h/4QB1r/OldT/6r///+V8/X/ME1J/gAARP8AAIT+Gxwm/zNpgP8ORG37NIrA/jJZaf8oVmv+LXKR/iVK\r
+        Wv83fZ7/E0Zn/x9vov85dpL/NkxT/zqs5f8zh7T9OGR1/kCMr/g/Ozk5Q0lLACAzOwIAAAAAAAAAAAAA\r
+        AAAHCAYAUlQJBxIPD+AeG3X/wMbw/0ZIvP8PCpr/JyBV/6EAAv4qE1P/CQuy/xUQwv8KCbL/DQiO/hYZ\r
+        T/8Atar/GSVS/xAJff8gF4T+LDdK/qL//v52wLn/AAA2/gEDYv8CBE37AAAATRs2Qb8weKH/Obbt/z+F\r
+        pfsvdJv+HGiU/zWJs/41bYX/Na3o/y+Wyv88d4//Royw/0N8nf5CfZz8L0tX+RYfI4xXVFsZRD9FAwAA\r
+        AAAAAAAAAAAAAAAAAAAMDAwCJCUQAAoLCHMKCQffS05etpedu9MICyrpQA8X+YoAAP4NFzH6FhB++xcT\r
+        c/ocF177GRlt/BwGR/sAfnr9D2Rt/x4LR/4gH17/DwcV/zRYVv9wppf+BQBc+wAAl/4AAxGxAAFhAGgA\r
+        ABEcGhyXK1hn6yRMXv8xmM7+F05y+jOj3/0nQ03/SYen/jyDs/4qLTL/M2dj/zlMKv1AbDf+IToL3gEH\r
+        AG4bXAARLGsAAAEDAgIBAAEAAAAAAAAAAAAAAAAAAAAEAQQDBAkDAwOmAAAArJWcspIoR0ueRwAA7nAA\r
+        AP8ABgDPRUEqxCkpGckAAADVAAIA2gAAANcAQkL5AHl4/gYAAMgECQCsCgwJrwAAAOgIS1X/AkVd+gIK\r
+        Nf8LAABoEQsKAB4YGwAHAAAAAAAAGggFBnwwcZD9OabY/z+y6P9BZoD+OVND/ydMGP8icQD/LJoC/y+u\r
+        Gv0pnBP+G24V1QoeA2gcPQZQDhIJJgEAAgABAAEDAAAAAAAAAAAAAAAABgYFAQsLCwANDQ0kAgICwiEi\r
+        K8EnMkLGPQAC/iEMDN0BAwWPS0pQixsbH5EAAAKWAgMGngMCA5sCCAjJAFBQ/wkND+IKCQvEAAAArAAA\r
+        AKIFISrbAZmv/wDH2vsDXnLyCAsKPQ8YGAAEIScFFRQQABEAAAADAAApAQMOcQ8SHakgSRD+LY8G/i6S\r
+        AP4zqQn/MZEN/zCZGv8ylxv/M4kO/yNSAf8WLQD/Dh0BpgAAATEBAAACAAAAAAAAAAAAAAAACAcIAAkJ\r
+        BAEDAwQAAwMCFwIBAMARAADKmAAA/xQMC5IAAABJ4uHgXGpqaVwAAABcAgMDXgADA1MQAQGBA5qa+wBD\r
+        Q9AKAQGyQWpq/yI4OOAFAADIAiAo7QDX//sAwO3/AyUsgAQ1QAAFUmQDFw4HAQ8AAAUOIggsHjEAgCZ6\r
+        Ddkwux/9MnwE/TGREP4wnhT/MJoP/zFjAP4udQD8I1AA/REVBKgWHQc0GicKIgAAAAYAAAAAAAAAAAwT\r
+        GgAHDxYABQUGAQkIEAUFAQAFDAoGKwUQOtQFGGL+GxNB/w8UErkMDAqFbm9wfGJiYmwEBARrCgoKawgL\r
+        DGkOAABrDmxs9gB5efUfGxvrsP///2qqqv0AAACRAyEoqgDN+/wDl7j/CRYWUgsWGAADHSQEAAAAAAAA\r
+        AF0DBgD4JW4U/ymvJv8tfQf/LmoA/zGvIf4weQT/MMIp/zGWE/8rWwD+GEYA/REzA/UAAAKjAQAGWggG\r
+        BjUKCAcAAAAAAA0VHQAIDxcAAAAAAAMPPAAEDTYAAgYbkQArw/8AOe75ADnr/gEWYv8GBgWfCgwQfBMU\r
+        FJwdHh+tJSYnrh4oKbAcHyCpDjc31ACdnv0BAAC+QE9O/CxJS/8AOETLAaC+/wGlx/8MLTWeF3d3ARNM\r
+        XAIAAAAAAAAAAAAAABURLAFbDjUIXAkQAKkYMwDyK2IA/DG2Jv4vfgn/MI8N/jDXN/4tiA7+LmEA/CRF\r
+        A/wIDwHVBAMBngkOAj8JBwYAAAAAAAwTGgAECQ0AAAAAHwsTKGsJDyJbDQwQmwold/0AHpD7ACCv/QAa\r
+        df0HAwQ1BwEAAAAAAAcAAAAHAAAACAgIBwsICgoHBQYFUQGVk/8ASkh3AG1pPwA2OaUBbYDfAWZ6yAEB\r
+        A2YAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAANGwAAER8AKxEkAG0XRwWpL20A/jGmHvwwhxH/MHEA/zGX\r
+        F/8txy3+JHoG/xxNAf0IGAKPAAADNgQACAQCAQEAAAAAARopNwASIjACIC05yVZ0kP9KZHz/UWyH/1t4\r
+        jf9adYr8PlVu/w8VHeMAAAAaAAAAACEaEwAAAAEABgwOAAwBAAAKAAAABwAADAJwc+0BXGXeA5moFQB4\r
+        hi8AAAACAAAAAAADAAAAAwIADQAAAA0AAAAAAAAACwgIAAAAAAAZPgIICRUDFAAABSAkdALsM30A/S+I\r
+        E/4wdwr+MYMA/jJuAP0ldA39DjgS1xExAuAHHADrCQUHvQgCC30HBQUtBAMDBQAAAAAAAAAhKjlG+Vt4\r
+        kfpDWG36KzxM/VNyj/89U2r+RmB3/jZKW/lJY3vgKTZEuRIQECoUFhgACg8RAyAAIAABAAMIABcASAYR\r
+        CeEBQgn/BSwA5ABEAP0BLAPEAhIGnwIAAh8DAAINEwAMACQCGAAAAAAAIRkXABgdDQJHcxIADAAQDhc1\r
+        BtYwmwD/LF0A/yZvBfwybwH+KnoA/y10AP4rVQD/CA0CpSx5AQ4teAAdBwAGPwQFADwAAAAPAwEBAzRH\r
+        VwA7XWAXM0VT567W9P+2xdf4XnCA/sjd7/652vv+epWr/h8oL/89Umf/YoWn/xciLI8uQ1UAJTc/BgcA\r
+        BAUDDAKDAWAA/wDJAP4AgwD+AMsD/wCQAv8AhwD/AJQA/gE6AfcEKgNpBjIEAAgiBQMAAAAAHhYVACxr\r
+        CwAAABIrFDgF0SN2AP8SPQDQCRQAuiFtAPMpWQD+GlAA/BxVAO8qVQDzIVIA/wYaAmUOMQMACBgDAAYF\r
+        AgAAAAAABQMCACg2QQIlODsACBIbTxoqM/RYcH7/dnR0/2daV/61ur//g4GB/6CnsvyApMT7Hys2/wkM\r
+        D1gLDRIADxoRAQ4ACQkFMgPgAJMA+gCrAPgAlgD8AKMA/QBeAf0AkwP/AIAD/wZxBOQDEgJRARAAAAAN\r
+        AAISDQ0BCQIJAAMACFkMGgTYHWQA4QgeAXwAAAAjDzUAmBlRAv8PHgCuEjsAxxRLAM8PEgBcLmkA/xAt\r
+        APoABQI7Ag0DAAQDAwMAAAAAAwAAAGiNrAAAAAABCxMbACIAAC1UIiyVSyco8YAAAP5MWmT7V2Bv/4ii\r
+        wP91mrf+ISs0yAAAABURIBcBAgIAAAkABlMEVAP8AIIA/wBWA/8AUAP/ADYA/QAMAP8BCgDnAAAAeRlj\r
+        EgwJPgYABgAEAAAwAABXQj8AAAAAAAAOABYAAAAUAQADBQUEAwAJFAISDzUB9wAOAIIGCwA8CRoBchA1\r
+        Af4AAAAYChgAYBEiAdUBAAKvAgAEMwUEAwACAQEDAAAAAENabQAAAAAAAwAAAlIIBQBvAAAlKQAA508B\r
+        AO0AAAAxAAAAMgAAAEIAAAAyAAAAAgQFBgAWIhkBCQAGAAAEADcAGwBzATwBjQkBAK0CAADIATA0/wQ3\r
+        Or0VmJwUBLCzAAAAAAAQVwoBBAQCAAAYAAAyJiQAAQABAAAAAAADAwIAEBIKAAwNBwAKCgWKBAQDqDkq\r
+        JwMACgARETQGIwokAf8FBwNlAgMCAAAAAFQAAgA2AAMACQAAAAAKBwcAAAAAAAAAAAABAAAAAgICAAAC\r
+        ACAcA23yYBTX/zcMmPsNBxFLFgkmABwKMwAAAAAAAAAAAAAAAAAVIxkACgAHAAEEAQAAKwAAAdMBABHn\r
+        8gAJ19YFA3Jy5wGhodMA+/kAAtXUAgAdAAAOUAkAAwQCAAAAAAAAAAAAAAAAAAAAAAATDw0CEAwLAAoH\r
+        ByUHBQWnVUU8BRANCwABDwACEEkDAAQNAcsCBgGhAwsBAgECAAIAAAA7AAAACQAAAAAAAAAAAAAAAAAA\r
+        AAAPCRECCgAWAAMAAFVfDdn/rH7/+IhI//8cAEmtRAC1AkgIpwYDAwMCAAAAAAAAAAAKCwcADQMJAAcF\r
+        BQEBCgEDAP8AAwZbWQUGeXgACCwrggF+f/8CAAA6AwAAAAQFBAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAABAAAAAAAAADwAAAAbBQQDAAAAAAEKCQcCBAAEAAYEBGIEBAPJAwICAAAAAAAAAAAKAAAAFAAA\r
+        AAAAAAAAAAAAAAAAAAAJBQoBBwQPAAQCByc7B43pfDbo/E8bp/kFAhJiDwM2ABwFQAIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEGAAAABAAAGwQaGdkEFBNWBRwcAAUNDQIAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAADAoJAAAAAAAeGBQABgcEAAYFBAcGBQSpAQAAIgEB\r
+        AQAEAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCA8AGwszABcHLQABAQJ8HQBT4gAABbUAHAAAAH4AAAA4\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAANAAAAFQwJAAoAABgBAAAMAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADAAAAAAAAAAAdFhMACQcGAwgG\r
+        BQAFBANhBgUEUQgGBQAKCAYDAAAAAQAAAAAAAAAA////////AAD///////8AAP/+P////wAA/8AD4AP/\r
+        AAD/gAAAAP8AAP8AAAAAfwAA/4AAAAA/AAD/wAAAAD8AAP/wBgAAPwAA//wcAAA/AAD//jwAAB8AAP/+\r
+        PAAAHwAA//44AAAPAAD//jgAAA8AAP/+OAAABwAA//44AAAHAAD//DgAAAcAAP/8GAAAAwAA//gYAAAD\r
+        AAD/wAAAAAMAAP8AAAAAAwAA/AAAAAADAAD8AAAAAAMAAPgAAAAAAwAA8AAAAAADAADwAAAAAAMAAPAA\r
+        AAAAAwAA8AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAEAAPAADwAAAYAA8AAPgAAB4ABwAA/AAAH4AD\r
+        AAD+EAAPgA8AAP4AAA4AAwAA/AAAHwADAADwH8Q/wAcAAOAf5//gAQAA4Afgf8AfAADgA4AfgA8AAPAD\r
+        gB4QDwAA+AcAf/JHAAD8/4H/5y8AAPj/+f/vPwAA8H/5//8/AAD4f/z//78AAPj/////nwAAKAAAACAA\r
+        AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAQEBAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlDWggSKjYNDyIsDQsc\r
+        JAwoQlEJFB4jAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMD\r
+        AgAMDQAGDA0OEQAAABoAAAAmAAAAMAAAADYAAAA1AAAALwsLCycYGRkfDAwMGwAAABkEDBAbAAAAHAAA\r
+        ACgAAAA0AAAAOAAAADMAAAAqAAYKHwABAhIAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAACCwkGEgEAACkAAABDCAYFeR0cHJ0bGxy1FxcXtxcXF7MMCwqhAAAAggAAAGEAAABCAAAANwAA\r
+        AEgMICqQDyAotxMrN84QHybQEBkeuAcFA5IBAABsAQAARwEAAC0AAAASAAAAAgAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAsHBgYkAAAASTk4ONV6eXn/lpaW/4uMjP9mZmb/ZmZm/2NjYv9iYmL4gICA60tL\r
+        S8gBAgSFFy453x1bgv8iT2n/H1Bp/x9GXP8iWHn/GkBW/w4nOPEBAwacAAAAWwAAADwAAAAaAAAAAwAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAAAAAABgICAhsAAAAzIiAftFJRUf9oaGj/lpaW/7i4uP16enr9c3Nz/42N\r
+        jv+AgYH/ODEt7g8lMOAlaIv/IEVZ+ipWbfwdSWP9IEpl/RtMZ/0bQFT8LWyO/x0/TvcDBQauAAABUAAA\r
+        AC8GFBoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwEBAA4AAAAaDQsJXS8tLKI7OjrixcXF/pKT\r
+        k/5TUlLzWlpbu0dISI0OHyqxIk1o+hw9TfwfXYT+LEtc/x9HYP4laZD+LGeE/yNSbf8pY4L9KVBk/hIw\r
+        Qf8DBASNBQoNLAUAABQGDBABAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAgIBAAAAAAAAAAAAAAAAAAAA\r
+        AD+EhIP7iYmJ/w0NDHAGAAAAAAAACyRXdPAfUnL/IFNw/SVhgf8rZIP+JVBn/ypde/8oTF7+JlNq/y6A\r
+        qv8tYHv7JHil/hlBU8mk//8MCjZOCFSt1wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAF7e3sBjY2NB2pqauB2dnb7AAAAHAALEwEVJS1NHDpI/xlPbfweX4v+KEpd/iZdev8yYXX/ImuZ/yp7\r
+        pP8eRmH+IVRy/iZNYf4ydpn8I1Rq+RkqMXQzU1cAJkxeAj5vggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAO3t7QH09PQAaGhouGVlZeLd3d0DGoW6AClOYbYYQlj+GVd4+y9+pf8qYH3/G2OS/yZK\r
+        Wf8zY3j/N2+J/yRsk/8icZj/Il2A/x5Laf4fSFn+LnOS/yYyMTAmNz8AHSwyAwAAAAAAAAAAAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAAAAAA3NzcAuTk5ABlZWa0Xl5f1gAAAAA8j74AGSkwxRtUd/4aUXL8Kk9d/i14\r
+        nP8ui73/MmuI/yNpk/8qUWT/IlJo/yFlg/8lZob+M4u1/x5UdfofUnL9ERcXZw8UFAAWIycIAAAAAAAA\r
+        AAAAAAAAAAAAAAAAAAAQDAsAEgAAAP///wKFhoYEmJucB2dqauZsb2/mS05PCwAJFQMXHyKVJ1dw/yVc\r
+        evsgW4D/MW2K/y9LVP8xfqT/HGyg/zFwj/8kWn7/HlBu/xpIXf8eTWL+JHWh+yd/sP4IFx2iP3WMAA4s\r
+        OwgAAAAAAAAAAAAAAAABKDQAAAAAAA4JBwIAAAACSk1MABoWFgAGAABrpp2b/3xycfwAAAA8M36tABk/\r
+        V8EfQFP/K09f/CV3pP8veJz/GEFZ/yJkhv8rb5D/JU5g/zCAq/8rZYP/H2WP/xtbgf8aTWT9I26P/xdL\r
+        ZPI3PUAcBA0SAAAAAAAAAAAAAAAAAAEUGgAAvPsCGRISAAAAAABOODYfL0NFch9RWfBRgI38O2t2/hk0\r
+        O85JhZw1FjNIwR1TdP8dUXP8NG2L/yZVaf8hcqH/I3Kd/xlPa/8gbJb/JlZr/ylXa/8qg7D/LY6+/xhC\r
+        W/4hUW/+IWqM/wAAADoAAAAAAAAAAAAAAAAAPlsAAQ4TAQAQFAAAAAA8MFNfsimZs/MAr93/Bbz7/wDH\r
+        +v4A0P7+C8Px/zydt/8hZXfwCyw6/yJXeP4wfaT/Ij1O/yZoif8gXnr/JXag/yeAtP8kZIX/JnSj/y5x\r
+        kf8hW3T/I2uS/yuBs/wfQ1P+AgYJXAAAAAAMEyYAAAAAAAA2SAEAPEgAACg5hUWZuP9Oy///Hqv//y+E\r
+        /fwygvv+HKD3/xqm+v8Pr/z9JrH//6je//9CkrL/FENW/y5KVv8ka5f/LGWB/yhbd/8nZoj/J2uJ/y1i\r
+        fP8if7P/LGF7/yRVcf8qcJX+MoOn+zBmf/8XM0CSGjpJAAsSJQAZbI0DBl+EAAAtSl9PodT/grz//B1/\r
+        +PspQtP+PW77/zVn8f49cPv+NnT3/jSK/v8nY+/+T2LZ/pG7/v8WXJP+IDhH/ypeeP8xW2z/JGyT/yl4\r
+        pf8vZX//L2+P/zR3lP89e5f/K4Cw/yVsk/8uTlv7K3KT/yVKWowtVmgACw8aAlOIjgAPZW4TMl2q6rvV\r
+        //1Hd/r8Llnm/wMHm/4kStb/Dh2v/yNI0v84cPb/LVjj/yRF0f8AAJH/BS9s/wdieP8RJDT/KmSB/y9e\r
+        df8pZIP/NGN1/zB3nv8qjMT/NHCL/yZSa/9AjbH/M3WV/ihRbv07aX3+GCImUxIZGgAUKlkJAAAoAAAA\r
+        IE94l+P/naLn/AgctP8CBKH+AAGh/wAAmf8AAJz/AACc/wsZtP8KFrD/AACX/wAAnP8AAIH+Cih2/2uq\r
+        p/5Fcn3+IWGG/yVihP4rT2L/K2WE/0GXv/8saor/I4G4/zdxjv4yYHf+LpDD/yJBUP4AAAAoAAAAAAUO\r
+        egoBBFAAAANBYXOD2f2Lj9f6AAB4/gACe/4AAHn+BQR6/wYFeP8GBnT/AABw/wAAfP8BAY3/AwV2/zhW\r
+        f/+GztH/hNHL/jFDSP4tZYD9OnSP/yVslf4vkMP+OnKK/y1hfP87krb/K2B+/y5nifxChqL/Lltv4Ud7\r
+        hxFAk6QEAwFFCgAAKAAAAB5cQkKR/6iv4v4AAHf/Jw9L/2EGCf4VGID9Ew6V/RQWcv0Ib2L+FRRc/ggA\r
+        Wf1TgYT9q////kVxfP8CA1L/Hi44/iNihf8ya4z6K2N+/DGBpf4zdJL+IHCf/zNieP80cY7+LH2t+zlr\r
+        g/4pV25kVpy5ADlpfQcJCAADAQAAAAcIBRsTEC3ri47B7CcxnftKCy/9Ywsc/wkRp/8WEqj/Fwd7/wt3\r
+        f/4UQXL/GAVq/0Jgbv99x779AABM/gAAWN8/SHBHJ1dy2DKIsf8ucJX/InCd/jRzj/83ltD+N2yQ/kJy\r
+        i/1CbXL+HzAuxxMfEgxia2sAKCIeAg0LAwAHBwgCBwgLAAAAAGgjISC9U3F5p0gAAPMxBgfuHyo3zxIR\r
+        GN0KBBTgAjA38wVQT/kRBhTIAAAAxxVBQvgHPHj/BQIlpBUTZwAVOkcQPzw8YSRffN4ymdD7OGaF/Dhc\r
+        RP8lYQ/+Lo4W/S+PFv4VRgawBwwAYwAPABgAAAAACgkPAAcGBgADAQACBAMABwMEA3sdFRDHVgEA8wwH\r
+        Botna2xsCgwNeQAAAHYDEhCaAVdX9wcHBcATISHAAg4TzQCInvkBoL/0AAwCPQg1RQBLamcACQAAGRgy\r
+        GYondBryLooA/jCkCf4wjgr+MIoP/iZdBvQhTwCwFzQFRGqJAAAAAAAAAAAAAAQSRwAHDy8ABgwZOgYR\r
+        TPAwFD72BQYCjYN5YXgoIhJ4EgAAdRgAAH0FeHjyEjo75H28vf8fFQ6/AGyH1wOy3P8HKS05ADpMAExK\r
+        QBMJDgSqI3cS9CyND/8whAz+MJgW/zGnGv4rYgD9GDgA8RAtBIUHGAZBBgIGAwAAAAAAAAAAAB2KAwAf\r
+        jRYCD0SbACvE/wApx/8BDTezBhxnQwwaTGkOYGFuDmRlZwZlZcYAZ2XMJ05NrwpJVeAAiKTqBmp0eQaI\r
+        mQABcnkBABMAAwIQAC4HIQRjFScAyS6KEP0xjxH9MJ4X/i6vIP0nXQD/BhEAyjAsA00LGAUAi4+UBI+V\r
+        nQAnND+hO1Jj8TtQZu09V3j8JTtm/goRI30ABCwABAwqAAdaWwAEYGIABDpDTQFdaeMAPEo3AA8nTwAA\r
+        ABgIV18ABEWBAAaKZAAQGAYATWADAIGZAgwkaQHAMoMG/zCCDfozeQD+J3sR+RE/CcsWIhG8OjMFcwge\r
+        Ay7X4uoAi56jB0ZZa+iDnLf/XXOF/4qrwvxUaXr6MUJR9UVbatEAAAAcLDJABBYACCQFRACvAWQB/wF3\r
+        AP0AYwDmAkAAsBAHBEwEHwAACC4JAhtEBwAiTAgJHDwHoyJpAP8iVgDnLGwB/yVqAPsoUwD/DRwChERu\r
+        IAIYTwEkKGoMDUxbaAYtQVAAESw6ZlRzgvh3bHL9o52k/4+eqv99la//MURW/SsuLRcAQQAAAy0CmwCR\r
+        AP8ArQH9AIsA/gB0AP8AcgD/ATIAdgNjAwAHQwMDFkUEDg4lBZMXUQC6AxQASBJDAM4SMgDHET4A0RxB\r
+        AZcdQQD/DSIAUxIrAQAGCgMAvdz2AAAAAAFkAAAAewAALEMAAOVFBwDFSDU7o0xgbq0aIylWUENTAAUR\r
+        BQkDOAKkAlQA3AEWAPIAIg7+AhMNnQQLDCQDBgYAAwADABr8BQBq/xUDCRUCDgoUBAAKFgRDChwCq0Z6\r
+        ERQNKgG2BxgBXxdABFIAAAKIAAACCgUFAwOUrcEAQAmRAmAEjgE+AlJ6Vxuw+zEMY5xnFIcASwCEACw7\r
+        RwAAAAAAAP//ABT2DQAKSVkGCYaPIAJ0d+0DeXo/A4iIAAN0dQMEAAMAGv8IAAMIAABIRkgAAwACDAcE\r
+        BXcBAAESDBwEAAUOAlsECwGjETkGAAACACEAAgAEAAAAAQAAAABzE+QCiQ/0ADYGk7GISv//Sh2XyspG\r
+        +wWqLu0EJzM9AwAAAAAAAAAAAAAAAAB2dQECgYAABD8+kQJDQ5YCXFwCAm9vAwIgAgAAAAAAAAAAAA4R\r
+        DwAAAAAKAAAADgAAAAADAAMBBQMEDwUDBI4AAAAKAAAABgUEAwQAAAEAAAAAABABMwMNATkAEwImSyoA\r
+        besJABliNglYAC0JUgMAAAAAAAAAAAAAAAAAAAAAAAAAAwkAAAQDAAAXBwAAQAoAAAAaAAABAAAAAAAA\r
+        AAAAAAAAFxgZAAAAAAAAAAAAAAAAAwoJBgEGBQMABQQDVAYKAyQFBAMADwwKAAAAAAD///////////4B\r
+        wH/8AAAf/AAAD/4AAA//xgAP/84AB//MAAf/zAAD/8wAA/+MAAP/BAAD/AAAAfAAAAHgAAAB4AAAAeAA\r
+        AAPAAAADwAAAA+AAIAfgADAD8AA8A/gAOAPwgDwDwPv+AcBwfAfAYDkD8GD/Q+P9/s/j/P/v8///7ygA\r
+        AAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoJuXACEgIQBvbm4AAAAAAP//\r
+        /wMAAAAAyMPAABAuPwDY//8A////CQAAAAAAAAAAAAAAAKoKCgARKDMAAAAAAIJ9eAAuMTUWNzY1c1pa\r
+        Wqo5OTmzNzc3oDw5N28GEhlZFTVIqRYxQL8PIy+lAQIEXgAAABeOCwwCBB8uAAAAAABqaGcAGBgYFCoq\r
+        KZ9mZWX8kZGR/25vb/9RUlPfFjtP8CRUbv8hT2r/IVJt/xw/UfIDCg5vbQ0PDQkcJgAAAAAAAAAAABIS\r
+        EwBISUoAOTg4H3p6e+xXRTpCETdMfB9UdP8nV3L4KV56/CdgfvgpYoH/HUpgynTAwQk4dZICAwwQAAAA\r
+        AAAjIyQAtra4Bevu7wBbYGGpTSscEhhBWMMhXHv+K2uO/C1lgv4mYoD/I2GB+iZffP8hSl1gL2J9ABBS\r
+        aAA4bHQAKygpACwpKQBkV1MIdWZj2DwOBBkaPVO/J19+/ytohvwmaIz/KGB9/iFdfPsgY4b+GU5qryqJ\r
+        tQAWYnsBO3B1AC1CQwEnZWhWDmqEvCSdtP8cdIG2Hkxf3iddev8lYoL9IGaL/yZnif4ob5T9IWSI/h9W\r
+        ct5+vckEQXiGA1R/iAdDia+zPJj0/y2B//8imv/9K6T//12T1f8bS2T+KVp1/ipsjv8rcZT+Lm+P/itu\r
+        kf8tYnvuAAAAIG2MwgBAWpZgb43n/wwiwPgJD6X7Gya+/hYixvsACY79M2yB/zRofP8pYYD8M3yh/zB1\r
+        lvwyc5P+LFtz30jA2gR0gMUAQEaKf1Vauf8YAE/9FgZ9/wYeev8FC2n/Tnim/091kvoqTWf/LnKY/zB4\r
+        n/8xcZ/7NW+W/zBfd41EhKMACQIAAA0EADA8P1nFTBMb6iQSV9sKL1HoDS5C6zFMVeoBIF7WFFpuSydw\r
+        hrswdpD2M3ZR/TJ2NfgTJxNYSm8RAwAIPQgJFFcAAAMtbxwPN9shIQBkBxAChQ9SUNknQUjcAISf6A+o\r
+        0QYeRhc1JGgM3TGbBPorgwf9EykAs0JpBxM7bbwCIUiUdDNUkeIcOn7oRE1QOwxjSxsFVk2ZDE48qgpl\r
+        aVUZfEQDX5EmDyBaAq8xhwz/KXsL+w4nA5onaQkwiHt1AF5fWYBybWrzcH2E+kFTaoAFKQofAW0A+gBm\r
+        APQDPQJ5CE0AABJBAjQUPwGYF0MAxhpAAMgPIAFWFzkDCE0AUABQFFYRSQ1t0SsXOz8eEDYKAj4rFgRD\r
+        MFwCR0mXBU9PBAJJSwIGBQMCBQUEJQQHAyUFDwJcBAYCIxM9BAEtDpYAHAByLFEls+ERAC4EEgIuAAkf\r
+        IwAGUV0ABDQzSwkyMgQBNTQAFCIPAAYCBQUGBAQABAAEOwUEBAAAAAEB//8AAOAHAADgAwAA+gMAAPoB\r
+        AAD6AQAA4AEAAMABAACAAQAAgAEAAMBBAADAYQAAjGEAAIRhAADc+wAA3/8AAA==\r
+</value>\r
+  </data>\r
+</root>
\ No newline at end of file
index 6cd2d7e..3f2c566 100644 (file)
 <?xml version="1.0"?>\r
+\r
 <configuration>\r
-    <configSections>\r
-        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
-            <section name="Handbrake.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>\r
-        </sectionGroup>\r
-    </configSections>\r
-    <userSettings>\r
-        <Handbrake.Properties.Settings>\r
-            <setting name="processPriority" serializeAs="String">\r
-                <value>Below Normal</value>\r
-            </setting>\r
-            <setting name="Processors" serializeAs="String">\r
-                <value>Automatic</value>\r
-            </setting>\r
-            <setting name="updateStatus" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="hb_version" serializeAs="String">\r
-                <value>{hb_version}</value>\r
-            </setting>\r
-            <setting name="tooltipEnable" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="CompletionOption" serializeAs="String">\r
-                <value>Do Nothing</value>\r
-            </setting>\r
-            <setting name="defaultPreset" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-            <setting name="hb_build" serializeAs="String">\r
-                <value>0</value>\r
-            </setting>\r
-            <setting name="skipversion" serializeAs="String">\r
-                <value>0</value>\r
-            </setting>\r
-            <setting name="autoNaming" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="autoNamePath" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-            <setting name="appcast" serializeAs="String">\r
-                <value>http://handbrake.fr/appcast.xml</value>\r
-            </setting>\r
-            <setting name="appcast_unstable" serializeAs="String">\r
-                <value>http://handbrake.fr/appcast_unstable.xml</value>\r
-            </setting>\r
-            <setting name="cli_minimized" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="autoNameFormat" serializeAs="String">\r
-                <value>{source}-{title}</value>\r
-            </setting>\r
-            <setting name="saveLogToSpecifiedPath" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="saveLogPath" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-            <setting name="saveLogWithVideo" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="VLC_Path" serializeAs="String">\r
-                <value>C:\Program Files\VideoLAN\vlc\vlc.exe</value>\r
-            </setting>\r
-            <setting name="MainWindowMinimize" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="QueryEditorTab" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="x264cqstep" serializeAs="String">\r
-                <value>0.25</value>\r
-            </setting>\r
-            <setting name="verboseLevel" serializeAs="String">\r
-                <value>1</value>\r
-            </setting>\r
-            <setting name="noDvdNav" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="presetNotification" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="enocdeStatusInGui" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="trayIconAlerts" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="lastUpdateCheckDate" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-            <setting name="daysBetweenUpdateCheck" serializeAs="String">\r
-                <value>7</value>\r
-            </setting>\r
-            <setting name="useM4v" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="PromptOnUnmatchingQueries" serializeAs="String">\r
-                <value>True</value>\r
-            </setting>\r
-            <setting name="NativeLanguage" serializeAs="String">\r
-                <value>Any</value>\r
-            </setting>\r
-            <setting name="DubAudio" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="hb_platform" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-            <setting name="disableResCalc" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="growlQueue" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="growlEncode" serializeAs="String">\r
-                <value>False</value>\r
-            </setting>\r
-            <setting name="cliLastModified" serializeAs="String">\r
-                <value />\r
-            </setting>\r
-        </Handbrake.Properties.Settings>\r
-    </userSettings>\r
-<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>\r
+  <configSections>\r
+    <section name="castle" type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor" />\r
+    \r
+    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+      <section name="Handbrake.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />\r
+    </sectionGroup>\r
+  </configSections>\r
+  \r
+  <userSettings>\r
+    <Handbrake.Properties.Settings>\r
+      <setting name="processPriority" serializeAs="String">\r
+        <value>Below Normal</value>\r
+      </setting>\r
+      <setting name="updateStatus" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="hb_version" serializeAs="String">\r
+        <value>{hb_version}</value>\r
+      </setting>\r
+      <setting name="tooltipEnable" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="CompletionOption" serializeAs="String">\r
+        <value>Do Nothing</value>\r
+      </setting>\r
+      <setting name="defaultPreset" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="hb_build" serializeAs="String">\r
+        <value>0</value>\r
+      </setting>\r
+      <setting name="skipversion" serializeAs="String">\r
+        <value>0</value>\r
+      </setting>\r
+      <setting name="autoNaming" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="autoNamePath" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="appcast" serializeAs="String">\r
+        <value>http://handbrake.fr/appcast.xml</value>\r
+      </setting>\r
+      <setting name="appcast_unstable" serializeAs="String">\r
+        <value>http://handbrake.fr/appcast_unstable.xml</value>\r
+      </setting>\r
+      <setting name="autoNameFormat" serializeAs="String">\r
+        <value>{source}-{title}</value>\r
+      </setting>\r
+      <setting name="saveLogToSpecifiedPath" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="saveLogPath" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="saveLogWithVideo" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="VLC_Path" serializeAs="String">\r
+        <value>C:\Program Files\VideoLAN\vlc\vlc.exe</value>\r
+      </setting>\r
+      <setting name="MainWindowMinimize" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="QueryEditorTab" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="x264cqstep" serializeAs="String">\r
+        <value>0.25</value>\r
+      </setting>\r
+      <setting name="verboseLevel" serializeAs="String">\r
+        <value>1</value>\r
+      </setting>\r
+      <setting name="noDvdNav" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="presetNotification" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="trayIconAlerts" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="lastUpdateCheckDate" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="daysBetweenUpdateCheck" serializeAs="String">\r
+        <value>7</value>\r
+      </setting>\r
+      <setting name="useM4v" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="PromptOnUnmatchingQueries" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="NativeLanguage" serializeAs="String">\r
+        <value>Any</value>\r
+      </setting>\r
+      <setting name="DubMode" serializeAs="String">\r
+        <value>0</value>\r
+      </setting>\r
+      <setting name="hb_platform" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="growlQueue" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="growlEncode" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="cliLastModified" serializeAs="String">\r
+        <value />\r
+      </setting>\r
+      <setting name="previewScanCount" serializeAs="String">\r
+        <value>10</value>\r
+      </setting>\r
+      <setting name="clearOldLogs" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="showCliForInGuiEncodeStatus" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="AutoNameTitleCase" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="AutoNameRemoveUnderscore" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="UpdateRequired" serializeAs="String">\r
+        <value>True</value>\r
+      </setting>\r
+      <setting name="ActivityWindowLastMode" serializeAs="String">\r
+        <value>0</value>\r
+      </setting>\r
+      <setting name="preventSleep" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="useClosedCaption" serializeAs="String">\r
+        <value>False</value>\r
+      </setting>\r
+      <setting name="batchMinDuration" serializeAs="String">\r
+        <value>35</value>\r
+      </setting>\r
+      <setting name="batchMaxDuration" serializeAs="String">\r
+        <value>47</value>\r
+      </setting>\r
+    </Handbrake.Properties.Settings>\r
+  </userSettings>\r
+  \r
+  <startup />\r
+  \r
+  <!--<castle>\r
+    <components>\r
+      <component id="IErrorService"\r
+                 service="HandBrake.Framework.Services.Interfaces.IErrorService, HandBrake.Framework"\r
+                 type="HandBrake.Framework.Services.ErrorService, HandBrake.Framework"/>\r
+    </components>\r
+  </castle>-->\r
+  \r
+</configuration>
\ No newline at end of file
diff --git a/win/C#/doc/AUTHORS b/win/C#/doc/AUTHORS
new file mode 100644 (file)
index 0000000..be6664e
--- /dev/null
@@ -0,0 +1,112 @@
+AUTHORS file for HandBrake <http://handbrake.fr/>
+
+Eric Petit <titer@m0k.org>
+ + Core (construct, multithreading, BeOS/OS X/Linux ports)
+ + MPEG demuxer
+ + MPEG-2, AC3 and MPGA decoders (w/ libmpeg2/liba52/libavcodec)
+ + LPCM "decoder"
+ + MPEG-4, MP3 and AAC encoders (w/ libavcodec/libxvidcore/libmp3lame/
+   libfaac)
+ + AC-3 pass-through
+ + AVI muxer
+ + MP4 muxer (w/ libmp4v2)
+ + BeOS interface
+ + OS X interface
+ + French translation
+
+Laurent Aimar <fenrir@via.ecp.fr>
+ + H264 and Vorbis encoders (w/ libx264/libvorbis)
+ + OGG/OGM muxer (w/ libogg)
+ + Gtk2 interface
+ + wxWidgets interface
+
+Van Jacobson <vanj.hb@gmail.com> (van)
+ + Universal input architecture
+ + MPEG Standard Target Decoder timing model
+ + Auto-typing MPEG stream files
+ + Minor bug fixing in MPEG stream support
+ + Minor dvd reader fixes
+ + Chapter mark bug fixes
+
+John Allen (?) <johnallenemail@gmail.com> (johnallen)
+ + Core enhancements
+ + Threading enhancements
+ + Simplified Mac OS X GUI
+
+Joe Crain <dynaflashtech@gmail.com> (dynaflash)
+ + Mac OS X GUI enhancements/rewrite
+
+Damiano Galassi <damiog@gmail.com> (ritsuka)
+ + Mac OS X GUI enhancements
+
+Edward Groenendaal <eddyg.hb@myreflection.org> (eddyg)
+ + Major bug fixes
+ + Subtitle scan & Colour
+ + Performance improvements
+David Foster <unknown> (davidfstr)
+ + Subtitles from file inputs
+ + SSA subtitle support
+
+Rodney Hester <rhester@multics.dynalias.com> (rhester)
+ + iPod firmware 1.2+ 640x480 MPEG-4/H.264 support
+
+Andrew Kimpton <awk@awkward.org> (awk)
+ + MPEG Audio fixes
+ + MPEG Stream Support
+
+Chris Lee <clee@kde.org>
+ + PAR/anamorphic support
+ + dvdread enhancements
+ + Linux GUI
+
+Chris Long <chris.long@mac.com> (chrislong)
+ + iPod firmware 1.2+ 640x480 MPEG-4/H.264 support
+
+Brian Mario <Unknown> (brianmario)
+ + Windows GUI
+
+Maurj <handbrake@maurj.com> (maurj)
+ + Dolby Surround and Dolby Pro Logic II mixdowns
+ + 6-channel AAC audio from 5.1 source
+ + Mono AAC audio from mono source
+ + PAR/anamorphic support in mp4 file format
+ + Chapter markers in mp4 file format
+ + Mac OS X GUI enhancements
+ + Support for DTS audio sources
+
+Mirkwood <mirkwood07@gmail.com> (mirkwood)
+ + Windows CLI port
+
+Nyx <unknown> (Nyx)
+ + Frame re-ordering and flushing in mp4
+
+Philippe Rigaux <pri@nopapers.org> (prigaux)
+ + 3rd party library integration
+ + Mac OS X GUI enhancements
+ + PAR/anamorphic support
+ + Universal binary build process
+ + Conversion from jam to make for compiles
+
+Jonathon Rubin <jb.rubin@gmail.com> (jbrjake)
+ + Massive core enhancements
+ + Significant improvements to H.264 support
+
+Scott <unknown> (s55)
+ + Windows GUI
+John Stebbins <jstebbins.hb@gmail.com> (j45)
+ + GTK GUI
+ + TrueHD demuxing
+ + libavcodec video encoding quality enhancements
+ + Numerous bug fixes
+Chris Thoman <cthoman@gmail.com> (huevos_rancheros)
+ + Ported video filters from libmpcodec
+
+Mark Krenek <markkrenek@mac.com> (travistex)
+ + Mac OS X GUI enhancements
+ + Mac OS X GUI Queueing system
+
+Kona 'mike' Blend <Kona8lend@gmail.com> (KonaBlend)
+ + Build System and related guides
diff --git a/win/C#/doc/COPYING b/win/C#/doc/COPYING
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/win/C#/doc/CREDITS b/win/C#/doc/CREDITS
new file mode 100644 (file)
index 0000000..92ae696
--- /dev/null
@@ -0,0 +1,175 @@
+CREDITS file for HandBrake <http://handbrake.fr/>
+
+HandBrake uses many cool libraries from the GNU/Linux world.
+Thank their authors!
+
+liba52 authors:
+  Aaron Holtzman
+  Michel Lespinasse
+  Gildas Bazin
+  Billy Biggs
+  Eduard Hasenleithner
+  HÃ¥kan Hjort
+  Charles M. Hannum
+  Chris Hodges
+  Michael Holzt
+  Angelos Keromytis
+  David I. Lehn
+  Don Mahurin
+  Jim Miller
+  Takefumi Sayo
+  Shoji Tokunaga
+
+libavcodec authors:
+  Fabrice Bellard
+  Alex Beregszaszi
+  Brian Foley
+  Arpad Gereoffy
+  Philip Gladstone
+  Falk Hueffner
+  Zdenek Kabelac
+  Nick Kurshev
+  Michael Niedermayer
+  François Revol
+  Dieter Shirley
+  Juan J. Sierralta
+  Lionel Ulmer
+
+libdca authors:
+  Gildas Bazin
+  Sam Hocevar
+
+libdvdread authors:
+  Björn Englund
+  HÃ¥kan Hjort
+  Billy Biggs
+  Christian Wolff
+
+libfaac authors:
+  M. Bakker
+  Tony Lenox
+  RageOMatic
+  thebard
+  Ivan Dimkovic
+  Krzysztof Nikiel
+  
+libfaad2 authors:
+  M. Bakker
+  Alexander Kurpiers
+  Volker Fischer
+  Gian-Carlo Pascutto
+
+libmp3lame authors:
+  Mike Cheng
+  Robert Hegemann
+  Frank Klemm
+  Alexander Leidinger
+  Naoki Shibata
+  Mark Taylor
+  Takehiro Tominiga
+  Iván Cavero Belaunde
+  Gabriel Bouvigne
+  Florian Bomers
+  CISC
+  John Dahlstrom
+  John Dee
+  Albert Faber
+  Peter Gubanov
+  Lars Magne Ingebrigtsen      
+  Yosi Markovich
+  Zdenek Kabelac
+  Iwasa Kazmi
+  Guillaume Lessard
+  Steve Lhomme
+  Don Melton
+  Viral Shah
+  Acy Stapp
+  Roel VdB
+
+libmp4v2 authors:
+  Dave Mackie
+  Alix Marchandise-Franquet
+  Bill May
+  Massimo Villari
+  Waqar Mohsin
+  Richard Chen
+  Rob Arnold
+  Howdy Pierce
+  Steven Schultz
+  sergent@io.com
+  Sean Gilligan
+  Michael Rossberg
+  Luis F. Ramirez
+  Petter Reinholdtsen
+
+libmpeg2 authors:
+  Aaron Holtzman
+  Michel Lespinasse
+  Bruno Barreyra
+  Gildas Bazin
+  Alexander W. Chin
+  Stephen Crowley
+  Didier Gautheron
+  Ryan C. Gordon
+  Peter Gubanov
+  HÃ¥kan Hjort
+  Nicolas Joly
+  Gerd Knorr
+  David I. Lehn
+  Olie Lho
+  Rick Niles
+  Real Ouellet
+  Bajusz Peter
+  Franck Sicard
+  Brion Vibber
+  Martin Vogt
+  Fredrik Vraalsen
+
+libogg authors:
+  Christopher Montgomery
+  
+libmkv authors:
+  John A. Stebbins
+  Nathan Caldwell
+  Mike Matsnev
+  Nathan Caldwell
+  Christophe Devine
+
+libsamplerate authors:
+  Erik de Castro Lopo
+
+libvorbis authors:
+  Christopher Montgomery
+
+libx264 authors:
+  Laurent Aimar
+  
+libtheora authors:
+  Monty
+  Ralph Giles
+  Timothy B. Terriberry
+  Dan B. Miller
+  Rudolf Marek
+  Wim Tayman
+  Dan Lenski
+  Nils Pipenbrinck
+  Aaron Colwell
+  Thomas Vander Stichele
+  Jan Gerber
+  Conrad Parker
+  Cristian Adam
+  Sebastian Pippin
+  Simon Hosie
+  Mauricio Piacentini
+  Silvia Pfeiffer
+  Michael Smith
+  Andre Pang
+  calc
+  Chris Cheney
+  Brendan Cully
+  Edward Hervey
+  Adam Moss
+  Colin Ward
+  Jeremy C. Reed
+  Arc Riley
+  Rodolphe Ortalo
diff --git a/win/C#/doc/NEWS b/win/C#/doc/NEWS
new file mode 100644 (file)
index 0000000..ed7b57d
--- /dev/null
@@ -0,0 +1,689 @@
+NEWS file for HandBrake <http://handbrake.fr/>
+
+Changes between 0.9.3 and 0.9.4:
+
+Core:
+
+* New build system, allowing 64-bit binaries (around 10% faster)
+* Soft subtitles and Closed Captions:
+  - DVD Closed Captions
+  - ATSC Closed Captions
+  - SRT subtitle import
+  - Text soft subtitles in MP4 and MKV output
+  - Bitmap soft subtitles in MKV output
+* Better support for DVD inputs:
+  - Uses libdvdnav
+  - DVD angles support
+  - Workaround for libdvdread malloc bomb on invalid PGC entry
+  - DVD drive region detection support in Linux
+  - Handles DVD programs with more than 16 streams
+  - No longer tries to detect and discard duplicate titles when scanning
+  - Libdvdnav patched to perform read error recovery
+  - Libdvdread patched to allow raw device access in Windows
+  - Handles poorly mastered DVDs that had the menus ripped out of them
+* Better support for non-DVD inputs:
+  - Preserves MP4 metadata
+  - TrueHD
+  - DTS-HD demuxing
+  - 8 bit audio
+  - Better handling of transport streams where audio starts first
+  - Better handling of transport streams that have been spliced together, leading to duplicate timestamps
+  - Better VC-1 frame detection
+  - Fixes bug that was causing one sec. of audio to be dropped on many ffmpeg files
+  - Looks harder for aspect ratio info from DV sources
+  - No longer truncates the last (dummy) chapter
+  - Allows specifying field parity for detelecine and decomb
+* Better AV sync
+* Support for sources with no audio
+* DTS passthrough for MKV
+* x264 bumped from r1169 to r1347, which means speed optimizations, new default settings (see r2742 commit comment), the magic of macroblock tree rate control (mbtree), a new CRF curve (meaning you will get different, generally lower bitrates at the same RF, with similar quality metrics), and weighted P-Frames (disabled by default for Baseline encodes and the AppleTV preset). 
+* Better sample interleaving
+* Better, optional deinterlacer for decomb (EEDI2)
+* New mode structure for the decomb filter
+* Variable verbose logging levels
+* Fixed timing for first two frames coming out of filters
+* Libtheora bumped to 1.1.0
+* Improvements to our theora implementation (2 pass encoding + soft target rate control)
+* Caters to Theora's insistence on content having mod16 framing dimensions specified
+* Flushes LAME encoder's final packets
+* Fixed interjob framerate calculation
+* Fixed pthreads regression in cygwin
+* Tweaks for packaging tools
+* Solaris 10 build support
+
+All interfaces:
+
+* Live video preview
+* New subtitle tab
+* New filters and picture settings inspector
+* Custom anamorphic mode
+* Updated Sparkle
+* Custom number of preview images
+* Quality slider now works off actual rate factor/quantizer values instead of percentages
+* Partially updated advanced x264 tab
+* New built-in presets
+* Use libdvdnav by default on DVD sources
+* Removed Constant QP encoding option for x264 (use CRF)
+* Various bug fixes and UI tweaks
+* x264 turbo 1st pass mode now uses subme=2 not subme=1
+
+Mac:
+
+* Core Audio AAC encoding
+* H.264 video source decoding crash fixed
+* Queue displays varying row heights based on encode settings
+* Fixed EyeTV package scanning
+* 64bit / 32 bit VLC detection 
+* Preset import/export
+
+Windows:
+
+* New audio tab
+* AAC audio source decoding bug fixed
+* Tray minimization is now optional
+* Queue can now be started from main window
+* Growl for Windows notification support
+* General UI improvements
+* Preset import
+* Preferred language control for audio dubs and subtitles
+* Fixed file extensions resetting to m4v when enabling chapter markers in mkv
+* Faster updating of GUI elements from CLI data
+* Cleanup / Improved some of the programs options. (Growl, use m4v, drive detection)
+* Numerous fixes in the Picture Settings Panel and CLI Query Handling code.
+* Bug Fixes and Usability improvements.
+
+Linux:
+
+* General UI improvements
+* Inhibits sleep mode while encoding
+* Single title scan
+* Chapter duration display
+* Notifications when encodes complete
+* Tray minimization
+* Full screen preview
+* Preset import/export
+* Preferred language control for audio dubs and subtitles
+* Preferences rearrangement
+* Preference to auto-apply .m4v extension
+* New system tray icon behavior
+* Preference for what to do when encode completes
+* Preference for how often to delete activity logs
+* Preference to disable automatic scanning
+* New Gnome session manager support
+* Improved "auto" audio selection
+* Use .m4v as the default extension for the MPEG-4 container
+* Use .m4v when soft subs are enabled
+* Alternate angle encoding fix
+* Only strips drive letters for Windows builds
+* Show correct audio format info when it's been sanitized for incompatibilities
+* Preserve chapter list modifications made to queued jobs
+* Fixed error when navigating chapter titles with the keyboard
+* Bug Fixes.
+
+CLI:
+
+* Options to handle new subtitle, anamorphic, and preview features
+* --srt-file, --srt-codeset, --srt-offset, --srt-lang, --srt-default
+* --native-dub option lets users request dubbing instead of subs when the audio isn't in their native language
+* Allow encoding sources with no audio without explicitly stating -a none
+* Update checker on MinGW built exe should now work correctly.
+* Matches GUIs' default verbosity level of 1
+
+Changes between 0.9.2 and 0.9.3:
+
+0.9.3 Snapshot 5 -> 0.9.3 Final
+- Better PMT processing
+- Basic underlying support for live previews (encode from a seek point for a set number of frames)
+- Better searching for IDR frames in H.264 streams
+- Preset changes (iPhone goes CRF, some old Apple presets resurrected as Legacy)
+- Assorted bug fixes
+
+0.9.3 Snapshot 4 -> 0.9.3 Snapshot 5 (r1913)
+Core Library
+- VC-1 stream input
+- Newer libmp4v2, which fixes the issue with output > 2 gigs in Linux
+- Proper allocation for preview frames
+- Avoids corruption of previews of sources that use widths that aren't cleanly divisible by 8
+- Decodes DTS internally instead of using ffmpeg, to allow mixdowns
+- Better support for DTS in MKV files with implicit timestamps or large timestamp errors
+- Ensures proper chroma size by rounding up when dealing with odd dimensions
+- Ensures "auto" samplerate sends a valid value to faac (22050, 24000, 32000, 44100, or 48000)
+- Bumped Theora to 1.0 final
+- Bumped x264 to r1024, which includes Nehalem optimizations as well as speed boosts for things such as b-adapt=2
+
+Mac GUI
+- Allows multibyte characters in chapter titles
+
+Windows GUI
+- Fixes issue parsing presets that use maxWidth and maxHeight (-X and -Y)
+- DRC defaults to 1 now
+- Chapter markers disabled for non-DVD sources
+- Makes sure Normal preset gets loaded
+- Fixes arithmetic overflow crash when scanning
+
+Linux GUI
+- Update checker
+- Limits range of chapters to encode to the number of chapters on the DVD
+- Disabled entry of dimensions larger than the source
+
+CLI
+- Allows overriding of audio (tracks, bitrates, samplerates, codecs, mixdowns) and x264 options in built-in presets
+
+Documentation
+- Documentation updates have begun on the wiki, although they are not yet complete
+
+0.9.3 Snapshot 3 -> 0.9.3 Snapshot 4 (r1896)
+Core Library
+- Converts video in other color spaces to YUV420 (this means DV support)
+- Official, standards-based AC3-in-MP4
+- Tries to base the AV timing for streams off audio when possible
+- Keeps some audio fixes for lost packets in over the air streams from interfering with other sources
+- Handles rendering of sources where the picture resolution changes mid-stream (this fixes the long-standing bug reading a particular episode of Doctor Who)
+- Wider window for clock references (AV sync)
+- Fixed a crash when closing out data for AAC encoding on aborted encodes
+- Rejiggered verbose activity log display to be more laconic by default
+- Updated x264 to r1016, which means b-rdo and bime are gone and replaced with new subme modes
+- DTS and HDMV DTS audio support in streams
+- Doesn't show the audio track button on iPhones/iPod Touches unless there's more than 1 track
+- Tries to avoid garbage data from AC3 sync by searching for two agreeing packets
+- As the MPEG4IP project is defunct, switched to an independently maintained libmp4v2 which has folded in all our cumbersome patches
+- Fixed SunOS compilation
+- Fixed conflict between maxHeight and maxWidth and loose anamorphic
+- Warn in the log when titles are being ignored during scan for lack of audio
+- Fixed bug with Slow/Slowest deinterlacing and decomb which could leave a flickering line at the top or bottom of the screen
+- Extracts audio and subtitle types from DVD sources, to do things like label commentary tracks
+- Better handling of the beginning of AVI and WMV sources that start after time 0
+- Optimize MP4 for web download works with AC3 tracks now
+
+Mac GUI
+- Nested presets
+- Individual activity logs for each encode (stored by default in ~/Application Support/HandBrake, can be co-located with encoded file destination by preference)
+- Allows reading from ZFS volumes
+- Fixed target size mode. It keeps breaking itself. Maybe it should just be put out of its misery...
+- Assorted other improvements
+
+Windows GUI
+- Nested presets
+- Individual activity logs for each encode
+- Slow and slower deinterlacing and decomb work now in Windows
+- Added resizeable update window
+- Fixed parsing of non-DVD source audio formats
+- Restored Copy to Clipboard to the Activity Log Window, among other enhancements to it
+- Fixed bug with MKV presets showing up as .m4v
+- Assorted other improvements
+
+Linux GUI (GTK)
+- Nested presets
+- Individual activity logs for each encode
+- Allows pending queue items to be removed, and reloaded in the main window for editing
+- Better handling of HD previews
+- Assorted other improvements
+
+CLI
+- Updated presets to the equivalent of the nested ones in the GUIs
+- Allows setting custom audio track names in MP4 files
+- Allows selection of the COLR atom in MP4 files, between Bt.601 and Bt.709
+- Fixed reading of device paths in OS X
+
+A special note on the new presets (they're collapsible-triangle-folder-thing-errific!)
+- Deux Six Quatre, Blind, Broke, and Bedlam are gone. They were dead weight.
+- iPod Low-Rez is now iPod Classic & iPod Nano
+- iPod High-Rez is now iPod Legacy
+- iPhone / iPod Touch is now iPhone & iPod Touch, so take care CLI users
+- Animation and Television now use the decomb and detelecine (VFR) filters
+- High Profile presets now use psy-trellis and the new subme 9 mode with B-frame RD refinement
+- AppleTV is now CRF, so sizes will vary with content
+- PS3 preset should be fixed
+- Constant Quality Rate still needs its quality % lowered, probably
+
+The keen reader is already asking "iPod Legacy? WTF is iPod High-Rez called iPod Legacy now?"
+
+The answer is Universal.
+
+The Universal preset is designed to play on all modern iPods (anything newer than the iPod 5.5G). It also plays on iPhones. It also plays on AppleTVs. It should also play just about anywhere else, hence the name. It is full anamorphic DVD resolution--no tricks with downscaling like stuff from the iTunes Store. It includes chapters, and has the first audio track in both AAC (DPL2 downmixed) and AC3 pass-thru, just like the AppleTV preset. In fact, it should give the same quality as the AppleTV preset, but faster...and at a larger file size. Like the AppleTV preset, it used CRF, so sizes will vary.
+
+0.9.3 Snapshot2 -> 0.9.3 Snapshot 3 (r1797)
+Core Library:
+- Universal input support, utilizing libavcodec from the FFmpeg project for decoding non-MPEG-2 video
+- Newer, faster, better version of the x264 codec, including psychovisual optimizations
+- Better AV sync through full compliance with the MPEG Standard Target Decoder timing model
+- More accurate auto-cropping
+- Support for New Zealand and Norwegian HDTV broadcasts (H.264 and AAC-LATM in MPEG-TS)
+- Detelecine is now "VFR detelecine" by default, dropping some frames and extending others to make up lost time, old behavior of keeping duplicate frames is enabled by selecting a framerate besides "Same as source"
+- Threaded deinterlacing in Slow and Slower modes
+- Threaded and entirely rewritten decomb filter
+- Better audio resampling interpolator
+- Better gamma in QuickTime through the use of the COLR MP4 atom
+- Better constant quality encoding when using FFmpeg
+- Hopefully better cache and virtual memory performance by recycling buffers that were most recently used instead of least
+- Fix for MP4s with "negative duration" errors.
+- Set the detelecine filter to work better with PAL by using "loose" breaks
+- Fix for missing initial H.264 NAL units, improves reliability of 8x8dct
+- Fix for subtitle-scan with XviD encoding
+- Fix for crash at the end of 2nd pass using x264
+- Deblock filter works now
+- Rewritten update system, so the core library can read a portion of Sparkle appcasts.
+- Updates for libsamplerate, libogg, xvidcore, libtheora, libmpeg2, lame, faac, and of course ffmpeg and x264.
+
+Mac GUI
+- Entirely rewritten and far more flexible queue that can be saved between sessions, capable of preserving queued items after a crash
+- Now requires vlc 0.9.xx to read protected dvd's in the users /Applications folder
+- Fix for 4x3 loose anamorphic to keep it from downscaling
+- Countless other improvements
+
+Windows GUI
+- Resolution calculation
+- Better preset bar
+- Better queue (including queue recovery feature)
+- Better activity log window
+- Improved UI (layout changes, animated x264 options, DVD drive detection, duration displayed)
+- More options - includes support for custom auto name format & starting the CLI minimized
+- Countless other improvements
+
+Linux GUI (GTK)
+- It's alive!
+
+Known Issues in Snapshot 3
+- Possibility of a flickering line at the top or bottom of the frame after Slow or Slower deinterlacing or decombing
+- Input bitrate display may be off by a factor of 100 for H.264-in-TS sources
+- Constant Quality Rate preset probably needs a lower quality level (60% - 55%)
+- With non-DVD sources that don't have AC3 audio, you can't encode 1 input audio track to multiple output audio tracks
+- Slow and Slower deinterlacing and decombing are BROKEN in Windows
+- QuickTime won't read Xvid-in-MP4 output, although VLC will
+- Windows GUI does not detect all audio tracks from non-DVD sources
+
+0.9.3 Snapshot 1 -> 0.9.3 Snapshot 2 (r1477)
+Core Library:
+- Anamorphic PAR for the AVI container
+- Allow constant frame rates when they different from the source's frame rate (otherwise pass through the variable MPEG-2 frame durations )
+- Decomb filter (selectively deinterlaces when it sees interlacing in the frame)
+- Filter bug fixed, that would skip any filters after detelecine, if VFR wasn't enabled
+- Loose anamorphic + FFmpeg video bug fixed
+
+Windows GUI:
+- Title dropdown list bug fixed
+- Missing log file bug fixed
+
+CLI:
+- Default audio samplerate changed to 48kHz, audio bitrate changed to 160kbps.
+- Samplerate entry bug fixed
+
+0.9.2 -> 0.9.3 Snapshot 1 (r1457)
+Core Library:
+- New audio subsystem (no more AAC+AC3, control each track's codec and settings individually)
+- Removed libdvdcss (HandBrake no longer decrypts DVDs on its own, will use VLC to do so if it's available)
+- Added Theora encoder
+- Fixed x264-in-avi and ffmpeg-in-avi
+- Fixed xvid
+- More accurate scaling
+- Major sync improvements
+- Major stream improvements
+- AAC+AC3 support in MKV
+- MKV seeking fixes
+- Make sure subtitles get displayed long enough to read them
+- Updated VBV 2-pass and VBV 1-pass patch for x264
+- Adaptive Quantization for x264
+- Recover from bad preview scans
+- Recover from invalid PGNs
+- Fixed vorbis bitrate control
+- Snapshot builds
+
+Mac:
+- New audio interface
+- Loads libdvdcss from VLC at runtime if it's present on the user's system
+- No more general-purpose "Codecs" menu -- set video and audio codecs individually
+- More robust preset system, in preparation for nested presets
+- Made 64-bit MP4 file widget more prominent
+- Only allow useful x264 options in the advanced tab
+- Various fixes and improvements
+
+Windows:
+- New x264 tab
+- New audio interface
+- Various fixes and improvements
+
+CLI:
+- New audio interface
+
+Changes between 0.9.1 and 0.9.2:
+
+CORE
+
+- AC3 in MP4 support
+- Multi-track audio support for Apple devices
+- Better handling of audio discontinuities
+- More flexible, "loose" anamorphic
+- Variable frame rate encoding
+- MP4 optimization for progressive downloads
+- Dynamic range compression for encoding from AC3 audio
+- Ability to encode an audio stream and pass it through at the same time
+- iPhone-compatible anamorphic (pasp atom)
+- Robust program and transport stream support
+- Better handling of DVD read errors from invalid VOB units
+- Detects and works around missing end of cell markers
+- Recovers from loss of signal in a stream
+- Drops subtitles less often
+- Keeps chapter markers in better sync and prevents duplicates
+- Better handling of B-Frames
+- Tunes FIFO sizes by CPU count
+- Finally squashes the bug that cut off the end of movies
+- Preset changes
+- Standardizes on standard out for progress and standard error for everything else.
+- Correct channel counts when passing AC3 audio to Matroska
+- Tag MP4 files as encoded with HandBrake
+- No more merging short chapters
+- Newer copies of x264,
+- VBV 2-pass patch for x264
+- Sets keyframes for x264 by frame rate.
+- Support for >2GB MKV files in Linux
+- Code audio languages in a way QuickTime understands
+- Better subtitle positioning
+- Fewer crashes in 2-pass encoding
+
+MAC
+
+- Leopard Only
+- Sparkle
+- Reads .eyetv files as well as .dvdmedia files
+- Much better queue
+- More white space
+- Code restructuring
+- Activity window logging, complete with a "black box recorder" for crashes
+- Ability to open a single title for a DVD instead of scanning the whole thing
+- Warns people when they try to queue up two files with the same name
+- Maintains picture filter states between jobs
+- .xib Interface Builder files SVN can track
+- Switches to NSImageView for previews, so no more useless OpenGL effects
+- Temporary loss of localizations for foreign languages (the old system was broken anyway)
+- Separate filter settings for every queued job
+
+WIN
+
+- Revamped preset system
+- Sparkle-compatible update checker
+- Activity log window
+- CLI built-in preset parsing
+- No more admin rights required in Vista
+- Handles more display resolutions
+
+CLI
+
+- Built-in presets
+- Short names for denoising (weak, medium, strong) and deinterlacing (fast, slow, slower) 
+- Solaris port
+- No more x264b30 (use -e x264 -I -x level=30:cabac=0 instead or better yet an iPod preset)
+- Chapter marker .csv input fixed
+- CRF as default quality mode for x264, now -q is CRF and if you want CQP add -Q to it
+
+Changes between 0.9.0 and 0.9.1:
+
+       Core HandBrake Changes:
+       + Added: Forced subtitle support
+       + Added: 6-channel Vorbis audio
+       + Changed: Much better buffer management, leading to impressive speed-ups all over the place
+       + Changed: Color subtitles now display in color, instead of being transparent.
+       + Changed: All errors to stderr with hb_log() instead of to stdout with fprintf()
+       + Changed: Accept stream input where the file type is in caps (.VOB instead of just .vob, etc)
+       + Changed: Better quality Vorbis codec (AoTuV)
+       + Changed: Faster (threaded) ffmpeg
+       + Changed: Force x264 to use a key frame at chapter markers
+       + Changed: Try to recover from bad preview scans instead of crashing
+       + Fixed: No more hanging when using MKV with chapter markers
+       + Fixed: "Same as source" FPS now works correctly when the end-credits of a progressive film are interlaced.
+       + Fixed: "Slow" deinterlacing no longer doubles up the chapter markers
+       + Fixed: Proper display of fading subtitles
+       + Fixed: Nasty artifacts from inaccurate rounding in the video scaler
+       + Fixed: Improved compatibility with streams that have missing/misplaced PMTs
+       Assorted other changes
+       
+       Mac Changes:
+       + Changed: Bigger buffer for the Activity Log
+       + Changed: Redesigned Queueing window
+       + Changed: Redesigned Preferences window
+       + Changed: Structural reorganization of the code into more segmented files
+       + Fixed: Closing the main window no longer causes HandBrake to quit
+       + Fixed: Changing dimensions in Picture Settings no longer causes a crash
+       + Fixed: Target size bitrate calculation
+       + Fixed: Picture Settings previews now scale to display resolution and screen size
+       Assorted other changes
+       
+       Windows Changes:
+       + Added: More robust exception handling
+       + Added: On-completion options to shutdown, suspend, etc
+       + Added: Turn tooltips on or off
+       + Changed: Open source, NullSoft installer
+       + Fixed: Add-to-queue issues
+       + Fixed: Foreign language issues
+       Assorted other changes
+       
+Changes between 0.8.5b1 and 0.9.0:
+
+       Core HandBrake Changes
+       + Added: Matroska (MKV) container output
+       + Added: Limited MPEG-2 transport stream (.VOB and .TS) input support
+       + Added: Option to write MP4 files larger than 4GB
+       + Added: Video filters (pullup, yadif, mcdeint, hqdn3d, pp7)
+       + Added: DTS audio input
+       + Changed: Switched to Lanczos scaling from libswscale
+       + Changed: Precise chapter marker location
+       + Changed: Newer libraries
+       + Changed: Much faster (threaded) iPod encoding
+       + Changed: "Same as source" works differently (better?) now
+       + Fixed: Audio drops should be thoroughly banished now
+       + Fixed: MP2 audio support
+       Assorted other changes
+       
+       CLI Changes:
+       + Added: Chapter naming
+       + Added: Many new command line options for subtitles and filters.
+       + Added: Turbo for 2-pass x264 encodes
+       Assorted other changes
+       
+       Mac Changes:
+       + Added: Chapter naming
+       + Added: Growl support
+       + Added: Advanced x264 settings tab
+       + Added: Logging window
+       + Added: Turbo for 2-pass x264 encodes
+       + Added: Many new presets
+       + Added: Unified toolbar
+       + Changed: Default settings
+       + Changed: Further integration of the queue and active queuing
+       + Changed: Browse DVDs like any other volumes
+       + Fixed: No more floating window syndrome (Mac)
+       + Fixed: Presets retain "magic sauce" when you change settings
+       Assorted other changes
+       
+       Windows Changes:
+       + Changed: New C#-based Windows GUI front-end
+       + Changed: Improved queuing
+       + Changed: DVD information parser
+       Assorted other changes
+
+Changes between 0.8.0b1 and 0.8.5b1
+
+       Core HandBrake Changes
+       + Added: iTunes-style chapter markers.
+       + Added: 5.1 AAC surround sound.
+       + Added: Dolby Pro Logic I and II downmixing of discrete surround sound.
+       + Added: 1-channel AAC sound from monophonic sources.
+       + Added: Advanced x264 options. (including High Profile support)
+       + Added: B-frames in x264 + .mp4
+       + Added: PPC Linux Support.
+       + Added: Preserve language IDs from the DVD in .mp4
+       + Added: Snapshot build method.
+       + Added: Anamorphic video display in QuickTime.
+       + Changed: Renamed back to HandBrake.
+       + Changed: Libraries updated.
+       + Changed: Enabled Update Checker.
+       + Fixed: Multiple Audio tracks.
+       + Fixed: Sped up DVD scanning time by being nicer to libdvdread.
+       + Fixed: .dmg is now mountable in Mac OS X versions older than 10.4
+       + Fixed: Proper output size from x264 in target size mode.
+       + Fixed: Allows output sizes larger than 2 gigs in Linux.
+       + Fixed: Several small memory leaks have been plugged.
+       + Fixed: Fixes for 64-bit systems.
+       + Fixed: Keep Aspect Ratio is no longer forced, so user-set height values are respected.
+
+       CLI Interface Changes
+       + Added: Customize maximum width and height while keeping aspect ratio
+       + Changed: Much prettier help screen
+       + Changed: HBTest/MediaForkCLI renamed to HandBrakeCLI
+       + Fixed: Better display of audio and subtitle ids
+
+       Mac GUI Changes
+       + Added: Presets! Includes initial ones for AppleTV, iPod, and PS3.
+       + Added: Preference option to auto-name output files with the DVD name and title number.
+       + Added: Preset support for x264 options.
+       + Changed: Remembers last destination path.
+       + Changed: Remembers last source path.
+       + Changed: Copy and paste in text fields.
+       + Changed: Updates target size more quickly.
+       + Changed: Mac GUI no longer retains target size values between enqueued jobs. (http://HandBrake.m0k.org/forum/viewtopic.php?t=249)
+       + Fixed: Preview frames are no longer distorted in anamorphic mode.
+       + Fixed: Mac GUI no longer floats above other windows.
+       + Fixed: Browse by file no longer dims the browse button preventing you from changing browse locations without switching back and forth between it and drive selection. (http://HandBrake.m0k.org/forum/viewtopic.php?t=342)
+       + Fixed: Makes sure destination directory is valid.
+       + Fixed: Fills in the file save field with the current output name instead of leaving it blank.
+       + Fixed: Update destination field with the current path instead of using the last one, which could have been a DVD.
+
+       Windows GUI Changes Ã± Version 2.2 beta 1
+       + Added: A few presets for the iPod in the menu.
+       + Added: Ability to set default settings for all program encode options. 
+       + Added: Ability to turn off Automatic Update check on start-up. See Tools > Options
+       + Added: Mod 16 check on the Height and Width boxes. 
+       + Added: Check the amount of hard disk space left is not running low when saving file. 
+       + Added: Option to have a Read DVD window showup on start-up.
+       + Added: Ã¬View DVD dataî Menu item in the tools menu. 
+       + Added: Links to the Homepage, forum, wiki and documentation page in the Help menu.
+       + Added: Chapter markers check box (New feature in 0.8.5b1 CLI)
+       + Changed: View DVD Information no longer appears after clicking the Ã¬Browseî button. 
+       + Changed: A few changes to the GUI - replaced textboxes with Dropdowns which auto-populate. 
+       + Changed: Auto Crop and Aspect text now automatically update when a new title is selected.
+       + Changed: Several tweaks to the GUI design, remove a few text items that are no longer needed.
+       + Changed: Ability to Queue videos enabled with completely re-written code. 
+       + Changed: Ability to queue stuff up while the encoding process is running. 
+       + Changed: Ability to remove items from the encode queue while is running. 
+       + Changed: Anamorphic option blanks out resolution boxes. 
+       + Changed: Re-written update checker. 
+       + Changed: Ability to turn off update check on start-up in Tools > Options
+       + Changed: Auto Crop option now fills in figures into text boxes when selected. 
+       + Changed: Mp4 now default output file extension.
+       + Changed: Enabled 5.1 AAC option.
+       + Changed: Enabled h264 advanced options. 
+       + Changed: Updated the FAQ.
+       + Changed: Included new version of HandBrake. Version 0.8.5b1.
+       + Fixed: Pixel Ratio Not being saved with the profile.
+       + Removed: Both Ã¬View Dataî buttons on the Title Selection Window.
+       + Removed: The Ã¬Read DVDî button. -  Automatically reads the DVD after selecting a source now.
+       + Removed: The Help and Support window. Been replaced with a few Web Links.
+
+
+Changes between 0.7.1 and 0.8.0
+ + MediaFork project forked from HandBrake source <http://handbrake.m0k.org/>
+ + Updated libraries (meaning better quality, hopefully fewer bugs, and increased speeds)
+ + iPod 5.5G support
+ + Revamped graphical interface (Mac OS X)
+ + Anamorphic encoding with pixel aspect ratio
+ + Brighter color reproduction in QuickTime
+ + Lists disks by DVD name instead of by drive name (Mac OS X)
+ + Titles output movies based on the DVD name (Mac OS X)
+ + 32Khz audio output
+ + Constant rate factor encoding with x264
+ + New preference item to turn deinterlacing on by default (Mac OS X)
+ + New preference item to select the default audio language (Mac OS X)
+ + Bugfix for reading straight from a DVD
+
+Changes between 0.7.0 and 0.7.1
+ + Universal Binary for PPC and Intel
+ + Bugfixes for missing subtitles, audio glitches with LPCM tracks and more
+
+Changes between 0.7.0-beta3 and 0.7.0
+ + Multithreaded H.264 encoding with x264
+ + Added option for H.264 Baseline (suitable for iPods)
+ + (Very) experimental queue support
+ + Fixes for some DVD titles HandBrake would not recognize
+ + Fixes audio gliches when encoding from LPCM tracks
+
+Changes between 0.6.2 and 0.7.0-beta3
+ + Chapters selection
+ + Custom framerate
+ + Subtitle support
+ + Check for updates
+ + Custom aspect ratio
+ + Audio samplerate selection
+ + mp4/H.264 output
+ + Proper NTSC support
+ + AC3 pass-through
+ + Progress bar in the dock icon (OS X)
+ + 2-pass H.264 encoding
+ + Constant quality encoding
+ + Grayscale encoding
+ + Up-to-date BeOS UI
+
+Changes between 0.6.1 and 0.6.2
+ + Support for DVDs with MPEG audio tracks
+ + Rewrote the DVD navigation code
+ + High quality resampler included
+ + Better AVI compliance
+ + Updated encoders
+ + Internal improvements
+ + Bugfixes
+
+Changes between 0.6.0 and 0.6.1
+ + Fixed LPCM endianness issue
+
+Changes between 0.5.2 and 0.6.0
+ + MP4 and OGM output
+ + AAC and Vorbis encoding
+ + Experimental H264 encoding
+ + LPCM DVDs support
+ + Autocrop
+ + GTK2 linux interface
+ + OS X interface localization
+
+Changes between 0.5.1 and 0.5.2
+ + Bugfixes
+
+Changes between 0.5 and 0.5.1
+ + 2-pass XviD encoding
+ + Bugfixes
+
+Changes between 0.4 and 0.5
+ + Bugfixes, rewrite of large parts of the core
+ + XviD encoding (1-pass only)
+
+Changes between 0.3 and 0.4
+ + Better multithreading
+ + Allow the user to specify a target size instead of bitrate
+ + Misc GUI enhancements
+ + Use low-priority threads on OS X
+
+Changes between 0.2 and 0.3
+ + OSX & Linux ports
+ + Allow 2-pass encoding
+ + Many internal changes & fixes
+
+Changes between 0.1.1 and 0.2
+ + Fixed a major bug that made HandBrake probably crash after ~ 15
+   minutes encoded
+ + Fixed a few minor memory leaks
+
+Changes between 0.1 and 0.1.1
+ + Fixed a stupid bug that prevented to scan volumes correctly if
+   FAT/NTFS/etc volumes were mounted
+
+Changes between 0.1-alpha2 and 0.1 :
+ + Automatically detect ripped DVDs on BFS volumes
+ + Allow picture cropping and resizing
+ + Allow dual-audio encoding
+ + Created files are quite compliant now (tested with OSX/Quicktime
+   and BSPlayer)
+ + Better A/V sync with some DVDs
+
+Changes between 0.1-alpha and 0.1-alpha2 :
+ + Show length for each title
+ + Fixed the screwed-audio bug
+ + Many bugfixes...
+
+First version is 0.1-alpha.
diff --git a/win/C#/doc/THANKS b/win/C#/doc/THANKS
new file mode 100644 (file)
index 0000000..cb388ae
--- /dev/null
@@ -0,0 +1,70 @@
+THANKS file for HandBrake <http://handbrake.fr/>
+
+Several people noticeably contributed to MediaFork and HandBrake development
+without writing code (submitting/checking translations, DVD samples, etc).
+Let's thank them here!
+
+Chris (audley)
+ + Inspiration and example of patching mpeg4ip for iPod atom support
+
+Omar Ahmad Bhatti
+ + Intensive beta testing, suggestions. Convinced me to port HandBrake
+   to OS X, which finally was a pretty good idea.
+
+Hanna Bauer
+Adrien Marquette
+Norbert Rittel
+ + German translation
+
+Paul Bénéchet
+Luidgi Esposito
+Andrea Gianarro
+Emilio Gelosi
+ + Italian translation
+
+Adam
+ + Polish translation
+
+Nik Roby
+ + Russian translation
+
+Leendert
+ + Dutch translation
+
+Eric Kornblum
+ + Sent me a sample DVD with LPCM tracks
+
+migol Superkid
+ + Spanish translation
+
+pgjw
+ + Portuguese translation
+
+cygma
+ + Japanese translation
+
+Michelle De Sio
+ + Sent me a sample DVD with MPEG audio tracks
+
+Ian Rickard
+ + Enhanced icon
+
+Sébastien Noël
+ + Debian packages (http://www.twolife.org/debian/repository.php)
+
+People who sent me an iTunes gift certificate: a BIG thanks!
+
+Paul (baggss)
+ + Forum Moderator
+Du'Wayne Caviness (Cavalicious)
+ + Forum Moderator
+Edward Jackson. (TedJ)
+ + Forum Moderator
+Chuck (cvk_b)
+ + Testing Team Member
+
+Nate Thompson (nightstrm)
+ + Forum Moderator
\ No newline at end of file
diff --git a/win/C#/doc/TRANSLATIONS b/win/C#/doc/TRANSLATIONS
new file mode 100644 (file)
index 0000000..c882588
--- /dev/null
@@ -0,0 +1,23 @@
+$Id: TRANSLATIONS,v 1.2 2004/03/22 18:20:30 titer Exp $
+
+TRANSLATIONS file for HandBrake <http://handbrake.fr/>
+
+Translating HandBrake
+=====================
+
+***** HandBrake does not currently have a localization scheme for any of its interfaces.
+***** Information below is obsolete and only useful for historical purposes:
+
+Only the OS X interface of HandBrake can be translated at the moment.
+Localization is not implemented in BeOS and GTK GUIs.
+
+HandBrake uses the NSLocalizedString() OS X function to translate every
+item in the interface. Therefore, you don't need (and mustn't) modify
+the nib files. All you have to do is to write a Localizable.strings for
+your language. You can get it (for the latest release) at
+<http://handbrake.m0k.org/Localizable.strings>.
+
+Edit it with Xcode, save it to HandBrake/macosx/i18n/xx.strings (where
+'xx' are the two letters representing your language), then add 'xx' to
+the language list in the Jamrules file.
+
index 2b9c46f..00d2f76 100644 (file)
@@ -1,8 +1,8 @@
 /*  frmAbout.Designer.cs \r
        \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -37,9 +37,11 @@ namespace Handbrake
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmAbout));\r
             this.Label3 = new System.Windows.Forms.Label();\r
             this.label1 = new System.Windows.Forms.Label();\r
-            this.lbl_HBBuild = new System.Windows.Forms.Label();\r
             this.PictureBox1 = new System.Windows.Forms.PictureBox();\r
             this.btn_close = new System.Windows.Forms.Button();\r
+            this.richTextBox1 = new System.Windows.Forms.RichTextBox();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.lbl_GUIBuild = new System.Windows.Forms.Label();\r
             ((System.ComponentModel.ISupportInitialize)(this.PictureBox1)).BeginInit();\r
             this.SuspendLayout();\r
             // \r
@@ -58,25 +60,14 @@ namespace Handbrake
             // label1\r
             // \r
             this.label1.AutoSize = true;\r
-            this.label1.Location = new System.Drawing.Point(125, 63);\r
+            this.label1.Location = new System.Drawing.Point(125, 36);\r
             this.label1.Margin = new System.Windows.Forms.Padding(3);\r
             this.label1.Name = "label1";\r
             this.label1.Size = new System.Drawing.Size(224, 13);\r
             this.label1.TabIndex = 33;\r
-            this.label1.Text = "Copyright  2003-2009 HandBrake Developers";\r
+            this.label1.Text = "Copyright  2003-2011 HandBrake Developers";\r
             this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
             // \r
-            // lbl_HBBuild\r
-            // \r
-            this.lbl_HBBuild.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.lbl_HBBuild.Location = new System.Drawing.Point(125, 33);\r
-            this.lbl_HBBuild.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3);\r
-            this.lbl_HBBuild.Name = "lbl_HBBuild";\r
-            this.lbl_HBBuild.Size = new System.Drawing.Size(224, 13);\r
-            this.lbl_HBBuild.TabIndex = 32;\r
-            this.lbl_HBBuild.Text = "{Version}";\r
-            this.lbl_HBBuild.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
-            // \r
             // PictureBox1\r
             // \r
             this.PictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\r
@@ -93,7 +84,7 @@ namespace Handbrake
             // btn_close\r
             // \r
             this.btn_close.DialogResult = System.Windows.Forms.DialogResult.OK;\r
-            this.btn_close.Location = new System.Drawing.Point(274, 82);\r
+            this.btn_close.Location = new System.Drawing.Point(468, 270);\r
             this.btn_close.Name = "btn_close";\r
             this.btn_close.Size = new System.Drawing.Size(75, 23);\r
             this.btn_close.TabIndex = 35;\r
@@ -101,17 +92,49 @@ namespace Handbrake
             this.btn_close.UseVisualStyleBackColor = true;\r
             this.btn_close.Click += new System.EventHandler(this.btn_close_Click);\r
             // \r
+            // richTextBox1\r
+            // \r
+            this.richTextBox1.Location = new System.Drawing.Point(128, 102);\r
+            this.richTextBox1.Name = "richTextBox1";\r
+            this.richTextBox1.Size = new System.Drawing.Size(415, 162);\r
+            this.richTextBox1.TabIndex = 36;\r
+            this.richTextBox1.Text = resources.GetString("richTextBox1.Text");\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Location = new System.Drawing.Point(125, 83);\r
+            this.label2.Margin = new System.Windows.Forms.Padding(3);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(46, 13);\r
+            this.label2.TabIndex = 37;\r
+            this.label2.Text = "License:";\r
+            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
+            // \r
+            // lbl_GUIBuild\r
+            // \r
+            this.lbl_GUIBuild.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.lbl_GUIBuild.Location = new System.Drawing.Point(229, 17);\r
+            this.lbl_GUIBuild.Margin = new System.Windows.Forms.Padding(3, 1, 3, 3);\r
+            this.lbl_GUIBuild.Name = "lbl_GUIBuild";\r
+            this.lbl_GUIBuild.Size = new System.Drawing.Size(224, 13);\r
+            this.lbl_GUIBuild.TabIndex = 38;\r
+            this.lbl_GUIBuild.Text = "{GUI Version}";\r
+            this.lbl_GUIBuild.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
+            // \r
             // frmAbout\r
             // \r
             this.AcceptButton = this.btn_close;\r
             this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r
             this.CancelButton = this.btn_close;\r
-            this.ClientSize = new System.Drawing.Size(363, 117);\r
+            this.ClientSize = new System.Drawing.Size(555, 302);\r
+            this.Controls.Add(this.lbl_GUIBuild);\r
+            this.Controls.Add(this.label2);\r
+            this.Controls.Add(this.richTextBox1);\r
             this.Controls.Add(this.btn_close);\r
             this.Controls.Add(this.label1);\r
             this.Controls.Add(this.PictureBox1);\r
-            this.Controls.Add(this.lbl_HBBuild);\r
             this.Controls.Add(this.Label3);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
@@ -133,8 +156,10 @@ namespace Handbrake
 \r
         internal System.Windows.Forms.Label Label3;\r
         internal System.Windows.Forms.Label label1;\r
-        internal System.Windows.Forms.Label lbl_HBBuild;\r
         internal System.Windows.Forms.PictureBox PictureBox1;\r
         private System.Windows.Forms.Button btn_close;\r
+        private System.Windows.Forms.RichTextBox richTextBox1;\r
+        internal System.Windows.Forms.Label label2;\r
+        internal System.Windows.Forms.Label lbl_GUIBuild;\r
     }\r
 }
\ No newline at end of file
index a35779a..70fc922 100644 (file)
@@ -1,22 +1,38 @@
 /*  frmAbout.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    /// <summary>\r
+    /// The About Window\r
+    /// </summary>\r
     public partial class frmAbout : Form\r
     {\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmAbout"/> class.\r
+        /// </summary>\r
         public frmAbout()\r
         {\r
             InitializeComponent();\r
-            lbl_HBBuild.Text = Properties.Settings.Default.hb_version + " (" + Properties.Settings.Default.hb_build + ") - " + Properties.Settings.Default.hb_platform;\r
+\r
+            string nightly = Properties.Settings.Default.hb_version.Contains("svn") ? " (SVN / Nightly Build)" : string.Empty;\r
+            lbl_GUIBuild.Text = Properties.Settings.Default.hb_version + " (" + Properties.Settings.Default.hb_build + ") " + nightly;\r
         }\r
 \r
+        /// <summary>\r
+        /// Button - Close the window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_close_Click(object sender, EventArgs e)\r
         {\r
             this.Close();\r
index 37f9290..796f0d5 100644 (file)
   <resheader name="writer">\r
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
+  <data name="richTextBox1.Text" xml:space="preserve">\r
+    <value>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</value>\r
+  </data>\r
   <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
     <value>\r
index 9d25318..b71122f 100644 (file)
@@ -1,8 +1,8 @@
 /*  frmDvdInfo.Designer.cs \r
        \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -42,17 +42,11 @@ namespace Handbrake
             this.mnu_openLogFolder = new System.Windows.Forms.ToolStripMenuItem();\r
             this.ToolTip = new System.Windows.Forms.ToolTip(this.components);\r
             this.toolStrip1 = new System.Windows.Forms.ToolStrip();\r
-            this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton();\r
-            this.btn_encode_log = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.btn_scan_log = new System.Windows.Forms.ToolStripMenuItem();\r
             this.btn_copy = new System.Windows.Forms.ToolStripButton();\r
+            this.logSelector = new System.Windows.Forms.ToolStripComboBox();\r
             this.panel1 = new System.Windows.Forms.Panel();\r
-            this.statusStrip1 = new System.Windows.Forms.StatusStrip();\r
-            this.lbl_slb = new System.Windows.Forms.ToolStripStatusLabel();\r
-            this.txt_log = new System.Windows.Forms.ToolStripStatusLabel();\r
             this.rightClickMenu.SuspendLayout();\r
             this.toolStrip1.SuspendLayout();\r
-            this.statusStrip1.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // rtf_actLog\r
@@ -64,7 +58,7 @@ namespace Handbrake
             this.rtf_actLog.Location = new System.Drawing.Point(0, 25);\r
             this.rtf_actLog.Name = "rtf_actLog";\r
             this.rtf_actLog.ReadOnly = true;\r
-            this.rtf_actLog.Size = new System.Drawing.Size(404, 530);\r
+            this.rtf_actLog.Size = new System.Drawing.Size(404, 552);\r
             this.rtf_actLog.TabIndex = 29;\r
             this.rtf_actLog.Text = "";\r
             // \r
@@ -82,7 +76,7 @@ namespace Handbrake
             this.mnu_copy_log.Name = "mnu_copy_log";\r
             this.mnu_copy_log.Size = new System.Drawing.Size(253, 22);\r
             this.mnu_copy_log.Text = "Copy";\r
-            this.mnu_copy_log.Click += new System.EventHandler(this.mnu_copy_log_Click);\r
+            this.mnu_copy_log.Click += new System.EventHandler(this.MnuCopyLogClick);\r
             // \r
             // mnu_openLogFolder\r
             // \r
@@ -90,7 +84,7 @@ namespace Handbrake
             this.mnu_openLogFolder.Name = "mnu_openLogFolder";\r
             this.mnu_openLogFolder.Size = new System.Drawing.Size(253, 22);\r
             this.mnu_openLogFolder.Text = "Open Individual Log File Directory";\r
-            this.mnu_openLogFolder.Click += new System.EventHandler(this.mnu_openLogFolder_Click);\r
+            this.mnu_openLogFolder.Click += new System.EventHandler(this.MnuOpenLogFolderClick);\r
             // \r
             // ToolTip\r
             // \r
@@ -100,8 +94,8 @@ namespace Handbrake
             // \r
             this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\r
             this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
-            this.toolStripDropDownButton1,\r
-            this.btn_copy});\r
+            this.btn_copy,\r
+            this.logSelector});\r
             this.toolStrip1.Location = new System.Drawing.Point(0, 0);\r
             this.toolStrip1.Name = "toolStrip1";\r
             this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
@@ -109,35 +103,6 @@ namespace Handbrake
             this.toolStrip1.TabIndex = 96;\r
             this.toolStrip1.Text = "toolStrip1";\r
             // \r
-            // toolStripDropDownButton1\r
-            // \r
-            this.toolStripDropDownButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
-            this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
-            this.btn_encode_log,\r
-            this.btn_scan_log});\r
-            this.toolStripDropDownButton1.Image = global::Handbrake.Properties.Resources.Output_Small;\r
-            this.toolStripDropDownButton1.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
-            this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta;\r
-            this.toolStripDropDownButton1.Name = "toolStripDropDownButton1";\r
-            this.toolStripDropDownButton1.Size = new System.Drawing.Size(90, 22);\r
-            this.toolStripDropDownButton1.Text = "Select Log";\r
-            // \r
-            // btn_encode_log\r
-            // \r
-            this.btn_encode_log.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
-            this.btn_encode_log.Name = "btn_encode_log";\r
-            this.btn_encode_log.Size = new System.Drawing.Size(152, 22);\r
-            this.btn_encode_log.Text = "Encode Log";\r
-            this.btn_encode_log.Click += new System.EventHandler(this.btn_encode_log_Click);\r
-            // \r
-            // btn_scan_log\r
-            // \r
-            this.btn_scan_log.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
-            this.btn_scan_log.Name = "btn_scan_log";\r
-            this.btn_scan_log.Size = new System.Drawing.Size(152, 22);\r
-            this.btn_scan_log.Text = "Scan Log";\r
-            this.btn_scan_log.Click += new System.EventHandler(this.btn_scan_log_Click);\r
-            // \r
             // btn_copy\r
             // \r
             this.btn_copy.Image = ((System.Drawing.Image)(resources.GetObject("btn_copy.Image")));\r
@@ -146,7 +111,18 @@ namespace Handbrake
             this.btn_copy.Name = "btn_copy";\r
             this.btn_copy.Size = new System.Drawing.Size(122, 22);\r
             this.btn_copy.Text = "Copy to clipboard";\r
-            this.btn_copy.Click += new System.EventHandler(this.btn_copy_Click);\r
+            this.btn_copy.Click += new System.EventHandler(this.BtnCopyClick);\r
+            // \r
+            // logSelector\r
+            // \r
+            this.logSelector.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
+            this.logSelector.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.logSelector.Items.AddRange(new object[] {\r
+            "Scan Log",\r
+            "Encode Log"});\r
+            this.logSelector.Name = "logSelector";\r
+            this.logSelector.Size = new System.Drawing.Size(121, 25);\r
+            this.logSelector.SelectedIndexChanged += new System.EventHandler(this.LogSelectorClick);\r
             // \r
             // panel1\r
             // \r
@@ -156,33 +132,6 @@ namespace Handbrake
             this.panel1.Size = new System.Drawing.Size(404, 552);\r
             this.panel1.TabIndex = 97;\r
             // \r
-            // statusStrip1\r
-            // \r
-            this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
-            this.lbl_slb,\r
-            this.txt_log});\r
-            this.statusStrip1.Location = new System.Drawing.Point(0, 555);\r
-            this.statusStrip1.Name = "statusStrip1";\r
-            this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 12, 0);\r
-            this.statusStrip1.Size = new System.Drawing.Size(404, 22);\r
-            this.statusStrip1.TabIndex = 98;\r
-            this.statusStrip1.Text = "statusStrip1";\r
-            // \r
-            // lbl_slb\r
-            // \r
-            this.lbl_slb.BackColor = System.Drawing.Color.Transparent;\r
-            this.lbl_slb.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.lbl_slb.Name = "lbl_slb";\r
-            this.lbl_slb.Size = new System.Drawing.Size(85, 17);\r
-            this.lbl_slb.Text = "Selected Log: ";\r
-            // \r
-            // txt_log\r
-            // \r
-            this.txt_log.BackColor = System.Drawing.Color.Transparent;\r
-            this.txt_log.Name = "txt_log";\r
-            this.txt_log.Size = new System.Drawing.Size(78, 17);\r
-            this.txt_log.Text = "{selected log}";\r
-            // \r
             // frmActivityWindow\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
@@ -190,7 +139,6 @@ namespace Handbrake
             this.BackColor = System.Drawing.SystemColors.ControlLight;\r
             this.ClientSize = new System.Drawing.Size(404, 577);\r
             this.Controls.Add(this.rtf_actLog);\r
-            this.Controls.Add(this.statusStrip1);\r
             this.Controls.Add(this.panel1);\r
             this.Controls.Add(this.toolStrip1);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
@@ -201,11 +149,10 @@ namespace Handbrake
             this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show;\r
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r
             this.Text = "Activity Window";\r
+            this.Load += new System.EventHandler(this.ActivityWindowLoad);\r
             this.rightClickMenu.ResumeLayout(false);\r
             this.toolStrip1.ResumeLayout(false);\r
             this.toolStrip1.PerformLayout();\r
-            this.statusStrip1.ResumeLayout(false);\r
-            this.statusStrip1.PerformLayout();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -217,15 +164,10 @@ namespace Handbrake
         internal System.Windows.Forms.ToolTip ToolTip;\r
         private System.Windows.Forms.ToolStrip toolStrip1;\r
         private System.Windows.Forms.Panel panel1;\r
-        private System.Windows.Forms.StatusStrip statusStrip1;\r
-        private System.Windows.Forms.ToolStripStatusLabel txt_log;\r
-        private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1;\r
-        private System.Windows.Forms.ToolStripMenuItem btn_encode_log;\r
-        private System.Windows.Forms.ToolStripMenuItem btn_scan_log;\r
         private System.Windows.Forms.ToolStripButton btn_copy;\r
-        private System.Windows.Forms.ToolStripStatusLabel lbl_slb;\r
         private System.Windows.Forms.ContextMenuStrip rightClickMenu;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_copy_log;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_openLogFolder;\r
+        private System.Windows.Forms.ToolStripComboBox logSelector;\r
     }\r
 }
\ No newline at end of file
index 9f9f411..ee3d3bf 100644 (file)
 /*  frmActivityWindow.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.ComponentModel;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using System.Threading;\r
-using Handbrake.EncodeQueue;\r
-using Handbrake.Functions;\r
-using Microsoft.Win32;\r
-\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.ComponentModel;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Text;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.Framework.Services;\r
+    using HandBrake.Framework.Services.Interfaces;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    using Model;\r
+    using Timer = System.Threading.Timer;\r
+\r
+    /// <summary>\r
+    /// The Activity Log Window\r
+    /// </summary>\r
     public partial class frmActivityWindow : Form\r
     {\r
-        private delegate void setTextCallback(string text);\r
-        private String _readFile;\r
-        private readonly EncodeAndQueueHandler _encodeQueue;\r
-        private int _position;  // Position in the arraylist reached by the current log output in the rtf box.\r
-        private readonly frmMain _mainWin;\r
-        private Boolean _lastUpdate;\r
-        private Boolean fileNotFoundQuickFix;\r
-\r
-        public frmActivityWindow(string file, EncodeAndQueueHandler eh, frmMain mw)\r
+        /* Private Variables */\r
+\r
+        /// <summary>\r
+        /// The Encode Object\r
+        /// </summary>\r
+        private readonly IQueue encode;\r
+\r
+        /// <summary>\r
+        /// The Scan Object\r
+        /// </summary>\r
+        private readonly IScan scan;\r
+\r
+        /// <summary>\r
+        /// The Error service\r
+        /// </summary>\r
+        private readonly IErrorService errorService = new ErrorService();\r
+\r
+        /// <summary>\r
+        /// The current position in the log file\r
+        /// </summary>\r
+        private int position;\r
+\r
+        /// <summary>\r
+        /// A Timer for this window\r
+        /// </summary>\r
+        private Timer windowTimer;\r
+\r
+        /// <summary>\r
+        /// The Type of log that the window is currently dealing with\r
+        /// </summary>\r
+        private ActivityLogMode mode;\r
+\r
+        /* Constructor */\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmActivityWindow"/> class.\r
+        /// </summary>\r
+        /// <param name="encode">\r
+        /// The encode.\r
+        /// </param>\r
+        /// <param name="scan">\r
+        /// The scan.\r
+        /// </param>\r
+        public frmActivityWindow(IQueue encode, IScan scan)\r
         {\r
             InitializeComponent();\r
 \r
-            _encodeQueue = eh;\r
-            _mainWin = mw;\r
+            this.encode = encode;\r
+            this.scan = scan;\r
+            this.position = 0;\r
 \r
-            fileNotFoundQuickFix = false;\r
+            // Listen for Scan and Encode Starting Events\r
+            scan.ScanStared += scan_ScanStared;\r
+            encode.EncodeStarted += encode_EncodeStarted;\r
+        }\r
 \r
-            if (file == "last_scan_log.txt")\r
-                SetLogView(true);\r
-            else\r
-                SetLogView(false);\r
+        /* Delegates */\r
 \r
-            // Start a new thread which will montior and keep the log window up to date if required/\r
-            try\r
-            {\r
-                Thread monitor = new Thread(AutoUpdate) { IsBackground = true };\r
-                monitor.Start();\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show("startLogThread(): Exception: \n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-            }\r
-        }\r
+        /// <summary>\r
+        /// A callback function for updating the ui\r
+        /// </summary>\r
+        /// <param name="text">\r
+        /// The text.\r
+        /// </param>\r
+        private delegate void SetTextCallback(StringBuilder text);\r
 \r
         /// <summary>\r
-        /// Set the view which the Log window displays.\r
-        /// Scan = true;\r
-        /// Encode = false;\r
+        /// Clear text callback\r
         /// </summary>\r
-        /// <param name="scan">Boolean. Scan = true</param>\r
-        public void SetLogView(Boolean scan)\r
+        private delegate void SetTextClearCallback();\r
+\r
+        /// <summary>\r
+        /// Set mode callback\r
+        /// </summary>\r
+        /// <param name="setMode">\r
+        /// The set mode.\r
+        /// </param>\r
+        private delegate void SetModeCallback(ActivityLogMode setMode);\r
+\r
+        /* Private Methods */\r
+\r
+        /// <summary>\r
+        /// Set the window to scan mode\r
+        /// </summary>\r
+        /// <param name="setMode">\r
+        /// The set Mode.\r
+        /// </param>\r
+        private void SetMode(ActivityLogMode setMode)\r
         {\r
-            // Reset\r
-            _position = 0;\r
-            rtf_actLog.Text = String.Empty;\r
-\r
-            // Print the log header\r
-            rtf_actLog.AppendText(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));\r
-            rtf_actLog.AppendText(String.Format("### Running: {0} \n###\n", Environment.OSVersion));\r
-            rtf_actLog.AppendText(String.Format("### CPU: {0} \n", getCpuCount()));\r
-            rtf_actLog.AppendText(String.Format("### Ram: {0} MB \n", TotalPhysicalMemory()));\r
-            rtf_actLog.AppendText(String.Format("### Screen: {0}x{1} \n", screenBounds().Bounds.Width, screenBounds().Bounds.Height));\r
-            rtf_actLog.AppendText(String.Format("### Temp Dir: {0} \n", Path.GetTempPath()));\r
-            rtf_actLog.AppendText(String.Format("### Install Dir: {0} \n", Application.StartupPath));\r
-            rtf_actLog.AppendText(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));\r
-            rtf_actLog.AppendText("#########################################\n\n");\r
-\r
-            // Seutp the log file\r
-            if (scan)\r
-            {\r
-                txt_log.Text = "Scan Log";\r
-                _readFile = "last_scan_log.txt";\r
-            }\r
-            else\r
+            if (IsHandleCreated)\r
             {\r
-                _readFile = "last_encode_log.txt";\r
-                txt_log.Text = "Encode Log";\r
-                if (_encodeQueue.isEncoding)\r
-                    if ((!_encodeQueue.LastEncode.IsEmpty) && _encodeQueue.LastEncode.Query != String.Empty)\r
+                if (rtf_actLog.InvokeRequired)\r
+                {\r
+                    IAsyncResult invoked = BeginInvoke(new SetModeCallback(SetMode), new object[] { setMode });\r
+                    EndInvoke(invoked);\r
+                }\r
+                else\r
+                {\r
+                    Reset();\r
+                    this.mode = setMode;\r
+\r
+                    Array values = Enum.GetValues(typeof(ActivityLogMode));\r
+                    Properties.Settings.Default.ActivityWindowLastMode = (int)values.GetValue(Convert.ToInt32(setMode));\r
+                    Properties.Settings.Default.Save();\r
+\r
+                    this.Text = mode == ActivityLogMode.Scan\r
+                                    ? "Activity Window (Scan Log)"\r
+                                    : "Activity Window (Encode Log)";\r
+\r
+                    if (mode == ActivityLogMode.Scan)\r
+                    {\r
+                        scan.ScanCompleted += stopWindowRefresh;\r
+                        encode.EncodeEnded -= stopWindowRefresh;\r
+                    }\r
+                    else\r
                     {\r
-                        rtf_actLog.AppendText("### CLI Query: " + _encodeQueue.LastEncode.Query + "\n");\r
-                        rtf_actLog.AppendText("### Custom Query: " + _encodeQueue.LastEncode.CustomQuery + "\n\n");\r
-                        rtf_actLog.AppendText("#########################################\n\n");\r
+                        scan.ScanCompleted -= stopWindowRefresh;\r
+                        encode.EncodeEnded += stopWindowRefresh;\r
                     }\r
+\r
+                    // Start a fresh window timer\r
+                    windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
+                }\r
             }\r
-            _lastUpdate = false;\r
         }\r
 \r
-        private void AutoUpdate(object state)\r
+        /// <summary>\r
+        /// On Window load, start a new timer\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void ActivityWindowLoad(object sender, EventArgs e)\r
         {\r
             try\r
             {\r
-                _lastUpdate = false;\r
-                UpdateTextFromThread();\r
-                while (true)\r
+                // Set the inital log file.\r
+                if (encode.IsEncoding)\r
                 {\r
-                    if (IsHandleCreated)\r
-                    {\r
-                        if (_encodeQueue.isEncoding || _mainWin.isScanning)\r
-                            UpdateTextFromThread();\r
-                        else\r
-                        {\r
-                            // The encode may just have stoped, so, refresh the log one more time before restarting it.\r
-                            if (_lastUpdate == false)\r
-                                UpdateTextFromThread();\r
-\r
-                            _lastUpdate = true; // Prevents the log window from being updated when there is no encode going.\r
-                            _position = 0; // There is no encoding, so reset the log position counter to 0 so it can be reused\r
-                        }\r
-                    }\r
-                    Thread.Sleep(1000);\r
+                    this.logSelector.SelectedIndex = 1;\r
+                }\r
+                else if (scan.IsScanning)\r
+                {\r
+                    this.logSelector.SelectedIndex = 0;\r
+                }\r
+                else\r
+                {\r
+                    // Otherwise, use the last mode the window was in.\r
+                    ActivityLogMode activitLogMode = (ActivityLogMode)Enum.ToObject(typeof(ActivityLogMode), Properties.Settings.Default.ActivityWindowLastMode);\r
+                    this.logSelector.SelectedIndex = activitLogMode == ActivityLogMode.Scan ? 0 : 1;\r
                 }\r
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("AutoUpdate(): Exception: \n" + exc);\r
+                errorService.ShowError("Error during load.", exc.ToString());\r
             }\r
         }\r
-        private void UpdateTextFromThread()\r
+\r
+        /// <summary>\r
+        /// Set the Log window to encode mode when an encode starts.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void encode_EncodeStarted(object sender, EventArgs e)\r
+        {\r
+            SetMode(ActivityLogMode.Encode);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Set the log widow to scan mode when a scan starts\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void scan_ScanStared(object sender, EventArgs e)\r
+        {\r
+            SetMode(ActivityLogMode.Scan);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Stop refreshing the window when no scanning or encoding is happening.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void stopWindowRefresh(object sender, EventArgs e)\r
         {\r
+            windowTimer.Dispose();\r
+            Reset();\r
+            LogMonitor(null);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Append new text to the window\r
+        /// </summary>\r
+        /// <param name="n">\r
+        /// The n.\r
+        /// </param>\r
+        private void LogMonitor(object n)\r
+        {\r
+            AppendWindowText(GetLog());\r
+        }\r
+\r
+        /// <summary>\r
+        /// New Code for getting the Activity log from the Services rather than reading a file.\r
+        /// </summary>\r
+        /// <returns>\r
+        /// The StringBuilder containing a log\r
+        /// </returns>\r
+        private StringBuilder GetLog()\r
+        {\r
+            StringBuilder appendText = new StringBuilder();\r
+\r
             try\r
             {\r
-                String info = ReadFile();\r
-                if (info.Contains("has exited"))\r
-                    info += "\n ############ End of Log ############## \n";\r
+                if (this.mode == ActivityLogMode.Scan)\r
+                {\r
+                    if (scan == null || scan.ActivityLog == string.Empty)\r
+                    {\r
+                        appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
+                        position = 0;\r
+                        ClearWindowText();\r
+                        return appendText;\r
+                    }\r
+\r
+                    using (StringReader reader = new StringReader(scan.ActivityLog))\r
+                    {\r
+                        LogReader(reader, appendText);\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    if (encode == null || encode.ActivityLog == string.Empty)\r
+                    {\r
+                        appendText.AppendFormat("Waiting for the log to be generated ...\n");\r
+                        position = 0;\r
+                        ClearWindowText();\r
+                        return appendText;\r
+                    }\r
 \r
-                SetText(info);\r
+                    using (StringReader reader = new StringReader(encode.ActivityLog))\r
+                    {\r
+                        LogReader(reader, appendText);\r
+                    }\r
+                }\r
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("UpdateTextFromThread(): Exception: \n" + exc);\r
+                windowTimer.Dispose();\r
+                errorService.ShowError("GetLog() Error", exc.ToString());\r
+            }\r
+\r
+            return appendText;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Reads the log data from a Scan or Encode object\r
+        /// </summary>\r
+        /// <param name="reader">\r
+        /// The reader.\r
+        /// </param>\r
+        /// <param name="appendText">\r
+        /// The append text.\r
+        /// </param>\r
+        private void LogReader(StringReader reader, StringBuilder appendText)\r
+        {\r
+            string line;\r
+            int i = 1;\r
+            while ((line = reader.ReadLine()) != null)\r
+            {\r
+                if (i > position)\r
+                {\r
+                    appendText.AppendLine(line);\r
+                    position++;\r
+                }\r
+                i++;\r
             }\r
         }\r
-        private void SetText(string text)\r
+\r
+        /// <summary>\r
+        /// Append text to the RTF box\r
+        /// </summary>\r
+        /// <param name="text">\r
+        /// The text.\r
+        /// </param>\r
+        private void AppendWindowText(StringBuilder text)\r
         {\r
             try\r
             {\r
@@ -149,144 +331,147 @@ namespace Handbrake
                 {\r
                     if (rtf_actLog.InvokeRequired)\r
                     {\r
-                        IAsyncResult invoked = BeginInvoke(new setTextCallback(SetText), new object[] { text });\r
+                        IAsyncResult invoked = BeginInvoke(new SetTextCallback(AppendWindowText), new object[] { text });\r
                         EndInvoke(invoked);\r
                     }\r
                     else\r
-                        rtf_actLog.AppendText(text);\r
+                        lock (rtf_actLog)\r
+                            rtf_actLog.AppendText(text.ToString());\r
+\r
+                    // Stop the refresh process if log has finished.\r
+                    if (text.ToString().Contains("HandBrake has Exited"))\r
+                    {\r
+                        windowTimer.Dispose();\r
+                    }\r
                 }\r
             }\r
-            catch (Exception exc)\r
+            catch (Exception)\r
             {\r
-                MessageBox.Show("SetText(): Exception: \n" + exc);\r
+                return;\r
             }\r
         }\r
-        private String ReadFile()\r
+\r
+        /// <summary>\r
+        /// Clear the contents of the log window\r
+        /// </summary>\r
+        private void ClearWindowText()\r
         {\r
-            String appendText = String.Empty;\r
             try\r
             {\r
-                // last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),\r
-                // we'll need to make a copy of it.\r
-                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
-                string logFile = Path.Combine(logDir, _readFile);\r
-                string logFile2 = Path.Combine(logDir, "tmp_appReadable_log.txt");\r
-\r
-                // Make sure the application readable log file does not already exist. FileCopy fill fail if it does.\r
-                if (File.Exists(logFile2))\r
-                    File.Delete(logFile2);\r
-\r
-                // Copy the log file.\r
-                if (File.Exists(logFile))\r
-                    File.Copy(logFile, logFile2, true);\r
-                else\r
-                {\r
-                    if (fileNotFoundQuickFix)\r
-                        return "";\r
-                    fileNotFoundQuickFix = true;\r
-                    return "\n\n\nERROR: The log file could not be found. \nMaybe you cleared your system's tempory folder or maybe you just havn't run an encode yet. \nTried to find the log file in: " + logFile;\r
-                }\r
-\r
-                StreamReader sr = new StreamReader(logFile2);\r
-                string line;\r
-                int i = 1;\r
-                while ((line = sr.ReadLine()) != null)\r
+                if (IsHandleCreated)\r
                 {\r
-                    if (i > _position)\r
+                    if (rtf_actLog.InvokeRequired)\r
                     {\r
-                        appendText += line + Environment.NewLine;\r
-                        _position++;\r
+                        IAsyncResult invoked = BeginInvoke(new SetTextClearCallback(ClearWindowText));\r
+                        EndInvoke(invoked);\r
                     }\r
-                    i++;\r
+                    else\r
+                        lock (rtf_actLog)\r
+                            rtf_actLog.Clear();\r
                 }\r
-                sr.Close();\r
-                sr.Dispose();\r
-\r
-                return appendText;\r
             }\r
-            catch (Exception exc)\r
+            catch (Exception)\r
             {\r
-                return "Error in ReadFile() \n Unable to read the log file.\n You may have to restart HandBrake. Will try reading the file again in a few seconds... \n  Error Information: \n\n" + exc;\r
+                return;\r
             }\r
         }\r
 \r
-        protected override void OnClosing(CancelEventArgs e)\r
+        /// <summary>\r
+        /// Reset Everything\r
+        /// </summary>\r
+        private void Reset()\r
         {\r
-            e.Cancel = true;\r
-            this.Hide();\r
-            base.OnClosing(e);\r
+            if (windowTimer != null)\r
+                windowTimer.Dispose();\r
+            position = 0;\r
+            ClearWindowText();\r
+            windowTimer = new Timer(new TimerCallback(LogMonitor), null, 1000, 1000);\r
         }\r
 \r
-        #region User Interface\r
-        private void mnu_copy_log_Click(object sender, EventArgs e)\r
+        /* Menus and Buttons */\r
+\r
+        /// <summary>\r
+        /// Copy log to clipboard\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuCopyLogClick(object sender, EventArgs e)\r
         {\r
-            if (rtf_actLog.SelectedText != "")\r
-                Clipboard.SetDataObject(rtf_actLog.SelectedText, true);\r
-            else\r
-                Clipboard.SetDataObject(rtf_actLog.Text, true);\r
+            Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
         }\r
-        private void mnu_openLogFolder_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Open the log folder\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuOpenLogFolderClick(object sender, EventArgs e)\r
         {\r
             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
-            System.Diagnostics.Process prc = new System.Diagnostics.Process();\r
-            prc.StartInfo.FileName = windir + @"\explorer.exe";\r
-            prc.StartInfo.Arguments = logDir;\r
+            Process prc = new Process\r
+                              {\r
+                                  StartInfo =\r
+                                      {\r
+                                          FileName = windir + @"\explorer.exe",\r
+                                          Arguments = logDir\r
+                                      }\r
+                              };\r
             prc.Start();\r
         }\r
-        private void btn_copy_Click(object sender, EventArgs e)\r
-        {\r
-            if (rtf_actLog.SelectedText != "")\r
-                Clipboard.SetDataObject(rtf_actLog.SelectedText, true);\r
-            else\r
-                Clipboard.SetDataObject(rtf_actLog.Text, true);\r
-        }\r
-        private void btn_scan_log_Click(object sender, EventArgs e)\r
-        {\r
-            SetLogView(true);\r
-        }\r
-        private void btn_encode_log_Click(object sender, EventArgs e)\r
-        {\r
-            SetLogView(false);\r
-        }\r
-        #endregion\r
 \r
-        #region System Information\r
         /// <summary>\r
-        /// Returns the total physical ram in a system\r
+        /// Copy the log\r
         /// </summary>\r
-        /// <returns></returns>\r
-        public uint TotalPhysicalMemory()\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnCopyClick(object sender, EventArgs e)\r
         {\r
-            Win32.MEMORYSTATUS memStatus = new Win32.MEMORYSTATUS();\r
-            Win32.GlobalMemoryStatus(ref memStatus);\r
-\r
-            uint MemoryInfo = memStatus.dwTotalPhys;\r
-            MemoryInfo = MemoryInfo / 1024 / 1024;\r
-\r
-            return MemoryInfo;\r
+            Clipboard.SetDataObject(rtf_actLog.SelectedText != string.Empty ? rtf_actLog.SelectedText : rtf_actLog.Text, true);\r
         }\r
 \r
         /// <summary>\r
-        /// Get the number of CPU Cores\r
+        /// Change the Log file in the viewer\r
         /// </summary>\r
-        /// <returns>Object</returns>\r
-        public Object getCpuCount()\r
+        /// <param name="sender">The Sender </param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void LogSelectorClick(object sender, EventArgs e)\r
         {\r
-            RegistryKey RegKey = Registry.LocalMachine;\r
-            RegKey = RegKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");\r
-            return RegKey.GetValue("ProcessorNameString");\r
+            this.SetMode((string)this.logSelector.SelectedItem == "Scan Log" ? ActivityLogMode.Scan : ActivityLogMode.Encode);\r
         }\r
 \r
+        /* Overrides */\r
+\r
         /// <summary>\r
-        /// Get the System screen size information.\r
+        /// override onclosing\r
         /// </summary>\r
-        /// <returns>System.Windows.Forms.Scree</returns>\r
-        public Screen screenBounds()\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        protected override void OnClosing(CancelEventArgs e)\r
         {\r
-            return Screen.PrimaryScreen;\r
-        }\r
-        #endregion\r
+            scan.ScanStared -= scan_ScanStared;\r
+            encode.EncodeStarted -= encode_EncodeStarted;\r
+\r
+            scan.ScanCompleted -= stopWindowRefresh;\r
+            encode.EncodeEnded -= stopWindowRefresh;\r
 \r
+            windowTimer.Dispose();\r
+            e.Cancel = true;\r
+            this.Dispose();\r
+            base.OnClosing(e);\r
+        }\r
     }\r
 }
\ No newline at end of file
index 833a519..ab607e8 100644 (file)
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
   <metadata name="rightClickMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>320, 17</value>\r
+    <value>205, 18</value>\r
   </metadata>\r
   <metadata name="ToolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>17, 17</value>\r
         tq1C9U1mNGd6qTvZTe2Jrry5kwNH7+z+zPf0mfZ76A/LmeTprDhiYwAAAABJRU5ErkJggg==\r
 </value>\r
   </data>\r
-  <metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>204, 17</value>\r
-  </metadata>\r
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
     <value>\r
         AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
index 8378390..5301221 100644 (file)
@@ -1,8 +1,8 @@
 ï»¿/*  AudioTrack.cs $\r
        \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -40,18 +40,17 @@ namespace Handbrake
             this.txt_preset_name = new System.Windows.Forms.TextBox();\r
             this.btn_add = new System.Windows.Forms.Button();\r
             this.btn_cancel = new System.Windows.Forms.Button();\r
-            this.check_pictureSettings = new System.Windows.Forms.CheckBox();\r
+            this.check_useFilters = new System.Windows.Forms.CheckBox();\r
             this.toolTip = new System.Windows.Forms.ToolTip(this.components);\r
-            this.label1 = new System.Windows.Forms.Label();\r
-            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
-            this.tableLayoutPanel1.SuspendLayout();\r
+            this.cb_usePictureSettings = new System.Windows.Forms.ComboBox();\r
+            this.label2 = new System.Windows.Forms.Label();\r
+            this.label3 = new System.Windows.Forms.Label();\r
             this.SuspendLayout();\r
             // \r
             // lbl_name\r
             // \r
-            this.lbl_name.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.lbl_name.AutoSize = true;\r
-            this.lbl_name.Location = new System.Drawing.Point(3, 7);\r
+            this.lbl_name.Location = new System.Drawing.Point(12, 18);\r
             this.lbl_name.Name = "lbl_name";\r
             this.lbl_name.Size = new System.Drawing.Size(75, 13);\r
             this.lbl_name.TabIndex = 1;\r
@@ -59,27 +58,24 @@ namespace Handbrake
             // \r
             // txt_preset_name\r
             // \r
-            this.txt_preset_name.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.tableLayoutPanel1.SetColumnSpan(this.txt_preset_name, 2);\r
-            this.txt_preset_name.Location = new System.Drawing.Point(84, 3);\r
+            this.txt_preset_name.Location = new System.Drawing.Point(130, 15);\r
             this.txt_preset_name.Name = "txt_preset_name";\r
-            this.txt_preset_name.Size = new System.Drawing.Size(208, 21);\r
+            this.txt_preset_name.Size = new System.Drawing.Size(172, 21);\r
             this.txt_preset_name.TabIndex = 0;\r
             // \r
             // btn_add\r
             // \r
-            this.btn_add.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
             this.btn_add.BackColor = System.Drawing.Color.Transparent;\r
             this.btn_add.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
             this.btn_add.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_add.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_add.Location = new System.Drawing.Point(172, 72);\r
+            this.btn_add.Location = new System.Drawing.Point(185, 133);\r
             this.btn_add.Name = "btn_add";\r
             this.btn_add.Size = new System.Drawing.Size(57, 22);\r
             this.btn_add.TabIndex = 2;\r
             this.btn_add.Text = "Add";\r
             this.btn_add.UseVisualStyleBackColor = false;\r
-            this.btn_add.Click += new System.EventHandler(this.btn_add_Click);\r
+            this.btn_add.Click += new System.EventHandler(this.BtnAddClick);\r
             // \r
             // btn_cancel\r
             // \r
@@ -87,63 +83,56 @@ namespace Handbrake
             this.btn_cancel.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
             this.btn_cancel.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_cancel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_cancel.Location = new System.Drawing.Point(235, 72);\r
+            this.btn_cancel.Location = new System.Drawing.Point(248, 133);\r
             this.btn_cancel.Name = "btn_cancel";\r
             this.btn_cancel.Size = new System.Drawing.Size(57, 22);\r
             this.btn_cancel.TabIndex = 3;\r
             this.btn_cancel.Text = "Cancel";\r
             this.btn_cancel.UseVisualStyleBackColor = false;\r
-            this.btn_cancel.Click += new System.EventHandler(this.btn_cancel_Click);\r
-            // \r
-            // check_pictureSettings\r
-            // \r
-            this.check_pictureSettings.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_pictureSettings.AutoSize = true;\r
-            this.tableLayoutPanel1.SetColumnSpan(this.check_pictureSettings, 2);\r
-            this.check_pictureSettings.Location = new System.Drawing.Point(84, 30);\r
-            this.check_pictureSettings.Name = "check_pictureSettings";\r
-            this.check_pictureSettings.Size = new System.Drawing.Size(132, 17);\r
-            this.check_pictureSettings.TabIndex = 1;\r
-            this.check_pictureSettings.Text = "Store Cropping Values";\r
-            this.toolTip.SetToolTip(this.check_pictureSettings, "Save Picture Width/Height and Crop Values");\r
-            this.check_pictureSettings.UseVisualStyleBackColor = true;\r
-            // \r
-            // label1\r
-            // \r
-            this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.label1.AutoSize = true;\r
-            this.tableLayoutPanel1.SetColumnSpan(this.label1, 2);\r
-            this.label1.Location = new System.Drawing.Point(84, 53);\r
-            this.label1.Margin = new System.Windows.Forms.Padding(3);\r
-            this.label1.Name = "label1";\r
-            this.label1.Size = new System.Drawing.Size(200, 13);\r
-            this.label1.TabIndex = 4;\r
-            this.label1.Text = "Note: Subtitles are not stored in presets";\r
-            // \r
-            // tableLayoutPanel1\r
-            // \r
-            this.tableLayoutPanel1.AutoSize = true;\r
-            this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.tableLayoutPanel1.ColumnCount = 3;\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_name, 0, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.btn_cancel, 2, 3);\r
-            this.tableLayoutPanel1.Controls.Add(this.label1, 1, 2);\r
-            this.tableLayoutPanel1.Controls.Add(this.btn_add, 1, 3);\r
-            this.tableLayoutPanel1.Controls.Add(this.txt_preset_name, 1, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.check_pictureSettings, 1, 1);\r
-            this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
-            this.tableLayoutPanel1.Location = new System.Drawing.Point(9, 9);\r
-            this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
-            this.tableLayoutPanel1.RowCount = 4;\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.Size = new System.Drawing.Size(295, 125);\r
-            this.tableLayoutPanel1.TabIndex = 5;\r
+            this.btn_cancel.Click += new System.EventHandler(this.BtnCancelClick);\r
+            // \r
+            // check_useFilters\r
+            // \r
+            this.check_useFilters.AutoSize = true;\r
+            this.check_useFilters.Location = new System.Drawing.Point(130, 106);\r
+            this.check_useFilters.Name = "check_useFilters";\r
+            this.check_useFilters.Size = new System.Drawing.Size(112, 17);\r
+            this.check_useFilters.TabIndex = 1;\r
+            this.check_useFilters.Text = "Use Picture Filters";\r
+            this.toolTip.SetToolTip(this.check_useFilters, "Save Picture Width/Height and Crop Values");\r
+            this.check_useFilters.UseVisualStyleBackColor = true;\r
+            // \r
+            // cb_usePictureSettings\r
+            // \r
+            this.cb_usePictureSettings.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.cb_usePictureSettings.FormattingEnabled = true;\r
+            this.cb_usePictureSettings.Items.AddRange(new object[] {\r
+            "None",\r
+            "Source Maximum"});\r
+            this.cb_usePictureSettings.Location = new System.Drawing.Point(130, 79);\r
+            this.cb_usePictureSettings.Name = "cb_usePictureSettings";\r
+            this.cb_usePictureSettings.Size = new System.Drawing.Size(172, 21);\r
+            this.cb_usePictureSettings.TabIndex = 6;\r
+            // \r
+            // label2\r
+            // \r
+            this.label2.AutoSize = true;\r
+            this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label2.Location = new System.Drawing.Point(12, 57);\r
+            this.label2.Name = "label2";\r
+            this.label2.Size = new System.Drawing.Size(100, 13);\r
+            this.label2.TabIndex = 7;\r
+            this.label2.Text = "Picture Settings:";\r
+            // \r
+            // label3\r
+            // \r
+            this.label3.AutoSize = true;\r
+            this.label3.Location = new System.Drawing.Point(12, 82);\r
+            this.label3.Margin = new System.Windows.Forms.Padding(3);\r
+            this.label3.Name = "label3";\r
+            this.label3.Size = new System.Drawing.Size(87, 13);\r
+            this.label3.TabIndex = 8;\r
+            this.label3.Text = "Use Picture Size:";\r
             // \r
             // frmAddPreset\r
             // \r
@@ -151,8 +140,15 @@ namespace Handbrake
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r
             this.AutoSize = true;\r
             this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.ClientSize = new System.Drawing.Size(313, 143);\r
-            this.Controls.Add(this.tableLayoutPanel1);\r
+            this.ClientSize = new System.Drawing.Size(319, 166);\r
+            this.Controls.Add(this.label3);\r
+            this.Controls.Add(this.label2);\r
+            this.Controls.Add(this.cb_usePictureSettings);\r
+            this.Controls.Add(this.lbl_name);\r
+            this.Controls.Add(this.txt_preset_name);\r
+            this.Controls.Add(this.check_useFilters);\r
+            this.Controls.Add(this.btn_cancel);\r
+            this.Controls.Add(this.btn_add);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
@@ -164,10 +160,8 @@ namespace Handbrake
             this.ShowInTaskbar = false;\r
             this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;\r
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
-            this.Text = "Add Preset";\r
+            this.Text = "Add New Preset";\r
             this.TopMost = true;\r
-            this.tableLayoutPanel1.ResumeLayout(false);\r
-            this.tableLayoutPanel1.PerformLayout();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -179,9 +173,10 @@ namespace Handbrake
         private System.Windows.Forms.TextBox txt_preset_name;\r
         internal System.Windows.Forms.Button btn_add;\r
         internal System.Windows.Forms.Button btn_cancel;\r
-        private System.Windows.Forms.CheckBox check_pictureSettings;\r
+        private System.Windows.Forms.CheckBox check_useFilters;\r
         private System.Windows.Forms.ToolTip toolTip;\r
-        private System.Windows.Forms.Label label1;\r
-        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+        private System.Windows.Forms.ComboBox cb_usePictureSettings;\r
+        private System.Windows.Forms.Label label2;\r
+        private System.Windows.Forms.Label label3;\r
     }\r
 }
\ No newline at end of file
index 8ffd763..208dd1c 100644 (file)
 ï»¿/*  frmAddPreset.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Drawing;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Windows.Forms;\r
+\r
+    using Handbrake.Functions;\r
+    using Handbrake.Model;\r
+\r
+    using Presets;\r
+\r
+    /// <summary>\r
+    /// The Add Preset Window\r
+    /// </summary>\r
     public partial class frmAddPreset : Form\r
     {\r
-        private readonly frmMain frmMainWindow;\r
-        readonly Presets.PresetsHandler presetCode;\r
-        private readonly string query = "";\r
+        private readonly frmMain mainWindow;\r
 \r
-        public frmAddPreset(frmMain fmw, string query_string, Presets.PresetsHandler presetHandler)\r
+        /// <summary>\r
+        /// The Preset Handler\r
+        /// </summary>\r
+        private readonly PresetsHandler presetCode;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmAddPreset"/> class.\r
+        /// </summary>\r
+        /// <param name="mainWindow">\r
+        /// The Main Window\r
+        /// </param>\r
+        /// <param name="presetHandler">\r
+        /// The preset handler.\r
+        /// </param>\r
+        public frmAddPreset(frmMain mainWindow, PresetsHandler presetHandler)\r
         {\r
             InitializeComponent();\r
-            frmMainWindow = fmw;\r
+            this.mainWindow = mainWindow;\r
             presetCode = presetHandler;\r
-            this.query = query_string;\r
+\r
+            cb_usePictureSettings.SelectedIndex = 0;\r
         }\r
 \r
-        private void btn_add_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Add button event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnAddClick(object sender, EventArgs e)\r
         {\r
-            Boolean pictureSettings = false;\r
-            if (check_pictureSettings.Checked)\r
-                pictureSettings = true;\r
+            if (string.IsNullOrEmpty(txt_preset_name.Text.Trim()))\r
+            {\r
+                MessageBox.Show("You must enter a preset name!", "Warning",\r
+                                MessageBoxButtons.OK, MessageBoxIcon.Warning);                \r
+                return;\r
+            }\r
+\r
+            QueryPictureSettingsMode pictureSettingsMode;\r
 \r
-            if (presetCode.Add(txt_preset_name.Text.Trim(), query, pictureSettings))\r
+            switch (cb_usePictureSettings.SelectedIndex)\r
             {\r
-                TreeNode preset_treeview = new TreeNode(txt_preset_name.Text.Trim()) { ForeColor = Color.Black };\r
-                frmMainWindow.treeView_presets.Nodes.Add(preset_treeview);\r
+                case 0:\r
+                    pictureSettingsMode = QueryPictureSettingsMode.None;\r
+                    break;\r
+                case 1:\r
+                    pictureSettingsMode = QueryPictureSettingsMode.SourceMaximum;\r
+                    break;\r
+                default:\r
+                    pictureSettingsMode = QueryPictureSettingsMode.None;\r
+                    break;\r
+            }\r
 \r
-                //frmMainWindow.loadPresetPanel();\r
-                this.Close();\r
-            } \r
-            else\r
+            string query = QueryGenerator.GenerateQueryForPreset(mainWindow, pictureSettingsMode, check_useFilters.Checked, 0, 0);\r
+\r
+            if (presetCode.Add(txt_preset_name.Text.Trim(), query, pictureSettingsMode != QueryPictureSettingsMode.None, string.Empty))\r
             {\r
-                MessageBox.Show("Sorry, that preset name already exists. Please choose another!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                this.DialogResult = DialogResult.OK;\r
+                this.Close();           \r
             }\r
+            else\r
+                MessageBox.Show("Sorry, that preset name already exists. Please choose another!", "Warning", \r
+                                MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
         }\r
 \r
-        private void btn_cancel_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Cancel button event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void BtnCancelClick(object sender, EventArgs e)\r
         {\r
+            this.DialogResult = DialogResult.Cancel;\r
             this.Close();\r
         }\r
-\r
     }\r
 }
\ No newline at end of file
index d1446b1..aa4f207 100644 (file)
@@ -1,8 +1,7 @@
 /*  frmMain.Designer.cs \r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 using System;\r
 using System.Windows.Forms;\r
@@ -60,6 +59,7 @@ namespace Handbrake
             this.name = new System.Windows.Forms.DataGridViewTextBoxColumn();\r
             this.ChaptersMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r
             this.mnu_resetChapters = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.btn_file_source = new System.Windows.Forms.ToolStripMenuItem();\r
             this.btn_addPreset = new System.Windows.Forms.Button();\r
             this.btn_removePreset = new System.Windows.Forms.Button();\r
             this.drop_format = new System.Windows.Forms.ComboBox();\r
@@ -67,6 +67,19 @@ namespace Handbrake
             this.drop_chapterStart = new System.Windows.Forms.ComboBox();\r
             this.drop_angle = new System.Windows.Forms.ComboBox();\r
             this.drp_dvdtitle = new System.Windows.Forms.ComboBox();\r
+            this.btn_importChapters = new System.Windows.Forms.Button();\r
+            this.btn_export = new System.Windows.Forms.Button();\r
+            this.drop_mode = new System.Windows.Forms.ComboBox();\r
+            this.btn_generate_Query = new System.Windows.Forms.Button();\r
+            this.treeView_presets = new System.Windows.Forms.TreeView();\r
+            this.presets_menu = new System.Windows.Forms.ContextMenuStrip(this.components);\r
+            this.pmnu_expandAll = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.pmnu_collapse = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.sep1 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.pmnu_import = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.pmnu_saveChanges = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.pmnu_delete = new System.Windows.Forms.ToolStripMenuItem();\r
             this.DVD_Open = new System.Windows.Forms.FolderBrowserDialog();\r
             this.File_Open = new System.Windows.Forms.OpenFileDialog();\r
             this.ISO_Open = new System.Windows.Forms.OpenFileDialog();\r
@@ -85,11 +98,10 @@ namespace Handbrake
             this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();\r
             this.btn_new_preset = new System.Windows.Forms.ToolStripMenuItem();\r
             this.mnu_importMacPreset = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.mnu_exportMacPreset = new System.Windows.Forms.ToolStripMenuItem();\r
             this.mnu_SelectDefault = new System.Windows.Forms.ToolStripMenuItem();\r
             this.HelpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.mnu_user_guide = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.mnu_handbrake_home = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.mnu_handbrake_forums = new System.Windows.Forms.ToolStripMenuItem();\r
             this.ToolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r
             this.mnu_UpdateCheck = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();\r
@@ -102,14 +114,16 @@ namespace Handbrake
             this.AudioSettings = new Handbrake.Controls.AudioPanel();\r
             this.AudioMenuRowHeightHack = new System.Windows.Forms.ImageList(this.components);\r
             this.tab_video = new System.Windows.Forms.TabPage();\r
+            this.lbl_rfwarn = new System.Windows.Forms.Label();\r
+            this.checkMaximumFramerate = new System.Windows.Forms.CheckBox();\r
             this.radio_cq = new System.Windows.Forms.RadioButton();\r
             this.radio_avgBitrate = new System.Windows.Forms.RadioButton();\r
             this.radio_targetFilesize = new System.Windows.Forms.RadioButton();\r
             this.label25 = new System.Windows.Forms.Label();\r
             this.check_2PassEncode = new System.Windows.Forms.CheckBox();\r
             this.Label2 = new System.Windows.Forms.Label();\r
-            this.SliderValue = new System.Windows.Forms.Label();\r
-            this.Label46 = new System.Windows.Forms.Label();\r
+            this.lbl_SliderValue = new System.Windows.Forms.Label();\r
+            this.lbl_framerate = new System.Windows.Forms.Label();\r
             this.tab_picture = new System.Windows.Forms.TabPage();\r
             this.PictureSettings = new Handbrake.Controls.PictureSettings();\r
             this.Check_ChapterMarkers = new System.Windows.Forms.CheckBox();\r
@@ -119,33 +133,23 @@ namespace Handbrake
             this.tab_subtitles = new System.Windows.Forms.TabPage();\r
             this.Subtitles = new Handbrake.Controls.Subtitles();\r
             this.tab_chapters = new System.Windows.Forms.TabPage();\r
-            this.btn_importChapters = new System.Windows.Forms.Button();\r
             this.label31 = new System.Windows.Forms.Label();\r
             this.tab_advanced = new System.Windows.Forms.TabPage();\r
             this.x264Panel = new Handbrake.Controls.x264Panel();\r
             this.tab_query = new System.Windows.Forms.TabPage();\r
             this.btn_clear = new System.Windows.Forms.Button();\r
             this.label34 = new System.Windows.Forms.Label();\r
-            this.btn_generate_Query = new System.Windows.Forms.Button();\r
             this.label33 = new System.Windows.Forms.Label();\r
             this.rtf_query = new System.Windows.Forms.RichTextBox();\r
             this.groupBox2 = new System.Windows.Forms.GroupBox();\r
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
-            this.treeView_presets = new System.Windows.Forms.TreeView();\r
-            this.presets_menu = new System.Windows.Forms.ContextMenuStrip(this.components);\r
-            this.pmnu_expandAll = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.pmnu_collapse = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.sep1 = new System.Windows.Forms.ToolStripSeparator();\r
-            this.pmnu_import = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r
-            this.pmnu_saveChanges = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.pmnu_delete = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStrip1 = new System.Windows.Forms.ToolStrip();\r
             this.btn_source = new System.Windows.Forms.ToolStripDropDownButton();\r
-            this.btn_file_source = new System.Windows.Forms.ToolStripMenuItem();\r
             this.btn_dvd_source = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.btnTitleSpecific = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.FileTitleSpecificScan = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.FolderTitleSpecificScan = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r
-            this.mnu_dvd_drive = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();\r
             this.btn_start = new System.Windows.Forms.ToolStripButton();\r
             this.btn_add2Queue = new System.Windows.Forms.ToolStripButton();\r
@@ -155,6 +159,7 @@ namespace Handbrake
             this.btn_ActivityWindow = new System.Windows.Forms.ToolStripButton();\r
             this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);\r
             this.StatusStrip = new System.Windows.Forms.StatusStrip();\r
+            this.ProgressBarStatus = new System.Windows.Forms.ToolStripProgressBar();\r
             this.lbl_encode = new System.Windows.Forms.ToolStripStatusLabel();\r
             this.lbl_updateCheck = new System.Windows.Forms.ToolStripStatusLabel();\r
             this.hbproc = new System.Diagnostics.Process();\r
@@ -165,7 +170,6 @@ namespace Handbrake
             this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
             this.Label10 = new System.Windows.Forms.Label();\r
             this.lbl_angle = new System.Windows.Forms.Label();\r
-            this.Label9 = new System.Windows.Forms.Label();\r
             this.Label13 = new System.Windows.Forms.Label();\r
             this.label_duration = new System.Windows.Forms.Label();\r
             this.lbl_duration = new System.Windows.Forms.Label();\r
@@ -173,7 +177,7 @@ namespace Handbrake
             this.labelPreset = new System.Windows.Forms.Label();\r
             this.labelSource = new System.Windows.Forms.Label();\r
             this.labelStaticSource = new System.Windows.Forms.Label();\r
-            this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();\r
+            this.SourceLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();\r
             this.openPreset = new System.Windows.Forms.OpenFileDialog();\r
             this.File_ChapterImport = new System.Windows.Forms.OpenFileDialog();\r
             notifyIconMenu = new System.Windows.Forms.ContextMenuStrip(this.components);\r
@@ -181,6 +185,7 @@ namespace Handbrake
             ((System.ComponentModel.ISupportInitialize)(this.slider_videoQuality)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.data_chpt)).BeginInit();\r
             this.ChaptersMenu.SuspendLayout();\r
+            this.presets_menu.SuspendLayout();\r
             this.frmMainMenu.SuspendLayout();\r
             this.tab_audio.SuspendLayout();\r
             this.tab_video.SuspendLayout();\r
@@ -195,13 +200,12 @@ namespace Handbrake
             this.splitContainer1.Panel1.SuspendLayout();\r
             this.splitContainer1.Panel2.SuspendLayout();\r
             this.splitContainer1.SuspendLayout();\r
-            this.presets_menu.SuspendLayout();\r
             this.toolStrip1.SuspendLayout();\r
             this.StatusStrip.SuspendLayout();\r
             this.tableLayoutPanel2.SuspendLayout();\r
             this.tableLayoutPanel3.SuspendLayout();\r
             this.tableLayoutPanel1.SuspendLayout();\r
-            this.flowLayoutPanel1.SuspendLayout();\r
+            this.SourceLayoutPanel.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // notifyIconMenu\r
@@ -210,12 +214,13 @@ namespace Handbrake
             this.btn_restore});\r
             notifyIconMenu.Name = "notifyIconMenu";\r
             notifyIconMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
-            notifyIconMenu.Size = new System.Drawing.Size(124, 26);\r
+            notifyIconMenu.Size = new System.Drawing.Size(114, 26);\r
             // \r
             // btn_restore\r
             // \r
+            this.btn_restore.Image = global::Handbrake.Properties.Resources.Restore;\r
             this.btn_restore.Name = "btn_restore";\r
-            this.btn_restore.Size = new System.Drawing.Size(123, 22);\r
+            this.btn_restore.Size = new System.Drawing.Size(113, 22);\r
             this.btn_restore.Text = "Restore";\r
             this.btn_restore.Click += new System.EventHandler(this.btn_restore_Click);\r
             // \r
@@ -276,9 +281,9 @@ namespace Handbrake
             this.check_turbo.AutoSize = true;\r
             this.check_turbo.BackColor = System.Drawing.Color.Transparent;\r
             this.check_turbo.Enabled = false;\r
-            this.check_turbo.Location = new System.Drawing.Point(146, 123);\r
+            this.check_turbo.Location = new System.Drawing.Point(146, 143);\r
             this.check_turbo.Name = "check_turbo";\r
-            this.check_turbo.Size = new System.Drawing.Size(101, 17);\r
+            this.check_turbo.Size = new System.Drawing.Size(99, 17);\r
             this.check_turbo.TabIndex = 7;\r
             this.check_turbo.Text = "Turbo first Pass";\r
             this.ToolTip.SetToolTip(this.check_turbo, "Makes the first pass of a 2 pass encode faster.");\r
@@ -298,30 +303,31 @@ namespace Handbrake
             "24",\r
             "25",\r
             "29.97"});\r
-            this.drp_videoFramerate.Location = new System.Drawing.Point(125, 68);\r
+            this.drp_videoFramerate.Location = new System.Drawing.Point(125, 62);\r
             this.drp_videoFramerate.Name = "drp_videoFramerate";\r
-            this.drp_videoFramerate.Size = new System.Drawing.Size(126, 21);\r
+            this.drp_videoFramerate.Size = new System.Drawing.Size(125, 21);\r
             this.drp_videoFramerate.TabIndex = 2;\r
             this.ToolTip.SetToolTip(this.drp_videoFramerate, "Can be left to \"Same as source\" in most cases.");\r
+            this.drp_videoFramerate.SelectedIndexChanged += new System.EventHandler(this.drp_videoFramerate_SelectedIndexChanged);\r
             // \r
             // slider_videoQuality\r
             // \r
+            this.slider_videoQuality.BackColor = System.Drawing.SystemColors.Window;\r
             this.slider_videoQuality.Enabled = false;\r
-            this.slider_videoQuality.Location = new System.Drawing.Point(347, 120);\r
+            this.slider_videoQuality.Location = new System.Drawing.Point(376, 120);\r
             this.slider_videoQuality.Margin = new System.Windows.Forms.Padding(0);\r
             this.slider_videoQuality.Maximum = 100;\r
             this.slider_videoQuality.Name = "slider_videoQuality";\r
             this.slider_videoQuality.Size = new System.Drawing.Size(322, 45);\r
             this.slider_videoQuality.TabIndex = 14;\r
             this.slider_videoQuality.TickFrequency = 17;\r
-            this.ToolTip.SetToolTip(this.slider_videoQuality, "Set the quality level of the video. Typical sane values are between 59~63%. \r\n>70" +\r
-                    "% will likely result in the output file being larger than the input file.");\r
+            this.ToolTip.SetToolTip(this.slider_videoQuality, "Set the quality level of the video. ");\r
             this.slider_videoQuality.ValueChanged += new System.EventHandler(this.slider_videoQuality_Scroll);\r
             // \r
             // text_filesize\r
             // \r
             this.text_filesize.Enabled = false;\r
-            this.text_filesize.Location = new System.Drawing.Point(482, 36);\r
+            this.text_filesize.Location = new System.Drawing.Point(511, 36);\r
             this.text_filesize.Name = "text_filesize";\r
             this.text_filesize.Size = new System.Drawing.Size(81, 21);\r
             this.text_filesize.TabIndex = 12;\r
@@ -329,7 +335,7 @@ namespace Handbrake
             // \r
             // text_bitrate\r
             // \r
-            this.text_bitrate.Location = new System.Drawing.Point(482, 63);\r
+            this.text_bitrate.Location = new System.Drawing.Point(511, 63);\r
             this.text_bitrate.Name = "text_bitrate";\r
             this.text_bitrate.Size = new System.Drawing.Size(81, 21);\r
             this.text_bitrate.TabIndex = 10;\r
@@ -346,8 +352,7 @@ namespace Handbrake
             this.btn_setDefault.TabIndex = 1;\r
             this.btn_setDefault.TabStop = false;\r
             this.btn_setDefault.Text = "Set Default";\r
-            this.ToolTip.SetToolTip(this.btn_setDefault, "Set current settings as program defaults.\r\nRequires option to be enabled in Tools" +\r
-                    " > Options");\r
+            this.ToolTip.SetToolTip(this.btn_setDefault, "Set current settings as program defaults.");\r
             this.btn_setDefault.UseVisualStyleBackColor = true;\r
             this.btn_setDefault.Click += new System.EventHandler(this.btn_setDefault_Click);\r
             // \r
@@ -385,7 +390,9 @@ namespace Handbrake
             this.data_chpt.AllowUserToAddRows = false;\r
             this.data_chpt.AllowUserToDeleteRows = false;\r
             this.data_chpt.AllowUserToResizeRows = false;\r
-            this.data_chpt.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;\r
+            this.data_chpt.BackgroundColor = System.Drawing.Color.White;\r
+            this.data_chpt.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None;\r
+            this.data_chpt.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;\r
             this.data_chpt.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {\r
             this.number,\r
             this.name});\r
@@ -408,29 +415,41 @@ namespace Handbrake
             this.number.MaxInputLength = 3;\r
             this.number.Name = "number";\r
             this.number.Resizable = System.Windows.Forms.DataGridViewTriState.False;\r
+            this.number.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
             this.number.Width = 165;\r
             // \r
             // name\r
             // \r
+            this.name.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;\r
             this.name.HeaderText = "Chapter Name";\r
             this.name.Name = "name";\r
-            this.name.Width = 480;\r
+            this.name.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;\r
             // \r
             // ChaptersMenu\r
             // \r
             this.ChaptersMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.mnu_resetChapters});\r
             this.ChaptersMenu.Name = "presets_menu";\r
-            this.ChaptersMenu.Size = new System.Drawing.Size(191, 26);\r
+            this.ChaptersMenu.OwnerItem = this.btn_file_source;\r
+            this.ChaptersMenu.Size = new System.Drawing.Size(188, 26);\r
             this.ChaptersMenu.Text = ";";\r
             // \r
             // mnu_resetChapters\r
             // \r
             this.mnu_resetChapters.Name = "mnu_resetChapters";\r
-            this.mnu_resetChapters.Size = new System.Drawing.Size(190, 22);\r
+            this.mnu_resetChapters.Size = new System.Drawing.Size(187, 22);\r
             this.mnu_resetChapters.Text = "Reset Chapter Names";\r
             this.mnu_resetChapters.Click += new System.EventHandler(this.mnu_resetChapters_Click);\r
             // \r
+            // btn_file_source\r
+            // \r
+            this.btn_file_source.Image = global::Handbrake.Properties.Resources.Movies_Small;\r
+            this.btn_file_source.Name = "btn_file_source";\r
+            this.btn_file_source.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));\r
+            this.btn_file_source.Size = new System.Drawing.Size(182, 22);\r
+            this.btn_file_source.Text = "Video File";\r
+            this.btn_file_source.Click += new System.EventHandler(this.BtnFileScanClicked);\r
+            // \r
             // btn_addPreset\r
             // \r
             this.btn_addPreset.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
@@ -442,7 +461,7 @@ namespace Handbrake
             this.btn_addPreset.TabIndex = 3;\r
             this.btn_addPreset.TabStop = false;\r
             this.btn_addPreset.Text = "Add";\r
-            this.ToolTip.SetToolTip(this.btn_addPreset, "Add a preset to the preset panel");\r
+            this.ToolTip.SetToolTip(this.btn_addPreset, "This option will take the current settings and add it as a new preset.");\r
             this.btn_addPreset.UseVisualStyleBackColor = true;\r
             this.btn_addPreset.Click += new System.EventHandler(this.btn_addPreset_Click);\r
             // \r
@@ -457,7 +476,7 @@ namespace Handbrake
             this.btn_removePreset.TabIndex = 4;\r
             this.btn_removePreset.TabStop = false;\r
             this.btn_removePreset.Text = "Remove";\r
-            this.ToolTip.SetToolTip(this.btn_removePreset, "Remove a preset from the panel above.");\r
+            this.ToolTip.SetToolTip(this.btn_removePreset, "Remove the selected preset from the panel above.");\r
             this.btn_removePreset.UseVisualStyleBackColor = true;\r
             this.btn_removePreset.Click += new System.EventHandler(this.btn_removePreset_Click);\r
             // \r
@@ -472,14 +491,14 @@ namespace Handbrake
             this.drop_format.Name = "drop_format";\r
             this.drop_format.Size = new System.Drawing.Size(106, 21);\r
             this.drop_format.TabIndex = 28;\r
-            this.ToolTip.SetToolTip(this.drop_format, "Select the file container format.");\r
+            this.ToolTip.SetToolTip(this.drop_format, "Select the file container format.\r\nHandBrake supports MKV and MP4(M4v)");\r
             this.drop_format.SelectedIndexChanged += new System.EventHandler(this.drop_format_SelectedIndexChanged);\r
             // \r
             // drop_chapterFinish\r
             // \r
             this.drop_chapterFinish.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_chapterFinish.FormattingEnabled = true;\r
-            this.drop_chapterFinish.Location = new System.Drawing.Point(447, 3);\r
+            this.drop_chapterFinish.Location = new System.Drawing.Point(509, 3);\r
             this.drop_chapterFinish.Name = "drop_chapterFinish";\r
             this.drop_chapterFinish.Size = new System.Drawing.Size(69, 21);\r
             this.drop_chapterFinish.TabIndex = 10;\r
@@ -490,7 +509,7 @@ namespace Handbrake
             // \r
             this.drop_chapterStart.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_chapterStart.FormattingEnabled = true;\r
-            this.drop_chapterStart.Location = new System.Drawing.Point(321, 3);\r
+            this.drop_chapterStart.Location = new System.Drawing.Point(383, 3);\r
             this.drop_chapterStart.Name = "drop_chapterStart";\r
             this.drop_chapterStart.Size = new System.Drawing.Size(69, 21);\r
             this.drop_chapterStart.TabIndex = 9;\r
@@ -517,11 +536,150 @@ namespace Handbrake
             this.drp_dvdtitle.Name = "drp_dvdtitle";\r
             this.drp_dvdtitle.Size = new System.Drawing.Size(119, 21);\r
             this.drp_dvdtitle.TabIndex = 7;\r
-            this.ToolTip.SetToolTip(this.drp_dvdtitle, "Select the title you wish to encode.\r\nThe longest title is selected by default af" +\r
-                    "ter you have scanned a source.");\r
+            this.ToolTip.SetToolTip(this.drp_dvdtitle, "Select the title you wish to encode.\r\n\r\nWhen a DVD is in use, HandBrake will try " +\r
+                    "to determine the \"Main Feature\" title automatically.\r\nPlease note, this is not a" +\r
+                    "lways accurate and should be checked.");\r
             this.drp_dvdtitle.SelectedIndexChanged += new System.EventHandler(this.drp_dvdtitle_SelectedIndexChanged);\r
             this.drp_dvdtitle.Click += new System.EventHandler(this.drp_dvdtitle_Click);\r
             // \r
+            // btn_importChapters\r
+            // \r
+            this.btn_importChapters.AutoSize = true;\r
+            this.btn_importChapters.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_importChapters.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_importChapters.Location = new System.Drawing.Point(544, 28);\r
+            this.btn_importChapters.Name = "btn_importChapters";\r
+            this.btn_importChapters.Size = new System.Drawing.Size(75, 23);\r
+            this.btn_importChapters.TabIndex = 14;\r
+            this.btn_importChapters.Text = "Import";\r
+            this.ToolTip.SetToolTip(this.btn_importChapters, resources.GetString("btn_importChapters.ToolTip"));\r
+            this.btn_importChapters.UseVisualStyleBackColor = true;\r
+            this.btn_importChapters.Click += new System.EventHandler(this.btn_importChapters_Click);\r
+            // \r
+            // btn_export\r
+            // \r
+            this.btn_export.AutoSize = true;\r
+            this.btn_export.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_export.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_export.Location = new System.Drawing.Point(625, 28);\r
+            this.btn_export.Name = "btn_export";\r
+            this.btn_export.Size = new System.Drawing.Size(75, 23);\r
+            this.btn_export.TabIndex = 15;\r
+            this.btn_export.Text = "Export";\r
+            this.ToolTip.SetToolTip(this.btn_export, resources.GetString("btn_export.ToolTip"));\r
+            this.btn_export.UseVisualStyleBackColor = true;\r
+            this.btn_export.Click += new System.EventHandler(this.btn_export_Click);\r
+            // \r
+            // drop_mode\r
+            // \r
+            this.drop_mode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.drop_mode.FormattingEnabled = true;\r
+            this.drop_mode.Items.AddRange(new object[] {\r
+            "Chapters",\r
+            "Seconds",\r
+            "Frames"});\r
+            this.drop_mode.Location = new System.Drawing.Point(295, 3);\r
+            this.drop_mode.Name = "drop_mode";\r
+            this.drop_mode.Size = new System.Drawing.Size(77, 21);\r
+            this.drop_mode.TabIndex = 46;\r
+            this.ToolTip.SetToolTip(this.drop_mode, resources.GetString("drop_mode.ToolTip"));\r
+            this.drop_mode.SelectedIndexChanged += new System.EventHandler(this.drop_mode_SelectedIndexChanged);\r
+            // \r
+            // btn_generate_Query\r
+            // \r
+            this.btn_generate_Query.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_generate_Query.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_generate_Query.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_generate_Query.Location = new System.Drawing.Point(16, 104);\r
+            this.btn_generate_Query.Name = "btn_generate_Query";\r
+            this.btn_generate_Query.Size = new System.Drawing.Size(126, 22);\r
+            this.btn_generate_Query.TabIndex = 2;\r
+            this.btn_generate_Query.Text = "Generate Query";\r
+            this.ToolTip.SetToolTip(this.btn_generate_Query, "This will allow you to override the generated query.\r\nNote, The query in the box " +\r
+                    "below will always override any automatically generated query, even if you change" +\r
+                    " title or source.");\r
+            this.btn_generate_Query.UseVisualStyleBackColor = true;\r
+            this.btn_generate_Query.Click += new System.EventHandler(this.btn_generate_Query_Click);\r
+            // \r
+            // treeView_presets\r
+            // \r
+            this.treeView_presets.ContextMenuStrip = this.presets_menu;\r
+            this.treeView_presets.Dock = System.Windows.Forms.DockStyle.Fill;\r
+            this.treeView_presets.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.treeView_presets.ForeColor = System.Drawing.Color.DarkBlue;\r
+            this.treeView_presets.FullRowSelect = true;\r
+            this.treeView_presets.HideSelection = false;\r
+            this.treeView_presets.ItemHeight = 21;\r
+            this.treeView_presets.Location = new System.Drawing.Point(0, 0);\r
+            this.treeView_presets.Name = "treeView_presets";\r
+            this.treeView_presets.ShowLines = false;\r
+            this.treeView_presets.Size = new System.Drawing.Size(240, 424);\r
+            this.treeView_presets.TabIndex = 0;\r
+            this.treeView_presets.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_presets_AfterSelect);\r
+            this.treeView_presets.KeyUp += new System.Windows.Forms.KeyEventHandler(this.treeView_presets_deleteKey);\r
+            this.treeView_presets.MouseMove += new System.Windows.Forms.MouseEventHandler(this.TreeViewPresetsMouseMove);\r
+            this.treeView_presets.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeview_presets_mouseUp);\r
+            // \r
+            // presets_menu\r
+            // \r
+            this.presets_menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.pmnu_expandAll,\r
+            this.pmnu_collapse,\r
+            this.sep1,\r
+            this.pmnu_import,\r
+            this.toolStripSeparator2,\r
+            this.pmnu_saveChanges,\r
+            this.pmnu_delete});\r
+            this.presets_menu.Name = "presets_menu";\r
+            this.presets_menu.Size = new System.Drawing.Size(148, 126);\r
+            this.presets_menu.Text = ";";\r
+            this.presets_menu.Opening += new System.ComponentModel.CancelEventHandler(this.presets_menu_Opening);\r
+            // \r
+            // pmnu_expandAll\r
+            // \r
+            this.pmnu_expandAll.Name = "pmnu_expandAll";\r
+            this.pmnu_expandAll.Size = new System.Drawing.Size(147, 22);\r
+            this.pmnu_expandAll.Text = "Expand All";\r
+            this.pmnu_expandAll.Click += new System.EventHandler(this.pmnu_expandAll_Click);\r
+            // \r
+            // pmnu_collapse\r
+            // \r
+            this.pmnu_collapse.Name = "pmnu_collapse";\r
+            this.pmnu_collapse.Size = new System.Drawing.Size(147, 22);\r
+            this.pmnu_collapse.Text = "Collapse All";\r
+            this.pmnu_collapse.Click += new System.EventHandler(this.pmnu_collapse_Click);\r
+            // \r
+            // sep1\r
+            // \r
+            this.sep1.Name = "sep1";\r
+            this.sep1.Size = new System.Drawing.Size(144, 6);\r
+            // \r
+            // pmnu_import\r
+            // \r
+            this.pmnu_import.Name = "pmnu_import";\r
+            this.pmnu_import.Size = new System.Drawing.Size(147, 22);\r
+            this.pmnu_import.Text = "Import";\r
+            this.pmnu_import.Click += new System.EventHandler(this.pmnu_import_Click);\r
+            // \r
+            // toolStripSeparator2\r
+            // \r
+            this.toolStripSeparator2.Name = "toolStripSeparator2";\r
+            this.toolStripSeparator2.Size = new System.Drawing.Size(144, 6);\r
+            // \r
+            // pmnu_saveChanges\r
+            // \r
+            this.pmnu_saveChanges.Name = "pmnu_saveChanges";\r
+            this.pmnu_saveChanges.Size = new System.Drawing.Size(147, 22);\r
+            this.pmnu_saveChanges.Text = "Save Changes";\r
+            this.pmnu_saveChanges.Click += new System.EventHandler(this.pmnu_saveChanges_Click);\r
+            // \r
+            // pmnu_delete\r
+            // \r
+            this.pmnu_delete.Name = "pmnu_delete";\r
+            this.pmnu_delete.Size = new System.Drawing.Size(147, 22);\r
+            this.pmnu_delete.Text = "Delete";\r
+            this.pmnu_delete.Click += new System.EventHandler(this.pmnu_delete_click);\r
+            // \r
             // DVD_Open\r
             // \r
             this.DVD_Open.Description = "Select the \"VIDEO_TS\" folder from your DVD Drive.";\r
@@ -544,13 +702,13 @@ namespace Handbrake
             this.mnu_killCLI,\r
             this.mnu_exit});\r
             this.FileToolStripMenuItem.Name = "FileToolStripMenuItem";\r
-            this.FileToolStripMenuItem.Size = new System.Drawing.Size(35, 20);\r
+            this.FileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);\r
             this.FileToolStripMenuItem.Text = "&File";\r
             // \r
             // mnu_killCLI\r
             // \r
             this.mnu_killCLI.Name = "mnu_killCLI";\r
-            this.mnu_killCLI.Size = new System.Drawing.Size(143, 22);\r
+            this.mnu_killCLI.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_killCLI.Text = "Cancel Scan";\r
             this.mnu_killCLI.Visible = false;\r
             this.mnu_killCLI.Click += new System.EventHandler(this.mnu_killCLI_Click);\r
@@ -558,7 +716,8 @@ namespace Handbrake
             // mnu_exit\r
             // \r
             this.mnu_exit.Name = "mnu_exit";\r
-            this.mnu_exit.Size = new System.Drawing.Size(143, 22);\r
+            this.mnu_exit.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4)));\r
+            this.mnu_exit.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_exit.Text = "E&xit";\r
             this.mnu_exit.Click += new System.EventHandler(this.mnu_exit_Click);\r
             // \r
@@ -575,7 +734,7 @@ namespace Handbrake
             this.ToolStripSeparator5,\r
             this.mnu_options});\r
             this.ToolsToolStripMenuItem.Name = "ToolsToolStripMenuItem";\r
-            this.ToolsToolStripMenuItem.Size = new System.Drawing.Size(44, 20);\r
+            this.ToolsToolStripMenuItem.Size = new System.Drawing.Size(48, 20);\r
             this.ToolsToolStripMenuItem.Text = "&Tools";\r
             // \r
             // mnu_encode\r
@@ -583,7 +742,7 @@ namespace Handbrake
             this.mnu_encode.Image = global::Handbrake.Properties.Resources.Queue_Small;\r
             this.mnu_encode.Name = "mnu_encode";\r
             this.mnu_encode.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q)));\r
-            this.mnu_encode.Size = new System.Drawing.Size(186, 22);\r
+            this.mnu_encode.Size = new System.Drawing.Size(201, 22);\r
             this.mnu_encode.Text = "Show Queue";\r
             this.mnu_encode.Click += new System.EventHandler(this.mnu_encode_Click);\r
             // \r
@@ -591,20 +750,21 @@ namespace Handbrake
             // \r
             this.mnu_encodeLog.Image = global::Handbrake.Properties.Resources.ActivityWindow_small;\r
             this.mnu_encodeLog.Name = "mnu_encodeLog";\r
-            this.mnu_encodeLog.Size = new System.Drawing.Size(186, 22);\r
+            this.mnu_encodeLog.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L)));\r
+            this.mnu_encodeLog.Size = new System.Drawing.Size(201, 22);\r
             this.mnu_encodeLog.Text = "Activity Window";\r
             this.mnu_encodeLog.Click += new System.EventHandler(this.mnu_encodeLog_Click);\r
             // \r
             // ToolStripSeparator5\r
             // \r
             this.ToolStripSeparator5.Name = "ToolStripSeparator5";\r
-            this.ToolStripSeparator5.Size = new System.Drawing.Size(183, 6);\r
+            this.ToolStripSeparator5.Size = new System.Drawing.Size(198, 6);\r
             // \r
             // mnu_options\r
             // \r
             this.mnu_options.Image = global::Handbrake.Properties.Resources.Pref_Small;\r
             this.mnu_options.Name = "mnu_options";\r
-            this.mnu_options.Size = new System.Drawing.Size(186, 22);\r
+            this.mnu_options.Size = new System.Drawing.Size(201, 22);\r
             this.mnu_options.Text = "Options";\r
             this.mnu_options.Click += new System.EventHandler(this.mnu_options_Click);\r
             // \r
@@ -616,9 +776,10 @@ namespace Handbrake
             this.toolStripSeparator7,\r
             this.btn_new_preset,\r
             this.mnu_importMacPreset,\r
+            this.mnu_exportMacPreset,\r
             this.mnu_SelectDefault});\r
             this.PresetsToolStripMenuItem.Name = "PresetsToolStripMenuItem";\r
-            this.PresetsToolStripMenuItem.Size = new System.Drawing.Size(55, 20);\r
+            this.PresetsToolStripMenuItem.Size = new System.Drawing.Size(56, 20);\r
             this.PresetsToolStripMenuItem.Text = "&Presets";\r
             // \r
             // mnu_presetReset\r
@@ -645,7 +806,7 @@ namespace Handbrake
             // \r
             this.btn_new_preset.Name = "btn_new_preset";\r
             this.btn_new_preset.Size = new System.Drawing.Size(194, 22);\r
-            this.btn_new_preset.Text = "New Preset";\r
+            this.btn_new_preset.Text = "Save Preset";\r
             this.btn_new_preset.Click += new System.EventHandler(this.btn_new_preset_Click);\r
             // \r
             // mnu_importMacPreset\r
@@ -653,8 +814,19 @@ namespace Handbrake
             this.mnu_importMacPreset.Name = "mnu_importMacPreset";\r
             this.mnu_importMacPreset.Size = new System.Drawing.Size(194, 22);\r
             this.mnu_importMacPreset.Text = "Import";\r
+            this.mnu_importMacPreset.ToolTipText = "Import a (plist - mac format) preset.\r\nYou can import plist presets from the Mac," +\r
+                " Linux and Windows GUI\'s";\r
             this.mnu_importMacPreset.Click += new System.EventHandler(this.mnu_importMacPreset_Click);\r
             // \r
+            // mnu_exportMacPreset\r
+            // \r
+            this.mnu_exportMacPreset.Name = "mnu_exportMacPreset";\r
+            this.mnu_exportMacPreset.Size = new System.Drawing.Size(194, 22);\r
+            this.mnu_exportMacPreset.Text = "Export (Experimental)";\r
+            this.mnu_exportMacPreset.ToolTipText = "Export a (plist - mac format) preset.\r\nThis can be imported by Mac, Linux or Wind" +\r
+                "ows GUI\'s";\r
+            this.mnu_exportMacPreset.Click += new System.EventHandler(this.mnu_exportMacPreset_Click);\r
+            // \r
             // mnu_SelectDefault\r
             // \r
             this.mnu_SelectDefault.Name = "mnu_SelectDefault";\r
@@ -667,14 +839,12 @@ namespace Handbrake
             // \r
             this.HelpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.mnu_user_guide,\r
-            this.mnu_handbrake_home,\r
-            this.mnu_handbrake_forums,\r
             this.ToolStripSeparator3,\r
             this.mnu_UpdateCheck,\r
             this.toolStripSeparator6,\r
             this.mnu_about});\r
             this.HelpToolStripMenuItem.Name = "HelpToolStripMenuItem";\r
-            this.HelpToolStripMenuItem.Size = new System.Drawing.Size(40, 20);\r
+            this.HelpToolStripMenuItem.Size = new System.Drawing.Size(44, 20);\r
             this.HelpToolStripMenuItem.Text = "&Help";\r
             // \r
             // mnu_user_guide\r
@@ -685,21 +855,6 @@ namespace Handbrake
             this.mnu_user_guide.Text = "HandBrake User Guide";\r
             this.mnu_user_guide.Click += new System.EventHandler(this.mnu_user_guide_Click);\r
             // \r
-            // mnu_handbrake_home\r
-            // \r
-            this.mnu_handbrake_home.Image = global::Handbrake.Properties.Resources.info16;\r
-            this.mnu_handbrake_home.Name = "mnu_handbrake_home";\r
-            this.mnu_handbrake_home.Size = new System.Drawing.Size(192, 22);\r
-            this.mnu_handbrake_home.Text = "HandBrake Homepage";\r
-            this.mnu_handbrake_home.Click += new System.EventHandler(this.mnu_handbrake_home_Click);\r
-            // \r
-            // mnu_handbrake_forums\r
-            // \r
-            this.mnu_handbrake_forums.Name = "mnu_handbrake_forums";\r
-            this.mnu_handbrake_forums.Size = new System.Drawing.Size(192, 22);\r
-            this.mnu_handbrake_forums.Text = "HandBrake Forums";\r
-            this.mnu_handbrake_forums.Click += new System.EventHandler(this.mnu_handbrake_forums_Click);\r
-            // \r
             // ToolStripSeparator3\r
             // \r
             this.ToolStripSeparator3.Name = "ToolStripSeparator3";\r
@@ -802,6 +957,9 @@ namespace Handbrake
             // tab_video\r
             // \r
             this.tab_video.BackColor = System.Drawing.Color.Transparent;\r
+            this.tab_video.Controls.Add(this.lbl_rfwarn);\r
+            this.tab_video.Controls.Add(this.checkMaximumFramerate);\r
+            this.tab_video.Controls.Add(this.drp_videoFramerate);\r
             this.tab_video.Controls.Add(this.radio_cq);\r
             this.tab_video.Controls.Add(this.radio_avgBitrate);\r
             this.tab_video.Controls.Add(this.radio_targetFilesize);\r
@@ -814,9 +972,8 @@ namespace Handbrake
             this.tab_video.Controls.Add(this.text_filesize);\r
             this.tab_video.Controls.Add(this.slider_videoQuality);\r
             this.tab_video.Controls.Add(this.text_bitrate);\r
-            this.tab_video.Controls.Add(this.SliderValue);\r
-            this.tab_video.Controls.Add(this.Label46);\r
-            this.tab_video.Controls.Add(this.drp_videoFramerate);\r
+            this.tab_video.Controls.Add(this.lbl_SliderValue);\r
+            this.tab_video.Controls.Add(this.lbl_framerate);\r
             this.tab_video.Location = new System.Drawing.Point(4, 22);\r
             this.tab_video.Name = "tab_video";\r
             this.tab_video.Padding = new System.Windows.Forms.Padding(3);\r
@@ -825,13 +982,37 @@ namespace Handbrake
             this.tab_video.Text = "Video";\r
             this.tab_video.UseVisualStyleBackColor = true;\r
             // \r
+            // lbl_rfwarn\r
+            // \r
+            this.lbl_rfwarn.AutoSize = true;\r
+            this.lbl_rfwarn.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_rfwarn.ForeColor = System.Drawing.Color.Red;\r
+            this.lbl_rfwarn.Location = new System.Drawing.Point(385, 165);\r
+            this.lbl_rfwarn.Name = "lbl_rfwarn";\r
+            this.lbl_rfwarn.Size = new System.Drawing.Size(321, 39);\r
+            this.lbl_rfwarn.TabIndex = 20;\r
+            this.lbl_rfwarn.Text = "RF:0 is x264\'s lossless mode.\r\nThis will result in a very large output which may " +\r
+                "not be compatible\r\nwith your playback software.";\r
+            this.lbl_rfwarn.Visible = false;\r
+            // \r
+            // checkMaximumFramerate\r
+            // \r
+            this.checkMaximumFramerate.AutoSize = true;\r
+            this.checkMaximumFramerate.BackColor = System.Drawing.Color.Transparent;\r
+            this.checkMaximumFramerate.Location = new System.Drawing.Point(125, 89);\r
+            this.checkMaximumFramerate.Name = "checkMaximumFramerate";\r
+            this.checkMaximumFramerate.Size = new System.Drawing.Size(131, 17);\r
+            this.checkMaximumFramerate.TabIndex = 19;\r
+            this.checkMaximumFramerate.Text = "Peak Framerate (VFR)";\r
+            this.checkMaximumFramerate.UseVisualStyleBackColor = false;\r
+            // \r
             // radio_cq\r
             // \r
             this.radio_cq.AutoSize = true;\r
             this.radio_cq.BackColor = System.Drawing.Color.Transparent;\r
-            this.radio_cq.Location = new System.Drawing.Point(336, 97);\r
+            this.radio_cq.Location = new System.Drawing.Point(365, 97);\r
             this.radio_cq.Name = "radio_cq";\r
-            this.radio_cq.Size = new System.Drawing.Size(110, 17);\r
+            this.radio_cq.Size = new System.Drawing.Size(105, 17);\r
             this.radio_cq.TabIndex = 18;\r
             this.radio_cq.Text = "Constant Quality:";\r
             this.radio_cq.UseVisualStyleBackColor = false;\r
@@ -842,9 +1023,9 @@ namespace Handbrake
             this.radio_avgBitrate.AutoSize = true;\r
             this.radio_avgBitrate.BackColor = System.Drawing.Color.Transparent;\r
             this.radio_avgBitrate.Checked = true;\r
-            this.radio_avgBitrate.Location = new System.Drawing.Point(336, 64);\r
+            this.radio_avgBitrate.Location = new System.Drawing.Point(365, 64);\r
             this.radio_avgBitrate.Name = "radio_avgBitrate";\r
-            this.radio_avgBitrate.Size = new System.Drawing.Size(116, 17);\r
+            this.radio_avgBitrate.Size = new System.Drawing.Size(112, 17);\r
             this.radio_avgBitrate.TabIndex = 17;\r
             this.radio_avgBitrate.TabStop = true;\r
             this.radio_avgBitrate.Text = "Avg Bitrate (kbps):";\r
@@ -855,9 +1036,9 @@ namespace Handbrake
             // \r
             this.radio_targetFilesize.AutoSize = true;\r
             this.radio_targetFilesize.BackColor = System.Drawing.Color.Transparent;\r
-            this.radio_targetFilesize.Location = new System.Drawing.Point(336, 37);\r
+            this.radio_targetFilesize.Location = new System.Drawing.Point(365, 37);\r
             this.radio_targetFilesize.Name = "radio_targetFilesize";\r
-            this.radio_targetFilesize.Size = new System.Drawing.Size(108, 17);\r
+            this.radio_targetFilesize.Size = new System.Drawing.Size(107, 17);\r
             this.radio_targetFilesize.TabIndex = 16;\r
             this.radio_targetFilesize.Text = "Target Size (MB):";\r
             this.radio_targetFilesize.UseVisualStyleBackColor = false;\r
@@ -878,9 +1059,9 @@ namespace Handbrake
             // \r
             this.check_2PassEncode.AutoSize = true;\r
             this.check_2PassEncode.BackColor = System.Drawing.Color.Transparent;\r
-            this.check_2PassEncode.Location = new System.Drawing.Point(125, 100);\r
+            this.check_2PassEncode.Location = new System.Drawing.Point(125, 120);\r
             this.check_2PassEncode.Name = "check_2PassEncode";\r
-            this.check_2PassEncode.Size = new System.Drawing.Size(104, 17);\r
+            this.check_2PassEncode.Size = new System.Drawing.Size(106, 17);\r
             this.check_2PassEncode.TabIndex = 6;\r
             this.check_2PassEncode.Text = "2-Pass Encoding";\r
             this.check_2PassEncode.UseVisualStyleBackColor = false;\r
@@ -891,31 +1072,32 @@ namespace Handbrake
             this.Label2.AutoSize = true;\r
             this.Label2.BackColor = System.Drawing.Color.Transparent;\r
             this.Label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.Label2.Location = new System.Drawing.Point(334, 13);\r
+            this.Label2.Location = new System.Drawing.Point(363, 13);\r
             this.Label2.Name = "Label2";\r
             this.Label2.Size = new System.Drawing.Size(47, 13);\r
             this.Label2.TabIndex = 8;\r
             this.Label2.Text = "Quality";\r
             // \r
-            // SliderValue\r
+            // lbl_SliderValue\r
             // \r
-            this.SliderValue.AutoSize = true;\r
-            this.SliderValue.BackColor = System.Drawing.Color.Transparent;\r
-            this.SliderValue.Location = new System.Drawing.Point(480, 100);\r
-            this.SliderValue.Name = "SliderValue";\r
-            this.SliderValue.Size = new System.Drawing.Size(24, 13);\r
-            this.SliderValue.TabIndex = 15;\r
-            this.SliderValue.Text = "0%";\r
+            this.lbl_SliderValue.AutoSize = true;\r
+            this.lbl_SliderValue.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_SliderValue.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.lbl_SliderValue.Location = new System.Drawing.Point(509, 100);\r
+            this.lbl_SliderValue.Name = "lbl_SliderValue";\r
+            this.lbl_SliderValue.Size = new System.Drawing.Size(21, 13);\r
+            this.lbl_SliderValue.TabIndex = 15;\r
+            this.lbl_SliderValue.Text = "RF";\r
             // \r
-            // Label46\r
+            // lbl_framerate\r
             // \r
-            this.Label46.AutoSize = true;\r
-            this.Label46.BackColor = System.Drawing.Color.Transparent;\r
-            this.Label46.Location = new System.Drawing.Point(13, 71);\r
-            this.Label46.Name = "Label46";\r
-            this.Label46.Size = new System.Drawing.Size(90, 13);\r
-            this.Label46.TabIndex = 1;\r
-            this.Label46.Text = "Framerate (FPS):";\r
+            this.lbl_framerate.AutoSize = true;\r
+            this.lbl_framerate.BackColor = System.Drawing.Color.Transparent;\r
+            this.lbl_framerate.Location = new System.Drawing.Point(13, 65);\r
+            this.lbl_framerate.Name = "lbl_framerate";\r
+            this.lbl_framerate.Size = new System.Drawing.Size(90, 13);\r
+            this.lbl_framerate.TabIndex = 1;\r
+            this.lbl_framerate.Text = "Framerate (FPS):";\r
             // \r
             // tab_picture\r
             // \r
@@ -932,10 +1114,12 @@ namespace Handbrake
             // PictureSettings\r
             // \r
             this.PictureSettings.BackColor = System.Drawing.Color.Transparent;\r
+            this.PictureSettings.CurrentlySelectedPreset = null;\r
             this.PictureSettings.Enabled = false;\r
             this.PictureSettings.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.PictureSettings.Location = new System.Drawing.Point(0, 0);\r
             this.PictureSettings.Name = "PictureSettings";\r
+            this.PictureSettings.PresetMaximumResolution = new System.Drawing.Size(0, 0);\r
             this.PictureSettings.Size = new System.Drawing.Size(666, 279);\r
             this.PictureSettings.TabIndex = 0;\r
             // \r
@@ -945,7 +1129,7 @@ namespace Handbrake
             this.Check_ChapterMarkers.BackColor = System.Drawing.Color.Transparent;\r
             this.Check_ChapterMarkers.Location = new System.Drawing.Point(16, 32);\r
             this.Check_ChapterMarkers.Name = "Check_ChapterMarkers";\r
-            this.Check_ChapterMarkers.Size = new System.Drawing.Size(140, 17);\r
+            this.Check_ChapterMarkers.Size = new System.Drawing.Size(136, 17);\r
             this.Check_ChapterMarkers.TabIndex = 1;\r
             this.Check_ChapterMarkers.Text = "Create chapter markers";\r
             this.Check_ChapterMarkers.UseVisualStyleBackColor = false;\r
@@ -1010,6 +1194,7 @@ namespace Handbrake
             // tab_chapters\r
             // \r
             this.tab_chapters.BackColor = System.Drawing.Color.Transparent;\r
+            this.tab_chapters.Controls.Add(this.btn_export);\r
             this.tab_chapters.Controls.Add(this.btn_importChapters);\r
             this.tab_chapters.Controls.Add(this.label31);\r
             this.tab_chapters.Controls.Add(this.data_chpt);\r
@@ -1021,20 +1206,6 @@ namespace Handbrake
             this.tab_chapters.Text = "Chapters";\r
             this.tab_chapters.UseVisualStyleBackColor = true;\r
             // \r
-            // btn_importChapters\r
-            // \r
-            this.btn_importChapters.AutoSize = true;\r
-            this.btn_importChapters.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_importChapters.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_importChapters.Location = new System.Drawing.Point(625, 26);\r
-            this.btn_importChapters.Name = "btn_importChapters";\r
-            this.btn_importChapters.Size = new System.Drawing.Size(75, 23);\r
-            this.btn_importChapters.TabIndex = 14;\r
-            this.btn_importChapters.Text = "Import";\r
-            this.ToolTip.SetToolTip(this.btn_importChapters, resources.GetString("btn_importChapters.ToolTip"));\r
-            this.btn_importChapters.UseVisualStyleBackColor = true;\r
-            this.btn_importChapters.Click += new System.EventHandler(this.btn_importChapters_Click);\r
-            // \r
             // label31\r
             // \r
             this.label31.AutoSize = true;\r
@@ -1066,7 +1237,7 @@ namespace Handbrake
             this.x264Panel.Name = "x264Panel";\r
             this.x264Panel.Size = new System.Drawing.Size(720, 306);\r
             this.x264Panel.TabIndex = 0;\r
-            this.x264Panel.x264Query = "";\r
+            this.x264Panel.X264Query = "";\r
             // \r
             // tab_query\r
             // \r
@@ -1087,7 +1258,7 @@ namespace Handbrake
             this.btn_clear.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
             this.btn_clear.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_clear.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_clear.Location = new System.Drawing.Point(634, 75);\r
+            this.btn_clear.Location = new System.Drawing.Point(634, 104);\r
             this.btn_clear.Name = "btn_clear";\r
             this.btn_clear.Size = new System.Drawing.Size(75, 22);\r
             this.btn_clear.TabIndex = 4;\r
@@ -1098,25 +1269,11 @@ namespace Handbrake
             // label34\r
             // \r
             this.label34.AutoSize = true;\r
-            this.label34.Location = new System.Drawing.Point(13, 36);\r
+            this.label34.Location = new System.Drawing.Point(13, 35);\r
             this.label34.Name = "label34";\r
-            this.label34.Size = new System.Drawing.Size(367, 26);\r
+            this.label34.Size = new System.Drawing.Size(631, 52);\r
             this.label34.TabIndex = 1;\r
-            this.label34.Text = "Here you can alter the query generated by this program.\r\nDon\'t forget to re-gener" +\r
-                "ate this query should you change any GUI options.";\r
-            // \r
-            // btn_generate_Query\r
-            // \r
-            this.btn_generate_Query.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
-            this.btn_generate_Query.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_generate_Query.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_generate_Query.Location = new System.Drawing.Point(16, 75);\r
-            this.btn_generate_Query.Name = "btn_generate_Query";\r
-            this.btn_generate_Query.Size = new System.Drawing.Size(126, 22);\r
-            this.btn_generate_Query.TabIndex = 2;\r
-            this.btn_generate_Query.Text = "Generate Query";\r
-            this.btn_generate_Query.UseVisualStyleBackColor = true;\r
-            this.btn_generate_Query.Click += new System.EventHandler(this.btn_generate_Query_Click);\r
+            this.label34.Text = resources.GetString("label34.Text");\r
             // \r
             // label33\r
             // \r
@@ -1132,9 +1289,9 @@ namespace Handbrake
             // rtf_query\r
             // \r
             this.rtf_query.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
-            this.rtf_query.Location = new System.Drawing.Point(16, 103);\r
+            this.rtf_query.Location = new System.Drawing.Point(16, 132);\r
             this.rtf_query.Name = "rtf_query";\r
-            this.rtf_query.Size = new System.Drawing.Size(693, 190);\r
+            this.rtf_query.Size = new System.Drawing.Size(693, 161);\r
             this.rtf_query.TabIndex = 5;\r
             this.rtf_query.Text = "";\r
             // \r
@@ -1169,84 +1326,6 @@ namespace Handbrake
             this.splitContainer1.SplitterDistance = 424;\r
             this.splitContainer1.TabIndex = 1;\r
             // \r
-            // treeView_presets\r
-            // \r
-            this.treeView_presets.ContextMenuStrip = this.presets_menu;\r
-            this.treeView_presets.Dock = System.Windows.Forms.DockStyle.Fill;\r
-            this.treeView_presets.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.treeView_presets.ForeColor = System.Drawing.Color.DarkBlue;\r
-            this.treeView_presets.FullRowSelect = true;\r
-            this.treeView_presets.HideSelection = false;\r
-            this.treeView_presets.ItemHeight = 21;\r
-            this.treeView_presets.Location = new System.Drawing.Point(0, 0);\r
-            this.treeView_presets.Name = "treeView_presets";\r
-            this.treeView_presets.ShowLines = false;\r
-            this.treeView_presets.Size = new System.Drawing.Size(240, 424);\r
-            this.treeView_presets.TabIndex = 0;\r
-            this.treeView_presets.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeview_presets_mouseUp);\r
-            this.treeView_presets.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_presets_AfterSelect);\r
-            this.treeView_presets.KeyUp += new System.Windows.Forms.KeyEventHandler(this.treeView_presets_deleteKey);\r
-            // \r
-            // presets_menu\r
-            // \r
-            this.presets_menu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
-            this.pmnu_expandAll,\r
-            this.pmnu_collapse,\r
-            this.sep1,\r
-            this.pmnu_import,\r
-            this.toolStripSeparator2,\r
-            this.pmnu_saveChanges,\r
-            this.pmnu_delete});\r
-            this.presets_menu.Name = "presets_menu";\r
-            this.presets_menu.Size = new System.Drawing.Size(155, 126);\r
-            this.presets_menu.Text = ";";\r
-            this.presets_menu.Opening += new System.ComponentModel.CancelEventHandler(this.presets_menu_Opening);\r
-            // \r
-            // pmnu_expandAll\r
-            // \r
-            this.pmnu_expandAll.Name = "pmnu_expandAll";\r
-            this.pmnu_expandAll.Size = new System.Drawing.Size(154, 22);\r
-            this.pmnu_expandAll.Text = "Expand All";\r
-            this.pmnu_expandAll.Click += new System.EventHandler(this.pmnu_expandAll_Click);\r
-            // \r
-            // pmnu_collapse\r
-            // \r
-            this.pmnu_collapse.Name = "pmnu_collapse";\r
-            this.pmnu_collapse.Size = new System.Drawing.Size(154, 22);\r
-            this.pmnu_collapse.Text = "Collapse All";\r
-            this.pmnu_collapse.Click += new System.EventHandler(this.pmnu_collapse_Click);\r
-            // \r
-            // sep1\r
-            // \r
-            this.sep1.Name = "sep1";\r
-            this.sep1.Size = new System.Drawing.Size(151, 6);\r
-            // \r
-            // pmnu_import\r
-            // \r
-            this.pmnu_import.Name = "pmnu_import";\r
-            this.pmnu_import.Size = new System.Drawing.Size(154, 22);\r
-            this.pmnu_import.Text = "Import";\r
-            this.pmnu_import.Click += new System.EventHandler(this.pmnu_import_Click);\r
-            // \r
-            // toolStripSeparator2\r
-            // \r
-            this.toolStripSeparator2.Name = "toolStripSeparator2";\r
-            this.toolStripSeparator2.Size = new System.Drawing.Size(151, 6);\r
-            // \r
-            // pmnu_saveChanges\r
-            // \r
-            this.pmnu_saveChanges.Name = "pmnu_saveChanges";\r
-            this.pmnu_saveChanges.Size = new System.Drawing.Size(154, 22);\r
-            this.pmnu_saveChanges.Text = "Save Changes";\r
-            this.pmnu_saveChanges.Click += new System.EventHandler(this.pmnu_saveChanges_Click);\r
-            // \r
-            // pmnu_delete\r
-            // \r
-            this.pmnu_delete.Name = "pmnu_delete";\r
-            this.pmnu_delete.Size = new System.Drawing.Size(154, 22);\r
-            this.pmnu_delete.Text = "Delete";\r
-            this.pmnu_delete.Click += new System.EventHandler(this.pmnu_delete_click);\r
-            // \r
             // toolStrip1\r
             // \r
             this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\r
@@ -1271,47 +1350,57 @@ namespace Handbrake
             this.btn_source.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.btn_file_source,\r
             this.btn_dvd_source,\r
-            this.toolStripSeparator1,\r
-            this.mnu_dvd_drive});\r
+            this.btnTitleSpecific,\r
+            this.toolStripSeparator1});\r
             this.btn_source.Image = global::Handbrake.Properties.Resources.Movies;\r
             this.btn_source.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
             this.btn_source.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.btn_source.Name = "btn_source";\r
-            this.btn_source.Size = new System.Drawing.Size(85, 36);\r
+            this.btn_source.Size = new System.Drawing.Size(88, 36);\r
             this.btn_source.Text = "Source";\r
             this.btn_source.ToolTipText = "Open a new source file or folder.";\r
             this.btn_source.Click += new System.EventHandler(this.btn_source_Click);\r
             // \r
-            // btn_file_source\r
-            // \r
-            this.btn_file_source.Image = global::Handbrake.Properties.Resources.Movies_Small;\r
-            this.btn_file_source.Name = "btn_file_source";\r
-            this.btn_file_source.Size = new System.Drawing.Size(194, 22);\r
-            this.btn_file_source.Text = "Video File";\r
-            this.btn_file_source.Click += new System.EventHandler(this.btn_file_source_Click);\r
-            // \r
             // btn_dvd_source\r
             // \r
-            this.btn_dvd_source.Image = ((System.Drawing.Image)(resources.GetObject("btn_dvd_source.Image")));\r
+            this.btn_dvd_source.Image = global::Handbrake.Properties.Resources.folder;\r
             this.btn_dvd_source.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.btn_dvd_source.Name = "btn_dvd_source";\r
-            this.btn_dvd_source.Size = new System.Drawing.Size(194, 22);\r
-            this.btn_dvd_source.Text = "DVD/ VIDEO_TS Folder";\r
-            this.btn_dvd_source.Click += new System.EventHandler(this.btn_dvd_source_Click);\r
+            this.btn_dvd_source.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)\r
+                        | System.Windows.Forms.Keys.O)));\r
+            this.btn_dvd_source.Size = new System.Drawing.Size(182, 22);\r
+            this.btn_dvd_source.Text = "Folder";\r
+            this.btn_dvd_source.Click += new System.EventHandler(this.BtnFolderScanClicked);\r
             // \r
-            // toolStripSeparator1\r
+            // btnTitleSpecific\r
             // \r
-            this.toolStripSeparator1.Name = "toolStripSeparator1";\r
-            this.toolStripSeparator1.Size = new System.Drawing.Size(191, 6);\r
+            this.btnTitleSpecific.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.FileTitleSpecificScan,\r
+            this.FolderTitleSpecificScan});\r
+            this.btnTitleSpecific.Name = "btnTitleSpecific";\r
+            this.btnTitleSpecific.Size = new System.Drawing.Size(182, 22);\r
+            this.btnTitleSpecific.Text = "Title Specific Scan";\r
+            // \r
+            // FileTitleSpecificScan\r
+            // \r
+            this.FileTitleSpecificScan.Image = global::Handbrake.Properties.Resources.Movies_Small;\r
+            this.FileTitleSpecificScan.Name = "FileTitleSpecificScan";\r
+            this.FileTitleSpecificScan.Size = new System.Drawing.Size(125, 22);\r
+            this.FileTitleSpecificScan.Text = "Video File";\r
+            this.FileTitleSpecificScan.Click += new System.EventHandler(this.VideoTitleSpecificScanClick);\r
+            // \r
+            // FolderTitleSpecificScan\r
             // \r
-            // mnu_dvd_drive\r
+            this.FolderTitleSpecificScan.Image = global::Handbrake.Properties.Resources.folder;\r
+            this.FolderTitleSpecificScan.Name = "FolderTitleSpecificScan";\r
+            this.FolderTitleSpecificScan.Size = new System.Drawing.Size(125, 22);\r
+            this.FolderTitleSpecificScan.Text = "Folder";\r
+            this.FolderTitleSpecificScan.Click += new System.EventHandler(this.FolderTitleSpecificScanClick);\r
             // \r
-            this.mnu_dvd_drive.Image = global::Handbrake.Properties.Resources.disc_small;\r
-            this.mnu_dvd_drive.Name = "mnu_dvd_drive";\r
-            this.mnu_dvd_drive.Size = new System.Drawing.Size(194, 22);\r
-            this.mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
-            this.mnu_dvd_drive.Visible = false;\r
-            this.mnu_dvd_drive.Click += new System.EventHandler(this.mnu_dvd_drive_Click);\r
+            // toolStripSeparator1\r
+            // \r
+            this.toolStripSeparator1.Name = "toolStripSeparator1";\r
+            this.toolStripSeparator1.Size = new System.Drawing.Size(179, 6);\r
             // \r
             // toolStripSeparator10\r
             // \r
@@ -1335,7 +1424,7 @@ namespace Handbrake
             this.btn_add2Queue.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
             this.btn_add2Queue.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.btn_add2Queue.Name = "btn_add2Queue";\r
-            this.btn_add2Queue.Size = new System.Drawing.Size(110, 36);\r
+            this.btn_add2Queue.Size = new System.Drawing.Size(117, 36);\r
             this.btn_add2Queue.Text = "Add to Queue";\r
             this.btn_add2Queue.ToolTipText = "Add a new item to the Queue";\r
             this.btn_add2Queue.Click += new System.EventHandler(this.btn_add2Queue_Click);\r
@@ -1346,7 +1435,7 @@ namespace Handbrake
             this.btn_showQueue.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
             this.btn_showQueue.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.btn_showQueue.Name = "btn_showQueue";\r
-            this.btn_showQueue.Size = new System.Drawing.Size(104, 36);\r
+            this.btn_showQueue.Size = new System.Drawing.Size(110, 36);\r
             this.btn_showQueue.Tag = "";\r
             this.btn_showQueue.Text = "Show Queue";\r
             this.btn_showQueue.Click += new System.EventHandler(this.btn_showQueue_Click);\r
@@ -1362,7 +1451,7 @@ namespace Handbrake
             this.tb_preview.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
             this.tb_preview.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.tb_preview.Name = "tb_preview";\r
-            this.tb_preview.Size = new System.Drawing.Size(81, 36);\r
+            this.tb_preview.Size = new System.Drawing.Size(84, 36);\r
             this.tb_preview.Text = "Preview";\r
             this.tb_preview.Click += new System.EventHandler(this.tb_preview_Click);\r
             // \r
@@ -1372,7 +1461,7 @@ namespace Handbrake
             this.btn_ActivityWindow.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;\r
             this.btn_ActivityWindow.ImageTransparentColor = System.Drawing.Color.Magenta;\r
             this.btn_ActivityWindow.Name = "btn_ActivityWindow";\r
-            this.btn_ActivityWindow.Size = new System.Drawing.Size(120, 36);\r
+            this.btn_ActivityWindow.Size = new System.Drawing.Size(130, 36);\r
             this.btn_ActivityWindow.Text = "Activity Window";\r
             this.btn_ActivityWindow.ToolTipText = "Displays the activity window which displays the log of the last completed or curr" +\r
                 "ently running encode.";\r
@@ -1391,15 +1480,24 @@ namespace Handbrake
             // StatusStrip\r
             // \r
             this.StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
+            this.ProgressBarStatus,\r
             this.lbl_encode,\r
             this.lbl_updateCheck});\r
             this.StatusStrip.Location = new System.Drawing.Point(0, 561);\r
             this.StatusStrip.Name = "StatusStrip";\r
+            this.StatusStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
             this.StatusStrip.Size = new System.Drawing.Size(1002, 22);\r
             this.StatusStrip.SizingGrip = false;\r
             this.StatusStrip.TabIndex = 7;\r
             this.StatusStrip.Text = "statusStrip1";\r
             // \r
+            // ProgressBarStatus\r
+            // \r
+            this.ProgressBarStatus.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
+            this.ProgressBarStatus.Name = "ProgressBarStatus";\r
+            this.ProgressBarStatus.Size = new System.Drawing.Size(100, 16);\r
+            this.ProgressBarStatus.Visible = false;\r
+            // \r
             // lbl_encode\r
             // \r
             this.lbl_encode.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
@@ -1487,12 +1585,14 @@ namespace Handbrake
             // tableLayoutPanel1\r
             // \r
             this.tableLayoutPanel1.AutoSize = true;\r
-            this.tableLayoutPanel1.ColumnCount = 10;\r
+            this.tableLayoutPanel1.ColumnCount = 12;\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
+            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 35F));\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
+            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 5F));\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
             this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
@@ -1502,12 +1602,12 @@ namespace Handbrake
             this.tableLayoutPanel1.Controls.Add(this.drp_dvdtitle, 1, 0);\r
             this.tableLayoutPanel1.Controls.Add(this.lbl_angle, 2, 0);\r
             this.tableLayoutPanel1.Controls.Add(this.drop_angle, 3, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.Label9, 4, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.drop_chapterStart, 5, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.Label13, 6, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.drop_chapterFinish, 7, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.label_duration, 8, 0);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_duration, 9, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.drop_chapterStart, 7, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.Label13, 8, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.drop_chapterFinish, 9, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.label_duration, 10, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.lbl_duration, 11, 0);\r
+            this.tableLayoutPanel1.Controls.Add(this.drop_mode, 5, 0);\r
             this.tableLayoutPanel1.Location = new System.Drawing.Point(21, 86);\r
             this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
             this.tableLayoutPanel1.RowCount = 1;\r
@@ -1537,22 +1637,11 @@ namespace Handbrake
             this.lbl_angle.TabIndex = 44;\r
             this.lbl_angle.Text = "Angle:";\r
             // \r
-            // Label9\r
-            // \r
-            this.Label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.Label9.AutoSize = true;\r
-            this.Label9.ForeColor = System.Drawing.Color.Black;\r
-            this.Label9.Location = new System.Drawing.Point(260, 7);\r
-            this.Label9.Name = "Label9";\r
-            this.Label9.Size = new System.Drawing.Size(55, 13);\r
-            this.Label9.TabIndex = 8;\r
-            this.Label9.Text = "Chapters:";\r
-            // \r
             // Label13\r
             // \r
             this.Label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
             this.Label13.AutoSize = true;\r
-            this.Label13.Location = new System.Drawing.Point(396, 7);\r
+            this.Label13.Location = new System.Drawing.Point(458, 7);\r
             this.Label13.Name = "Label13";\r
             this.Label13.Size = new System.Drawing.Size(45, 13);\r
             this.Label13.TabIndex = 10;\r
@@ -1563,7 +1652,7 @@ namespace Handbrake
             this.label_duration.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
             this.label_duration.AutoSize = true;\r
             this.label_duration.BackColor = System.Drawing.Color.Transparent;\r
-            this.label_duration.Location = new System.Drawing.Point(522, 7);\r
+            this.label_duration.Location = new System.Drawing.Point(584, 7);\r
             this.label_duration.Name = "label_duration";\r
             this.label_duration.Size = new System.Drawing.Size(52, 13);\r
             this.label_duration.TabIndex = 42;\r
@@ -1574,7 +1663,7 @@ namespace Handbrake
             this.lbl_duration.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.lbl_duration.AutoSize = true;\r
             this.lbl_duration.BackColor = System.Drawing.Color.Transparent;\r
-            this.lbl_duration.Location = new System.Drawing.Point(580, 7);\r
+            this.lbl_duration.Location = new System.Drawing.Point(642, 7);\r
             this.lbl_duration.Name = "lbl_duration";\r
             this.lbl_duration.Size = new System.Drawing.Size(39, 13);\r
             this.lbl_duration.TabIndex = 43;\r
@@ -1620,17 +1709,17 @@ namespace Handbrake
             this.labelStaticSource.TabIndex = 51;\r
             this.labelStaticSource.Text = "Source:";\r
             // \r
-            // flowLayoutPanel1\r
+            // SourceLayoutPanel\r
             // \r
-            this.flowLayoutPanel1.AutoSize = true;\r
-            this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.flowLayoutPanel1.Controls.Add(this.labelStaticSource);\r
-            this.flowLayoutPanel1.Controls.Add(this.labelSource);\r
-            this.flowLayoutPanel1.Location = new System.Drawing.Point(9, 70);\r
-            this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);\r
-            this.flowLayoutPanel1.Name = "flowLayoutPanel1";\r
-            this.flowLayoutPanel1.Size = new System.Drawing.Size(195, 13);\r
-            this.flowLayoutPanel1.TabIndex = 55;\r
+            this.SourceLayoutPanel.AutoSize = true;\r
+            this.SourceLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
+            this.SourceLayoutPanel.Controls.Add(this.labelStaticSource);\r
+            this.SourceLayoutPanel.Controls.Add(this.labelSource);\r
+            this.SourceLayoutPanel.Location = new System.Drawing.Point(9, 70);\r
+            this.SourceLayoutPanel.Margin = new System.Windows.Forms.Padding(0);\r
+            this.SourceLayoutPanel.Name = "SourceLayoutPanel";\r
+            this.SourceLayoutPanel.Size = new System.Drawing.Size(195, 13);\r
+            this.SourceLayoutPanel.TabIndex = 55;\r
             // \r
             // openPreset\r
             // \r
@@ -1646,23 +1735,23 @@ namespace Handbrake
             this.AllowDrop = true;\r
             this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r
-            this.AutoScroll = true;\r
             this.AutoSize = true;\r
             this.ClientSize = new System.Drawing.Size(1002, 583);\r
             this.Controls.Add(this.tableLayoutPanel3);\r
             this.Controls.Add(this.toolStrip1);\r
-            this.Controls.Add(this.flowLayoutPanel1);\r
+            this.Controls.Add(this.SourceLayoutPanel);\r
             this.Controls.Add(this.frmMainMenu);\r
             this.Controls.Add(this.tableLayoutPanel2);\r
             this.Controls.Add(this.labelPreset);\r
             this.Controls.Add(this.groupBox2);\r
             this.Controls.Add(this.StatusStrip);\r
-            this.Controls.Add(this.labelStaticDestination);\r
             this.Controls.Add(this.tableLayoutPanel1);\r
             this.Controls.Add(this.tabs_panel);\r
+            this.Controls.Add(this.labelStaticDestination);\r
             this.DoubleBuffered = true;\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.KeyPreview = true;\r
             this.MinimumSize = new System.Drawing.Size(900, 500);\r
             this.Name = "frmMain";\r
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r
@@ -1671,6 +1760,7 @@ namespace Handbrake
             ((System.ComponentModel.ISupportInitialize)(this.slider_videoQuality)).EndInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.data_chpt)).EndInit();\r
             this.ChaptersMenu.ResumeLayout(false);\r
+            this.presets_menu.ResumeLayout(false);\r
             this.frmMainMenu.ResumeLayout(false);\r
             this.frmMainMenu.PerformLayout();\r
             this.tab_audio.ResumeLayout(false);\r
@@ -1689,7 +1779,6 @@ namespace Handbrake
             this.splitContainer1.Panel1.ResumeLayout(false);\r
             this.splitContainer1.Panel2.ResumeLayout(false);\r
             this.splitContainer1.ResumeLayout(false);\r
-            this.presets_menu.ResumeLayout(false);\r
             this.toolStrip1.ResumeLayout(false);\r
             this.toolStrip1.PerformLayout();\r
             this.StatusStrip.ResumeLayout(false);\r
@@ -1700,8 +1789,8 @@ namespace Handbrake
             this.tableLayoutPanel3.PerformLayout();\r
             this.tableLayoutPanel1.ResumeLayout(false);\r
             this.tableLayoutPanel1.PerformLayout();\r
-            this.flowLayoutPanel1.ResumeLayout(false);\r
-            this.flowLayoutPanel1.PerformLayout();\r
+            this.SourceLayoutPanel.ResumeLayout(false);\r
+            this.SourceLayoutPanel.PerformLayout();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -1732,7 +1821,7 @@ namespace Handbrake
         internal System.Windows.Forms.CheckBox check_largeFile;\r
         internal System.Windows.Forms.CheckBox check_turbo;\r
         internal System.Windows.Forms.Label Label2;\r
-        internal System.Windows.Forms.Label SliderValue;\r
+        internal System.Windows.Forms.Label lbl_SliderValue;\r
         internal System.Windows.Forms.ComboBox drp_videoFramerate;\r
         internal System.Windows.Forms.CheckBox check_2PassEncode;\r
         internal System.Windows.Forms.TrackBar slider_videoQuality;\r
@@ -1741,7 +1830,7 @@ namespace Handbrake
         internal System.Windows.Forms.TabPage tab_picture;\r
         internal System.Windows.Forms.CheckBox Check_ChapterMarkers;\r
         internal System.Windows.Forms.TabControl tabs_panel;\r
-        internal System.Windows.Forms.Label Label46;\r
+        internal System.Windows.Forms.Label lbl_framerate;\r
         private System.Windows.Forms.GroupBox groupBox2;\r
         internal System.Windows.Forms.Button btn_setDefault;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_SelectDefault;\r
@@ -1766,7 +1855,6 @@ namespace Handbrake
         private System.Windows.Forms.ToolStripButton btn_showQueue;\r
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;\r
         private System.Windows.Forms.ToolStripButton btn_ActivityWindow;\r
-        private System.Windows.Forms.ToolStripMenuItem mnu_handbrake_home;\r
         internal System.Windows.Forms.Button btn_removePreset;\r
         internal System.Windows.Forms.Button btn_addPreset;\r
         internal System.Windows.Forms.Label label25;\r
@@ -1779,7 +1867,6 @@ namespace Handbrake
         private System.Windows.Forms.ToolStripMenuItem btn_file_source;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_delete_preset;\r
         private System.Windows.Forms.ToolStripMenuItem btn_new_preset;\r
-        private System.Windows.Forms.ToolStripMenuItem mnu_handbrake_forums;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_user_guide;\r
         private System.Windows.Forms.ToolStripDropDownButton btn_source;\r
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r
@@ -1791,7 +1878,6 @@ namespace Handbrake
         private System.Windows.Forms.ToolStripStatusLabel lbl_encode;\r
         internal System.Windows.Forms.OpenFileDialog ISO_Open;\r
         internal System.Windows.Forms.FolderBrowserDialog DVD_Open;\r
-        internal System.Windows.Forms.ToolStripMenuItem mnu_dvd_drive;\r
         private System.Windows.Forms.ContextMenuStrip presets_menu;\r
         private System.Windows.Forms.ToolStripMenuItem pmnu_expandAll;\r
         private System.Windows.Forms.ToolStripMenuItem pmnu_collapse;\r
@@ -1807,8 +1893,6 @@ namespace Handbrake
         internal System.Windows.Forms.RadioButton radio_targetFilesize;\r
         internal Handbrake.Controls.x264Panel x264Panel;\r
         private System.Windows.Forms.ToolStripButton tb_preview;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn number;\r
-        private System.Windows.Forms.DataGridViewTextBoxColumn name;\r
         private System.Diagnostics.Process hbproc;\r
         private TabPage tab_subtitles;\r
         internal Handbrake.Controls.AudioPanel AudioSettings;\r
@@ -1822,7 +1906,6 @@ namespace Handbrake
         private TableLayoutPanel tableLayoutPanel1;\r
         internal Label lbl_angle;\r
         internal ComboBox drop_angle;\r
-        internal Label Label9;\r
         internal ComboBox drop_chapterStart;\r
         internal Label Label13;\r
         internal ComboBox drop_chapterFinish;\r
@@ -1835,7 +1918,7 @@ namespace Handbrake
         internal ComboBox drp_dvdtitle;\r
         internal Label Label10;\r
         private Label labelStaticSource;\r
-        private FlowLayoutPanel flowLayoutPanel1;\r
+        private FlowLayoutPanel SourceLayoutPanel;\r
         private ToolStripMenuItem mnu_importMacPreset;\r
         private OpenFileDialog openPreset;\r
         private Button btn_importChapters;\r
@@ -1844,5 +1927,16 @@ namespace Handbrake
         private ToolStripMenuItem mnu_resetChapters;\r
         private ToolStripMenuItem pmnu_import;\r
         private ToolStripSeparator toolStripSeparator2;\r
+        internal ComboBox drop_mode;\r
+        private Button btn_export;\r
+        private DataGridViewTextBoxColumn number;\r
+        private DataGridViewTextBoxColumn name;\r
+        private ToolStripMenuItem mnu_exportMacPreset;\r
+        private ToolStripProgressBar ProgressBarStatus;\r
+        internal CheckBox checkMaximumFramerate;\r
+        private ToolStripMenuItem btnTitleSpecific;\r
+        private ToolStripMenuItem FileTitleSpecificScan;\r
+        private ToolStripMenuItem FolderTitleSpecificScan;\r
+        internal Label lbl_rfwarn;\r
     }\r
 }
\ No newline at end of file
index 9cf29a2..bc56731 100644 (file)
 /*  frmMain.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr/>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.Drawing;\r
-using System.Globalization;\r
-using System.Windows.Forms;\r
-using System.IO;\r
-using System.Diagnostics;\r
-using System.Threading;\r
-using Handbrake.EncodeQueue;\r
-using Handbrake.Functions;\r
-using Handbrake.Presets;\r
-using Handbrake.Parsing;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.ComponentModel;\r
+    using System.Diagnostics;\r
+    using System.Drawing;\r
+    using System.Globalization;\r
+    using System.IO;\r
+    using System.Threading;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.Framework.Model;\r
+    using HandBrake.Framework.Services;\r
+    using HandBrake.Framework.Views;\r
+    using HandBrake.ApplicationServices.Functions;\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Parsing;\r
+    using HandBrake.ApplicationServices.Services;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    using Handbrake.ToolWindows;\r
+\r
+    using Model;\r
+    using Presets;\r
+    using Properties;\r
+\r
+    using Main = Handbrake.Functions.Main;\r
+\r
+    /// <summary>\r
+    /// The Main Window\r
+    /// </summary>\r
     public partial class frmMain : Form\r
     {\r
         // Objects which may be used by one or more other objects *************\r
-        EncodeAndQueueHandler encodeQueue = new EncodeAndQueueHandler();\r
-        PresetsHandler presetHandler = new PresetsHandler();\r
-        QueryGenerator queryGen = new QueryGenerator();\r
+        private IQueue encodeQueue = new Queue();\r
+        private PresetsHandler presetHandler = new PresetsHandler();\r
 \r
-        // Globals: Mainly used for tracking. *********************************\r
-        public Title selectedTitle;\r
-        private DVD thisDVD;\r
+        // Windows ************************************************************\r
         private frmQueue queueWindow;\r
         private frmPreview qtpreview;\r
-        private frmActivityWindow ActivityWindow;\r
-        private Form splash;\r
+        private frmActivityWindow activityWindow;\r
+\r
+        // Globals: Mainly used for tracking. *********************************\r
+        public Title selectedTitle;\r
         public string sourcePath;\r
-        private string lastAction;\r
         private SourceType selectedSourceType;\r
         private string dvdDrivePath;\r
         private string dvdDriveLabel;\r
+        private Preset currentlySelectedPreset;\r
+        private DVD currentSource;\r
+        private IScan SourceScan = new ScanService();\r
+        private List<DriveInformation> drives;\r
+        private Job queueEdit;\r
 \r
         // Delegates **********************************************************\r
         private delegate void UpdateWindowHandler();\r
 \r
         // Applicaiton Startup ************************************************\r
 \r
-        #region Application Startup\r
-        public frmMain()\r
+        #region Properties\r
+\r
+        /// <summary>\r
+        /// Gets SourceName.\r
+        /// </summary>\r
+        public string SourceName\r
         {\r
-            // Load and setup the splash screen in this thread\r
-            splash = new frmSplashScreen();\r
-            splash.Show(this);\r
-            Label lblStatus = new Label { Size = new Size(150, 20), Location = new Point(182, 102) };\r
-            splash.Controls.Add(lblStatus);\r
+            get\r
+            {\r
+                if (this.selectedSourceType == SourceType.DvdDrive)\r
+                {\r
+                    return this.dvdDriveLabel;\r
+                }\r
+\r
+                if (selectedTitle != null && !string.IsNullOrEmpty(selectedTitle.SourceName))\r
+                {\r
+                    return Path.GetFileName(selectedTitle.SourceName);\r
+                }\r
+\r
+                // We have a drive, selected as a folder.\r
+                if (this.sourcePath.EndsWith("\\"))\r
+                {\r
+                    drives = Main.GetDrives();\r
+                    foreach (DriveInformation item in drives)\r
+                    {\r
+                        if (item.RootDirectory.Contains(this.sourcePath))\r
+                        {\r
+                            return item.VolumeLabel;\r
+                        }\r
+                    }\r
+                }\r
 \r
+                if (Path.GetFileNameWithoutExtension(this.sourcePath) != "VIDEO_TS")\r
+                    return Path.GetFileNameWithoutExtension(this.sourcePath);\r
+\r
+                return Path.GetFileNameWithoutExtension(Path.GetDirectoryName(this.sourcePath));\r
+            }\r
+        }\r
+\r
+        #endregion\r
+\r
+        #region Application Startup\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmMain"/> class.\r
+        /// </summary>\r
+        /// <param name="args">\r
+        /// The arguments passed in on application startup.\r
+        /// </param>\r
+        public frmMain(string[] args)\r
+        {\r
             InitializeComponent();\r
 \r
             // Update the users config file with the CLI version data.\r
-            lblStatus.Text = "Setting Version Data ...";\r
-            Application.DoEvents();\r
-            Main.setCliVersionData();\r
+            Main.SetCliVersionData();\r
 \r
-            // Show the form, but leave disabled until preloading is complete then show the main form\r
-            this.Enabled = false;\r
-            this.Show();\r
-            Application.DoEvents(); // Forces frmMain to draw\r
+            if (Settings.Default.hb_version.Contains("svn"))\r
+            {\r
+                this.Text += " " + Settings.Default.hb_version;\r
+            }\r
 \r
             // Check for new versions, if update checking is enabled\r
-            if (Properties.Settings.Default.updateStatus)\r
+            if (Settings.Default.updateStatus)\r
             {\r
-                DateTime now = DateTime.Now;\r
-                DateTime lastCheck = Properties.Settings.Default.lastUpdateCheckDate;\r
-                TimeSpan elapsed = now.Subtract(lastCheck);\r
-                if (elapsed.TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)\r
+                if (DateTime.Now.Subtract(Settings.Default.lastUpdateCheckDate).TotalDays > Properties.Settings.Default.daysBetweenUpdateCheck)\r
                 {\r
-                    lblStatus.Text = "Checking for updates ...";\r
-                    Application.DoEvents();\r
-\r
-                    Main.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false);\r
+                    // Set when the last update was\r
+                    Settings.Default.lastUpdateCheckDate = DateTime.Now;\r
+                    Settings.Default.Save();\r
+                    string url = Settings.Default.hb_build.ToString().EndsWith("1")\r
+                                                  ? Settings.Default.appcast_unstable\r
+                                                  : Settings.Default.appcast;\r
+                    UpdateService.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDone), false, url, Settings.Default.hb_build, Settings.Default.skipversion, Settings.Default.hb_version);\r
                 }\r
             }\r
 \r
+            // Clear the log files in the background\r
+            if (Settings.Default.clearOldLogs)\r
+            {\r
+                Thread clearLog = new Thread(Main.ClearOldLogs);\r
+                clearLog.Start();\r
+            }\r
+\r
             // Setup the GUI components\r
-            lblStatus.Text = "Setting up the GUI ...";\r
-            Application.DoEvents();\r
-            loadPresetPanel();                       // Load the Preset Panel\r
+            LoadPresetPanel(); // Load the Preset Panel\r
             treeView_presets.ExpandAll();\r
-            lbl_encode.Text = "";\r
-            queueWindow = new frmQueue(encodeQueue);        // Prepare the Queue\r
-            if (!Properties.Settings.Default.QueryEditorTab)\r
+            lbl_encode.Text = string.Empty;\r
+            drop_mode.SelectedIndex = 0;\r
+            queueWindow = new frmQueue(encodeQueue, this); // Prepare the Queue\r
+            if (!Settings.Default.QueryEditorTab)\r
                 tabs_panel.TabPages.RemoveAt(7); // Remove the query editor tab if the user does not want it enabled.\r
+            if (Settings.Default.tooltipEnable)\r
+                ToolTip.Active = true;\r
 \r
             // Load the user's default settings or Normal Preset\r
-            if (Properties.Settings.Default.defaultPreset != "")\r
+            if (Settings.Default.defaultPreset != string.Empty && presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)\r
             {\r
-                if (presetHandler.GetPreset(Properties.Settings.Default.defaultPreset) != null)\r
+                string query = presetHandler.GetPreset(Settings.Default.defaultPreset).Query;\r
+                if (query != null)\r
                 {\r
-                    string query = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).Query;\r
-                    Boolean loadPictureSettings = presetHandler.GetPreset(Properties.Settings.Default.defaultPreset).PictureSettings;\r
+                    x264Panel.Reset2Defaults();\r
 \r
-                    if (query != null)\r
-                    {\r
-                        //Ok, Reset all the H264 widgets before changing the preset\r
-                        x264Panel.reset2Defaults();\r
+                    QueryParser presetQuery = QueryParser.Parse(query);\r
+                    PresetLoader.LoadPreset(this, presetQuery, Settings.Default.defaultPreset);\r
 \r
-                        // Send the query from the file to the Query Parser class, then load the preset\r
-                        QueryParser presetQuery = QueryParser.Parse(query);\r
-                        PresetLoader.presetLoader(this, presetQuery, Properties.Settings.Default.defaultPreset, loadPictureSettings);\r
-\r
-                        // The x264 widgets will need updated, so do this now:\r
-                        x264Panel.X264_StandardizeOptString();\r
-                        x264Panel.X264_SetCurrentSettingsInPanel();\r
-                    }\r
+                    x264Panel.StandardizeOptString();\r
+                    x264Panel.SetCurrentSettingsInPanel();\r
                 }\r
-                else\r
-                    loadNormalPreset();\r
             }\r
             else\r
                 loadNormalPreset();\r
 \r
-            // Enabled GUI tooltip's if Required\r
-            if (Properties.Settings.Default.tooltipEnable)\r
-                ToolTip.Active = true;\r
-\r
             // Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything)\r
             GrowlCommunicator.Register();\r
 \r
-            //Finished Loading\r
-            lblStatus.Text = "Loading Complete!";\r
-            Application.DoEvents();\r
-            splash.Close();\r
-            splash.Dispose();\r
-            this.Enabled = true;\r
-\r
             // Event Handlers and Queue Recovery\r
             events();\r
-            queueRecovery();\r
+            Main.RecoverQueue(encodeQueue);\r
+\r
+            // If have a file passed in via command arguemtents, check it's a file and try scanning it.\r
+            if (args.Length >= 1 && (File.Exists(args[0]) || Directory.Exists(args[0])))\r
+            {\r
+                this.StartScan(args[0], 0);\r
+            }\r
         }\r
 \r
+        /// <summary>\r
+        /// When the update check is done, process the results.\r
+        /// </summary>\r
+        /// <param name="result">IAsyncResult result</param>\r
         private void UpdateCheckDone(IAsyncResult result)\r
         {\r
             if (InvokeRequired)\r
@@ -145,61 +202,27 @@ namespace Handbrake
                 return;\r
             }\r
 \r
-            UpdateCheckInformation info;\r
-\r
             try\r
             {\r
-                info = Main.EndCheckForUpdates(result);\r
+                UpdateCheckInformation info = UpdateService.EndCheckForUpdates(result);\r
 \r
                 if (info.NewVersionAvailable)\r
                 {\r
-                    frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
+                    UpdateInfo updateWindow = new UpdateInfo(info.BuildInformation, Settings.Default.hb_version, Settings.Default.hb_build.ToString());\r
                     updateWindow.ShowDialog();\r
                 }\r
             }\r
             catch (Exception ex)\r
             {\r
                 if ((bool)result.AsyncState)\r
-                    MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                    Main.ShowExceptiowWindow("Unable to check for updates, Please try again later.", ex.ToString());\r
             }\r
         }\r
 \r
-        // Startup Functions   \r
-        private void queueRecovery()\r
-        {\r
-            if (Main.checkQueueRecovery())\r
-            {\r
-                DialogResult result = MessageBox.Show("HandBrake has detected unfinished items on the queue from the last time the application was launched. Would you like to recover these?", "Queue Recovery Possible", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
-\r
-                if (result == DialogResult.Yes)\r
-                    encodeQueue.LoadQueueFromFile("hb_queue_recovery.xml"); // Start Recovery\r
-                else\r
-                {\r
-                    // Remove the Queue recovery file if the user doesn't want to recovery the last queue.\r
-                    string queuePath = Path.Combine(Path.GetTempPath(), "hb_queue_recovery.xml");\r
-                    if (File.Exists(queuePath))\r
-                        File.Delete(queuePath);\r
-                }\r
-            }\r
-        }\r
-        #endregion\r
-\r
-        #region Properties\r
-        public string SourceName\r
-        {\r
-            get\r
-            {\r
-                if (this.selectedSourceType == SourceType.DvdDrive)\r
-                {\r
-                    return this.dvdDriveLabel;\r
-                }\r
-\r
-                return Path.GetFileNameWithoutExtension(this.sourcePath);\r
-            }\r
-        }\r
         #endregion\r
 \r
         #region Events\r
+\r
         // Encoding Events for setting up the GUI\r
         private void events()\r
         {\r
@@ -211,9 +234,12 @@ namespace Handbrake
                 this.Resize += new EventHandler(frmMain_Resize);\r
 \r
             // Handle Encode Start / Finish / Pause\r
-            encodeQueue.CurrentJobCompleted += new EventHandler(encodeEnded);\r
-            encodeQueue.QueuePauseRequested += new EventHandler(encodePaused);\r
-            encodeQueue.NewJobStarted += new EventHandler(encodeStarted);\r
+            encodeQueue.EncodeStarted += new EventHandler(encodeStarted);\r
+            encodeQueue.EncodeEnded += new EventHandler(encodeEnded);\r
+\r
+            // Scan Started and Completed Events\r
+            SourceScan.ScanStatusChanged += new EventHandler(SourceScan_ScanStatusChanged);\r
+            SourceScan.ScanCompleted += new EventHandler(SourceScan_ScanCompleted);\r
 \r
             // Handle a file being draged onto the GUI.\r
             this.DragEnter += new DragEventHandler(frmMain_DragEnter);\r
@@ -230,7 +256,7 @@ namespace Handbrake
             check_optimiseMP4.CheckedChanged += new EventHandler(changePresetLabel);\r
 \r
             // Picture Settings\r
-            //PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);\r
+            PictureSettings.PictureSettingsChanged += new EventHandler(changePresetLabel);\r
 \r
             // Filter Settings\r
             Filters.FilterSettingsChanged += new EventHandler(changePresetLabel);\r
@@ -249,6 +275,7 @@ namespace Handbrake
             // Advanced Tab\r
             x264Panel.rtf_x264Query.TextChanged += new EventHandler(changePresetLabel);\r
         }\r
+\r
         private void UnRegisterPresetEventHandler()\r
         {\r
             // Output Settings \r
@@ -258,7 +285,7 @@ namespace Handbrake
             check_optimiseMP4.CheckedChanged -= new EventHandler(changePresetLabel);\r
 \r
             // Picture Settings\r
-            //PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);\r
+            PictureSettings.PictureSettingsChanged -= new EventHandler(changePresetLabel);\r
 \r
             // Filter Settings\r
             Filters.FilterSettingsChanged -= new EventHandler(changePresetLabel);\r
@@ -277,9 +304,11 @@ namespace Handbrake
             // Advanced Tab\r
             x264Panel.rtf_x264Query.TextChanged -= new EventHandler(changePresetLabel);\r
         }\r
+\r
         private void changePresetLabel(object sender, EventArgs e)\r
         {\r
             labelPreset.Text = "Output Settings (Preset: Custom)";\r
+            this.currentlySelectedPreset = null;\r
         }\r
 \r
         private static void frmMain_DragEnter(object sender, DragEventArgs e)\r
@@ -287,6 +316,7 @@ namespace Handbrake
             if (e.Data.GetDataPresent(DataFormats.FileDrop, false))\r
                 e.Effect = DragDropEffects.All;\r
         }\r
+\r
         private void frmMain_DragDrop(object sender, DragEventArgs e)\r
         {\r
             string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];\r
@@ -294,158 +324,261 @@ namespace Handbrake
 \r
             if (fileList != null)\r
             {\r
-                if (fileList[0].StartsWith("\\"))\r
+                if (!string.IsNullOrEmpty(fileList[0]))\r
                 {\r
-                    MessageBox.Show(\r
-                        "Sorry, HandBrake does not support UNC file paths. \nTry mounting the network share as a network drive in My Computer",\r
-                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-                    UpdateSourceLabel();\r
+                    this.selectedSourceType = SourceType.VideoFile;\r
+                    StartScan(fileList[0], 0);\r
                 }\r
                 else\r
-                {\r
-                    if (fileList[0] != "")\r
-                        startScan(fileList[0]);\r
-                    else\r
-                        UpdateSourceLabel();\r
-                }\r
+                    UpdateSourceLabel();\r
             }\r
             else\r
                 UpdateSourceLabel();\r
         }\r
+\r
         private void encodeStarted(object sender, EventArgs e)\r
         {\r
-            lastAction = "encode";\r
-            setEncodeStarted();\r
-\r
-            // Experimental HBProc Process Monitoring.\r
-            if (Properties.Settings.Default.enocdeStatusInGui)\r
-            {\r
-                Thread encodeMon = new Thread(encodeMonitorThread);\r
-                encodeMon.Start();\r
-            }\r
+            SetEncodeStarted();\r
+            encodeQueue.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;\r
         }\r
+\r
         private void encodeEnded(object sender, EventArgs e)\r
         {\r
-            setEncodeFinished();\r
-        }\r
-        private void encodePaused(object sender, EventArgs e)\r
-        {\r
-            setEncodeFinished();\r
+            encodeQueue.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;\r
+            SetEncodeFinished();\r
         }\r
         #endregion\r
 \r
         // User Interface Menus / Tool Strips *********************************\r
 \r
         #region File Menu\r
+\r
+        /// <summary>\r
+        /// Kill The scan menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_killCLI_Click(object sender, EventArgs e)\r
         {\r
-            killScan();\r
+            KillScan();\r
         }\r
+\r
+        /// <summary>\r
+        /// Exit the Application Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_exit_Click(object sender, EventArgs e)\r
         {\r
             Application.Exit();\r
         }\r
+\r
         #endregion\r
 \r
         #region Tools Menu\r
+\r
+        /// <summary>\r
+        /// Menu - Start Button\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_encode_Click(object sender, EventArgs e)\r
         {\r
             queueWindow.Show();\r
         }\r
+\r
+        /// <summary>\r
+        /// Menu - Display the Log Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_encodeLog_Click(object sender, EventArgs e)\r
         {\r
-            String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";\r
-\r
-            frmActivityWindow dvdInfoWindow = new frmActivityWindow(file, encodeQueue, this);\r
-            dvdInfoWindow.Show();\r
+            this.btn_ActivityWindow_Click(this, null);\r
         }\r
+\r
+        /// <summary>\r
+        /// Menu - Display the Options Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_options_Click(object sender, EventArgs e)\r
         {\r
             Form options = new frmOptions(this);\r
             options.ShowDialog();\r
         }\r
+\r
         #endregion\r
 \r
         #region Presets Menu\r
+\r
+        /// <summary>\r
+        /// Reset the Built in Presets\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_presetReset_Click(object sender, EventArgs e)\r
         {\r
             presetHandler.UpdateBuiltInPresets();\r
-            loadPresetPanel();\r
+            LoadPresetPanel();\r
             if (treeView_presets.Nodes.Count == 0)\r
-                MessageBox.Show("Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu. \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                MessageBox.Show(\r
+                    "Unable to load the presets.xml file. Please select \"Update Built-in Presets\" from the Presets Menu. \nMake sure you are running the program in Admin mode if running on Vista. See Windows FAQ for details!",\r
+                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             else\r
                 MessageBox.Show("Presets have been updated!", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
 \r
             treeView_presets.ExpandAll();\r
         }\r
+\r
+        /// <summary>\r
+        /// Delete the selected preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_delete_preset_Click(object sender, EventArgs e)\r
         {\r
             presetHandler.RemoveBuiltInPresets();\r
-            loadPresetPanel(); // Reload the preset panel\r
+            LoadPresetPanel(); // Reload the preset panel\r
         }\r
+\r
+        /// <summary>\r
+        /// Select the Normal preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_SelectDefault_Click(object sender, EventArgs e)\r
         {\r
             loadNormalPreset();\r
         }\r
+\r
+        /// <summary>\r
+        /// Import a plist Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_importMacPreset_Click(object sender, EventArgs e)\r
         {\r
-            importPreset();\r
+            ImportPreset();\r
         }\r
+\r
+        /// <summary>\r
+        /// Export a Plist Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void mnu_exportMacPreset_Click(object sender, EventArgs e)\r
+        {\r
+            ExportPreset();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Create a new Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_new_preset_Click(object sender, EventArgs e)\r
         {\r
-            Form preset = new frmAddPreset(this, queryGen.GenerateCLIQuery(this, 0, null), presetHandler);\r
-            preset.ShowDialog();\r
+            Form preset = new frmAddPreset(this, presetHandler);\r
+            if (preset.ShowDialog() == DialogResult.OK)\r
+            {\r
+                TreeNode presetTreeview = new TreeNode(presetHandler.LastPresetAdded.Name) { ForeColor = Color.Black };\r
+                treeView_presets.Nodes.Add(presetTreeview);\r
+                presetHandler.LastPresetAdded = null;\r
+            }\r
         }\r
+\r
         #endregion\r
 \r
         #region Help Menu\r
-        private void mnu_handbrake_forums_Click(object sender, EventArgs e)\r
-        {\r
-            Process.Start("http://forum.handbrake.fr/");\r
-        }\r
+\r
+        /// <summary>\r
+        /// Menu - Display the User Guide Web Page\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_user_guide_Click(object sender, EventArgs e)\r
         {\r
             Process.Start("http://trac.handbrake.fr/wiki/HandBrakeGuide");\r
         }\r
-        private void mnu_handbrake_home_Click(object sender, EventArgs e)\r
-        {\r
-            Process.Start("http://handbrake.fr");\r
-        }\r
+\r
+        /// <summary>\r
+        /// Menu - Check for Updates\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_UpdateCheck_Click(object sender, EventArgs e)\r
         {\r
             lbl_updateCheck.Visible = true;\r
-            Main.BeginCheckForUpdates(new AsyncCallback(updateCheckDoneMenu), false);\r
+            Settings.Default.lastUpdateCheckDate = DateTime.Now;\r
+            Settings.Default.Save();\r
+            string url = Settings.Default.hb_build.ToString().EndsWith("1")\r
+                                                  ? Settings.Default.appcast_unstable\r
+                                                  : Settings.Default.appcast;\r
+            UpdateService.BeginCheckForUpdates(new AsyncCallback(UpdateCheckDoneMenu), false, url, Settings.Default.hb_build, Settings.Default.skipversion, Settings.Default.hb_version);\r
         }\r
-        private void updateCheckDoneMenu(IAsyncResult result)\r
-        {\r
-            // Make sure it's running on the calling thread\r
-            if (InvokeRequired)\r
-            {\r
-                Invoke(new MethodInvoker(() => updateCheckDoneMenu(result)));\r
-                return;\r
-            }\r
-            UpdateCheckInformation info;\r
-            try\r
-            {\r
-                // Get the information about the new build, if any, and close the window\r
-                info = Main.EndCheckForUpdates(result);\r
 \r
-                if (info.NewVersionAvailable && info.BuildInformation != null)\r
-                {\r
-                    frmUpdater updateWindow = new frmUpdater(info.BuildInformation);\r
-                    updateWindow.ShowDialog();\r
-                }\r
-                else\r
-                    MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
-                lbl_updateCheck.Visible = false;\r
-                return;\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                if ((bool)result.AsyncState)\r
-                    MessageBox.Show("Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-            }\r
-        }\r
+        /// <summary>\r
+        /// Menu - Display the About Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void mnu_about_Click(object sender, EventArgs e)\r
         {\r
             using (frmAbout About = new frmAbout())\r
@@ -453,30 +586,87 @@ namespace Handbrake
                 About.ShowDialog();\r
             }\r
         }\r
+\r
         #endregion\r
 \r
         #region Preset Bar\r
-        // Right Click Menu Code\r
+\r
+        /// <summary>\r
+        /// RMenu - Expand All\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void pmnu_expandAll_Click(object sender, EventArgs e)\r
         {\r
             treeView_presets.ExpandAll();\r
         }\r
+\r
+        /// <summary>\r
+        /// RMenu - Collaspe All\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void pmnu_collapse_Click(object sender, EventArgs e)\r
         {\r
             treeView_presets.CollapseAll();\r
         }\r
+\r
+        /// <summary>\r
+        /// Menu - Import Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void pmnu_import_Click(object sender, EventArgs e)\r
         {\r
-            importPreset();\r
+            ImportPreset();\r
         }\r
+\r
+        /// <summary>\r
+        /// RMenu - Save Changes to Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void pmnu_saveChanges_Click(object sender, EventArgs e)\r
         {\r
-            DialogResult result = MessageBox.Show("Do you wish to include picture settings when updating the preset: " + treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);\r
+            // TODO this requires a re-think since the Query Editor has changed.\r
+            DialogResult result =\r
+                MessageBox.Show(\r
+                    "Do you wish to include picture settings when updating the preset: " +\r
+                    treeView_presets.SelectedNode.Text, "Update Preset", MessageBoxButtons.YesNoCancel,\r
+                    MessageBoxIcon.Question);\r
             if (result == DialogResult.Yes)\r
-                presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), true);\r
+                presetHandler.Update(treeView_presets.SelectedNode.Text,\r
+                                     QueryGenerator.GenerateQueryForPreset(this, QueryPictureSettingsMode.SourceMaximum, true, 0, 0), true);\r
             else if (result == DialogResult.No)\r
-                presetHandler.Update(treeView_presets.SelectedNode.Text, QueryGenerator.GenerateTabbedComponentsQuery(this), false);\r
+                presetHandler.Update(treeView_presets.SelectedNode.Text,\r
+                                     QueryGenerator.GenerateQueryForPreset(this, QueryPictureSettingsMode.SourceMaximum, true, 0, 0), false);\r
         }\r
+\r
+        /// <summary>\r
+        /// RMenu - Delete Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void pmnu_delete_click(object sender, EventArgs e)\r
         {\r
             if (treeView_presets.SelectedNode != null)\r
@@ -486,7 +676,17 @@ namespace Handbrake
             }\r
             treeView_presets.Select();\r
         }\r
-        private void presets_menu_Opening(object sender, System.ComponentModel.CancelEventArgs e)\r
+\r
+        /// <summary>\r
+        /// Preset Menu Is Opening. Setup the Menu\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void presets_menu_Opening(object sender, CancelEventArgs e)\r
         {\r
             // Make sure that the save menu is always disabled by default\r
             pmnu_saveChanges.Enabled = false;\r
@@ -500,14 +700,40 @@ namespace Handbrake
         }\r
 \r
         // Presets Management\r
+\r
+        /// <summary>\r
+        /// Button - Add a preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_addPreset_Click(object sender, EventArgs e)\r
         {\r
-            Form preset = new frmAddPreset(this, QueryGenerator.GenerateTabbedComponentsQuery(this), presetHandler);\r
-            preset.ShowDialog();\r
+            Form preset = new frmAddPreset(this, presetHandler);\r
+            if (preset.ShowDialog() == DialogResult.OK)\r
+            {\r
+                TreeNode presetTreeview = new TreeNode(presetHandler.LastPresetAdded.Name) { ForeColor = Color.Black };\r
+                treeView_presets.Nodes.Add(presetTreeview);\r
+                presetHandler.LastPresetAdded = null;\r
+            }\r
         }\r
+\r
+        /// <summary>\r
+        /// Button - remove a Preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_removePreset_Click(object sender, EventArgs e)\r
         {\r
-            DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+            DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset",\r
+                                                  MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
             if (result == DialogResult.Yes)\r
             {\r
                 if (treeView_presets.SelectedNode != null)\r
@@ -518,11 +744,22 @@ namespace Handbrake
             }\r
             treeView_presets.Select();\r
         }\r
+\r
+        /// <summary>\r
+        /// Button - Set the selected preset as the default\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_setDefault_Click(object sender, EventArgs e)\r
         {\r
             if (treeView_presets.SelectedNode != null)\r
             {\r
-                DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+                DialogResult result = MessageBox.Show("Are you sure you wish to set this preset as the default?",\r
+                                                      "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
                 if (result == DialogResult.Yes)\r
                 {\r
                     Properties.Settings.Default.defaultPreset = treeView_presets.SelectedNode.Text;\r
@@ -533,6 +770,16 @@ namespace Handbrake
             else\r
                 MessageBox.Show("Please select a preset first.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
         }\r
+\r
+        /// <summary>\r
+        /// PresetBar Mouse Down event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void treeview_presets_mouseUp(object sender, MouseEventArgs e)\r
         {\r
             if (e.Button == MouseButtons.Right)\r
@@ -548,27 +795,71 @@ namespace Handbrake
 \r
             treeView_presets.Select();\r
         }\r
+\r
+        /// <summary>\r
+        /// Preset Bar after selecting the preset\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void treeView_presets_AfterSelect(object sender, TreeViewEventArgs e)\r
         {\r
             selectPreset();\r
         }\r
+\r
+        /// <summary>\r
+        /// When the mouse moves, display a preset\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">the MouseEventArgs</param>\r
+        private void TreeViewPresetsMouseMove(object sender, MouseEventArgs e)\r
+        {\r
+            TreeNode theNode = this.treeView_presets.GetNodeAt(e.X, e.Y);\r
+\r
+            if ((theNode != null))\r
+            {\r
+                // Change the ToolTip only if the pointer moved to a new node.\r
+                if (theNode.ToolTipText != this.ToolTip.GetToolTip(this.treeView_presets))\r
+                {\r
+                    this.ToolTip.SetToolTip(this.treeView_presets, theNode.ToolTipText);\r
+                }\r
+            }\r
+            else     // Pointer is not over a node so clear the ToolTip.\r
+            {\r
+                this.ToolTip.SetToolTip(this.treeView_presets, string.Empty);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Preset Bar - Handle the Delete Key\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void treeView_presets_deleteKey(object sender, KeyEventArgs e)\r
         {\r
             if (e.KeyCode == Keys.Delete)\r
             {\r
-                DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+                DialogResult result = MessageBox.Show("Are you sure you wish to delete the selected preset?", "Preset",\r
+                                                      MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
                 if (result == DialogResult.Yes)\r
                 {\r
                     if (treeView_presets.SelectedNode != null)\r
                         presetHandler.Remove(treeView_presets.SelectedNode.Text);\r
 \r
                     // Remember each nodes expanded status so we can reload it\r
-                    List<Boolean> nodeStatus = new List<Boolean>();\r
+                    List<bool> nodeStatus = new List<bool>();\r
                     foreach (TreeNode node in treeView_presets.Nodes)\r
                         nodeStatus.Add(node.IsExpanded);\r
 \r
                     // Now reload the preset panel\r
-                    loadPresetPanel();\r
+                    LoadPresetPanel();\r
 \r
                     // And finally, re-expand any of the nodes if required\r
                     int i = 0;\r
@@ -582,35 +873,47 @@ namespace Handbrake
                 }\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// Select the selected preset and setup the GUI\r
+        /// </summary>\r
         private void selectPreset()\r
         {\r
             if (treeView_presets.SelectedNode != null)\r
             {\r
                 // Ok, so, we've selected a preset. Now we want to load it.\r
                 string presetName = treeView_presets.SelectedNode.Text;\r
-                if (presetHandler.GetPreset(presetName) != null)\r
+                Preset preset = presetHandler.GetPreset(presetName);\r
+                if (preset != null)\r
                 {\r
                     string query = presetHandler.GetPreset(presetName).Query;\r
-                    Boolean loadPictureSettings = presetHandler.GetPreset(presetName).PictureSettings;\r
 \r
                     if (query != null)\r
                     {\r
-                        //Ok, Reset all the H264 widgets before changing the preset\r
-                        x264Panel.reset2Defaults();\r
+                        // Ok, Reset all the H264 widgets before changing the preset\r
+                        x264Panel.Reset2Defaults();\r
 \r
                         // Send the query from the file to the Query Parser class\r
                         QueryParser presetQuery = QueryParser.Parse(query);\r
 \r
                         // Now load the preset\r
-                        PresetLoader.presetLoader(this, presetQuery, presetName, loadPictureSettings);\r
+                        PresetLoader.LoadPreset(this, presetQuery, presetName);\r
 \r
                         // The x264 widgets will need updated, so do this now:\r
-                        x264Panel.X264_StandardizeOptString();\r
-                        x264Panel.X264_SetCurrentSettingsInPanel();\r
+                        x264Panel.StandardizeOptString();\r
+                        x264Panel.SetCurrentSettingsInPanel();\r
+\r
+                        // Finally, let this window have a copy of the preset settings.\r
+                        this.currentlySelectedPreset = preset;\r
+                        PictureSettings.SetPresetCropWarningLabel(preset);\r
                     }\r
                 }\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// Load the Normal Preset\r
+        /// </summary>\r
         private void loadNormalPreset()\r
         {\r
             foreach (TreeNode treenode in treeView_presets.Nodes)\r
@@ -622,83 +925,162 @@ namespace Handbrake
                 }\r
             }\r
         }\r
-        private void importPreset()\r
+\r
+        /// <summary>\r
+        /// Import a plist preset\r
+        /// </summary>\r
+        private void ImportPreset()\r
         {\r
-            Import imp = new Import();\r
             if (openPreset.ShowDialog() == DialogResult.OK)\r
             {\r
-                QueryParser parsed = imp.importMacPreset(openPreset.FileName);\r
+                QueryParser parsed = PlistPresetHandler.Import(openPreset.FileName);\r
                 if (presetHandler.CheckIfUserPresetExists(parsed.PresetName + " (Imported)"))\r
                 {\r
-                    DialogResult result = MessageBox.Show("This preset appears to already exist. Would you like to overwrite it?", "Overwrite preset?",\r
-                                                           MessageBoxButtons.YesNo, MessageBoxIcon.Warning);\r
+                    DialogResult result =\r
+                        MessageBox.Show("This preset appears to already exist. Would you like to overwrite it?",\r
+                                        "Overwrite preset?",\r
+                                        MessageBoxButtons.YesNo, MessageBoxIcon.Warning);\r
                     if (result == DialogResult.Yes)\r
                     {\r
-                        PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);\r
-                        presetHandler.Update(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null),\r
-                                                   parsed.UsesPictureSettings);\r
+                        PresetLoader.LoadPreset(this, parsed, parsed.PresetName);\r
+                        presetHandler.Update(parsed.PresetName + " (Imported)",\r
+                                             QueryGenerator.GenerateFullQuery(this),\r
+                                             parsed.UsesPictureSettings);\r
                     }\r
                 }\r
                 else\r
                 {\r
-                    PresetLoader.presetLoader(this, parsed, parsed.PresetName, parsed.UsesPictureSettings);\r
-                    presetHandler.Add(parsed.PresetName, queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings);\r
-\r
-                    if (presetHandler.Add(parsed.PresetName + " (Imported)", queryGen.GenerateCLIQuery(this, 0, null), parsed.UsesPictureSettings))\r
+                    PresetLoader.LoadPreset(this, parsed, parsed.PresetName);\r
+                    if (presetHandler.Add(parsed.PresetName + " (Imported)",\r
+                                          QueryGenerator.GenerateFullQuery(this),\r
+                                          parsed.UsesPictureSettings, string.Empty))\r
                     {\r
-                        TreeNode preset_treeview = new TreeNode(parsed.PresetName + " (Imported)") { ForeColor = Color.Black };\r
+                        TreeNode preset_treeview = new TreeNode(parsed.PresetName + " (Imported)")\r
+                                                       {\r
+                                                           ForeColor = Color.Black\r
+                                                       };\r
                         treeView_presets.Nodes.Add(preset_treeview);\r
                     }\r
                 }\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// Export a plist Preset\r
+        /// </summary>\r
+        private void ExportPreset()\r
+        {\r
+            SaveFileDialog savefiledialog = new SaveFileDialog { Filter = "plist|*.plist" };\r
+\r
+            if (treeView_presets.SelectedNode != null)\r
+            {\r
+                if (savefiledialog.ShowDialog() == DialogResult.OK)\r
+                {\r
+                    Preset preset = presetHandler.GetPreset(treeView_presets.SelectedNode.Text);\r
+                    PlistPresetHandler.Export(savefiledialog.FileName, preset);\r
+                }\r
+            }\r
+        }\r
+\r
         #endregion\r
 \r
         #region ToolStrip\r
+\r
+        /// <summary>\r
+        /// Toolbar - When the Source button is clicked, Clear any DVD drives and add any available DVD drives that can be used as a source.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_source_Click(object sender, EventArgs e)\r
         {\r
-            mnu_dvd_drive.Visible = true;\r
-            Thread driveInfoThread = new Thread(getDriveInfoThread);\r
+            // Remove old Drive Menu Items.\r
+            List<ToolStripMenuItem> itemsToRemove = new List<ToolStripMenuItem>();\r
+            foreach (var item in btn_source.DropDownItems)\r
+            {\r
+                if (item.GetType() == typeof(ToolStripMenuItem))\r
+                {\r
+                    ToolStripMenuItem menuItem = (ToolStripMenuItem)item;\r
+                    if (menuItem.Name.StartsWith("Drive"))\r
+                    {\r
+                        itemsToRemove.Add(menuItem);\r
+                    }\r
+                }\r
+            }\r
+\r
+            foreach (ToolStripMenuItem item in itemsToRemove)\r
+                btn_source.DropDownItems.Remove(item);\r
+\r
+            Thread driveInfoThread = new Thread(SetDriveSelectionMenuItem);\r
             driveInfoThread.Start();\r
         }\r
+\r
+        /// <summary>\r
+        /// Toolbar - Start The Encode\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_start_Click(object sender, EventArgs e)\r
         {\r
             if (btn_start.Text == "Stop")\r
             {\r
-                DialogResult result = MessageBox.Show("Are you sure you wish to cancel the encode?", "Cancel Encode?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+                DialogResult result = !Properties.Settings.Default.showCliForInGuiEncodeStatus\r
+                             ? MessageBox.Show(\r
+                                 "Are you sure you wish to cancel the encode?\n\nPlease note: Stopping this encode will render the file unplayable. ",\r
+                                 "Cancel Encode?",\r
+                                 MessageBoxButtons.YesNo,\r
+                                 MessageBoxIcon.Question)\r
+                             : MessageBox.Show(\r
+                                 "Are you sure you wish to cancel the encode?",\r
+                                 "Cancel Encode?",\r
+                                 MessageBoxButtons.YesNo,\r
+                                 MessageBoxIcon.Question);\r
 \r
                 if (result == DialogResult.Yes)\r
                 {\r
                     // Pause The Queue\r
-                    encodeQueue.RequestPause();\r
-\r
-                    // Allow the CLI to exit cleanly\r
-                    Win32.SetForegroundWindow((int)encodeQueue.processHandle);\r
-                    SendKeys.Send("^C");\r
+                    encodeQueue.Pause();\r
 \r
-                    // Update the GUI\r
-                    setEncodeFinished();\r
+                    if (Settings.Default.showCliForInGuiEncodeStatus)\r
+                        encodeQueue.SafelyClose();\r
+                    else\r
+                        encodeQueue.Stop();\r
                 }\r
             }\r
             else\r
             {\r
-                if (encodeQueue.Count != 0 || (!string.IsNullOrEmpty(sourcePath) && !string.IsNullOrEmpty(text_destination.Text)))\r
+                // If we have a custom query, then we'll want to figure out what the new source and destination is, otherwise we'll just use the gui components.\r
+                string jobSourcePath = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetSourceFromQuery(rtf_query.Text) : sourcePath;\r
+                string jobDestination = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetDestinationFromQuery(rtf_query.Text) : text_destination.Text;\r
+\r
+                if (encodeQueue.Count != 0 || (!string.IsNullOrEmpty(jobSourcePath) && !string.IsNullOrEmpty(jobDestination)))\r
                 {\r
-                    string generatedQuery = queryGen.GenerateCLIQuery(this, 0, null);\r
-                    string specifiedQuery = rtf_query.Text != "" ? rtf_query.Text : queryGen.GenerateCLIQuery(this, 0, null);\r
+                    string generatedQuery = QueryGenerator.GenerateFullQuery(this);\r
+                    string specifiedQuery = rtf_query.Text != string.Empty\r
+                                                ? rtf_query.Text\r
+                                                : QueryGenerator.GenerateFullQuery(this);\r
                     string query = string.Empty;\r
 \r
                     // Check to make sure the generated query matches the GUI settings\r
-                    if (Properties.Settings.Default.PromptOnUnmatchingQueries && !string.IsNullOrEmpty(specifiedQuery) && generatedQuery != specifiedQuery)\r
+                    if (Properties.Settings.Default.PromptOnUnmatchingQueries && !string.IsNullOrEmpty(specifiedQuery) &&\r
+                        generatedQuery != specifiedQuery)\r
                     {\r
                         DialogResult result = MessageBox.Show("The query under the \"Query Editor\" tab " +\r
-                            "does not match the current GUI settings.\n\nBecause the manual query takes " +\r
-                            "priority over the GUI, your recently updated settings will not be taken " +\r
-                            "into account when encoding this job." + Environment.NewLine + Environment.NewLine +\r
-                            "Do you want to replace the manual query with the updated GUI-generated query?",\r
-                            "Manual Query does not Match GUI",\r
-                            MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk,\r
-                            MessageBoxDefaultButton.Button3);\r
+                                                              "does not match the current GUI settings.\n\nBecause the manual query takes " +\r
+                                                              "priority over the GUI, your recently updated settings will not be taken " +\r
+                                                              "into account when encoding this job." +\r
+                                                              Environment.NewLine + Environment.NewLine +\r
+                                                              "Do you want to replace the manual query with the updated GUI-generated query?",\r
+                                                              "Manual Query does not Match GUI",\r
+                                                              MessageBoxButtons.YesNoCancel, MessageBoxIcon.Asterisk,\r
+                                                              MessageBoxDefaultButton.Button3);\r
 \r
                         switch (result)\r
                         {\r
@@ -722,68 +1104,189 @@ namespace Handbrake
                     }\r
 \r
                     DialogResult overwrite = DialogResult.Yes;\r
-                    if (text_destination.Text != "")\r
-                        if (File.Exists(text_destination.Text))\r
-                            overwrite = MessageBox.Show("The destination file already exists. Are you sure you want to overwrite it?", "Overwrite File?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
+                    if (!string.IsNullOrEmpty(jobDestination) && File.Exists(jobDestination))\r
+                    {\r
+                        overwrite = MessageBox.Show(\r
+                                "The destination file already exists. Are you sure you want to overwrite it?",\r
+                                "Overwrite File?",\r
+                                MessageBoxButtons.YesNo,\r
+                                MessageBoxIcon.Question);\r
+                    }\r
 \r
                     if (overwrite == DialogResult.Yes)\r
                     {\r
                         if (encodeQueue.Count == 0)\r
-                            encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
+                            encodeQueue.Add(query, this.GetTitle(), jobSourcePath, jobDestination, (rtf_query.Text != string.Empty));\r
 \r
-                        queueWindow.setQueue();\r
+                        queueWindow.SetQueue();\r
                         if (encodeQueue.Count > 1)\r
                             queueWindow.Show(false);\r
 \r
-                        setEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
-                        encodeQueue.StartEncodeQueue(); // Start The Queue Encoding Process\r
-                        lastAction = "encode";   // Set the last action to encode - Used for activity window.\r
-\r
-                        if (ActivityWindow != null)\r
-                            ActivityWindow.SetLogView(false);\r
-\r
+                        SetEncodeStarted(); // Encode is running, so setup the GUI appropriately\r
+                        encodeQueue.Start(); // Start The Queue Encoding Process\r
                     }\r
+\r
                     this.Focus();\r
                 }\r
                 else if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
-                    MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK,\r
+                                    MessageBoxIcon.Warning);\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// Toolbar - Add the current job to the Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_add2Queue_Click(object sender, EventArgs e)\r
         {\r
-            if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
-                MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-            else\r
+            // Add the item to the queue.\r
+            AddItemToQueue(true);\r
+            queueWindow.Show();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Add Multiple Items to the Queue at once.\r
+        /// </summary>\r
+        /// <param name="sender">The Sender</param>\r
+        /// <param name="e">The EventArgs</param>\r
+        private void MnuAddMultiToQueueClick(object sender, EventArgs e)\r
+        {\r
+            if (!Settings.Default.autoNaming)\r
             {\r
-                String query = queryGen.GenerateCLIQuery(this, 0, null);\r
-                if (rtf_query.Text != "")\r
-                    query = rtf_query.Text;\r
+                MessageBox.Show("Destination Auto Naming must be enabled in preferences for this feature to work.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                return;\r
+            }\r
+\r
+            if (this.SourceScan.SouceData == null)\r
+            {\r
+                MessageBox.Show("You must first scan a source or collection of source to use this feature.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                return;\r
+            }\r
 \r
-                if (encodeQueue.CheckForDestinationDuplicate(text_destination.Text))\r
+            BatchAdd batchAdd = new BatchAdd();\r
+            if (batchAdd.ShowDialog() == DialogResult.OK)\r
+            {\r
+                int min = batchAdd.Min;\r
+                int max = batchAdd.Max;\r
+                bool errors = false;\r
+\r
+                foreach (Title title in this.SourceScan.SouceData.Titles)\r
                 {\r
-                    DialogResult result = MessageBox.Show("There is already a queue item for this destination path. \n\n If you continue, the encode will be overwritten. Do you wish to continue?",\r
-                  "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);\r
-                    if (result == DialogResult.Yes)\r
-                        encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
+                    if (title.Duration.TotalMinutes > min && title.Duration.TotalMinutes < max)\r
+                    {\r
+                        // Add to Queue\r
+                        this.drp_dvdtitle.SelectedItem = title;\r
 \r
+                        if (!this.AddItemToQueue(false))\r
+                        {\r
+                            errors = true;\r
+                        }\r
+                    }\r
                 }\r
-                else\r
-                    encodeQueue.AddJob(query, sourcePath, text_destination.Text, (rtf_query.Text != ""));\r
 \r
-                lbl_encode.Text = encodeQueue.Count + " encode(s) pending in the queue";\r
+                if (errors)\r
+                {\r
+                    MessageBox.Show(\r
+                        "One or more items could not be added to the queue. You should check your queue and manually add any missing jobs.",\r
+                        "Warning",\r
+                        MessageBoxButtons.OK,\r
+                        MessageBoxIcon.Warning);\r
+                }\r
+            }\r
+        }\r
+\r
+        private bool AddItemToQueue(bool showError)\r
+        {\r
+            string query = QueryGenerator.GenerateFullQuery(this);\r
+            if (!string.IsNullOrEmpty(rtf_query.Text))\r
+                query = rtf_query.Text;\r
+\r
+            // If we have a custom query, then we'll want to figure out what the new source and destination is, otherwise we'll just use the gui components.\r
+            string jobSourcePath = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetSourceFromQuery(rtf_query.Text) : sourcePath;\r
+            string jobDestination = !string.IsNullOrEmpty(rtf_query.Text) ? Main.GetDestinationFromQuery(rtf_query.Text) : text_destination.Text;\r
+\r
+            // Make sure we have a Source and Destination.\r
+            if (string.IsNullOrEmpty(jobSourcePath) || string.IsNullOrEmpty(jobDestination))\r
+            {\r
+                if (showError)\r
+                    MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                return false;\r
+            }\r
 \r
-                queueWindow.Show();\r
+            // Make sure the destination path exists.\r
+            if (!Directory.Exists(Path.GetDirectoryName(jobDestination)))\r
+            {\r
+                if (showError)\r
+                    MessageBox.Show(string.Format("Destination Path does not exist.\nPath: {0}\n\nThis item was not added to the Queue.", Path.GetDirectoryName(jobDestination)), "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                return false;\r
+            }\r
+\r
+            // Make sure we don't have a duplciate on the queue.\r
+            if (encodeQueue.CheckForDestinationDuplicate(jobDestination))\r
+            {\r
+                if (showError)\r
+                {\r
+                    DialogResult result;\r
+                    result =\r
+                        MessageBox.Show(\r
+                            string.Format(\r
+                                "There is already a queue item for this destination path.\nDestination Path: {0} \n\nIf you continue, the encode will be overwritten. Do you wish to continue?",\r
+                                jobDestination),\r
+                            "Warning",\r
+                            MessageBoxButtons.YesNo,\r
+                            MessageBoxIcon.Warning);\r
+\r
+                    if (result != DialogResult.Yes) return false;\r
+                }\r
+                else\r
+                {\r
+                    return false;\r
+                }\r
             }\r
+\r
+            // Add the job.\r
+            encodeQueue.Add(query, this.GetTitle(), jobSourcePath, jobDestination, (rtf_query.Text != string.Empty));\r
+\r
+            lbl_encode.Text = encodeQueue.Count + " encode(s) pending in the queue";\r
+\r
+            return true;\r
         }\r
+\r
+        /// <summary>\r
+        /// Toolbar - Show the Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_showQueue_Click(object sender, EventArgs e)\r
         {\r
             queueWindow.Show();\r
             queueWindow.Activate();\r
         }\r
+\r
+        /// <summary>\r
+        /// Toolbar - Show the Preview Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void tb_preview_Click(object sender, EventArgs e)\r
         {\r
             if (string.IsNullOrEmpty(sourcePath) || string.IsNullOrEmpty(text_destination.Text))\r
-                MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                MessageBox.Show("No source or destination selected.", "Warning", MessageBoxButtons.OK,\r
+                                MessageBoxIcon.Warning);\r
             else\r
             {\r
                 if (qtpreview == null)\r
@@ -797,22 +1300,42 @@ namespace Handbrake
                     qtpreview.Show();\r
                 }\r
                 else\r
-                    MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    MessageBox.Show(qtpreview, "The preview window is already open!", "Warning", MessageBoxButtons.OK,\r
+                                    MessageBoxIcon.Warning);\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// Toolbar - Show the Activity log Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_ActivityWindow_Click(object sender, EventArgs e)\r
         {\r
-            String file = lastAction == "scan" ? "last_scan_log.txt" : "last_encode_log.txt";\r
-            if (ActivityWindow == null)\r
-                ActivityWindow = new frmActivityWindow(file, encodeQueue, this);\r
-\r
-            ActivityWindow.SetLogView(!encodeQueue.isEncoding);\r
+            if (this.activityWindow == null || !this.activityWindow.IsHandleCreated)\r
+                this.activityWindow = new frmActivityWindow(encodeQueue, SourceScan);\r
 \r
-            ActivityWindow.Show();\r
+            this.activityWindow.Show();\r
+            this.activityWindow.Activate();\r
         }\r
+\r
         #endregion\r
 \r
         #region System Tray Icon\r
+\r
+        /// <summary>\r
+        /// Handle Resizing of the main window when deaing with the Notify Icon\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void frmMain_Resize(object sender, EventArgs e)\r
         {\r
             if (FormWindowState.Minimized == this.WindowState)\r
@@ -823,6 +1346,16 @@ namespace Handbrake
             else if (FormWindowState.Normal == this.WindowState)\r
                 notifyIcon.Visible = false;\r
         }\r
+\r
+        /// <summary>\r
+        /// Double Click the Tray Icon\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)\r
         {\r
             this.Visible = true;\r
@@ -830,6 +1363,16 @@ namespace Handbrake
             this.WindowState = FormWindowState.Normal;\r
             notifyIcon.Visible = false;\r
         }\r
+\r
+        /// <summary>\r
+        /// Tray Icon - Restore Menu Item - Resture the Window\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_restore_Click(object sender, EventArgs e)\r
         {\r
             this.Visible = true;\r
@@ -837,81 +1380,132 @@ namespace Handbrake
             this.WindowState = FormWindowState.Normal;\r
             notifyIcon.Visible = false;\r
         }\r
+\r
         #endregion\r
 \r
-        #region Tab Control\r
+        #region Main Window and Tab Control\r
 \r
-        //Source\r
-        private void btn_dvd_source_Click(object sender, EventArgs e)\r
+        // Source\r
+        private void BtnFolderScanClicked(object sender, EventArgs e)\r
         {\r
+            this.btn_source.HideDropDown();\r
             if (DVD_Open.ShowDialog() == DialogResult.OK)\r
             {\r
                 this.selectedSourceType = SourceType.Folder;\r
-                selectSource(DVD_Open.SelectedPath);\r
+                SelectSource(DVD_Open.SelectedPath, 0);\r
             }\r
             else\r
                 UpdateSourceLabel();\r
         }\r
-        private void btn_file_source_Click(object sender, EventArgs e)\r
+\r
+        private void BtnFileScanClicked(object sender, EventArgs e)\r
         {\r
+            this.btn_source.HideDropDown();\r
             if (ISO_Open.ShowDialog() == DialogResult.OK)\r
             {\r
                 this.selectedSourceType = SourceType.VideoFile;\r
-                selectSource(ISO_Open.FileName);\r
+                SelectSource(ISO_Open.FileName, 0);\r
             }\r
             else\r
                 UpdateSourceLabel();\r
         }\r
-        private void mnu_dvd_drive_Click(object sender, EventArgs e)\r
+\r
+        private void MnuDvdDriveClick(object sender, EventArgs e)\r
         {\r
-            if (this.dvdDrivePath == null) return;\r
-            this.selectedSourceType = SourceType.DvdDrive;\r
-            selectSource(this.dvdDrivePath);\r
+            ToolStripMenuItem item = sender as ToolStripMenuItem;\r
+            if (item != null)\r
+            {\r
+                string driveId = item.Name.Replace("Drive", string.Empty);\r
+                int id;\r
+                if (int.TryParse(driveId, out id))\r
+                {\r
+                    this.dvdDrivePath = drives[id].RootDirectory;\r
+                    this.dvdDriveLabel = drives[id].VolumeLabel;\r
+\r
+                    if (this.dvdDrivePath == null) return;\r
+                    this.selectedSourceType = SourceType.DvdDrive;\r
+                    SelectSource(this.dvdDrivePath, 0);\r
+                }\r
+            }\r
         }\r
-        private void selectSource(string file)\r
-        {\r
-            Check_ChapterMarkers.Enabled = true;\r
-            lastAction = "scan";\r
-            sourcePath = string.Empty;\r
 \r
-            if (file == string.Empty) // Must have a file or path\r
+        private void VideoTitleSpecificScanClick(object sender, EventArgs e)\r
+        {\r
+            this.btn_source.HideDropDown();\r
+            if (ISO_Open.ShowDialog() == DialogResult.OK)\r
             {\r
+                this.selectedSourceType = SourceType.VideoFile;\r
+\r
+                int sourceTitle = 0;\r
+                TitleSpecificScan title = new TitleSpecificScan();\r
+                if (title.ShowDialog() == DialogResult.OK)\r
+                {\r
+                    sourceTitle = title.Title;\r
+                    SelectSource(ISO_Open.FileName, sourceTitle);\r
+                }\r
+            }\r
+            else\r
                 UpdateSourceLabel();\r
-                return;\r
+        }\r
+\r
+        private void FolderTitleSpecificScanClick(object sender, EventArgs e)\r
+        {\r
+            this.btn_source.HideDropDown();\r
+            if (DVD_Open.ShowDialog() == DialogResult.OK)\r
+            {\r
+                this.selectedSourceType = SourceType.Folder;\r
+\r
+                int sourceTitle = 0;\r
+                TitleSpecificScan title = new TitleSpecificScan();\r
+                if (title.ShowDialog() == DialogResult.OK)\r
+                {\r
+                    sourceTitle = title.Title;\r
+                    SelectSource(DVD_Open.SelectedPath, sourceTitle);\r
+                }\r
             }\r
+            else\r
+                UpdateSourceLabel();\r
+        }\r
+\r
+        private void SelectSource(string file, int titleSpecific)\r
+        {\r
+            Check_ChapterMarkers.Enabled = true;\r
+            sourcePath = string.Empty;\r
 \r
-            if (file.StartsWith("\\")) // NO UNC Paths\r
+            if (file == string.Empty) // Must have a file or path\r
             {\r
-                MessageBox.Show(\r
-                    "Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer",\r
-                    "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
                 UpdateSourceLabel();\r
                 return;\r
             }\r
 \r
             sourcePath = Path.GetFileName(file);\r
-            startScan(file);\r
+            StartScan(file, titleSpecific);\r
         }\r
+\r
         private void drp_dvdtitle_Click(object sender, EventArgs e)\r
         {\r
             if ((drp_dvdtitle.Items.Count == 1) && (drp_dvdtitle.Items[0].ToString() == "Automatic"))\r
-                MessageBox.Show("There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.", "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
+                MessageBox.Show(\r
+                    "There are no titles to select. Please load a source file by clicking the 'Source' button above before trying to select a title.",\r
+                    "Alert", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);\r
         }\r
+\r
         private void drp_dvdtitle_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             UnRegisterPresetEventHandler();\r
+            drop_mode.SelectedIndex = 0;\r
 \r
-            PictureSettings.lbl_Aspect.Text = "Select a Title"; // Reset some values on the form\r
             drop_chapterStart.Items.Clear();\r
             drop_chapterFinish.Items.Clear();\r
 \r
             // If the dropdown is set to automatic nothing else needs to be done.\r
-            // Otheriwse if its not, title data has to be loased from parsing.\r
+            // Otheriwse if its not, title data has to be loaded from parsing.\r
             if (drp_dvdtitle.Text != "Automatic")\r
             {\r
                 selectedTitle = drp_dvdtitle.SelectedItem as Title;\r
                 lbl_duration.Text = selectedTitle.Duration.ToString();\r
-                PictureSettings.Source = selectedTitle;  // Setup Picture Settings Tab Control\r
+                PictureSettings.CurrentlySelectedPreset = this.currentlySelectedPreset;\r
+                PictureSettings.Source = selectedTitle; // Setup Picture Settings Tab Control\r
 \r
                 // Populate the Angles dropdown\r
                 drop_angle.Items.Clear();\r
@@ -919,7 +1513,16 @@ namespace Handbrake
                 {\r
                     drop_angle.Visible = true;\r
                     lbl_angle.Visible = true;\r
-                    drop_angle.Items.AddRange(selectedTitle.Angles.ToArray());\r
+\r
+                    for (int i = 1; i <= selectedTitle.AngleCount; i++)\r
+                        drop_angle.Items.Add(i.ToString());\r
+\r
+                    if (drop_angle.Items.Count == 0)\r
+                    {\r
+                        drop_angle.Visible = false;\r
+                        lbl_angle.Visible = false;\r
+                    }\r
+\r
                     if (drop_angle.Items.Count != 0)\r
                         drop_angle.SelectedIndex = 0;\r
                 }\r
@@ -942,31 +1545,32 @@ namespace Handbrake
                     drop_chapterFinish.Text = drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString();\r
 \r
                 // Populate the Audio Channels Dropdown\r
-                AudioSettings.SetTrackList(selectedTitle);\r
+                AudioSettings.SetTrackListFromPreset(selectedTitle, this.currentlySelectedPreset);\r
 \r
                 // Populate the Subtitles dropdown\r
-                Subtitles.drp_subtitleTracks.Items.Clear();\r
-                Subtitles.drp_subtitleTracks.Items.Add("Foreign Audio Search (Bitmap)");\r
-                Subtitles.drp_subtitleTracks.Items.AddRange(selectedTitle.Subtitles.ToArray());\r
-                Subtitles.drp_subtitleTracks.SelectedIndex = 0;\r
-                Subtitles.Clear();\r
-                Subtitles.SetSubtitleTrackAuto();\r
+                Subtitles.SetSubtitleTrackAuto(selectedTitle.Subtitles.ToArray());\r
             }\r
+            // Update the source label if we have multiple streams\r
+            if (selectedTitle != null)\r
+                if (!string.IsNullOrEmpty(selectedTitle.SourceName))\r
+                    labelSource.Text = Path.GetFileName(selectedTitle.SourceName);\r
 \r
-            // Run the autoName & chapterNaming functions\r
+            // Run the AutoName & ChapterNaming functions\r
             if (Properties.Settings.Default.autoNaming)\r
             {\r
-                string autoPath = Main.autoName(this);\r
+                string autoPath = Main.AutoName(this);\r
                 if (autoPath != null)\r
                     text_destination.Text = autoPath;\r
                 else\r
-                    MessageBox.Show("You currently have \"Automatically name output files\" enabled for the destination file box, but you do not have a default directory set.\n\nYou should set a \"Default Path\" in HandBrakes preferences. (See 'Tools' menu -> 'Options' -> 'General' Tab -> 'Default Path')", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    MessageBox.Show(\r
+                        "You currently have \"Automatically name output files\" enabled for the destination file box, but you do not have a valid default directory set.\n\nYou should set a \"Default Path\" in HandBrakes preferences. (See 'Tools' menu -> 'Options' -> 'General' Tab -> 'Default Path')",\r
+                        "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             }\r
 \r
             data_chpt.Rows.Clear();\r
             if (selectedTitle.Chapters.Count != 1)\r
             {\r
-                DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
+                DataGridView chapterGridView = Main.ChapterNaming(selectedTitle, data_chpt, drop_chapterFinish.Text);\r
                 if (chapterGridView != null)\r
                     data_chpt = chapterGridView;\r
             }\r
@@ -982,8 +1586,12 @@ namespace Handbrake
 \r
             RegisterPresetEventHandler();\r
         }\r
+\r
         private void chapersChanged(object sender, EventArgs e)\r
         {\r
+            if (drop_mode.SelectedIndex != 0) // Function is not used if we are not in chapters mode.\r
+                return;\r
+\r
             Control ctl = (Control)sender;\r
             int chapterStart, chapterEnd;\r
             int.TryParse(drop_chapterStart.Text, out chapterStart);\r
@@ -1027,11 +1635,13 @@ namespace Handbrake
             }\r
 \r
             // Update the Duration\r
-            lbl_duration.Text = Main.calculateDuration(drop_chapterStart.SelectedIndex, drop_chapterFinish.SelectedIndex, selectedTitle).ToString();\r
+            lbl_duration.Text =\r
+                Main.CalculateDuration(drop_chapterStart.SelectedIndex, drop_chapterFinish.SelectedIndex, selectedTitle)\r
+                    .ToString();\r
 \r
             // Run the Autonaming function\r
             if (Properties.Settings.Default.autoNaming)\r
-                text_destination.Text = Main.autoName(this);\r
+                text_destination.Text = Main.AutoName(this);\r
 \r
             // Disable chapter markers if only 1 chapter is selected.\r
             if (chapterStart == chapterEnd)\r
@@ -1051,7 +1661,77 @@ namespace Handbrake
             }\r
         }\r
 \r
-        //Destination\r
+        private void SecondsOrFramesChanged(object sender, EventArgs e)\r
+        {\r
+            int start, end;\r
+            int.TryParse(drop_chapterStart.Text, out start);\r
+            int.TryParse(drop_chapterFinish.Text, out end);\r
+            double duration = end - start;\r
+\r
+            switch (drop_mode.SelectedIndex)\r
+            {\r
+                case 1:\r
+                    lbl_duration.Text = TimeSpan.FromSeconds(duration).ToString();\r
+                    return;\r
+                case 2:\r
+                    if (selectedTitle != null)\r
+                    {\r
+                        duration = duration / selectedTitle.Fps;\r
+                        lbl_duration.Text = TimeSpan.FromSeconds(duration).ToString();\r
+                    }\r
+                    else\r
+                        lbl_duration.Text = "--:--:--";\r
+\r
+                    return;\r
+            }\r
+        }\r
+\r
+        private void drop_mode_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            // Reset\r
+            this.drop_chapterFinish.TextChanged -= new EventHandler(this.SecondsOrFramesChanged);\r
+            this.drop_chapterStart.TextChanged -= new EventHandler(this.SecondsOrFramesChanged);\r
+\r
+            // Do Work\r
+            switch (drop_mode.SelectedIndex)\r
+            {\r
+                case 0:\r
+                    drop_chapterStart.DropDownStyle = ComboBoxStyle.DropDownList;\r
+                    drop_chapterFinish.DropDownStyle = ComboBoxStyle.DropDownList;\r
+                    if (drop_chapterStart.Items.Count != 0)\r
+                    {\r
+                        drop_chapterStart.SelectedIndex = 0;\r
+                        drop_chapterFinish.SelectedIndex = drop_chapterFinish.Items.Count - 1;\r
+                    }\r
+                    else\r
+                        lbl_duration.Text = "--:--:--";\r
+                    return;\r
+                case 1:\r
+                    this.drop_chapterStart.TextChanged += new EventHandler(this.SecondsOrFramesChanged);\r
+                    this.drop_chapterFinish.TextChanged += new EventHandler(this.SecondsOrFramesChanged);\r
+                    drop_chapterStart.DropDownStyle = ComboBoxStyle.Simple;\r
+                    drop_chapterFinish.DropDownStyle = ComboBoxStyle.Simple;\r
+                    if (selectedTitle != null)\r
+                    {\r
+                        drop_chapterStart.Text = "0";\r
+                        drop_chapterFinish.Text = selectedTitle.Duration.TotalSeconds.ToString();\r
+                    }\r
+                    return;\r
+                case 2:\r
+                    this.drop_chapterStart.TextChanged += new EventHandler(this.SecondsOrFramesChanged);\r
+                    this.drop_chapterFinish.TextChanged += new EventHandler(this.SecondsOrFramesChanged);\r
+                    drop_chapterStart.DropDownStyle = ComboBoxStyle.Simple;\r
+                    drop_chapterFinish.DropDownStyle = ComboBoxStyle.Simple;\r
+                    if (selectedTitle != null)\r
+                    {\r
+                        drop_chapterStart.Text = "0";\r
+                        drop_chapterFinish.Text = (selectedTitle.Fps * selectedTitle.Duration.TotalSeconds).ToString();\r
+                    }\r
+                    return;\r
+            }\r
+        }\r
+\r
+        // Destination\r
         private void btn_destBrowse_Click(object sender, EventArgs e)\r
         {\r
             // This removes the file extension from the filename box on the save file dialog.\r
@@ -1069,36 +1749,35 @@ namespace Handbrake
 \r
             if (DVD_Save.ShowDialog() == DialogResult.OK)\r
             {\r
-                if (DVD_Save.FileName.StartsWith("\\"))\r
-                    MessageBox.Show("Sorry, HandBrake does not support UNC file paths. \nTry mounting the share as a network drive in My Computer", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-                else\r
+                // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames\r
+                switch (DVD_Save.FilterIndex)\r
                 {\r
-                    // Add a file extension manually, as FileDialog.AddExtension has issues with dots in filenames\r
-                    switch (DVD_Save.FilterIndex)\r
-                    {\r
-                        case 1:\r
-                            if (!Path.GetExtension(DVD_Save.FileName).Equals(".mp4", StringComparison.InvariantCultureIgnoreCase))\r
-                                if (Properties.Settings.Default.useM4v)\r
-                                    DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".m4v").Replace(".mkv", ".m4v");\r
-                                else\r
-                                    DVD_Save.FileName = DVD_Save.FileName.Replace(".m4v", ".mp4").Replace(".mkv", ".mp4");\r
-                            break;\r
-                        case 2:\r
-                            if (!Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))\r
-                                DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".mkv").Replace(".m4v", ".mkv");\r
-                            break;\r
-                        default:\r
-                            //do nothing  \r
-                            break;\r
-                    }\r
-                    text_destination.Text = DVD_Save.FileName;\r
-\r
-                    // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
-                    if (Check_ChapterMarkers.Checked && DVD_Save.FilterIndex != 2)\r
-                        SetExtension(".m4v");\r
+                    case 1:\r
+                        if (\r
+                            !Path.GetExtension(DVD_Save.FileName).Equals(".mp4",\r
+                                                                         StringComparison.InvariantCultureIgnoreCase))\r
+                            if (Properties.Settings.Default.useM4v)\r
+                                DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".m4v").Replace(".mkv", ".m4v");\r
+                            else\r
+                                DVD_Save.FileName = DVD_Save.FileName.Replace(".m4v", ".mp4").Replace(".mkv", ".mp4");\r
+                        break;\r
+                    case 2:\r
+                        if (\r
+                            !Path.GetExtension(DVD_Save.FileName).Equals(".mkv", StringComparison.InvariantCultureIgnoreCase))\r
+                            DVD_Save.FileName = DVD_Save.FileName.Replace(".mp4", ".mkv").Replace(".m4v", ".mkv");\r
+                        break;\r
+                    default:\r
+                        // do nothing  \r
+                        break;\r
                 }\r
+                text_destination.Text = DVD_Save.FileName;\r
+\r
+                // Quicktime requires .m4v file for chapter markers to work. If checked, change the extension to .m4v (mp4 and m4v are the same thing)\r
+                if (Check_ChapterMarkers.Checked && DVD_Save.FilterIndex != 2)\r
+                    SetExtension(".m4v");\r
             }\r
         }\r
+\r
         private void text_destination_TextChanged(object sender, EventArgs e)\r
         {\r
             string path = text_destination.Text;\r
@@ -1114,7 +1793,8 @@ namespace Handbrake
             switch (drop_format.SelectedIndex)\r
             {\r
                 case 0:\r
-                    if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())\r
+                    if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked ||\r
+                        AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())\r
                         SetExtension(".m4v");\r
                     else\r
                         SetExtension(".mp4");\r
@@ -1125,7 +1805,6 @@ namespace Handbrake
             }\r
 \r
             AudioSettings.SetContainer(drop_format.Text);\r
-            Subtitles.SetContainer(drop_format.SelectedIndex);\r
 \r
             if (drop_format.Text.Contains("MP4"))\r
             {\r
@@ -1138,10 +1817,12 @@ namespace Handbrake
             else if (drop_format.Text.Contains("MKV"))\r
                 drp_videoEncoder.Items.Add("VP3 (Theora)");\r
         }\r
+\r
         public void SetExtension(string newExtension)\r
         {\r
             if (newExtension == ".mp4" || newExtension == ".m4v")\r
-                if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() || Subtitles.RequiresM4V())\r
+                if (Properties.Settings.Default.useM4v || Check_ChapterMarkers.Checked || AudioSettings.RequiresM4V() ||\r
+                    Subtitles.RequiresM4V())\r
                     newExtension = ".m4v";\r
                 else\r
                     newExtension = ".mp4";\r
@@ -1150,12 +1831,12 @@ namespace Handbrake
                 text_destination.Text = Path.ChangeExtension(text_destination.Text, newExtension);\r
         }\r
 \r
-        //Video Tab\r
+        // Video Tab\r
         private void drp_videoEncoder_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             setContainerOpts();\r
 \r
-            //Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
+            // Turn off some options which are H.264 only when the user selects a non h.264 encoder\r
             if (drp_videoEncoder.Text.Contains("H.264"))\r
             {\r
                 if (check_2PassEncode.CheckState == CheckState.Checked)\r
@@ -1172,7 +1853,7 @@ namespace Handbrake
                 check_turbo.CheckState = CheckState.Unchecked;\r
                 check_turbo.Enabled = false;\r
                 tab_advanced.Enabled = false;\r
-                x264Panel.x264Query = "";\r
+                x264Panel.X264Query = string.Empty;\r
                 check_iPodAtom.Enabled = false;\r
                 check_iPodAtom.Checked = false;\r
             }\r
@@ -1182,7 +1863,7 @@ namespace Handbrake
             {\r
                 case "MPEG-4 (FFmpeg)":\r
                     if (slider_videoQuality.Value > 31)\r
-                        slider_videoQuality.Value = 20;   // Just reset to 70% QP 10 on encode change.\r
+                        slider_videoQuality.Value = 20; // Just reset to 70% QP 10 on encode change.\r
                     slider_videoQuality.Minimum = 1;\r
                     slider_videoQuality.Maximum = 31;\r
                     break;\r
@@ -1195,36 +1876,43 @@ namespace Handbrake
                     double multiplier = 1.0 / cqStep;\r
                     double value = slider_videoQuality.Value * multiplier;\r
 \r
-                    switch (Properties.Settings.Default.x264cqstep.ToString(culture))\r
-                    {\r
-                        case "0.2":\r
-                            slider_videoQuality.Maximum = 255;\r
-                            break;\r
-                        case "0.25":\r
-                            slider_videoQuality.Maximum = 204;\r
-                            break;\r
-                        case "0.5":\r
-                            slider_videoQuality.Maximum = 102;\r
-                            break;\r
-                        case "1":\r
-                            slider_videoQuality.Maximum = 51;\r
-                            break;\r
-                        default:\r
-                            slider_videoQuality.Maximum = 51;\r
-                            break;\r
-                    }\r
+                    slider_videoQuality.Maximum = (int)(51 / Properties.Settings.Default.x264cqstep);\r
+\r
                     if (value < slider_videoQuality.Maximum)\r
                         slider_videoQuality.Value = slider_videoQuality.Maximum - (int)value;\r
 \r
                     break;\r
                 case "VP3 (Theora)":\r
                     if (slider_videoQuality.Value > 63)\r
-                        slider_videoQuality.Value = 45;  // Just reset to 70% QP 45 on encode change.\r
+                        slider_videoQuality.Value = 45; // Just reset to 70% QP 45 on encode change.\r
                     slider_videoQuality.Minimum = 0;\r
                     slider_videoQuality.Maximum = 63;\r
                     break;\r
             }\r
         }\r
+\r
+        /// <summary>\r
+        /// When the FrameRate is not Same As Source, show the Max/Constant Mode dropdown\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void drp_videoFramerate_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            if (this.drp_videoFramerate.SelectedIndex == 0)\r
+            {\r
+                this.checkMaximumFramerate.Visible = false;\r
+                this.checkMaximumFramerate.CheckState = CheckState.Unchecked;\r
+            }\r
+            else\r
+            {\r
+                this.checkMaximumFramerate.Visible = true;\r
+            }\r
+        }\r
+\r
         /// <summary>\r
         /// Set the container format options\r
         /// </summary>\r
@@ -1246,35 +1934,20 @@ namespace Handbrake
                 check_iPodAtom.Checked = false;\r
             }\r
         }\r
-        private double _cachedCqStep = Properties.Settings.Default.x264cqstep;\r
+\r
+        private double cachedCqStep = Properties.Settings.Default.x264cqstep;\r
+\r
         /// <summary>\r
         /// Update the CQ slider for x264 for a new CQ step. This is set from option\r
         /// </summary>\r
         public void setQualityFromSlider()\r
         {\r
             // Work out the current RF value.\r
-            double cqStep = _cachedCqStep;\r
+            double cqStep = this.cachedCqStep;\r
             double rfValue = 51.0 - slider_videoQuality.Value * cqStep;\r
 \r
             // Change the maximum value for the slider\r
-            switch (Properties.Settings.Default.x264cqstep.ToString(new CultureInfo("en-US")))\r
-            {\r
-                case "0.2":\r
-                    slider_videoQuality.Maximum = 255;\r
-                    break;\r
-                case "0.25":\r
-                    slider_videoQuality.Maximum = 204;\r
-                    break;\r
-                case "0.5":\r
-                    slider_videoQuality.Maximum = 102;\r
-                    break;\r
-                case "1":\r
-                    slider_videoQuality.Maximum = 51;\r
-                    break;\r
-                default:\r
-                    slider_videoQuality.Maximum = 51;\r
-                    break;\r
-            }\r
+            slider_videoQuality.Maximum = (int)(51 / Properties.Settings.Default.x264cqstep);\r
 \r
             // Reset the CQ slider to RF0\r
             slider_videoQuality.Value = slider_videoQuality.Maximum;\r
@@ -1289,35 +1962,29 @@ namespace Handbrake
             }\r
 \r
             // Cache the CQ step for the next calculation\r
-            _cachedCqStep = Properties.Settings.Default.x264cqstep;\r
+            this.cachedCqStep = Properties.Settings.Default.x264cqstep;\r
         }\r
+\r
         private void slider_videoQuality_Scroll(object sender, EventArgs e)\r
         {\r
             double cqStep = Properties.Settings.Default.x264cqstep;\r
             switch (drp_videoEncoder.Text)\r
             {\r
                 case "MPEG-4 (FFmpeg)":\r
-                    double rfValue = 31 - (slider_videoQuality.Value - 1);\r
-                    double max = slider_videoQuality.Maximum;\r
-                    double min = slider_videoQuality.Minimum;\r
-                    double val = ((max - min) - (rfValue - min)) / (max - min);\r
-                    SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + (32 - slider_videoQuality.Value);\r
+                    lbl_SliderValue.Text = "QP:" + (32 - slider_videoQuality.Value);\r
                     break;\r
                 case "H.264 (x264)":\r
-                    rfValue = 51.0 - slider_videoQuality.Value * cqStep;\r
-                    max = slider_videoQuality.Maximum * cqStep;\r
-                    min = slider_videoQuality.Minimum;\r
-                    val = ((max - min) - (rfValue - min)) / (max - min);\r
+                    double rfValue = 51.0 - slider_videoQuality.Value * cqStep;\r
                     rfValue = Math.Round(rfValue, 2);\r
-                    SliderValue.Text = Math.Round((val * 100), 2).ToString(new CultureInfo("en-US")) + "% RF:" + rfValue.ToString(new CultureInfo("en-US"));\r
+                    lbl_SliderValue.Text = "RF:" + rfValue.ToString(new CultureInfo("en-US"));\r
+                    this.lbl_rfwarn.Visible = rfValue == 0;\r
                     break;\r
                 case "VP3 (Theora)":\r
-                    rfValue = slider_videoQuality.Value;\r
-                    double value = rfValue / 63;\r
-                    SliderValue.Text = Math.Round((value * 100), 2).ToString(new CultureInfo("en-US")) + "% QP:" + slider_videoQuality.Value;\r
+                    lbl_SliderValue.Text = "QP:" + slider_videoQuality.Value;\r
                     break;\r
             }\r
         }\r
+\r
         private void radio_targetFilesize_CheckedChanged(object sender, EventArgs e)\r
         {\r
             text_bitrate.Enabled = false;\r
@@ -1326,6 +1993,7 @@ namespace Handbrake
 \r
             check_2PassEncode.Enabled = true;\r
         }\r
+\r
         private void radio_avgBitrate_CheckedChanged(object sender, EventArgs e)\r
         {\r
             text_bitrate.Enabled = true;\r
@@ -1334,6 +2002,7 @@ namespace Handbrake
 \r
             check_2PassEncode.Enabled = true;\r
         }\r
+\r
         private void radio_cq_CheckedChanged(object sender, EventArgs e)\r
         {\r
             text_bitrate.Enabled = false;\r
@@ -1343,6 +2012,7 @@ namespace Handbrake
             check_2PassEncode.Enabled = false;\r
             check_2PassEncode.CheckState = CheckState.Unchecked;\r
         }\r
+\r
         private void check_2PassEncode_CheckedChanged(object sender, EventArgs e)\r
         {\r
             if (check_2PassEncode.CheckState.ToString() == "Checked")\r
@@ -1375,20 +2045,35 @@ namespace Handbrake
                 btn_importChapters.Enabled = false;\r
             }\r
         }\r
+\r
         private void btn_importChapters_Click(object sender, EventArgs e)\r
         {\r
             if (File_ChapterImport.ShowDialog() == DialogResult.OK)\r
             {\r
-                String filename = File_ChapterImport.FileName;\r
-                DataGridView imported = Main.importChapterNames(data_chpt, filename);\r
+                string filename = File_ChapterImport.FileName;\r
+                DataGridView imported = Main.ImportChapterNames(data_chpt, filename);\r
                 if (imported != null)\r
                     data_chpt = imported;\r
             }\r
         }\r
+\r
+        private void btn_export_Click(object sender, EventArgs e)\r
+        {\r
+            SaveFileDialog saveFileDialog = new SaveFileDialog();\r
+            saveFileDialog.Filter = "Csv File|*.csv";\r
+            saveFileDialog.DefaultExt = "csv";\r
+            if (saveFileDialog.ShowDialog() == DialogResult.OK)\r
+            {\r
+                string filename = saveFileDialog.FileName;\r
+\r
+                Main.SaveChapterMarkersToCsv(this, filename);\r
+            }\r
+        }\r
+\r
         private void mnu_resetChapters_Click(object sender, EventArgs e)\r
         {\r
             data_chpt.Rows.Clear();\r
-            DataGridView chapterGridView = Main.chapterNaming(data_chpt, drop_chapterFinish.Text);\r
+            DataGridView chapterGridView = Main.ChapterNaming(selectedTitle, data_chpt, drop_chapterFinish.Text);\r
             if (chapterGridView != null)\r
             {\r
                 data_chpt = chapterGridView;\r
@@ -1398,129 +2083,134 @@ namespace Handbrake
         // Query Editor Tab\r
         private void btn_generate_Query_Click(object sender, EventArgs e)\r
         {\r
-            rtf_query.Text = queryGen.GenerateCLIQuery(this, 0, null);\r
+            rtf_query.Text = QueryGenerator.GenerateFullQuery(this);\r
         }\r
+\r
         private void btn_clear_Click(object sender, EventArgs e)\r
         {\r
             rtf_query.Clear();\r
         }\r
+\r
         #endregion\r
 \r
         // MainWindow Components, Actions and Functions ***********************\r
 \r
         #region Source Scan\r
-        public Boolean isScanning { get; set; }\r
-        private static int scanProcessID { get; set; }\r
-        private void startScan(String filename)\r
+\r
+        /// <summary>\r
+        /// Start the Scan Process\r
+        /// </summary>\r
+        /// <param name="filename">\r
+        /// The filename.\r
+        /// </param>\r
+        /// <param name="title">\r
+        /// The title.\r
+        /// </param>\r
+        private void StartScan(string filename, int title)\r
         {\r
             // Setup the GUI components for the scan.\r
             sourcePath = filename;\r
-            foreach (Control ctrl in Controls)\r
-                if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))\r
-                    ctrl.Enabled = false;\r
 \r
-            lbl_encode.Visible = true;\r
-            lbl_encode.Text = "Scanning ...";\r
-            btn_source.Enabled = false;\r
-            btn_start.Enabled = false;\r
-            btn_showQueue.Enabled = false;\r
-            btn_add2Queue.Enabled = false;\r
-            tb_preview.Enabled = false;\r
-            mnu_killCLI.Visible = true;\r
+            this.DisableGUI();\r
 \r
-            // Start hte Scan Thread\r
+            // Start the Scan\r
             try\r
             {\r
-                if (ActivityWindow != null)\r
-                    ActivityWindow.SetLogView(true);\r
-                isScanning = true;\r
-                ThreadPool.QueueUserWorkItem(scanProcess);\r
+                SourceScan.Scan(sourcePath, title);\r
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("frmMain.cs - startScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                MessageBox.Show("frmMain.cs - StartScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
         }\r
-        private void scanProcess(object state)\r
+\r
+        /// <summary>\r
+        /// Update the Status label for the scan\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SourceScan_ScanStatusChanged(object sender, EventArgs e)\r
+        {\r
+            UpdateScanStatusLabel();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Update the UI after the scan has completed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void SourceScan_ScanCompleted(object sender, EventArgs e)\r
         {\r
-            try\r
-            {\r
-                string handbrakeCLIPath = Path.Combine(Application.StartupPath, "HandBrakeCLI.exe");\r
-                string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
-                string dvdInfoPath = Path.Combine(logDir, "last_scan_log.txt");\r
+            UpdateGuiAfterScan();\r
+        }\r
 \r
-                // Make we don't pick up a stale last_encode_log.txt (and that we have rights to the file)\r
-                if (File.Exists(dvdInfoPath))\r
-                    File.Delete(dvdInfoPath);\r
+        /// <summary>\r
+        /// Update the Scan Status Label\r
+        /// </summary>\r
+        private void UpdateScanStatusLabel()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateWindowHandler(UpdateScanStatusLabel));\r
+                return;\r
+            }\r
+            labelSource.Text = SourceScan.ScanStatus;\r
+        }\r
 \r
-                String dvdnav = string.Empty;\r
-                if (Properties.Settings.Default.noDvdNav)\r
-                    dvdnav = " --no-dvdnav";\r
-                string strCmdLine = String.Format(@"cmd /c """"{0}"" -i ""{1}"" -t0 {2} -v >""{3}"" 2>&1""", handbrakeCLIPath, sourcePath, dvdnav, dvdInfoPath);\r
+        /// <summary>\r
+        /// Reset the GUI when the scan has completed\r
+        /// </summary>\r
+        private void UpdateGuiAfterScan()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateWindowHandler(UpdateGuiAfterScan));\r
+                return;\r
+            }\r
 \r
-                ProcessStartInfo hbParseDvd = new ProcessStartInfo("CMD.exe", strCmdLine) { WindowStyle = ProcessWindowStyle.Hidden };\r
+            try\r
+            {\r
+                currentSource = SourceScan.SouceData;\r
 \r
-                Boolean cleanExit = true;\r
-                using (hbproc = Process.Start(hbParseDvd))\r
-                {\r
-                    Process[] before = Process.GetProcesses(); // Get a list of running processes before starting.\r
-                    scanProcessID = Main.getCliProcess(before);\r
-                    hbproc.WaitForExit();\r
-                    if (hbproc.ExitCode != 0)\r
-                        cleanExit = false;\r
-                }\r
+                // Setup some GUI components\r
+                drp_dvdtitle.Items.Clear();\r
+                if (currentSource.Titles.Count != 0)\r
+                    drp_dvdtitle.Items.AddRange(currentSource.Titles.ToArray());\r
 \r
-                if (cleanExit) // If 0 exit code, CLI exited cleanly.\r
+                foreach (Title title in currentSource.Titles)\r
                 {\r
-                    if (!File.Exists(dvdInfoPath))\r
-                        throw new Exception("Unable to retrieve the DVD Info. last_scan_log.txt is missing. \nExpected location of last_scan_log.txt: \n"\r
-                                            + dvdInfoPath);\r
-\r
-                    using (StreamReader sr = new StreamReader(dvdInfoPath))\r
+                    if (title.MainTitle)\r
                     {\r
-                        thisDVD = DVD.Parse(sr);\r
-                        sr.Close();\r
-                        sr.Dispose();\r
+                        drp_dvdtitle.SelectedItem = title;\r
                     }\r
-\r
-                    updateUIafterScan();\r
                 }\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show("frmMain.cs - scanProcess() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-                enableGUI();\r
-            }\r
-        }\r
-        private void updateUIafterScan()\r
-        {\r
-            try\r
-            {\r
-                if (InvokeRequired)\r
+\r
+                if (drp_dvdtitle.SelectedItem == null && drp_dvdtitle.Items.Count > 0)\r
                 {\r
-                    BeginInvoke(new UpdateWindowHandler(updateUIafterScan));\r
-                    return;\r
+                    drp_dvdtitle.SelectedIndex = 0;\r
                 }\r
 \r
-                // Setup some GUI components\r
-                drp_dvdtitle.Items.Clear();\r
-                if (thisDVD.Titles.Count != 0)\r
-                    drp_dvdtitle.Items.AddRange(thisDVD.Titles.ToArray());\r
-\r
-                // Now select the longest title\r
-                if (thisDVD.Titles.Count != 0)\r
-                    drp_dvdtitle.SelectedItem = Main.selectLongestTitle(thisDVD);\r
-\r
-                // Enable the creation of chapter markers if the file is an image of a dvd.\r
-                if (sourcePath.ToLower().Contains(".iso") || sourcePath.Contains("VIDEO_TS"))\r
-                    Check_ChapterMarkers.Enabled = true;\r
-                else if (Directory.Exists(Path.Combine(sourcePath, "VIDEO_TS")))\r
-                    Check_ChapterMarkers.Enabled = true;\r
-                else\r
+                // Enable the creation of chapter markers if the file is an image of a dvd\r
+                if (drop_chapterStart.Items.Count > 0)\r
                 {\r
-                    Check_ChapterMarkers.Enabled = false;\r
-                    Check_ChapterMarkers.Checked = false;\r
-                    data_chpt.Rows.Clear();\r
+                    int start, end;\r
+                    int.TryParse(drop_chapterStart.Items[0].ToString(), out start);\r
+                    int.TryParse(drop_chapterFinish.Items[drop_chapterFinish.Items.Count - 1].ToString(), out end);\r
+                    if (end > start) Check_ChapterMarkers.Enabled = true;\r
+                    else\r
+                    {\r
+                        Check_ChapterMarkers.Enabled = false;\r
+                        Check_ChapterMarkers.Checked = false;\r
+                        data_chpt.Rows.Clear();\r
+                    }\r
                 }\r
 \r
                 // If no titles were found, Display an error message\r
@@ -1533,22 +2223,54 @@ namespace Handbrake
                 }\r
                 UpdateSourceLabel();\r
 \r
+                // This is a bit of a hack to fix the queue editing.\r
+                // If afte the scan, we find a job sitting in queueEdit, then the user has rescaned the source from the queue by clicking edit.\r
+                // When this occures, we want to repopulate their old settings.\r
+                if (queueEdit != null)\r
+                {\r
+                    // Setup UI\r
+                    if (queueEdit.Query != null)\r
+                    {\r
+                        // Send the query from the file to the Query Parser class\r
+                        QueryParser presetQuery = QueryParser.Parse(queueEdit.Query);\r
+\r
+                        // Now load the preset\r
+                        PresetLoader.LoadPreset(this, presetQuery, "Load Back From Queue");\r
+\r
+                        // Set the destination path\r
+                        this.text_destination.Text = queueEdit.Destination;\r
+\r
+                        // The x264 widgets will need updated, so do this now:\r
+                        x264Panel.StandardizeOptString();\r
+                        x264Panel.SetCurrentSettingsInPanel();\r
+\r
+                        // Set the crop label\r
+                        PictureSettings.SetPresetCropWarningLabel(null);\r
+                    }\r
+\r
+                    queueEdit = null;\r
+                }\r
+\r
                 // Enable the GUI components and enable any disabled components\r
-                enableGUI();\r
+                EnableGUI();\r
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-                enableGUI();\r
+                MessageBox.Show("frmMain.cs - updateUIafterScan " + exc, "Error", MessageBoxButtons.OK,\r
+                                MessageBoxIcon.Error);\r
+                EnableGUI();\r
             }\r
         }\r
-        private void enableGUI()\r
+\r
+        /// <summary>\r
+        /// Enable the GUI\r
+        /// </summary>\r
+        private void EnableGUI()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
-                    BeginInvoke(new UpdateWindowHandler(enableGUI));\r
-                lbl_encode.Text = "Scan Completed";\r
+                    BeginInvoke(new UpdateWindowHandler(EnableGUI));\r
                 foreach (Control ctrl in Controls)\r
                     ctrl.Enabled = true;\r
                 btn_start.Enabled = true;\r
@@ -1560,67 +2282,103 @@ namespace Handbrake
             }\r
             catch (Exception exc)\r
             {\r
-                MessageBox.Show("frmMain.cs - enableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                MessageBox.Show("frmMain.cs - EnableGUI() " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
         }\r
-        private void killScan()\r
+\r
+        /// <summary>\r
+        /// Disable the GUI\r
+        /// </summary>\r
+        private void DisableGUI()\r
         {\r
-            try\r
-            {\r
-                enableGUI();\r
-                resetGUI();\r
+            foreach (Control ctrl in Controls)\r
+                if (!(ctrl is StatusStrip || ctrl is MenuStrip || ctrl is ToolStrip))\r
+                    ctrl.Enabled = false;\r
 \r
-                Process[] prs = Process.GetProcesses();\r
-                foreach (Process process in prs)\r
-                {\r
-                    if (process.Id == scanProcessID)\r
-                    {\r
-                        process.Refresh();\r
-                        if (!process.HasExited)\r
-                            process.Kill();\r
-                    }\r
-                }\r
-            }\r
-            catch (Exception ex)\r
-            {\r
-                MessageBox.Show("Unable to kill HandBrakeCLI.exe \nYou may need to manually kill HandBrakeCLI.exe using the Windows Task Manager if it does not close automatically within the next few minutes. \n\nError Information: \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
-            }\r
+            labelSource.Enabled = true;\r
+            labelStaticSource.Enabled = true;\r
+            SourceLayoutPanel.Enabled = true;\r
+            btn_source.Enabled = false;\r
+            btn_start.Enabled = false;\r
+            btn_showQueue.Enabled = false;\r
+            btn_add2Queue.Enabled = false;\r
+            tb_preview.Enabled = false;\r
+            mnu_killCLI.Visible = true;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Kill the Scan\r
+        /// </summary>\r
+        private void KillScan()\r
+        {\r
+            SourceScan.ScanCompleted -= new EventHandler(SourceScan_ScanCompleted);\r
+            EnableGUI();\r
+            ResetGUI();\r
+\r
+            SourceScan.Stop();\r
+\r
+            labelSource.Text = "Scan Cancelled";\r
         }\r
-        private void resetGUI()\r
+\r
+        /// <summary>\r
+        /// Reset the GUI\r
+        /// </summary>\r
+        private void ResetGUI()\r
         {\r
             drp_dvdtitle.Items.Clear();\r
             drop_chapterStart.Items.Clear();\r
             drop_chapterFinish.Items.Clear();\r
             lbl_duration.Text = "Select a Title";\r
             PictureSettings.lbl_src_res.Text = "Select a Title";\r
-            PictureSettings.lbl_Aspect.Text = "Select a Title";\r
             sourcePath = String.Empty;\r
             text_destination.Text = String.Empty;\r
-            thisDVD = null;\r
             selectedTitle = null;\r
-            isScanning = false;\r
         }\r
+\r
+        /// <summary>\r
+        /// Update the Source Label\r
+        /// </summary>\r
         private void UpdateSourceLabel()\r
         {\r
             labelSource.Text = string.IsNullOrEmpty(sourcePath) ? "Select \"Source\" to continue." : this.SourceName;\r
         }\r
+\r
+        /// <summary>\r
+        /// Take a job from the Queue, rescan it, and reload the GUI for that job.\r
+        /// </summary>\r
+        /// <param name="job">\r
+        /// The job.\r
+        /// </param>\r
+        public void RecievingJob(Job job)\r
+        {\r
+            // Reset\r
+            this.currentlySelectedPreset = null;\r
+            x264Panel.Reset2Defaults();\r
+\r
+            // Scan\r
+            queueEdit = job; // Nasty but will do for now. TODO\r
+            StartScan(job.Source, job.Title);\r
+        }\r
+\r
         #endregion\r
 \r
-        #region GUI\r
+        #region GUI Functions and Actions\r
+\r
         /// <summary>\r
         /// Set the GUI to it's finished encoding state.\r
         /// </summary>\r
-        private void setEncodeFinished()\r
+        private void SetEncodeFinished()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateWindowHandler(setEncodeFinished));\r
+                    BeginInvoke(new UpdateWindowHandler(SetEncodeFinished));\r
                     return;\r
                 }\r
 \r
                 lbl_encode.Text = "Encoding Finished";\r
+                ProgressBarStatus.Visible = false;\r
                 btn_start.Text = "Start";\r
                 btn_start.ToolTipText = "Start the encoding process";\r
                 btn_start.Image = Properties.Resources.Play;\r
@@ -1642,17 +2400,18 @@ namespace Handbrake
         /// <summary>\r
         /// Set the GUI to it's started encoding state.\r
         /// </summary>\r
-        private void setEncodeStarted()\r
+        private void SetEncodeStarted()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateWindowHandler(setEncodeStarted));\r
+                    BeginInvoke(new UpdateWindowHandler(SetEncodeStarted));\r
                     return;\r
                 }\r
-\r
                 lbl_encode.Visible = true;\r
+                ProgressBarStatus.Value = 0;\r
+                ProgressBarStatus.Visible = true;\r
                 lbl_encode.Text = "Encoding with " + encodeQueue.Count + " encode(s) pending";\r
                 btn_start.Text = "Stop";\r
                 btn_start.ToolTipText = "Stop the encoding process.";\r
@@ -1663,117 +2422,215 @@ namespace Handbrake
                 MessageBox.Show(exc.ToString());\r
             }\r
         }\r
-        #endregion\r
 \r
-        #region DVD Drive Detection\r
-        private void getDriveInfoThread()\r
+        /// <summary>\r
+        /// Display the Encode Status\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
+        {\r
+            if (this.InvokeRequired)\r
+            {\r
+                this.BeginInvoke(new Encode.EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });\r
+                return;\r
+            }\r
+\r
+            lbl_encode.Text =\r
+                string.Format(\r
+                "{0:00.00}%,  FPS: {1:000.0},  Avg FPS: {2:000.0},  Time Remaining: {3},  Encode(s) Pending {4}",\r
+                e.PercentComplete,\r
+                e.CurrentFrameRate,\r
+                e.AverageFrameRate,\r
+                e.EstimatedTimeLeft,\r
+                encodeQueue.Count);\r
+\r
+            ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Set the DVD Drive selection in the "Source" Menu\r
+        /// </summary>\r
+        private void SetDriveSelectionMenuItem()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateWindowHandler(getDriveInfoThread));\r
+                    BeginInvoke(new UpdateWindowHandler(SetDriveSelectionMenuItem));\r
                     return;\r
                 }\r
 \r
-                Boolean foundDrive = false;\r
-                DriveInfo[] theCollectionOfDrives = DriveInfo.GetDrives();\r
-                foreach (DriveInfo curDrive in theCollectionOfDrives)\r
+                drives = Main.GetDrives();\r
+\r
+                List<ToolStripMenuItem> menuItems = new List<ToolStripMenuItem>();\r
+                foreach (DriveInformation drive in drives)\r
                 {\r
-                    if (curDrive.DriveType == DriveType.CDRom && curDrive.IsReady)\r
-                    {\r
-                        if (File.Exists(curDrive.RootDirectory + "VIDEO_TS\\VIDEO_TS.IFO"))\r
+                    ToolStripMenuItem menuItem = new ToolStripMenuItem\r
                         {\r
-                            this.dvdDrivePath = curDrive.RootDirectory + "VIDEO_TS";\r
-                            this.dvdDriveLabel = curDrive.VolumeLabel;\r
-                            mnu_dvd_drive.Text = this.dvdDrivePath + " (" + this.dvdDriveLabel + ")";\r
-                            foundDrive = true;\r
-                            break;\r
-                        }\r
-                    }\r
+                            Name = drive.ToString(),\r
+                            Text = drive.RootDirectory + " (" + drive.VolumeLabel + ")",\r
+                            Image = Resources.disc_small\r
+                        };\r
+                    menuItem.Click += new EventHandler(MnuDvdDriveClick);\r
+                    menuItems.Add(menuItem);\r
                 }\r
 \r
-                if (foundDrive == false)\r
-                    mnu_dvd_drive.Text = "[No DVD Drive Ready]";\r
+                foreach (ToolStripMenuItem item in menuItems)\r
+                    btn_source.DropDownItems.Add(item);\r
             }\r
-            catch (Exception)\r
+            catch (Exception exc)\r
             {\r
-                mnu_dvd_drive.Text = "[No DVD Drive Ready / Found]";\r
+                MessageBox.Show("Error in SetDriveSelectionMenuItem" + exc);\r
             }\r
         }\r
-        #endregion\r
 \r
-        #region Public Methods\r
         /// <summary>\r
         /// Access the preset Handler and setup the preset panel.\r
         /// </summary>\r
-        public void loadPresetPanel()\r
+        private void LoadPresetPanel()\r
         {\r
             if (presetHandler.CheckIfPresetsAreOutOfDate())\r
-                if (!Properties.Settings.Default.presetNotification)\r
-                    MessageBox.Show(splash,\r
-                    "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",\r
-                    "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+                if (!Settings.Default.presetNotification)\r
+                    MessageBox.Show(this,\r
+                                    "HandBrake has determined your built-in presets are out of date... These presets will now be updated.",\r
+                                    "Preset Update", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
 \r
             presetHandler.GetPresetPanel(ref treeView_presets);\r
             treeView_presets.Update();\r
         }\r
-        #endregion\r
 \r
-        #region Overrides\r
         /// <summary>\r
-        /// If the queue is being processed, prompt the user to confirm application close.\r
+        /// Get the title from the selected item in the title dropdown.\r
         /// </summary>\r
-        /// <param name="e"></param>\r
-        protected override void OnFormClosing(FormClosingEventArgs e)\r
+        /// <returns>\r
+        /// The title.\r
+        /// </returns>\r
+        private int GetTitle()\r
         {\r
-            // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.\r
-            if ((encodeQueue.isEncoding) && (!encodeQueue.PauseRequested) && (encodeQueue.Count > 0))\r
+            int title = 0;\r
+            if (drp_dvdtitle.SelectedItem != null)\r
             {\r
-                DialogResult result = MessageBox.Show("HandBrake has queue items to process. Closing HandBrake will not stop the current encoding, but will stop processing the queue.\n\nDo you want to close HandBrake?",\r
-                    "Close HandBrake?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);\r
-                if (result == DialogResult.No)\r
-                    e.Cancel = true;\r
+                string[] titleInfo = drp_dvdtitle.SelectedItem.ToString().Split(' ');\r
+                int.TryParse(titleInfo[0], out title);\r
             }\r
-            base.OnFormClosing(e);\r
+\r
+            return title;\r
         }\r
-        #endregion\r
 \r
-        #region In-GUI Encode Status (Experimental)\r
-        private void encodeMonitorThread()\r
+        /// <summary>\r
+        /// Handle the Update Check Finishing.\r
+        /// </summary>\r
+        /// <param name="result">\r
+        /// The result.\r
+        /// </param>\r
+        private void UpdateCheckDoneMenu(IAsyncResult result)\r
         {\r
+            // Make sure it's running on the calling thread\r
+            if (InvokeRequired)\r
+            {\r
+                Invoke(new MethodInvoker(() => this.UpdateCheckDoneMenu(result)));\r
+                return;\r
+            }\r
+            UpdateCheckInformation info;\r
             try\r
             {\r
-                Parser encode = new Parser(encodeQueue.hbProcess.StandardOutput.BaseStream);\r
-                encode.OnEncodeProgress += encodeOnEncodeProgress;\r
-                while (!encode.EndOfStream)\r
-                    encode.readEncodeStatus();\r
+                // Get the information about the new build, if any, and close the window\r
+                info = UpdateService.EndCheckForUpdates(result);\r
+\r
+                if (info.NewVersionAvailable && info.BuildInformation != null)\r
+                {\r
+                    UpdateInfo updateWindow = new UpdateInfo(info.BuildInformation, Settings.Default.hb_version, Settings.Default.hb_build.ToString());\r
+                    updateWindow.ShowDialog();\r
+                }\r
+                else\r
+                    MessageBox.Show("There are no new updates at this time.", "Update Check", MessageBoxButtons.OK,\r
+                                    MessageBoxIcon.Information);\r
+                lbl_updateCheck.Visible = false;\r
+                return;\r
             }\r
-            catch (Exception exc)\r
+            catch (Exception ex)\r
             {\r
-                MessageBox.Show(exc.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                if ((bool)result.AsyncState)\r
+                    MessageBox.Show(\r
+                        "Unable to check for updates, Please try again later.\n\nDetailed Error Information:\n" + ex,\r
+                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
         }\r
-        private void encodeOnEncodeProgress(object Sender, int CurrentTask, int TaskCount, float PercentComplete, float CurrentFps, float AverageFps, TimeSpan TimeRemaining)\r
+\r
+        #endregion\r
+\r
+        #region Overrides\r
+\r
+        /// <summary>\r
+        /// Handle GUI shortcuts\r
+        /// </summary>\r
+        /// <param name="msg">Message</param>\r
+        /// <param name="keyData">Keys</param>\r
+        /// <returns>Bool</returns>\r
+        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)\r
         {\r
-            if (this.InvokeRequired)\r
+            if (keyData == (Keys.Control | Keys.S))\r
             {\r
-                this.BeginInvoke(new EncodeProgressEventHandler(encodeOnEncodeProgress),\r
-                    new object[] { Sender, CurrentTask, TaskCount, PercentComplete, CurrentFps, AverageFps, TimeRemaining });\r
-                return;\r
+                btn_start_Click(this, new EventArgs());\r
+                return true;\r
+            }\r
+\r
+            if (keyData == (Keys.Control | Keys.Shift | Keys.A))\r
+            {\r
+                btn_add2Queue_Click(this, new EventArgs());\r
+                return true;\r
             }\r
-            lbl_encode.Text = string.Format("Encode Progress: {0}%,       FPS: {1},       Avg FPS: {2},       Time Remaining: {3} ", PercentComplete, CurrentFps, AverageFps, TimeRemaining);\r
+            return base.ProcessCmdKey(ref msg, keyData);\r
         }\r
-        #endregion\r
 \r
-        #region enum\r
-        private enum SourceType\r
+        /// <summary>\r
+        /// If the queue is being processed, prompt the user to confirm application close.\r
+        /// </summary>\r
+        /// <param name="e">FormClosingEventArgs</param>\r
+        protected override void OnFormClosing(FormClosingEventArgs e)\r
         {\r
-            None = 0,\r
-            Folder,\r
-            DvdDrive,\r
-            VideoFile\r
+            try\r
+            {\r
+                // If currently encoding, the queue isn't paused, and there are queue items to process, prompt to confirm close.\r
+                if (encodeQueue.IsEncoding)\r
+                {\r
+                    DialogResult result =\r
+                        MessageBox.Show(\r
+                            "HandBrake is currently encoding. Closing HandBrake will stop the current encode and will result in an unplayable file.\n\nDo you want to close HandBrake?",\r
+                            "Close HandBrake?",\r
+                            MessageBoxButtons.YesNo,\r
+                            MessageBoxIcon.Question);\r
+\r
+                    if (result == DialogResult.No)\r
+                    {\r
+                        e.Cancel = true;\r
+                        return;\r
+                    }\r
+\r
+                    encodeQueue.Stop();\r
+                }\r
+\r
+                if (SourceScan.IsScanning)\r
+                {\r
+                    SourceScan.ScanCompleted -= new EventHandler(SourceScan_ScanCompleted);\r
+                    SourceScan.Stop();\r
+                }\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                Main.ShowExceptiowWindow("HandBrake was not able to shutdown properly. You may need to forcefully quit HandBrake CLI from TaskManager if it's still running.", exc.ToString());\r
+            }\r
+            finally\r
+            {\r
+                base.OnFormClosing(e);\r
+            }\r
         }\r
+\r
         #endregion\r
 \r
         // This is the END of the road ****************************************\r
index be71f92..bb2f6f7 100644 (file)
   <resheader name="writer">\r
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
   </resheader>\r
-  <metadata name="notifyIconMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>17, 54</value>\r
-  </metadata>\r
   <metadata name="notifyIconMenu.GenerateMember" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
     <value>False</value>\r
   </metadata>\r
+  <metadata name="notifyIconMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>1106, 15</value>\r
+  </metadata>\r
   <metadata name="DVD_Save.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>556, 15</value>\r
   </metadata>\r
     <value>True</value>\r
   </metadata>\r
   <metadata name="ChaptersMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>935, 54</value>\r
+    <value>578, 54</value>\r
   </metadata>\r
   <data name="data_chpt.ToolTip" xml:space="preserve">\r
     <value>Here you can name each chapter that the encoded video will contain.\r
@@ -144,6 +144,38 @@ Make sure you have selected a "Title" from the "Source" box above otherwise
 the list will not be populated with the correct amount of chapters.\r
 Note: Do not change any of the chapter numbers!</value>\r
   </data>\r
+  <data name="btn_importChapters.ToolTip" xml:space="preserve">\r
+    <value>Import a comma separated file containing the chapter information.\r
+The CSV should be formatted as follows:\r
+\r
+1,Chapter 1 Name\r
+2,Chapter 2 Name\r
+3,Chapter 3 Name\r
+\r
+Note: Currently, if you wish to use a , in your chapter name, you must escape it with a \\r
+Note2: HandBrake can NOT create chapters, only add a name to any chapters your source currently has.</value>\r
+  </data>\r
+  <data name="btn_export.ToolTip" xml:space="preserve">\r
+    <value>Export to a comma separated file containing the chapter information.\r
+The CSV is formatted as follows:\r
+\r
+1,Chapter 1 Name\r
+2,Chapter 2 Name\r
+3,Chapter 3 Name\r
+\r
+Note: Commas in names are escaped by a \</value>\r
+  </data>\r
+  <data name="drop_mode.ToolTip" xml:space="preserve">\r
+    <value>There are several ranges which can be encoded:\r
+- Encode a range of Chapters.\r
+\r
+The Following options are not 100% accurate:\r
+- Encode video between a start and end time, measured in seconds\r
+- Encode video between a start and end frame.</value>\r
+  </data>\r
+  <metadata name="presets_menu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
+    <value>1354, 15</value>\r
+  </metadata>\r
   <metadata name="DVD_Open.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>232, 15</value>\r
   </metadata>\r
@@ -157,45 +189,21 @@ Note: Do not change any of the chapter numbers!</value>
     <value>106, 15</value>\r
   </metadata>\r
   <metadata name="AudioMenuRowHeightHack.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>392, 54</value>\r
+    <value>17, 54</value>\r
   </metadata>\r
-  <data name="btn_importChapters.ToolTip" xml:space="preserve">\r
-    <value>Import a comma separated file containing the chapter information.\r
-The CSV should be formatted as follows:\r
-\r
-1,Chapter 1 Name\r
-2,Chapter 2 Name\r
-3,Chapter 3 Name\r
-\r
-Note: Currently, if you wish to use a , in your chapter name, you must escape it with a \</value>\r
+  <data name="label34.Text" xml:space="preserve">\r
+    <value>Here you can alter the query generated by this program. This feature is for one job overriding of the automatic query generation.\r
+Don't forget to re-generate this query if you change any GUI options.\r
+Note that this will also override the "Add to Queue" query as well.\r
+Clear the text box below to return to the internal query generation.</value>\r
   </data>\r
-  <metadata name="presets_menu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>265, 54</value>\r
-  </metadata>\r
   <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>767, 15</value>\r
   </metadata>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
-  <data name="btn_dvd_source.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAlpJREFUOE+tk21I\r
-        k1EYhif0oyA0sqIQCix/+GcQFFH9CCmiUBTLLEjShJofVBgL2fxoU9Pp5ubUlS5rU9f8rCyjsA+pUCRC\r
-        TR1ppmVFUSlmhq78unrnQF1KGHTg/nEOz30993PO+7qJFrmUeiv2n+Mij+XLRLLYULdF2pxlEVIDcw0p\r
-        AsyxD5fmI/rQ94pqi26eOlsfuZj+7BgSm01QdA4ih7m73Yx9qGpavwatjPebqCzOprPt8YKQgzFagqL0\r
-        BEjyEFWVaBkdLHMxT34uYNwWR9nVTEoL0zHlp2DMSeaSRk6eKt4VWm5WM/rVPNN5SjDTLQebZEHNA1wr\r
-        UvHjk3E6tsNcV62e1r3KLGqtKm6WplNpSsVqVFJsOM8VfSKFWjkGtcyZptSYzvC7XByx3zQoqCnTMvlG\r
-        CX1prnornPUmQJcUXsbSVhGK5bIOkcmQyveeTHiv4VZ5Nk33Nc6iuSO8CIfmECYa/bE/8ON1iRipJNh5\r
-        F0V6Bd86lfQ1JlFj1TDVq4COKCegLVIwHmGiKRB7/V6G7+5koHozymgfYRy5E1CgTWKgXcZ1i5qWp0KS\r
-        rjgBcAJawph6FszYk/2M1O1isGYLX8p9ab6wgqP+3rMvYciS01GfzA1LFvQkQ6sQ9/khxhoCGHnox1Dt\r
-        NvorxXw0b8Km8UQh2cip6GOzgNyMeKqKM7HdjqFZJ5pRk2YJ9aql3EnxoCJxNaZ4Ly6e3UDY3O6OEXRp\r
-        59ApTpIhiyDh9GHORAZyPHQPB/ZtZ/cOMVvFPvh6e7F+3SrWrHRnraf7Xz/xf/rJ/kvxb84I3U1y+9/W\r
-        AAAAAElFTkSuQmCC\r
-</value>\r
-  </data>\r
   <metadata name="notifyIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>871, 15</value>\r
   </metadata>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
   <data name="notifyIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
     <value>\r
         AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
@@ -576,10 +584,10 @@ Note: Currently, if you wish to use a , in your chapter name, you must escape it
 </value>\r
   </data>\r
   <metadata name="StatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>155, 54</value>\r
+    <value>1244, 15</value>\r
   </metadata>\r
   <metadata name="hbproc.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>595, 54</value>\r
+    <value>220, 54</value>\r
   </metadata>\r
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
     <value>98</value>\r
@@ -967,9 +975,9 @@ Note: Currently, if you wish to use a , in your chapter name, you must escape it
     <value>664, 15</value>\r
   </metadata>\r
   <metadata name="openPreset.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>680, 54</value>\r
+    <value>310, 54</value>\r
   </metadata>\r
   <metadata name="File_ChapterImport.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
-    <value>787, 54</value>\r
+    <value>423, 54</value>\r
   </metadata>\r
 </root>
\ No newline at end of file
index 85c5e1d..51a7cc9 100644 (file)
@@ -1,8 +1,7 @@
 /*  frmOptions.Designer.cs \r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -40,6 +39,9 @@ namespace Handbrake
             this.drp_completeOption = new System.Windows.Forms.ComboBox();\r
             this.tab_options = new System.Windows.Forms.TabControl();\r
             this.tab_general = new System.Windows.Forms.TabPage();\r
+            this.label34 = new System.Windows.Forms.Label();\r
+            this.check_TitleCase = new System.Windows.Forms.CheckBox();\r
+            this.check_removeUnderscores = new System.Windows.Forms.CheckBox();\r
             this.check_growlEncode = new System.Windows.Forms.CheckBox();\r
             this.check_GrowlQueue = new System.Windows.Forms.CheckBox();\r
             this.check_m4v = new System.Windows.Forms.CheckBox();\r
@@ -62,45 +64,45 @@ namespace Handbrake
             this.btn_vlcPath = new System.Windows.Forms.Button();\r
             this.txt_vlcPath = new System.Windows.Forms.TextBox();\r
             this.tab_audio_sub = new System.Windows.Forms.TabPage();\r
+            this.radio_preferredAudioAndSubs = new System.Windows.Forms.RadioButton();\r
+            this.check_AddCCTracks = new System.Windows.Forms.CheckBox();\r
             this.label31 = new System.Windows.Forms.Label();\r
             this.label15 = new System.Windows.Forms.Label();\r
             this.radio_foreignAndSubs = new System.Windows.Forms.RadioButton();\r
             this.drop_preferredLang = new System.Windows.Forms.ComboBox();\r
             this.radio_dub = new System.Windows.Forms.RadioButton();\r
             this.tab_cli = new System.Windows.Forms.TabPage();\r
-            this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();\r
+            this.label11 = new System.Windows.Forms.Label();\r
+            this.check_preventSleep = new System.Windows.Forms.CheckBox();\r
+            this.check_clearOldLogs = new System.Windows.Forms.CheckBox();\r
             this.label12 = new System.Windows.Forms.Label();\r
-            this.check_cli_minimized = new System.Windows.Forms.CheckBox();\r
+            this.btn_viewLogs = new System.Windows.Forms.Button();\r
             this.label9 = new System.Windows.Forms.Label();\r
-            this.btn_saveLog = new System.Windows.Forms.Button();\r
+            this.Label4 = new System.Windows.Forms.Label();\r
+            this.btn_clearLogs = new System.Windows.Forms.Button();\r
+            this.drp_Priority = new System.Windows.Forms.ComboBox();\r
             this.check_logsInSpecifiedLocation = new System.Windows.Forms.CheckBox();\r
-            this.Label11 = new System.Windows.Forms.Label();\r
             this.check_saveLogWithVideo = new System.Windows.Forms.CheckBox();\r
-            this.Label4 = new System.Windows.Forms.Label();\r
             this.label3 = new System.Windows.Forms.Label();\r
-            this.text_logPath = new System.Windows.Forms.TextBox();\r
+            this.btn_saveLog = new System.Windows.Forms.Button();\r
             this.cb_logVerboseLvl = new System.Windows.Forms.ComboBox();\r
-            this.drp_Priority = new System.Windows.Forms.ComboBox();\r
-            this.drp_processors = new System.Windows.Forms.ComboBox();\r
-            this.btn_viewLogs = new System.Windows.Forms.Button();\r
-            this.btn_clearLogs = new System.Windows.Forms.Button();\r
+            this.text_logPath = new System.Windows.Forms.TextBox();\r
             this.label14 = new System.Windows.Forms.Label();\r
             this.tab_advanced = new System.Windows.Forms.TabPage();\r
-            this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();\r
+            this.check_showCliForInGUIEncode = new System.Windows.Forms.CheckBox();\r
+            this.drop_previewScanCount = new System.Windows.Forms.ComboBox();\r
+            this.label33 = new System.Windows.Forms.Label();\r
+            this.label6 = new System.Windows.Forms.Label();\r
+            this.check_trayStatusAlerts = new System.Windows.Forms.CheckBox();\r
+            this.check_mainMinimize = new System.Windows.Forms.CheckBox();\r
             this.check_promptOnUnmatchingQueries = new System.Windows.Forms.CheckBox();\r
             this.check_dvdnav = new System.Windows.Forms.CheckBox();\r
-            this.check_trayStatusAlerts = new System.Windows.Forms.CheckBox();\r
+            this.check_queryEditorTab = new System.Windows.Forms.CheckBox();\r
             this.label32 = new System.Windows.Forms.Label();\r
-            this.label6 = new System.Windows.Forms.Label();\r
             this.drop_x264step = new System.Windows.Forms.ComboBox();\r
             this.label30 = new System.Windows.Forms.Label();\r
-            this.check_mainMinimize = new System.Windows.Forms.CheckBox();\r
-            this.label28 = new System.Windows.Forms.Label();\r
-            this.check_queryEditorTab = new System.Windows.Forms.CheckBox();\r
             this.check_disablePresetNotification = new System.Windows.Forms.CheckBox();\r
-            this.check_inGuiStatus = new System.Windows.Forms.CheckBox();\r
-            this.tab_debug = new System.Windows.Forms.TabPage();\r
-            this.check_disableResCalc = new System.Windows.Forms.CheckBox();\r
+            this.label28 = new System.Windows.Forms.Label();\r
             this.label8 = new System.Windows.Forms.Label();\r
             this.pictureBox2 = new System.Windows.Forms.PictureBox();\r
             this.pathFinder = new System.Windows.Forms.FolderBrowserDialog();\r
@@ -134,29 +136,27 @@ namespace Handbrake
             this.label26 = new System.Windows.Forms.Label();\r
             this.label27 = new System.Windows.Forms.Label();\r
             this.openFile_vlc = new System.Windows.Forms.OpenFileDialog();\r
-            this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel();\r
+            this.panel1 = new System.Windows.Forms.Panel();\r
+            this.panel2 = new System.Windows.Forms.Panel();\r
             this.tab_options.SuspendLayout();\r
             this.tab_general.SuspendLayout();\r
             this.tab_picture.SuspendLayout();\r
             this.tableLayoutPanel2.SuspendLayout();\r
             this.tab_audio_sub.SuspendLayout();\r
             this.tab_cli.SuspendLayout();\r
-            this.tableLayoutPanel3.SuspendLayout();\r
             this.tab_advanced.SuspendLayout();\r
-            this.tableLayoutPanel4.SuspendLayout();\r
-            this.tab_debug.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\r
-            this.tableLayoutPanel5.SuspendLayout();\r
+            this.panel1.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
             // btn_close\r
             // \r
-            this.btn_close.Anchor = System.Windows.Forms.AnchorStyles.Right;\r
+            this.btn_close.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
             this.btn_close.BackColor = System.Drawing.SystemColors.ControlLight;\r
             this.btn_close.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
             this.btn_close.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_close.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_close.Location = new System.Drawing.Point(519, 404);\r
+            this.btn_close.Location = new System.Drawing.Point(528, 463);\r
             this.btn_close.Name = "btn_close";\r
             this.btn_close.Size = new System.Drawing.Size(72, 22);\r
             this.btn_close.TabIndex = 53;\r
@@ -166,7 +166,6 @@ namespace Handbrake
             // \r
             // drp_completeOption\r
             // \r
-            this.drp_completeOption.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.drp_completeOption.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drp_completeOption.FormattingEnabled = true;\r
             this.drp_completeOption.Items.AddRange(new object[] {\r
@@ -186,22 +185,22 @@ namespace Handbrake
             // \r
             // tab_options\r
             // \r
-            this.tableLayoutPanel5.SetColumnSpan(this.tab_options, 2);\r
             this.tab_options.Controls.Add(this.tab_general);\r
             this.tab_options.Controls.Add(this.tab_picture);\r
             this.tab_options.Controls.Add(this.tab_audio_sub);\r
             this.tab_options.Controls.Add(this.tab_cli);\r
             this.tab_options.Controls.Add(this.tab_advanced);\r
-            this.tab_options.Controls.Add(this.tab_debug);\r
-            this.tab_options.Dock = System.Windows.Forms.DockStyle.Fill;\r
-            this.tab_options.Location = new System.Drawing.Point(3, 38);\r
+            this.tab_options.Location = new System.Drawing.Point(12, 74);\r
             this.tab_options.Name = "tab_options";\r
             this.tab_options.SelectedIndex = 0;\r
-            this.tab_options.Size = new System.Drawing.Size(588, 360);\r
+            this.tab_options.Size = new System.Drawing.Size(588, 383);\r
             this.tab_options.TabIndex = 58;\r
             // \r
             // tab_general\r
             // \r
+            this.tab_general.Controls.Add(this.label34);\r
+            this.tab_general.Controls.Add(this.check_TitleCase);\r
+            this.tab_general.Controls.Add(this.check_removeUnderscores);\r
             this.tab_general.Controls.Add(this.check_growlEncode);\r
             this.tab_general.Controls.Add(this.check_GrowlQueue);\r
             this.tab_general.Controls.Add(this.check_m4v);\r
@@ -222,14 +221,51 @@ namespace Handbrake
             this.tab_general.Location = new System.Drawing.Point(4, 22);\r
             this.tab_general.Name = "tab_general";\r
             this.tab_general.Padding = new System.Windows.Forms.Padding(10);\r
-            this.tab_general.Size = new System.Drawing.Size(580, 334);\r
+            this.tab_general.Size = new System.Drawing.Size(580, 357);\r
             this.tab_general.TabIndex = 3;\r
             this.tab_general.Text = "General";\r
             this.tab_general.UseVisualStyleBackColor = true;\r
             // \r
+            // label34\r
+            // \r
+            this.label34.AutoSize = true;\r
+            this.label34.Location = new System.Drawing.Point(179, 233);\r
+            this.label34.Margin = new System.Windows.Forms.Padding(3);\r
+            this.label34.Name = "label34";\r
+            this.label34.Size = new System.Drawing.Size(167, 13);\r
+            this.label34.TabIndex = 102;\r
+            this.label34.Text = "Available Options: {source_path}";\r
+            this.ToolTip.SetToolTip(this.label34, "{source_path} = Use the same directory as the source is in.\r\nNote: you can not us" +\r
+                    "e {source_path} within a path.  It has to be the only text in the path above to " +\r
+                    "work.");\r
+            // \r
+            // check_TitleCase\r
+            // \r
+            this.check_TitleCase.AutoSize = true;\r
+            this.check_TitleCase.Location = new System.Drawing.Point(297, 297);\r
+            this.check_TitleCase.Name = "check_TitleCase";\r
+            this.check_TitleCase.Size = new System.Drawing.Size(151, 17);\r
+            this.check_TitleCase.TabIndex = 101;\r
+            this.check_TitleCase.Text = "Change case to Title Case";\r
+            this.ToolTip.SetToolTip(this.check_TitleCase, "For the {source} option:.\r\nChange the source name to Title Case\r\ne.g \"MOVIE NAME\"" +\r
+                    " to \"Movie Name\"\r\n");\r
+            this.check_TitleCase.UseVisualStyleBackColor = true;\r
+            this.check_TitleCase.CheckedChanged += new System.EventHandler(this.check_TitleCase_CheckedChanged);\r
+            // \r
+            // check_removeUnderscores\r
+            // \r
+            this.check_removeUnderscores.AutoSize = true;\r
+            this.check_removeUnderscores.Location = new System.Drawing.Point(108, 297);\r
+            this.check_removeUnderscores.Name = "check_removeUnderscores";\r
+            this.check_removeUnderscores.Size = new System.Drawing.Size(183, 17);\r
+            this.check_removeUnderscores.TabIndex = 100;\r
+            this.check_removeUnderscores.Text = "Remove Underscores from Name";\r
+            this.ToolTip.SetToolTip(this.check_removeUnderscores, "For the {source} option:\r\nRemove any underscores from the source name.\r\n\r\n");\r
+            this.check_removeUnderscores.UseVisualStyleBackColor = true;\r
+            this.check_removeUnderscores.CheckedChanged += new System.EventHandler(this.check_removeUnderscores_CheckedChanged);\r
+            // \r
             // check_growlEncode\r
             // \r
-            this.check_growlEncode.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_growlEncode.AutoSize = true;\r
             this.check_growlEncode.BackColor = System.Drawing.Color.Transparent;\r
             this.check_growlEncode.Location = new System.Drawing.Point(282, 122);\r
@@ -244,7 +280,6 @@ namespace Handbrake
             // \r
             // check_GrowlQueue\r
             // \r
-            this.check_GrowlQueue.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_GrowlQueue.AutoSize = true;\r
             this.check_GrowlQueue.BackColor = System.Drawing.Color.Transparent;\r
             this.check_GrowlQueue.Location = new System.Drawing.Point(108, 122);\r
@@ -259,9 +294,8 @@ namespace Handbrake
             // \r
             // check_m4v\r
             // \r
-            this.check_m4v.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_m4v.AutoSize = true;\r
-            this.check_m4v.Location = new System.Drawing.Point(108, 279);\r
+            this.check_m4v.Location = new System.Drawing.Point(108, 321);\r
             this.check_m4v.Name = "check_m4v";\r
             this.check_m4v.Size = new System.Drawing.Size(319, 17);\r
             this.check_m4v.TabIndex = 82;\r
@@ -272,7 +306,6 @@ namespace Handbrake
             // \r
             // label1\r
             // \r
-            this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
             this.label1.AutoSize = true;\r
             this.label1.BackColor = System.Drawing.Color.Transparent;\r
             this.label1.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
@@ -285,9 +318,8 @@ namespace Handbrake
             // \r
             // label7\r
             // \r
-            this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label7.AutoSize = true;\r
-            this.label7.Location = new System.Drawing.Point(179, 260);\r
+            this.label7.Location = new System.Drawing.Point(179, 278);\r
             this.label7.Margin = new System.Windows.Forms.Padding(3);\r
             this.label7.Name = "label7";\r
             this.label7.Size = new System.Drawing.Size(225, 13);\r
@@ -296,7 +328,6 @@ namespace Handbrake
             // \r
             // drop_updateCheckDays\r
             // \r
-            this.drop_updateCheckDays.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.drop_updateCheckDays.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_updateCheckDays.FormattingEnabled = true;\r
             this.drop_updateCheckDays.Items.AddRange(new object[] {\r
@@ -312,7 +343,6 @@ namespace Handbrake
             // \r
             // check_autoNaming\r
             // \r
-            this.check_autoNaming.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_autoNaming.AutoSize = true;\r
             this.check_autoNaming.Location = new System.Drawing.Point(108, 174);\r
             this.check_autoNaming.Name = "check_autoNaming";\r
@@ -325,8 +355,7 @@ namespace Handbrake
             // \r
             // txt_autoNameFormat\r
             // \r
-            this.txt_autoNameFormat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.txt_autoNameFormat.Location = new System.Drawing.Point(182, 233);\r
+            this.txt_autoNameFormat.Location = new System.Drawing.Point(182, 251);\r
             this.txt_autoNameFormat.Name = "txt_autoNameFormat";\r
             this.txt_autoNameFormat.Size = new System.Drawing.Size(349, 21);\r
             this.txt_autoNameFormat.TabIndex = 79;\r
@@ -337,7 +366,6 @@ namespace Handbrake
             // \r
             // check_tooltip\r
             // \r
-            this.check_tooltip.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_tooltip.AutoSize = true;\r
             this.check_tooltip.BackColor = System.Drawing.Color.Transparent;\r
             this.check_tooltip.Location = new System.Drawing.Point(108, 62);\r
@@ -351,9 +379,8 @@ namespace Handbrake
             // \r
             // label5\r
             // \r
-            this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label5.AutoSize = true;\r
-            this.label5.Location = new System.Drawing.Point(105, 236);\r
+            this.label5.Location = new System.Drawing.Point(105, 254);\r
             this.label5.Name = "label5";\r
             this.label5.Size = new System.Drawing.Size(45, 13);\r
             this.label5.TabIndex = 80;\r
@@ -361,7 +388,6 @@ namespace Handbrake
             // \r
             // check_updateCheck\r
             // \r
-            this.check_updateCheck.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_updateCheck.AutoSize = true;\r
             this.check_updateCheck.BackColor = System.Drawing.Color.Transparent;\r
             this.check_updateCheck.Location = new System.Drawing.Point(108, 14);\r
@@ -376,7 +402,6 @@ namespace Handbrake
             // \r
             // label10\r
             // \r
-            this.label10.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label10.AutoSize = true;\r
             this.label10.Location = new System.Drawing.Point(105, 209);\r
             this.label10.Name = "label10";\r
@@ -386,7 +411,6 @@ namespace Handbrake
             // \r
             // btn_browse\r
             // \r
-            this.btn_browse.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.btn_browse.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
             this.btn_browse.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.btn_browse.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
@@ -400,7 +424,6 @@ namespace Handbrake
             // \r
             // label2\r
             // \r
-            this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right;\r
             this.label2.AutoSize = true;\r
             this.label2.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.label2.Location = new System.Drawing.Point(7, 98);\r
@@ -411,10 +434,9 @@ namespace Handbrake
             // \r
             // label13\r
             // \r
-            this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
             this.label13.AutoSize = true;\r
             this.label13.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label13.Location = new System.Drawing.Point(4, 164);\r
+            this.label13.Location = new System.Drawing.Point(4, 174);\r
             this.label13.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
             this.label13.Name = "label13";\r
             this.label13.Size = new System.Drawing.Size(77, 13);\r
@@ -423,13 +445,11 @@ namespace Handbrake
             // \r
             // text_an_path\r
             // \r
-            this.text_an_path.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
             this.text_an_path.Location = new System.Drawing.Point(182, 206);\r
             this.text_an_path.Name = "text_an_path";\r
             this.text_an_path.Size = new System.Drawing.Size(253, 21);\r
             this.text_an_path.TabIndex = 76;\r
-            this.ToolTip.SetToolTip(this.text_an_path, "This is the default location where your encoded files will be stored if \"Automati" +\r
-                    "cally name output files\" is enabled.");\r
+            this.ToolTip.SetToolTip(this.text_an_path, resources.GetString("text_an_path.ToolTip"));\r
             this.text_an_path.TextChanged += new System.EventHandler(this.text_an_path_TextChanged);\r
             // \r
             // tab_picture\r
@@ -438,7 +458,7 @@ namespace Handbrake
             this.tab_picture.Location = new System.Drawing.Point(4, 22);\r
             this.tab_picture.Name = "tab_picture";\r
             this.tab_picture.Padding = new System.Windows.Forms.Padding(10);\r
-            this.tab_picture.Size = new System.Drawing.Size(580, 334);\r
+            this.tab_picture.Size = new System.Drawing.Size(580, 357);\r
             this.tab_picture.TabIndex = 5;\r
             this.tab_picture.Text = "Picture";\r
             this.tab_picture.UseVisualStyleBackColor = true;\r
@@ -503,6 +523,8 @@ namespace Handbrake
             // \r
             // tab_audio_sub\r
             // \r
+            this.tab_audio_sub.Controls.Add(this.radio_preferredAudioAndSubs);\r
+            this.tab_audio_sub.Controls.Add(this.check_AddCCTracks);\r
             this.tab_audio_sub.Controls.Add(this.label31);\r
             this.tab_audio_sub.Controls.Add(this.label15);\r
             this.tab_audio_sub.Controls.Add(this.radio_foreignAndSubs);\r
@@ -511,11 +533,36 @@ namespace Handbrake
             this.tab_audio_sub.Location = new System.Drawing.Point(4, 22);\r
             this.tab_audio_sub.Name = "tab_audio_sub";\r
             this.tab_audio_sub.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tab_audio_sub.Size = new System.Drawing.Size(580, 334);\r
+            this.tab_audio_sub.Size = new System.Drawing.Size(580, 357);\r
             this.tab_audio_sub.TabIndex = 6;\r
             this.tab_audio_sub.Text = "Audio / Subtitles";\r
             this.tab_audio_sub.UseVisualStyleBackColor = true;\r
             // \r
+            // radio_preferredAudioAndSubs\r
+            // \r
+            this.radio_preferredAudioAndSubs.AutoSize = true;\r
+            this.radio_preferredAudioAndSubs.Location = new System.Drawing.Point(200, 99);\r
+            this.radio_preferredAudioAndSubs.Name = "radio_preferredAudioAndSubs";\r
+            this.radio_preferredAudioAndSubs.Size = new System.Drawing.Size(250, 17);\r
+            this.radio_preferredAudioAndSubs.TabIndex = 93;\r
+            this.radio_preferredAudioAndSubs.TabStop = true;\r
+            this.radio_preferredAudioAndSubs.Text = "Use Preferred Language for Audio and Subtitles";\r
+            this.ToolTip.SetToolTip(this.radio_preferredAudioAndSubs, "Use Preferred Language for Audio and Subtitle.");\r
+            this.radio_preferredAudioAndSubs.UseVisualStyleBackColor = true;\r
+            this.radio_preferredAudioAndSubs.CheckedChanged += new System.EventHandler(this.radio_preferredAudioAndSubs_CheckedChanged);\r
+            // \r
+            // check_AddCCTracks\r
+            // \r
+            this.check_AddCCTracks.AutoSize = true;\r
+            this.check_AddCCTracks.Location = new System.Drawing.Point(200, 131);\r
+            this.check_AddCCTracks.Name = "check_AddCCTracks";\r
+            this.check_AddCCTracks.Size = new System.Drawing.Size(198, 17);\r
+            this.check_AddCCTracks.TabIndex = 92;\r
+            this.check_AddCCTracks.Text = "Add Closed Captions when available";\r
+            this.ToolTip.SetToolTip(this.check_AddCCTracks, "Add any CC tracks if they exist");\r
+            this.check_AddCCTracks.UseVisualStyleBackColor = true;\r
+            this.check_AddCCTracks.CheckedChanged += new System.EventHandler(this.check_AddCCTracks_CheckedChanged);\r
+            // \r
             // label31\r
             // \r
             this.label31.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
@@ -542,7 +589,7 @@ namespace Handbrake
             this.radio_foreignAndSubs.AutoSize = true;\r
             this.radio_foreignAndSubs.Location = new System.Drawing.Point(200, 76);\r
             this.radio_foreignAndSubs.Name = "radio_foreignAndSubs";\r
-            this.radio_foreignAndSubs.Size = new System.Drawing.Size(358, 17);\r
+            this.radio_foreignAndSubs.Size = new System.Drawing.Size(347, 17);\r
             this.radio_foreignAndSubs.TabIndex = 90;\r
             this.radio_foreignAndSubs.TabStop = true;\r
             this.radio_foreignAndSubs.Text = "Use foreign language audio and add first preferred language subtitle.";\r
@@ -567,7 +614,7 @@ namespace Handbrake
             this.radio_dub.AutoSize = true;\r
             this.radio_dub.Location = new System.Drawing.Point(200, 53);\r
             this.radio_dub.Name = "radio_dub";\r
-            this.radio_dub.Size = new System.Drawing.Size(164, 17);\r
+            this.radio_dub.Size = new System.Drawing.Size(167, 17);\r
             this.radio_dub.TabIndex = 89;\r
             this.radio_dub.TabStop = true;\r
             this.radio_dub.Text = "DUB Foreign Language Audio";\r
@@ -578,144 +625,168 @@ namespace Handbrake
             // \r
             // tab_cli\r
             // \r
-            this.tab_cli.Controls.Add(this.tableLayoutPanel3);\r
+            this.tab_cli.Controls.Add(this.label11);\r
+            this.tab_cli.Controls.Add(this.check_preventSleep);\r
+            this.tab_cli.Controls.Add(this.check_clearOldLogs);\r
+            this.tab_cli.Controls.Add(this.label12);\r
+            this.tab_cli.Controls.Add(this.btn_viewLogs);\r
+            this.tab_cli.Controls.Add(this.label9);\r
+            this.tab_cli.Controls.Add(this.Label4);\r
+            this.tab_cli.Controls.Add(this.btn_clearLogs);\r
+            this.tab_cli.Controls.Add(this.drp_Priority);\r
+            this.tab_cli.Controls.Add(this.check_logsInSpecifiedLocation);\r
+            this.tab_cli.Controls.Add(this.check_saveLogWithVideo);\r
+            this.tab_cli.Controls.Add(this.label3);\r
+            this.tab_cli.Controls.Add(this.btn_saveLog);\r
+            this.tab_cli.Controls.Add(this.cb_logVerboseLvl);\r
+            this.tab_cli.Controls.Add(this.text_logPath);\r
+            this.tab_cli.Controls.Add(this.label14);\r
             this.tab_cli.Location = new System.Drawing.Point(4, 22);\r
             this.tab_cli.Name = "tab_cli";\r
             this.tab_cli.Padding = new System.Windows.Forms.Padding(10);\r
-            this.tab_cli.Size = new System.Drawing.Size(580, 334);\r
+            this.tab_cli.Size = new System.Drawing.Size(580, 357);\r
             this.tab_cli.TabIndex = 2;\r
-            this.tab_cli.Text = "CLI";\r
+            this.tab_cli.Text = "CLI / System / Logging";\r
             this.tab_cli.UseVisualStyleBackColor = true;\r
             // \r
-            // tableLayoutPanel3\r
-            // \r
-            this.tableLayoutPanel3.AutoSize = true;\r
-            this.tableLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.tableLayoutPanel3.ColumnCount = 7;\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
-            this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel3.Controls.Add(this.label12, 0, 0);\r
-            this.tableLayoutPanel3.Controls.Add(this.check_cli_minimized, 2, 0);\r
-            this.tableLayoutPanel3.Controls.Add(this.label9, 0, 4);\r
-            this.tableLayoutPanel3.Controls.Add(this.btn_saveLog, 6, 7);\r
-            this.tableLayoutPanel3.Controls.Add(this.check_logsInSpecifiedLocation, 2, 6);\r
-            this.tableLayoutPanel3.Controls.Add(this.Label11, 2, 1);\r
-            this.tableLayoutPanel3.Controls.Add(this.check_saveLogWithVideo, 2, 5);\r
-            this.tableLayoutPanel3.Controls.Add(this.Label4, 2, 2);\r
-            this.tableLayoutPanel3.Controls.Add(this.label3, 2, 4);\r
-            this.tableLayoutPanel3.Controls.Add(this.text_logPath, 3, 7);\r
-            this.tableLayoutPanel3.Controls.Add(this.cb_logVerboseLvl, 3, 4);\r
-            this.tableLayoutPanel3.Controls.Add(this.drp_Priority, 3, 2);\r
-            this.tableLayoutPanel3.Controls.Add(this.drp_processors, 3, 1);\r
-            this.tableLayoutPanel3.Controls.Add(this.btn_viewLogs, 2, 8);\r
-            this.tableLayoutPanel3.Controls.Add(this.btn_clearLogs, 4, 8);\r
-            this.tableLayoutPanel3.Controls.Add(this.label14, 2, 7);\r
-            this.tableLayoutPanel3.Location = new System.Drawing.Point(10, 10);\r
-            this.tableLayoutPanel3.Name = "tableLayoutPanel3";\r
-            this.tableLayoutPanel3.RowCount = 10;\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel3.Size = new System.Drawing.Size(560, 227);\r
-            this.tableLayoutPanel3.TabIndex = 62;\r
+            // label11\r
+            // \r
+            this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.label11.AutoSize = true;\r
+            this.label11.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label11.Location = new System.Drawing.Point(7, 46);\r
+            this.label11.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
+            this.label11.Name = "label11";\r
+            this.label11.Size = new System.Drawing.Size(53, 13);\r
+            this.label11.TabIndex = 92;\r
+            this.label11.Text = "System:";\r
+            // \r
+            // check_preventSleep\r
+            // \r
+            this.check_preventSleep.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_preventSleep.AutoSize = true;\r
+            this.check_preventSleep.Location = new System.Drawing.Point(73, 45);\r
+            this.check_preventSleep.Name = "check_preventSleep";\r
+            this.check_preventSleep.Size = new System.Drawing.Size(260, 17);\r
+            this.check_preventSleep.TabIndex = 91;\r
+            this.check_preventSleep.Text = "Prevent the system from sleeping when encoding.";\r
+            this.ToolTip.SetToolTip(this.check_preventSleep, "Prevent system from sleeping during encoding.");\r
+            this.check_preventSleep.UseVisualStyleBackColor = true;\r
+            this.check_preventSleep.CheckedChanged += new System.EventHandler(this.check_preventSleep_CheckedChanged);\r
+            // \r
+            // check_clearOldLogs\r
+            // \r
+            this.check_clearOldLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_clearOldLogs.AutoSize = true;\r
+            this.check_clearOldLogs.Location = new System.Drawing.Point(73, 234);\r
+            this.check_clearOldLogs.Name = "check_clearOldLogs";\r
+            this.check_clearOldLogs.Size = new System.Drawing.Size(162, 17);\r
+            this.check_clearOldLogs.TabIndex = 90;\r
+            this.check_clearOldLogs.Text = "Clear logs older than 30 days";\r
+            this.ToolTip.SetToolTip(this.check_clearOldLogs, "Clear logs which are older than 30 days.\r\nThis only applies to HandBrakes Applica" +\r
+                    "tion Data Log folder.");\r
+            this.check_clearOldLogs.UseVisualStyleBackColor = true;\r
+            this.check_clearOldLogs.CheckedChanged += new System.EventHandler(this.check_clearOldLogs_CheckedChanged);\r
             // \r
             // label12\r
             // \r
             this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
             this.label12.AutoSize = true;\r
             this.label12.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label12.Location = new System.Drawing.Point(11, 5);\r
+            this.label12.Location = new System.Drawing.Point(7, 15);\r
             this.label12.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
             this.label12.Name = "label12";\r
-            this.tableLayoutPanel3.SetRowSpan(this.label12, 2);\r
             this.label12.Size = new System.Drawing.Size(28, 13);\r
             this.label12.TabIndex = 75;\r
             this.label12.Text = "CLI:";\r
             // \r
-            // check_cli_minimized\r
+            // btn_viewLogs\r
             // \r
-            this.check_cli_minimized.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_cli_minimized.AutoSize = true;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.check_cli_minimized, 5);\r
-            this.check_cli_minimized.Location = new System.Drawing.Point(65, 3);\r
-            this.check_cli_minimized.Name = "check_cli_minimized";\r
-            this.check_cli_minimized.Size = new System.Drawing.Size(137, 17);\r
-            this.check_cli_minimized.TabIndex = 76;\r
-            this.check_cli_minimized.Text = "Start window minimized";\r
-            this.ToolTip.SetToolTip(this.check_cli_minimized, "Starts a CLI window minimized.");\r
-            this.check_cli_minimized.UseVisualStyleBackColor = true;\r
-            this.check_cli_minimized.CheckedChanged += new System.EventHandler(this.check_cli_minimized_CheckedChanged);\r
+            this.btn_viewLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.btn_viewLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_viewLogs.ForeColor = System.Drawing.Color.DarkOrange;\r
+            this.btn_viewLogs.Location = new System.Drawing.Point(129, 196);\r
+            this.btn_viewLogs.Name = "btn_viewLogs";\r
+            this.btn_viewLogs.Size = new System.Drawing.Size(139, 23);\r
+            this.btn_viewLogs.TabIndex = 89;\r
+            this.btn_viewLogs.Text = "View Log Directory";\r
+            this.btn_viewLogs.UseVisualStyleBackColor = true;\r
+            this.btn_viewLogs.Click += new System.EventHandler(this.btn_viewLogs_Click);\r
             // \r
             // label9\r
             // \r
             this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
             this.label9.AutoSize = true;\r
             this.label9.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label9.Location = new System.Drawing.Point(3, 102);\r
+            this.label9.Location = new System.Drawing.Point(7, 92);\r
             this.label9.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
             this.label9.Name = "label9";\r
-            this.tableLayoutPanel3.SetRowSpan(this.label9, 2);\r
             this.label9.Size = new System.Drawing.Size(36, 13);\r
             this.label9.TabIndex = 77;\r
             this.label9.Text = "Logs:";\r
             // \r
-            // btn_saveLog\r
+            // Label4\r
             // \r
-            this.btn_saveLog.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.btn_saveLog.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
-            this.btn_saveLog.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_saveLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_saveLog.Location = new System.Drawing.Point(480, 173);\r
-            this.btn_saveLog.Name = "btn_saveLog";\r
-            this.btn_saveLog.Size = new System.Drawing.Size(77, 22);\r
-            this.btn_saveLog.TabIndex = 82;\r
-            this.btn_saveLog.Text = "Browse";\r
-            this.btn_saveLog.UseVisualStyleBackColor = true;\r
-            this.btn_saveLog.Click += new System.EventHandler(this.btn_saveLog_Click);\r
+            this.Label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.Label4.AutoSize = true;\r
+            this.Label4.BackColor = System.Drawing.Color.Transparent;\r
+            this.Label4.Location = new System.Drawing.Point(70, 15);\r
+            this.Label4.Name = "Label4";\r
+            this.Label4.Size = new System.Drawing.Size(70, 13);\r
+            this.Label4.TabIndex = 42;\r
+            this.Label4.Text = "Priority level:";\r
+            // \r
+            // btn_clearLogs\r
+            // \r
+            this.btn_clearLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.btn_clearLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_clearLogs.ForeColor = System.Drawing.Color.DarkOrange;\r
+            this.btn_clearLogs.Location = new System.Drawing.Point(274, 196);\r
+            this.btn_clearLogs.Name = "btn_clearLogs";\r
+            this.btn_clearLogs.Size = new System.Drawing.Size(135, 23);\r
+            this.btn_clearLogs.TabIndex = 88;\r
+            this.btn_clearLogs.Text = "Clear Log History";\r
+            this.btn_clearLogs.UseVisualStyleBackColor = true;\r
+            this.btn_clearLogs.Click += new System.EventHandler(this.btn_clearLogs_Click);\r
+            // \r
+            // drp_Priority\r
+            // \r
+            this.drp_Priority.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.drp_Priority.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.drp_Priority.FormattingEnabled = true;\r
+            this.drp_Priority.Items.AddRange(new object[] {\r
+            "Realtime",\r
+            "High",\r
+            "Above Normal",\r
+            "Normal",\r
+            "Below Normal",\r
+            "Low"});\r
+            this.drp_Priority.Location = new System.Drawing.Point(177, 12);\r
+            this.drp_Priority.Name = "drp_Priority";\r
+            this.drp_Priority.Size = new System.Drawing.Size(111, 21);\r
+            this.drp_Priority.TabIndex = 43;\r
+            this.ToolTip.SetToolTip(this.drp_Priority, "Set the application priority level for the CLI. \r\nIt\'s best to leave this on Belo" +\r
+                    "w Normal if you wish to use your system whilst encoding with HandBrake.\r\n");\r
+            this.drp_Priority.SelectedIndexChanged += new System.EventHandler(this.drp_Priority_SelectedIndexChanged);\r
             // \r
             // check_logsInSpecifiedLocation\r
             // \r
             this.check_logsInSpecifiedLocation.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_logsInSpecifiedLocation.AutoSize = true;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.check_logsInSpecifiedLocation, 5);\r
-            this.check_logsInSpecifiedLocation.Location = new System.Drawing.Point(65, 150);\r
+            this.check_logsInSpecifiedLocation.Location = new System.Drawing.Point(73, 139);\r
             this.check_logsInSpecifiedLocation.Name = "check_logsInSpecifiedLocation";\r
-            this.check_logsInSpecifiedLocation.Size = new System.Drawing.Size(306, 17);\r
+            this.check_logsInSpecifiedLocation.Size = new System.Drawing.Size(305, 17);\r
             this.check_logsInSpecifiedLocation.TabIndex = 87;\r
             this.check_logsInSpecifiedLocation.Text = "Put a copy of individual encode logs in a specified location:";\r
             this.ToolTip.SetToolTip(this.check_logsInSpecifiedLocation, "Place a copy of the encode log in the same folder as the encoded movie.");\r
             this.check_logsInSpecifiedLocation.UseVisualStyleBackColor = true;\r
             this.check_logsInSpecifiedLocation.CheckedChanged += new System.EventHandler(this.check_logsInSpecifiedLocation_CheckedChanged);\r
             // \r
-            // Label11\r
-            // \r
-            this.Label11.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.Label11.AutoSize = true;\r
-            this.Label11.BackColor = System.Drawing.Color.Transparent;\r
-            this.Label11.Location = new System.Drawing.Point(65, 30);\r
-            this.Label11.Name = "Label11";\r
-            this.Label11.Size = new System.Drawing.Size(87, 13);\r
-            this.Label11.TabIndex = 40;\r
-            this.Label11.Text = "Processor cores:";\r
-            // \r
             // check_saveLogWithVideo\r
             // \r
             this.check_saveLogWithVideo.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_saveLogWithVideo.AutoSize = true;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.check_saveLogWithVideo, 5);\r
-            this.check_saveLogWithVideo.Location = new System.Drawing.Point(65, 127);\r
+            this.check_saveLogWithVideo.Location = new System.Drawing.Point(73, 116);\r
             this.check_saveLogWithVideo.Name = "check_saveLogWithVideo";\r
             this.check_saveLogWithVideo.Size = new System.Drawing.Size(382, 17);\r
             this.check_saveLogWithVideo.TabIndex = 83;\r
@@ -724,133 +795,62 @@ namespace Handbrake
             this.check_saveLogWithVideo.UseVisualStyleBackColor = true;\r
             this.check_saveLogWithVideo.CheckedChanged += new System.EventHandler(this.check_saveLogWithVideo_CheckedChanged);\r
             // \r
-            // Label4\r
-            // \r
-            this.Label4.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.Label4.AutoSize = true;\r
-            this.Label4.BackColor = System.Drawing.Color.Transparent;\r
-            this.Label4.Location = new System.Drawing.Point(65, 57);\r
-            this.Label4.Name = "Label4";\r
-            this.Label4.Size = new System.Drawing.Size(70, 13);\r
-            this.Label4.TabIndex = 42;\r
-            this.Label4.Text = "Priority level:";\r
-            // \r
             // label3\r
             // \r
             this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label3.AutoSize = true;\r
             this.label3.BackColor = System.Drawing.Color.Transparent;\r
-            this.label3.Location = new System.Drawing.Point(65, 104);\r
+            this.label3.Location = new System.Drawing.Point(70, 92);\r
             this.label3.Name = "label3";\r
             this.label3.Size = new System.Drawing.Size(101, 13);\r
             this.label3.TabIndex = 85;\r
             this.label3.Text = "Log verbosity level:";\r
             // \r
-            // text_logPath\r
+            // btn_saveLog\r
             // \r
-            this.text_logPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.tableLayoutPanel3.SetColumnSpan(this.text_logPath, 3);\r
-            this.text_logPath.Location = new System.Drawing.Point(172, 173);\r
-            this.text_logPath.Name = "text_logPath";\r
-            this.text_logPath.Size = new System.Drawing.Size(302, 21);\r
-            this.text_logPath.TabIndex = 80;\r
-            this.ToolTip.SetToolTip(this.text_logPath, "The default location where auto named files are stored.");\r
-            this.text_logPath.TextChanged += new System.EventHandler(this.text_logPath_TextChanged);\r
+            this.btn_saveLog.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.btn_saveLog.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
+            this.btn_saveLog.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.btn_saveLog.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
+            this.btn_saveLog.Location = new System.Drawing.Point(437, 169);\r
+            this.btn_saveLog.Name = "btn_saveLog";\r
+            this.btn_saveLog.Size = new System.Drawing.Size(77, 22);\r
+            this.btn_saveLog.TabIndex = 82;\r
+            this.btn_saveLog.Text = "Browse";\r
+            this.btn_saveLog.UseVisualStyleBackColor = true;\r
+            this.btn_saveLog.Click += new System.EventHandler(this.btn_saveLog_Click);\r
             // \r
             // cb_logVerboseLvl\r
             // \r
             this.cb_logVerboseLvl.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.cb_logVerboseLvl, 4);\r
             this.cb_logVerboseLvl.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.cb_logVerboseLvl.FormattingEnabled = true;\r
             this.cb_logVerboseLvl.Items.AddRange(new object[] {\r
             "0",\r
             "1",\r
             "2"});\r
-            this.cb_logVerboseLvl.Location = new System.Drawing.Point(172, 100);\r
+            this.cb_logVerboseLvl.Location = new System.Drawing.Point(177, 89);\r
             this.cb_logVerboseLvl.Name = "cb_logVerboseLvl";\r
             this.cb_logVerboseLvl.Size = new System.Drawing.Size(111, 21);\r
             this.cb_logVerboseLvl.TabIndex = 86;\r
             this.ToolTip.SetToolTip(this.cb_logVerboseLvl, "Activity Log Verbosity Level");\r
             this.cb_logVerboseLvl.SelectedIndexChanged += new System.EventHandler(this.cb_logVerboseLvl_SelectedIndexChanged);\r
             // \r
-            // drp_Priority\r
-            // \r
-            this.drp_Priority.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.drp_Priority, 4);\r
-            this.drp_Priority.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
-            this.drp_Priority.FormattingEnabled = true;\r
-            this.drp_Priority.Items.AddRange(new object[] {\r
-            "Realtime",\r
-            "High",\r
-            "Above Normal",\r
-            "Normal",\r
-            "Below Normal",\r
-            "Low"});\r
-            this.drp_Priority.Location = new System.Drawing.Point(172, 53);\r
-            this.drp_Priority.Name = "drp_Priority";\r
-            this.drp_Priority.Size = new System.Drawing.Size(111, 21);\r
-            this.drp_Priority.TabIndex = 43;\r
-            this.ToolTip.SetToolTip(this.drp_Priority, "Set the application priority level for the CLI. \r\nIt\'s best to leave this on Belo" +\r
-                    "w Normal if you wish to use your system whilst encoding with HandBrake.\r\n");\r
-            this.drp_Priority.SelectedIndexChanged += new System.EventHandler(this.drp_Priority_SelectedIndexChanged);\r
-            // \r
-            // drp_processors\r
-            // \r
-            this.drp_processors.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.drp_processors, 4);\r
-            this.drp_processors.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
-            this.drp_processors.FormattingEnabled = true;\r
-            this.drp_processors.Items.AddRange(new object[] {\r
-            "Automatic",\r
-            "1",\r
-            "2",\r
-            "3",\r
-            "4",\r
-            "5",\r
-            "6",\r
-            "7",\r
-            "8"});\r
-            this.drp_processors.Location = new System.Drawing.Point(172, 26);\r
-            this.drp_processors.Name = "drp_processors";\r
-            this.drp_processors.Size = new System.Drawing.Size(111, 21);\r
-            this.drp_processors.TabIndex = 41;\r
-            this.ToolTip.SetToolTip(this.drp_processors, "The number of processor\'s / processor cores. Unless your having problems, leave o" +\r
-                    "n Automatic.");\r
-            this.drp_processors.SelectedIndexChanged += new System.EventHandler(this.drp_processors_SelectedIndexChanged);\r
-            // \r
-            // btn_viewLogs\r
-            // \r
-            this.btn_viewLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.tableLayoutPanel3.SetColumnSpan(this.btn_viewLogs, 2);\r
-            this.btn_viewLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_viewLogs.ForeColor = System.Drawing.Color.DarkOrange;\r
-            this.btn_viewLogs.Location = new System.Drawing.Point(65, 201);\r
-            this.btn_viewLogs.Name = "btn_viewLogs";\r
-            this.btn_viewLogs.Size = new System.Drawing.Size(139, 23);\r
-            this.btn_viewLogs.TabIndex = 89;\r
-            this.btn_viewLogs.Text = "View Log Directory";\r
-            this.btn_viewLogs.UseVisualStyleBackColor = true;\r
-            this.btn_viewLogs.Click += new System.EventHandler(this.btn_viewLogs_Click);\r
-            // \r
-            // btn_clearLogs\r
+            // text_logPath\r
             // \r
-            this.btn_clearLogs.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.btn_clearLogs.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_clearLogs.ForeColor = System.Drawing.Color.DarkOrange;\r
-            this.btn_clearLogs.Location = new System.Drawing.Point(210, 201);\r
-            this.btn_clearLogs.Name = "btn_clearLogs";\r
-            this.btn_clearLogs.Size = new System.Drawing.Size(135, 23);\r
-            this.btn_clearLogs.TabIndex = 88;\r
-            this.btn_clearLogs.Text = "Clear Log History";\r
-            this.btn_clearLogs.UseVisualStyleBackColor = true;\r
-            this.btn_clearLogs.Click += new System.EventHandler(this.btn_clearLogs_Click);\r
+            this.text_logPath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.text_logPath.Location = new System.Drawing.Point(129, 169);\r
+            this.text_logPath.Name = "text_logPath";\r
+            this.text_logPath.Size = new System.Drawing.Size(302, 21);\r
+            this.text_logPath.TabIndex = 80;\r
+            this.ToolTip.SetToolTip(this.text_logPath, "The default location where auto named files are stored.");\r
+            this.text_logPath.TextChanged += new System.EventHandler(this.text_logPath_TextChanged);\r
             // \r
             // label14\r
             // \r
             this.label14.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label14.AutoSize = true;\r
-            this.label14.Location = new System.Drawing.Point(65, 177);\r
+            this.label14.Location = new System.Drawing.Point(70, 172);\r
             this.label14.Name = "label14";\r
             this.label14.Size = new System.Drawing.Size(53, 13);\r
             this.label14.TabIndex = 81;\r
@@ -858,63 +858,120 @@ namespace Handbrake
             // \r
             // tab_advanced\r
             // \r
-            this.tab_advanced.Controls.Add(this.tableLayoutPanel4);\r
+            this.tab_advanced.Controls.Add(this.check_showCliForInGUIEncode);\r
+            this.tab_advanced.Controls.Add(this.drop_previewScanCount);\r
+            this.tab_advanced.Controls.Add(this.label33);\r
+            this.tab_advanced.Controls.Add(this.label6);\r
+            this.tab_advanced.Controls.Add(this.check_trayStatusAlerts);\r
+            this.tab_advanced.Controls.Add(this.check_mainMinimize);\r
+            this.tab_advanced.Controls.Add(this.check_promptOnUnmatchingQueries);\r
+            this.tab_advanced.Controls.Add(this.check_dvdnav);\r
+            this.tab_advanced.Controls.Add(this.check_queryEditorTab);\r
+            this.tab_advanced.Controls.Add(this.label32);\r
+            this.tab_advanced.Controls.Add(this.drop_x264step);\r
+            this.tab_advanced.Controls.Add(this.label30);\r
+            this.tab_advanced.Controls.Add(this.check_disablePresetNotification);\r
+            this.tab_advanced.Controls.Add(this.label28);\r
             this.tab_advanced.Location = new System.Drawing.Point(4, 22);\r
             this.tab_advanced.Name = "tab_advanced";\r
             this.tab_advanced.Padding = new System.Windows.Forms.Padding(10);\r
-            this.tab_advanced.Size = new System.Drawing.Size(580, 334);\r
+            this.tab_advanced.Size = new System.Drawing.Size(580, 357);\r
             this.tab_advanced.TabIndex = 4;\r
             this.tab_advanced.Text = "Advanced / Other";\r
             this.tab_advanced.UseVisualStyleBackColor = true;\r
             // \r
-            // tableLayoutPanel4\r
-            // \r
-            this.tableLayoutPanel4.AutoSize = true;\r
-            this.tableLayoutPanel4.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.tableLayoutPanel4.ColumnCount = 6;\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel4.Controls.Add(this.check_promptOnUnmatchingQueries, 3, 4);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_dvdnav, 2, 10);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_trayStatusAlerts, 3, 2);\r
-            this.tableLayoutPanel4.Controls.Add(this.label32, 0, 10);\r
-            this.tableLayoutPanel4.Controls.Add(this.label6, 0, 0);\r
-            this.tableLayoutPanel4.Controls.Add(this.drop_x264step, 4, 8);\r
-            this.tableLayoutPanel4.Controls.Add(this.label30, 2, 8);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_mainMinimize, 2, 1);\r
-            this.tableLayoutPanel4.Controls.Add(this.label28, 0, 8);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_queryEditorTab, 2, 3);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_disablePresetNotification, 2, 5);\r
-            this.tableLayoutPanel4.Controls.Add(this.check_inGuiStatus, 2, 6);\r
-            this.tableLayoutPanel4.Location = new System.Drawing.Point(10, 10);\r
-            this.tableLayoutPanel4.Name = "tableLayoutPanel4";\r
-            this.tableLayoutPanel4.RowCount = 12;\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel4.Size = new System.Drawing.Size(395, 228);\r
-            this.tableLayoutPanel4.TabIndex = 62;\r
+            // check_showCliForInGUIEncode\r
+            // \r
+            this.check_showCliForInGUIEncode.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_showCliForInGUIEncode.AutoSize = true;\r
+            this.check_showCliForInGUIEncode.BackColor = System.Drawing.Color.Transparent;\r
+            this.check_showCliForInGUIEncode.Location = new System.Drawing.Point(81, 129);\r
+            this.check_showCliForInGUIEncode.Name = "check_showCliForInGUIEncode";\r
+            this.check_showCliForInGUIEncode.Size = new System.Drawing.Size(324, 17);\r
+            this.check_showCliForInGUIEncode.TabIndex = 96;\r
+            this.check_showCliForInGUIEncode.Text = "Show CLI window (Allows you to cleanly exit encode with ctrl-c)";\r
+            this.ToolTip.SetToolTip(this.check_showCliForInGUIEncode, resources.GetString("check_showCliForInGUIEncode.ToolTip"));\r
+            this.check_showCliForInGUIEncode.UseVisualStyleBackColor = false;\r
+            this.check_showCliForInGUIEncode.CheckedChanged += new System.EventHandler(this.check_showCliForInGUIEncode_CheckedChanged);\r
+            // \r
+            // drop_previewScanCount\r
+            // \r
+            this.drop_previewScanCount.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.drop_previewScanCount.FormattingEnabled = true;\r
+            this.drop_previewScanCount.Items.AddRange(new object[] {\r
+            "10",\r
+            "15",\r
+            "20",\r
+            "25",\r
+            "30"});\r
+            this.drop_previewScanCount.Location = new System.Drawing.Point(273, 173);\r
+            this.drop_previewScanCount.Name = "drop_previewScanCount";\r
+            this.drop_previewScanCount.Size = new System.Drawing.Size(85, 21);\r
+            this.drop_previewScanCount.TabIndex = 95;\r
+            this.ToolTip.SetToolTip(this.drop_previewScanCount, "Allows a greater number of preview frames to be selectable on the \"Preview\" windo" +\r
+                    "w.\r\n\r\nThis can in some cases improve the accuracy of the auto crop feature.");\r
+            this.drop_previewScanCount.SelectedIndexChanged += new System.EventHandler(this.drop_previewScanCount_SelectedIndexChanged);\r
+            // \r
+            // label33\r
+            // \r
+            this.label33.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.label33.AutoSize = true;\r
+            this.label33.Location = new System.Drawing.Point(79, 176);\r
+            this.label33.Name = "label33";\r
+            this.label33.Size = new System.Drawing.Size(181, 13);\r
+            this.label33.TabIndex = 94;\r
+            this.label33.Text = "Number of picture previews to scan:";\r
+            // \r
+            // label6\r
+            // \r
+            this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
+            this.label6.AutoSize = true;\r
+            this.label6.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label6.Location = new System.Drawing.Point(15, 15);\r
+            this.label6.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
+            this.label6.Name = "label6";\r
+            this.label6.Size = new System.Drawing.Size(31, 13);\r
+            this.label6.TabIndex = 71;\r
+            this.label6.Text = "GUI:";\r
+            // \r
+            // check_trayStatusAlerts\r
+            // \r
+            this.check_trayStatusAlerts.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_trayStatusAlerts.AutoSize = true;\r
+            this.check_trayStatusAlerts.BackColor = System.Drawing.Color.Transparent;\r
+            this.check_trayStatusAlerts.Location = new System.Drawing.Point(81, 37);\r
+            this.check_trayStatusAlerts.Name = "check_trayStatusAlerts";\r
+            this.check_trayStatusAlerts.Size = new System.Drawing.Size(288, 17);\r
+            this.check_trayStatusAlerts.TabIndex = 93;\r
+            this.check_trayStatusAlerts.Text = "Display status messages from tray icon (balloon popups)";\r
+            this.ToolTip.SetToolTip(this.check_trayStatusAlerts, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +\r
+                    " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +\r
+                    "");\r
+            this.check_trayStatusAlerts.UseVisualStyleBackColor = false;\r
+            this.check_trayStatusAlerts.CheckedChanged += new System.EventHandler(this.check_trayStatusAlerts_CheckedChanged);\r
+            // \r
+            // check_mainMinimize\r
+            // \r
+            this.check_mainMinimize.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_mainMinimize.AutoSize = true;\r
+            this.check_mainMinimize.BackColor = System.Drawing.Color.Transparent;\r
+            this.check_mainMinimize.Location = new System.Drawing.Point(81, 14);\r
+            this.check_mainMinimize.Name = "check_mainMinimize";\r
+            this.check_mainMinimize.Size = new System.Drawing.Size(221, 17);\r
+            this.check_mainMinimize.TabIndex = 82;\r
+            this.check_mainMinimize.Text = "Minimize to system tray (Requires Restart)";\r
+            this.ToolTip.SetToolTip(this.check_mainMinimize, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +\r
+                    " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +\r
+                    "");\r
+            this.check_mainMinimize.UseVisualStyleBackColor = false;\r
+            this.check_mainMinimize.CheckedChanged += new System.EventHandler(this.check_mainMinimize_CheckedChanged);\r
             // \r
             // check_promptOnUnmatchingQueries\r
             // \r
             this.check_promptOnUnmatchingQueries.AutoSize = true;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_promptOnUnmatchingQueries, 3);\r
-            this.check_promptOnUnmatchingQueries.Location = new System.Drawing.Point(87, 72);\r
+            this.check_promptOnUnmatchingQueries.Location = new System.Drawing.Point(100, 83);\r
             this.check_promptOnUnmatchingQueries.Name = "check_promptOnUnmatchingQueries";\r
-            this.check_promptOnUnmatchingQueries.Size = new System.Drawing.Size(305, 17);\r
+            this.check_promptOnUnmatchingQueries.Size = new System.Drawing.Size(300, 17);\r
             this.check_promptOnUnmatchingQueries.TabIndex = 63;\r
             this.check_promptOnUnmatchingQueries.Text = "Prompt when a manual query does not match GUI settings";\r
             this.check_promptOnUnmatchingQueries.UseVisualStyleBackColor = true;\r
@@ -925,59 +982,42 @@ namespace Handbrake
             this.check_dvdnav.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_dvdnav.AutoSize = true;\r
             this.check_dvdnav.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_dvdnav, 4);\r
-            this.check_dvdnav.Location = new System.Drawing.Point(67, 208);\r
+            this.check_dvdnav.Location = new System.Drawing.Point(82, 247);\r
             this.check_dvdnav.Name = "check_dvdnav";\r
-            this.check_dvdnav.Size = new System.Drawing.Size(276, 17);\r
+            this.check_dvdnav.Size = new System.Drawing.Size(277, 17);\r
             this.check_dvdnav.TabIndex = 90;\r
             this.check_dvdnav.Text = "Disable LibDVDNav. (libdvdread will be used instead)";\r
             this.check_dvdnav.UseVisualStyleBackColor = false;\r
             this.check_dvdnav.CheckedChanged += new System.EventHandler(this.check_dvdnav_CheckedChanged);\r
             // \r
-            // check_trayStatusAlerts\r
+            // check_queryEditorTab\r
             // \r
-            this.check_trayStatusAlerts.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_trayStatusAlerts.AutoSize = true;\r
-            this.check_trayStatusAlerts.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_trayStatusAlerts, 3);\r
-            this.check_trayStatusAlerts.Location = new System.Drawing.Point(87, 26);\r
-            this.check_trayStatusAlerts.Name = "check_trayStatusAlerts";\r
-            this.check_trayStatusAlerts.Size = new System.Drawing.Size(296, 17);\r
-            this.check_trayStatusAlerts.TabIndex = 93;\r
-            this.check_trayStatusAlerts.Text = "Display status messages from tray icon (balloon popups)";\r
-            this.ToolTip.SetToolTip(this.check_trayStatusAlerts, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +\r
-                    " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +\r
-                    "");\r
-            this.check_trayStatusAlerts.UseVisualStyleBackColor = false;\r
-            this.check_trayStatusAlerts.CheckedChanged += new System.EventHandler(this.check_trayStatusAlerts_CheckedChanged);\r
+            this.check_queryEditorTab.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
+            this.check_queryEditorTab.AutoSize = true;\r
+            this.check_queryEditorTab.BackColor = System.Drawing.Color.Transparent;\r
+            this.check_queryEditorTab.Location = new System.Drawing.Point(81, 60);\r
+            this.check_queryEditorTab.Name = "check_queryEditorTab";\r
+            this.check_queryEditorTab.Size = new System.Drawing.Size(236, 17);\r
+            this.check_queryEditorTab.TabIndex = 84;\r
+            this.check_queryEditorTab.Text = "Enable \"Query Editor\" tab (Requires Restart)";\r
+            this.ToolTip.SetToolTip(this.check_queryEditorTab, "Enables the Query Editor tab on the main window. Requires program restart to take" +\r
+                    " effect.");\r
+            this.check_queryEditorTab.UseVisualStyleBackColor = false;\r
+            this.check_queryEditorTab.CheckedChanged += new System.EventHandler(this.check_queryEditorTab_CheckedChanged);\r
             // \r
             // label32\r
             // \r
             this.label32.Anchor = System.Windows.Forms.AnchorStyles.Right;\r
             this.label32.AutoSize = true;\r
             this.label32.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label32.Location = new System.Drawing.Point(8, 210);\r
+            this.label32.Location = new System.Drawing.Point(13, 248);\r
             this.label32.Name = "label32";\r
             this.label32.Size = new System.Drawing.Size(33, 13);\r
             this.label32.TabIndex = 89;\r
             this.label32.Text = "DVD:";\r
             // \r
-            // label6\r
-            // \r
-            this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.label6.AutoSize = true;\r
-            this.label6.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label6.Location = new System.Drawing.Point(10, 5);\r
-            this.label6.Margin = new System.Windows.Forms.Padding(3, 5, 3, 0);\r
-            this.label6.Name = "label6";\r
-            this.tableLayoutPanel4.SetRowSpan(this.label6, 2);\r
-            this.label6.Size = new System.Drawing.Size(31, 13);\r
-            this.label6.TabIndex = 71;\r
-            this.label6.Text = "GUI:";\r
-            // \r
             // drop_x264step\r
             // \r
-            this.tableLayoutPanel4.SetColumnSpan(this.drop_x264step, 2);\r
             this.drop_x264step.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.drop_x264step.FormattingEnabled = true;\r
             this.drop_x264step.Items.AddRange(new object[] {\r
@@ -985,78 +1025,31 @@ namespace Handbrake
             "0.50",\r
             "0.25",\r
             "0.20"});\r
-            this.drop_x264step.Location = new System.Drawing.Point(262, 161);\r
+            this.drop_x264step.Location = new System.Drawing.Point(273, 210);\r
             this.drop_x264step.Name = "drop_x264step";\r
             this.drop_x264step.Size = new System.Drawing.Size(85, 21);\r
             this.drop_x264step.TabIndex = 86;\r
-            this.ToolTip.SetToolTip(this.drop_x264step, "The number of processor\'s / processor cores. Unless your having problems, leave o" +\r
-                    "n Automatic.");\r
+            this.ToolTip.SetToolTip(this.drop_x264step, "Quality Slider Control Granularity for x264 encoding only.");\r
             this.drop_x264step.SelectedIndexChanged += new System.EventHandler(this.x264step_SelectedIndexChanged);\r
             // \r
             // label30\r
             // \r
             this.label30.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label30.AutoSize = true;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.label30, 2);\r
-            this.label30.Location = new System.Drawing.Point(67, 165);\r
+            this.label30.Location = new System.Drawing.Point(78, 213);\r
             this.label30.Name = "label30";\r
             this.label30.Size = new System.Drawing.Size(189, 13);\r
             this.label30.TabIndex = 87;\r
             this.label30.Text = "Constant quality fractional granularity";\r
             // \r
-            // check_mainMinimize\r
-            // \r
-            this.check_mainMinimize.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_mainMinimize.AutoSize = true;\r
-            this.check_mainMinimize.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_mainMinimize, 4);\r
-            this.check_mainMinimize.Location = new System.Drawing.Point(67, 3);\r
-            this.check_mainMinimize.Name = "check_mainMinimize";\r
-            this.check_mainMinimize.Size = new System.Drawing.Size(138, 17);\r
-            this.check_mainMinimize.TabIndex = 82;\r
-            this.check_mainMinimize.Text = "Minimize to system tray";\r
-            this.ToolTip.SetToolTip(this.check_mainMinimize, "Minimize the window to the system tray rather than the task bar.\r\nThe system tray" +\r
-                    " icon has encode status notifications.\r\nNote: requires restart to take effect!\r\n" +\r
-                    "");\r
-            this.check_mainMinimize.UseVisualStyleBackColor = false;\r
-            this.check_mainMinimize.CheckedChanged += new System.EventHandler(this.check_mainMinimize_CheckedChanged);\r
-            // \r
-            // label28\r
-            // \r
-            this.label28.Anchor = System.Windows.Forms.AnchorStyles.Right;\r
-            this.label28.AutoSize = true;\r
-            this.label28.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label28.Location = new System.Drawing.Point(3, 165);\r
-            this.label28.Name = "label28";\r
-            this.label28.Size = new System.Drawing.Size(38, 13);\r
-            this.label28.TabIndex = 85;\r
-            this.label28.Text = "x264:";\r
-            // \r
-            // check_queryEditorTab\r
-            // \r
-            this.check_queryEditorTab.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_queryEditorTab.AutoSize = true;\r
-            this.check_queryEditorTab.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_queryEditorTab, 4);\r
-            this.check_queryEditorTab.Location = new System.Drawing.Point(67, 49);\r
-            this.check_queryEditorTab.Name = "check_queryEditorTab";\r
-            this.check_queryEditorTab.Size = new System.Drawing.Size(241, 17);\r
-            this.check_queryEditorTab.TabIndex = 84;\r
-            this.check_queryEditorTab.Text = "Enable \"Query Editor\" tab (Requires Restart)";\r
-            this.ToolTip.SetToolTip(this.check_queryEditorTab, "Enables the Query Editor tab on the main window. Requires program restart to take" +\r
-                    " effect.");\r
-            this.check_queryEditorTab.UseVisualStyleBackColor = false;\r
-            this.check_queryEditorTab.CheckedChanged += new System.EventHandler(this.check_queryEditorTab_CheckedChanged);\r
-            // \r
             // check_disablePresetNotification\r
             // \r
             this.check_disablePresetNotification.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.check_disablePresetNotification.AutoSize = true;\r
             this.check_disablePresetNotification.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_disablePresetNotification, 4);\r
-            this.check_disablePresetNotification.Location = new System.Drawing.Point(67, 95);\r
+            this.check_disablePresetNotification.Location = new System.Drawing.Point(81, 106);\r
             this.check_disablePresetNotification.Name = "check_disablePresetNotification";\r
-            this.check_disablePresetNotification.Size = new System.Drawing.Size(222, 17);\r
+            this.check_disablePresetNotification.Size = new System.Drawing.Size(216, 17);\r
             this.check_disablePresetNotification.TabIndex = 91;\r
             this.check_disablePresetNotification.Text = "Disable built-in preset update notification";\r
             this.ToolTip.SetToolTip(this.check_disablePresetNotification, "Disables the notification you recieve when presets are updated when a new version" +\r
@@ -1064,50 +1057,22 @@ namespace Handbrake
             this.check_disablePresetNotification.UseVisualStyleBackColor = false;\r
             this.check_disablePresetNotification.CheckedChanged += new System.EventHandler(this.check_disablePresetNotification_CheckedChanged);\r
             // \r
-            // check_inGuiStatus\r
-            // \r
-            this.check_inGuiStatus.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
-            this.check_inGuiStatus.AutoSize = true;\r
-            this.check_inGuiStatus.BackColor = System.Drawing.Color.Transparent;\r
-            this.tableLayoutPanel4.SetColumnSpan(this.check_inGuiStatus, 4);\r
-            this.check_inGuiStatus.Location = new System.Drawing.Point(67, 118);\r
-            this.check_inGuiStatus.Name = "check_inGuiStatus";\r
-            this.check_inGuiStatus.Size = new System.Drawing.Size(235, 17);\r
-            this.check_inGuiStatus.TabIndex = 92;\r
-            this.check_inGuiStatus.Text = "Enable in-GUI encode status (experimental)";\r
-            this.ToolTip.SetToolTip(this.check_inGuiStatus, "Displays the CLI status in the GUI windows instead of the CLI window.");\r
-            this.check_inGuiStatus.UseVisualStyleBackColor = false;\r
-            this.check_inGuiStatus.CheckedChanged += new System.EventHandler(this.check_inGuiStatus_CheckedChanged);\r
-            // \r
-            // tab_debug\r
-            // \r
-            this.tab_debug.Controls.Add(this.check_disableResCalc);\r
-            this.tab_debug.Location = new System.Drawing.Point(4, 22);\r
-            this.tab_debug.Name = "tab_debug";\r
-            this.tab_debug.Padding = new System.Windows.Forms.Padding(3);\r
-            this.tab_debug.Size = new System.Drawing.Size(580, 334);\r
-            this.tab_debug.TabIndex = 7;\r
-            this.tab_debug.Text = "Debug";\r
-            this.tab_debug.UseVisualStyleBackColor = true;\r
-            // \r
-            // check_disableResCalc\r
-            // \r
-            this.check_disableResCalc.AutoSize = true;\r
-            this.check_disableResCalc.Location = new System.Drawing.Point(13, 15);\r
-            this.check_disableResCalc.Name = "check_disableResCalc";\r
-            this.check_disableResCalc.Size = new System.Drawing.Size(327, 17);\r
-            this.check_disableResCalc.TabIndex = 0;\r
-            this.check_disableResCalc.Text = "Disable Resolution Calculation for \"None\" and \"Custom\" modes.";\r
-            this.ToolTip.SetToolTip(this.check_disableResCalc, resources.GetString("check_disableResCalc.ToolTip"));\r
-            this.check_disableResCalc.UseVisualStyleBackColor = true;\r
-            this.check_disableResCalc.CheckedChanged += new System.EventHandler(this.check_disableResCalc_CheckedChanged);\r
+            // label28\r
+            // \r
+            this.label28.Anchor = System.Windows.Forms.AnchorStyles.Right;\r
+            this.label28.AutoSize = true;\r
+            this.label28.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
+            this.label28.Location = new System.Drawing.Point(8, 213);\r
+            this.label28.Name = "label28";\r
+            this.label28.Size = new System.Drawing.Size(38, 13);\r
+            this.label28.TabIndex = 85;\r
+            this.label28.Text = "x264:";\r
             // \r
             // label8\r
             // \r
-            this.label8.Anchor = System.Windows.Forms.AnchorStyles.Left;\r
             this.label8.AutoSize = true;\r
             this.label8.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label8.Location = new System.Drawing.Point(41, 11);\r
+            this.label8.Location = new System.Drawing.Point(51, 19);\r
             this.label8.Name = "label8";\r
             this.label8.Size = new System.Drawing.Size(115, 13);\r
             this.label8.TabIndex = 61;\r
@@ -1116,7 +1081,7 @@ namespace Handbrake
             // pictureBox2\r
             // \r
             this.pictureBox2.Image = global::Handbrake.Properties.Resources.General_Preferences;\r
-            this.pictureBox2.Location = new System.Drawing.Point(3, 0);\r
+            this.pictureBox2.Location = new System.Drawing.Point(12, 9);\r
             this.pictureBox2.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);\r
             this.pictureBox2.Name = "pictureBox2";\r
             this.pictureBox2.Size = new System.Drawing.Size(32, 32);\r
@@ -1462,25 +1427,29 @@ namespace Handbrake
             this.openFile_vlc.DefaultExt = "exe";\r
             this.openFile_vlc.Filter = "exe|*.exe";\r
             // \r
-            // tableLayoutPanel5\r
-            // \r
-            this.tableLayoutPanel5.AutoSize = true;\r
-            this.tableLayoutPanel5.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.tableLayoutPanel5.ColumnCount = 2;\r
-            this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel5.Controls.Add(this.pictureBox2, 0, 0);\r
-            this.tableLayoutPanel5.Controls.Add(this.btn_close, 1, 2);\r
-            this.tableLayoutPanel5.Controls.Add(this.label8, 1, 0);\r
-            this.tableLayoutPanel5.Controls.Add(this.tab_options, 0, 1);\r
-            this.tableLayoutPanel5.Location = new System.Drawing.Point(12, 12);\r
-            this.tableLayoutPanel5.Name = "tableLayoutPanel5";\r
-            this.tableLayoutPanel5.RowCount = 3;\r
-            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel5.Size = new System.Drawing.Size(594, 429);\r
-            this.tableLayoutPanel5.TabIndex = 62;\r
+            // panel1\r
+            // \r
+            this.panel1.BackColor = System.Drawing.Color.White;\r
+            this.panel1.Controls.Add(this.panel2);\r
+            this.panel1.Controls.Add(this.label8);\r
+            this.panel1.Controls.Add(this.pictureBox2);\r
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Top;\r
+            this.panel1.Location = new System.Drawing.Point(0, 0);\r
+            this.panel1.Margin = new System.Windows.Forms.Padding(0);\r
+            this.panel1.Name = "panel1";\r
+            this.panel1.Size = new System.Drawing.Size(615, 65);\r
+            this.panel1.TabIndex = 62;\r
+            // \r
+            // panel2\r
+            // \r
+            this.panel2.BackColor = System.Drawing.SystemColors.Control;\r
+            this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;\r
+            this.panel2.Location = new System.Drawing.Point(0, 55);\r
+            this.panel2.MaximumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.MinimumSize = new System.Drawing.Size(0, 10);\r
+            this.panel2.Name = "panel2";\r
+            this.panel2.Size = new System.Drawing.Size(615, 10);\r
+            this.panel2.TabIndex = 59;\r
             // \r
             // frmOptions\r
             // \r
@@ -1488,15 +1457,16 @@ namespace Handbrake
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;\r
             this.AutoSize = true;\r
             this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
-            this.ClientSize = new System.Drawing.Size(627, 456);\r
-            this.Controls.Add(this.tableLayoutPanel5);\r
+            this.ClientSize = new System.Drawing.Size(615, 495);\r
+            this.Controls.Add(this.panel1);\r
+            this.Controls.Add(this.btn_close);\r
+            this.Controls.Add(this.tab_options);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
             this.MaximizeBox = false;\r
             this.MinimizeBox = false;\r
             this.Name = "frmOptions";\r
-            this.Padding = new System.Windows.Forms.Padding(12);\r
             this.ShowIcon = false;\r
             this.ShowInTaskbar = false;\r
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;\r
@@ -1512,19 +1482,12 @@ namespace Handbrake
             this.tab_audio_sub.PerformLayout();\r
             this.tab_cli.ResumeLayout(false);\r
             this.tab_cli.PerformLayout();\r
-            this.tableLayoutPanel3.ResumeLayout(false);\r
-            this.tableLayoutPanel3.PerformLayout();\r
             this.tab_advanced.ResumeLayout(false);\r
             this.tab_advanced.PerformLayout();\r
-            this.tableLayoutPanel4.ResumeLayout(false);\r
-            this.tableLayoutPanel4.PerformLayout();\r
-            this.tab_debug.ResumeLayout(false);\r
-            this.tab_debug.PerformLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\r
-            this.tableLayoutPanel5.ResumeLayout(false);\r
-            this.tableLayoutPanel5.PerformLayout();\r
+            this.panel1.ResumeLayout(false);\r
+            this.panel1.PerformLayout();\r
             this.ResumeLayout(false);\r
-            this.PerformLayout();\r
 \r
         }\r
 \r
@@ -1539,7 +1502,6 @@ namespace Handbrake
         private System.Windows.Forms.PictureBox pictureBox2;\r
         private System.Windows.Forms.TabPage tab_general;\r
         private System.Windows.Forms.FolderBrowserDialog pathFinder;\r
-        internal System.Windows.Forms.Label Label11;\r
         internal System.Windows.Forms.Label Label4;\r
         internal System.Windows.Forms.CheckBox check_tooltip;\r
         internal System.Windows.Forms.CheckBox check_updateCheck;\r
@@ -1550,7 +1512,6 @@ namespace Handbrake
         internal System.Windows.Forms.Label label10;\r
         private System.Windows.Forms.TextBox text_an_path;\r
         internal System.Windows.Forms.CheckBox check_autoNaming;\r
-        internal System.Windows.Forms.CheckBox check_cli_minimized;\r
         private System.Windows.Forms.Label label12;\r
         internal System.Windows.Forms.ToolTip ToolTip;\r
         private System.Windows.Forms.TabPage tab_picture;\r
@@ -1605,18 +1566,13 @@ namespace Handbrake
         private System.Windows.Forms.Label label32;\r
         internal System.Windows.Forms.CheckBox check_logsInSpecifiedLocation;\r
         internal System.Windows.Forms.CheckBox check_disablePresetNotification;\r
-        internal System.Windows.Forms.CheckBox check_inGuiStatus;\r
         internal System.Windows.Forms.CheckBox check_trayStatusAlerts;\r
         private System.Windows.Forms.Button btn_viewLogs;\r
         private System.Windows.Forms.Button btn_clearLogs;\r
         internal System.Windows.Forms.CheckBox check_m4v;\r
         internal System.Windows.Forms.ComboBox drop_updateCheckDays;\r
         private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;\r
-        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;\r
-        internal System.Windows.Forms.ComboBox drp_processors;\r
         internal System.Windows.Forms.ComboBox drp_Priority;\r
-        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;\r
-        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;\r
         private System.Windows.Forms.CheckBox check_promptOnUnmatchingQueries;\r
         private System.Windows.Forms.TabPage tab_audio_sub;\r
         internal System.Windows.Forms.ComboBox drop_preferredLang;\r
@@ -1625,9 +1581,20 @@ namespace Handbrake
         private System.Windows.Forms.RadioButton radio_dub;\r
         private System.Windows.Forms.Label label15;\r
         internal System.Windows.Forms.Button btn_browse;\r
-        private System.Windows.Forms.TabPage tab_debug;\r
-        private System.Windows.Forms.CheckBox check_disableResCalc;\r
         internal System.Windows.Forms.CheckBox check_growlEncode;\r
         internal System.Windows.Forms.CheckBox check_GrowlQueue;\r
+        internal System.Windows.Forms.ComboBox drop_previewScanCount;\r
+        private System.Windows.Forms.Label label33;\r
+        internal System.Windows.Forms.CheckBox check_clearOldLogs;\r
+        internal System.Windows.Forms.CheckBox check_showCliForInGUIEncode;\r
+        internal System.Windows.Forms.CheckBox check_TitleCase;\r
+        internal System.Windows.Forms.CheckBox check_removeUnderscores;\r
+        internal System.Windows.Forms.CheckBox check_preventSleep;\r
+        private System.Windows.Forms.Label label11;\r
+        private System.Windows.Forms.Panel panel1;\r
+        private System.Windows.Forms.Panel panel2;\r
+        private System.Windows.Forms.RadioButton radio_preferredAudioAndSubs;\r
+        private System.Windows.Forms.CheckBox check_AddCCTracks;\r
+        private System.Windows.Forms.Label label34;\r
     }\r
 }
\ No newline at end of file
index 77a7a58..11034f9 100644 (file)
@@ -1,27 +1,36 @@
 /*  frmOptions.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.Globalization;\r
-using System.Windows.Forms;\r
-using Handbrake.Functions;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Diagnostics;\r
+    using System.Globalization;\r
+    using System.Windows.Forms;\r
+\r
+    using HandBrake.ApplicationServices;\r
+\r
+    using Handbrake.Functions;\r
+    using Handbrake.Model;\r
+    using Handbrake.Properties;\r
+\r
+    /// <summary>\r
+    /// The Options Window\r
+    /// </summary>\r
     public partial class frmOptions : Form\r
     {\r
         private frmMain mainWindow;\r
+        private bool optionsWindowLoading = true;\r
 \r
         public frmOptions(frmMain mw)\r
         {\r
             InitializeComponent();\r
             mainWindow = mw;\r
 \r
-            IDictionary<string, string> langList = Main.mapLanguages();\r
+            IDictionary<string, string> langList = Main.MapLanguages();\r
             foreach (string item in langList.Keys)\r
                 drop_preferredLang.Items.Add(item);\r
 \r
@@ -36,10 +45,24 @@ namespace Handbrake
                 ToolTip.Active = true;\r
             }\r
 \r
-            // Setup Widgets to match settings.\r
+            // Update Check\r
             if (Properties.Settings.Default.updateStatus)\r
                 check_updateCheck.CheckState = CheckState.Checked;\r
 \r
+            // Days between update checks\r
+            switch (Properties.Settings.Default.daysBetweenUpdateCheck)\r
+            {\r
+                case 1:\r
+                    drop_updateCheckDays.SelectedIndex = 0;\r
+                    break;\r
+                case 7:\r
+                    drop_updateCheckDays.SelectedIndex = 1;\r
+                    break;\r
+                case 30:\r
+                    drop_updateCheckDays.SelectedIndex = 2;\r
+                    break;\r
+            }\r
+\r
             // On Encode Completeion Action\r
             drp_completeOption.Text = Properties.Settings.Default.CompletionOption;\r
 \r
@@ -66,6 +89,12 @@ namespace Handbrake
             if (Properties.Settings.Default.useM4v)\r
                 check_m4v.CheckState = CheckState.Checked;\r
 \r
+            // Remove Underscores\r
+            check_removeUnderscores.Checked = Properties.Settings.Default.AutoNameRemoveUnderscore;\r
+\r
+            // Title case\r
+            check_TitleCase.Checked = Properties.Settings.Default.AutoNameTitleCase;\r
+\r
             // #############################\r
             // Picture Tab\r
             // #############################\r
@@ -79,30 +108,33 @@ namespace Handbrake
 \r
             drop_preferredLang.SelectedItem = Properties.Settings.Default.NativeLanguage;\r
 \r
-            if (Properties.Settings.Default.DubAudio)\r
-                radio_dub.Checked = true;\r
-            else\r
-                radio_foreignAndSubs.Checked = true;\r
+            switch (Settings.Default.DubMode)\r
+            {\r
+                case 1:\r
+                    radio_dub.Checked = true;\r
+                    break;\r
+                case 2:\r
+                    radio_foreignAndSubs.Checked = true;\r
+                    break;\r
+                case 3:\r
+                    radio_preferredAudioAndSubs.Checked = true;\r
+                    break;\r
+            }\r
 \r
+            check_AddCCTracks.Checked = Properties.Settings.Default.useClosedCaption;\r
 \r
             // #############################\r
             // CLI\r
             // #############################\r
 \r
-            // Enable Start CLI minimized\r
-            if (Properties.Settings.Default.cli_minimized)\r
-                check_cli_minimized.CheckState = CheckState.Checked;\r
-\r
-            // Number of processor cores\r
-            drp_processors.Text = Properties.Settings.Default.Processors;\r
-\r
             // Priority level for encodes\r
             drp_Priority.Text = Properties.Settings.Default.processPriority;\r
 \r
+            check_preventSleep.Checked = Properties.Settings.Default.preventSleep;\r
+\r
             // Log Verbosity Level\r
             cb_logVerboseLvl.SelectedIndex = Properties.Settings.Default.verboseLevel;\r
 \r
-\r
             // Save logs in the same directory as encoded files\r
             if (Properties.Settings.Default.saveLogWithVideo)\r
                 check_saveLogWithVideo.CheckState = CheckState.Checked;\r
@@ -114,6 +146,7 @@ namespace Handbrake
             // The saved log path\r
             text_logPath.Text = Properties.Settings.Default.saveLogPath;\r
 \r
+            check_clearOldLogs.Checked = Properties.Settings.Default.clearOldLogs;\r
 \r
             // #############################\r
             // Advanced\r
@@ -130,6 +163,7 @@ namespace Handbrake
             // Enable / Disable Query editor tab\r
             if (Properties.Settings.Default.QueryEditorTab)\r
                 check_queryEditorTab.CheckState = CheckState.Checked;\r
+            check_promptOnUnmatchingQueries.Enabled = check_queryEditorTab.Checked;\r
 \r
             // Prompt on inconsistant queries\r
             check_promptOnUnmatchingQueries.Checked = Properties.Settings.Default.PromptOnUnmatchingQueries;\r
@@ -138,23 +172,11 @@ namespace Handbrake
             if (Properties.Settings.Default.presetNotification)\r
                 check_disablePresetNotification.CheckState = CheckState.Checked;\r
 \r
-            // Experimental In-GUI encode status indicator.\r
-            if (Properties.Settings.Default.enocdeStatusInGui)\r
-                check_inGuiStatus.CheckState = CheckState.Checked;\r
+            // Show CLI Window\r
+            check_showCliForInGUIEncode.Checked = Properties.Settings.Default.showCliForInGuiEncodeStatus;\r
 \r
-            // Days between update checks\r
-            switch (Properties.Settings.Default.daysBetweenUpdateCheck)\r
-            {\r
-                case 1:\r
-                    drop_updateCheckDays.SelectedIndex = 0;\r
-                    break;\r
-                case 7:\r
-                    drop_updateCheckDays.SelectedIndex = 1;\r
-                    break;\r
-                case 30:\r
-                    drop_updateCheckDays.SelectedIndex = 2;\r
-                    break;\r
-            }\r
+            // Set the preview count\r
+            drop_previewScanCount.SelectedItem = Properties.Settings.Default.previewScanCount.ToString();\r
 \r
             // x264 step\r
             string step = Properties.Settings.Default.x264cqstep.ToString(new CultureInfo("en-US"));\r
@@ -178,19 +200,32 @@ namespace Handbrake
             if (Properties.Settings.Default.noDvdNav)\r
                 check_dvdnav.CheckState = CheckState.Checked;\r
 \r
-            // #############################\r
-            // Debug\r
-            // #############################\r
-            if (Properties.Settings.Default.disableResCalc)\r
-                check_disableResCalc.Checked = true;\r
+            optionsWindowLoading = false;\r
         }\r
 \r
         #region General\r
+\r
         private void check_updateCheck_CheckedChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.updateStatus = check_updateCheck.Checked;\r
         }\r
 \r
+        private void drop_updateCheckDays_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            switch (drop_updateCheckDays.SelectedIndex)\r
+            {\r
+                case 0:\r
+                    Properties.Settings.Default.daysBetweenUpdateCheck = 1;\r
+                    break;\r
+                case 1:\r
+                    Properties.Settings.Default.daysBetweenUpdateCheck = 7;\r
+                    break;\r
+                case 2:\r
+                    Properties.Settings.Default.daysBetweenUpdateCheck = 30;\r
+                    break;\r
+            }\r
+        }\r
+\r
         private void check_tooltip_CheckedChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.tooltipEnable = check_tooltip.Checked;\r
@@ -231,65 +266,102 @@ namespace Handbrake
         {\r
             if (text_an_path.Text == string.Empty)\r
             {\r
-                Properties.Settings.Default.autoNamePath = "";\r
+                Properties.Settings.Default.autoNamePath = string.Empty;\r
                 text_an_path.Text = "Click 'Browse' to set the default location";\r
             }\r
             else\r
                 Properties.Settings.Default.autoNamePath = text_an_path.Text;\r
+\r
+            if (text_an_path.Text.ToLower() == "{source_path}" && !optionsWindowLoading)\r
+            {\r
+                MessageBox.Show(\r
+                    "Be careful with this feature. Make sure you can write to the same folder as the source! \n\n If you are encoding from a DVD, do not use this feature as HandBrake will not be able to write to the DVD!",\r
+                    "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            }\r
+\r
+            if (text_an_path.Text.ToLower().Contains("{source_path}") && text_an_path.Text.ToLower() != "{source_path}")\r
+            {\r
+                MessageBox.Show("Note you can not use the {source_path} within a path. {source_path} is the full source file path.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            }\r
         }\r
 \r
         private void check_m4v_CheckedChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.useM4v = check_m4v.Checked;\r
         }\r
+\r
+        private void check_removeUnderscores_CheckedChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.AutoNameRemoveUnderscore = check_removeUnderscores.Checked;\r
+        }\r
+\r
+        private void check_TitleCase_CheckedChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.AutoNameTitleCase = check_TitleCase.Checked;\r
+        }\r
+\r
         #endregion\r
 \r
         #region Picture\r
+\r
         private void btn_vlcPath_Click(object sender, EventArgs e)\r
         {\r
             openFile_vlc.ShowDialog();\r
             if (openFile_vlc.FileName != string.Empty)\r
                 txt_vlcPath.Text = openFile_vlc.FileName;\r
         }\r
+\r
         private void txt_vlcPath_TextChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.VLC_Path = txt_vlcPath.Text;\r
         }\r
+\r
         #endregion\r
 \r
         #region Audio and Subtitles\r
+\r
         private void drop_preferredLang_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.NativeLanguage = drop_preferredLang.SelectedItem.ToString();\r
         }\r
+\r
         private void radio_dub_CheckedChanged(object sender, EventArgs e)\r
         {\r
             if (radio_dub.Checked)\r
-                Properties.Settings.Default.DubAudio = true;\r
+                Properties.Settings.Default.DubMode = 1;\r
         }\r
+\r
         private void radio_foreignAndSubs_CheckedChanged(object sender, EventArgs e)\r
         {\r
             if (radio_foreignAndSubs.Checked)\r
-                Properties.Settings.Default.DubAudio = false;\r
-        }       \r
-        #endregion\r
+                Properties.Settings.Default.DubMode = 2;\r
+        }\r
 \r
-        #region CLI\r
-        private void check_cli_minimized_CheckedChanged(object sender, EventArgs e)\r
+        private void radio_preferredAudioAndSubs_CheckedChanged(object sender, EventArgs e)\r
         {\r
-            Properties.Settings.Default.cli_minimized = check_cli_minimized.Checked;\r
+            if (radio_preferredAudioAndSubs.Checked)\r
+                Properties.Settings.Default.DubMode = 3;\r
         }\r
 \r
-        private void drp_processors_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void check_AddCCTracks_CheckedChanged(object sender, EventArgs e)\r
         {\r
-            Properties.Settings.Default.Processors = drp_processors.Text;\r
+            Settings.Default.useClosedCaption = check_AddCCTracks.Checked;\r
         }\r
 \r
+        #endregion\r
+\r
+        #region CLI\r
+\r
         private void drp_Priority_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.processPriority = drp_Priority.Text;\r
         }\r
 \r
+        private void check_preventSleep_CheckedChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.preventSleep = check_preventSleep.Checked;\r
+        }\r
+\r
         private void cb_logVerboseLvl_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.verboseLevel = cb_logVerboseLvl.SelectedIndex;\r
@@ -322,7 +394,7 @@ namespace Handbrake
         {\r
             string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";\r
             string windir = Environment.GetEnvironmentVariable("WINDIR");\r
-            System.Diagnostics.Process prc = new System.Diagnostics.Process();\r
+            Process prc = new Process();\r
             prc.StartInfo.FileName = windir + @"\explorer.exe";\r
             prc.StartInfo.Arguments = logDir;\r
             prc.Start();\r
@@ -330,14 +402,21 @@ namespace Handbrake
 \r
         private void btn_clearLogs_Click(object sender, EventArgs e)\r
         {\r
-            DialogResult result = MessageBox.Show("Are you sure you wish to clear the log file directory?", "Clear Logs", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);\r
+            DialogResult result = MessageBox.Show("Are you sure you wish to clear the log file directory?", "Clear Logs",\r
+                                                  MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);\r
             if (result == DialogResult.Yes)\r
             {\r
-                Main.clearLogs();\r
+                Main.ClearLogs();\r
                 MessageBox.Show(this, "HandBrake's Log file directory has been cleared!", "Notice", MessageBoxButtons.OK,\r
                                 MessageBoxIcon.Information);\r
             }\r
         }\r
+\r
+        private void check_clearOldLogs_CheckedChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.clearOldLogs = check_clearOldLogs.Checked;\r
+        }\r
+\r
         #endregion\r
 \r
         #region Advanced\r
@@ -369,25 +448,14 @@ namespace Handbrake
             Properties.Settings.Default.presetNotification = check_disablePresetNotification.Checked;\r
         }\r
 \r
-        private void check_inGuiStatus_CheckedChanged(object sender, EventArgs e)\r
+        private void check_showCliForInGUIEncode_CheckedChanged(object sender, EventArgs e)\r
         {\r
-            Properties.Settings.Default.enocdeStatusInGui = check_inGuiStatus.Checked;\r
+            Properties.Settings.Default.showCliForInGuiEncodeStatus = check_showCliForInGUIEncode.Checked;\r
         }\r
 \r
-        private void drop_updateCheckDays_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void drop_previewScanCount_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
-            switch (drop_updateCheckDays.SelectedIndex)\r
-            {\r
-                case 0:\r
-                    Properties.Settings.Default.daysBetweenUpdateCheck = 1;\r
-                    break;\r
-                case 1:\r
-                    Properties.Settings.Default.daysBetweenUpdateCheck = 7;\r
-                    break;\r
-                case 2:\r
-                    Properties.Settings.Default.daysBetweenUpdateCheck = 30;\r
-                    break;\r
-            }\r
+            Properties.Settings.Default.previewScanCount = int.Parse(drop_previewScanCount.SelectedItem.ToString());\r
         }\r
 \r
         private void x264step_SelectedIndexChanged(object sender, EventArgs e)\r
@@ -414,19 +482,37 @@ namespace Handbrake
         {\r
             Properties.Settings.Default.noDvdNav = check_dvdnav.Checked;\r
         }\r
-        #endregion\r
 \r
-        #region Debug\r
-        private void check_disableResCalc_CheckedChanged(object sender, EventArgs e)\r
-        {\r
-            Properties.Settings.Default.disableResCalc = check_disableResCalc.Checked;\r
-        }\r
         #endregion\r
 \r
         private void btn_close_Click(object sender, EventArgs e)\r
         {\r
             Properties.Settings.Default.Save(); // Small hack for Vista. Seems to work fine on XP without this\r
+            UpdateApplicationServicesSettings();\r
+\r
             this.Close();\r
         }\r
+\r
+        /// <summary>\r
+        /// Initialize App Services\r
+        /// </summary>\r
+        private static void UpdateApplicationServicesSettings()\r
+        {\r
+            string versionId = String.Format(\r
+                "Windows GUI {1} {0}", Settings.Default.hb_build, Settings.Default.hb_version);\r
+            Init.SetupSettings(\r
+                versionId,\r
+                Program.InstanceId,\r
+                Settings.Default.CompletionOption,\r
+                Settings.Default.noDvdNav,\r
+                Settings.Default.growlEncode,\r
+                Settings.Default.growlQueue,\r
+                Settings.Default.processPriority,\r
+                Settings.Default.saveLogPath,\r
+                Settings.Default.saveLogToSpecifiedPath,\r
+                Settings.Default.saveLogWithVideo,\r
+                Settings.Default.showCliForInGuiEncodeStatus,\r
+                Settings.Default.preventSleep);\r
+        }\r
     }\r
 }
\ No newline at end of file
index f16c6a9..42c24c3 100644 (file)
@@ -127,10 +127,16 @@ Chapter Markers, AC3 Audio and SRT Subtitles will require the m4v extension if y
 When this option is disabled, Chapter Markers, AC3 audio and SRT subtitiles will still automatically change the file extension to m4v.\r
 </value>\r
   </data>\r
-  <data name="check_disableResCalc.ToolTip" xml:space="preserve">\r
-    <value>If the new Picture Settings panel is causing you problems, enable this option.\r
-It disables some of the resolution calcuation code for None and Custom modes.\r
-When enabled, the values in the text boxes will simply be passed through to the CLI so it is up to you to get the values correct.</value>\r
+  <data name="text_an_path.ToolTip" xml:space="preserve">\r
+    <value>This is the default location where your encoded files will be stored if "Automatically name output files" is enabled.\r
+You can enter {source_path} instead of a path to use the same path as the source file.</value>\r
+  </data>\r
+  <data name="check_showCliForInGUIEncode.ToolTip" xml:space="preserve">\r
+    <value>Shows the CLI window when encoding.\r
+You may wish to enable this as you'll be able to cleanly exit the CLI using ctrl-c\r
+meaing you'll have playable files if you choose to end the encode early. \r
+\r
+When disabled, Presseting "Stop" on the main winow will render the encode unplayable.</value>\r
   </data>\r
   <metadata name="pathFinder.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>17, 17</value>\r
index 0868193..729e65b 100644 (file)
             this.cb_duration = new System.Windows.Forms.ToolStripComboBox();\r
             this.btn_playQT = new System.Windows.Forms.ToolStripButton();\r
             this.btn_playVLC = new System.Windows.Forms.ToolStripButton();\r
-            this.QTControl = new AxQTOControlLib.AxQTControl();\r
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.ProgressBarStatus = new System.Windows.Forms.ToolStripProgressBar();\r
+            this.lbl_encodeStatus = new System.Windows.Forms.ToolStripLabel();\r
             this.panel1 = new System.Windows.Forms.Panel();\r
-            this.lbl_status = new System.Windows.Forms.Label();\r
+            this.QTControl = new AxQTOControlLib.AxQTControl();\r
             this.toolBar.SuspendLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.QTControl)).BeginInit();\r
             this.panel1.SuspendLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.QTControl)).BeginInit();\r
             this.SuspendLayout();\r
             // \r
             // toolBar\r
             // \r
+            this.toolBar.AutoSize = false;\r
             this.toolBar.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;\r
             this.toolBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.lbl_preview,\r
             this.toolStripLabel2,\r
             this.cb_duration,\r
             this.btn_playQT,\r
-            this.btn_playVLC});\r
+            this.btn_playVLC,\r
+            this.toolStripSeparator1,\r
+            this.ProgressBarStatus,\r
+            this.lbl_encodeStatus});\r
             this.toolBar.Location = new System.Drawing.Point(0, 0);\r
             this.toolBar.Name = "toolBar";\r
             this.toolBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
-            this.toolBar.Size = new System.Drawing.Size(772, 25);\r
+            this.toolBar.Size = new System.Drawing.Size(722, 25);\r
             this.toolBar.TabIndex = 37;\r
             this.toolBar.Text = "toolStrip1";\r
             // \r
             this.btn_playQT.Name = "btn_playQT";\r
             this.btn_playQT.Size = new System.Drawing.Size(96, 22);\r
             this.btn_playQT.Text = "Play with QT";\r
-            this.btn_playQT.Click += new System.EventHandler(this.btn_playQT_Click);\r
+            this.btn_playQT.Click += new System.EventHandler(this.PlayQtClick);\r
             // \r
             // btn_playVLC\r
             // \r
             this.btn_playVLC.Name = "btn_playVLC";\r
             this.btn_playVLC.Size = new System.Drawing.Size(101, 22);\r
             this.btn_playVLC.Text = "Play with VLC";\r
-            this.btn_playVLC.Click += new System.EventHandler(this.btn_playVLC_Click);\r
+            this.btn_playVLC.Click += new System.EventHandler(this.PlayVlcClick);\r
             // \r
-            // QTControl\r
+            // toolStripSeparator1\r
             // \r
-            this.QTControl.Enabled = true;\r
-            this.QTControl.Location = new System.Drawing.Point(0, 0);\r
-            this.QTControl.Name = "QTControl";\r
-            this.QTControl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("QTControl.OcxState")));\r
-            this.QTControl.Size = new System.Drawing.Size(64, 72);\r
-            this.QTControl.TabIndex = 39;\r
-            this.QTControl.Visible = false;\r
+            this.toolStripSeparator1.Name = "toolStripSeparator1";\r
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);\r
+            // \r
+            // ProgressBarStatus\r
+            // \r
+            this.ProgressBarStatus.Name = "ProgressBarStatus";\r
+            this.ProgressBarStatus.Size = new System.Drawing.Size(100, 22);\r
+            this.ProgressBarStatus.Visible = false;\r
+            // \r
+            // lbl_encodeStatus\r
+            // \r
+            this.lbl_encodeStatus.Name = "lbl_encodeStatus";\r
+            this.lbl_encodeStatus.Size = new System.Drawing.Size(38, 22);\r
+            this.lbl_encodeStatus.Text = "0.00%";\r
+            this.lbl_encodeStatus.Visible = false;\r
             // \r
             // panel1\r
             // \r
-            this.panel1.Controls.Add(this.lbl_status);\r
+            this.panel1.AutoSize = true;\r
+            this.panel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
             this.panel1.Controls.Add(this.QTControl);\r
             this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;\r
             this.panel1.Location = new System.Drawing.Point(0, 25);\r
             this.panel1.Name = "panel1";\r
-            this.panel1.Size = new System.Drawing.Size(772, 481);\r
+            this.panel1.Size = new System.Drawing.Size(722, 481);\r
             this.panel1.TabIndex = 40;\r
             // \r
-            // lbl_status\r
+            // QTControl\r
             // \r
-            this.lbl_status.AutoSize = true;\r
-            this.lbl_status.BackColor = System.Drawing.Color.Transparent;\r
-            this.lbl_status.Dock = System.Windows.Forms.DockStyle.Top;\r
-            this.lbl_status.Font = new System.Drawing.Font("Tahoma", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.lbl_status.ForeColor = System.Drawing.Color.White;\r
-            this.lbl_status.Location = new System.Drawing.Point(0, 0);\r
-            this.lbl_status.Name = "lbl_status";\r
-            this.lbl_status.Size = new System.Drawing.Size(51, 25);\r
-            this.lbl_status.TabIndex = 40;\r
-            this.lbl_status.Text = "{0}";\r
-            this.lbl_status.Visible = false;\r
+            this.QTControl.Enabled = true;\r
+            this.QTControl.Location = new System.Drawing.Point(0, 0);\r
+            this.QTControl.Name = "QTControl";\r
+            this.QTControl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("QTControl.OcxState")));\r
+            this.QTControl.Size = new System.Drawing.Size(64, 72);\r
+            this.QTControl.TabIndex = 39;\r
+            this.QTControl.Visible = false;\r
             // \r
             // frmPreview\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
+            this.AutoSize = true;\r
+            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;\r
             this.BackColor = System.Drawing.Color.Black;\r
-            this.ClientSize = new System.Drawing.Size(772, 506);\r
+            this.ClientSize = new System.Drawing.Size(722, 506);\r
             this.Controls.Add(this.panel1);\r
             this.Controls.Add(this.toolBar);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
+            this.MinimumSize = new System.Drawing.Size(730, 32);\r
             this.Name = "frmPreview";\r
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;\r
             this.Text = "Video Preview";\r
             this.toolBar.ResumeLayout(false);\r
             this.toolBar.PerformLayout();\r
-            ((System.ComponentModel.ISupportInitialize)(this.QTControl)).EndInit();\r
             this.panel1.ResumeLayout(false);\r
-            this.panel1.PerformLayout();\r
+            ((System.ComponentModel.ISupportInitialize)(this.QTControl)).EndInit();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
         private System.Windows.Forms.ToolStripComboBox cb_duration;\r
         private System.Windows.Forms.ToolStripButton btn_playVLC;\r
         private System.Windows.Forms.Panel panel1;\r
-        private System.Windows.Forms.Label lbl_status;\r
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;\r
+        private System.Windows.Forms.ToolStripProgressBar ProgressBarStatus;\r
+        private System.Windows.Forms.ToolStripLabel lbl_encodeStatus;\r
     }\r
 }
\ No newline at end of file
index 59e6c25..3a8a220 100644 (file)
-using System;\r
-using System.Windows.Forms;\r
-using System.Threading;\r
-using System.Diagnostics;\r
-using System.Runtime.InteropServices;\r
-using System.IO;\r
-using Handbrake.EncodeQueue;\r
-using Handbrake.Functions;\r
-using QTOControlLib;\r
-using QTOLibrary;\r
+/*  frmPreview.cs $\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr/>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Diagnostics;\r
+    using System.IO;\r
+    using System.Runtime.InteropServices;\r
+    using System.Threading;\r
+    using System.Windows;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Services;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    using QTOControlLib;\r
+    using QTOLibrary;\r
+\r
+    using MessageBox = System.Windows.Forms.MessageBox;\r
+\r
+    /// <summary>\r
+    /// The Preview Window\r
+    /// </summary>\r
     public partial class frmPreview : Form\r
     {\r
+        #region Private Variables\r
+\r
+        /// <summary>\r
+        /// The Main Window\r
+        /// </summary>\r
+        private readonly frmMain mainWindow;\r
+\r
+        /// <summary>\r
+        /// True if QT is not installed\r
+        /// </summary>\r
+        private readonly bool noQt;\r
 \r
-        QueryGenerator hb_common_func = new QueryGenerator();\r
-        EncodeAndQueueHandler process = new EncodeAndQueueHandler();\r
-        private delegate void UpdateUIHandler();\r
-        String currently_playing = "";\r
-        readonly frmMain mainWindow;\r
+        /// <summary>\r
+        /// The encode queue\r
+        /// </summary>\r
+        private readonly IQueue encodeQueue = new Queue();\r
+\r
+        /// <summary>\r
+        /// What is currently playing\r
+        /// </summary>\r
+        private string currentlyPlaying = string.Empty;\r
+\r
+        /// <summary>\r
+        /// Play With VLC tracker\r
+        /// </summary>\r
+        private bool playWithVlc;\r
+\r
+        /// <summary>\r
+        /// A Thread for the video player\r
+        /// </summary>\r
         private Thread player;\r
-        private Boolean noQT;\r
 \r
+        #endregion\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmPreview"/> class.\r
+        /// </summary>\r
+        /// <param name="mw">\r
+        /// The mw.\r
+        /// </param>\r
         public frmPreview(frmMain mw)\r
         {\r
             try\r
             {\r
                 InitializeComponent();\r
             }\r
-            catch (Exception exc)\r
+            catch (Exception)\r
             {\r
-                MessageBox.Show(mw, "It would appear QuickTime 7 is not installed or not accessible. QuickTime preview functionality will be disabled! \n\n Debug Info:\n" + exc, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                this.noQt = true;\r
+\r
+                int borderWidth = (this.Width - this.ClientSize.Width) / 2;\r
+                int titlebarAndBorder = this.Height - this.ClientSize.Height;\r
+\r
+                this.Height = toolBar.Height + titlebarAndBorder + 1;\r
                 btn_playQT.Enabled = false;\r
-                noQT = true;\r
+                btn_playQT.Visible = false;\r
             }\r
+\r
             this.mainWindow = mw;\r
+\r
             cb_preview.SelectedIndex = 0;\r
             cb_duration.SelectedIndex = 1;\r
+\r
+            cb_preview.Items.Clear();\r
+            for (int i = 1; i <= Properties.Settings.Default.previewScanCount; i++)\r
+            {\r
+                cb_preview.Items.Add(i.ToString());\r
+            }\r
+\r
+            cb_preview.SelectedIndex = 0;\r
+\r
+            encodeQueue.EncodeStarted += this.EncodeQueueEncodeStarted;\r
+            encodeQueue.EncodeEnded += this.EncodeQueueEncodeEnded;\r
         }\r
 \r
+        #region Delegates\r
+        /// <summary>\r
+        /// Update UI Delegate\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private delegate void UpdateUiHandler(object sender, EventArgs e);\r
+\r
+        /// <summary>\r
+        /// The Open Movie Handler\r
+        /// </summary>\r
+        private delegate void OpenMovieHandler();\r
+        #endregion\r
+\r
+        #region Event Handlers\r
+        /// <summary>\r
+        /// The encode has started\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueueEncodeStarted(object sender, EventArgs e)\r
+        {\r
+            encodeQueue.EncodeStatusChanged += this.EncodeQueueEncodeStatusChanged;\r
+        }\r
+\r
+        /// <summary>\r
+        /// The Enocde has ended\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueueEncodeEnded(object sender, EventArgs e)\r
+        {\r
+            encodeQueue.EncodeStatusChanged -= this.EncodeQueueEncodeStatusChanged;\r
+\r
+            try\r
+            {\r
+                if (this.InvokeRequired)\r
+                {\r
+                    this.BeginInvoke(new UpdateUiHandler(EncodeQueueEncodeEnded), new[] { sender, e });\r
+                    return;\r
+                }\r
+\r
+                ProgressBarStatus.Visible = false;\r
+                lbl_encodeStatus.Visible = false;\r
+\r
+                if (!this.noQt)\r
+                    btn_playQT.Enabled = true;\r
+                btn_playVLC.Enabled = true;\r
+\r
+                this.Text = this.Text.Replace(" (Encoding)", string.Empty);\r
+\r
+                // Get the sample filename\r
+                if (this.mainWindow.text_destination.Text != string.Empty)\r
+                    this.currentlyPlaying =\r
+                        this.mainWindow.text_destination.Text.Replace(".mp4", "_sample.mp4").Replace(".m4v", "_sample.m4v").\r
+                            Replace(".mkv", "_sample.mkv");\r
+\r
+                // Play back in QT or VLC\r
+                if (!playWithVlc)\r
+                    Play();\r
+                else\r
+                    PlayVlc();\r
+            }\r
+            catch (Exception exc)\r
+            {\r
+                Main.ShowExceptiowWindow("An Unexpected error has occured", exc.ToString());\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Encode status has changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueueEncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
+        {\r
+            if (this.InvokeRequired)\r
+            {\r
+                this.BeginInvoke(new Encode.EncodeProgessStatus(this.EncodeQueueEncodeStatusChanged), new[] { sender, e });\r
+                return;\r
+            }\r
+\r
+            lbl_encodeStatus.Text = e.PercentComplete + "%";\r
+            ProgressBarStatus.Value = (int)Math.Round(e.PercentComplete);\r
+        }\r
+        #endregion\r
+\r
         #region Encode Sample\r
-        private void btn_playVLC_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Play with VLC\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void PlayVlcClick(object sender, EventArgs e)\r
         {\r
-            lbl_status.Visible = true;\r
+            ProgressBarStatus.Visible = true;\r
+            ProgressBarStatus.Value = 0;\r
+            lbl_encodeStatus.Visible = true;\r
+            playWithVlc = true;\r
+            this.panel1.Visible = false;\r
+            \r
             try\r
             {\r
-                QTControl.URL = "";\r
-                if (File.Exists(currently_playing))\r
-                    File.Delete(currently_playing);\r
+                if (!this.noQt)\r
+                    QTControl.URL = string.Empty;\r
+\r
+                if (File.Exists(this.currentlyPlaying))\r
+                    File.Delete(this.currentlyPlaying);\r
             }\r
             catch (Exception)\r
             {\r
-                MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.",\r
+                                "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
             }\r
 \r
             btn_playQT.Enabled = false;\r
             btn_playVLC.Enabled = false;\r
-            lbl_status.Text = "Encoding Sample for (VLC) ...";\r
+            this.Text += " (Encoding)";\r
             int duration;\r
             int.TryParse(cb_duration.Text, out duration);\r
-            String query = hb_common_func.GenerateCLIQuery(mainWindow, duration, cb_preview.Text);\r
-            ThreadPool.QueueUserWorkItem(procMonitor, query);\r
+            string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
+            ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
         }\r
-        private void btn_playQT_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Encode and Play with QT\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void PlayQtClick(object sender, EventArgs e)\r
         {\r
-            if (mainWindow.text_destination.Text.Contains(".mkv"))\r
+            playWithVlc = false;\r
+            this.panel1.Visible = true;\r
+            if (this.noQt)\r
             {\r
                 MessageBox.Show(this,\r
-                                "The QuickTime Control does not support MKV files, It is recommended you use VLC option instead.",\r
+                                "It would appear QuickTime 7 is not installed or not accessible. Please (re)install QuickTime.",\r
+                                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                return;\r
+            }\r
+            if (this.mainWindow.text_destination.Text.Contains(".mkv"))\r
+            {\r
+                MessageBox.Show(this,\r
+                                "The QuickTime Control does not support MKV files, It is recommended you use the VLC option instead.",\r
                                 "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             }\r
             else\r
             {\r
-                lbl_status.Visible = true;\r
+                ProgressBarStatus.Visible = true;\r
+                ProgressBarStatus.Value = 0;\r
+                lbl_encodeStatus.Visible = true;\r
                 try\r
                 {\r
-                    QTControl.URL = "";\r
-                    if (File.Exists(currently_playing))\r
-                        File.Delete(currently_playing);\r
+                    QTControl.URL = string.Empty;\r
+                    if (File.Exists(this.currentlyPlaying))\r
+                        File.Delete(this.currentlyPlaying);\r
                 }\r
                 catch (Exception)\r
                 {\r
-                    MessageBox.Show(this, "Unable to delete previous preview file. You may need to restart the application.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                    MessageBox.Show(this,\r
+                                    "Unable to delete previous preview file. You may need to restart the application.",\r
+                                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
                 }\r
 \r
                 btn_playQT.Enabled = false;\r
                 btn_playVLC.Enabled = false;\r
-                lbl_status.Text = "Encoding Sample for (QT) ...";\r
+                this.Text += " (Encoding)";\r
                 int duration;\r
                 int.TryParse(cb_duration.Text, out duration);\r
-                String query = hb_common_func.GenerateCLIQuery(mainWindow, duration, cb_preview.Text);\r
+                string query = QueryGenerator.GeneratePreviewQuery(this.mainWindow, duration, cb_preview.Text);\r
 \r
-                ThreadPool.QueueUserWorkItem(procMonitor, query);\r
+                ThreadPool.QueueUserWorkItem(this.CreatePreview, query);\r
             }\r
         }\r
-        private void procMonitor(object state)\r
+\r
+        /// <summary>\r
+        /// Create the Preview.\r
+        /// </summary>\r
+        /// <param name="state">\r
+        /// The state.\r
+        /// </param>\r
+        private void CreatePreview(object state)\r
         {\r
             // Make sure we are not already encoding and if we are then display an error.\r
-            if (process.hbProcess != null)\r
-                MessageBox.Show(this, "Handbrake is already encoding a video!", "Status", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
-            else\r
-            {\r
-                process.RunCli((string)state);\r
-                if (process.hbProcess != null)\r
-                {\r
-                    process.hbProcess.WaitForExit();\r
-                    process.hbProcess = null;\r
-                }\r
-                encodeCompleted();\r
-            }\r
-        }\r
-        private void encodeCompleted()\r
-        {\r
-            try\r
+            if (encodeQueue.IsEncoding)\r
             {\r
-                if (InvokeRequired)\r
-                {\r
-                    BeginInvoke(new UpdateUIHandler(encodeCompleted));\r
-                    return;\r
-                }\r
-                if (!noQT)\r
-                    btn_playQT.Enabled = true;\r
-                btn_playVLC.Enabled = true;\r
-\r
-                // Decide which player to use.\r
-                String playerSelection = lbl_status.Text.Contains("QT") ? "QT" : "VLC";\r
+                MessageBox.Show(\r
+                    this,\r
+                    "Handbrake is already encoding a video!",\r
+                    "Warning",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Warning);\r
 \r
-                lbl_status.Text = "Loading Clip ...";\r
-\r
-                // Get the sample filename\r
-                if (mainWindow.text_destination.Text != "")\r
-                    currently_playing = mainWindow.text_destination.Text.Replace(".mp4", "_sample.mp4").Replace(".m4v", "_sample.m4v").Replace(".mkv", "_sample.mkv"); ;\r
-\r
-                // Play back in QT or VLC\r
-                if (playerSelection == "QT")\r
-                    play();\r
-                else\r
-                    playVLC();\r
-\r
-                lbl_status.Text = "";\r
-            }\r
-            catch (Exception exc)\r
-            {\r
-                MessageBox.Show(this, "frmPreview.cs encodeCompleted " + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
+                return;\r
             }\r
+\r
+            encodeQueue.CreatePreviewSample((string)state);\r
         }\r
+\r
         #endregion\r
 \r
         #region Playback\r
@@ -152,37 +333,62 @@ namespace Handbrake
         /// <summary>\r
         /// Play the video back in the QuickTime control\r
         /// </summary>\r
-        private void play()\r
+        private void Play()\r
         {\r
-            player = new Thread(OpenMovie) { IsBackground = true };\r
-            player.Start();\r
-            lbl_status.Visible = false;\r
+            this.player = new Thread(OpenMovie) { IsBackground = true };\r
+            this.player.Start();\r
         }\r
 \r
         /// <summary>\r
-        /// Play the video back in an external VLC player\r
+        /// Play the video back in an external VLC Player\r
         /// </summary>\r
-        private void playVLC()\r
+        private void PlayVlc()\r
         {\r
-            // Launch VLC and play video.\r
-            if (currently_playing != "")\r
+            // Launch VLC and Play video.\r
+            if (this.currentlyPlaying != string.Empty)\r
             {\r
-                if (File.Exists(currently_playing))\r
+                if (File.Exists(this.currentlyPlaying))\r
                 {\r
+                    // Attempt to find VLC if it doesn't exist in the default set location.\r
+                    string vlcPath;\r
+\r
+                    if (8 == IntPtr.Size ||\r
+                        (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))\r
+                        vlcPath = Environment.GetEnvironmentVariable("ProgramFiles(x86)");\r
+                    else\r
+                        vlcPath = Environment.GetEnvironmentVariable("ProgramFiles");\r
+\r
+                    vlcPath = vlcPath != null\r
+                                  ? vlcPath + @"\VideoLAN\VLC\vlc.exe"\r
+                                  : @"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe";\r
+\r
+                    if (!File.Exists(Properties.Settings.Default.VLC_Path))\r
+                    {\r
+                        if (File.Exists(vlcPath))\r
+                        {\r
+                            Properties.Settings.Default.VLC_Path = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe";\r
+                            Properties.Settings.Default.Save(); // Save this new path if it does\r
+                        }\r
+                        else\r
+                        {\r
+                            MessageBox.Show(this,\r
+                                            "Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\") ",\r
+                                            "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                        }\r
+                    }\r
+\r
                     if (File.Exists(Properties.Settings.Default.VLC_Path))\r
                     {\r
-                        String args = "\"" + currently_playing + "\"";\r
+                        string args = "\"" + this.currentlyPlaying + "\"";\r
                         ProcessStartInfo vlc = new ProcessStartInfo(Properties.Settings.Default.VLC_Path, args);\r
                         Process.Start(vlc);\r
-                        lbl_status.Text = "VLC will now launch.";\r
                     }\r
-                    else\r
-                        MessageBox.Show(this, "Unable to detect VLC Player. \nPlease make sure VLC is installed and the directory specified in HandBrake's options is correct. (See: \"Tools Menu > Options > Picture Tab\") ", "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
                 }\r
                 else\r
-                    MessageBox.Show(this, "Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.", "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                    MessageBox.Show(this,\r
+                                    "Unable to find the preview file. Either the file was deleted or the encode failed. Check the activity log for details.",\r
+                                    "VLC", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
             }\r
-            lbl_status.Visible = false;\r
         }\r
 \r
         /// <summary>\r
@@ -195,27 +401,41 @@ namespace Handbrake
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateUIHandler(OpenMovie));\r
+                    BeginInvoke(new OpenMovieHandler(OpenMovie));\r
                     return;\r
                 }\r
-                QTControl.URL = currently_playing;\r
+                QTControl.URL = this.currentlyPlaying;\r
                 QTControl.SetSizing(QTSizingModeEnum.qtControlFitsMovie, true);\r
-                QTControl.URL = currently_playing;\r
+                QTControl.URL = this.currentlyPlaying;\r
                 QTControl.Show();\r
 \r
                 this.ClientSize = QTControl.Size;\r
-                this.Height += 25;\r
+                this.Height += toolBar.Height;\r
             }\r
             catch (COMException ex)\r
             {\r
                 QTUtils qtu = new QTUtils();\r
-                MessageBox.Show(this, "Unable to open movie:\n\nError Code: " + ex.ErrorCode.ToString("X") + "\nQT Error code : " + qtu.QTErrorFromErrorCode(ex.ErrorCode), "QT", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                Main.ShowExceptiowWindow("Unable to open movie.", ex + Environment.NewLine + qtu.QTErrorFromErrorCode(ex.ErrorCode));\r
             }\r
             catch (Exception ex)\r
             {\r
-                MessageBox.Show(this, "Unable to open movie:\n\n" + ex, "QT", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+                Main.ShowExceptiowWindow("Unable to open movie.", ex.ToString());\r
             }\r
         }\r
+\r
         #endregion\r
+\r
+        /// <summary>\r
+        /// Remove any subscribed events then close.\r
+        /// </summary>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)\r
+        {\r
+            encodeQueue.EncodeStarted -= this.EncodeQueueEncodeStarted;\r
+            encodeQueue.EncodeEnded -= this.EncodeQueueEncodeEnded;\r
+            base.OnClosing(e);\r
+        }\r
     }\r
-}\r
+}
\ No newline at end of file
index f75a67c..85ca671 100644 (file)
   </metadata>\r
   <data name="QTControl.OcxState" mimetype="application/x-microsoft.net.object.binary.base64">\r
     <value>\r
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w\r
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACFTeXN0\r
         ZW0uV2luZG93cy5Gb3Jtcy5BeEhvc3QrU3RhdGUBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAVQAAAAIB\r
         AAAAAQAAAAAAAAAAAAAAAEAAAAAACAAAnQYAAHEHAAATAA8AAIATAAAAAAADAAAAAAALAP//AwAAAAAA\r
index e3d7259..13ba68e 100644 (file)
@@ -1,8 +1,7 @@
 /*  frmQueue.Designer.cs \r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
@@ -36,15 +35,7 @@ namespace Handbrake
         {\r
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmQueue));\r
-            this.btn_down = new System.Windows.Forms.Button();\r
-            this.btn_up = new System.Windows.Forms.Button();\r
-            this.btn_delete = new System.Windows.Forms.Button();\r
             this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);\r
-            this.label4 = new System.Windows.Forms.Label();\r
-            this.lbl_chapt = new System.Windows.Forms.Label();\r
-            this.lbl_title = new System.Windows.Forms.Label();\r
-            this.lbl_aEnc = new System.Windows.Forms.Label();\r
-            this.lbl_vEnc = new System.Windows.Forms.Label();\r
             this.lbl_dest = new System.Windows.Forms.Label();\r
             this.lbl_source = new System.Windows.Forms.Label();\r
             this.label1 = new System.Windows.Forms.Label();\r
@@ -59,6 +50,8 @@ namespace Handbrake
             this.mnu_export = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();\r
             this.mnu_readd = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.drp_completeOption = new System.Windows.Forms.ToolStripComboBox();\r
+            this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();\r
             this.SaveFile = new System.Windows.Forms.SaveFileDialog();\r
             this.list_queue = new System.Windows.Forms.ListView();\r
             this.Title = new System.Windows.Forms.ColumnHeader();\r
@@ -71,12 +64,15 @@ namespace Handbrake
             this.mnu_up = new System.Windows.Forms.ToolStripMenuItem();\r
             this.mnu_Down = new System.Windows.Forms.ToolStripMenuItem();\r
             this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();\r
+            this.mnu_edit = new System.Windows.Forms.ToolStripMenuItem();\r
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();\r
             this.mnu_delete = new System.Windows.Forms.ToolStripMenuItem();\r
             this.statusStrip1 = new System.Windows.Forms.StatusStrip();\r
             this.lbl_encodesPending = new System.Windows.Forms.ToolStripStatusLabel();\r
             this.OpenFile = new System.Windows.Forms.OpenFileDialog();\r
+            this.lbl_encodeStatus = new System.Windows.Forms.Label();\r
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
-            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();\r
+            this.lbl_encodeOptions = new System.Windows.Forms.Label();\r
             this.panel3 = new System.Windows.Forms.Panel();\r
             this.panel2 = new System.Windows.Forms.Panel();\r
             this.panel1 = new System.Windows.Forms.Panel();\r
@@ -86,129 +82,24 @@ namespace Handbrake
             this.splitContainer1.Panel1.SuspendLayout();\r
             this.splitContainer1.Panel2.SuspendLayout();\r
             this.splitContainer1.SuspendLayout();\r
-            this.tableLayoutPanel1.SuspendLayout();\r
             this.SuspendLayout();\r
             // \r
-            // btn_down\r
-            // \r
-            this.btn_down.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.btn_down.BackColor = System.Drawing.SystemColors.ControlLight;\r
-            this.btn_down.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
-            this.btn_down.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_down.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_down.Location = new System.Drawing.Point(625, 52);\r
-            this.btn_down.Name = "btn_down";\r
-            this.tableLayoutPanel1.SetRowSpan(this.btn_down, 2);\r
-            this.btn_down.Size = new System.Drawing.Size(64, 22);\r
-            this.btn_down.TabIndex = 33;\r
-            this.btn_down.TabStop = false;\r
-            this.btn_down.Text = "Down";\r
-            this.toolTip1.SetToolTip(this.btn_down, "Move the selected item down 1 place in the queue");\r
-            this.btn_down.UseVisualStyleBackColor = true;\r
-            this.btn_down.Click += new System.EventHandler(this.btn_down_Click);\r
-            // \r
-            // btn_up\r
-            // \r
-            this.btn_up.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.btn_up.BackColor = System.Drawing.SystemColors.ControlLight;\r
-            this.btn_up.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
-            this.btn_up.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_up.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_up.Location = new System.Drawing.Point(564, 52);\r
-            this.btn_up.Name = "btn_up";\r
-            this.tableLayoutPanel1.SetRowSpan(this.btn_up, 2);\r
-            this.btn_up.Size = new System.Drawing.Size(55, 22);\r
-            this.btn_up.TabIndex = 32;\r
-            this.btn_up.TabStop = false;\r
-            this.btn_up.Text = "Up";\r
-            this.toolTip1.SetToolTip(this.btn_up, "Move the selected item up 1 place in the queue.");\r
-            this.btn_up.UseVisualStyleBackColor = true;\r
-            this.btn_up.Click += new System.EventHandler(this.btn_up_Click);\r
-            // \r
-            // btn_delete\r
-            // \r
-            this.btn_delete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));\r
-            this.btn_delete.BackColor = System.Drawing.SystemColors.ControlLight;\r
-            this.btn_delete.FlatAppearance.BorderColor = System.Drawing.Color.Black;\r
-            this.btn_delete.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.btn_delete.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(0)))));\r
-            this.btn_delete.Location = new System.Drawing.Point(695, 52);\r
-            this.btn_delete.Name = "btn_delete";\r
-            this.tableLayoutPanel1.SetRowSpan(this.btn_delete, 2);\r
-            this.btn_delete.Size = new System.Drawing.Size(64, 22);\r
-            this.btn_delete.TabIndex = 31;\r
-            this.btn_delete.TabStop = false;\r
-            this.btn_delete.Text = "Delete";\r
-            this.toolTip1.SetToolTip(this.btn_delete, "Remove the selected item from the queue");\r
-            this.btn_delete.UseVisualStyleBackColor = true;\r
-            this.btn_delete.Click += new System.EventHandler(this.btn_delete_Click);\r
-            // \r
-            // label4\r
-            // \r
-            this.label4.AutoSize = true;\r
-            this.label4.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label4.Location = new System.Drawing.Point(125, 49);\r
-            this.label4.Name = "label4";\r
-            this.tableLayoutPanel1.SetRowSpan(this.label4, 2);\r
-            this.label4.Size = new System.Drawing.Size(48, 26);\r
-            this.label4.TabIndex = 70;\r
-            this.label4.Text = "Video:\r\nAudio:";\r
-            // \r
-            // lbl_chapt\r
-            // \r
-            this.lbl_chapt.AutoSize = true;\r
-            this.lbl_chapt.Location = new System.Drawing.Point(108, 62);\r
-            this.lbl_chapt.Name = "lbl_chapt";\r
-            this.lbl_chapt.Size = new System.Drawing.Size(11, 13);\r
-            this.lbl_chapt.TabIndex = 69;\r
-            this.lbl_chapt.Text = "-";\r
-            // \r
-            // lbl_title\r
-            // \r
-            this.lbl_title.AccessibleRole = System.Windows.Forms.AccessibleRole.None;\r
-            this.lbl_title.AutoSize = true;\r
-            this.lbl_title.Location = new System.Drawing.Point(108, 49);\r
-            this.lbl_title.Name = "lbl_title";\r
-            this.lbl_title.Size = new System.Drawing.Size(11, 13);\r
-            this.lbl_title.TabIndex = 68;\r
-            this.lbl_title.Text = "-";\r
-            // \r
-            // lbl_aEnc\r
-            // \r
-            this.lbl_aEnc.AutoSize = true;\r
-            this.lbl_aEnc.Location = new System.Drawing.Point(179, 62);\r
-            this.lbl_aEnc.Name = "lbl_aEnc";\r
-            this.lbl_aEnc.Size = new System.Drawing.Size(11, 13);\r
-            this.lbl_aEnc.TabIndex = 67;\r
-            this.lbl_aEnc.Text = "-";\r
-            // \r
-            // lbl_vEnc\r
-            // \r
-            this.lbl_vEnc.AutoSize = true;\r
-            this.lbl_vEnc.Location = new System.Drawing.Point(179, 49);\r
-            this.lbl_vEnc.Name = "lbl_vEnc";\r
-            this.lbl_vEnc.Size = new System.Drawing.Size(11, 13);\r
-            this.lbl_vEnc.TabIndex = 66;\r
-            this.lbl_vEnc.Text = "-";\r
-            // \r
             // lbl_dest\r
             // \r
-            this.lbl_dest.AutoSize = true;\r
-            this.tableLayoutPanel1.SetColumnSpan(this.lbl_dest, 6);\r
-            this.lbl_dest.Location = new System.Drawing.Point(108, 36);\r
+            this.lbl_dest.AutoEllipsis = true;\r
+            this.lbl_dest.Location = new System.Drawing.Point(117, 60);\r
             this.lbl_dest.Name = "lbl_dest";\r
-            this.lbl_dest.Size = new System.Drawing.Size(11, 13);\r
+            this.lbl_dest.Size = new System.Drawing.Size(671, 13);\r
             this.lbl_dest.TabIndex = 65;\r
             this.lbl_dest.Text = "-";\r
             this.lbl_dest.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;\r
             // \r
             // lbl_source\r
             // \r
-            this.lbl_source.AutoSize = true;\r
-            this.tableLayoutPanel1.SetColumnSpan(this.lbl_source, 6);\r
-            this.lbl_source.Location = new System.Drawing.Point(108, 23);\r
+            this.lbl_source.AutoEllipsis = true;\r
+            this.lbl_source.Location = new System.Drawing.Point(117, 47);\r
             this.lbl_source.Name = "lbl_source";\r
-            this.lbl_source.Size = new System.Drawing.Size(11, 13);\r
+            this.lbl_source.Size = new System.Drawing.Size(671, 13);\r
             this.lbl_source.TabIndex = 64;\r
             this.lbl_source.Text = "-";\r
             // \r
@@ -216,18 +107,17 @@ namespace Handbrake
             // \r
             this.label1.AutoSize = true;\r
             this.label1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label1.Location = new System.Drawing.Point(3, 23);\r
+            this.label1.Location = new System.Drawing.Point(12, 47);\r
             this.label1.Name = "label1";\r
-            this.tableLayoutPanel1.SetRowSpan(this.label1, 4);\r
-            this.label1.Size = new System.Drawing.Size(99, 52);\r
+            this.label1.Size = new System.Drawing.Size(85, 39);\r
             this.label1.TabIndex = 63;\r
-            this.label1.Text = "Source:\r\nDestination:\r\nDVD Title:\r\nDVD Chapters:";\r
+            this.label1.Text = "Source:\r\nDestination:\r\nOptions:";\r
             // \r
             // label3\r
             // \r
             this.label3.AutoSize = true;\r
             this.label3.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
-            this.label3.Location = new System.Drawing.Point(3, 0);\r
+            this.label3.Location = new System.Drawing.Point(12, 9);\r
             this.label3.Name = "label3";\r
             this.label3.Size = new System.Drawing.Size(82, 13);\r
             this.label3.TabIndex = 62;\r
@@ -240,11 +130,13 @@ namespace Handbrake
             this.btn_encode,\r
             this.btn_pause,\r
             this.toolStripSeparator1,\r
-            this.drop_button_queue});\r
+            this.drop_button_queue,\r
+            this.drp_completeOption,\r
+            this.toolStripButton1});\r
             this.toolStrip1.Location = new System.Drawing.Point(0, 0);\r
             this.toolStrip1.Name = "toolStrip1";\r
             this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
-            this.toolStrip1.Size = new System.Drawing.Size(787, 39);\r
+            this.toolStrip1.Size = new System.Drawing.Size(789, 39);\r
             this.toolStrip1.TabIndex = 71;\r
             this.toolStrip1.Text = "toolStrip1";\r
             // \r
@@ -256,7 +148,7 @@ namespace Handbrake
             this.btn_encode.Name = "btn_encode";\r
             this.btn_encode.Size = new System.Drawing.Size(82, 36);\r
             this.btn_encode.Text = "Encode";\r
-            this.btn_encode.Click += new System.EventHandler(this.btn_encode_Click);\r
+            this.btn_encode.Click += new System.EventHandler(this.BtnEncodeClick);\r
             // \r
             // btn_pause\r
             // \r
@@ -268,7 +160,7 @@ namespace Handbrake
             this.btn_pause.Size = new System.Drawing.Size(74, 36);\r
             this.btn_pause.Text = "Pause";\r
             this.btn_pause.Visible = false;\r
-            this.btn_pause.Click += new System.EventHandler(this.btn_pause_Click);\r
+            this.btn_pause.Click += new System.EventHandler(this.BtnPauseClick);\r
             // \r
             // toolStripSeparator1\r
             // \r
@@ -294,39 +186,68 @@ namespace Handbrake
             // \r
             this.mnu_batch.Image = global::Handbrake.Properties.Resources.Output_Small;\r
             this.mnu_batch.Name = "mnu_batch";\r
-            this.mnu_batch.Size = new System.Drawing.Size(187, 22);\r
+            this.mnu_batch.Size = new System.Drawing.Size(235, 22);\r
             this.mnu_batch.Text = "Generate Batch Script";\r
-            this.mnu_batch.Click += new System.EventHandler(this.mnu_batch_Click);\r
+            this.mnu_batch.Click += new System.EventHandler(this.MnuBatchClick);\r
             // \r
             // mnu_import\r
             // \r
             this.mnu_import.Image = global::Handbrake.Properties.Resources.folder;\r
             this.mnu_import.Name = "mnu_import";\r
-            this.mnu_import.Size = new System.Drawing.Size(187, 22);\r
+            this.mnu_import.Size = new System.Drawing.Size(235, 22);\r
             this.mnu_import.Text = "Import Queue";\r
-            this.mnu_import.Click += new System.EventHandler(this.mnu_import_Click);\r
+            this.mnu_import.Click += new System.EventHandler(this.MnuImportClick);\r
             // \r
             // mnu_export\r
             // \r
             this.mnu_export.Image = global::Handbrake.Properties.Resources.save;\r
             this.mnu_export.Name = "mnu_export";\r
-            this.mnu_export.Size = new System.Drawing.Size(187, 22);\r
+            this.mnu_export.Size = new System.Drawing.Size(235, 22);\r
             this.mnu_export.Text = "Export Queue";\r
-            this.mnu_export.Click += new System.EventHandler(this.mnu_export_Click);\r
+            this.mnu_export.Click += new System.EventHandler(this.MnuExportClick);\r
             // \r
             // toolStripSeparator2\r
             // \r
             this.toolStripSeparator2.Name = "toolStripSeparator2";\r
-            this.toolStripSeparator2.Size = new System.Drawing.Size(184, 6);\r
+            this.toolStripSeparator2.Size = new System.Drawing.Size(232, 6);\r
             // \r
             // mnu_readd\r
             // \r
             this.mnu_readd.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;\r
             this.mnu_readd.Image = global::Handbrake.Properties.Resources.AddToQueue_small;\r
             this.mnu_readd.Name = "mnu_readd";\r
-            this.mnu_readd.Size = new System.Drawing.Size(187, 22);\r
-            this.mnu_readd.Text = "Re-Add Current Job";\r
-            this.mnu_readd.Click += new System.EventHandler(this.mnu_readd_Click);\r
+            this.mnu_readd.Size = new System.Drawing.Size(235, 22);\r
+            this.mnu_readd.Text = "Re-Add Currently Running Job";\r
+            this.mnu_readd.ToolTipText = "Readds the currently encoding job back onto the queue.";\r
+            this.mnu_readd.Click += new System.EventHandler(this.MnuReaddClick);\r
+            // \r
+            // drp_completeOption\r
+            // \r
+            this.drp_completeOption.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
+            this.drp_completeOption.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
+            this.drp_completeOption.FlatStyle = System.Windows.Forms.FlatStyle.System;\r
+            this.drp_completeOption.Items.AddRange(new object[] {\r
+            "Do nothing",\r
+            "Shutdown",\r
+            "Suspend",\r
+            "Hibernate",\r
+            "Lock system",\r
+            "Log off",\r
+            "Quit HandBrake"});\r
+            this.drp_completeOption.Margin = new System.Windows.Forms.Padding(1, 0, 15, 0);\r
+            this.drp_completeOption.Name = "drp_completeOption";\r
+            this.drp_completeOption.Size = new System.Drawing.Size(155, 39);\r
+            this.drp_completeOption.SelectedIndexChanged += new System.EventHandler(this.CompleteOptionChanged);\r
+            // \r
+            // toolStripButton1\r
+            // \r
+            this.toolStripButton1.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;\r
+            this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;\r
+            this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image")));\r
+            this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta;\r
+            this.toolStripButton1.Name = "toolStripButton1";\r
+            this.toolStripButton1.Size = new System.Drawing.Size(76, 36);\r
+            this.toolStripButton1.Text = "When Done:";\r
             // \r
             // SaveFile\r
             // \r
@@ -347,13 +268,13 @@ namespace Handbrake
             this.list_queue.FullRowSelect = true;\r
             this.list_queue.GridLines = true;\r
             this.list_queue.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;\r
-            this.list_queue.Location = new System.Drawing.Point(13, 0);\r
+            this.list_queue.Location = new System.Drawing.Point(15, 0);\r
             this.list_queue.Name = "list_queue";\r
-            this.list_queue.Size = new System.Drawing.Size(761, 219);\r
+            this.list_queue.Size = new System.Drawing.Size(759, 199);\r
             this.list_queue.TabIndex = 72;\r
             this.list_queue.UseCompatibleStateImageBehavior = false;\r
             this.list_queue.View = System.Windows.Forms.View.Details;\r
-            this.list_queue.KeyUp += new System.Windows.Forms.KeyEventHandler(this.list_queue_deleteKey);\r
+            this.list_queue.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ListQueueDeleteKey);\r
             // \r
             // Title\r
             // \r
@@ -391,44 +312,59 @@ namespace Handbrake
             this.mnu_up,\r
             this.mnu_Down,\r
             this.toolStripSeparator3,\r
+            this.mnu_edit,\r
+            this.toolStripSeparator4,\r
             this.mnu_delete});\r
             this.mnu_queue.Name = "mnu_queue";\r
-            this.mnu_queue.Size = new System.Drawing.Size(139, 76);\r
+            this.mnu_queue.Size = new System.Drawing.Size(139, 104);\r
             // \r
             // mnu_up\r
             // \r
             this.mnu_up.Name = "mnu_up";\r
             this.mnu_up.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_up.Text = "Move Up";\r
-            this.mnu_up.Click += new System.EventHandler(this.mnu_up_Click);\r
+            this.mnu_up.Click += new System.EventHandler(this.MnuUpClick);\r
             // \r
             // mnu_Down\r
             // \r
             this.mnu_Down.Name = "mnu_Down";\r
             this.mnu_Down.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_Down.Text = "Move Down";\r
-            this.mnu_Down.Click += new System.EventHandler(this.mnu_Down_Click);\r
+            this.mnu_Down.Click += new System.EventHandler(this.MnuDownClick);\r
             // \r
             // toolStripSeparator3\r
             // \r
             this.toolStripSeparator3.Name = "toolStripSeparator3";\r
             this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6);\r
             // \r
+            // mnu_edit\r
+            // \r
+            this.mnu_edit.Name = "mnu_edit";\r
+            this.mnu_edit.Size = new System.Drawing.Size(138, 22);\r
+            this.mnu_edit.Text = "Edit";\r
+            this.mnu_edit.Click += new System.EventHandler(this.MnuEditClick);\r
+            // \r
+            // toolStripSeparator4\r
+            // \r
+            this.toolStripSeparator4.Name = "toolStripSeparator4";\r
+            this.toolStripSeparator4.Size = new System.Drawing.Size(135, 6);\r
+            // \r
             // mnu_delete\r
             // \r
             this.mnu_delete.Name = "mnu_delete";\r
             this.mnu_delete.Size = new System.Drawing.Size(138, 22);\r
             this.mnu_delete.Text = "Delete";\r
-            this.mnu_delete.Click += new System.EventHandler(this.mnu_delete_Click);\r
+            this.mnu_delete.Click += new System.EventHandler(this.MnuDeleteClick);\r
             // \r
             // statusStrip1\r
             // \r
             this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {\r
             this.lbl_encodesPending});\r
-            this.statusStrip1.Location = new System.Drawing.Point(0, 368);\r
+            this.statusStrip1.Location = new System.Drawing.Point(0, 363);\r
             this.statusStrip1.Name = "statusStrip1";\r
             this.statusStrip1.Padding = new System.Windows.Forms.Padding(1, 0, 12, 0);\r
-            this.statusStrip1.Size = new System.Drawing.Size(787, 22);\r
+            this.statusStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.Professional;\r
+            this.statusStrip1.Size = new System.Drawing.Size(789, 22);\r
             this.statusStrip1.TabIndex = 73;\r
             this.statusStrip1.Text = "statusStrip1";\r
             // \r
@@ -444,18 +380,34 @@ namespace Handbrake
             // \r
             this.OpenFile.Filter = "HandBrake Queue|*.queue";\r
             // \r
+            // lbl_encodeStatus\r
+            // \r
+            this.lbl_encodeStatus.AutoSize = true;\r
+            this.lbl_encodeStatus.Location = new System.Drawing.Point(12, 30);\r
+            this.lbl_encodeStatus.Name = "lbl_encodeStatus";\r
+            this.lbl_encodeStatus.Size = new System.Drawing.Size(38, 13);\r
+            this.lbl_encodeStatus.TabIndex = 73;\r
+            this.lbl_encodeStatus.Text = "Ready";\r
+            // \r
             // splitContainer1\r
             // \r
+            this.splitContainer1.BackColor = System.Drawing.Color.Transparent;\r
             this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;\r
             this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;\r
-            this.splitContainer1.IsSplitterFixed = true;\r
             this.splitContainer1.Location = new System.Drawing.Point(0, 39);\r
             this.splitContainer1.Name = "splitContainer1";\r
             this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;\r
             // \r
             // splitContainer1.Panel1\r
             // \r
-            this.splitContainer1.Panel1.Controls.Add(this.tableLayoutPanel1);\r
+            this.splitContainer1.Panel1.BackColor = System.Drawing.Color.Transparent;\r
+            this.splitContainer1.Panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;\r
+            this.splitContainer1.Panel1.Controls.Add(this.lbl_encodeOptions);\r
+            this.splitContainer1.Panel1.Controls.Add(this.label3);\r
+            this.splitContainer1.Panel1.Controls.Add(this.lbl_dest);\r
+            this.splitContainer1.Panel1.Controls.Add(this.label1);\r
+            this.splitContainer1.Panel1.Controls.Add(this.lbl_encodeStatus);\r
+            this.splitContainer1.Panel1.Controls.Add(this.lbl_source);\r
             // \r
             // splitContainer1.Panel2\r
             // \r
@@ -463,75 +415,51 @@ namespace Handbrake
             this.splitContainer1.Panel2.Controls.Add(this.panel3);\r
             this.splitContainer1.Panel2.Controls.Add(this.panel2);\r
             this.splitContainer1.Panel2.Controls.Add(this.panel1);\r
-            this.splitContainer1.Size = new System.Drawing.Size(787, 329);\r
-            this.splitContainer1.SplitterDistance = 94;\r
-            this.splitContainer1.SplitterWidth = 1;\r
+            this.splitContainer1.Size = new System.Drawing.Size(789, 324);\r
+            this.splitContainer1.SplitterDistance = 106;\r
             this.splitContainer1.TabIndex = 74;\r
             // \r
-            // tableLayoutPanel1\r
-            // \r
-            this.tableLayoutPanel1.AutoSize = true;\r
-            this.tableLayoutPanel1.ColumnCount = 7;\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());\r
-            this.tableLayoutPanel1.Controls.Add(this.label1, 0, 2);\r
-            this.tableLayoutPanel1.Controls.Add(this.btn_delete, 6, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.btn_down, 5, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_aEnc, 3, 5);\r
-            this.tableLayoutPanel1.Controls.Add(this.btn_up, 4, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_source, 1, 2);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_vEnc, 3, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.label4, 2, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_dest, 1, 3);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_title, 1, 4);\r
-            this.tableLayoutPanel1.Controls.Add(this.lbl_chapt, 1, 5);\r
-            this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);\r
-            this.tableLayoutPanel1.Location = new System.Drawing.Point(13, 13);\r
-            this.tableLayoutPanel1.Name = "tableLayoutPanel1";\r
-            this.tableLayoutPanel1.RowCount = 6;\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 10F));\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());\r
-            this.tableLayoutPanel1.Size = new System.Drawing.Size(762, 77);\r
-            this.tableLayoutPanel1.TabIndex = 71;\r
+            // lbl_encodeOptions\r
+            // \r
+            this.lbl_encodeOptions.AutoEllipsis = true;\r
+            this.lbl_encodeOptions.Location = new System.Drawing.Point(117, 73);\r
+            this.lbl_encodeOptions.Name = "lbl_encodeOptions";\r
+            this.lbl_encodeOptions.Size = new System.Drawing.Size(671, 33);\r
+            this.lbl_encodeOptions.TabIndex = 74;\r
+            this.lbl_encodeOptions.Text = "-";\r
             // \r
             // panel3\r
             // \r
+            this.panel3.BackColor = System.Drawing.Color.Transparent;\r
             this.panel3.Dock = System.Windows.Forms.DockStyle.Bottom;\r
-            this.panel3.Location = new System.Drawing.Point(13, 219);\r
+            this.panel3.Location = new System.Drawing.Point(15, 199);\r
             this.panel3.Name = "panel3";\r
-            this.panel3.Size = new System.Drawing.Size(761, 15);\r
-            this.panel3.TabIndex = 77;\r
+            this.panel3.Size = new System.Drawing.Size(759, 15);\r
+            this.panel3.TabIndex = 73;\r
             // \r
             // panel2\r
             // \r
+            this.panel2.BackColor = System.Drawing.Color.Transparent;\r
             this.panel2.Dock = System.Windows.Forms.DockStyle.Right;\r
             this.panel2.Location = new System.Drawing.Point(774, 0);\r
             this.panel2.Name = "panel2";\r
-            this.panel2.Size = new System.Drawing.Size(13, 234);\r
-            this.panel2.TabIndex = 76;\r
+            this.panel2.Size = new System.Drawing.Size(15, 214);\r
+            this.panel2.TabIndex = 1;\r
             // \r
             // panel1\r
             // \r
+            this.panel1.BackColor = System.Drawing.Color.Transparent;\r
             this.panel1.Dock = System.Windows.Forms.DockStyle.Left;\r
             this.panel1.Location = new System.Drawing.Point(0, 0);\r
             this.panel1.Name = "panel1";\r
-            this.panel1.Size = new System.Drawing.Size(13, 234);\r
-            this.panel1.TabIndex = 75;\r
+            this.panel1.Size = new System.Drawing.Size(15, 214);\r
+            this.panel1.TabIndex = 0;\r
             // \r
             // frmQueue\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
-            this.ClientSize = new System.Drawing.Size(787, 390);\r
+            this.ClientSize = new System.Drawing.Size(789, 385);\r
             this.Controls.Add(this.splitContainer1);\r
             this.Controls.Add(this.statusStrip1);\r
             this.Controls.Add(this.toolStrip1);\r
@@ -550,8 +478,6 @@ namespace Handbrake
             this.splitContainer1.Panel1.PerformLayout();\r
             this.splitContainer1.Panel2.ResumeLayout(false);\r
             this.splitContainer1.ResumeLayout(false);\r
-            this.tableLayoutPanel1.ResumeLayout(false);\r
-            this.tableLayoutPanel1.PerformLayout();\r
             this.ResumeLayout(false);\r
             this.PerformLayout();\r
 \r
@@ -559,15 +485,7 @@ namespace Handbrake
 \r
         #endregion\r
 \r
-        internal System.Windows.Forms.Button btn_down;\r
-        internal System.Windows.Forms.Button btn_up;\r
-        internal System.Windows.Forms.Button btn_delete;\r
         private System.Windows.Forms.ToolTip toolTip1;\r
-        private System.Windows.Forms.Label label4;\r
-        private System.Windows.Forms.Label lbl_chapt;\r
-        private System.Windows.Forms.Label lbl_title;\r
-        private System.Windows.Forms.Label lbl_aEnc;\r
-        private System.Windows.Forms.Label lbl_vEnc;\r
         private System.Windows.Forms.Label lbl_dest;\r
         private System.Windows.Forms.Label lbl_source;\r
         private System.Windows.Forms.Label label1;\r
@@ -591,10 +509,6 @@ namespace Handbrake
         private System.Windows.Forms.ToolStripMenuItem mnu_export;\r
         private System.Windows.Forms.OpenFileDialog OpenFile;\r
         private System.Windows.Forms.ToolStripStatusLabel lbl_encodesPending;\r
-        private System.Windows.Forms.SplitContainer splitContainer1;\r
-        private System.Windows.Forms.Panel panel2;\r
-        private System.Windows.Forms.Panel panel1;\r
-        private System.Windows.Forms.Panel panel3;\r
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_readd;\r
         private System.Windows.Forms.ContextMenuStrip mnu_queue;\r
@@ -602,6 +516,15 @@ namespace Handbrake
         private System.Windows.Forms.ToolStripMenuItem mnu_Down;\r
         private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;\r
         private System.Windows.Forms.ToolStripMenuItem mnu_delete;\r
-        private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;\r
+        private System.Windows.Forms.ToolStripMenuItem mnu_edit;\r
+        private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;\r
+        private System.Windows.Forms.Label lbl_encodeStatus;\r
+        private System.Windows.Forms.SplitContainer splitContainer1;\r
+        private System.Windows.Forms.Panel panel2;\r
+        private System.Windows.Forms.Panel panel1;\r
+        private System.Windows.Forms.Label lbl_encodeOptions;\r
+        private System.Windows.Forms.ToolStripComboBox drp_completeOption;\r
+        private System.Windows.Forms.ToolStripButton toolStripButton1;\r
+        private System.Windows.Forms.Panel panel3;\r
     }\r
 }\r
index 3529789..2684772 100644 (file)
 /*  frmQueue.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.ComponentModel;\r
-using System.Windows.Forms;\r
-using Handbrake.EncodeQueue;\r
-using System.Collections.ObjectModel;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake\r
 {\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Collections.ObjectModel;\r
+    using System.ComponentModel;\r
+    using System.IO;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Model;\r
+    using HandBrake.ApplicationServices.Services;\r
+    using HandBrake.ApplicationServices.Services.Interfaces;\r
+\r
+    using Model;\r
+\r
+    /// <summary>\r
+    /// The Queue Window\r
+    /// </summary>\r
     public partial class frmQueue : Form\r
     {\r
+        /// <summary>\r
+        /// Update Handler Delegate\r
+        /// </summary>\r
         private delegate void UpdateHandler();\r
-        private EncodeAndQueueHandler queue;\r
 \r
-        public frmQueue(EncodeAndQueueHandler q)\r
+        /// <summary>\r
+        /// An instance of the Queue service\r
+        /// </summary>\r
+        private readonly IQueue queue;\r
+\r
+        /// <summary>\r
+        /// A reference to the main application window\r
+        /// </summary>\r
+        private readonly frmMain mainWindow;\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="frmQueue"/> class.\r
+        /// </summary>\r
+        /// <param name="q">\r
+        /// An instance of the queue service.\r
+        /// </param>\r
+        /// <param name="mw">\r
+        /// The main window.\r
+        /// </param>\r
+        public frmQueue(IQueue q, frmMain mw)\r
         {\r
             InitializeComponent();\r
 \r
+            this.mainWindow = mw;\r
+\r
             this.queue = q;\r
-            queue.NewJobStarted += new EventHandler(queueOnEncodeStart);\r
-            queue.QueueCompleted += new EventHandler(queueOnQueueFinished);\r
-            queue.QueuePauseRequested += new EventHandler(queueOnPaused);\r
+            queue.EncodeStarted += new EventHandler(QueueOnEncodeStart);\r
+            queue.QueueCompleted += new EventHandler(QueueOnQueueFinished);\r
+            queue.QueuePauseRequested += new EventHandler(QueueOnPaused);\r
+            queue.QueueListChanged += new EventHandler(queue_QueueListChanged);\r
+\r
+            queue.EncodeStarted += new EventHandler(queue_EncodeStarted);\r
+            queue.EncodeEnded += new EventHandler(queue_EncodeEnded);\r
+\r
+            drp_completeOption.Text = Properties.Settings.Default.CompletionOption;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Queue Changed\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_QueueListChanged(object sender, EventArgs e)\r
+        {\r
+            UpdateUiElementsOnQueueChange();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Encode Ended\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_EncodeEnded(object sender, EventArgs e)\r
+        {\r
+            queue.EncodeStatusChanged -= EncodeQueue_EncodeStatusChanged;\r
+            ResetEncodeText();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Queue Started\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void queue_EncodeStarted(object sender, EventArgs e)\r
+        {\r
+            this.SetCurrentEncodeInformation();\r
+            queue.EncodeStatusChanged += EncodeQueue_EncodeStatusChanged;        \r
+        }\r
+\r
+        /// <summary>\r
+        /// Display the Encode Status\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void EncodeQueue_EncodeStatusChanged(object sender, HandBrake.ApplicationServices.EncodeProgressEventArgs e)\r
+        {\r
+            if (this.InvokeRequired)\r
+            {\r
+                this.BeginInvoke(new Encode.EncodeProgessStatus(EncodeQueue_EncodeStatusChanged), new[] { sender, e });\r
+                return;\r
+            }\r
+\r
+            lbl_encodeStatus.Text =\r
+                string.Format(\r
+                "Encoding: Pass {0} of {1}, {2:00.00}% Time Remaining: {3}",\r
+                e.Task,\r
+                e.TaskCount,\r
+                e.PercentComplete,\r
+                e.EstimatedTimeLeft);\r
         }\r
-        void queueOnPaused(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the Queue Paused event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void QueueOnPaused(object sender, EventArgs e)\r
         {\r
-            setUIEncodeFinished();\r
-            updateUIElements();\r
+            SetUiEncodeFinished();\r
+            UpdateUiElementsOnQueueChange();\r
         }\r
-        void queueOnQueueFinished(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the Queue Finished event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void QueueOnQueueFinished(object sender, EventArgs e)\r
         {\r
-            setUIEncodeFinished();\r
-            resetQueue(); // Reset the Queue Window\r
+            SetUiEncodeFinished();\r
+            ResetQueue(); // Reset the Queue Window\r
         }\r
-        void queueOnEncodeStart(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the Encode Started event\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void QueueOnEncodeStart(object sender, EventArgs e)\r
         {\r
-            setUIEncodeStarted(); // make sure the UI is set correctly\r
-            setCurrentEncodeInformation();\r
-            updateUIElements(); // Redraw the Queue, a new encode has started.\r
+            SetUiEncodeStarted(); // make sure the UI is set correctly\r
+            UpdateUiElementsOnQueueChange(); // Redraw the Queue, a new encode has started.\r
         }\r
 \r
         /// <summary>\r
         /// Initializes the Queue list with the Arraylist from the Queue class\r
         /// </summary>\r
-        public void setQueue()\r
+        public void SetQueue()\r
         {\r
-            updateUIElements();\r
+            UpdateUiElementsOnQueueChange();\r
         }\r
 \r
         /// <summary>\r
@@ -57,7 +194,7 @@ namespace Handbrake
         /// </summary>\r
         public new void Show()\r
         {\r
-           Show(true);\r
+            Show(true);\r
         }\r
 \r
         /// <summary>\r
@@ -66,114 +203,152 @@ namespace Handbrake
         /// <param name="doSetQueue">Indicates whether to call setQueue() before showing the window</param>\r
         public void Show(bool doSetQueue)\r
         {\r
-            if (doSetQueue) setQueue();\r
+            if (doSetQueue) SetQueue();\r
             base.Show();\r
-\r
-            //Activate();\r
         }\r
 \r
-        // Start and Stop Controls\r
-        private void btn_encode_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Encode button Click event\r
+        /// </summary>\r
+        /// <param name="sender">The sender</param>\r
+        /// <param name="e">the EventArgs</param>\r
+        private void BtnEncodeClick(object sender, EventArgs e)\r
         {\r
-            if (queue.PauseRequested)\r
+            if (queue.Paused)\r
             {\r
-                setUIEncodeStarted();\r
-                MessageBox.Show("Encoding restarted", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);\r
+                SetUiEncodeStarted();\r
             }\r
 \r
-            if (!queue.isEncoding)\r
-                queue.StartEncodeQueue();\r
-\r
+            lbl_encodeStatus.Text = "Encoding ...";\r
+            queue.Start();\r
         }\r
-        private void btn_pause_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the Pause button click event.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void BtnPauseClick(object sender, EventArgs e)\r
         {\r
-            queue.RequestPause();\r
-            setUIEncodeFinished();\r
-            resetQueue();\r
-            MessageBox.Show("No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
+            queue.Pause();\r
+            MessageBox.Show(\r
+                "No further items on the queue will start. The current encode process will continue until it is finished. \nClick 'Encode' when you wish to continue encoding the queue.",\r
+                "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);\r
         }\r
 \r
-        // Window Display Management\r
-        private void setUIEncodeStarted()\r
+        // UI Work\r
+\r
+        /// <summary>\r
+        /// Setup the UI to show that an encode has started\r
+        /// </summary>\r
+        private void SetUiEncodeStarted()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(setUIEncodeStarted));\r
+                BeginInvoke(new UpdateHandler(SetUiEncodeStarted));\r
                 return;\r
             }\r
             btn_encode.Enabled = false;\r
             btn_pause.Visible = true;\r
         }\r
-        private void setUIEncodeFinished()\r
+\r
+        /// <summary>\r
+        /// Setup the UI to indicate that an encode has finished.\r
+        /// </summary>\r
+        private void SetUiEncodeFinished()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(setUIEncodeFinished));\r
+                BeginInvoke(new UpdateHandler(SetUiEncodeFinished));\r
                 return;\r
             }\r
             btn_pause.Visible = false;\r
             btn_encode.Enabled = true;\r
         }\r
-        private void resetQueue()\r
+\r
+        /// <summary>\r
+        /// Reset the Queue Window display\r
+        /// </summary>\r
+        private void ResetQueue()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(resetQueue));\r
+                BeginInvoke(new UpdateHandler(ResetQueue));\r
                 return;\r
             }\r
             btn_pause.Visible = false;\r
             btn_encode.Enabled = true;\r
 \r
+            ResetEncodeText();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Reset the current job text\r
+        /// </summary>\r
+        private void ResetEncodeText()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new UpdateHandler(ResetEncodeText));\r
+                return;\r
+            }\r
+            lbl_encodeStatus.Text = "Ready";\r
+\r
             lbl_source.Text = "-";\r
             lbl_dest.Text = "-";\r
-            lbl_vEnc.Text = "-";\r
-            lbl_aEnc.Text = "-";\r
-            lbl_title.Text = "-";\r
-            lbl_chapt.Text = "-";\r
+            lbl_encodeOptions.Text = "-";\r
 \r
             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
-        private void redrawQueue()\r
+\r
+        /// <summary>\r
+        /// Redraw the Queue window with the latest information about HandBrakes status\r
+        /// </summary>\r
+        private void RedrawQueue()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(redrawQueue));\r
+                BeginInvoke(new UpdateHandler(RedrawQueue));\r
                 return;\r
             }\r
 \r
             list_queue.Items.Clear();\r
             ReadOnlyCollection<Job> theQueue = queue.CurrentQueue;\r
-            foreach (Job queue_item in theQueue)\r
+            foreach (Job queueItem in theQueue)\r
             {\r
-                string q_item = queue_item.Query;\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(q_item);\r
+                string qItem = queueItem.Query;\r
+                QueryParser parsed = Functions.QueryParser.Parse(qItem);\r
 \r
                 // Get the DVD Title\r
-                string title = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
+                string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
 \r
                 // Get the DVD Chapters\r
                 string chapters;\r
-                if (parsed.DVDChapterStart == 0)\r
+                if (parsed.ChapterStart == 0)\r
                     chapters = "Auto";\r
                 else\r
                 {\r
-                    chapters = parsed.DVDChapterStart.ToString();\r
-                    if (parsed.DVDChapterFinish != 0)\r
-                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
+                    chapters = parsed.ChapterStart.ToString();\r
+                    if (parsed.ChapterFinish != 0)\r
+                        chapters = chapters + " - " + parsed.ChapterFinish;\r
                 }\r
 \r
                 ListViewItem item = new ListViewItem();\r
                 item.Text = title; // Title\r
                 item.SubItems.Add(chapters); // Chapters\r
-                item.SubItems.Add(queue_item.Source); // Source\r
-                item.SubItems.Add(queue_item.Destination); // Destination\r
+                item.SubItems.Add(queueItem.Source); // Source\r
+                item.SubItems.Add(queueItem.Destination); // Destination\r
                 item.SubItems.Add(parsed.VideoEncoder); // Video\r
 \r
                 // Display The Audio Track Information\r
                 string audio = string.Empty;\r
-                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    if (audio != "")\r
+                    if (audio != string.Empty)\r
                         audio += ", " + track.Encoder;\r
                     else\r
                         audio = track.Encoder;\r
@@ -183,121 +358,165 @@ namespace Handbrake
                 list_queue.Items.Add(item);\r
             }\r
         }\r
-        private void updateUIElements()\r
+\r
+        /// <summary>\r
+        /// Update the UI elements\r
+        /// </summary>\r
+        private void UpdateUiElementsOnQueueChange()\r
         {\r
             if (InvokeRequired)\r
             {\r
-                BeginInvoke(new UpdateHandler(updateUIElements));\r
+                BeginInvoke(new UpdateHandler(UpdateUiElementsOnQueueChange));\r
                 return;\r
             }\r
 \r
-            redrawQueue();\r
+            RedrawQueue();\r
             lbl_encodesPending.Text = list_queue.Items.Count + " encode(s) pending";\r
         }\r
-        private void setCurrentEncodeInformation()\r
+\r
+        /// <summary>\r
+        /// Set the window up with the current encode information\r
+        /// </summary>\r
+        private void SetCurrentEncodeInformation()\r
         {\r
             try\r
             {\r
                 if (InvokeRequired)\r
                 {\r
-                    BeginInvoke(new UpdateHandler(setCurrentEncodeInformation));\r
+                    BeginInvoke(new UpdateHandler(SetCurrentEncodeInformation));\r
                 }\r
 \r
-                // found query is a global varible\r
-                Functions.QueryParser parsed = Functions.QueryParser.Parse(queue.LastEncode.Query);\r
-                lbl_source.Text = queue.LastEncode.Source;\r
-                lbl_dest.Text = queue.LastEncode.Destination;\r
-\r
-                lbl_title.Text = parsed.DVDTitle == 0 ? "Auto" : parsed.DVDTitle.ToString();\r
+                QueryParser parsed = QueryParser.Parse(queue.LastEncode.Query);\r
 \r
-                if (Equals(parsed.DVDChapterStart, 0))\r
-                    lbl_chapt.Text = "Auto";\r
+                // Get title and chapters\r
+                string title = parsed.Title == 0 ? "Auto" : parsed.Title.ToString();\r
+                string chapterlbl;\r
+                if (Equals(parsed.ChapterStart, 0))\r
+                    chapterlbl = "Auto";\r
                 else\r
                 {\r
-                    string chapters = parsed.DVDChapterStart.ToString();\r
-                    if (parsed.DVDChapterFinish != 0)\r
-                        chapters = chapters + " - " + parsed.DVDChapterFinish;\r
-                    lbl_chapt.Text = chapters;\r
+                    string chapters = parsed.ChapterStart.ToString();\r
+                    if (parsed.ChapterFinish != 0)\r
+                        chapters = chapters + " - " + parsed.ChapterFinish;\r
+                    chapterlbl = chapters;\r
                 }\r
 \r
-                lbl_vEnc.Text = parsed.VideoEncoder;\r
-\r
-                // Display The Audio Track Information\r
+                // Get audio information\r
                 string audio = string.Empty;\r
-                foreach (Functions.AudioTrack track in parsed.AudioInformation)\r
+                foreach (AudioTrack track in parsed.AudioInformation)\r
                 {\r
-                    if (audio != "")\r
+                    if (audio != string.Empty) \r
                         audio += ", " + track.Encoder;\r
                     else\r
                         audio = track.Encoder;\r
                 }\r
-                lbl_aEnc.Text = audio;\r
-            }\r
+\r
+                // found query is a global varible        \r
+                lbl_encodeStatus.Text = "Encoding ...";\r
+                lbl_source.Text = queue.LastEncode.Source + "(Title: " + title + " Chapters: " + chapterlbl + ")";\r
+                lbl_dest.Text = queue.LastEncode.Destination;\r
+                lbl_encodeOptions.Text = "Video: " + parsed.VideoEncoder + " Audio: " + audio + Environment.NewLine +\r
+                                    "x264 Options: " + parsed.H264Query;\r
+               }\r
             catch (Exception)\r
             {\r
                 // Do Nothing\r
             }\r
         }\r
-        private void deleteSelectedItems()\r
-        {\r
-            // If there are selected items\r
-            if (list_queue.SelectedIndices.Count > 0)\r
-            {\r
-                // Save the selected indices to select them after the move\r
-                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
-                foreach (int selectedIndex in list_queue.SelectedIndices)\r
-                    selectedIndices.Add(selectedIndex);\r
-\r
-                int firstSelectedIndex = selectedIndices[0];\r
-\r
-                // Reverse the list to delete the items from last to first (preserves indices)\r
-                selectedIndices.Reverse();\r
-\r
-                // Remove each selected item\r
-                foreach (int selectedIndex in selectedIndices)\r
-                    queue.RemoveJob(selectedIndex);\r
-\r
-                updateUIElements();\r
-\r
-                // Select the item where the first deleted item was previously\r
-                if (firstSelectedIndex < list_queue.Items.Count)\r
-                    list_queue.Items[firstSelectedIndex].Selected = true;\r
-            }\r
 \r
-            list_queue.Select(); // Activate the control to show the selected items\r
-        }\r
+        /* Right Click Menu */\r
 \r
-        // Queue Management\r
-        private void mnu_up_Click(object sender, EventArgs e)\r
-        {\r
-            moveUp();\r
-        }\r
-        private void mnu_Down_Click(object sender, EventArgs e)\r
-        {\r
-            moveDown();\r
-        }\r
-        private void mnu_delete_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Handle the Move Up Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuUpClick(object sender, EventArgs e)\r
         {\r
-            deleteSelectedItems();\r
+            MoveUp();\r
         }\r
-        private void btn_up_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the Move down Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuDownClick(object sender, EventArgs e)\r
         {\r
-            moveUp();\r
+            MoveDown();\r
         }\r
-        private void btn_down_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Edit a job\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuEditClick(object sender, EventArgs e)\r
         {\r
-            moveDown();\r
+            if (list_queue.SelectedIndices != null && list_queue.SelectedIndices.Count != 0)\r
+            {\r
+                lock (queue)\r
+                {\r
+                    lock (list_queue)\r
+                    {\r
+                        int index = list_queue.SelectedIndices[0];\r
+                        mainWindow.RecievingJob(queue.GetJob(index));\r
+                        queue.Remove(index);\r
+                        RedrawQueue();\r
+                    }\r
+                }\r
+            }\r
         }\r
-        private void btn_delete_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Handle the delete Menu Item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuDeleteClick(object sender, EventArgs e)\r
         {\r
-            deleteSelectedItems();\r
+            DeleteSelectedItems();\r
         }\r
-        private void list_queue_deleteKey(object sender, KeyEventArgs e)\r
+\r
+        /* Keyboard Shortcuts */\r
+\r
+        /// <summary>\r
+        /// Handle the delete keyboard press\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void ListQueueDeleteKey(object sender, KeyEventArgs e)\r
         {\r
-            if (e.KeyCode == Keys.Delete)\r
-                deleteSelectedItems();\r
+            if (e.KeyCode == Keys.Delete && e.Modifiers == Keys.None)\r
+                DeleteSelectedItems();\r
         }\r
-        private void moveUp()\r
+\r
+        /* Queue Management */\r
+\r
+        /// <summary>\r
+        /// Move items up in the queue\r
+        /// </summary>\r
+        private void MoveUp()\r
         {\r
             // If there are selected items and the first item is not selected\r
             if (list_queue.SelectedIndices.Count > 0 && !list_queue.SelectedIndices.Contains(0))\r
@@ -311,8 +530,6 @@ namespace Handbrake
                 foreach (int selectedIndex in selectedIndices)\r
                     queue.MoveUp(selectedIndex);\r
 \r
-                updateUIElements();\r
-\r
                 // Keep the selected item(s) selected, now moved up one index\r
                 foreach (int selectedIndex in selectedIndices)\r
                     if (selectedIndex - 1 > -1) // Defensive programming: ensure index is good\r
@@ -321,7 +538,11 @@ namespace Handbrake
 \r
             list_queue.Select(); // Activate the control to show the selected items\r
         }\r
-        private void moveDown()\r
+\r
+        /// <summary>\r
+        /// Move items down in the queue\r
+        /// </summary>\r
+        private void MoveDown()\r
         {\r
             // If there are selected items and the last item is not selected\r
             if (list_queue.SelectedIndices.Count > 0 &&\r
@@ -339,8 +560,6 @@ namespace Handbrake
                 foreach (int selectedIndex in selectedIndices)\r
                     queue.MoveDown(selectedIndex);\r
 \r
-                updateUIElements();\r
-\r
                 // Keep the selected item(s) selected, now moved down one index\r
                 foreach (int selectedIndex in selectedIndices)\r
                     if (selectedIndex + 1 < list_queue.Items.Count) // Defensive programming: ensure index is good\r
@@ -350,41 +569,121 @@ namespace Handbrake
             list_queue.Select(); // Activate the control to show the selected items\r
         }\r
 \r
-        // Queue Import/Export Features\r
-        private void mnu_batch_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Delete the currently selected items on the queue\r
+        /// </summary>\r
+        private void DeleteSelectedItems()\r
         {\r
-            SaveFile.FileName = "";\r
+            // If there are selected items\r
+            if (list_queue.SelectedIndices.Count > 0)\r
+            {\r
+                // Save the selected indices to select them after the move\r
+                List<int> selectedIndices = new List<int>(list_queue.SelectedIndices.Count);\r
+                foreach (int selectedIndex in list_queue.SelectedIndices)\r
+                    selectedIndices.Add(selectedIndex);\r
+\r
+                int firstSelectedIndex = selectedIndices[0];\r
+\r
+                // Reverse the list to delete the items from last to first (preserves indices)\r
+                selectedIndices.Reverse();\r
+\r
+                // Remove each selected item\r
+                foreach (int selectedIndex in selectedIndices)\r
+                    queue.Remove(selectedIndex);\r
+\r
+                // Select the item where the first deleted item was previously\r
+                if (firstSelectedIndex < list_queue.Items.Count)\r
+                    list_queue.Items[firstSelectedIndex].Selected = true;\r
+            }\r
+\r
+            list_queue.Select(); // Activate the control to show the selected items\r
+        }\r
+\r
+        /* Queue Import / Export features */\r
+\r
+        /// <summary>\r
+        /// Create a batch script\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuBatchClick(object sender, EventArgs e)\r
+        {\r
+            SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "Batch|.bat";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
                 queue.WriteBatchScriptToFile(SaveFile.FileName);\r
         }\r
-        private void mnu_export_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Export Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuExportClick(object sender, EventArgs e)\r
         {\r
-            SaveFile.FileName = "";\r
+            SaveFile.FileName = string.Empty;\r
             SaveFile.Filter = "HandBrake Queue|*.queue";\r
             SaveFile.ShowDialog();\r
             if (SaveFile.FileName != String.Empty)\r
                 queue.WriteQueueStateToFile(SaveFile.FileName);\r
         }\r
-        private void mnu_import_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Import Queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuImportClick(object sender, EventArgs e)\r
         {\r
-            OpenFile.FileName = "";\r
+            OpenFile.FileName = string.Empty;\r
             OpenFile.ShowDialog();\r
             if (OpenFile.FileName != String.Empty)\r
                 queue.LoadQueueFromFile(OpenFile.FileName);\r
-            updateUIElements();\r
         }\r
-        private void mnu_readd_Click(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Readd current job to queue\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void MnuReaddClick(object sender, EventArgs e)\r
         {\r
-            if (!queue.LastEncode.IsEmpty)\r
+            if (queue.LastEncode != null && !queue.LastEncode.IsEmpty)\r
             {\r
-                queue.AddJob(queue.LastEncode.Query, queue.LastEncode.Source, queue.LastEncode.Destination, queue.LastEncode.CustomQuery);\r
-                updateUIElements();\r
+                queue.Add(\r
+                    queue.LastEncode.Query, \r
+                    queue.LastEncode.Title, \r
+                    queue.LastEncode.Source,\r
+                    queue.LastEncode.Destination,\r
+                    queue.LastEncode.CustomQuery);\r
             }\r
         }\r
 \r
-        // Hide's the window when the user tries to "x" out of the window instead of closing it.\r
+        /* Overrides */\r
+\r
+        /// <summary>\r
+        /// Hide's the window when the user tries to "x" out of the window instead of closing it.\r
+        /// </summary>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         protected override void OnClosing(CancelEventArgs e)\r
         {\r
             e.Cancel = true;\r
@@ -392,5 +691,20 @@ namespace Handbrake
             base.OnClosing(e);\r
         }\r
 \r
+        /// <summary>\r
+        /// Change the OnComplete option setting.\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The EventArgs.\r
+        /// </param>\r
+        private void CompleteOptionChanged(object sender, EventArgs e)\r
+        {\r
+            Properties.Settings.Default.CompletionOption = drp_completeOption.Text;\r
+            HandBrake.ApplicationServices.Init.CompletionOption = drp_completeOption.Text;\r
+            Properties.Settings.Default.Save();\r
+        }\r
     }\r
-}\r
+}
\ No newline at end of file
index d4befb1..90014fc 100644 (file)
   <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>114, 17</value>\r
   </metadata>\r
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <data name="toolStripButton1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+    <value>\r
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
+        YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIISURBVDhPpZP7S1NxGMbPPxKaXVUkMEq8IpKUCoY/hGgI\r
+        ymqkDYYXcCjDZOANURSjCNGFQUTsl4GXVMxKk62YU4fXQpaIlygHQxBRH8/zwvyaIAYe+HLgnPN8nue9\r
+        HA3nvDTq63oW/jm13XOwvPTB3DYFY5MH+bXfcN8ygfTSMSSXfESicQDxBqdYHwH29g9w2tnZ3UcguIvN\r
+        rR3417exuBJE5N1n/wfwLgXEOc38Bc6xNRHb+/y4nm49G0Bnit2zf9H6bkliE/jKuYxrd6oVgDWfjB+K\r
+        TWeKMyrGEVfowITvD9re/9ABVQrAhh0HHK+ZselMMaN/mvwtDb+aVqkA7HYIwIj3ysfluPTorJnP6Ezx\r
+        oHsD1s5ZXEktUwCOioB5f1CEPR9+wTG6iuiserTo8dkwng7HT/R+XUPF8xlcTjErAOdMcW6NW8STiwG8\r
+        7vej8oUPN/PsEv3t8Ao0TZP3T1u8uJRkUgAuSYHtO97oLxmXd5t9Ho8aPTK+GzntqNfrLm2fFoihwYOI\r
+        xGIF4KjoGBLzY1OrF9k6OOFxnwDC4wxIMX1G0pMhgVyMNyoA13PAtS7OrJk1PrC69LUdQWxuF6IybHrX\r
+        LRI7JrtZdoDAo1XmbjMyD+tjSXxGcXRmnYg5ttD9QuxDhN0uUgDOmbvNTpPOJaGAo2K36cyaGZvOFIfd\r
+        KlSA8/zRh9ABIDUG+1JpAAAAAElFTkSuQmCC\r
+</value>\r
+  </data>\r
   <metadata name="SaveFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>219, 17</value>\r
   </metadata>\r
   <metadata name="OpenFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>314, 17</value>\r
   </metadata>\r
-  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />\r
+  <metadata name="splitContainer1.Locked" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">\r
+    <value>True</value>\r
+  </metadata>\r
   <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
     <value>\r
         AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA\r
diff --git a/win/C#/interop/Converters.cs b/win/C#/interop/Converters.cs
new file mode 100644 (file)
index 0000000..e549199
--- /dev/null
@@ -0,0 +1,32 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public static class Converters\r
+    {\r
+        private static Dictionary<double, int> vrates = new Dictionary<double, int>\r
+        {\r
+            {5, 5400000},\r
+            {10, 2700000},\r
+            {12, 2250000},\r
+            {15, 1800000},\r
+            {23.976, 1126125},\r
+            {24, 1125000},\r
+            {25, 1080000},\r
+            {29.97, 900900}\r
+        };\r
+\r
+        public static int FramerateToVrate(double framerate)\r
+        {\r
+            if (!vrates.ContainsKey(framerate))\r
+            {\r
+                throw new ArgumentException("Framerate not recognized.", "framerate");\r
+            }\r
+\r
+            return vrates[framerate];\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/DisplayStringAttribute.cs b/win/C#/interop/DisplayStringAttribute.cs
new file mode 100644 (file)
index 0000000..3f7e62d
--- /dev/null
@@ -0,0 +1,29 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    [AttributeUsage(AttributeTargets.Field)]\r
+    public sealed class DisplayStringAttribute : Attribute\r
+    {\r
+        private readonly string value;\r
+\r
+        public string Value\r
+        {\r
+            get { return value; }\r
+        }\r
+\r
+        public string ResourceKey { get; set; }\r
+\r
+        public DisplayStringAttribute(string v)\r
+        {\r
+            this.value = v;\r
+        }\r
+\r
+        public DisplayStringAttribute()\r
+        {\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/EncodeCompletedEventArgs.cs b/win/C#/interop/EncodeCompletedEventArgs.cs
new file mode 100644 (file)
index 0000000..a96afa2
--- /dev/null
@@ -0,0 +1,12 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class EncodeCompletedEventArgs : EventArgs\r
+    {\r
+        public bool Error { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/EncodeProgressEventArgs.cs b/win/C#/interop/EncodeProgressEventArgs.cs
new file mode 100644 (file)
index 0000000..7f08595
--- /dev/null
@@ -0,0 +1,16 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class EncodeProgressEventArgs : EventArgs\r
+    {\r
+        public float FractionComplete { get; set; }\r
+        public float CurrentFrameRate { get; set; }\r
+        public float AverageFrameRate { get; set; }\r
+        public TimeSpan EstimatedTimeLeft { get; set; }\r
+        public int Pass { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/HandBrakeInstance.cs b/win/C#/interop/HandBrakeInstance.cs
new file mode 100644 (file)
index 0000000..38c4c92
--- /dev/null
@@ -0,0 +1,1168 @@
+namespace HandBrake.Interop\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.IO;\r
+    using System.Linq;\r
+    using System.Runtime.InteropServices;\r
+    using System.Text;\r
+    using System.Timers;\r
+    using System.Threading;\r
+    using System.Windows.Media.Imaging;\r
+    using HandBrake.SourceData;\r
+    using HandBrake.Interop;\r
+\r
+    /// <summary>\r
+    /// A wrapper for a HandBrake instance.\r
+    /// </summary>\r
+    public class HandBrakeInstance : IDisposable\r
+    {\r
+        /// <summary>\r
+        /// The number of MS between status polls when scanning.\r
+        /// </summary>\r
+        private const double ScanPollIntervalMs = 200;\r
+\r
+        /// <summary>\r
+        /// The number of MS between status polls when encoding.\r
+        /// </summary>\r
+        private const double EncodePollIntervalMs = 200;\r
+\r
+        /// <summary>\r
+        /// X264 options to add for a turbo first pass.\r
+        /// </summary>\r
+        private const string TurboX264Opts = "ref=1:subme=2:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0:weightb=0";\r
+\r
+        /// <summary>\r
+        /// The native handle to the HandBrake instance.\r
+        /// </summary>\r
+        private IntPtr hbHandle;\r
+\r
+        /// <summary>\r
+        /// The timer to poll for scan status.\r
+        /// </summary>\r
+        private System.Timers.Timer scanPollTimer;\r
+\r
+        /// <summary>\r
+        /// The timer to poll for encode status.\r
+        /// </summary>\r
+        private System.Timers.Timer encodePollTimer;\r
+\r
+        /// <summary>\r
+        /// The list of original titles in native structure form.\r
+        /// </summary>\r
+        private List<hb_title_s> originalTitles;\r
+\r
+        /// <summary>\r
+        /// The list of titles on this instance.\r
+        /// </summary>\r
+        private List<Title> titles;\r
+\r
+        /// <summary>\r
+        /// The index of the default title.\r
+        /// </summary>\r
+        private int featureTitle;\r
+\r
+        /// <summary>\r
+        /// A list of native memory locations allocated by this instance.\r
+        /// </summary>\r
+        private List<IntPtr> encodeAllocatedMemory;\r
+\r
+        /// <summary>\r
+        /// The callback for log messages from HandBrake.\r
+        /// </summary>\r
+        private static LoggingCallback loggingCallback;\r
+\r
+        /// <summary>\r
+        /// The callback for error messages from HandBrake.\r
+        /// </summary>\r
+        private static LoggingCallback errorCallback;\r
+\r
+        /// <summary>\r
+        /// Fires for progress updates when scanning.\r
+        /// </summary>\r
+        public event EventHandler<ScanProgressEventArgs> ScanProgress;\r
+\r
+        /// <summary>\r
+        /// Fires when a scan has completed.\r
+        /// </summary>\r
+        public event EventHandler<EventArgs> ScanCompleted;\r
+\r
+        /// <summary>\r
+        /// Fires for progress updates when encoding.\r
+        /// </summary>\r
+        public event EventHandler<EncodeProgressEventArgs> EncodeProgress;\r
+\r
+        /// <summary>\r
+        /// Fires when an encode has completed.\r
+        /// </summary>\r
+        public event EventHandler<EncodeCompletedEventArgs> EncodeCompleted;\r
+\r
+        /// <summary>\r
+        /// Fires when HandBrake has logged a message.\r
+        /// </summary>\r
+        public static event EventHandler<MessageLoggedEventArgs> MessageLogged;\r
+\r
+        /// <summary>\r
+        /// Fires when HandBrake has logged an error.\r
+        /// </summary>\r
+        public static event EventHandler<MessageLoggedEventArgs> ErrorLogged;\r
+\r
+        /// <summary>\r
+        /// Destructor.\r
+        /// </summary>\r
+        ~HandBrakeInstance()\r
+        {\r
+            this.Dispose(false);\r
+        }\r
+\r
+        /// <summary>\r
+        /// The list of titles on this instance.\r
+        /// </summary>\r
+        public List<Title> Titles\r
+        {\r
+            get\r
+            {\r
+                return this.titles;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the index of the default title.\r
+        /// </summary>\r
+        public int FeatureTitle\r
+        {\r
+            get\r
+            {\r
+                return this.featureTitle;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Initializes this instance.\r
+        /// </summary>\r
+        /// <param name="verbosity"></param>\r
+        public void Initialize(int verbosity)\r
+        {\r
+            // Register the logger if we have not already\r
+            if (loggingCallback == null)\r
+            {\r
+                // Keep the callback as a member to prevent it from being garbage collected.\r
+                loggingCallback = new LoggingCallback(HandBrakeInstance.LoggingHandler);\r
+                errorCallback = new LoggingCallback(HandBrakeInstance.ErrorHandler);\r
+                HbLib.hb_register_logger(loggingCallback);\r
+                HbLib.hb_register_error_handler(errorCallback);\r
+            }\r
+\r
+            this.hbHandle = HbLib.hb_init(verbosity, update_check: 0);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handles log messages from HandBrake.\r
+        /// </summary>\r
+        /// <param name="message">The log message (including newline).</param>\r
+        public static void LoggingHandler(string message)\r
+        {\r
+            if (!string.IsNullOrEmpty(message))\r
+            {\r
+                string[] messageParts = message.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);\r
+\r
+                if (messageParts.Length > 0)\r
+                {\r
+                    if (MessageLogged != null)\r
+                    {\r
+                        MessageLogged(null, new MessageLoggedEventArgs { Message = messageParts[0] });\r
+                    }\r
+\r
+                    System.Diagnostics.Debug.WriteLine(messageParts[0]);\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Handles errors from HandBrake.\r
+        /// </summary>\r
+        /// <param name="message">The error message.</param>\r
+        public static void ErrorHandler(string message)\r
+        {\r
+            if (!string.IsNullOrEmpty(message))\r
+            {\r
+                if (ErrorLogged != null)\r
+                {\r
+                    ErrorLogged(null, new MessageLoggedEventArgs { Message = message });\r
+                }\r
+\r
+                System.Diagnostics.Debug.WriteLine("ERROR: " + message);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Starts scanning the given path.\r
+        /// </summary>\r
+        /// <param name="path">The path to the video to scan.</param>\r
+        /// <param name="previewCount">The number of preview images to make.</param>\r
+        public void StartScan(string path, int previewCount)\r
+        {\r
+            this.StartScan(path, previewCount, 0);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Starts a scan of the given path.\r
+        /// </summary>\r
+        /// <param name="path">The path of the video to scan.</param>\r
+        /// <param name="previewCount">The number of previews to make on each title.</param>\r
+        /// <param name="titleIndex">The title index to scan (1-based, 0 for all titles).</param>\r
+        public void StartScan(string path, int previewCount, int titleIndex)\r
+        {\r
+            HbLib.hb_scan(hbHandle, path, titleIndex, previewCount, 1);\r
+            this.scanPollTimer = new System.Timers.Timer();\r
+            this.scanPollTimer.Interval = ScanPollIntervalMs;\r
+\r
+            // Lambda notation used to make sure we can view any JIT exceptions the method throws\r
+            this.scanPollTimer.Elapsed += (o, e) =>\r
+            {\r
+                this.PollScanProgress();\r
+            };\r
+            this.scanPollTimer.Start();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets an image for the given job and preview\r
+        /// </summary>\r
+        /// <remarks>\r
+        /// Only incorporates sizing and aspect ratio into preview image.\r
+        /// </remarks>\r
+        /// <param name="job">The encode job to preview.</param>\r
+        /// <param name="previewNumber">The index of the preview to get (0-based).</param>\r
+        /// <returns>An image with the requested preview.</returns>\r
+        public BitmapImage GetPreview(EncodeJob job, int previewNumber)\r
+        {\r
+            hb_title_s title = this.GetOriginalTitle(job.Title);\r
+\r
+            hb_job_s nativeJob = InteropUtilities.ReadStructure<hb_job_s>(title.job);\r
+            List<IntPtr> allocatedMemory = this.ApplyJob(ref nativeJob, job, false, 0, 0);\r
+            \r
+            // Create a new job pointer from our modified job object\r
+            IntPtr newJob = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(hb_job_s)));\r
+            Marshal.StructureToPtr(nativeJob, newJob, false);\r
+            allocatedMemory.Add(newJob);\r
+\r
+            int outputWidth = nativeJob.width;\r
+            int outputHeight = nativeJob.height;\r
+            int imageBufferSize = outputWidth * outputHeight * 4;\r
+            IntPtr nativeBuffer = Marshal.AllocHGlobal(imageBufferSize);\r
+            allocatedMemory.Add(nativeBuffer);\r
+            HbLib.hb_set_job(this.hbHandle, job.Title, ref nativeJob);\r
+            HbLib.hb_get_preview_by_index(this.hbHandle, job.Title, previewNumber, nativeBuffer);\r
+\r
+            // Copy the filled image buffer to a managed array.\r
+            byte[] managedBuffer = new byte[imageBufferSize];\r
+            Marshal.Copy(nativeBuffer, managedBuffer, 0, imageBufferSize);\r
+\r
+            InteropUtilities.FreeMemory(allocatedMemory);\r
+\r
+            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outputWidth, outputHeight);\r
+            System.Drawing.Imaging.BitmapData bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, outputWidth, outputHeight), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);\r
+\r
+            IntPtr ptr = bitmapData.Scan0;\r
+\r
+            for (int i = 0; i < nativeJob.height; i++)\r
+            {\r
+                Marshal.Copy(managedBuffer, i * nativeJob.width * 4, ptr, nativeJob.width * 4);\r
+                ptr = IntPtr.Add(ptr, bitmapData.Stride);\r
+            }\r
+\r
+            bitmap.UnlockBits(bitmapData);\r
+            //bitmap.Save(@"d:\docs\test_" + previewNumber + ".png", System.Drawing.Imaging.ImageFormat.Png);\r
+\r
+            using (MemoryStream memoryStream = new MemoryStream())\r
+            {\r
+                bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Bmp);\r
+                bitmap.Dispose();\r
+\r
+                BitmapImage wpfBitmap = new BitmapImage();\r
+                wpfBitmap.BeginInit();\r
+                wpfBitmap.CacheOption = BitmapCacheOption.OnLoad;\r
+                wpfBitmap.StreamSource = memoryStream;\r
+                wpfBitmap.EndInit();\r
+\r
+                return wpfBitmap;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Starts an encode with the given job.\r
+        /// </summary>\r
+        /// <param name="job">The job to start.</param>\r
+        public void StartEncode(EncodeJob job)\r
+        {\r
+            this.StartEncode(job, false, 0, 0);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Starts an encode with the given job.\r
+        /// </summary>\r
+        /// <param name="job">The job to start.</param>\r
+        /// <param name="preview">True if this is a preview encode.</param>\r
+        /// <param name="previewNumber">The preview number to start the encode at (0-based).</param>\r
+        /// <param name="previewSeconds">The number of seconds in the preview.</param>\r
+        public void StartEncode(EncodeJob job, bool preview, int previewNumber, int previewSeconds)\r
+        {\r
+            hb_job_s nativeJob = InteropUtilities.ReadStructure<hb_job_s>(this.GetOriginalTitle(job.Title).job);\r
+            this.encodeAllocatedMemory = this.ApplyJob(ref nativeJob, job, preview, previewNumber, previewSeconds);\r
+\r
+            if (!preview && job.EncodingProfile.IncludeChapterMarkers)\r
+            {\r
+                Title title = this.GetTitle(job.Title);\r
+                int numChapters = title.Chapters.Count;\r
+\r
+                if (job.UseDefaultChapterNames)\r
+                {\r
+                    for (int i = 0; i < numChapters; i++)\r
+                    {\r
+                        HbLib.hb_set_chapter_name(this.hbHandle, job.Title, i + 1, "Chapter " + (i + 1));\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    for (int i = 0; i < numChapters; i++)\r
+                    {\r
+                        HbLib.hb_set_chapter_name(this.hbHandle, job.Title, i + 1, job.CustomChapterNames[i]);\r
+                    }\r
+                }\r
+            }\r
+\r
+            HbLib.hb_add(this.hbHandle, ref nativeJob);\r
+\r
+            if (job.EncodingProfile.TwoPass)\r
+            {\r
+                nativeJob.pass = 2;\r
+\r
+                string x264Opts = job.EncodingProfile.X264Options ?? string.Empty;\r
+                nativeJob.x264opts = Marshal.StringToHGlobalAnsi(x264Opts);\r
+                this.encodeAllocatedMemory.Add(nativeJob.x264opts);\r
+\r
+                HbLib.hb_add(this.hbHandle, ref nativeJob);\r
+            }\r
+\r
+            HbLib.hb_start(this.hbHandle);\r
+\r
+            this.encodePollTimer = new System.Timers.Timer();\r
+            this.encodePollTimer.Interval = EncodePollIntervalMs;\r
+\r
+            this.encodePollTimer.Elapsed += (o, e) =>\r
+            {\r
+                this.PollEncodeProgress();\r
+            };\r
+            this.encodePollTimer.Start();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Pauses the current encode.\r
+        /// </summary>\r
+        public void PauseEncode()\r
+        {\r
+            HbLib.hb_pause(this.hbHandle);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Resumes a paused encode.\r
+        /// </summary>\r
+        public void ResumeEncode()\r
+        {\r
+            HbLib.hb_resume(this.hbHandle);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Stops the current encode.\r
+        /// </summary>\r
+        public void StopEncode()\r
+        {\r
+            HbLib.hb_stop(this.hbHandle);\r
+\r
+            // Also remove all jobs from the queue (in case we stopped a 2-pass encode)\r
+            var currentJobs = new List<IntPtr>();\r
+\r
+            int jobs = HbLib.hb_count(this.hbHandle);\r
+            for (int i = 0; i < jobs; i++)\r
+            {\r
+                currentJobs.Add(HbLib.hb_job(this.hbHandle, 0));\r
+            }\r
+\r
+            foreach (IntPtr job in currentJobs)\r
+            {\r
+                HbLib.hb_rem(this.hbHandle, job);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the final size when using Anamorphic for a given encode job.\r
+        /// </summary>\r
+        /// <param name="job">The encode job to use.</param>\r
+        /// <param name="width">The storage width.</param>\r
+        /// <param name="height">The storage height.</param>\r
+        /// <param name="parWidth">The pixel aspect X number.</param>\r
+        /// <param name="parHeight">The pixel aspect Y number.</param>\r
+        public void GetAnamorphicSize(EncodeJob job, out int width, out int height, out int parWidth, out int parHeight)\r
+        {\r
+            hb_job_s nativeJob = InteropUtilities.ReadStructure<hb_job_s>(this.GetOriginalTitle(job.Title).job);\r
+            List<IntPtr> allocatedMemory = this.ApplyJob(ref nativeJob, job, false, 0, 0);\r
+\r
+            int refWidth = 0;\r
+            int refHeight = 0;\r
+            int refParWidth = 0;\r
+            int refParHeight = 0;\r
+            HbLib.hb_set_job(this.hbHandle, job.Title, ref nativeJob);\r
+            HbLib.hb_set_anamorphic_size_by_index(this.hbHandle, job.Title, ref refWidth, ref refHeight, ref refParWidth, ref refParHeight);\r
+            //HbLib.hb_set_anamorphic_size(ref nativeJob, ref refWidth, ref refHeight, ref refParWidth, ref refParHeight);\r
+            InteropUtilities.FreeMemory(allocatedMemory);\r
+\r
+            width = refWidth;\r
+            height = refHeight;\r
+            parWidth = refParWidth;\r
+            parHeight = refParHeight;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Frees any resources associated with this object.\r
+        /// </summary>\r
+        public void Dispose()\r
+        {\r
+            this.Dispose(true);\r
+            GC.SuppressFinalize(this);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Call before app shutdown. Performs global cleanup.\r
+        /// </summary>\r
+        public static void DisposeGlobal()\r
+        {\r
+            HbLib.hb_global_close();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Frees any resources associated with this object.\r
+        /// </summary>\r
+        /// <param name="disposing">True if managed objects as well as unmanaged should be disposed.</param>\r
+        protected virtual void Dispose(bool disposing)\r
+        {\r
+            if (disposing)\r
+            {\r
+                // Free other state (managed objects).\r
+            }\r
+\r
+            // Free unmanaged objects.\r
+            IntPtr handlePtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));\r
+            Marshal.WriteIntPtr(handlePtr, this.hbHandle);\r
+            HbLib.hb_close(handlePtr);\r
+            Marshal.FreeHGlobal(handlePtr);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Checks the status of the ongoing scan.\r
+        /// </summary>\r
+        private void PollScanProgress()\r
+        {\r
+            hb_state_s state = new hb_state_s();\r
+            HbLib.hb_get_state(this.hbHandle, ref state);\r
+\r
+            if (state.state == NativeConstants.HB_STATE_SCANNING)\r
+            {\r
+                if (this.ScanProgress != null)\r
+                {\r
+                    int currentTitle = state.param.scanning.title_cur;\r
+                    int totalTitles = state.param.scanning.title_count;\r
+                    this.ScanProgress(this, new ScanProgressEventArgs { CurrentTitle = currentTitle, Titles = totalTitles });\r
+                }\r
+            }\r
+            else if (state.state == NativeConstants.HB_STATE_SCANDONE)\r
+            {\r
+                this.titles = new List<Title>();\r
+\r
+                IntPtr listPtr = HbLib.hb_get_titles(this.hbHandle);\r
+                this.originalTitles = InteropUtilities.ConvertList<hb_title_s>(listPtr);\r
+\r
+                foreach (hb_title_s title in this.originalTitles)\r
+                {\r
+                    var newTitle = this.ConvertTitle(title);\r
+                    this.titles.Add(newTitle);\r
+                }\r
+\r
+                if (this.originalTitles.Count > 0)\r
+                {\r
+                    hb_job_s nativeJob = InteropUtilities.ReadStructure<hb_job_s>(this.originalTitles[0].job);\r
+                    this.featureTitle = nativeJob.feature;\r
+                }\r
+                else\r
+                {\r
+                    this.featureTitle = 0;\r
+                }\r
+\r
+                this.scanPollTimer.Stop();\r
+\r
+                if (this.ScanCompleted != null)\r
+                {\r
+                    this.ScanCompleted(this, new EventArgs());\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Checks the status of the ongoing encode.\r
+        /// </summary>\r
+        private void PollEncodeProgress()\r
+        {\r
+            hb_state_s state = new hb_state_s();\r
+            HbLib.hb_get_state(this.hbHandle, ref state);\r
+\r
+            if (state.state == NativeConstants.HB_STATE_WORKING)\r
+            {\r
+                if (this.EncodeProgress != null)\r
+                {\r
+                    var progressEventArgs = new EncodeProgressEventArgs\r
+                    {\r
+                        FractionComplete = state.param.working.progress,\r
+                        CurrentFrameRate = state.param.working.rate_cur,\r
+                        AverageFrameRate = state.param.working.rate_avg,\r
+                        EstimatedTimeLeft = new TimeSpan(state.param.working.hours, state.param.working.minutes, state.param.working.seconds),\r
+                        Pass = state.param.working.job_cur\r
+                    };\r
+\r
+                    this.EncodeProgress(this, progressEventArgs);\r
+                }\r
+            }\r
+            else if (state.state == NativeConstants.HB_STATE_MUXING)\r
+            {\r
+                //System.Diagnostics.Debug.WriteLine("Muxing...");\r
+            }\r
+            else if (state.state == NativeConstants.HB_STATE_WORKDONE)\r
+            {\r
+                InteropUtilities.FreeMemory(this.encodeAllocatedMemory);\r
+                this.encodePollTimer.Stop();\r
+\r
+                if (this.EncodeCompleted != null)\r
+                {\r
+                    this.EncodeCompleted(this, new EncodeCompletedEventArgs { Error = state.param.workdone.error > 0 });\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Applies the encoding job to the native memory structure and returns a list of memory\r
+        /// locations allocated during this.\r
+        /// </summary>\r
+        /// <param name="nativeJob">The native structure to apply to job info to.</param>\r
+        /// <param name="job">The job info to apply.</param>\r
+        /// <param name="preview">True if this is a preview encode.</param>\r
+        /// <param name="previewNumber">The preview number (0-based) to encode.</param>\r
+        /// <param name="previewSeconds">The number of seconds in the preview.</param>\r
+        /// <returns>The list of memory locations allocated for the job.</returns>\r
+        private List<IntPtr> ApplyJob(ref hb_job_s nativeJob, EncodeJob job, bool preview, int previewNumber, int previewSeconds)\r
+        {\r
+            var allocatedMemory = new List<IntPtr>();\r
+            Title title = this.GetTitle(job.Title);\r
+            hb_title_s originalTitle = this.GetOriginalTitle(job.Title);\r
+\r
+            EncodingProfile profile = job.EncodingProfile;\r
+\r
+            if (preview)\r
+            {\r
+                nativeJob.start_at_preview = previewNumber + 1;\r
+                nativeJob.seek_points = 10;\r
+\r
+                // There are 90,000 PTS per second.\r
+                nativeJob.pts_to_stop = previewSeconds * 90000;\r
+            }\r
+            else if (job.ChapterStart > 0 && job.ChapterEnd > 0)\r
+            {\r
+                nativeJob.chapter_start = job.ChapterStart;\r
+                nativeJob.chapter_end = job.ChapterEnd;\r
+            }\r
+            else\r
+            {\r
+                nativeJob.chapter_start = 1;\r
+                nativeJob.chapter_end = title.Chapters.Count;\r
+            }\r
+\r
+            nativeJob.chapter_markers = profile.IncludeChapterMarkers ? 1 : 0;\r
+\r
+            Cropping crop;\r
+\r
+            if (profile.CustomCropping)\r
+            {\r
+                crop = profile.Cropping;\r
+            }\r
+            else\r
+            {\r
+                crop = title.AutoCropDimensions;\r
+            }\r
+\r
+            nativeJob.crop[0] = crop.Top;\r
+            nativeJob.crop[1] = crop.Bottom;\r
+            nativeJob.crop[2] = crop.Left;\r
+            nativeJob.crop[3] = crop.Right;\r
+\r
+            List<IntPtr> filterList = new List<IntPtr>();\r
+            if (profile.Deinterlace != Deinterlace.Off)\r
+            {\r
+                nativeJob.deinterlace = 1;\r
+                string settings = null;\r
+\r
+                switch (profile.Deinterlace)\r
+                {\r
+                    case Deinterlace.Fast:\r
+                        settings = "-1";\r
+                        break;\r
+                    case Deinterlace.Slow:\r
+                        settings = "2";\r
+                        break;\r
+                    case Deinterlace.Slower:\r
+                        settings = "0";\r
+                        break;\r
+                    case Deinterlace.Custom:\r
+                        settings = profile.CustomDeinterlace;\r
+                        break;\r
+                    default:\r
+                        break;\r
+                }\r
+\r
+                this.AddFilter(filterList, NativeConstants.HB_FILTER_DEINTERLACE, settings, allocatedMemory);\r
+            }\r
+            else\r
+            {\r
+                nativeJob.deinterlace = 0;\r
+            }\r
+\r
+            if (profile.Detelecine != Detelecine.Off)\r
+            {\r
+                string settings = null;\r
+                if (profile.Detelecine == Detelecine.Custom)\r
+                {\r
+                    settings = profile.CustomDetelecine;\r
+                }\r
+\r
+                this.AddFilter(filterList, NativeConstants.HB_FILTER_DETELECINE, settings, allocatedMemory);\r
+            }\r
+\r
+            if (profile.Decomb != Decomb.Off)\r
+            {\r
+                string settings = null;\r
+                if (profile.Decomb == Decomb.Custom)\r
+                {\r
+                    settings = profile.CustomDecomb;\r
+                }\r
+\r
+                this.AddFilter(filterList, NativeConstants.HB_FILTER_DECOMB, settings, allocatedMemory);\r
+            }\r
+\r
+            if (profile.Deblock > 0)\r
+            {\r
+                this.AddFilter(filterList, NativeConstants.HB_FILTER_DEBLOCK, profile.Deblock.ToString(), allocatedMemory);\r
+            }\r
+\r
+            if (profile.Denoise != Denoise.Off)\r
+            {\r
+                string settings = null;\r
+                switch (profile.Denoise)\r
+                {\r
+                    case Denoise.Weak:\r
+                        settings = "2:1:2:3";\r
+                        break;\r
+                    case Denoise.Medium:\r
+                        settings = "3:2:2:3";\r
+                        break;\r
+                    case Denoise.Strong:\r
+                        settings = "7:7:5:5";\r
+                        break;\r
+                    case Denoise.Custom:\r
+                        settings = profile.CustomDenoise;\r
+                        break;\r
+                    default:\r
+                        break;\r
+                }\r
+\r
+                this.AddFilter(filterList, NativeConstants.HB_FILTER_DENOISE, settings, allocatedMemory);\r
+            }\r
+\r
+            NativeList filterListNative = InteropUtilities.CreateIntPtrList(filterList);\r
+            nativeJob.filters = filterListNative.ListPtr;\r
+            allocatedMemory.AddRange(filterListNative.AllocatedMemory);\r
+\r
+            int width = profile.Width;\r
+            int height = profile.Height;\r
+\r
+            if (width == 0)\r
+            {\r
+                width = title.Resolution.Width;\r
+            }\r
+\r
+            if (profile.MaxWidth > 0 && width > profile.MaxWidth)\r
+            {\r
+                width = profile.MaxWidth;\r
+            }\r
+\r
+            if (height == 0)\r
+            {\r
+                height = title.Resolution.Height;\r
+            }\r
+\r
+            if (profile.MaxHeight > 0 && height > profile.MaxHeight)\r
+            {\r
+                height = profile.MaxHeight;\r
+            }\r
+\r
+            nativeJob.grayscale = profile.Grayscale ? 1 : 0;\r
+\r
+            switch (profile.Anamorphic)\r
+            {\r
+                case Anamorphic.None:\r
+                    nativeJob.anamorphic.mode = 0;\r
+\r
+                    if (profile.KeepDisplayAspect)\r
+                    {\r
+                        if (profile.Width == 0 && profile.Height == 0 || profile.Width == 0)\r
+                        {\r
+                            width = (int)((double)height * this.GetTitle(job.Title).AspectRatio);\r
+                        }\r
+                        else if (profile.Height == 0)\r
+                        {\r
+                            height = (int)((double)width / this.GetTitle(job.Title).AspectRatio);\r
+                        }\r
+                    }\r
+\r
+                    nativeJob.anamorphic.keep_display_aspect = profile.KeepDisplayAspect ? 1 : 0;\r
+                    break;\r
+                case Anamorphic.Strict:\r
+                    nativeJob.anamorphic.mode = 1;\r
+                    break;\r
+                case Anamorphic.Loose:\r
+                    nativeJob.anamorphic.mode = 2;\r
+                    break;\r
+                case Anamorphic.Custom:\r
+                    nativeJob.anamorphic.mode = 3;\r
+\r
+                    nativeJob.modulus = profile.Modulus;\r
+\r
+                    if (profile.UseDisplayWidth)\r
+                    {\r
+                        if (profile.KeepDisplayAspect)\r
+                        {\r
+                            height = (int)((double)profile.DisplayWidth / this.GetTitle(job.Title).AspectRatio);\r
+                        }\r
+\r
+                        nativeJob.anamorphic.dar_width = profile.DisplayWidth;\r
+                        nativeJob.anamorphic.dar_height = height;\r
+                        nativeJob.anamorphic.keep_display_aspect = profile.KeepDisplayAspect ? 1 : 0;\r
+                    }\r
+                    else\r
+                    {\r
+                        nativeJob.anamorphic.par_width = profile.PixelAspectX;\r
+                        nativeJob.anamorphic.par_height = profile.PixelAspectY;\r
+                        nativeJob.anamorphic.keep_display_aspect = 0;\r
+                    }\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+\r
+            nativeJob.width = width;\r
+            nativeJob.height = height;\r
+\r
+            nativeJob.maxWidth = profile.MaxWidth;\r
+            nativeJob.maxHeight = profile.MaxHeight;\r
+\r
+            switch (profile.VideoEncoder)\r
+            {\r
+                case VideoEncoder.X264:\r
+                    nativeJob.vcodec = NativeConstants.HB_VCODEC_X264;\r
+                    break;\r
+                case VideoEncoder.Theora:\r
+                    nativeJob.vcodec = NativeConstants.HB_VCODEC_THEORA;\r
+                    break;\r
+                case VideoEncoder.FFMpeg:\r
+                    nativeJob.vcodec = NativeConstants.HB_VCODEC_FFMPEG;\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+\r
+            if (profile.Framerate == 0)\r
+            {\r
+                nativeJob.cfr = 0;\r
+            }\r
+            else\r
+            {\r
+                if (profile.PeakFramerate)\r
+                {\r
+                    nativeJob.cfr = 2;\r
+                }\r
+                else\r
+                {\r
+                    nativeJob.cfr = 1;\r
+                }\r
+\r
+                nativeJob.vrate = 27000000;\r
+                nativeJob.vrate_base = Converters.FramerateToVrate(profile.Framerate);\r
+            }\r
+\r
+            // vfr\r
+            // areBframes\r
+            // color_matrix\r
+            List<hb_audio_s> titleAudio = InteropUtilities.ConvertList<hb_audio_s>(originalTitle.list_audio);\r
+            \r
+            List<hb_audio_s> audioList = new List<hb_audio_s>();\r
+            int numTracks = 0;\r
+            foreach (AudioEncoding encoding in profile.AudioEncodings)\r
+            {\r
+                if (encoding.InputNumber == 0)\r
+                {\r
+                    // Add this encoding for all chosen tracks\r
+                    foreach (int chosenTrack in job.ChosenAudioTracks)\r
+                    {\r
+                        if (titleAudio.Count >= chosenTrack)\r
+                        {\r
+                            audioList.Add(ConvertAudioBack(encoding, titleAudio[chosenTrack - 1], chosenTrack, numTracks++));\r
+                        }\r
+                    }\r
+                }\r
+                else if (encoding.InputNumber <= job.ChosenAudioTracks.Count)\r
+                {\r
+                    // Add this encoding for the specified track, if it exists\r
+                    int trackNumber = job.ChosenAudioTracks[encoding.InputNumber - 1];\r
+                    audioList.Add(ConvertAudioBack(encoding, titleAudio[trackNumber - 1], trackNumber, numTracks++));\r
+                }\r
+            }\r
+\r
+            NativeList nativeAudioList = InteropUtilities.ConvertListBack<hb_audio_s>(audioList);\r
+            nativeJob.list_audio = nativeAudioList.ListPtr;\r
+            allocatedMemory.AddRange(nativeAudioList.AllocatedMemory);\r
+\r
+            List<hb_subtitle_s> subtitleList = new List<hb_subtitle_s>();\r
+\r
+            if (job.Subtitles != null)\r
+            {\r
+                if (job.Subtitles.SourceSubtitles != null && job.Subtitles.SourceSubtitles.Count > 0)\r
+                {\r
+                    List<hb_subtitle_s> titleSubtitles = InteropUtilities.ConvertList<hb_subtitle_s>(originalTitle.list_subtitle);\r
+\r
+                    foreach (SourceSubtitle sourceSubtitle in job.Subtitles.SourceSubtitles)\r
+                    {\r
+                        if (sourceSubtitle.TrackNumber == 0)\r
+                        {\r
+                            // Use subtitle search.\r
+                            nativeJob.select_subtitle_config.force = sourceSubtitle.Forced ? 1 : 0;\r
+                            nativeJob.select_subtitle_config.default_track = sourceSubtitle.Default ? 1 : 0;\r
+\r
+                            if (!sourceSubtitle.BurnedIn && profile.OutputFormat == OutputFormat.Mkv)\r
+                            {\r
+                                nativeJob.select_subtitle_config.dest = hb_subtitle_config_s_subdest.PASSTHRUSUB;\r
+                            }\r
+\r
+                            nativeJob.indepth_scan = 1;\r
+                        }\r
+                        else\r
+                        {\r
+                            // Use specified subtitle.\r
+                            hb_subtitle_s nativeSubtitle = titleSubtitles[sourceSubtitle.TrackNumber - 1];\r
+                            nativeSubtitle.config.force = sourceSubtitle.Forced ? 1 : 0;\r
+                            nativeSubtitle.config.default_track = sourceSubtitle.Default ? 1 : 0;\r
+\r
+                            if (!sourceSubtitle.BurnedIn && profile.OutputFormat == OutputFormat.Mkv && nativeSubtitle.format == hb_subtitle_s_subtype.PICTURESUB)\r
+                            {\r
+                                nativeSubtitle.config.dest = hb_subtitle_config_s_subdest.PASSTHRUSUB;\r
+                            }\r
+\r
+                            subtitleList.Add(nativeSubtitle);\r
+                        }\r
+                    }\r
+                }\r
+\r
+                if (job.Subtitles.SrtSubtitles != null)\r
+                {\r
+                    foreach (SrtSubtitle srtSubtitle in job.Subtitles.SrtSubtitles)\r
+                    {\r
+                        hb_subtitle_s nativeSubtitle = new hb_subtitle_s();\r
+                        nativeSubtitle.id = subtitleList.Count << 8 | 0xFF;\r
+                        nativeSubtitle.iso639_2 = srtSubtitle.LanguageCode;\r
+                        nativeSubtitle.lang = LanguageCodes.Decode(srtSubtitle.LanguageCode);\r
+                        nativeSubtitle.source = hb_subtitle_s_subsource.SRTSUB;\r
+                        nativeSubtitle.format = hb_subtitle_s_subtype.TEXTSUB;\r
+\r
+                        nativeSubtitle.config.src_codeset = srtSubtitle.CharacterCode;\r
+                        nativeSubtitle.config.src_filename = srtSubtitle.FileName;\r
+                        nativeSubtitle.config.offset = srtSubtitle.Offset;\r
+                        nativeSubtitle.config.dest = hb_subtitle_config_s_subdest.PASSTHRUSUB;\r
+                        nativeSubtitle.config.default_track = srtSubtitle.Default ? 1 : 0;\r
+\r
+                        subtitleList.Add(nativeSubtitle);\r
+                    }\r
+                }\r
+            }\r
+\r
+            NativeList nativeSubtitleList = InteropUtilities.ConvertListBack<hb_subtitle_s>(subtitleList);\r
+            nativeJob.list_subtitle = nativeSubtitleList.ListPtr;\r
+            allocatedMemory.AddRange(nativeSubtitleList.AllocatedMemory);\r
+\r
+            if (profile.OutputFormat == OutputFormat.Mp4)\r
+            {\r
+                nativeJob.mux = NativeConstants.HB_MUX_MP4;\r
+            }\r
+            else\r
+            {\r
+                nativeJob.mux = NativeConstants.HB_MUX_MKV;\r
+            }\r
+\r
+            nativeJob.file = job.OutputPath;\r
+\r
+            nativeJob.largeFileSize = profile.LargeFile ? 1 : 0;\r
+            nativeJob.mp4_optimize = profile.Optimize ? 1 : 0;\r
+            nativeJob.ipod_atom = profile.IPod5GSupport ? 1 : 0;\r
+\r
+            string x264Options = profile.X264Options ?? string.Empty;\r
+            if (profile.TwoPass)\r
+            {\r
+                nativeJob.pass = 1;\r
+\r
+                if (profile.TurboFirstPass)\r
+                {\r
+                    if (x264Options == string.Empty)\r
+                    {\r
+                        x264Options = TurboX264Opts;\r
+                    }\r
+                    else\r
+                    {\r
+                        x264Options += ":" + TurboX264Opts;\r
+                    }\r
+                }\r
+            }\r
+\r
+            nativeJob.x264opts = Marshal.StringToHGlobalAnsi(x264Options);\r
+            allocatedMemory.Add(nativeJob.x264opts);\r
+\r
+            // indepth_scan\r
+\r
+            if (title.AngleCount > 1)\r
+            {\r
+                nativeJob.angle = job.Angle;\r
+            }\r
+\r
+            switch (profile.VideoEncodeRateType)\r
+            {\r
+                case VideoEncodeRateType.ConstantQuality:\r
+                    nativeJob.vquality = (float)profile.Quality;\r
+                    nativeJob.vbitrate = 0;\r
+                    break;\r
+                case VideoEncodeRateType.AverageBitrate:\r
+                    nativeJob.vquality = -1;\r
+                    nativeJob.vbitrate = profile.VideoBitrate;\r
+                    break;\r
+                case VideoEncodeRateType.TargetSize:\r
+                    nativeJob.vquality = -1;\r
+                    nativeJob.vbitrate = HbLib.hb_calc_bitrate(ref nativeJob, profile.TargetSize);\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+\r
+            // frames_to_skip\r
+\r
+            return allocatedMemory;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Adds a filter to the given filter list.\r
+        /// </summary>\r
+        /// <param name="filterList">The filter list to add to.</param>\r
+        /// <param name="filterType">The type of filter.</param>\r
+        /// <param name="settings">Settings for the filter.</param>\r
+        /// <param name="allocatedMemory">The list of allocated memory.</param>\r
+        private void AddFilter(List<IntPtr> filterList, int filterType, string settings, List<IntPtr> allocatedMemory)\r
+        {\r
+            IntPtr settingsNativeString = Marshal.StringToHGlobalAnsi(settings);\r
+            filterList.Add(HbLib.hb_get_filter_object(filterType, settingsNativeString));\r
+\r
+            allocatedMemory.Add(settingsNativeString);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the title, given the 1-based index.\r
+        /// </summary>\r
+        /// <param name="titleIndex">The index of the title (1-based).</param>\r
+        /// <returns>The requested Title.</returns>\r
+        private Title GetTitle(int titleIndex)\r
+        {\r
+            return this.Titles.SingleOrDefault(title => title.TitleNumber == titleIndex);\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the native title object from the title index.\r
+        /// </summary>\r
+        /// <param name="titleIndex">The index of the title (1-based).</param>\r
+        /// <returns>Gets the native title object for the given index.</returns>\r
+        private hb_title_s GetOriginalTitle(int titleIndex)\r
+        {\r
+            List<hb_title_s> matchingTitles = this.originalTitles.Where(title => title.index == titleIndex).ToList();\r
+            if (matchingTitles.Count == 0)\r
+            {\r
+                throw new ArgumentException("Could not find specified title.");\r
+            }\r
+\r
+            if (matchingTitles.Count > 1)\r
+            {\r
+                throw new ArgumentException("Multiple titles matched.");\r
+            }\r
+\r
+            return matchingTitles[0];\r
+        }\r
+\r
+        /// <summary>\r
+        /// Applies an audio encoding to a native audio encoding base structure.\r
+        /// </summary>\r
+        /// <param name="encoding">The encoding to apply.</param>\r
+        /// <param name="baseStruct">The base native structure.</param>\r
+        /// <param name="track"></param>\r
+        /// <param name="outputTrack"></param>\r
+        /// <returns>The resulting native audio structure.</returns>\r
+        private hb_audio_s ConvertAudioBack(AudioEncoding encoding, hb_audio_s baseStruct, int track, int outputTrack)\r
+        {\r
+            hb_audio_s nativeAudio = baseStruct;\r
+\r
+            //nativeAudio.config.input.track = track;\r
+            nativeAudio.config.output.track = outputTrack;\r
+\r
+            switch (encoding.Encoder)\r
+            {\r
+                case AudioEncoder.Ac3Passthrough:\r
+                    nativeAudio.config.output.codec = NativeConstants.HB_ACODEC_AC3;\r
+                    break;\r
+                case AudioEncoder.DtsPassthrough:\r
+                    nativeAudio.config.output.codec = NativeConstants.HB_ACODEC_DCA;\r
+                    break;\r
+                case AudioEncoder.Faac:\r
+                    nativeAudio.config.output.codec = NativeConstants.HB_ACODEC_FAAC;\r
+                    break;\r
+                case AudioEncoder.Lame:\r
+                    nativeAudio.config.output.codec = NativeConstants.HB_ACODEC_LAME;\r
+                    break;\r
+                case AudioEncoder.Vorbis:\r
+                    nativeAudio.config.output.codec = NativeConstants.HB_ACODEC_VORBIS;\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+\r
+            nativeAudio.config.output.bitrate = encoding.Bitrate;\r
+            nativeAudio.config.output.dynamic_range_compression = 0.0;\r
+\r
+            switch (encoding.Mixdown)\r
+            {\r
+                case Mixdown.DolbyProLogicII:\r
+                    nativeAudio.config.output.mixdown = NativeConstants.HB_AMIXDOWN_DOLBYPLII;\r
+                    break;\r
+                case Mixdown.DolbySurround:\r
+                    nativeAudio.config.output.mixdown = NativeConstants.HB_AMIXDOWN_DOLBY;\r
+                    break;\r
+                case Mixdown.Mono:\r
+                    nativeAudio.config.output.mixdown = NativeConstants.HB_AMIXDOWN_MONO;\r
+                    break;\r
+                case Mixdown.SixChannelDiscrete:\r
+                    nativeAudio.config.output.mixdown = NativeConstants.HB_AMIXDOWN_6CH;\r
+                    break;\r
+                case Mixdown.Stereo:\r
+                    nativeAudio.config.output.mixdown = NativeConstants.HB_AMIXDOWN_STEREO;\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+\r
+            if (encoding.SampleRate != null)\r
+            {\r
+                nativeAudio.config.output.samplerate = (int)(double.Parse(encoding.SampleRate) * 1000);\r
+            }\r
+\r
+            nativeAudio.padding = new byte[24600];\r
+\r
+            return nativeAudio;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Converts a native title to a Title object.\r
+        /// </summary>\r
+        /// <param name="title">The native title structure.</param>\r
+        /// <returns>The managed Title object.</returns>\r
+        private Title ConvertTitle(hb_title_s title)\r
+        {\r
+            var newTitle = new Title\r
+            {\r
+                TitleNumber = title.index,\r
+                Resolution = new Size(title.width, title.height),\r
+                ParVal = new Size(title.pixel_aspect_width, title.pixel_aspect_height),\r
+                Duration = TimeSpan.FromSeconds(((double)title.duration) / 90000),\r
+                AutoCropDimensions = new Cropping\r
+                {\r
+                    Top = title.crop[0],\r
+                    Bottom = title.crop[1],\r
+                    Left = title.crop[2],\r
+                    Right = title.crop[3]\r
+                },\r
+                AspectRatio = title.aspect,\r
+                AngleCount = title.angle_count\r
+            };\r
+\r
+            int currentSubtitleTrack = 1;\r
+            List<hb_subtitle_s> subtitleList = InteropUtilities.ConvertList<hb_subtitle_s>(title.list_subtitle);\r
+            foreach (hb_subtitle_s subtitle in subtitleList)\r
+            {\r
+                var newSubtitle = new Subtitle\r
+                {\r
+                    TrackNumber = currentSubtitleTrack,\r
+                    Language = subtitle.lang,\r
+                    LanguageCode = subtitle.iso639_2\r
+                };\r
+\r
+                if (subtitle.format == hb_subtitle_s_subtype.PICTURESUB)\r
+                {\r
+                    newSubtitle.SubtitleType = SubtitleType.Picture;\r
+                }\r
+                else if (subtitle.format == hb_subtitle_s_subtype.TEXTSUB)\r
+                {\r
+                    newSubtitle.SubtitleType = SubtitleType.Text;\r
+                }\r
+\r
+                newTitle.Subtitles.Add(newSubtitle);\r
+\r
+                currentSubtitleTrack++;\r
+            }\r
+\r
+            int currentAudioTrack = 1;\r
+            List<hb_audio_s> audioList = InteropUtilities.ConvertList<hb_audio_s>(title.list_audio);\r
+            foreach (hb_audio_s audio in audioList)\r
+            {\r
+                var newAudio = new AudioTrack\r
+                {\r
+                    TrackNumber = currentAudioTrack,\r
+                    Language = audio.config.lang.simple,\r
+                    LanguageCode = audio.config.lang.iso639_2,\r
+                    Description = audio.config.lang.description\r
+                };\r
+\r
+                newTitle.AudioTracks.Add(newAudio);\r
+\r
+                currentAudioTrack++;\r
+            }\r
+\r
+            List<hb_chapter_s> chapterList = InteropUtilities.ConvertList<hb_chapter_s>(title.list_chapter);\r
+            foreach (hb_chapter_s chapter in chapterList)\r
+            {\r
+                var newChapter = new Chapter\r
+                {\r
+                    ChapterNumber = chapter.index,\r
+                    Duration = TimeSpan.FromSeconds(((double)chapter.duration) / 90000)\r
+                };\r
+\r
+                newTitle.Chapters.Add(newChapter);\r
+            }\r
+\r
+            return newTitle;\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/HandBrakeInterop.csproj b/win/C#/interop/HandBrakeInterop.csproj
new file mode 100644 (file)
index 0000000..fd35b97
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <PropertyGroup>\r
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
+    <ProductVersion>9.0.30729</ProductVersion>\r
+    <SchemaVersion>2.0</SchemaVersion>\r
+    <ProjectGuid>{F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}</ProjectGuid>\r
+    <OutputType>Library</OutputType>\r
+    <AppDesignerFolder>Properties</AppDesignerFolder>\r
+    <RootNamespace>HandBrake.Interop</RootNamespace>\r
+    <AssemblyName>HandBrakeInterop</AssemblyName>\r
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\r
+    <FileAlignment>512</FileAlignment>\r
+    <FileUpgradeFlags>\r
+    </FileUpgradeFlags>\r
+    <UpgradeBackupLocation>\r
+    </UpgradeBackupLocation>\r
+    <OldToolsVersion>3.5</OldToolsVersion>\r
+    <TargetFrameworkProfile>Client</TargetFrameworkProfile>\r
+    <PublishUrl>publish\</PublishUrl>\r
+    <Install>true</Install>\r
+    <InstallFrom>Disk</InstallFrom>\r
+    <UpdateEnabled>false</UpdateEnabled>\r
+    <UpdateMode>Foreground</UpdateMode>\r
+    <UpdateInterval>7</UpdateInterval>\r
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\r
+    <UpdatePeriodically>false</UpdatePeriodically>\r
+    <UpdateRequired>false</UpdateRequired>\r
+    <MapFileExtensions>true</MapFileExtensions>\r
+    <ApplicationRevision>0</ApplicationRevision>\r
+    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\r
+    <IsWebBootstrapper>false</IsWebBootstrapper>\r
+    <UseApplicationTrust>false</UseApplicationTrust>\r
+    <BootstrapperEnabled>true</BootstrapperEnabled>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">\r
+    <DebugSymbols>true</DebugSymbols>\r
+    <DebugType>full</DebugType>\r
+    <Optimize>false</Optimize>\r
+    <OutputPath>bin\Debug\</OutputPath>\r
+    <DefineConstants>DEBUG;TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <PlatformTarget>x86</PlatformTarget>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">\r
+    <DebugType>pdbonly</DebugType>\r
+    <Optimize>true</Optimize>\r
+    <OutputPath>bin\Release\</OutputPath>\r
+    <DefineConstants>TRACE</DefineConstants>\r
+    <ErrorReport>prompt</ErrorReport>\r
+    <WarningLevel>4</WarningLevel>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <PlatformTarget>x86</PlatformTarget>\r
+  </PropertyGroup>\r
+  <ItemGroup>\r
+    <Reference Include="PresentationCore">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System" />\r
+    <Reference Include="System.Core">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Drawing" />\r
+    <Reference Include="System.Xaml" />\r
+    <Reference Include="System.Xml.Linq">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Data.DataSetExtensions">\r
+      <RequiredTargetFramework>3.5</RequiredTargetFramework>\r
+    </Reference>\r
+    <Reference Include="System.Data" />\r
+    <Reference Include="System.Xml" />\r
+    <Reference Include="WindowsBase">\r
+      <RequiredTargetFramework>3.0</RequiredTargetFramework>\r
+    </Reference>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Compile Include="Converters.cs" />\r
+    <Compile Include="DisplayStringAttribute.cs" />\r
+    <Compile Include="EncodeCompletedEventArgs.cs" />\r
+    <Compile Include="EncodeProgressEventArgs.cs" />\r
+    <Compile Include="HandBrakeInstance.cs" />\r
+    <Compile Include="HbLib.cs" />\r
+    <Compile Include="InteropUtilities.cs" />\r
+    <Compile Include="Language.cs" />\r
+    <Compile Include="LanguageCodes.cs" />\r
+    <Compile Include="MessageLoggedEventArgs.cs" />\r
+    <Compile Include="Model\Cropping.cs" />\r
+    <Compile Include="Model\EncodeJob.cs" />\r
+    <Compile Include="Model\Encoding\Anamorphic.cs" />\r
+    <Compile Include="Model\Encoding\AudioEncoder.cs" />\r
+    <Compile Include="Model\Encoding\AudioEncoding.cs" />\r
+    <Compile Include="Model\Encoding\Decomb.cs" />\r
+    <Compile Include="Model\Encoding\Deinterlace.cs" />\r
+    <Compile Include="Model\Encoding\Denoise.cs" />\r
+    <Compile Include="Model\Encoding\Detelecine.cs" />\r
+    <Compile Include="Model\Encoding\EncodingProfile.cs" />\r
+    <Compile Include="Model\Encoding\Mixdown.cs" />\r
+    <Compile Include="Model\Encoding\OutputExtension.cs" />\r
+    <Compile Include="Model\Encoding\OutputFormat.cs" />\r
+    <Compile Include="Model\Encoding\VideoEncoder.cs" />\r
+    <Compile Include="Model\Encoding\VideoEncodeRateType.cs" />\r
+    <Compile Include="Model\Size.cs" />\r
+    <Compile Include="Model\SourceSubtitle.cs" />\r
+    <Compile Include="Model\SourceType.cs" />\r
+    <Compile Include="Model\SrtSubtitle.cs" />\r
+    <Compile Include="Model\Subtitles.cs" />\r
+    <Compile Include="NativeList.cs" />\r
+    <Compile Include="Properties\AssemblyInfo.cs" />\r
+    <Compile Include="ScanProgressEventArgs.cs" />\r
+    <Compile Include="SourceData\AudioTrack.cs" />\r
+    <Compile Include="SourceData\Chapter.cs" />\r
+    <Compile Include="SourceData\Subtitle.cs" />\r
+    <Compile Include="SourceData\SubtitleType.cs" />\r
+    <Compile Include="SourceData\Title.cs" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <BootstrapperPackage Include="Microsoft.Net.Client.3.5">\r
+      <Visible>False</Visible>\r
+      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>\r
+      <Install>false</Install>\r
+    </BootstrapperPackage>\r
+    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">\r
+      <Visible>False</Visible>\r
+      <ProductName>.NET Framework 3.5 SP1</ProductName>\r
+      <Install>true</Install>\r
+    </BootstrapperPackage>\r
+    <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">\r
+      <Visible>False</Visible>\r
+      <ProductName>Windows Installer 3.1</ProductName>\r
+      <Install>true</Install>\r
+    </BootstrapperPackage>\r
+  </ItemGroup>\r
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />\r
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \r
+       Other similar extension points exist, see Microsoft.Common.targets.\r
+  <Target Name="BeforeBuild">\r
+  </Target>\r
+  <Target Name="AfterBuild">\r
+  </Target>\r
+  -->\r
+</Project>
\ No newline at end of file
diff --git a/win/C#/interop/HandBrakeInterop.sln b/win/C#/interop/HandBrakeInterop.sln
new file mode 100644 (file)
index 0000000..1fae7a8
--- /dev/null
@@ -0,0 +1,20 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeInterop", "HandBrakeInterop.csproj", "{F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Release|Any CPU = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Release|Any CPU.Build.0 = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win/C#/interop/HandBrakeInterop.suo b/win/C#/interop/HandBrakeInterop.suo
new file mode 100644 (file)
index 0000000..beac285
Binary files /dev/null and b/win/C#/interop/HandBrakeInterop.suo differ
diff --git a/win/C#/interop/HandBrakeInterop2008.sln b/win/C#/interop/HandBrakeInterop2008.sln
new file mode 100644 (file)
index 0000000..29a2021
--- /dev/null
@@ -0,0 +1,20 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HandBrakeInterop", "HandBrakeInterop.csproj", "{F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug|Any CPU = Debug|Any CPU\r
+               Release|Any CPU = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Debug|Any CPU.Build.0 = Debug|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Release|Any CPU.ActiveCfg = Release|Any CPU\r
+               {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1}.Release|Any CPU.Build.0 = Release|Any CPU\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/win/C#/interop/HbLib.cs b/win/C#/interop/HbLib.cs
new file mode 100644 (file)
index 0000000..9d22207
--- /dev/null
@@ -0,0 +1,1290 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Runtime.InteropServices;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+\r
+    public partial class NativeConstants\r
+    {\r
+        public const int HB_ACODEC_MASK =   0x00FF00;\r
+        public const int HB_ACODEC_FAAC =   0x000100;\r
+        public const int HB_ACODEC_LAME =   0x000200;\r
+        public const int HB_ACODEC_VORBIS = 0x000400;\r
+        public const int HB_ACODEC_AC3 =    0x000800;\r
+        public const int HB_ACODEC_MPGA =   0x001000;\r
+        public const int HB_ACODEC_LPCM =   0x002000;\r
+        public const int HB_ACODEC_DCA =    0x004000;\r
+        public const int HB_ACODEC_FFMPEG = 0x008000;\r
+        public const int HB_ACODEC_CA_AAC = 0x010000;\r
+\r
+        public const int HB_AMIXDOWN_DCA_FORMAT_MASK =              0x00FFF000;\r
+        public const int HB_AMIXDOWN_A52_FORMAT_MASK =              0x00000FF0;\r
+        public const int HB_AMIXDOWN_DISCRETE_CHANNEL_COUNT_MASK =  0x0000000F;\r
+        public const int HB_AMIXDOWN_MONO =                         0x01000001;\r
+        public const int HB_AMIXDOWN_STEREO =                       0x02002022;\r
+        public const int HB_AMIXDOWN_DOLBY =                        0x042070A2;\r
+        public const int HB_AMIXDOWN_DOLBYPLII =                    0x084094A2;\r
+        public const int HB_AMIXDOWN_6CH =                          0x10089176;\r
+\r
+        public const int HB_VCODEC_MASK =   0x0000FF;\r
+        public const int HB_VCODEC_FFMPEG = 0x000001;\r
+        public const int HB_VCODEC_X264 =   0x000002;\r
+        public const int HB_VCODEC_THEORA = 0x000004;\r
+\r
+        public const int HB_MUX_MASK =  0xFF0000;\r
+        public const int HB_MUX_MP4 =   0x010000;\r
+        public const int HB_MUX_PSP =   0x020000;\r
+        public const int HB_MUX_AVI =   0x040000;\r
+        public const int HB_MUX_OGM =   0x080000;\r
+        public const int HB_MUX_IPOD =  0x100000;\r
+        public const int HB_MUX_MKV =   0x200000;\r
+\r
+        public const int HBTF_NO_IDR = 1 << 0;\r
+\r
+        public const int HB_STATE_IDLE = 1;\r
+        public const int HB_STATE_SCANNING = 2;\r
+        public const int HB_STATE_SCANDONE = 4;\r
+        public const int HB_STATE_WORKING = 8;\r
+        public const int HB_STATE_PAUSED = 16;\r
+        public const int HB_STATE_WORKDONE = 32;\r
+        public const int HB_STATE_MUXING = 64;\r
+\r
+        public const int HB_ERROR_NONE = 0;\r
+        public const int HB_ERROR_CANCELED = 1;\r
+        public const int HB_ERROR_UNKNOWN = 2;\r
+\r
+        public const int AUDIO_F_DOLBY = 1 << 31;\r
+\r
+        public const int HB_FRAME_IDR =     0x01;\r
+        public const int HB_FRAME_I =       0x02;\r
+        public const int HB_FRAME_AUDIO =   0x04;\r
+        public const int HB_FRAME_P =       0x10;\r
+        public const int HB_FRAME_B =       0x20;\r
+        public const int HB_FRAME_BREF =    0x40;\r
+        public const int HB_FRAME_KEY =     0x0F;\r
+        public const int HB_FRAME_REF =     0xF0;\r
+\r
+        public const int HB_CONFIG_MAX_SIZE = 8192;\r
+\r
+        public const int HB_FILTER_DETELECINE = 1;\r
+        public const int HB_FILTER_DEINTERLACE = 2;\r
+        public const int HB_FILTER_DEBLOCK = 3;\r
+        public const int HB_FILTER_DENOISE = 4;\r
+        public const int HB_FILTER_DECOMB = 5;\r
+        public const int HB_FILTER_ROTATE = 6;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_anamorphic_substruct\r
+    {\r
+        /// int\r
+        public int mode;\r
+\r
+        /// int\r
+        public int itu_par;\r
+\r
+        /// int\r
+        public int par_width;\r
+\r
+        /// int\r
+        public int par_height;\r
+\r
+        /// int\r
+        public int dar_width;\r
+\r
+        /// int\r
+        public int dar_height;\r
+\r
+        /// int\r
+        public int keep_display_aspect;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_job_s\r
+    {\r
+        /// int\r
+        public int sequence_id;\r
+\r
+        /// hb_title_t*\r
+        public IntPtr title;\r
+\r
+        public int feature;\r
+\r
+        /// int\r
+        public int chapter_start;\r
+\r
+        /// int\r
+        public int chapter_end;\r
+\r
+        /// int\r
+        public int chapter_markers;\r
+\r
+        /// int[4]\r
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I4)]\r
+        public int[] crop;\r
+\r
+        /// int\r
+        public int deinterlace;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr filters;\r
+\r
+        /// int\r
+        public int width;\r
+\r
+        /// int\r
+        public int height;\r
+\r
+        /// int\r
+        public int keep_ratio;\r
+\r
+        /// int\r
+        public int grayscale;\r
+\r
+        public hb_anamorphic_substruct anamorphic;\r
+\r
+        public int modulus;\r
+\r
+        /// int\r
+        public int maxWidth;\r
+\r
+        /// int\r
+        public int maxHeight;\r
+\r
+        /// int\r
+        public int vcodec;\r
+\r
+        /// float\r
+        public float vquality;\r
+\r
+        /// int\r
+        public int vbitrate;\r
+\r
+        /// int\r
+        public int vrate;\r
+\r
+        /// int\r
+        public int vrate_base;\r
+\r
+        /// int\r
+        public int vfr;\r
+\r
+        /// int\r
+        public int cfr;\r
+\r
+        /// int\r
+        public int pass;\r
+\r
+        /// int\r
+        public int h264_13;\r
+\r
+        /// int\r
+        public int h264_level;\r
+\r
+        /// char*\r
+        //[MarshalAs(UnmanagedType.LPStr)]\r
+        //public string x264opts;\r
+\r
+        public IntPtr x264opts;\r
+\r
+        /// int\r
+        public int areBframes;\r
+\r
+        /// int\r
+        public int color_matrix;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_audio;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_subtitle;\r
+\r
+        /// int\r
+        public int mux;\r
+\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string file;\r
+\r
+        /// int\r
+        public int largeFileSize;\r
+\r
+        /// int\r
+        public int mp4_optimize;\r
+\r
+        /// int\r
+        public int ipod_atom;\r
+\r
+        /// int\r
+        public int indepth_scan;\r
+\r
+        /// hb_subtitle_config_t->hb_subtitle_config_s\r
+        public hb_subtitle_config_s select_subtitle_config;\r
+\r
+        /// int\r
+        public int angle;\r
+\r
+        public int frame_to_start;\r
+\r
+        public long pts_to_start;\r
+\r
+        /// int\r
+        public int frame_to_stop;\r
+\r
+        /// int64_t->int\r
+        public long pts_to_stop;\r
+\r
+        /// int\r
+        public int start_at_preview;\r
+\r
+        /// int\r
+        public int seek_points;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint frames_to_skip;\r
+\r
+        // Padding for the part of the struct we don't care about marshaling.\r
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24644, ArraySubType = UnmanagedType.U1)]\r
+        public byte[] padding;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_list_s\r
+    {\r
+        /// void**\r
+        public IntPtr items;\r
+\r
+        /// int\r
+        public int items_alloc;\r
+\r
+        /// int\r
+        public int items_count;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_rate_s\r
+    {\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string @string;\r
+\r
+        /// int\r
+        public int rate;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_handle_s\r
+    {\r
+        public int id;\r
+\r
+        /// int\r
+        public int build;\r
+\r
+        /// char[32]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]\r
+        public string version;\r
+\r
+        /// hb_thread_t*\r
+        public IntPtr update_thread;\r
+\r
+        /// int\r
+        public int die;\r
+\r
+        /// hb_thread_t*\r
+        public IntPtr main_thread;\r
+\r
+        /// int\r
+        public int pid;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_title;\r
+\r
+        /// hb_thread_t*\r
+        public IntPtr scan_thread;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr jobs;\r
+\r
+        /// hb_job_t*\r
+        public IntPtr current_job;\r
+\r
+        /// int\r
+        public int job_count;\r
+\r
+        /// int\r
+        public int job_count_permanent;\r
+\r
+        /// int\r
+        public int work_die;\r
+\r
+        /// int\r
+        public int work_error;\r
+\r
+        /// hb_thread_t*\r
+        public IntPtr work_thread;\r
+\r
+        /// int\r
+        public int cpu_count;\r
+\r
+        /// hb_lock_t*\r
+        public IntPtr state_lock;\r
+\r
+        /// hb_state_t->hb_state_s\r
+        public hb_state_s state;\r
+\r
+        /// int\r
+        public int paused;\r
+\r
+        /// hb_lock_t*\r
+        public IntPtr pause_lock;\r
+\r
+        /// int\r
+        public int scanCount;\r
+\r
+        /// hb_interjob_t*\r
+        public IntPtr interjob;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_chapter_s\r
+    {\r
+        /// int\r
+        public int index;\r
+\r
+        /// int\r
+        public int pgcn;\r
+\r
+        /// int\r
+        public int pgn;\r
+\r
+        /// int\r
+        public int cell_start;\r
+\r
+        /// int\r
+        public int cell_end;\r
+\r
+        /// int\r
+        public int block_start;\r
+\r
+        /// int\r
+        public int block_end;\r
+\r
+        /// int\r
+        public int block_count;\r
+\r
+        /// int\r
+        public int hours;\r
+\r
+        /// int\r
+        public int minutes;\r
+\r
+        /// int\r
+        public int seconds;\r
+\r
+        /// uint64_t->unsigned int\r
+        public ulong duration;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string title;\r
+    }\r
+\r
+    public enum hb_subtitle_s_subtype\r
+    {\r
+        PICTURESUB,\r
+\r
+        TEXTSUB,\r
+    }\r
+\r
+    public enum hb_subtitle_s_subsource\r
+    {\r
+        VOBSUB,\r
+\r
+        SRTSUB,\r
+\r
+        CC608SUB,\r
+\r
+        CC708SUB,\r
+\r
+        UTF8SUB,\r
+\r
+        TX3GSUB,\r
+\r
+        SSASUB\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_subtitle_s\r
+    {\r
+        /// int\r
+        public int id;\r
+\r
+        /// int\r
+        public int track;\r
+\r
+        /// hb_subtitle_config_t->hb_subtitle_config_s\r
+        public hb_subtitle_config_s config;\r
+\r
+        /// hb_subtitle_s_subtype\r
+        public hb_subtitle_s_subtype format;\r
+\r
+        /// hb_subtitle_s_subsource\r
+        public hb_subtitle_s_subsource source;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string lang;\r
+\r
+        /// char[4]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]\r
+        public string iso639_2;\r
+\r
+        /// uint8_t->unsigned char\r
+        public byte type;\r
+\r
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.U4)]\r
+        public uint[] palette;\r
+\r
+        public int width;\r
+\r
+        public int height;\r
+\r
+        /// int\r
+        public int hits;\r
+\r
+        /// int\r
+        public int forced_hits;\r
+\r
+        /// hb_fifo_t*\r
+        public IntPtr fifo_in;\r
+\r
+        /// hb_fifo_t*\r
+        public IntPtr fifo_raw;\r
+\r
+        /// hb_fifo_t*\r
+        public IntPtr fifo_sync;\r
+\r
+        /// hb_fifo_t*\r
+        public IntPtr fifo_out;\r
+\r
+        /// hb_mux_data_t*\r
+        public IntPtr mux_data;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_metadata_s\r
+    {\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string name;\r
+\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string artist;\r
+\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string composer;\r
+\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string release_date;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string comment;\r
+\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string album;\r
+\r
+        /// char[255]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]\r
+        public string genre;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint coverart_size;\r
+\r
+        /// uint8_t*\r
+        public IntPtr coverart;\r
+    }\r
+\r
+    public enum Anonymous_990d28ea_6cf3_4fbc_8143_4df9513e9550\r
+    {\r
+        HB_DVD_TYPE,\r
+\r
+        HB_STREAM_TYPE,\r
+    }\r
+\r
+    public enum Anonymous_618ebeca_0ad9_4a71_9a49_18e50ac2e9db\r
+    {\r
+        /// HB_MPEG2_PS_DEMUXER -> 0\r
+        HB_MPEG2_PS_DEMUXER = 0,\r
+\r
+        HB_MPEG2_TS_DEMUXER,\r
+\r
+        HB_NULL_DEMUXER,\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_title_s\r
+    {\r
+        /// Anonymous_990d28ea_6cf3_4fbc_8143_4df9513e9550\r
+        public Anonymous_990d28ea_6cf3_4fbc_8143_4df9513e9550 type;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string dvd;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string name;\r
+\r
+        //public fixed byte dvd[1024];\r
+\r
+        //public fixed byte name[1024];\r
+\r
+        /// int\r
+        public int index;\r
+\r
+        /// int\r
+        public int vts;\r
+\r
+        /// int\r
+        public int ttn;\r
+\r
+        /// int\r
+        public int cell_start;\r
+\r
+        /// int\r
+        public int cell_end;\r
+\r
+        /// int\r
+        public int block_start;\r
+\r
+        /// int\r
+        public int block_end;\r
+\r
+        /// int\r
+        public int block_count;\r
+\r
+        /// int\r
+        public int angle_count;\r
+\r
+        /// int\r
+        public int hours;\r
+\r
+        /// int\r
+        public int minutes;\r
+\r
+        /// int\r
+        public int seconds;\r
+\r
+        /// uint64_t->unsigned int\r
+        public ulong duration;\r
+\r
+        /// double\r
+        public double aspect;\r
+\r
+        /// double\r
+        public double container_aspect;\r
+\r
+        /// int\r
+        public int width;\r
+\r
+        /// int\r
+        public int height;\r
+\r
+        /// int\r
+        public int pixel_aspect_width;\r
+\r
+        /// int\r
+        public int pixel_aspect_height;\r
+\r
+        /// int\r
+        public int rate;\r
+\r
+        /// int\r
+        public int rate_base;\r
+\r
+        /// int[4]\r
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4, ArraySubType = UnmanagedType.I4)]\r
+        public int[] crop;\r
+\r
+        //public fixed int crop[4];\r
+\r
+        /// Anonymous_618ebeca_0ad9_4a71_9a49_18e50ac2e9db\r
+        public Anonymous_618ebeca_0ad9_4a71_9a49_18e50ac2e9db demuxer;\r
+\r
+        /// int\r
+        public int detected_interlacing;\r
+\r
+        /// int\r
+        public int video_id;\r
+\r
+        /// int\r
+        public int video_codec;\r
+\r
+        /// int\r
+        public int video_codec_param;\r
+\r
+        /// char*\r
+        public IntPtr video_codec_name;\r
+\r
+        /// int\r
+        public int video_bitrate;\r
+\r
+        /// char*\r
+        public IntPtr container_name;\r
+\r
+        /// int\r
+        public int data_rate;\r
+\r
+        /// hb_metadata_t*\r
+        public IntPtr metadata;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_chapter;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_audio;\r
+\r
+        /// hb_list_t*\r
+        public IntPtr list_subtitle;\r
+\r
+        /// hb_job_t*\r
+        public IntPtr job;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint flags;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_state_scanning_s\r
+    {\r
+        /// int\r
+        public int title_cur;\r
+\r
+        /// int\r
+        public int title_count;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_state_working_s\r
+    {\r
+        /// float\r
+        public float progress;\r
+\r
+        /// int\r
+        public int job_cur;\r
+\r
+        /// int\r
+        public int job_count;\r
+\r
+        /// float\r
+        public float rate_cur;\r
+\r
+        /// float\r
+        public float rate_avg;\r
+\r
+        /// int\r
+        public int hours;\r
+\r
+        /// int\r
+        public int minutes;\r
+\r
+        /// int\r
+        public int seconds;\r
+\r
+        /// int\r
+        public int sequence_id;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_state_workdone_s\r
+    {\r
+        /// int\r
+        public int error;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_state_muxing_s\r
+    {\r
+        /// float\r
+        public float progress;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Explicit)]\r
+    public struct hb_state_param_u\r
+    {\r
+        [FieldOffset(0)]\r
+        public hb_state_scanning_s scanning;\r
+\r
+        [FieldOffset(0)]\r
+        public hb_state_working_s working;\r
+\r
+        [FieldOffset(0)]\r
+        public hb_state_workdone_s workdone;\r
+\r
+        [FieldOffset(0)]\r
+        public hb_state_muxing_s muxing;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_state_s\r
+    {\r
+\r
+        /// int\r
+        public int state;\r
+        public hb_state_param_u param;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_audio_s\r
+    {\r
+        /// int\r
+        public int id;\r
+\r
+        /// hb_audio_config_t->hb_audio_config_s\r
+        public hb_audio_config_s config;\r
+\r
+        // Padding for the part of the struct we don't care about marshaling.\r
+        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24600, ArraySubType = UnmanagedType.U1)]\r
+        public byte[] padding;\r
+\r
+        /// Anonymous_e6c7b779_b5a3_4e80_9fa8_13619d14f545\r
+        //public Anonymous_e6c7b779_b5a3_4e80_9fa8_13619d14f545 priv;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_audio_config_s\r
+    {\r
+        public hb_audio_config_output_s output;\r
+        public hb_audio_config_input_s input;\r
+\r
+        /// Anonymous_a0a59d69_d9a4_4003_a198_f7c51511e31d\r
+        public Anonymous_a0a59d69_d9a4_4003_a198_f7c51511e31d flags;\r
+\r
+        public hb_audio_config_lang_s lang;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_audio_config_output_s\r
+    {\r
+        /// int\r
+        public int track;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint codec;\r
+\r
+        /// int\r
+        public int samplerate;\r
+\r
+        /// int\r
+        public int bitrate;\r
+\r
+        /// int\r
+        public int mixdown;\r
+\r
+        /// double\r
+        public double dynamic_range_compression;\r
+\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string name;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_audio_config_input_s\r
+    {\r
+        /// int\r
+        public int track;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint codec;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint codec_param;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint version;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint mode;\r
+\r
+        /// int\r
+        public int samplerate;\r
+\r
+        /// int\r
+        public int bitrate;\r
+\r
+        /// int\r
+        public int channel_layout;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Explicit)]\r
+    public struct Anonymous_a0a59d69_d9a4_4003_a198_f7c51511e31d\r
+    {\r
+        /// int\r
+        [FieldOffset(0)]\r
+        public int ac3;\r
+\r
+        /// int\r
+        [FieldOffset(0)]\r
+        public int dca;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_audio_config_lang_s\r
+    {\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string description;\r
+\r
+        /// char[1024]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]\r
+        public string simple;\r
+\r
+        /// char[4]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]\r
+        public string iso639_2;\r
+\r
+        /// uint8_t->unsigned char\r
+        public byte type;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_mixdown_s\r
+    {\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string human_readable_name;\r
+\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string internal_name;\r
+\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string short_name;\r
+\r
+        /// int\r
+        public int amixdown;\r
+    }\r
+\r
+    public enum hb_subtitle_config_s_subdest\r
+    {\r
+        RENDERSUB,\r
+\r
+        PASSTHRUSUB,\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]\r
+    public struct hb_subtitle_config_s\r
+    {\r
+        /// hb_subtitle_config_s_subdest\r
+        public hb_subtitle_config_s_subdest dest;\r
+\r
+        /// int\r
+        public int force;\r
+\r
+        /// int\r
+        public int default_track;\r
+\r
+        /// char[128]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]\r
+        public string src_filename;\r
+\r
+        /// char[40]\r
+        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)]\r
+        public string src_codeset;\r
+\r
+        /// int64_t->int\r
+        public long offset;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_fifo_s\r
+    {\r
+        /// hb_lock_t*\r
+        public IntPtr @lock;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint capacity;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint size;\r
+\r
+        /// uint32_t->unsigned int\r
+        public uint buffer_size;\r
+\r
+        /// hb_buffer_t*\r
+        public IntPtr first;\r
+\r
+        /// hb_buffer_t*\r
+        public IntPtr last;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_lock_s\r
+    {\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_buffer_s\r
+    {\r
+        /// int\r
+        public int size;\r
+\r
+        /// int\r
+        public int alloc;\r
+\r
+        /// uint8_t*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string data;\r
+\r
+        /// int\r
+        public int cur;\r
+\r
+        /// int64_t->int\r
+        public long sequence;\r
+\r
+        /// int\r
+        public int id;\r
+\r
+        /// int64_t->int\r
+        public long start;\r
+\r
+        /// int64_t->int\r
+        public long stop;\r
+\r
+        /// int\r
+        public int new_chap;\r
+\r
+        /// uint8_t->unsigned char\r
+        public byte frametype;\r
+\r
+        /// uint16_t->unsigned int\r
+        public uint flags;\r
+\r
+        /// int64_t->int\r
+        public long renderOffset;\r
+\r
+        /// int\r
+        public int x;\r
+\r
+        /// int\r
+        public int y;\r
+\r
+        /// int\r
+        public int width;\r
+\r
+        /// int\r
+        public int height;\r
+\r
+        /// hb_buffer_t*\r
+        public IntPtr sub;\r
+\r
+        /// hb_buffer_t*\r
+        public IntPtr next;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_mux_data_s\r
+    {\r
+        /// MP4TrackId->uint32_t->unsigned int\r
+        public uint track;\r
+\r
+        /// uint8_t->unsigned char\r
+        public byte subtitle;\r
+\r
+        /// int\r
+        public int sub_format;\r
+\r
+        /// uint64_t->unsigned int\r
+        public ulong sum_dur;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_interjob_s\r
+    {\r
+        /// int\r
+        public int last_job;\r
+\r
+        /// int\r
+        public int frame_count;\r
+\r
+        /// uint64_t->unsigned int\r
+        public ulong total_time;\r
+\r
+        /// int\r
+        public int render_dropped;\r
+\r
+        /// int\r
+        public int vrate;\r
+\r
+        /// int\r
+        public int vrate_base;\r
+\r
+        /// hb_subtitle_t*\r
+        public IntPtr select_subtitle;\r
+    }\r
+\r
+    /// Return Type: void\r
+    ///param0: void*\r
+    public delegate void hb_thread_s_function(IntPtr param0);\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct hb_thread_s\r
+    {\r
+        /// char*\r
+        [MarshalAs(UnmanagedType.LPStr)]\r
+        public string name;\r
+\r
+        /// int\r
+        public int priority;\r
+\r
+        /// hb_thread_s_function\r
+        public hb_thread_s_function AnonymousMember1;\r
+\r
+        /// void*\r
+        public IntPtr arg;\r
+\r
+        /// hb_lock_t*\r
+        public IntPtr @lock;\r
+\r
+        /// int\r
+        public int exited;\r
+\r
+        /// pthread_t->ptw32_handle_t->Anonymous_55c509b5_bbf2_4788_a684_ac1bd0056655\r
+        public ptw32_handle_t thread;\r
+    }\r
+\r
+    [StructLayout(LayoutKind.Sequential)]\r
+    public struct ptw32_handle_t\r
+    {\r
+        /// void*\r
+        public IntPtr p;\r
+\r
+        /// unsigned int\r
+        public uint x;\r
+    }\r
+\r
+    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]\r
+    public delegate void LoggingCallback(string message);\r
+\r
+    public partial class HbLib\r
+    {\r
+        [DllImport("hb.dll", EntryPoint = "hb_calc_bitrate", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_calc_bitrate(ref hb_job_s job, int size);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_register_logger", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_register_logger(LoggingCallback callback);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_register_error_handler", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_register_error_handler(LoggingCallback callback);\r
+\r
+        /// Return Type: hb_handle_t*\r
+        ///verbose: int\r
+        ///update_check: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_init", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_init(int verbose, int update_check);\r
+\r
+\r
+        /// Return Type: hb_handle_t*\r
+        ///verbose: int\r
+        ///update_check: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_init_dl", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_init_dl(int verbose, int update_check);\r
+\r
+\r
+        /// Return Type: char*\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_version", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_get_version(ref hb_handle_s param0);\r
+\r
+\r
+        /// Return Type: int\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_build", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_get_build(ref hb_handle_s param0);\r
+\r
+\r
+        /// Return Type: int\r
+        ///h: hb_handle_t*\r
+        ///version: char**\r
+        [DllImport("hb.dll", EntryPoint = "hb_check_update", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_check_update(ref hb_handle_s h, ref IntPtr version);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_cpu_count", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_cpu_count(ref hb_handle_s param0, int param1);\r
+\r
+\r
+        /// Return Type: char*\r
+        ///path: char*\r
+        [DllImport("hb.dll", EntryPoint = "hb_dvd_name", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_dvd_name(IntPtr path);\r
+\r
+\r
+        /// Return Type: void\r
+        ///enable: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_dvd_set_dvdnav", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_dvd_set_dvdnav(int enable);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///path: char*\r
+        ///title_index: int\r
+        ///preview_count: int\r
+        ///store_previews: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_scan", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_scan(IntPtr hbHandle, [In] [MarshalAs(UnmanagedType.LPStr)] string path, int title_index, int preview_count, int store_previews);\r
+\r
+\r
+        /// Return Type: hb_list_t*\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_titles", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_get_titles(IntPtr hbHandle);\r
+\r
+\r
+        /// Return Type: int\r
+        ///buf: hb_buffer_t*\r
+        ///width: int\r
+        ///height: int\r
+        ///color_equal: int\r
+        ///color_diff: int\r
+        ///threshold: int\r
+        ///prog_equal: int\r
+        ///prog_diff: int\r
+        ///prog_threshold: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_detect_comb", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_detect_comb(ref hb_buffer_s buf, int width, int height, int color_equal, int color_diff, int threshold, int prog_equal, int prog_diff, int prog_threshold);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_preview_by_index", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_get_preview_by_index(IntPtr hbHandle, int title_index, int picture, IntPtr buffer);\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: hb_title_t*\r
+        ///param2: int\r
+        ///param3: uint8_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_preview", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_get_preview(IntPtr hbHandle, ref hb_title_s title, int preview, IntPtr buffer);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_job_t*\r
+        ///ratio: double\r
+        ///pixels: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_size", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_size(ref hb_job_s param0, double ratio, int pixels);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_anamorphic_size_by_index", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_anamorphic_size_by_index(IntPtr hbHandle, int title_index, ref int output_width, ref int output_height, ref int output_par_width, ref int output_par_height);\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_job_t*\r
+        ///output_width: int*\r
+        ///output_height: int*\r
+        ///output_par_width: int*\r
+        ///output_par_height: int*\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_anamorphic_size", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_anamorphic_size(ref hb_job_s job, ref int output_width, ref int output_height, ref int output_par_width, ref int output_par_height);\r
+\r
+\r
+        /// Return Type: int\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_count", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_count(IntPtr hbHandle);\r
+\r
+\r
+        /// Return Type: hb_job_t*\r
+        ///param0: hb_handle_t*\r
+        ///param1: int\r
+        [DllImport("hb.dll", EntryPoint = "hb_job", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern IntPtr hb_job(IntPtr hbHandle, int jobIndex);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_chapter_name", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_chapter_name(IntPtr hbHandle, int title_index, int chapter_index, [In] [MarshalAs(UnmanagedType.LPStr)] string chapter_name);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_set_job", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_set_job(IntPtr hbHandle, int title_index, ref hb_job_s job);\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: hb_job_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_add", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_add(IntPtr hbHandle, ref hb_job_s job);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: hb_job_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_rem", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_rem(IntPtr hbHandle, IntPtr job);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_start", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_start(IntPtr hbHandle);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_pause", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_pause(IntPtr hbHandle);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_resume", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_resume(IntPtr hbHandle);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_stop", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_stop(IntPtr hbHandle);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_filter_object", CallingConvention = CallingConvention.Cdecl)]\r
+        //public static extern IntPtr hb_get_filter_object(int filter_id, [In] [MarshalAs(UnmanagedType.LPStr)] string settings);\r
+        public static extern IntPtr hb_get_filter_object(int filter_id, IntPtr settings);\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: hb_state_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_state", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_get_state(IntPtr hbHandle, ref hb_state_s state);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t*\r
+        ///param1: hb_state_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_state2", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_get_state2(ref hb_handle_s param0, ref hb_state_s param1);\r
+\r
+\r
+        /// Return Type: int\r
+        ///param0: hb_handle_t*\r
+        [DllImport("hb.dll", EntryPoint = "hb_get_scancount", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern int hb_get_scancount(ref hb_handle_s param0);\r
+\r
+\r
+        /// Return Type: void\r
+        ///param0: hb_handle_t**\r
+        [DllImport("hb.dll", EntryPoint = "hb_close", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_close(IntPtr hbHandle);\r
+\r
+        [DllImport("hb.dll", EntryPoint = "hb_global_close", CallingConvention = CallingConvention.Cdecl)]\r
+        public static extern void hb_global_close();\r
+    }\r
+}\r
diff --git a/win/C#/interop/InteropUtilities.cs b/win/C#/interop/InteropUtilities.cs
new file mode 100644 (file)
index 0000000..d53c688
--- /dev/null
@@ -0,0 +1,120 @@
+namespace HandBrake.Interop\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Linq;\r
+    using System.Text;\r
+    using System.Runtime.InteropServices;\r
+\r
+    /// <summary>\r
+    /// Helper utilities for native interop.\r
+    /// </summary>\r
+    public static class InteropUtilities\r
+    {\r
+        /// <summary>\r
+        /// Reads the given native structure pointer.\r
+        /// </summary>\r
+        /// <typeparam name="T">The type to convert the structure to.</typeparam>\r
+        /// <param name="structPtr">The pointer to the native structure.</param>\r
+        /// <returns>The converted structure.</returns>\r
+        public static T ReadStructure<T>(IntPtr structPtr)\r
+        {\r
+            return (T)Marshal.PtrToStructure(structPtr, typeof(T));\r
+        }\r
+\r
+        /// <summary>\r
+        /// Converts the given native HandBrake list to a managed list.\r
+        /// </summary>\r
+        /// <typeparam name="T">The type of structure in the list.</typeparam>\r
+        /// <param name="listPtr">The pointer to the native list.</param>\r
+        /// <returns>The converted managed list.</returns>\r
+        public static List<T> ConvertList<T>(IntPtr listPtr)\r
+        {\r
+            List<T> returnList = new List<T>();\r
+            hb_list_s itemList = ReadStructure<hb_list_s>(listPtr);\r
+\r
+            for (int i = 0; i < itemList.items_count; i++)\r
+            {\r
+                IntPtr itemPtr = Marshal.ReadIntPtr(itemList.items, i * Marshal.SizeOf(typeof(IntPtr)));\r
+                returnList.Add(ReadStructure<T>(itemPtr));\r
+            }\r
+\r
+            return returnList;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Creates a native HandBrake list from the given managed list of pointers.\r
+        /// </summary>\r
+        /// <param name="list">The managed list to convert.</param>\r
+        /// <returns>The converted native list.</returns>\r
+        public static NativeList CreateIntPtrList(List<IntPtr> list)\r
+        {\r
+            NativeList returnList = new NativeList();\r
+            int intSize = Marshal.SizeOf(typeof(IntPtr));\r
+\r
+            IntPtr nativeListInternal = Marshal.AllocHGlobal(list.Count * intSize);\r
+            returnList.AllocatedMemory.Add(nativeListInternal);\r
+            for (int i = 0; i < list.Count; i++)\r
+            {\r
+                Marshal.WriteIntPtr(nativeListInternal, i * intSize, list[i]);\r
+            }\r
+\r
+            hb_list_s nativeListStruct = new hb_list_s();\r
+            nativeListStruct.items = nativeListInternal;\r
+            nativeListStruct.items_alloc = list.Count;\r
+            nativeListStruct.items_count = list.Count;\r
+\r
+            IntPtr nativeListStructPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(hb_list_s)));\r
+            Marshal.StructureToPtr(nativeListStruct, nativeListStructPtr, false);\r
+\r
+            returnList.ListPtr = nativeListStructPtr;\r
+            return returnList;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Creates a native HandBrake list from the given managed list of structures.\r
+        /// </summary>\r
+        /// <typeparam name="T">The type of structures in the list.</typeparam>\r
+        /// <param name="list">The managed list to convert.</param>\r
+        /// <returns>The converted native list.</returns>\r
+        public static NativeList ConvertListBack<T>(List<T> list)\r
+        {\r
+            NativeList returnList = new NativeList();\r
+            int intSize = Marshal.SizeOf(typeof(IntPtr));\r
+\r
+            IntPtr nativeListInternal = Marshal.AllocHGlobal(list.Count * intSize);\r
+            returnList.AllocatedMemory.Add(nativeListInternal);\r
+            for (int i = 0; i < list.Count; i++)\r
+            {\r
+                IntPtr itemPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));\r
+                returnList.AllocatedMemory.Add(itemPtr);\r
+                Marshal.StructureToPtr(list[i], itemPtr, false);\r
+\r
+                Marshal.WriteIntPtr(nativeListInternal, i * intSize, itemPtr);\r
+            }\r
+\r
+            hb_list_s nativeListStruct = new hb_list_s();\r
+            nativeListStruct.items = nativeListInternal;\r
+            nativeListStruct.items_alloc = list.Count;\r
+            nativeListStruct.items_count = list.Count;\r
+\r
+            IntPtr nativeListStructPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(hb_list_s)));\r
+            Marshal.StructureToPtr(nativeListStruct, nativeListStructPtr, false);\r
+\r
+            returnList.ListPtr = nativeListStructPtr;\r
+            return returnList;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Frees all the memory locations in the given list.\r
+        /// </summary>\r
+        /// <param name="memoryList">The list of memory locations to free.</param>\r
+        public static void FreeMemory(List<IntPtr> memoryList)\r
+        {\r
+            foreach (IntPtr memoryLocation in memoryList)\r
+            {\r
+                Marshal.FreeHGlobal(memoryLocation);\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Language.cs b/win/C#/interop/Language.cs
new file mode 100644 (file)
index 0000000..609a4ec
--- /dev/null
@@ -0,0 +1,38 @@
+namespace HandBrake.Interop\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Linq;\r
+    using System.Text;\r
+\r
+    /// <summary>\r
+    /// Represents a language.\r
+    /// </summary>\r
+    public class Language\r
+    {\r
+        /// <summary>\r
+        /// Initializes a new instance of the Language class.\r
+        /// </summary>\r
+        /// <param name="code">The code for the langauge.</param>\r
+        public Language(string code)\r
+        {\r
+            this.Code = code;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets the friendly name of the language.\r
+        /// </summary>\r
+        public string Name\r
+        {\r
+            get\r
+            {\r
+                return LanguageCodes.Decode(this.Code);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the language code.\r
+        /// </summary>\r
+        public string Code { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/LanguageCodes.cs b/win/C#/interop/LanguageCodes.cs
new file mode 100644 (file)
index 0000000..0d45cc1
--- /dev/null
@@ -0,0 +1,255 @@
+namespace HandBrake.Interop\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Linq;\r
+    using System.Text;\r
+\r
+    /// <summary>\r
+    /// Contains utilities for converting language codes.\r
+    /// </summary>\r
+    public static class LanguageCodes\r
+    {\r
+        /// <summary>\r
+        /// The map of language codes to friendly names.\r
+        /// </summary>\r
+        private static Dictionary<string, string> languageMap;\r
+\r
+        /// <summary>\r
+        /// Gets the map of language codes to friendly names.\r
+        /// </summary>\r
+        private static Dictionary<string, string> LanguageMap\r
+        {\r
+            get\r
+            {\r
+                if (languageMap == null)\r
+                {\r
+                    languageMap = new Dictionary<string, string>\r
+                    {\r
+                        {"und", "Unspecified"},\r
+                        {"eng", "English"},\r
+                        {"deu", "Deutsch"},\r
+                        {"fra", "Français"},\r
+                        {"spa", "Español"},\r
+                        {"rus", "Russian"},\r
+                        {"aar", "Afar"},\r
+                        {"abk", "Abkhazian"},\r
+                        {"afr", "Afrikaans"},\r
+                        {"aka", "Akan"},\r
+                        {"sqi", "Albanian"},\r
+                        {"amh", "Amharic"},\r
+                        {"ara", "Arabic"},\r
+                        {"arg", "Aragonese"},\r
+                        {"hye", "Armenian"},\r
+                        {"asm", "Assamese"},\r
+                        {"ava", "Avaric"},\r
+                        {"ave", "Avestan"},\r
+                        {"aym", "Aymara"},\r
+                        {"aze", "Azerbaijani"},\r
+                        {"bak", "Bashkir"},\r
+                        {"bam", "Bambara"},\r
+                        {"eus", "Basque"},\r
+                        {"bel", "Belarusian"},\r
+                        {"ben", "Bengali"},\r
+                        {"bih", "Bihari"},\r
+                        {"bis", "Bislama"},\r
+                        {"bos", "Bosnian"},\r
+                        {"bre", "Breton"},\r
+                        {"bul", "Bulgarian"},\r
+                        {"mya", "Burmese"},\r
+                        {"cat", "Catalan"},\r
+                        {"cha", "Chamorro"},\r
+                        {"che", "Chechen"},\r
+                        {"zho", "Chinese"},\r
+                        {"chu", "Church Slavic"},\r
+                        {"chv", "Chuvash"},\r
+                        {"cor", "Cornish"},\r
+                        {"cos", "Corsican"},\r
+                        {"cre", "Cree"},\r
+                        {"ces", "Czech"},\r
+                        {"dan", "Dansk"},\r
+                        {"div", "Divehi"},\r
+                        {"nld", "Nederlands"},\r
+                        {"dzo", "Dzongkha"},\r
+                        {"epo", "Esperanto"},\r
+                        {"est", "Estonian"},\r
+                        {"ewe", "Ewe"},\r
+                        {"fao", "Faroese"},\r
+                        {"fij", "Fijian"},\r
+                        {"fin", "Suomi"},\r
+                        {"fry", "Western Frisian"},\r
+                        {"ful", "Fulah"},\r
+                        {"kat", "Georgian"},\r
+                        {"gla", "Gaelic (Scots)"},\r
+                        {"gle", "Irish"},\r
+                        {"glg", "Galician"},\r
+                        {"glv", "Manx"},\r
+                        {"ell", "Greek Modern"},\r
+                        {"grn", "Guarani"},\r
+                        {"guj", "Gujarati"},\r
+                        {"hat", "Haitian"},\r
+                        {"hau", "Hausa"},\r
+                        {"heb", "Hebrew"},\r
+                        {"her", "Herero"},\r
+                        {"hin", "Hindi"},\r
+                        {"hmo", "Hiri Motu"},\r
+                        {"hun", "Magyar"},\r
+                        {"ibo", "Igbo"},\r
+                        {"isl", "Islenska"},\r
+                        {"ido", "Ido"},\r
+                        {"iii", "Sichuan Yi"},\r
+                        {"iku", "Inuktitut"},\r
+                        {"ile", "Interlingue"},\r
+                        {"ina", "Interlingua"},\r
+                        {"ind", "Indonesian"},\r
+                        {"ipk", "Inupiaq"},\r
+                        {"ita", "Italiano"},\r
+                        {"jav", "Javanese"},\r
+                        {"jpn", "Japanese"},\r
+                        {"kal", "Kalaallisut"},\r
+                        {"kan", "Kannada"},\r
+                        {"kas", "Kashmiri"},\r
+                        {"kau", "Kanuri"},\r
+                        {"kaz", "Kazakh"},\r
+                        {"khm", "Central Khmer"},\r
+                        {"kik", "Kikuyu"},\r
+                        {"kin", "Kinyarwanda"},\r
+                        {"kir", "Kirghiz"},\r
+                        {"kom", "Komi"},\r
+                        {"kon", "Kongo"},\r
+                        {"kor", "Korean"},\r
+                        {"kua", "Kuanyama"},\r
+                        {"kur", "Kurdish"},\r
+                        {"lao", "Lao"},\r
+                        {"lat", "Latin"},\r
+                        {"lav", "Latvian"},\r
+                        {"lim", "Limburgan"},\r
+                        {"lin", "Lingala"},\r
+                        {"lit", "Lithuanian"},\r
+                        {"ltz", "Luxembourgish"},\r
+                        {"lub", "Luba-Katanga"},\r
+                        {"lug", "Ganda"},\r
+                        {"mkd", "Macedonian"},\r
+                        {"mah", "Marshallese"},\r
+                        {"mal", "Malayalam"},\r
+                        {"mri", "Maori"},\r
+                        {"mar", "Marathi"},\r
+                        {"msa", "Malay"},\r
+                        {"mlg", "Malagasy"},\r
+                        {"mlt", "Maltese"},\r
+                        {"mol", "Moldavian"},\r
+                        {"mon", "Mongolian"},\r
+                        {"nau", "Nauru"},\r
+                        {"nav", "Navajo"},\r
+                        {"nbl", "Ndebele, South"},\r
+                        {"nde", "Ndebele, North"},\r
+                        {"ndo", "Ndonga"},\r
+                        {"nep", "Nepali"},\r
+                        {"nno", "Norwegian Nynorsk"},\r
+                        {"nob", "Norwegian BokmÃ¥l"},\r
+                        {"nor", "Norsk"},\r
+                        {"nya", "Chichewa; Nyanja"},\r
+                        {"oci", "Occitan"},\r
+                        {"oji", "Ojibwa"},\r
+                        {"ori", "Oriya"},\r
+                        {"orm", "Oromo"},\r
+                        {"oss", "Ossetian"},\r
+                        {"pan", "Panjabi"},\r
+                        {"fas", "Persian"},\r
+                        {"pli", "Pali"},\r
+                        {"pol", "Polish"},\r
+                        {"por", "Portugues"},\r
+                        {"pus", "Pushto"},\r
+                        {"que", "Quechua"},\r
+                        {"roh", "Romansh"},\r
+                        {"ron", "Romanian"},\r
+                        {"run", "Rundi"},\r
+                        {"sag", "Sango"},\r
+                        {"san", "Sanskrit"},\r
+                        {"srp", "Serbian"},\r
+                        {"hrv", "Hrvatski"},\r
+                        {"sin", "Sinhala"},\r
+                        {"slk", "Slovak"},\r
+                        {"slv", "Slovenian"},\r
+                        {"sme", "Northern Sami"},\r
+                        {"smo", "Samoan"},\r
+                        {"sna", "Shona"},\r
+                        {"snd", "Sindhi"},\r
+                        {"som", "Somali"},\r
+                        {"sot", "Sotho Southern"},\r
+                        {"srd", "Sardinian"},\r
+                        {"ssw", "Swati"},\r
+                        {"sun", "Sundanese"},\r
+                        {"swa", "Swahili"},\r
+                        {"swe", "Svenska"},\r
+                        {"tah", "Tahitian"},\r
+                        {"tam", "Tamil"},\r
+                        {"tat", "Tatar"},\r
+                        {"tel", "Telugu"},\r
+                        {"tgk", "Tajik"},\r
+                        {"tgl", "Tagalog"},\r
+                        {"tha", "Thai"},\r
+                        {"bod", "Tibetan"},\r
+                        {"tir", "Tigrinya"},\r
+                        {"ton", "Tonga"},\r
+                        {"tsn", "Tswana"},\r
+                        {"tso", "Tsonga"},\r
+                        {"tuk", "Turkmen"},\r
+                        {"tur", "Turkish"},\r
+                        {"twi", "Twi"},\r
+                        {"uig", "Uighur"},\r
+                        {"ukr", "Ukrainian"},\r
+                        {"urd", "Urdu"},\r
+                        {"uzb", "Uzbek"},\r
+                        {"ven", "Venda"},\r
+                        {"vie", "Vietnamese"},\r
+                        {"vol", "Volapük"},\r
+                        {"cym", "Welsh"},\r
+                        {"wln", "Walloon"},\r
+                        {"wol", "Wolof"},\r
+                        {"xho", "Xhosa"},\r
+                        {"yid", "Yiddish"},\r
+                        {"yor", "Yoruba"},\r
+                        {"zha", "Zhuang"},\r
+                        {"zul", "Zulu"}\r
+                    };\r
+                }\r
+\r
+                return languageMap;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gets a list of all languages.\r
+        /// </summary>\r
+        public static IList<Language> Languages\r
+        {\r
+            get\r
+            {\r
+                List<Language> languages = new List<Language>();\r
+\r
+                foreach (string languageCode in LanguageMap.Keys)\r
+                {\r
+                    languages.Add(new Language(languageCode));\r
+                }\r
+\r
+                return languages;\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Gives the friendly name of the language with the given code.\r
+        /// </summary>\r
+        /// <param name="languageCode">The language code.</param>\r
+        /// <returns>The friendly name of the language.</returns>\r
+        public static string Decode(string languageCode)\r
+        {\r
+            if (LanguageMap.ContainsKey(languageCode))\r
+            {\r
+                return LanguageMap[languageCode];\r
+            }\r
+\r
+            return "Unknown";\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/MessageLoggedEventArgs.cs b/win/C#/interop/MessageLoggedEventArgs.cs
new file mode 100644 (file)
index 0000000..a73b5ca
--- /dev/null
@@ -0,0 +1,12 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class MessageLoggedEventArgs : EventArgs\r
+    {\r
+        public string Message { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Cropping.cs b/win/C#/interop/Model/Cropping.cs
new file mode 100644 (file)
index 0000000..1ba0e8e
--- /dev/null
@@ -0,0 +1,15 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class Cropping\r
+    {\r
+        public int Top { get; set; }\r
+        public int Bottom { get; set; }\r
+        public int Left { get; set; }\r
+        public int Right { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/EncodeJob.cs b/win/C#/interop/Model/EncodeJob.cs
new file mode 100644 (file)
index 0000000..53058a9
--- /dev/null
@@ -0,0 +1,69 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Xml.Serialization;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class EncodeJob\r
+    {\r
+        public SourceType SourceType { get; set; }\r
+        public string SourcePath { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the 1-based index of the title to encode.\r
+        /// </summary>\r
+        public int Title { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the angle to encode. 0 for default, 1+ for specified angle.\r
+        /// </summary>\r
+        public int Angle { get; set; }\r
+        public int ChapterStart { get; set; }\r
+        public int ChapterEnd { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets or sets the list of chosen audio tracks (1-based)\r
+        /// </summary>\r
+        public List<int> ChosenAudioTracks { get; set; }\r
+        public Subtitles Subtitles { get; set; }\r
+        public bool UseDefaultChapterNames { get; set; }\r
+        public List<string> CustomChapterNames { get; set; }\r
+\r
+        public string OutputPath { get; set; }\r
+\r
+        public EncodingProfile EncodingProfile { get; set; }\r
+\r
+        // The length of video to encode.\r
+        [XmlIgnore]\r
+        public TimeSpan Length { get; set; }\r
+\r
+        [XmlElement("Length")]\r
+        public string XmlLength\r
+        {\r
+            get { return this.Length.ToString(); }\r
+            set { this.Length = TimeSpan.Parse(value); }\r
+        }\r
+\r
+        public EncodeJob Clone()\r
+        {\r
+            EncodeJob clone = new EncodeJob\r
+            {\r
+                SourceType = this.SourceType,\r
+                SourcePath = this.SourcePath,\r
+                Title = this.Title,\r
+                ChapterStart = this.ChapterStart,\r
+                ChapterEnd = this.ChapterEnd,\r
+                ChosenAudioTracks = new List<int>(this.ChosenAudioTracks),\r
+                Subtitles = this.Subtitles,\r
+                UseDefaultChapterNames = this.UseDefaultChapterNames,\r
+                OutputPath = this.OutputPath,\r
+                EncodingProfile = this.EncodingProfile,\r
+                Length = this.Length\r
+            };\r
+\r
+            return clone;\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Anamorphic.cs b/win/C#/interop/Model/Encoding/Anamorphic.cs
new file mode 100644 (file)
index 0000000..65a7f23
--- /dev/null
@@ -0,0 +1,19 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Anamorphic\r
+    {\r
+        [DisplayString("None")]\r
+        None = 0,\r
+        [DisplayString("Strict")]\r
+        Strict,\r
+        [DisplayString("Loose")]\r
+        Loose,\r
+        [DisplayString("Custom")]\r
+        Custom\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/AudioEncoder.cs b/win/C#/interop/Model/Encoding/AudioEncoder.cs
new file mode 100644 (file)
index 0000000..b4eee52
--- /dev/null
@@ -0,0 +1,25 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum AudioEncoder\r
+    {\r
+        [DisplayString("AAC (faac)")]\r
+        Faac = 0,\r
+\r
+        [DisplayString("MP3 (lame)")]\r
+        Lame,\r
+\r
+        [DisplayString("AC3 Passthrough")]\r
+        Ac3Passthrough,\r
+\r
+        [DisplayString("DTS Passthrough")]\r
+        DtsPassthrough,\r
+\r
+        [DisplayString("Vorbis (vorbis)")]\r
+        Vorbis\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/AudioEncoding.cs b/win/C#/interop/Model/Encoding/AudioEncoding.cs
new file mode 100644 (file)
index 0000000..8ff112c
--- /dev/null
@@ -0,0 +1,17 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class AudioEncoding\r
+    {\r
+        public int InputNumber { get; set; }\r
+        public AudioEncoder Encoder { get; set; }\r
+        public int Bitrate { get; set; }\r
+        public Mixdown Mixdown { get; set; }\r
+        public string SampleRate { get; set; }\r
+        public double Drc { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Decomb.cs b/win/C#/interop/Model/Encoding/Decomb.cs
new file mode 100644 (file)
index 0000000..9060b01
--- /dev/null
@@ -0,0 +1,14 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Decomb\r
+    {\r
+        Off = 0,\r
+        Default,\r
+        Custom\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Deinterlace.cs b/win/C#/interop/Model/Encoding/Deinterlace.cs
new file mode 100644 (file)
index 0000000..365f600
--- /dev/null
@@ -0,0 +1,16 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Deinterlace\r
+    {\r
+        Off = 0,\r
+        Fast,\r
+        Slow,\r
+        Slower,\r
+        Custom\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Denoise.cs b/win/C#/interop/Model/Encoding/Denoise.cs
new file mode 100644 (file)
index 0000000..146cbfd
--- /dev/null
@@ -0,0 +1,16 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Denoise\r
+    {\r
+        Off = 0,\r
+        Weak,\r
+        Medium,\r
+        Strong,\r
+        Custom\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Detelecine.cs b/win/C#/interop/Model/Encoding/Detelecine.cs
new file mode 100644 (file)
index 0000000..028abf4
--- /dev/null
@@ -0,0 +1,14 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Detelecine\r
+    {\r
+        Off = 0,\r
+        Default,\r
+        Custom\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/EncodingProfile.cs b/win/C#/interop/Model/Encoding/EncodingProfile.cs
new file mode 100644 (file)
index 0000000..af287a7
--- /dev/null
@@ -0,0 +1,113 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class EncodingProfile\r
+    {\r
+        public EncodingProfile()\r
+        {\r
+            this.Cropping = new Cropping();\r
+        }\r
+\r
+        public OutputFormat OutputFormat { get; set; }\r
+        public OutputExtension PreferredExtension { get; set; }\r
+        public bool IncludeChapterMarkers { get; set; }\r
+        public bool LargeFile { get; set; }\r
+        public bool Optimize { get; set; }\r
+        public bool IPod5GSupport { get; set; }\r
+\r
+        public int Width { get; set; }\r
+        public int Height { get; set; }\r
+        public int MaxWidth { get; set; }\r
+        public int MaxHeight { get; set; }\r
+        public bool CustomCropping { get; set; }\r
+        public Cropping Cropping { get; set; }\r
+        public Anamorphic Anamorphic { get; set; }\r
+        public bool UseDisplayWidth { get; set; }\r
+        public int DisplayWidth { get; set; }\r
+        public bool KeepDisplayAspect { get; set; }\r
+        public int PixelAspectX { get; set; }\r
+        public int PixelAspectY { get; set; }\r
+        public int Modulus { get; set; }\r
+\r
+        public Deinterlace Deinterlace { get; set; }\r
+        public string CustomDeinterlace { get; set; }\r
+        public Decomb Decomb { get; set; }\r
+        public string CustomDecomb { get; set; }\r
+        public Detelecine Detelecine { get; set; }\r
+        public string CustomDetelecine { get; set; }\r
+        public Denoise Denoise { get; set; }\r
+        public string CustomDenoise { get; set; }\r
+        public int Deblock { get; set; }\r
+        public bool Grayscale { get; set; }\r
+\r
+        public VideoEncoder VideoEncoder { get; set; }\r
+        public string X264Options { get; set; }\r
+        public VideoEncodeRateType VideoEncodeRateType { get; set; }\r
+        public double Quality { get; set; }\r
+        public int TargetSize { get; set; }\r
+        public int VideoBitrate { get; set; }\r
+        public bool TwoPass { get; set; }\r
+        public bool TurboFirstPass { get; set; }\r
+        public double Framerate { get; set; }\r
+        public bool PeakFramerate { get; set; }\r
+\r
+        public List<AudioEncoding> AudioEncodings { get; set; }\r
+\r
+        public EncodingProfile Clone()\r
+        {\r
+            EncodingProfile profile = new EncodingProfile\r
+            {\r
+                OutputFormat = this.OutputFormat,\r
+                PreferredExtension = this.PreferredExtension,\r
+                IncludeChapterMarkers = this.IncludeChapterMarkers,\r
+                LargeFile = this.LargeFile,\r
+                Optimize = this.Optimize,\r
+                IPod5GSupport = this.IPod5GSupport,\r
+\r
+                Width = this.Width,\r
+                Height = this.Height,\r
+                MaxWidth = this.MaxWidth,\r
+                MaxHeight = this.MaxHeight,\r
+                CustomCropping = this.CustomCropping,\r
+                Cropping = this.Cropping,\r
+                Anamorphic = this.Anamorphic,\r
+                UseDisplayWidth = this.UseDisplayWidth,\r
+                DisplayWidth = this.DisplayWidth,\r
+                KeepDisplayAspect = this.KeepDisplayAspect,\r
+                PixelAspectX = this.PixelAspectX,\r
+                PixelAspectY = this.PixelAspectY,\r
+                Modulus = this.Modulus,\r
+\r
+                Deinterlace = this.Deinterlace,\r
+                CustomDeinterlace = this.CustomDeinterlace,\r
+                Decomb = this.Decomb,\r
+                CustomDecomb = this.CustomDecomb,\r
+                Detelecine = this.Detelecine,\r
+                CustomDetelecine = this.CustomDetelecine,\r
+                Denoise = this.Denoise,\r
+                CustomDenoise = this.CustomDenoise,\r
+                Deblock = this.Deblock,\r
+                Grayscale = this.Grayscale,\r
+\r
+                VideoEncoder = this.VideoEncoder,\r
+                X264Options = this.X264Options,\r
+                VideoEncodeRateType = this.VideoEncodeRateType,\r
+                Quality = this.Quality,\r
+                TargetSize = this.TargetSize,\r
+                VideoBitrate = this.VideoBitrate,\r
+                TwoPass = this.TwoPass,\r
+                TurboFirstPass = this.TurboFirstPass,\r
+                Framerate = this.Framerate,\r
+                PeakFramerate = this.PeakFramerate,\r
+\r
+                AudioEncodings = new List<AudioEncoding>(this.AudioEncodings)\r
+            };\r
+\r
+            return profile;\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/Mixdown.cs b/win/C#/interop/Model/Encoding/Mixdown.cs
new file mode 100644 (file)
index 0000000..2049d09
--- /dev/null
@@ -0,0 +1,25 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum Mixdown\r
+    {\r
+        [DisplayString("Dolby Pro Logic II")]\r
+        DolbyProLogicII = 0,\r
+\r
+        [DisplayString("Mono")]\r
+        Mono,\r
+\r
+        [DisplayString("Stereo")]\r
+        Stereo,\r
+\r
+        [DisplayString("Dolby Surround")]\r
+        DolbySurround,\r
+\r
+        [DisplayString("6 Channel Discrete")]\r
+        SixChannelDiscrete\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/OutputExtension.cs b/win/C#/interop/Model/Encoding/OutputExtension.cs
new file mode 100644 (file)
index 0000000..bcf7095
--- /dev/null
@@ -0,0 +1,13 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum OutputExtension\r
+    {\r
+        Mp4,\r
+        M4v\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/OutputFormat.cs b/win/C#/interop/Model/Encoding/OutputFormat.cs
new file mode 100644 (file)
index 0000000..52549e7
--- /dev/null
@@ -0,0 +1,16 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.ComponentModel;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum OutputFormat\r
+    {\r
+        [DisplayString("MP4")]\r
+        Mp4,\r
+        [DisplayString("MKV")]\r
+        Mkv\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/VideoEncodeRateType.cs b/win/C#/interop/Model/Encoding/VideoEncodeRateType.cs
new file mode 100644 (file)
index 0000000..6c39e54
--- /dev/null
@@ -0,0 +1,14 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum VideoEncodeRateType\r
+    {\r
+        TargetSize = 0,\r
+        AverageBitrate,\r
+        ConstantQuality\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Encoding/VideoEncoder.cs b/win/C#/interop/Model/Encoding/VideoEncoder.cs
new file mode 100644 (file)
index 0000000..912117b
--- /dev/null
@@ -0,0 +1,19 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public enum VideoEncoder\r
+    {\r
+        [DisplayString("H.264 (x264)")]\r
+        X264 = 0,\r
+\r
+        [DisplayString("MPEG-4 (FFMpeg)")]\r
+        FFMpeg,\r
+\r
+        [DisplayString("VP3 (Theora)")]\r
+        Theora\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Size.cs b/win/C#/interop/Model/Size.cs
new file mode 100644 (file)
index 0000000..f94cbd2
--- /dev/null
@@ -0,0 +1,19 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class Size\r
+    {\r
+        public Size(int width, int height)\r
+        {\r
+            this.Width = width;\r
+            this.Height = height;\r
+        }\r
+\r
+        public int Width { get; set; }\r
+        public int Height { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/SourceSubtitle.cs b/win/C#/interop/Model/SourceSubtitle.cs
new file mode 100644 (file)
index 0000000..edfb68b
--- /dev/null
@@ -0,0 +1,29 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class SourceSubtitle\r
+    {\r
+        /// <summary>\r
+        /// Gets or sets the 1-based subtitle track number. 0 means foriegn audio search.\r
+        /// </summary>\r
+        public int TrackNumber { get; set; }\r
+        public bool Default { get; set; }\r
+        public bool Forced { get; set; }\r
+        public bool BurnedIn { get; set; }\r
+\r
+        public SourceSubtitle Clone()\r
+        {\r
+            return new SourceSubtitle\r
+            {\r
+                TrackNumber = this.TrackNumber,\r
+                Default = this.Default,\r
+                Forced = this.Forced,\r
+                BurnedIn = this.BurnedIn\r
+            };\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/SourceType.cs b/win/C#/interop/Model/SourceType.cs
new file mode 100644 (file)
index 0000000..1a53aab
--- /dev/null
@@ -0,0 +1,10 @@
+namespace HandBrake.Interop\r
+{\r
+    public enum SourceType\r
+    {\r
+        None = 0,\r
+        File,\r
+        VideoFolder,\r
+        Dvd\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/interop/Model/SrtSubtitle.cs b/win/C#/interop/Model/SrtSubtitle.cs
new file mode 100644 (file)
index 0000000..199fe6a
--- /dev/null
@@ -0,0 +1,28 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class SrtSubtitle\r
+    {\r
+        public bool Default { get; set; }\r
+        public string FileName { get; set; }\r
+        public string LanguageCode { get; set; }\r
+        public string CharacterCode { get; set; }\r
+        public int Offset { get; set; }\r
+\r
+        public SrtSubtitle Clone()\r
+        {\r
+            return new SrtSubtitle\r
+            {\r
+                Default = this.Default,\r
+                FileName = this.FileName,\r
+                LanguageCode = this.LanguageCode,\r
+                CharacterCode = this.CharacterCode,\r
+                Offset = this.Offset\r
+            };\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Model/Subtitles.cs b/win/C#/interop/Model/Subtitles.cs
new file mode 100644 (file)
index 0000000..1fab735
--- /dev/null
@@ -0,0 +1,13 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class Subtitles\r
+    {\r
+        public List<SrtSubtitle> SrtSubtitles { get; set; }\r
+        public List<SourceSubtitle> SourceSubtitles { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/NativeList.cs b/win/C#/interop/NativeList.cs
new file mode 100644 (file)
index 0000000..c16c099
--- /dev/null
@@ -0,0 +1,34 @@
+namespace HandBrake.Interop\r
+{\r
+    using System;\r
+    using System.Collections.Generic;\r
+    using System.Linq;\r
+    using System.Text;\r
+\r
+    /// <summary>\r
+    /// Represents a HandBrake style native list.\r
+    /// </summary>\r
+    public class NativeList\r
+    {\r
+        /// <summary>\r
+        /// The list of native memory locations allocated for this list.\r
+        /// </summary>\r
+        private List<IntPtr> allocatedMemory = new List<IntPtr>();\r
+\r
+        /// <summary>\r
+        /// Gets or sets the pointer to the native list.\r
+        /// </summary>\r
+        public IntPtr ListPtr { get; set; }\r
+\r
+        /// <summary>\r
+        /// Gets the list of native memory locations allocated for this list.\r
+        /// </summary>\r
+        public List<IntPtr> AllocatedMemory\r
+        {\r
+            get\r
+            {\r
+                return allocatedMemory;\r
+            }\r
+        }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Properties/AssemblyInfo.cs b/win/C#/interop/Properties/AssemblyInfo.cs
new file mode 100644 (file)
index 0000000..228f27c
--- /dev/null
@@ -0,0 +1,36 @@
+using System.Reflection;\r
+using System.Runtime.CompilerServices;\r
+using System.Runtime.InteropServices;\r
+\r
+// General Information about an assembly is controlled through the following \r
+// set of attributes. Change these attribute values to modify the information\r
+// associated with an assembly.\r
+[assembly: AssemblyTitle("HandBrakeInterop")]\r
+[assembly: AssemblyDescription("")]\r
+[assembly: AssemblyConfiguration("")]\r
+[assembly: AssemblyCompany("Microsoft")]\r
+[assembly: AssemblyProduct("HandBrakeInterop")]\r
+[assembly: AssemblyCopyright("Copyright Â© Microsoft 2010")]\r
+[assembly: AssemblyTrademark("")]\r
+[assembly: AssemblyCulture("")]\r
+\r
+// Setting ComVisible to false makes the types in this assembly not visible \r
+// to COM components.  If you need to access a type in this assembly from \r
+// COM, set the ComVisible attribute to true on that type.\r
+[assembly: ComVisible(false)]\r
+\r
+// The following GUID is for the ID of the typelib if this project is exposed to COM\r
+[assembly: Guid("cc59844b-9e1b-4854-8b92-3b24c646aee5")]\r
+\r
+// Version information for an assembly consists of the following four values:\r
+//\r
+//      Major Version\r
+//      Minor Version \r
+//      Build Number\r
+//      Revision\r
+//\r
+// You can specify all the values or you can default the Build and Revision Numbers \r
+// by using the '*' as shown below:\r
+// [assembly: AssemblyVersion("1.0.*")]\r
+[assembly: AssemblyVersion("1.5.0.0")]\r
+[assembly: AssemblyFileVersion("1.5.0.0")]\r
diff --git a/win/C#/interop/ScanProgressEventArgs.cs b/win/C#/interop/ScanProgressEventArgs.cs
new file mode 100644 (file)
index 0000000..f7e3a0f
--- /dev/null
@@ -0,0 +1,13 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.Interop\r
+{\r
+    public class ScanProgressEventArgs : EventArgs\r
+    {\r
+        public int CurrentTitle { get; set; }\r
+        public int Titles { get; set; }\r
+    }\r
+}\r
diff --git a/win/C#/interop/Settings.StyleCop b/win/C#/interop/Settings.StyleCop
new file mode 100644 (file)
index 0000000..c6b4f70
--- /dev/null
@@ -0,0 +1,55 @@
+<StyleCopSettings Version="4.3">\r
+  <GlobalSettings>\r
+    <StringProperty Name="MergeSettingsFiles">Parent</StringProperty>\r
+  </GlobalSettings>\r
+  <Analyzers>\r
+    <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.DocumentationRules">\r
+      <Rules>\r
+        <Rule Name="FileHeaderMustShowCopyright">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustHaveCopyrightText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustContainFileName">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderFileNameDocumentationMustMatchFileName">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustHaveValidCompanyText">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileMustHaveHeader">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="FileHeaderMustHaveSummary">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">True</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+        <Rule Name="EnumerationItemsMustBeDocumented">\r
+          <RuleSettings>\r
+            <BooleanProperty Name="Enabled">False</BooleanProperty>\r
+          </RuleSettings>\r
+        </Rule>\r
+      </Rules>\r
+      <AnalyzerSettings>\r
+        <StringProperty Name="CompanyName">HandBrake Project (http://handbrake.fr)</StringProperty>\r
+        <StringProperty Name="Copyright">This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.</StringProperty>\r
+      </AnalyzerSettings>\r
+    </Analyzer>\r
+  </Analyzers>\r
+</StyleCopSettings>
\ No newline at end of file
diff --git a/win/C#/interop/SourceData/AudioTrack.cs b/win/C#/interop/SourceData/AudioTrack.cs
new file mode 100644 (file)
index 0000000..735ddd9
--- /dev/null
@@ -0,0 +1,80 @@
+/*  AudioTrack.cs $\r
+       \r
+          This file is part of the HandBrake source code.\r
+          Homepage: <http://handbrake.fr>.\r
+          It may be used under the terms of the GNU General Public License. */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.IO;\r
+using System.Text.RegularExpressions;\r
+\r
+namespace HandBrake.SourceData\r
+{\r
+    /// <summary>\r
+    /// An object represending an AudioTrack associated with a Title, in a DVD\r
+    /// </summary>\r
+    public class AudioTrack\r
+    {\r
+        /// <summary>\r
+        /// The track number of this Audio Track\r
+        /// </summary>\r
+        public int TrackNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// The language (if detected) of this Audio Track\r
+        /// </summary>\r
+        public string Language { get; set; }\r
+\r
+        public string LanguageCode { get; set; }\r
+\r
+        public string Description { get; set; }\r
+\r
+        /// <summary>\r
+        /// The frequency (in MHz) of this Audio Track\r
+        /// </summary>\r
+        public int SampleRate { get; set; }\r
+\r
+        /// <summary>\r
+        /// The bitrate (in kbps) of this Audio Track\r
+        /// </summary>\r
+        public int Bitrate { get; set; }\r
+\r
+        public string Display\r
+        {\r
+            get\r
+            {\r
+                return this.GetDisplayString(true);\r
+            }\r
+        }\r
+\r
+        public string NoTrackDisplay\r
+        {\r
+            get\r
+            {\r
+                return this.GetDisplayString(false);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {track #} {language} ({format}) ({sub-format})</returns>\r
+        public override string ToString()\r
+        {\r
+            return this.GetDisplayString(true);\r
+        }\r
+\r
+        private string GetDisplayString(bool includeTrackNumber)\r
+        {\r
+            if (includeTrackNumber)\r
+            {\r
+                return this.TrackNumber + " " + this.Description;\r
+            }\r
+            else\r
+            {\r
+                return this.Description;\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/interop/SourceData/Chapter.cs b/win/C#/interop/SourceData/Chapter.cs
new file mode 100644 (file)
index 0000000..8e41282
--- /dev/null
@@ -0,0 +1,38 @@
+/*  Chapter.cs $\r
+       \r
+          This file is part of the HandBrake source code.\r
+          Homepage: <http://handbrake.fr>.\r
+          It may be used under the terms of the GNU General Public License. */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.IO;\r
+using System.Text.RegularExpressions;\r
+\r
+namespace HandBrake.SourceData\r
+{\r
+    /// <summary>\r
+    /// An object representing a Chapter aosciated with a Title, in a DVD\r
+    /// </summary>\r
+    public class Chapter\r
+    {\r
+        /// <summary>\r
+        /// The number of this Chapter, in regards to its parent Title\r
+        /// </summary>\r
+        public int ChapterNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// The length in time this Chapter spans\r
+        /// </summary>\r
+        public TimeSpan Duration { get; set; }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {chapter #}</returns>\r
+        public override string ToString()\r
+        {\r
+            return this.ChapterNumber.ToString();\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/interop/SourceData/Subtitle.cs b/win/C#/interop/SourceData/Subtitle.cs
new file mode 100644 (file)
index 0000000..bf5d4e5
--- /dev/null
@@ -0,0 +1,70 @@
+/*  Subtitle.cs $\r
+       \r
+          This file is part of the HandBrake source code.\r
+          Homepage: <http://handbrake.fr>.\r
+          It may be used under the terms of the GNU General Public License. */\r
+\r
+using System.Collections.Generic;\r
+using System.IO;\r
+using System.Text.RegularExpressions;\r
+\r
+namespace HandBrake.SourceData\r
+{\r
+    /// <summary>\r
+    /// An object that represents a subtitle associated with a Title, in a DVD\r
+    /// </summary>\r
+    public class Subtitle\r
+    {\r
+        /// <summary>\r
+        /// The track number of this Subtitle\r
+        /// </summary>\r
+        public int TrackNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// The language (if detected) of this Subtitle\r
+        /// </summary>\r
+        public string Language { get; set; }\r
+\r
+        /// <summary>\r
+        /// Langauage Code\r
+        /// </summary>\r
+        public string LanguageCode { get; set; }\r
+\r
+        public SubtitleType SubtitleType { get; set; }\r
+\r
+        /// <summary>\r
+        /// Subtitle Type\r
+        /// </summary>\r
+        public string TypeString\r
+        {\r
+            get\r
+            {\r
+                if (this.SubtitleType == SubtitleType.Picture)\r
+                {\r
+                    return "Bitmap";\r
+                }\r
+                else\r
+                {\r
+                    return "Text";\r
+                }\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Override of the ToString method to make this object easier to use in the UI\r
+        /// </summary>\r
+        /// <returns>A string formatted as: {track #} {language}</returns>\r
+        public override string ToString()\r
+        {\r
+            return string.Format("{0} {1} ({2})", this.TrackNumber, this.Language, this.TypeString);\r
+        }\r
+\r
+        public string Display\r
+        {\r
+            get\r
+            {\r
+                return this.ToString();\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/interop/SourceData/SubtitleType.cs b/win/C#/interop/SourceData/SubtitleType.cs
new file mode 100644 (file)
index 0000000..68904fe
--- /dev/null
@@ -0,0 +1,13 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+\r
+namespace HandBrake.SourceData\r
+{\r
+    public enum SubtitleType\r
+    {\r
+        Picture,\r
+        Text\r
+    }\r
+}\r
diff --git a/win/C#/interop/SourceData/Title.cs b/win/C#/interop/SourceData/Title.cs
new file mode 100644 (file)
index 0000000..8d69494
--- /dev/null
@@ -0,0 +1,115 @@
+/*  Title.cs $\r
+       \r
+          This file is part of the HandBrake source code.\r
+          Homepage: <http://handbrake.fr>.\r
+          It may be used under the terms of the GNU General Public License. */\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Globalization;\r
+using System.IO;\r
+using System.Text.RegularExpressions;\r
+using HandBrake.Interop;\r
+\r
+namespace HandBrake.SourceData\r
+{\r
+    /// <summary>\r
+    /// An object that represents a single Title of a DVD\r
+    /// </summary>\r
+    public class Title\r
+    {\r
+        private static readonly CultureInfo Culture = new CultureInfo("en-US", false);\r
+        private readonly List<AudioTrack> audioTracks;\r
+        private readonly List<Chapter> chapters;\r
+        private readonly List<Subtitle> subtitles;\r
+        \r
+        /// <summary>\r
+        /// The constructor for this object\r
+        /// </summary>\r
+        public Title()\r
+        {\r
+            this.audioTracks = new List<AudioTrack>();\r
+            this.chapters = new List<Chapter>();\r
+            this.subtitles = new List<Subtitle>();\r
+        }\r
+\r
+        /// <summary>\r
+        /// Collection of chapters in this Title\r
+        /// </summary>\r
+        public List<Chapter> Chapters\r
+        {\r
+            get { return this.chapters; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Collection of audio tracks associated with this Title\r
+        /// </summary>\r
+        public List<AudioTrack> AudioTracks\r
+        {\r
+            get { return this.audioTracks; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Collection of subtitles associated with this Title\r
+        /// </summary>\r
+        public List<Subtitle> Subtitles\r
+        {\r
+            get { return this.subtitles; }\r
+        }\r
+\r
+        /// <summary>\r
+        /// The track number of this Title (1-based).\r
+        /// </summary>\r
+        public int TitleNumber { get; set; }\r
+\r
+        /// <summary>\r
+        /// The length in time of this Title\r
+        /// </summary>\r
+        public TimeSpan Duration { get; set; }\r
+\r
+        /// <summary>\r
+        /// The resolution (width/height) of this Title\r
+        /// </summary>\r
+        public Size Resolution { get; set; }\r
+\r
+        /// <summary>\r
+        /// The aspect ratio of this Title\r
+        /// </summary>\r
+        public double AspectRatio { get; set; }\r
+\r
+        public int AngleCount { get; set; }\r
+\r
+        /// <summary>\r
+        /// Par Value\r
+        /// </summary>\r
+        public Size ParVal { get; set; }\r
+\r
+        /// <summary>\r
+        /// The automatically detected crop region for this Title.\r
+        /// This is an int array with 4 items in it as so:\r
+        /// 0: \r
+        /// 1: \r
+        /// 2: \r
+        /// 3: \r
+        /// </summary>\r
+        public Cropping AutoCropDimensions { get; set; }\r
+  \r
+        /// <summary>\r
+        /// Override of the ToString method to provide an easy way to use this object in the UI\r
+        /// </summary>\r
+        /// <returns>A string representing this track in the format: {title #} (00:00:00)</returns>\r
+        public override string ToString()\r
+        {\r
+            return string.Format("{0} ({1:00}:{2:00}:{3:00})", this.TitleNumber, this.Duration.Hours,\r
+                                 this.Duration.Minutes, this.Duration.Seconds);\r
+        }\r
+\r
+        public string Display\r
+        {\r
+            get\r
+            {\r
+                return this.ToString();\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
diff --git a/win/C#/libraries/Growl license.txt b/win/C#/libraries/Growl license.txt
new file mode 100644 (file)
index 0000000..3978164
--- /dev/null
@@ -0,0 +1,25 @@
+Growl.NET GNTP Connector Library\r
+-----------------------------------------------\r
+Copyright (c) 2008 - Growl for Windows\r
+All rights reserved\r
+\r
+Redistribution and use in source and binary forms, with or without modification,\r
+are permitted provided that the following conditions are met:\r
+\r
+1. Redistributions of source code must retain the above copyright\r
+   notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright\r
+   notice, this list of conditions and the following disclaimer in the\r
+   documentation and/or other materials provided with the distribution.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY \r
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \r
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\r
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR \r
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \r
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN \r
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH \r
+DAMAGE.\r
+\r
index 22ddf6c..01c0c59 100644 (file)
Binary files a/win/C#/libraries/Growl.Connector.dll and b/win/C#/libraries/Growl.Connector.dll differ
index 6a05d90..ca1545c 100644 (file)
Binary files a/win/C#/libraries/Growl.CoreLibrary.dll and b/win/C#/libraries/Growl.CoreLibrary.dll differ
diff --git a/win/C#/libraries/Microsoft.WindowsAPICodePack.Shell.dll b/win/C#/libraries/Microsoft.WindowsAPICodePack.Shell.dll
new file mode 100644 (file)
index 0000000..340ddd5
Binary files /dev/null and b/win/C#/libraries/Microsoft.WindowsAPICodePack.Shell.dll differ
diff --git a/win/C#/libraries/Microsoft.WindowsAPICodePack.dll b/win/C#/libraries/Microsoft.WindowsAPICodePack.dll
new file mode 100644 (file)
index 0000000..85605b7
Binary files /dev/null and b/win/C#/libraries/Microsoft.WindowsAPICodePack.dll differ
diff --git a/win/C#/libraries/caliburn/Caliburn.Castle.dll b/win/C#/libraries/caliburn/Caliburn.Castle.dll
new file mode 100644 (file)
index 0000000..d10426b
Binary files /dev/null and b/win/C#/libraries/caliburn/Caliburn.Castle.dll differ
diff --git a/win/C#/libraries/caliburn/Caliburn.Core.dll b/win/C#/libraries/caliburn/Caliburn.Core.dll
new file mode 100644 (file)
index 0000000..5fbeda0
Binary files /dev/null and b/win/C#/libraries/caliburn/Caliburn.Core.dll differ
diff --git a/win/C#/libraries/caliburn/Caliburn.ModelFramework.dll b/win/C#/libraries/caliburn/Caliburn.ModelFramework.dll
new file mode 100644 (file)
index 0000000..06faccb
Binary files /dev/null and b/win/C#/libraries/caliburn/Caliburn.ModelFramework.dll differ
diff --git a/win/C#/libraries/caliburn/Caliburn.PresentationFramework.dll b/win/C#/libraries/caliburn/Caliburn.PresentationFramework.dll
new file mode 100644 (file)
index 0000000..ea95243
Binary files /dev/null and b/win/C#/libraries/caliburn/Caliburn.PresentationFramework.dll differ
diff --git a/win/C#/libraries/caliburn/Castle.Core.dll b/win/C#/libraries/caliburn/Castle.Core.dll
new file mode 100644 (file)
index 0000000..b4a8093
Binary files /dev/null and b/win/C#/libraries/caliburn/Castle.Core.dll differ
diff --git a/win/C#/libraries/caliburn/Castle.DynamicProxy2.dll b/win/C#/libraries/caliburn/Castle.DynamicProxy2.dll
new file mode 100644 (file)
index 0000000..763a617
Binary files /dev/null and b/win/C#/libraries/caliburn/Castle.DynamicProxy2.dll differ
diff --git a/win/C#/libraries/caliburn/Castle.MicroKernel.dll b/win/C#/libraries/caliburn/Castle.MicroKernel.dll
new file mode 100644 (file)
index 0000000..35df07a
Binary files /dev/null and b/win/C#/libraries/caliburn/Castle.MicroKernel.dll differ
diff --git a/win/C#/libraries/caliburn/Castle.Windsor.dll b/win/C#/libraries/caliburn/Castle.Windsor.dll
new file mode 100644 (file)
index 0000000..480a4b5
Binary files /dev/null and b/win/C#/libraries/caliburn/Castle.Windsor.dll differ
diff --git a/win/C#/libraries/caliburn/Changes.txt b/win/C#/libraries/caliburn/Changes.txt
new file mode 100644 (file)
index 0000000..cf97d93
--- /dev/null
@@ -0,0 +1,166 @@
+V1.1 Release\r
+-Fixed an issue in the WPF version of InteractionNode.\r
+-Fixed an event invocation order issue and a parameter update issue related to routed messages.\r
+-Updated Spring.NET to version 1.3.0.\r
+-Made DefaultWindowManager more friendly to WPF's NavigationWindow.\r
+-Fixed a bug with non-modal window shutdown in DefaultWindowManager.\r
+-Fixed a core bug in custom attribute discovery.\r
+-Enabled routed messages to declare default handlers.  Now ActionMessage declares a default handler for its DataContext.  This solves several Menu routing issues.\r
+-Fixed the apparently completely broken MEF adapter.\r
+-Greatly improved the flexibility of the DefaultViewStrategy.\r
+-Fixed a bug in the WPF DispatcherImpelmentation.\r
+-Fixed a bug in PresenterManager and MultiPresenterManager which caused screen changes to the same screen.\r
+-Enabled view chaching for Silverlight.\r
+-Fixed some bugs in the LOB samples.\r
+-Added Hyperlink/HyerlinkButton element defaults.\r
+-Update StructureMap to version 2.6.1.\r
+-Updated Windsor to version 2.1.1.\r
+-Added official support for .NET 4.0.\r
+-Fixed a bug in MultiPresenterManager for .NET 4.0.\r
+-Updated to MEF Preview 9.\r
+-Applied a patch from Adam Connelly to add AddRange to BindableCollection and IObservableCollection.\r
+-Update Ninject to official 2.0 release.\r
+-Fixed a bug in the Disable IAvailabilityEffect which was preventing it from handling ContentElements in WPF correctly.\r
+-Fixed a bug in the AvailabilityEffectConverter related to resolving custom effects from the container.\r
+-Enabled actions to search for handlers by routing through TemplatedParents in WPF.\r
+-Fixed a bug with expression tree method calls in .NET 4.0.\r
+-Enabled the dispatcher's default DispatcherPriority to be configured.\r
+-Applied a patch by varely to fix binding validation against properties with underscores in their name.\r
+-Updated Prism to the October 2009 release.\r
+-Updated the AutofacAdapter to support AutoFac 2.0.\r
+-Changed IsolatedStorageStateManager to use GetUserStoreForDomain for WPF and GetUserStoreForApplication for Silverlight. The method which gets the storage file is now overridable as well.\r
+-Changed Presenters to raise lifecycle events after initialization/activation/etc are complete.\r
+-Ensured that PresenterManagers do not call initialize/activate when CurrentPresenter is set unless they themselves are initialized/activated.\r
+-Fixed a bug with WPF Parameter instances raising value changes after being removed from the tree.\r
+-Fixed bugs in PropertyPathMonitor\r
+-Fixed a bug in the Autofac adapter related to singleton registration.\r
+-Enabled strong-named bulds of but only for .NET 4.0 and SL4.\r
+-Fixed a memory leak related to the DependenciesAttribute.\r
+-Fixed a bug in DefaultViewLocator.MakeInterface related to generic types.\r
+-Updated Unity to the latest version.\r
+-Updated Prism to the latest version.\r
+-Fixed a bug in the MessageBinder.\r
+-Fixed a bug in the contact manager sample.\r
+\r
+V1.1 Release Candidate\r
+-Added pre-initialization hooks to CaliburnApplication via Marco Amendola's patch.\r
+-Redesign of IThreadPool.  AsynchronousAction will now pass itself as state when enqueing the background task.\r
+-Closed ticket #4672 by making PropertyChangedBase.PropertyChanged virtual.\r
+-Applied jagregory's patch to add single key gestures to WPF and Caliburn.\r
+-Applied marcoamendola's patch for enabling property path syntax with Preview and Dependency attributes. So you can now do things like [Dependencies("Model.IsValid")].\r
+-Applied marcoamendola's patch enabling type hinting for polymorphic databinding in Caliburn.Testability.\r
+-Applied etobi's patch to greatly improve Caliburn's parameter parsing in ActionMessages and CommandMessages. See http://caliburn.codeplex.com/WorkItem/View.aspx?WorkItemId=4644 for an explanation.\r
+-Closed ticket #4826. DefaultWindowManager now sets WindowStartupLocation to CenterOwner for UserControls hosted in windows. Title was enhanced to databind to IPresenter.DisplayName if model implements this interface.\r
+-Closed ticket #4833. Fixed an issue with ViewMetadata and invalid Windows in DefaultViewStrategy.\r
+-Fixed a bug with DefaultWindowManager which caused errors when creating main windows from a user control.\r
+-Improved the flexibility of the DefaultViewStrategy. It no longer requires separate namespaces for ViewModels/Views.\r
+-Closed ticket #4865. Fixed a bug in MultiPresenterManager which affects multiple presenter shutdown.\r
+-Applied sedovav's fix to the Spring adapter.\r
+-Enhanced DefaultViewStrategy's exception to report searched for types when view location fails.\r
+-Applied cheesus' recommendations to add unwire capability to IEventHandler.\r
+-Improved PresenterManager and MultiPresenterManager such that all changes to CurrentPresenter go through ChangeCurrentPresenterCore.\r
+-Bug fixes and improvements to DependenciesAttribute, PreviewAttribute, DependencyObserver and PropertyPathMonitory.\r
+-Added strongly-typed property change notification to PropertyChangedBase.\r
+-Fixed a bug in the SimpleContainer related to generic component registration.\r
+-Added ILifecycleNotifier.AttemptingShutdown which gets fired before the CanShutdownCore method on PresenterBase is called. \r
+-Fixed a bug in AsnychronousAction related to IPreExecute, BlocksInteraction and AffectsTriggers.\r
+-Added IWindowManager and DefaultWindowManager for SL3 and SL4.\r
+-Fixed a few bugs in property change testing.\r
+-Fixed a bug in the MEFAdapter.\r
+-Fixed a bug in the design-time support for Availability Effects in the AvailabilityEffectConverter.\r
+-Updated to Castle Windsor 2.1, Dynamic Proxy 2.2. Added official Windsor support for Silverlight 3.0 and 4.0\r
+-Fixed a minor bug in View Contexts.\r
+-Enabled WPF Action parameters to bind to default event/property by specifying only an element name as the arg.\r
+-Added the Silverlight Navigation Sample to How Tos.\r
+-Created three different build-*.cmd for the major build scenarios.\r
+\r
+V1 RTW\r
+-The DefaultBinder will now throw on type activation failure.\r
+-Made a change to the implementation of PresentationFrameworkModule.IsInDesignMode.\r
+-Removed Silverlight Windsor support because it apparently never worked.\r
+-Fixed some inconsistencies between the implementations of IStateManager by transforming various implementation methods into extension methods and adding a missing concept.\r
+-Fixed an inconsistency in the Open extension method. Added an extension point to the DefaultViewStrategy that will make it easier to work with proxied models.\r
+-A minor change to allow custom "rewriting" of the type that the DefaultBinder inspects. This will help with proxy scenarios. Just override GetModelType and return the underlying type. The same is true for DefaultViewStrategy. For the ActionFactory, override SelectMethods.\r
+-Fixed bugs in the View.Context and View.Strategy attached properties.\r
+-Fixed a bug in the AttachedEventTriggerParser.cs. We no longer query against dynamic assemblies.\r
+-Fixed a bug in the DefaultWindowManager. Fixed some compile errors in the LOB samples that resulted from some recent API fixes.\r
+-Added an IContainer interface which is a combination of IServiceLocator and IConfigurator. Implemented this on all the Adapters and registered this interface will all underlying containers. Fixed some bugs in the container adapter implementations.\r
+-Added an interface, IExtendedPresenter, which represents all presenter related capabilities. It is implemented by PresenterBase.\r
+-Fixed a major inconsistency with the IDispatcher and Execute APIs.\r
+-Added an extension point to MultiPresenter and MultiPresenterManager to allow a subclass to alter the default partial shutdown behavior.\r
+-Added the ability for a module to execute custom code just after framework startup by using the AfterStart method. Fixed some API inconsistencies in modules\r
+-Added a CancelResult exception which can be thrown or passed from an IResult in order to stop the enumeration of multiple results. This exception will not be bubbled up.\r
+-Added Prism integration!!!\r
+-Added WPF and Silverlight samples demonstrating how to configure Prism with Caliburn!!\r
+-Fixed a problem with the build file.\r
+-Fixed a bug in the way the MessageParserBase was parsing parameters.\r
+-Fixed a bug in the DefaultBinder which caused convention binding of IPresenter properties to fail if the property was readonly.\r
+-Made some improvements to AttachedEventTriggerParser.\r
+-Fixed the NinjectAdapter and the StructureMapAdapter.\r
+-Fixed databinding conventions in data templates for items controls.\r
+-Fixed a compilation error in the BackgroundProcessing how to.\r
+-Renamed DependencyHelper to DependencyObserver and made it a publicly available component. \r
+-Fixed some bugs with Dependent Actions, where triggers were being re-evaluated even when their own dependencies had not changed. \r
+-Enabled PreviewAttribute to work with Methods AND Properties. So you can now have a Save action and a CanSave *Property* which is hooked up. If you follow this naming convention, the filter will be added automatically. Finally, used the new DependencyObserver to allow Preview properties to be re-evaluated when a PropertyChange notification is raised for the preview property. As always, this works for Actions and Commands.\r
+-Made an improvement to AttachedEventTriggerParser so that it only investigates types which inherit from DependencyObject for events.\r
+-Enabled View.Context to flow through to the ItemTemplate of an ItemsControl when using convention bindings.\r
+-Made Caliburn/Prism integration even smoother.\r
+-Made more methods of DefaultBinder protected virtual.\r
+-Fixed a bug in the LOB sample. \r
+-Made some minor improvements to IExtendedPresenter.\r
+-Fixed a bug in AttachedEventTriggerParser. It now searches DependencyObject descendants *and* static classes for events.\r
+-Fixed more problems with the SpringAdapter. Discovered some issues with the MEFAdapter. Added container unit tests to cover additional scenarios.\r
+-Update MEF to Preview 8\r
+-Update to the latest build of Ninject 2.\r
+\r
+V1 RC3\r
+-Updated the StructureMap.dll to version 2.5.3.\r
+-Made a slight alteration to CoreConfiguration that makes it more friendly when run in a unit test.\r
+-Added an AutofacAdapter for .NET 3.5, Silverlight 2.0 and Silverlight 3.0.\r
+-Fixed bugs in the DefaultWindowManager.\r
+-Added IPresenterNode which allows presenters to be hooked up with a reference to their parent. All implementors of IPresenterHost now wire themselves when opening children and unwire themselves during a shutdown.\r
+-Created the IBinder interface. This replaces the functionality that was in the extension method AttachTo. This interface is meant to provide a pluggable way to change the behavior of Model/View wire-up.\r
+-Updated DefaultBinder to allow for convention-based action wire-up.\r
+-Fixed a bug in auto-registration with CommandAttribute.\r
+-Fixed several bugs with CaliburnApplication\r
+-Fixed a bug where certain module scenarios would cause the PresentationFrameworkModule to be configured twice.\r
+-Fixed some inconsistencies in the DefaultWindowManager and CaliburnApplication.silverlight.cs.\r
+-Removed a pesky attribute in the WPF ContactManager's .config file that was causing bugs for some people.\r
+-Removed Message.Attach2nd, Message.Attach3rd and Message.Attach4th. You can now attach an arbitrary number of messages with Message.Attach by separating each message with a semicolon. This caused a breaking change to the IParser implementation, but it is unlikely that will affect many people.\r
+-Fixed some bugs in Parameter.silverlight.cs related to event defaults for elements that are bound.\r
+-Improved the BackgroundProcessing sample.\r
+-Fixed some bugs in parsing of parameters for messages. There were certain scenarios where the parser could not differentiate between string literals and references to control.  To pass literals as a message parameter (short syntax only), you must surround it with single quotes.\r
+-Added AttachedEventTriggerParser. We can all now use attached event triggers in the short syntax. Usage is as follows: cal:Message.Attach="[AttachedEvent ButtonBase.Click] = [Action MyAction]" The caveat is that we cannot map namespaces from xaml into the parser. To work around this problem, we search through all AppDomain assemblies by default. If you would like to optimize this, simply inherit from AttachedEventTriggerParser and override GetSearchableAssemblies. Then register your ITriggerParser with IParser under the name "AttachedEvent"\r
+-Enabled the DefaultViewStrategy to handle custom contexts without the need of a ViewStrategyAttribute. If a context is the DefaultViewStrategy will treat the view name as a folder name by adding an "s" and search that folder for views with the context as their name.\r
+-Fixed various bugs in DefaultViewStrategy.\r
+-Fixed various bugs in AsynchronousAction and in the BackgroundProcessing sample.\r
+-Updated MEF to Preview 7.\r
+-Changed IMessageBinder.BindOutcome to IMessageBinder.CreateResult.\r
+-Enabled the DefaultBinder to look for properties named with the pattern Can + Action and wire up the IsEnabled property automatically.\r
+-Fixed the signatures of extension methods for IWindowManager.\r
+-Fixed a bug in binding validation that occurs when properties are overridden on a bound type.\r
+-Provided a way for a presenter to pass a dialog result to the view on close.\r
+-Made some improvements to exception messages in the case of parameter count mismatch during invocation.\r
+-Updated Caliburn's build to work with Silverlight 3.0.40818.0 service release.\r
+-Extended the IDispatcher to allow async UI invocation.\r
+\r
+V1 RC2\r
+-Added the official xmlns for caliburn: http://www.caliburnproject.org\r
+-Added a Completed event to IResult (renamed from IExecutableResult)\r
+-Renamed CompositeResult to SequentialResult\r
+-Added a Starting event to IBackgroundTask.\r
+-The filter interfaces have been renamed IPreExecuteFilter -> IPreProcessor, IPostExecuteFilter -> IPostProcessor, IRescueFilter -> IRescue, IInstanceAwareFilter -> IHandlerAware. Also, IMethodBinder was renamed to IMessageBinder and IMessageSupportingMethodBinding was renamed to IRoutedMessageWithOutcome (which caused a change in the IResult interface). The property ReturnPath on ActionMessage was renamed to OutcomePath.\r
+-Enabled Unity, Castle, Ninject and MEF Adapters for Silverlight.\r
+-Improvements to DefaultViewStrategy\r
+-Added parameter and results of message to be bound to Resources.\r
+-Enabled parameter special files to be "dotted" on. ie: $eventArgs.My.Property\r
+-Additional attached properties are necessary: Attach, Attach2nd, Attach3rd and Attach4th\r
+-IPresenterHost's Presenters is now an instance of IObservableCollection<IPresenter>\r
+-Introduced IAssemblySource as a way for any component to be made aware of inspectable assemblies.\r
+-Reworked ComponentInfo\r
+-Added the IWindowManager service for WPF. This enables a model-centric mechanism for showing dialogs and non-modal windows.\r
+-Added the IViewAware interface which can be implemented by a model/presenter if it wishes to be aware of its view.\r
+-Updated the build to compile for .NET 3.5, Silverlight 2.0 and Silverlight 3.0\r
+-Updated all samples so that they has both SL2 and SL3 projects.\r
+-Many more small features and API improvements...\r
+-Fixed tons of bugs...
\ No newline at end of file
diff --git a/win/C#/libraries/caliburn/Common.Logging.dll b/win/C#/libraries/caliburn/Common.Logging.dll
new file mode 100644 (file)
index 0000000..d7a8f15
Binary files /dev/null and b/win/C#/libraries/caliburn/Common.Logging.dll differ
diff --git a/win/C#/libraries/caliburn/License.txt b/win/C#/libraries/caliburn/License.txt
new file mode 100644 (file)
index 0000000..687850b
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License\r
+\r
+Copyright (c) 2008 Blue Spire Consulting, Inc.\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining a copy\r
+of this software and associated documentation files (the "Software"), to deal\r
+in the Software without restriction, including without limitation the rights\r
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
+copies of the Software, and to permit persons to whom the Software is\r
+furnished to do so, subject to the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included in\r
+all copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
+THE SOFTWARE.
\ No newline at end of file
diff --git a/win/C#/libraries/caliburn/Microsoft.Practices.ServiceLocation.dll b/win/C#/libraries/caliburn/Microsoft.Practices.ServiceLocation.dll
new file mode 100644 (file)
index 0000000..3f88954
Binary files /dev/null and b/win/C#/libraries/caliburn/Microsoft.Practices.ServiceLocation.dll differ
diff --git a/win/C#/libraries/caliburn/Readme.txt b/win/C#/libraries/caliburn/Readme.txt
new file mode 100644 (file)
index 0000000..396ebbb
--- /dev/null
@@ -0,0 +1,25 @@
+Caliburn\r
+\r
+Running one of the build commands (build-*.cmd) will execute the NAnt build script in a the chosen configuration.  \r
+\r
+Throughout the solution you will see files with the extensions .silverlight.cs or .wpf.cs which indicate major platform differences.  \r
+Elsewhere I have used various ammounts of conditional compilation as necessary.\r
+\r
+Adapters for popular DI frameworks I have included are:\r
+Caliburn.Castle\r
+Caliburn.Spring\r
+Caliburn.StructureMap\r
+Caliburn.Unity\r
+Caliburn.Ninject\r
+Caliburn.Autofac\r
+Caliburn.MEF (technically not a DI framework)\r
+\r
+Using a DI container is not necessary, as Caliburn has a simple built-in container it uses by default.\r
+\r
+If you are using Prism, have a look at Caliburn.Prism.\r
+Unit tests for Caliburn's features can be found in Tests.Caliburn.\r
+\r
+Please see the samples folder for examples of how to use the most prominent features of Caliburn.  \r
+There are identical samples for both WPF and Silverlight.  You can also find some how to's and larger examples there.  \r
+\r
+I hope this helps you in your development of applications for WPF and Silverlight.  Enjoy!
\ No newline at end of file
diff --git a/win/C#/libraries/caliburn/System.ComponentModel.Composition.dll b/win/C#/libraries/caliburn/System.ComponentModel.Composition.dll
new file mode 100644 (file)
index 0000000..bbbae1e
Binary files /dev/null and b/win/C#/libraries/caliburn/System.ComponentModel.Composition.dll differ
diff --git a/win/C#/libraries/caliburn/Thanks.txt b/win/C#/libraries/caliburn/Thanks.txt
new file mode 100644 (file)
index 0000000..7f71907
--- /dev/null
@@ -0,0 +1,20 @@
+Many thanks to all those whose code, blogs etc. inspired me or helped to solve some of the difficult problems.  \r
+Special thanks to (in no particular order):\r
+\r
+Contributors\r
+Marco Amendola - http://marcoamendola.wordpress.com/\r
+Ryan Rauh - http://rauhski.blogspot.com\r
+Michael Davis - n/a\r
+Chistopher Bennage - http://devlicio.us/blogs/christopher_bennage/default.aspx\r
+Ayende Rahien - http://www.ayende.com\r
+\r
+Inspiration\r
+Kevin Moore - http://j832.com/BagOTricks/\r
+Nick Guerrera - http://blogs.msdn.com/nicholg/archive/2006/06/04/617466.aspx\r
+Jeremy Miller - http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx\r
+John Gossman - http://blogs.msdn.com/johngossman/archive/2005/10/08/478683.aspx\r
+Dan Crevier - http://blogs.msdn.com/dancre/archive/tags/DM-V-VM/default.aspx\r
+Brownie Points - http://mbrownchicago.spaces.live.com/Blog/cns!2221DC39E0C749A4!596.entry\r
+Kevin Hoffman - http://dotnetaddict.dotnetdevelopersjournal.com/read/poster/87984.htm\r
+\r
+I hope you find this framework useful or inspiring for solving the problems in your own work.
\ No newline at end of file