diff -Nru handbrake-0.9.8ppa1~precise1/.svn/entries handbrake-0.9.9ppa1~precise1/.svn/entries --- handbrake-0.9.8ppa1~precise1/.svn/entries 2012-07-18 10:17:32.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/entries 2013-05-18 16:12:10.000000000 +0000 @@ -1,466 +1 @@ -10 - -dir -4863 -svn://svn.handbrake.fr/HandBrake/tags/0.9.8 -svn://svn.handbrake.fr/HandBrake - - - -2012-07-17T22:35:28.669832Z -4863 -sr55 - - - - - - - - - - - - - - -b64f7644-9d1e-0410-96f1-a4d463321fa5 - -DoxyfileLibHb -file - - - - -2012-07-18T10:17:32.976663Z -9a2633fe96526b3ec327e57de27992e1 -2010-08-21T13:02:43.132939Z -3488 -sr55 - - - - - - - - - - - - - - - - - - - - - -69993 - -AUTHORS -file - - - - -2012-07-18T10:17:32.976663Z -481b9e4cec917bb71f2f7af3d8667635 -2012-03-04T11:17:16.154250Z -4491 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -2668 - -gtk -dir - -scripts -dir - -THANKS -file - - - - -2012-07-18T10:17:32.976663Z -2ed3f32f6ab9a996e16841101d64ba73 -2012-07-17T15:04:00.415147Z -4855 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -803 - -DoxyfileGtk -file - - - - -2012-07-18T10:17:32.976663Z -2cebc40f72d55a660decb73c0886a6d2 -2010-08-21T13:02:43.132939Z -3488 -sr55 - - - - - - - - - - - - - - - - - - - - - -69989 - -macosx -dir - -win -dir - -CREDITS -file - - - - -2012-07-18T10:17:32.976663Z -830009c8621e29ad93c8bfd3bd02b357 -2011-06-20T14:46:14.902198Z -4065 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -507 - -contrib -dir - -DoxyfileDotNet -file - - - - -2012-07-18T10:17:32.976663Z -483f2599d5d7a45fef53752fa1a66c55 -2011-10-08T19:07:42.495920Z -4276 -sr55 - - - - - - - - - - - - - - - - - - - - - -70009 - -DoxyfileMac -file - - - - -2012-07-18T10:17:32.976663Z -bdc95603af4a2709061107e5d78fbf46 -2010-08-21T13:16:27.553926Z -3489 -sr55 - - - - - - - - - - - - - - - - - - - - - -69993 - -doc -dir - -COPYING -file - - - - -2012-07-18T10:17:32.976663Z -39bba7d2cf0ba1036f2a6e2be52fe3f0 -2011-06-20T14:29:53.891470Z -4063 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -18091 - -NEWS -file - - - - -2012-07-18T10:17:32.980663Z -a8d842c87a7bc104c0bb94935a050fb9 -2012-07-17T15:04:00.415147Z -4855 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -37833 - -make -dir - -README.pod -file - - - - -2012-07-18T10:17:32.980663Z -d7fe90cdd62af4bebede9fbf3ec1e08e -2011-07-09T20:45:20.002005Z -4094 -sr55 - - - - - - - - - - - - - - - - - - - - - -1248 - -test -dir - -libhb -dir - -configure -file - - - - -2012-07-18T10:17:32.976663Z -8aa02542642d13b44677d2e47e4145c7 -2009-03-08T22:50:57.400451Z -2242 -konablend -has-props - - - - - - - - - - - - - - - - - - - - -380 - -TRANSLATIONS -file - - - - -2012-07-18T10:17:32.976663Z -edcd07f8be634a6fe25f706a0c5b7cc8 -2011-06-20T14:40:52.920190Z -4064 -sr55 -has-props - - - - - - - - - - - - - - - - - - - - -185 - -pkg -dir - +12 diff -Nru handbrake-0.9.8ppa1~precise1/.svn/format handbrake-0.9.9ppa1~precise1/.svn/format --- handbrake-0.9.8ppa1~precise1/.svn/format 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/format 2013-05-18 16:12:10.000000000 +0000 @@ -0,0 +1 @@ +12 diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/01/0157124851245255211fc9a57a3fba3b13cddf6b.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/01/0157124851245255211fc9a57a3fba3b13cddf6b.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/01/0157124851245255211fc9a57a3fba3b13cddf6b.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/01/0157124851245255211fc9a57a3fba3b13cddf6b.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,18 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// The About View Model Interface +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.ViewModels.Interfaces +{ + /// + /// The About View Model Interface + /// + public interface IAboutViewModel + { + } +} \ No newline at end of file diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01c59f7901c3eaae74317bc41f6172f4a6f6aaf8.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01c59f7901c3eaae74317bc41f6172f4a6f6aaf8.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01c59f7901c3eaae74317bc41f6172f4a6f6aaf8.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01c59f7901c3eaae74317bc41f6172f4a6f6aaf8.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,65 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// Scan Progress Event Args +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrake.ApplicationServices.EventArgs +{ + using System; + using System.Runtime.Serialization; + + /// + /// Scan Progress Event Args + /// + [DataContractAttribute] + public class ScanCompletedEventArgs : EventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Whether the scan was cancelled. + /// + /// + /// The exception. + /// + /// + /// The error information. + /// + public ScanCompletedEventArgs(bool cancelled, Exception exception, string errorInformation) + { + this.Successful = !cancelled && exception == null && string.IsNullOrEmpty(errorInformation); + this.Cancelled = cancelled; + this.Exception = exception; + this.ErrorInformation = errorInformation; + } + + /// + /// Gets or sets a value indicating whether Successful. + /// + [DataMember] + public bool Successful { get; set; } + + /// + /// Gets or sets a value indicating whether Cancelled. + /// + [DataMember] + public bool Cancelled { get; set; } + + /// + /// Gets or sets Exception. + /// + [DataMember] + public Exception Exception { get; set; } + + /// + /// Gets or sets ErrorInformation. + /// + [DataMember] + public string ErrorInformation { get; set; } + } +} diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01d56044ca35c0d005acb691b5e06c7de85a050c.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01d56044ca35c0d005acb691b5e06c7de85a050c.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01d56044ca35c0d005acb691b5e06c7de85a050c.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01d56044ca35c0d005acb691b5e06c7de85a050c.svn-base 2013-05-18 16:12:19.000000000 +0000 @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,FRIBIDI)) +$(eval $(call import.CONTRIB.rules,FRIBIDI)) diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01fba85da5ac38e0aaf08c25104e18990e1560cd.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01fba85da5ac38e0aaf08c25104e18990e1560cd.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/01/01fba85da5ac38e0aaf08c25104e18990e1560cd.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/01/01fba85da5ac38e0aaf08c25104e18990e1560cd.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,68 @@ + + + + Debug + AnyCPU + + + 2.0 + {D721824C-CAFA-40B1-83C9-83E4B1215D60} + Library + Properties + HandBrakeInterop.Test + HandBrakeInterop.Test + v4.0 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + + + + + False + + + + + + + + + + {F0A61F62-2C3B-4A87-AFF4-0C4256253DA1} + HandBrakeInterop + + + + + \ No newline at end of file diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/02/0264155828cca415b535f521ad0d28f4f5c92366.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/02/0264155828cca415b535f521ad0d28f4f5c92366.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/02/0264155828cca415b535f521ad0d28f4f5c92366.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/02/0264155828cca415b535f521ad0d28f4f5c92366.svn-base 2013-05-18 16:12:19.000000000 +0000 @@ -0,0 +1,157 @@ +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-27 11:32:47.475322754 -0800 +@@ -585,6 +585,9 @@ + switch(menuid) { + case DVD_MENU_Title: + case DVD_MENU_Escape: ++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) { ++ goto fail; ++ } + (vm->state).domain = VMGM_DOMAIN; + break; + case DVD_MENU_Root: +@@ -592,6 +595,9 @@ + case DVD_MENU_Audio: + case DVD_MENU_Angle: + case DVD_MENU_Part: ++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) { ++ goto fail; ++ } + (vm->state).domain = VTSM_DOMAIN; + break; + } +@@ -606,6 +612,7 @@ + break; + } + ++fail: + return 0; + } + +@@ -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); /* ?? */ ++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + (vm->state).domain = VMGM_DOMAIN; + if(!set_MENU(vm, link_values.data1)) + assert(0); +@@ -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); /* ?? */ +- (vm->state).domain = VTSM_DOMAIN; + if (!ifoOpenNewVTSI(vm, vm->dvd, link_values.data1)) /* Also sets (vm->state).vtsN */ + assert(0); ++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } ++ (vm->state).domain = VTSM_DOMAIN; + } else { + /* This happens on some discs like "Captain Scarlet & the Mysterons" or + * the German RC2 of "Anatomie" in VTSM. */ + assert((vm->state).domain == VTSM_DOMAIN || + (vm->state).domain == VMGM_DOMAIN || (vm->state).domain == FP_DOMAIN); /* ?? */ ++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + (vm->state).domain = VTSM_DOMAIN; + } + } else { +@@ -1533,6 +1555,10 @@ + /* set_PGCN:data1 */ + /* Stop SPRM9 Timer and any GPRM counters */ + assert((vm->state).domain != VTS_DOMAIN); /* ?? */ ++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + (vm->state).domain = VMGM_DOMAIN; + if(!set_PGCN(vm, link_values.data1)) + assert(0); +@@ -1552,6 +1578,10 @@ + /* set_RSMinfo:data2 */ + assert((vm->state).domain == VTS_DOMAIN); /* ?? */ + /* Must be called before domain is changed */ ++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + 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 +1593,10 @@ + /* set_RSMinfo:data2 */ + assert((vm->state).domain == VTS_DOMAIN); /* ?? */ + /* Must be called before domain is changed */ ++ if(vm->vtsi == NULL || vm->vtsi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + 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 +1608,10 @@ + /* set_RSMinfo:data2 */ + assert((vm->state).domain == VTS_DOMAIN); /* ?? */ + /* Must be called before domain is changed */ ++ if(vm->vmgi == NULL || vm->vmgi->pgci_ut == NULL) { ++ link_values.command = Exit; ++ break; ++ } + 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 -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03346c93c5f7db7b9b6a096549b1880d46477b70.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03346c93c5f7db7b9b6a096549b1880d46477b70.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03346c93c5f7db7b9b6a096549b1880d46477b70.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03346c93c5f7db7b9b6a096549b1880d46477b70.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,27 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// Interaction logic for AudioView.xaml +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Views +{ + using System.Windows.Controls; + + /// + /// Interaction logic for AudioView.xaml + /// + public partial class AudioView : UserControl + { + /// + /// Initializes a new instance of the class. + /// + public AudioView() + { + InitializeComponent(); + } + } +} diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/03/0338044e96243723d070f7f1c5aee90230fce50c.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/03/0338044e96243723d070f7f1c5aee90230fce50c.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/03/0338044e96243723d070f7f1c5aee90230fce50c.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/03/0338044e96243723d070f7f1c5aee90230fce50c.svn-base 2013-05-18 16:12:19.000000000 +0000 @@ -0,0 +1,11 @@ +--- fribidi-0.19.2.orig/lib/fribidi-common.h 2007-04-05 09:13:24.000000000 -0700 ++++ fribidi-0.19.2/lib/fribidi-common.h 2011-10-20 11:00:21.874917516 -0700 +@@ -54,7 +54,7 @@ + /* FRIBIDI_ENTRY is a macro used to declare library entry points. */ + #ifndef FRIBIDI_ENTRY + # if (defined(WIN32)) || (defined(_WIN32_WCE)) +-# define FRIBIDI_ENTRY __declspec(dllimport) ++# define FRIBIDI_ENTRY + # else /* !WIN32 */ + # define FRIBIDI_ENTRY /* empty */ + # endif /* !WIN32 */ Binary files /tmp/KB1BipECVc/handbrake-0.9.8ppa1~precise1/.svn/pristine/03/035a61152f6b3a61f2baf24dc15ac842e2747b3e.svn-base and /tmp/wz9_fHBqAo/handbrake-0.9.9ppa1~precise1/.svn/pristine/03/035a61152f6b3a61f2baf24dc15ac842e2747b3e.svn-base differ diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03a4d1b7b4cf7741896201f39c50c24c573e7b59.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03a4d1b7b4cf7741896201f39c50c24c573e7b59.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03a4d1b7b4cf7741896201f39c50c24c573e7b59.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03a4d1b7b4cf7741896201f39c50c24c573e7b59.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,68 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// Audio Queue Display Converter +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.Converters.Audio +{ + using System; + using System.Collections.ObjectModel; + using System.Globalization; + using System.Text; + using System.Windows.Data; + + using HandBrake.ApplicationServices.Model.Encoding; + using HandBrake.ApplicationServices.Utilities; + using HandBrake.Interop.Model.Encoding; + + /// + /// Audio Queue Display Converter + /// + public class AudioQueueDisplayConverter : IValueConverter + { + /// + /// Converts a value. + /// + /// + /// A converted value. If the method returns null, the valid null value is used. + /// + /// The value produced by the binding source.The type of the binding target property.The converter parameter to use.The culture to use in the converter. + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + ObservableCollection tracks = value as ObservableCollection; + StringBuilder audioTracks = new StringBuilder(); + if (tracks != null) + { + foreach (AudioTrack track in tracks) + { + if (string.IsNullOrEmpty(audioTracks.ToString())) + { + audioTracks.Append(EnumHelper.GetDisplay(track.Encoder)); + } + else + { + audioTracks.Append(", " + EnumHelper.GetDisplay(track.Encoder)); + } + } + } + + return audioTracks.ToString(); + } + + /// + /// Converts a value. + /// + /// + /// A converted value. If the method returns null, the valid null value is used. + /// + /// The value that is produced by the binding target.The type to convert to.The converter parameter to use.The culture to use in the converter. + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} Binary files /tmp/KB1BipECVc/handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03b0266c683c77f5ec0c98c9e17b01e5c1cd3c95.svn-base and /tmp/wz9_fHBqAo/handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03b0266c683c77f5ec0c98c9e17b01e5c1cd3c95.svn-base differ diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03cca22b3e1f81979714a9cf53c1ddf24c8ea347.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03cca22b3e1f81979714a9cf53c1ddf24c8ea347.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/03/03cca22b3e1f81979714a9cf53c1ddf24c8ea347.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/03/03cca22b3e1f81979714a9cf53c1ddf24c8ea347.svn-base 2013-05-18 16:12:11.000000000 +0000 @@ -0,0 +1,837 @@ +/* reader.c + + Copyright (c) 2003-2013 HandBrake Team + This file is part of the HandBrake source code + Homepage: . + It may be used under the terms of the GNU General Public License v2. + For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html + */ +#include "hb.h" + +static int hb_reader_init( hb_work_object_t * w, hb_job_t * job ); +static void hb_reader_close( hb_work_object_t * w ); + +hb_work_object_t hb_reader = +{ + WORK_READER, + "Reader", + hb_reader_init, + NULL, + hb_reader_close, + NULL, + NULL +}; + +typedef struct +{ + int startup; + double average; // average time between packets + double filtered_average; // average time between packets + 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; + +struct hb_work_private_s +{ + hb_job_t * job; + hb_title_t * title; + volatile int * die; + + hb_bd_t * bd; + hb_dvd_t * dvd; + hb_stream_t * stream; + + stream_timing_t *stream_timing; + int64_t scr_offset; + hb_psdemux_t demux; + int scr_changes; + uint32_t sequence; + 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 + int64_t pts_to_start; + uint64_t st_first; + uint64_t duration; + hb_fifo_t * fifos[100]; +}; + +/*********************************************************************** + * Local prototypes + **********************************************************************/ +static hb_fifo_t ** GetFifoForId( hb_work_private_t * r, int id ); +static void UpdateState( hb_work_private_t * r, int64_t start); + +/*********************************************************************** + * hb_reader_init + *********************************************************************** + * + **********************************************************************/ +static int hb_reader_open( hb_work_private_t * r ) +{ + if ( r->title->type == HB_BD_TYPE ) + { + if ( !( r->bd = hb_bd_init( r->title->path ) ) ) + return 1; + } + else if ( r->title->type == HB_DVD_TYPE ) + { + if ( !( r->dvd = hb_dvd_init( r->title->path ) ) ) + return 1; + } + else if ( r->title->type == HB_STREAM_TYPE || + r->title->type == HB_FF_STREAM_TYPE ) + { + if ( !( r->stream = hb_stream_open( r->title->path, r->title, 0 ) ) ) + return 1; + } + else + { + // Unknown type, should never happen + return 1; + } + return 0; +} + +static int hb_reader_init( hb_work_object_t * w, hb_job_t * job ) +{ + hb_work_private_t * r; + + r = calloc( sizeof( hb_work_private_t ), 1 ); + w->private_data = r; + + r->job = job; + r->title = job->title; + r->die = job->die; + r->sequence = 0; + + r->st_slots = 4; + r->stream_timing = calloc( sizeof(stream_timing_t), r->st_slots ); + r->stream_timing[0].id = r->title->video_id; + r->stream_timing[0].average = 90000. * (double)job->vrate_base / + (double)job->vrate; + r->stream_timing[0].filtered_average = r->stream_timing[0].average; + r->stream_timing[0].last = -r->stream_timing[0].average; + r->stream_timing[0].valid = 1; + r->stream_timing[0].startup = 10; + r->stream_timing[1].id = -1; + + r->demux.last_scr = -1; + + if ( !job->pts_to_start ) + r->start_found = 1; + else + { + // The frame at the actual start time may not be an i-frame + // so can't be decoded without starting a little early. + // sync.c will drop early frames. + r->pts_to_start = MAX(0, job->pts_to_start - 180000); + } + + if (job->pts_to_stop) + { + r->duration = job->pts_to_start + job->pts_to_stop; + } + else if (job->frame_to_stop) + { + int frames = job->frame_to_start + job->frame_to_stop; + r->duration = (int64_t)frames * job->title->rate_base * 90000 / job->title->rate; + } + else + { + hb_chapter_t *chapter; + int ii; + + r->duration = 0; + for (ii = job->chapter_start; ii < job->chapter_end; ii++) + { + chapter = hb_list_item( job->title->list_chapter, ii - 1); + r->duration += chapter->duration; + } + } + + // The stream needs to be open before starting the reader thead + // to prevent a race with decoders that may share information + // with the reader. Specifically avcodec needs this. + if ( hb_reader_open( r ) ) + { + free( r->stream_timing ); + free( r ); + return 1; + } + return 0; +} + + +static void hb_reader_close( hb_work_object_t * w ) +{ + hb_work_private_t * r = w->private_data; + + 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 ); + } + else if (r->stream) + { + hb_stream_close(&r->stream); + } + + if ( r->stream_timing ) + { + free( r->stream_timing ); + } + + free( r ); +} + +static void push_buf( const hb_work_private_t *r, hb_fifo_t *fifo, hb_buffer_t *buf ) +{ + while ( !*r->die && !r->job->done ) + { + if ( hb_fifo_full_wait( fifo ) ) + { + hb_fifo_push( fifo, buf ); + buf = NULL; + break; + } + } + if ( buf ) + { + hb_buffer_close( &buf ); + } +} + +static int is_audio( hb_work_private_t *r, int id ) +{ + int i; + hb_audio_t *audio; + + for( i = 0; ( audio = hb_list_item( r->title->list_audio, i ) ); ++i ) + { + if ( audio->id == id ) + { + return 1; + } + } + return 0; +} + +// The MPEG STD (Standard Target Decoder) essentially requires that we keep +// per-stream timing so that when there's a timing discontinuity we can +// seemlessly join packets on either side of the discontinuity. This join +// requires that we know the timestamp of the previous packet and the +// average inter-packet time (since we position the new packet at the end +// of the previous packet). The next four routines keep track of this +// per-stream timing. + +// find or create the per-stream timing state for 'buf' + +static stream_timing_t *id_to_st( hb_work_private_t *r, const hb_buffer_t *buf, int valid ) +{ + stream_timing_t *st = r->stream_timing; + while ( st->id != buf->s.id && st->id != -1) + { + ++st; + } + // if we haven't seen this stream add it. + if ( st->id == -1 ) + { + // we keep the steam timing info in an array with some power-of-two + // number of slots. If we don't have two slots left (one for our new + // entry plus one for the "-1" eol) we need to expand the array. + int slot = st - r->stream_timing; + if ( slot + 1 >= r->st_slots ) + { + r->st_slots *= 2; + r->stream_timing = realloc( r->stream_timing, r->st_slots * + sizeof(*r->stream_timing) ); + st = r->stream_timing + slot; + } + st->id = buf->s.id; + st->average = 30.*90.; + st->filtered_average = st->average; + st->startup = 10; + st->last = -st->average; + if ( ( st->is_audio = is_audio( r, buf->s.id ) ) != 0 ) + { + r->saw_audio = 1; + } + st[1].id = -1; + st->valid = valid; + } + return st; +} + +// update the average inter-packet time of the stream associated with 'buf' +// using a recursive low-pass filter with a 16 packet time constant. + +static void update_ipt( hb_work_private_t *r, const hb_buffer_t *buf ) +{ + stream_timing_t *st = id_to_st( r, buf, 1 ); + + if( buf->s.renderOffset < 0 ) + { + st->last += st->filtered_average; + return; + } + + double dt = buf->s.renderOffset - st->last; + + // Protect against spurious bad timestamps + // timestamps should only move forward and by reasonable increments + if ( dt > 0 && dt < 5 * 90000LL ) + { + if( st->startup ) + { + st->average += ( dt - st->average ) * (1./4.); + st->startup--; + } + else + { + st->average += ( dt - st->average ) * (1./32.); + } + // Ignore outliers + if (dt < 1.5 * st->average) + { + st->filtered_average += ( dt - st->filtered_average ) * (1./32.); + } + } + st->last = buf->s.renderOffset; + st->valid = 1; +} + +// use the per-stream state associated with 'buf' to compute a new scr_offset +// such that 'buf' will follow the previous packet of this stream separated +// by the average packet time of the stream. + +static void new_scr_offset( hb_work_private_t *r, hb_buffer_t *buf ) +{ + 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->filtered_average; + r->scr_offset = buf->s.renderOffset - nxt; + // This log is handy when you need to debug timing problems... + //hb_log("id %x last %"PRId64" avg %g nxt %"PRId64" renderOffset %"PRId64 + // " scr_offset %"PRId64"", + // buf->s.id, last, st->filtered_average, nxt, + // buf->s.renderOffset, r->scr_offset); + r->scr_changes = r->demux.scr_changes; +} + +/*********************************************************************** + * ReaderFunc + *********************************************************************** + * + **********************************************************************/ +void ReadLoop( void * _w ) +{ + hb_work_object_t * w = _w; + hb_work_private_t * r = w->private_data; + hb_fifo_t ** fifos; + hb_buffer_t * buf; + hb_list_t * list; + int n; + int chapter = -1; + int chapter_end = r->job->chapter_end; + uint8_t done = 0; + + if (r->bd) + { + if( !hb_bd_start( r->bd, r->title ) ) + { + hb_bd_close( &r->bd ); + 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 ) + { + // Note, bd seeks always put us to an i-frame. no need + // to start decoding early using r->pts_to_start + hb_bd_seek_pts( r->bd, r->job->pts_to_start ); + r->duration -= 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 ); + } + } + else if (r->dvd) + { + /* + * XXX this code is a temporary hack that should go away if/when + * chapter merging goes away in libhb/dvd.c + * map the start and end chapter numbers to on-media chapter + * numbers since chapter merging could cause the handbrake numbers + * to diverge from the media numbers and, if our chapter_end is after + * a media chapter that got merged, we'll stop ripping too early. + */ + int start = r->job->chapter_start; + hb_chapter_t *chap = hb_list_item( r->job->list_chapter, chapter_end - 1 ); + + chapter_end = chap->index; + if (start > 1) + { + chap = hb_list_item( r->job->list_chapter, start - 1 ); + start = chap->index; + } + /* end chapter mapping XXX */ + + if( !hb_dvd_start( r->dvd, r->title, start ) ) + { + hb_dvd_close( &r->dvd ); + return; + } + if (r->job->angle) + { + hb_dvd_set_angle( r->dvd, r->job->angle ); + } + + if ( r->job->start_at_preview ) + { + // XXX code from DecodePreviews - should go into its own routine + hb_dvd_seek( r->dvd, (float)r->job->start_at_preview / + ( r->job->seek_points ? ( r->job->seek_points + 1.0 ) : 11.0 ) ); + } + } + else if ( r->stream && r->job->start_at_preview ) + { + + // XXX code from DecodePreviews - should go into its own routine + hb_stream_seek( r->stream, (float)( r->job->start_at_preview - 1 ) / + ( 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 ( ( buf = hb_stream_read( r->stream ) ) ) + { + if ( buf->s.start > 0 ) + { + pts_to_start += buf->s.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->duration -= r->job->pts_to_start; + r->job->pts_to_start = pts_to_start; + } + } + else if( r->stream ) + { + /* + * Standard stream, seek to the starting chapter, if set, and track the + * end chapter so that we end at the right time. + */ + int start = r->job->chapter_start; + hb_chapter_t *chap = hb_list_item( r->job->list_chapter, chapter_end - 1 ); + + chapter_end = chap->index; + if (start > 1) + { + chap = hb_list_item( r->job->list_chapter, start - 1 ); + start = chap->index; + } + + /* + * Seek to the start chapter. + */ + hb_stream_seek_chapter( r->stream, start ); + } + + list = hb_list_init(); + + while(!*r->die && !r->job->done && !done) + { + 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 ); + + if( chapter < 0 ) + { + hb_log( "reader: end of the title reached" ); + break; + } + if( chapter > chapter_end ) + { + hb_log( "reader: end of chapter %d (media %d) reached at media chapter %d", + r->job->chapter_end, chapter_end, chapter ); + break; + } + + if (r->bd) + { + if( (buf = hb_bd_read( r->bd )) == NULL ) + { + break; + } + } + else if (r->dvd) + { + if( (buf = hb_dvd_read( r->dvd )) == NULL ) + { + break; + } + } + else if (r->stream) + { + if ( (buf = hb_stream_read( r->stream )) == NULL ) + { + 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 ( buf->s.start > 0 && buf->s.start < r->job->pts_to_start ) + { + r->job->pts_to_start -= buf->s.start; + } + else if ( buf->s.start >= r->job->pts_to_start ) + { + r->job->pts_to_start = 0; + r->start_found = 1; + } + } + } + + (hb_demux[r->title->demuxer])( buf, list, &r->demux ); + + while( ( buf = hb_list_item( list, 0 ) ) ) + { + hb_list_rem( list, buf ); + fifos = GetFifoForId( r, buf->s.id ); + + 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 + // we get one. + if ( buf->s.start != -1 && buf->s.renderOffset != -1 && + ( buf->s.id == r->title->video_id || is_audio( r, buf->s.id ) ) ) + { + // force a new scr offset computation + 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, 1 ); + r->saw_video = 1; + hb_log( "reader: first SCR %"PRId64" id 0x%x DTS %"PRId64, + r->demux.last_scr, buf->s.id, buf->s.renderOffset ); + } + else + { + fifos = NULL; + } + } + + if ( r->job->indepth_scan || fifos ) + { + if ( buf->s.renderOffset != -1 ) + { + 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 = 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 ) ) + { + 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. + buf->s.start = -1; + buf->s.renderOffset = -1; + } + } + } + if ( buf->s.start != -1 ) + { + int64_t start = buf->s.start - r->scr_offset; + + if (!r->start_found || r->job->indepth_scan) + { + UpdateState( r, start ); + } + + if (r->job->indepth_scan && r->job->pts_to_stop && + start >= r->pts_to_start + r->job->pts_to_stop) + { + // sync normally would terminate p-to-p + // but sync doesn't run during indepth scan + hb_log( "reader: reached pts %"PRId64", exiting early", start ); + done = 1; + break; + } + + if ( !r->start_found && + start >= r->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 %"PRId64 + // " start %"PRId64" --> %"PRId64"", + // buf->s.id, r->scr_offset, buf->s.start, + // buf->s.start - r->scr_offset); + buf->s.start -= r->scr_offset; + } + if ( buf->s.renderOffset != -1 ) + { + // 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->s.renderOffset -= r->scr_offset; + update_ipt( r, buf ); + } +#if 0 + // JAS: This was added to fix a rare "audio time went backward" + // sync error I found in one sample. But it has a bad side + // effect on DVDs, causing frequent "adding silence" sync + // errors. So I am disabling it. + else + { + update_ipt( r, buf ); + } +#endif + } + if( fifos ) + { + if ( !r->start_found ) + { + hb_buffer_close( &buf ); + continue; + } + + buf->sequence = r->sequence++; + /* if there are mutiple output fifos, send a copy of the + * buffer down all but the first (we have to not ship the + * original buffer or we'll race with the thread that's + * consuming the buffer & inject garbage into the data stream). */ + for( n = 1; fifos[n] != NULL; n++) + { + hb_buffer_t *buf_copy = hb_buffer_init( buf->size ); + buf_copy->s = buf->s; + memcpy( buf_copy->data, buf->data, buf->size ); + push_buf( r, fifos[n], buf_copy ); + } + push_buf( r, fifos[0], buf ); + } + else + { + hb_buffer_close( &buf ); + } + } + } + + // send empty buffers downstream to video & audio decoders to signal we're done. + if( !*r->die && !r->job->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->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->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_log( "reader: done. %d scr changes", r->demux.scr_changes ); + if ( r->demux.dts_drops ) + { + hb_log( "reader: %d drops because DTS out of range", r->demux.dts_drops ); + } +} + +static void UpdateState( hb_work_private_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 + if ( !r->job->indepth_scan ) + { + state.state = HB_STATE_SEARCHING; + p.progress = (float) start / (float) r->job->pts_to_start; + } + else + { + state.state = HB_STATE_WORKING; + p.progress = (float) start / (float) r->duration; + } + if( p.progress > 1.0 ) + { + p.progress = 1.0; + } + p.rate_cur = 0.0; + p.rate_avg = 0.0; + if (now > r->st_first) + { + int eta; + + avg = 1000.0 * (double)start / (now - r->st_first); + if ( !r->job->indepth_scan ) + eta = ( r->job->pts_to_start - start ) / avg; + else + eta = ( r->duration - start ) / avg; + p.hours = eta / 3600; + p.minutes = ( eta % 3600 ) / 60; + p.seconds = eta % 60; + } + else + { + p.hours = -1; + p.minutes = -1; + p.seconds = -1; + } +#undef p + + hb_set_state( r->job->h, &state ); +} +/*********************************************************************** + * GetFifoForId + *********************************************************************** + * + **********************************************************************/ +static hb_fifo_t ** GetFifoForId( hb_work_private_t * r, int id ) +{ + hb_job_t * job = r->job; + hb_title_t * title = job->title; + hb_audio_t * audio; + hb_subtitle_t * subtitle; + int i, n, count; + + memset(r->fifos, 0, sizeof(r->fifos)); + + if( id == title->video_id ) + { + if (job->indepth_scan && !job->frame_to_stop) + { + /* + * Ditch the video here during the indepth scan until + * we can improve the MPEG2 decode performance. + * + * But if we specify a stop frame, we must decode the + * frames in order to count them. + */ + return NULL; + } + else + { + r->fifos[0] = job->fifo_mpeg2; + return r->fifos; + } + } + + count = hb_list_count( job->list_subtitle ); + count = count > 99 ? 99 : count; + for( i = n = 0; i < count; i++ ) + { + subtitle = hb_list_item( job->list_subtitle, i ); + if (id == subtitle->id) + { + /* pass the subtitles to be processed */ + r->fifos[n++] = subtitle->fifo_in; + } + } + if ( n != 0 ) + { + return r->fifos; + } + + if( !job->indepth_scan ) + { + for( i = n = 0; i < hb_list_count( job->list_audio ); i++ ) + { + audio = hb_list_item( job->list_audio, i ); + if( id == audio->id ) + { + r->fifos[n++] = audio->priv.fifo_in; + } + } + + if( n != 0 ) + { + return r->fifos; + } + } + + return NULL; +} + diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/04/0491ecaec7b4eff7fb703eb78a393d32f9e0f79a.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/04/0491ecaec7b4eff7fb703eb78a393d32f9e0f79a.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/04/0491ecaec7b4eff7fb703eb78a393d32f9e0f79a.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/04/0491ecaec7b4eff7fb703eb78a393d32f9e0f79a.svn-base 2013-05-18 16:12:16.000000000 +0000 @@ -0,0 +1 @@ +ARCHS = $(NATIVE_ARCH_ACTUAL) diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/05/0511e1115018da4e2408d07e476e654bb0ad4a71.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/05/0511e1115018da4e2408d07e476e654bb0ad4a71.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/05/0511e1115018da4e2408d07e476e654bb0ad4a71.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/05/0511e1115018da4e2408d07e476e654bb0ad4a71.svn-base 2013-05-18 16:12:19.000000000 +0000 @@ -0,0 +1,2 @@ +$(eval $(call import.MODULE.rules,LIBASS)) +$(eval $(call import.CONTRIB.rules,LIBASS)) diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/05/05d8c62d8c74b9042a27a6fc21e84c1f2d70545a.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/05/05d8c62d8c74b9042a27a6fc21e84c1f2d70545a.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/05/05d8c62d8c74b9042a27a6fc21e84c1f2d70545a.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/05/05d8c62d8c74b9042a27a6fc21e84c1f2d70545a.svn-base 2013-05-18 16:12:19.000000000 +0000 @@ -0,0 +1,20 @@ +@anchor{troubleshooting} +@chapter Troubleshooting +When troubleshooting build issues, the following files relative to the @file{build/} directory may be especially useful: + +@table @file +@item GNUmakefile +Top-level makefile which contains build settings generated via @b{configure}. + +@item log/config.info.txt +Record of output from @b{configure}. + +@item log/config.verbose.txt +Record of verbose output from @b{configure}. + +@item log/build.txt +Record of output from @command{configure --launch}. Similar output may be recorded using @command{make} depending on which shell is in use, eg: @command{make >& log/build.txt} or @command{make > log/build.txt 2>&1}. + +@item log/xcodemake.env.txt +Environment (variables) dump as seen when Xcode forks @command{make}. @value{OS.osx} only. +@end table diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/06/06ed16c98adcd498540fed0bd609c9ece6696166.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/06/06ed16c98adcd498540fed0bd609c9ece6696166.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/06/06ed16c98adcd498540fed0bd609c9ece6696166.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/06/06ed16c98adcd498540fed0bd609c9ece6696166.svn-base 2013-05-18 16:12:17.000000000 +0000 @@ -0,0 +1,71 @@ +/* DockTextField.m $ + + This file is part of the HandBrake source code. + Homepage: . + It may be used under the terms of the GNU General Public License. */ + +#import "DockTextField.h" + +#define DOCK_TEXTFIELD_ALPHA 0.8 +#define DOCK_TEXTFIELD_FONTSIZE 28.0 + +@implementation DockTextField + +@synthesize textToDisplay = _textToDisplay; +@synthesize startColor = _startColor; +@synthesize endColor = _endColor; + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [[self cell] setBezelStyle: NSTextFieldRoundedBezel]; + _textToDisplay = @""; + [self changeGradientColors:[NSColor grayColor] endColor:[NSColor blackColor]]; + } + + return self; +} + +- (void)changeGradientColors:(NSColor*)startColor endColor:(NSColor*)endColor +{ + self.startColor = [startColor colorWithAlphaComponent:DOCK_TEXTFIELD_ALPHA]; + self.endColor = [endColor colorWithAlphaComponent:DOCK_TEXTFIELD_ALPHA]; +} + +- (void)drawRect:(NSRect)dirtyRect +{ + if (self.isHidden) + return; + + NSRect blackOutlineFrame = NSMakeRect(0.0, 0.0, [self bounds].size.width, [self bounds].size.height-1.0); + double radius = self.bounds.size.height / 2; + + NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:self.startColor endingColor:self.endColor]; + [gradient drawInBezierPath:[NSBezierPath bezierPathWithRoundedRect:blackOutlineFrame xRadius:radius yRadius:radius] angle:90]; + [gradient release]; + + NSMutableDictionary *drawStringAttributes = [[NSMutableDictionary alloc] init]; + [drawStringAttributes setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName]; + [drawStringAttributes setValue:[NSFont boldSystemFontOfSize:DOCK_TEXTFIELD_FONTSIZE] forKey:NSFontAttributeName]; + NSShadow *stringShadow = [[NSShadow alloc] init]; + [stringShadow setShadowColor:[NSColor blackColor]]; + NSSize shadowSize; + shadowSize.width = 2; + shadowSize.height = -2; + [stringShadow setShadowOffset:shadowSize]; + [stringShadow setShadowBlurRadius:6]; + [drawStringAttributes setValue:stringShadow forKey:NSShadowAttributeName]; + [stringShadow release]; + + NSString *MRString = _textToDisplay; + NSString *budgetString = [NSString stringWithFormat:@"%@", MRString]; + NSSize stringSize = [budgetString sizeWithAttributes:drawStringAttributes]; + NSPoint centerPoint; + centerPoint.x = (dirtyRect.size.width / 2) - (stringSize.width / 2); + centerPoint.y = dirtyRect.size.height / 2 - (stringSize.height / 2) - 2; + [budgetString drawAtPoint:centerPoint withAttributes:drawStringAttributes]; + [drawStringAttributes release]; +} + +@end diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/07/0729596467a293692a20c348cf6c48744107a553.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/07/0729596467a293692a20c348cf6c48744107a553.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/07/0729596467a293692a20c348cf6c48744107a553.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/07/0729596467a293692a20c348cf6c48744107a553.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,1016 @@ + + True + True + True + False + HINT + HINT + DO_NOT_SHOW + DO_NOT_SHOW + HINT + DO_NOT_SHOW + HINT + HINT + DO_NOT_SHOW + DO_NOT_SHOW + HINT + <?xml version="1.0" encoding="utf-16"?><Profile name="StyleCop"><CSArrangeThisQualifier>True</CSArrangeThisQualifier><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSReformatCode>True</CSReformatCode><CSReorderTypeMembers>True</CSReorderTypeMembers><StyleCop.Documentation><SA1600ElementsMustBeDocumented>True</SA1600ElementsMustBeDocumented><SA1604ElementDocumentationMustHaveSummary>True</SA1604ElementDocumentationMustHaveSummary><SA1609PropertyDocumentationMustHaveValueDocumented>True</SA1609PropertyDocumentationMustHaveValueDocumented><SA1611ElementParametersMustBeDocumented>True</SA1611ElementParametersMustBeDocumented><SA1615ElementReturnValueMustBeDocumented>True</SA1615ElementReturnValueMustBeDocumented><SA1617VoidReturnValueMustNotBeDocumented>True</SA1617VoidReturnValueMustNotBeDocumented><SA1618GenericTypeParametersMustBeDocumented>True</SA1618GenericTypeParametersMustBeDocumented><SA1626SingleLineCommentsMustNotUseDocumentationStyleSlashes>True</SA1626SingleLineCommentsMustNotUseDocumentationStyleSlashes><SA1628DocumentationTextMustBeginWithACapitalLetter>True</SA1628DocumentationTextMustBeginWithACapitalLetter><SA1629DocumentationTextMustEndWithAPeriod>True</SA1629DocumentationTextMustEndWithAPeriod><SA1633SA1641UpdateFileHeader>ReplaceCopyrightElement</SA1633SA1641UpdateFileHeader><SA1639FileHeaderMustHaveSummary>True</SA1639FileHeaderMustHaveSummary><SA1642ConstructorSummaryDocumentationMustBeginWithStandardText>True</SA1642ConstructorSummaryDocumentationMustBeginWithStandardText><SA1643DestructorSummaryDocumentationMustBeginWithStandardText>True</SA1643DestructorSummaryDocumentationMustBeginWithStandardText><SA1644DocumentationHeadersMustNotContainBlankLines>True</SA1644DocumentationHeadersMustNotContainBlankLines></StyleCop.Documentation><StyleCop.Layout><SA1500CurlyBracketsForMultiLineStatementsMustNotShareLine>True</SA1500CurlyBracketsForMultiLineStatementsMustNotShareLine><SA1509OpeningCurlyBracketsMustNotBePrecededByBlankLine>True</SA1509OpeningCurlyBracketsMustNotBePrecededByBlankLine><SA1510ChainedStatementBlocksMustNotBePrecededByBlankLine>True</SA1510ChainedStatementBlocksMustNotBePrecededByBlankLine><SA1511WhileDoFooterMustNotBePrecededByBlankLine>True</SA1511WhileDoFooterMustNotBePrecededByBlankLine><SA1512SingleLineCommentsMustNotBeFollowedByBlankLine>True</SA1512SingleLineCommentsMustNotBeFollowedByBlankLine><SA1513ClosingCurlyBracketMustBeFollowedByBlankLine>True</SA1513ClosingCurlyBracketMustBeFollowedByBlankLine><SA1514ElementDocumentationHeaderMustBePrecededByBlankLine>True</SA1514ElementDocumentationHeaderMustBePrecededByBlankLine><SA1515SingleLineCommentMustBeProceededByBlankLine>True</SA1515SingleLineCommentMustBeProceededByBlankLine></StyleCop.Layout><StyleCop.Maintainability><SA1119StatementMustNotUseUnnecessaryParenthesis>True</SA1119StatementMustNotUseUnnecessaryParenthesis></StyleCop.Maintainability><StyleCop.Ordering><AlphabeticalUsingDirectives>Alphabetical</AlphabeticalUsingDirectives><ExpandUsingDirectives>FullyQualify</ExpandUsingDirectives><SA1212PropertyAccessorsMustFollowOrder>True</SA1212PropertyAccessorsMustFollowOrder><SA1213EventAccessorsMustFollowOrder>True</SA1213EventAccessorsMustFollowOrder></StyleCop.Ordering><StyleCop.Readability><SA1100DoNotPrefixCallsWithBaseUnlessLocalImplementationExists>True</SA1100DoNotPrefixCallsWithBaseUnlessLocalImplementationExists><SA1106CodeMustNotContainEmptyStatements>True</SA1106CodeMustNotContainEmptyStatements><SA1108BlockStatementsMustNotContainEmbeddedComments>True</SA1108BlockStatementsMustNotContainEmbeddedComments><SA1109BlockStatementsMustNotContainEmbeddedRegions>True</SA1109BlockStatementsMustNotContainEmbeddedRegions><SA1120CommentsMustContainText>True</SA1120CommentsMustContainText><SA1121UseBuiltInTypeAlias>True</SA1121UseBuiltInTypeAlias><SA1122UseStringEmptyForEmptyStrings>True</SA1122UseStringEmptyForEmptyStrings><SA1123DoNotPlaceRegionsWithinElements>True</SA1123DoNotPlaceRegionsWithinElements><SA1124CodeMustNotContainEmptyRegions>True</SA1124CodeMustNotContainEmptyRegions></StyleCop.Readability><StyleCop.Spacing><SA1001CommasMustBeSpacedCorrectly>True</SA1001CommasMustBeSpacedCorrectly><SA1005SingleLineCommentsMustBeginWithSingleSpace>True</SA1005SingleLineCommentsMustBeginWithSingleSpace><SA1006PreprocessorKeywordsMustNotBePrecededBySpace>True</SA1006PreprocessorKeywordsMustNotBePrecededBySpace><SA1021NegativeSignsMustBeSpacedCorrectly>True</SA1021NegativeSignsMustBeSpacedCorrectly><SA1022PositiveSignsMustBeSpacedCorrectly>True</SA1022PositiveSignsMustBeSpacedCorrectly><SA1025CodeMustNotContainMultipleWhitespaceInARow>True</SA1025CodeMustNotContainMultipleWhitespaceInARow></StyleCop.Spacing></Profile> + Default: Full Cleanup + StyleCop + False + True + 1 + 1 + 1 + SEPARATE + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + ALWAYS_ADD + False + False + 1 + 1 + False + public protected internal private static new abstract virtual override sealed readonly extern unsafe volatile async + False + False + False + False + True + ALWAYS_USE + ON_SINGLE_LINE + False + True + False + False + True + False + True + True + CHOP_IF_LONG + True + True + CHOP_IF_LONG + CHOP_IF_LONG + True + <?xml version="1.0" encoding="utf-8"?> +<!-- Last updated 15.05.2012 --> +<Patterns xmlns="urn:shemas-jetbrains-com:member-reordering-patterns"> + + <!-- Do not reorder COM interfaces --> + <Pattern> + <Match> + <And Weight="2000"> + <Kind Is="interface"/> + <Or> + <HasAttribute CLRName="System.Runtime.InteropServices.InterfaceTypeAttribute"/> + <HasAttribute CLRName="System.Runtime.InteropServices.ComImport"/> + </Or> + </And> + </Match> + </Pattern> + + <!-- Do not reorder P/Invoke structs --> + <Pattern> + <Match> + <And Weight="2000"> + <Or> + <Kind Is="struct"/> + <Kind Is="class"/> + </Or> + <HasAttribute CLRName="System.Runtime.InteropServices.StructLayoutAttribute"/> + </And> + </Match> + </Pattern> + + <!-- Do not reorder P/Invoke classes (called xxxNativeMethods) --> + <Pattern> + <Match> + <And Weight="2000"> + <Kind Is="class"/> + <Name Is=".*NativeMethods" /> + </And> + </Match> + </Pattern> + + <!-- StyleCop pattern --> + <Pattern RemoveAllRegions="true"> + <Match> + <Or Weight="1000" > + <Kind Is="class" /> + <Kind Is="struct" /> + <Kind Is="interface"/> + </Or> + </Match> + + <!-- Constants --> + <Entry> + <Match> + <Kind Is="constant"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private"/> + <Name/> + </Sort> + <Group Region="Constants"/> + </Entry> + + <!-- Static fields --> + <Entry> + <Match> + <And> + <Kind Is="field"/> + <Static /> + </And> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private"/> + <Readonly/> + <Name/> + </Sort> + <Group Region="Static Fields"/> + </Entry> + + <!-- Fields --> + <Entry> + <Match> + <Kind Is="field"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private"/> + <Readonly/> + <Name/> + </Sort> + <Group Region="Fields"/> + </Entry> + + <!-- constructors and destructors --> + <Entry> + <Match> + <Or Weight="200"> + <Kind Is="constructor"/> + <Kind Is="destructor"/> + </Or> + </Match> + <Sort> + <Static/> + <Kind Order="constructor destructor"/> + <Access Order="public internal protected-internal protected private"/> + </Sort> + <Group Region="Constructors and Destructors"/> + </Entry> + + <!-- delegates --> + <Entry> + <Match> + <Kind Is="delegate"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Static /> + <Name/> + </Sort> + <Group Region="Delegates"/> + </Entry> + + <!-- public events --> + <Entry> + <Match> + <And> + <Kind Is="event"/> + <Access Is="public"/> + </And> + </Match> + <Sort> + <Access Order="public" /> + <Static /> + <Name/> + </Sort> + <Group Region="Public Events"/> + </Entry> + + <!-- interface events --> + <Entry> + <Match> + <And> + <Kind Is="event"/> + <ImplementsInterface/> + </And> + </Match> + <Sort> + <ImplementsInterface Immediate="true"/> + <Name/> + </Sort> + <Group Region="Explicit Interface Events" /> + </Entry> + + <!-- other events --> + <Entry> + <Match> + <Kind Is="event"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Static /> + <Name/> + </Sort> + <Group Region="Events"/> + </Entry> + + <!-- enum --> + <Entry> + <Match> + <Kind Is="enum"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Name/> + </Sort> + <Group Region="Enums"/> + </Entry> + + <!-- interfaces --> + <Entry> + <Match> + <Kind Is="interface" /> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Name/> + </Sort> + <Group Region="Interfaces"/> + </Entry> + + <!-- public properties --> + <Entry> + <Match> + <And> + <Kind Is="property"/> + <Access Is="public"/> + </And> + </Match> + <Sort> + <Access Order="public"/> + <Static/> + <Name/> + </Sort> + <Group Region="Public Properties"/> + </Entry> + + <!-- interface properties --> + <Entry> + <Match> + <And> + <Kind Is="property"/> + <ImplementsInterface/> + </And> + </Match> + <Sort> + <ImplementsInterface Immediate="true"/> + <Name/> + </Sort> + <Group Region="Explicit Interface Properties" /> + </Entry> + + <!-- other properties --> + <Entry> + <Match> + <Kind Is="property"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private"/> + <Static/> + <Name/> + </Sort> + <Group Region="Properties"/> + </Entry> + + <!-- public indexers --> + <Entry> + <Match> + <And> + <Kind Is="indexer" Weight="1000" /> + <Access Is="public"/> + </And> + </Match> + <Sort> + <Access Order="public" /> + <Static/> + <Name/> + </Sort> + <Group Region="Public Indexers"/> + </Entry> + + <!-- interface indexers --> + <Entry> + <Match> + <And> + <Kind Is="indexer" Weight="1000"/> + <ImplementsInterface/> + </And> + </Match> + <Sort> + <ImplementsInterface Immediate="true"/> + <Name/> + </Sort> + <Group Region="Explicit Interface Indexers" /> + </Entry> + + <!-- other indexers --> + <Entry> + <Match> + <Kind Is="indexer" Weight="1000" /> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Static/> + <Name/> + </Sort> + <Group Region="Indexers"/> + </Entry> + + <!-- public methods (includes operators) --> + <Entry> + <Match> + <And> + <Or> + <Kind Is="method"/> + <Kind Is="operator"/> + </Or> + <Access Is="public"/> + </And> + </Match> + <Sort> + <Access Order="public"/> + <Static/> + <Name/> + </Sort> + <Group Region="Public Methods and Operators"/> + </Entry> + + <!-- interface methods --> + <Entry> + <Match> + <And> + <Kind Is="method"/> + <ImplementsInterface/> + </And> + </Match> + <Sort> + <ImplementsInterface Immediate="true"/> + <Name/> + </Sort> + <Group Region="Explicit Interface Methods" /> + </Entry> + + <!-- other methods --> + <Entry> + <Match> + <Kind Is="method"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private"/> + <Static/> + <Name/> + </Sort> + <Group Region="Methods"/> + </Entry> + + <!-- operators --> + <Entry> + <Match> + <Kind Is="operator"/> + </Match> + <Sort> + <Access Order="public internal protected-internal protected private" /> + <Static/> + <Name/> + </Sort> + <Group Region="Operators"/> + </Entry> + + <!-- Nested structs --> + <Entry> + <Match> + <Kind Is="struct" + Weight="600" /> + </Match> + <Sort> + <Static /> + <Access Order="public internal protected-internal protected private" /> + <Name/> + </Sort> + </Entry> + + <!-- Nested classes --> + <Entry> + <Match> + <Kind Is="class" + Weight="700" /> + </Match> + <Sort> + <Static /> + <Access Order="public internal protected-internal protected private" /> + <Name/> + </Sort> + </Entry> + + <!-- all other members --> + <Entry/> + + </Pattern> +</Patterns> + True + True + True + False + True + True + False + True + True + False + False + True + Automatic property + True + True + True + True + False + False + AAC + AC + DTS + DTSHD + HD + MP + RF + UI + $object$_On$event$ + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + $object$_On$event$ + False + True + ObjectBrowser + False + False + False + False + False + False + False + False + False + False + False + True + True + True + False + VS + SymbolsVs08 + False + True + True + Updates + -13,-311 + True + 271 + 269 + 91 + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + NotOverridden + NotOverridden + NotOverridden + NotOverridden + NotOverridden + NotOverridden + NotOverridden + NotOverridden + NotOverridden \ No newline at end of file diff -Nru handbrake-0.9.8ppa1~precise1/.svn/pristine/07/074713099caa6d08be6b0d1ffd58d7e773063109.svn-base handbrake-0.9.9ppa1~precise1/.svn/pristine/07/074713099caa6d08be6b0d1ffd58d7e773063109.svn-base --- handbrake-0.9.8ppa1~precise1/.svn/pristine/07/074713099caa6d08be6b0d1ffd58d7e773063109.svn-base 1970-01-01 00:00:00.000000000 +0000 +++ handbrake-0.9.9ppa1~precise1/.svn/pristine/07/074713099caa6d08be6b0d1ffd58d7e773063109.svn-base 2013-05-18 16:12:18.000000000 +0000 @@ -0,0 +1,449 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. +// +// +// The Audio View Model +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace HandBrakeWPF.ViewModels +{ + using System; + using System.Collections.Generic; + using System.Collections.ObjectModel; + using System.Collections.Specialized; + using System.Linq; + + using Caliburn.Micro; + + using HandBrake.ApplicationServices.Model; + using HandBrake.ApplicationServices.Model.Encoding; + using HandBrake.ApplicationServices.Parsing; + using HandBrake.ApplicationServices.Services.Interfaces; + using HandBrake.ApplicationServices.Utilities; + using HandBrake.Interop.Model.Encoding; + + using HandBrakeWPF.Commands; + using HandBrakeWPF.Model; + using HandBrakeWPF.ViewModels.Interfaces; + + /// + /// The Audio View Model + /// + public class AudioViewModel : ViewModelBase, IAudioViewModel + { + /// + /// Backing field for the source tracks list. + /// + private IEnumerable