1 /* $Id: HBSubtitles.m,v 1.35 2005/08/01 14:29:50 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.fr/>.
5 It may be used under the terms of the GNU General Public License. */
8 #import "HBSubtitles.h"
18 @implementation HBSubtitles
27 /* setup our array of languages */
28 languagesArray = [[NSMutableArray alloc] init];
29 [languagesArray addObject:[NSArray arrayWithObjects:@"Any",@"und",nil]];
30 [languagesArray addObject:[NSArray arrayWithObjects:@"Afar",@"aar",nil]];
31 [languagesArray addObject:[NSArray arrayWithObjects:@"Abkhazian",@"abk",nil]];
32 [languagesArray addObject:[NSArray arrayWithObjects:@"Afrikaans",@"afr",nil]];
33 [languagesArray addObject:[NSArray arrayWithObjects:@"Akan",@"ak",nil]];
34 [languagesArray addObject:[NSArray arrayWithObjects:@"Albanian",@"sqi",nil]];
35 [languagesArray addObject:[NSArray arrayWithObjects:@"Amharic",@"amh",nil]];
36 [languagesArray addObject:[NSArray arrayWithObjects:@"Arabic",@"ara",nil]];
37 [languagesArray addObject:[NSArray arrayWithObjects:@"Aragonese",@"arg",nil]];
38 [languagesArray addObject:[NSArray arrayWithObjects:@"Armenian",@"hye",nil]];
39 [languagesArray addObject:[NSArray arrayWithObjects:@"Assamese",@"asm",nil]];
40 [languagesArray addObject:[NSArray arrayWithObjects:@"Avaric",@"ava",nil]];
41 [languagesArray addObject:[NSArray arrayWithObjects:@"Avestan",@"ave",nil]];
42 [languagesArray addObject:[NSArray arrayWithObjects:@"Aymara",@"aym",nil]];
43 [languagesArray addObject:[NSArray arrayWithObjects:@"Azerbaijani",@"aze",nil]];
44 [languagesArray addObject:[NSArray arrayWithObjects:@"Bashkir",@"bak",nil]];
45 [languagesArray addObject:[NSArray arrayWithObjects:@"Bambara",@"bam",nil]];
46 [languagesArray addObject:[NSArray arrayWithObjects:@"Basque",@"eus",nil]];
47 [languagesArray addObject:[NSArray arrayWithObjects:@"Belarusian",@"bel",nil]];
48 [languagesArray addObject:[NSArray arrayWithObjects:@"Bengali",@"ben",nil]];
49 [languagesArray addObject:[NSArray arrayWithObjects:@"Bihari",@"bih",nil]];
50 [languagesArray addObject:[NSArray arrayWithObjects:@"Bislama",@"bis",nil]];
51 [languagesArray addObject:[NSArray arrayWithObjects:@"Bosnian",@"bos",nil]];
52 [languagesArray addObject:[NSArray arrayWithObjects:@"Breton",@"bre",nil]];
53 [languagesArray addObject:[NSArray arrayWithObjects:@"Bulgarian",@"bul",nil]];
54 [languagesArray addObject:[NSArray arrayWithObjects:@"Burmese",@"mya",nil]];
55 [languagesArray addObject:[NSArray arrayWithObjects:@"Catalan",@"cat",nil]];
56 [languagesArray addObject:[NSArray arrayWithObjects:@"Chamorro",@"cha",nil]];
57 [languagesArray addObject:[NSArray arrayWithObjects:@"Chechen",@"che",nil]];
58 [languagesArray addObject:[NSArray arrayWithObjects:@"Chinese",@"zho",nil]];
59 [languagesArray addObject:[NSArray arrayWithObjects:@"Church Slavic",@"chu",nil]];
60 [languagesArray addObject:[NSArray arrayWithObjects:@"Chuvash",@"chv",nil]];
61 [languagesArray addObject:[NSArray arrayWithObjects:@"Cornish",@"cor",nil]];
62 [languagesArray addObject:[NSArray arrayWithObjects:@"Corsican",@"cos",nil]];
63 [languagesArray addObject:[NSArray arrayWithObjects:@"Cree",@"cre",nil]];
64 [languagesArray addObject:[NSArray arrayWithObjects:@"Czech",@"ces",nil]];
65 [languagesArray addObject:[NSArray arrayWithObjects:@"Danish",@"dan",nil]];
66 [languagesArray addObject:[NSArray arrayWithObjects:@"Divehi",@"div",nil]];
67 [languagesArray addObject:[NSArray arrayWithObjects:@"Dutch",@"nld",nil]];
68 [languagesArray addObject:[NSArray arrayWithObjects:@"Dzongkha",@"dzo",nil]];
69 [languagesArray addObject:[NSArray arrayWithObjects:@"English",@"eng",nil]];
70 [languagesArray addObject:[NSArray arrayWithObjects:@"Esperanto",@"epo",nil]];
71 [languagesArray addObject:[NSArray arrayWithObjects:@"Estonian",@"est",nil]];
72 [languagesArray addObject:[NSArray arrayWithObjects:@"Ewe",@"ewe",nil]];
73 [languagesArray addObject:[NSArray arrayWithObjects:@"Faroese",@"fao",nil]];
74 [languagesArray addObject:[NSArray arrayWithObjects:@"Fijian",@"fij",nil]];
75 [languagesArray addObject:[NSArray arrayWithObjects:@"Finnish",@"fin",nil]];
76 [languagesArray addObject:[NSArray arrayWithObjects:@"French",@"fra",nil]];
77 [languagesArray addObject:[NSArray arrayWithObjects:@"Western Frisian",@"fry",nil]];
78 [languagesArray addObject:[NSArray arrayWithObjects:@"Fulah",@"ful",nil]];
79 [languagesArray addObject:[NSArray arrayWithObjects:@"Georgian",@"kat",nil]];
80 [languagesArray addObject:[NSArray arrayWithObjects:@"German",@"deu",nil]];
81 [languagesArray addObject:[NSArray arrayWithObjects:@"Gaelic (Scots)",@"gla",nil]];
82 [languagesArray addObject:[NSArray arrayWithObjects:@"Irish",@"gle",nil]];
83 [languagesArray addObject:[NSArray arrayWithObjects:@"Galician",@"glg",nil]];
84 [languagesArray addObject:[NSArray arrayWithObjects:@"Manx",@"glv",nil]];
85 [languagesArray addObject:[NSArray arrayWithObjects:@"Greek, Modern",@"ell",nil]];
86 [languagesArray addObject:[NSArray arrayWithObjects:@"Guarani",@"grn",nil]];
87 [languagesArray addObject:[NSArray arrayWithObjects:@"Gujarati",@"guj",nil]];
88 [languagesArray addObject:[NSArray arrayWithObjects:@"Haitian",@"hat",nil]];
89 [languagesArray addObject:[NSArray arrayWithObjects:@"Hausa",@"hau",nil]];
90 [languagesArray addObject:[NSArray arrayWithObjects:@"Hebrew",@"heb",nil]];
91 [languagesArray addObject:[NSArray arrayWithObjects:@"Herero",@"her",nil]];
92 [languagesArray addObject:[NSArray arrayWithObjects:@"Hindi",@"hin",nil]];
93 [languagesArray addObject:[NSArray arrayWithObjects:@"Hiri Motu",@"hmo",nil]];
94 [languagesArray addObject:[NSArray arrayWithObjects:@"Hungarian",@"hun",nil]];
95 [languagesArray addObject:[NSArray arrayWithObjects:@"Igbo",@"ibo",nil]];
96 [languagesArray addObject:[NSArray arrayWithObjects:@"Icelandic",@"isl",nil]];
97 [languagesArray addObject:[NSArray arrayWithObjects:@"Ido",@"ido",nil]];
98 [languagesArray addObject:[NSArray arrayWithObjects:@"Sichuan Yi",@"iii",nil]];
99 [languagesArray addObject:[NSArray arrayWithObjects:@"Inuktitut",@"iku",nil]];
100 [languagesArray addObject:[NSArray arrayWithObjects:@"Interlingue",@"ile",nil]];
101 [languagesArray addObject:[NSArray arrayWithObjects:@"Interlingua",@"ina",nil]];
102 [languagesArray addObject:[NSArray arrayWithObjects:@"Indonesian",@"ind",nil]];
103 [languagesArray addObject:[NSArray arrayWithObjects:@"Inupiaq",@"ipk",nil]];
104 [languagesArray addObject:[NSArray arrayWithObjects:@"Italian",@"ita",nil]];
105 [languagesArray addObject:[NSArray arrayWithObjects:@"Javanese",@"jav",nil]];
106 [languagesArray addObject:[NSArray arrayWithObjects:@"Japanese",@"jpn",nil]];
107 [languagesArray addObject:[NSArray arrayWithObjects:@"Kalaallisut (Greenlandic)",@"kal",nil]];
108 [languagesArray addObject:[NSArray arrayWithObjects:@"Kannada",@"kan",nil]];
109 [languagesArray addObject:[NSArray arrayWithObjects:@"Kashmiri",@"kas",nil]];
110 [languagesArray addObject:[NSArray arrayWithObjects:@"Kanuri",@"kau",nil]];
111 [languagesArray addObject:[NSArray arrayWithObjects:@"Kazakh",@"kaz",nil]];
112 [languagesArray addObject:[NSArray arrayWithObjects:@"Central Khmer",@"khm",nil]];
113 [languagesArray addObject:[NSArray arrayWithObjects:@"Kikuyu",@"kik",nil]];
114 [languagesArray addObject:[NSArray arrayWithObjects:@"Kinyarwanda",@"kin",nil]];
115 [languagesArray addObject:[NSArray arrayWithObjects:@"Kirghiz",@"kir",nil]];
116 [languagesArray addObject:[NSArray arrayWithObjects:@"Komi",@"kom",nil]];
117 [languagesArray addObject:[NSArray arrayWithObjects:@"Kongo",@"kon",nil]];
118 [languagesArray addObject:[NSArray arrayWithObjects:@"Korean",@"kor",nil]];
119 [languagesArray addObject:[NSArray arrayWithObjects:@"Kuanyama",@"kua",nil]];
120 [languagesArray addObject:[NSArray arrayWithObjects:@"Kurdish",@"kur",nil]];
121 [languagesArray addObject:[NSArray arrayWithObjects:@"Lao",@"lao",nil]];
122 [languagesArray addObject:[NSArray arrayWithObjects:@"Latin",@"lat",nil]];
123 [languagesArray addObject:[NSArray arrayWithObjects:@"Latvian",@"lav",nil]];
124 [languagesArray addObject:[NSArray arrayWithObjects:@"Limburgan",@"lim",nil]];
125 [languagesArray addObject:[NSArray arrayWithObjects:@"Lingala",@"lin",nil]];
126 [languagesArray addObject:[NSArray arrayWithObjects:@"Lithuanian",@"lit",nil]];
127 [languagesArray addObject:[NSArray arrayWithObjects:@"Luxembourgish",@"ltz",nil]];
128 [languagesArray addObject:[NSArray arrayWithObjects:@"Luba-Katanga",@"lub",nil]];
129 [languagesArray addObject:[NSArray arrayWithObjects:@"Ganda",@"lug",nil]];
130 [languagesArray addObject:[NSArray arrayWithObjects:@"Macedonian",@"mkd",nil]];
131 [languagesArray addObject:[NSArray arrayWithObjects:@"Marshallese",@"mah",nil]];
132 [languagesArray addObject:[NSArray arrayWithObjects:@"Malayalam",@"mal",nil]];
133 [languagesArray addObject:[NSArray arrayWithObjects:@"Maori",@"mri",nil]];
134 [languagesArray addObject:[NSArray arrayWithObjects:@"Marathi",@"mar",nil]];
135 [languagesArray addObject:[NSArray arrayWithObjects:@"Malay",@"msa",nil]];
136 [languagesArray addObject:[NSArray arrayWithObjects:@"Malagasy",@"mlg",nil]];
137 [languagesArray addObject:[NSArray arrayWithObjects:@"Maltese",@"mlt",nil]];
138 [languagesArray addObject:[NSArray arrayWithObjects:@"Moldavian",@"mol",nil]];
139 [languagesArray addObject:[NSArray arrayWithObjects:@"Mongolian",@"mon",nil]];
140 [languagesArray addObject:[NSArray arrayWithObjects:@"Nauru",@"nau",nil]];
141 [languagesArray addObject:[NSArray arrayWithObjects:@"Navajo",@"nav",nil]];
142 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndebele, South",@"nbl",nil]];
143 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndebele, North",@"nde",nil]];
144 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndonga",@"ndo",nil]];
145 [languagesArray addObject:[NSArray arrayWithObjects:@"Nepali",@"nep",nil]];
146 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian Nynorsk",@"nno",nil]];
147 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian Bokmål",@"nob",nil]];
148 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian",@"nor",nil]];
149 [languagesArray addObject:[NSArray arrayWithObjects:@"Chichewa; Nyanja",@"nya",nil]];
150 [languagesArray addObject:[NSArray arrayWithObjects:@"Occitan (post 1500); Provençal",@"oci",nil]];
151 [languagesArray addObject:[NSArray arrayWithObjects:@"Ojibwa",@"oji",nil]];
152 [languagesArray addObject:[NSArray arrayWithObjects:@"Oriya",@"ori",nil]];
153 [languagesArray addObject:[NSArray arrayWithObjects:@"Oromo",@"orm",nil]];
154 [languagesArray addObject:[NSArray arrayWithObjects:@"Ossetian; Ossetic",@"und",nil]];
155 [languagesArray addObject:[NSArray arrayWithObjects:@"Panjabi",@"pan",nil]];
156 [languagesArray addObject:[NSArray arrayWithObjects:@"Persian",@"fas",nil]];
157 [languagesArray addObject:[NSArray arrayWithObjects:@"Pali",@"pli",nil]];
158 [languagesArray addObject:[NSArray arrayWithObjects:@"Portuguese",@"por",nil]];
159 [languagesArray addObject:[NSArray arrayWithObjects:@"Pushto",@"pus",nil]];
160 [languagesArray addObject:[NSArray arrayWithObjects:@"Quechua",@"que",nil]];
161 [languagesArray addObject:[NSArray arrayWithObjects:@"Romansh",@"roh",nil]];
162 [languagesArray addObject:[NSArray arrayWithObjects:@"Romanian",@"ron",nil]];
163 [languagesArray addObject:[NSArray arrayWithObjects:@"Rundi",@"run",nil]];
164 [languagesArray addObject:[NSArray arrayWithObjects:@"Russian",@"rus",nil]];
165 [languagesArray addObject:[NSArray arrayWithObjects:@"Sango",@"sag",nil]];
166 [languagesArray addObject:[NSArray arrayWithObjects:@"Sanskrit",@"san",nil]];
167 [languagesArray addObject:[NSArray arrayWithObjects:@"Serbian",@"srp",nil]];
168 [languagesArray addObject:[NSArray arrayWithObjects:@"Croatian",@"hrv",nil]];
169 [languagesArray addObject:[NSArray arrayWithObjects:@"Sinhala",@"sin",nil]];
170 [languagesArray addObject:[NSArray arrayWithObjects:@"Slovak",@"slk",nil]];
171 [languagesArray addObject:[NSArray arrayWithObjects:@"Slovenian",@"slv",nil]];
172 [languagesArray addObject:[NSArray arrayWithObjects:@"Northern Sami",@"sme",nil]];
173 [languagesArray addObject:[NSArray arrayWithObjects:@"Samoan",@"smo",nil]];
174 [languagesArray addObject:[NSArray arrayWithObjects:@"Shona",@"sna",nil]];
175 [languagesArray addObject:[NSArray arrayWithObjects:@"Sindhi",@"snd",nil]];
176 [languagesArray addObject:[NSArray arrayWithObjects:@"Somali",@"som",nil]];
177 [languagesArray addObject:[NSArray arrayWithObjects:@"Sotho, Southern",@"sot",nil]];
178 [languagesArray addObject:[NSArray arrayWithObjects:@"Spanish",@"spa",nil]];
179 [languagesArray addObject:[NSArray arrayWithObjects:@"Sardinian",@"srd",nil]];
180 [languagesArray addObject:[NSArray arrayWithObjects:@"Swati",@"ssw",nil]];
181 [languagesArray addObject:[NSArray arrayWithObjects:@"Sundanese",@"sun",nil]];
182 [languagesArray addObject:[NSArray arrayWithObjects:@"Swahili",@"swa",nil]];
183 [languagesArray addObject:[NSArray arrayWithObjects:@"Swedish",@"swe",nil]];
184 [languagesArray addObject:[NSArray arrayWithObjects:@"Tahitian",@"tah",nil]];
185 [languagesArray addObject:[NSArray arrayWithObjects:@"Tamil",@"tam",nil]];
186 [languagesArray addObject:[NSArray arrayWithObjects:@"Tatar",@"tat",nil]];
187 [languagesArray addObject:[NSArray arrayWithObjects:@"Telugu",@"tel",nil]];
188 [languagesArray addObject:[NSArray arrayWithObjects:@"Tajik",@"tgk",nil]];
189 [languagesArray addObject:[NSArray arrayWithObjects:@"Tagalog",@"tgl",nil]];
190 [languagesArray addObject:[NSArray arrayWithObjects:@"Thai",@"tha",nil]];
191 [languagesArray addObject:[NSArray arrayWithObjects:@"Tibetan",@"bod",nil]];
192 [languagesArray addObject:[NSArray arrayWithObjects:@"Tigrinya",@"tir",nil]];
193 [languagesArray addObject:[NSArray arrayWithObjects:@"Tonga (Tonga Islands)",@"ton",nil]];
194 [languagesArray addObject:[NSArray arrayWithObjects:@"Tswana",@"tsn",nil]];
195 [languagesArray addObject:[NSArray arrayWithObjects:@"Tsonga",@"tso",nil]];
196 [languagesArray addObject:[NSArray arrayWithObjects:@"Turkmen",@"tuk",nil]];
197 [languagesArray addObject:[NSArray arrayWithObjects:@"Turkish",@"tur",nil]];
198 [languagesArray addObject:[NSArray arrayWithObjects:@"Twi",@"twi",nil]];
199 [languagesArray addObject:[NSArray arrayWithObjects:@"Uighur",@"uig",nil]];
200 [languagesArray addObject:[NSArray arrayWithObjects:@"Ukrainian",@"ukr",nil]];
201 [languagesArray addObject:[NSArray arrayWithObjects:@"Urdu",@"urd",nil]];
202 [languagesArray addObject:[NSArray arrayWithObjects:@"Uzbek",@"uzb",nil]];
203 [languagesArray addObject:[NSArray arrayWithObjects:@"Venda",@"ven",nil]];
204 [languagesArray addObject:[NSArray arrayWithObjects:@"Vietnamese",@"vie",nil]];
205 [languagesArray addObject:[NSArray arrayWithObjects:@"Volapük",@"vol",nil]];
206 [languagesArray addObject:[NSArray arrayWithObjects:@"Welsh",@"cym",nil]];
207 [languagesArray addObject:[NSArray arrayWithObjects:@"Walloon",@"wln",nil]];
208 [languagesArray addObject:[NSArray arrayWithObjects:@"Wolof",@"wol",nil]];
209 [languagesArray addObject:[NSArray arrayWithObjects:@"Xhosa",@"xho",nil]];
210 [languagesArray addObject:[NSArray arrayWithObjects:@"Yiddish",@"yid",nil]];
211 [languagesArray addObject:[NSArray arrayWithObjects:@"Yoruba",@"yor",nil]];
212 [languagesArray addObject:[NSArray arrayWithObjects:@"ZhuangZhuang",@"zha",nil]];
213 [languagesArray addObject:[NSArray arrayWithObjects:@"Zulu",@"zul",nil]];
215 languagesArrayDefIndex = 40;
217 /* populate the charCodeArray */
218 charCodeArray = [[NSMutableArray alloc] init];
219 [charCodeArray addObject:@"ANSI_X3.4-1968"];
220 [charCodeArray addObject:@"ANSI_X3.4-1986"];
221 [charCodeArray addObject:@"ANSI_X3.4"];
222 [charCodeArray addObject:@"ANSI_X3.110-1983"];
223 [charCodeArray addObject:@"ANSI_X3.110"];
224 [charCodeArray addObject:@"ASCII"];
225 [charCodeArray addObject:@"ECMA-114"];
226 [charCodeArray addObject:@"ECMA-118"];
227 [charCodeArray addObject:@"ECMA-128"];
228 [charCodeArray addObject:@"ECMA-CYRILLIC"];
229 [charCodeArray addObject:@"IEC_P27-1"];
230 [charCodeArray addObject:@"ISO-8859-1"];
231 [charCodeArray addObject:@"ISO-8859-2"];
232 [charCodeArray addObject:@"ISO-8859-3"];
233 [charCodeArray addObject:@"ISO-8859-4"];
234 [charCodeArray addObject:@"ISO-8859-5"];
235 [charCodeArray addObject:@"ISO-8859-6"];
236 [charCodeArray addObject:@"ISO-8859-7"];
237 [charCodeArray addObject:@"ISO-8859-8"];
238 [charCodeArray addObject:@"ISO-8859-9"];
239 [charCodeArray addObject:@"ISO-8859-9E"];
240 [charCodeArray addObject:@"ISO-8859-10"];
241 [charCodeArray addObject:@"ISO-8859-11"];
242 [charCodeArray addObject:@"ISO-8859-13"];
243 [charCodeArray addObject:@"ISO-8859-14"];
244 [charCodeArray addObject:@"ISO-8859-15"];
245 [charCodeArray addObject:@"ISO-8859-16"];
246 [charCodeArray addObject:@"UTF-7"];
247 [charCodeArray addObject:@"UTF-8"];
248 [charCodeArray addObject:@"UTF-16"];
249 [charCodeArray addObject:@"UTF-16LE"];
250 [charCodeArray addObject:@"UTF-16BE"];
251 [charCodeArray addObject:@"UTF-32"];
252 [charCodeArray addObject:@"UTF-32LE"];
253 [charCodeArray addObject:@"UTF-32BE"];
255 charCodeArrayDefIndex = 11;
261 - (void)resetWithTitle:(hb_title_t *)title
270 /* reset the subtitle source array */
271 if (subtitleSourceArray)
273 [subtitleSourceArray release];
275 subtitleSourceArray = [[NSMutableArray alloc] init];
277 /* now populate the array with the source subtitle track info */
280 hb_subtitle_t *subtitle;
281 hb_subtitle_config_t sub_config;
283 for(i = 0; i < hb_list_count( fTitle->list_subtitle ); i++ )
285 NSString * trackTypeString = @"";
286 int isPictureSub = 0;
287 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
288 sub_config = subtitle->config;
290 if (subtitle->format == PICTURESUB)
292 trackTypeString = @"- (Bitmap)";
297 trackTypeString = @"- (Text)";
300 /* create a dictionary of source subtitle information to store in our array */
301 NSString *popupName = [NSString stringWithFormat:@"%d - %@ %@",i,[NSString stringWithUTF8String:subtitle->lang],trackTypeString];
302 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
303 /* Subtitle Source track popup index */
304 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
305 /* Subtitle Source track type */
306 [newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
307 /* Subtitle Source track type (Source, Srt, etc.) */
308 [newSubtitleSourceTrack setObject:@"Source" forKey:@"sourceTrackType"];
309 /* Subtitle Source track popup isPictureSub */
310 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:isPictureSub] forKey:@"sourceTrackisPictureSub"];
312 [subtitleSourceArray addObject:newSubtitleSourceTrack];
313 [newSubtitleSourceTrack autorelease];
319 /* reset the subtitle output array */
322 [subtitleArray release];
324 subtitleArray = [[NSMutableArray alloc] init];
325 [self addSubtitleTrack];
329 #pragma mark Create new Subtitles
331 - (void)addSubtitleTrack
333 [subtitleArray addObject:[self createSubtitleTrack]];
336 /* Creates a new subtitle track and stores it in an NSMutableDictionary */
337 - (NSDictionary *)createSubtitleTrack
339 NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init];
340 /* Subtitle Source track popup index */
341 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
342 /* Subtitle Source track popup language */
343 [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
344 /* Subtitle Source track popup isPictureSub */
345 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
346 /* Subtitle track forced state */
347 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
348 /* Subtitle track burned state */
349 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
350 /* Subtitle track default state */
351 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
353 [newSubtitleTrack autorelease];
354 return newSubtitleTrack;
357 - (void)createSubtitleSrtTrack:(NSString *)filePath
359 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
360 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
361 /* create a dictionary of source subtitle information to store in our array */
362 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
363 /* Subtitle Source track popup index */
364 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
365 /* Subtitle Source track type */
366 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
367 /* Subtitle Source track type (Source, Srt, etc.) */
368 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
369 /* Subtitle Source track type */
370 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
371 /* Subtitle Source track popup isPictureSub */
372 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
374 [subtitleSourceArray addObject:newSubtitleSourceTrack];
375 [newSubtitleSourceTrack autorelease];
377 /* Now create a new srt subtitle dictionary assuming the user wants to add it to their list
378 * Note: the subtitle array always has last entry for "None", so we need to replace its
379 * position in the array and tack a "None" track back on the end of the list */
380 [subtitleArray removeObjectAtIndex:[subtitleArray count] - 1];
383 NSMutableDictionary *newSubtitleSrtTrack = [[NSMutableDictionary alloc] init];
384 /* Subtitle Source track popup index */
385 if ([subtitleArray count] == 0) // we now have an empty array so this will be our first track
387 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"];
391 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"];
393 /* Subtitle Source track popup language */
394 [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"];
395 /* Subtitle Source track popup isPictureSub */
396 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
397 /* Subtitle track forced state */
398 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
399 /* Subtitle track burned state */
400 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
401 /* Subtitle track default state */
402 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
404 /* now the srt only info, Language, Chart Code and offset */
405 [newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
406 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
407 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
408 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
410 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
411 [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
413 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"];
416 [subtitleArray addObject:newSubtitleSrtTrack];
417 [newSubtitleSrtTrack release];
419 /* now add back the none track to the end of the array */
420 [self addSubtitleTrack];
425 - (NSMutableArray*) getSubtitleArray: (NSMutableArray *) subtitlesArray
427 return subtitleArray;
430 - (void)containerChanged:(int) newContainer
432 container = newContainer;
436 #pragma mark Subtitle Table Delegate Methods
437 /* Table View delegate methods */
438 /* Returns the number of tracks displayed
439 * NOTE: we return one more than the actual number of tracks
440 * specified as we always keep one track set to "None" which is ignored
441 * for setting up tracks, but is used to add tracks.
443 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
445 if( fTitle == NULL || ![subtitleArray count])
451 return [subtitleArray count];
455 /* Used to tell the Table view which information is to be displayed per item */
456 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
458 NSString *cellEntry = @"__DATA ERROR__";
460 /* we setup whats displayed given the column identifier */
461 if ([[aTableColumn identifier] isEqualToString:@"track"])
463 /* 'track' is a popup of all available source subtitle tracks for the given title */
464 NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init];
465 [cellTrackPopup autorelease];
466 /* Set the Popups properties */
467 [cellTrackPopup setControlSize:NSSmallControlSize];
468 [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
471 /* Add our initial "None" track which we use to add source tracks or remove tracks.
472 * "None" is always index 0.
474 [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""];
476 /* Foreign Audio Search (index 1 in the popup) is only available for the first track */
479 [[cellTrackPopup menu] addItemWithTitle: @"Foreign Audio Search - (Bitmap)" action: NULL keyEquivalent: @""];
483 for(i = 0; i < [subtitleSourceArray count]; i++ )
485 [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""];
489 [aTableColumn setDataCell:cellTrackPopup];
492 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
494 /* 'forced' is a checkbox to determine if a given source track is only to be forced */
495 NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init];
496 [cellForcedCheckBox autorelease];
497 [cellForcedCheckBox setButtonType:NSSwitchButton];
498 [cellForcedCheckBox setImagePosition:NSImageOnly];
499 [cellForcedCheckBox setAllowsMixedState:NO];
500 [aTableColumn setDataCell:cellForcedCheckBox];
503 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
505 /* 'burned' is a checkbox to determine if a given source track is only to be burned */
506 NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init];
507 [cellBurnedCheckBox autorelease];
508 [cellBurnedCheckBox setButtonType:NSSwitchButton];
509 [cellBurnedCheckBox setImagePosition:NSImageOnly];
510 [cellBurnedCheckBox setAllowsMixedState:NO];
511 [aTableColumn setDataCell:cellBurnedCheckBox];
513 else if ([[aTableColumn identifier] isEqualToString:@"default"])
515 NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init];
516 [cellDefaultCheckBox autorelease];
517 [cellDefaultCheckBox setButtonType:NSSwitchButton];
518 [cellDefaultCheckBox setImagePosition:NSImageOnly];
519 [cellDefaultCheckBox setAllowsMixedState:NO];
520 [aTableColumn setDataCell:cellDefaultCheckBox];
522 /* These next three columns only apply to srt's. they are disabled for source subs */
523 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
525 /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */
526 NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init];
527 [cellSrtLangPopup autorelease];
528 /* Set the Popups properties */
529 [cellSrtLangPopup setControlSize:NSSmallControlSize];
530 [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
531 /* list our languages as per the languagesArray */
533 for(i = 0; i < [languagesArray count]; i++ )
535 [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""];
537 [aTableColumn setDataCell:cellSrtLangPopup];
539 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
541 /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */
542 NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init];
543 [cellSrtCharCodePopup autorelease];
544 /* Set the Popups properties */
545 [cellSrtCharCodePopup setControlSize:NSSmallControlSize];
546 [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
547 /* list our character codes, as per charCodeArray */
550 for(i = 0; i < [charCodeArray count]; i++ )
552 [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""];
554 [aTableColumn setDataCell:cellSrtCharCodePopup];
557 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
559 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"])
561 cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]];
565 cellEntry = [NSString stringWithFormat:@"%d",0];
576 /* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array
577 * including removing and adding new tracks via the "None" ("track" index of 0) */
578 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
581 if ([[aTableColumn identifier] isEqualToString:@"track"])
583 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"];
584 /* Set the array to track if we are vobsub (picture sub) */
585 if ([anObject intValue] != 0)
587 int sourceSubtitleIndex;
588 bool isPictureSub = FALSE;
592 sourceSubtitleIndex = [anObject intValue] - 2;
596 sourceSubtitleIndex = [anObject intValue] - 1;
599 if (rowIndex == 0 && [anObject intValue] == 1)// we are Foreign Launguage Search, which is inherently bitmap
605 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackisPictureSub"] intValue] ==1)
610 if (isPictureSub == TRUE)
612 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackisPictureSub"];
616 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
617 /* if we are not picture sub, then we must be a text sub, handbrake does not support burning in text subs */
618 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
621 /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
623 if (rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search
625 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
629 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
631 [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
632 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
636 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
642 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
644 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"];
646 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
648 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
649 /* now we need to make sure no other tracks are set to burned if we have set burned*/
650 if ([anObject intValue] == 1)
653 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
655 while ( tempObject = [enumerator nextObject] )
659 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
665 else if ([[aTableColumn identifier] isEqualToString:@"default"])
667 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
668 /* now we need to make sure no other tracks are set to default */
669 if ([anObject intValue] == 1)
672 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
674 while ( tempObject = [enumerator nextObject] )
678 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
685 /* These next three columns only apply to srt's. they are disabled for source subs */
686 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
689 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"];
690 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
691 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
694 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
697 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"];
698 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"];
700 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
702 [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"];
706 /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */
707 if ([[aTableColumn identifier] isEqualToString:@"track"])
710 /* since mp4 only supports burned in vobsubs (bitmap) we need to make sure burned in is specified */
711 if (container == HB_MUX_MP4 && [anObject intValue] != 0)
713 /* so, if isPictureSub = TRUE and we are mp4, we now have to A) set burned-in to 1 and b) remove any other
714 * tracks specified that are burned in */
715 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
717 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
722 /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
723 * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
726 if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None"
728 /* add a new empty None track */
729 [self addSubtitleTrack];
732 else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed
734 /* we know the user chose to remove this track by setting it to None, so remove it from the array */
735 /* However,if this is the first track we have to reset the selected index of the next track by + 1, since it will now become
736 * the first track, which has to account for the extra "Foreign Language Search" index. */
737 if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0)
739 /* get the index of the selection in row one (which is track two) */
740 int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue];
741 /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */
742 [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"];
744 /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */
745 [subtitleArray removeObjectAtIndex: rowIndex];
752 [aTableView reloadData];
756 /* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */
757 - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
759 /* we setup whats displayed given the column identifier */
760 if ([[aTableColumn identifier] isEqualToString:@"track"])
762 /* Set the index of the recorded source track here */
763 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]];
764 /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */
765 [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"];
771 [aCell setAlignment:NSCenterTextAlignment];
772 /* If the Track is None, we disable the other cells as None is an empty track */
773 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0)
776 [aCell setEnabled:NO];
780 /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */
781 [aCell setEnabled:YES];
784 if ([[aTableColumn identifier] isEqualToString:@"forced"])
786 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
789 [[subtitleArray objectAtIndex:rowIndex] setObject:0 forKey:@"subtitleTrackForced"];
790 [aCell setEnabled:NO];
794 [aCell setEnabled:YES];
795 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
798 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
800 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
801 /* Disable the "Burned-In" checkbox if a) the track is "None", b) the subtitle track is text (we do not support burning in
802 * text subs, or c) we are mp4 and the track is a vobsub (picture sub) */
803 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
804 [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 0 ||
805 (container == HB_MUX_MP4 && [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1))
807 [aCell setEnabled:NO];
811 [aCell setEnabled:YES];
814 else if ([[aTableColumn identifier] isEqualToString:@"default"])
816 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]];
818 /* These next three columns only apply to srt's. they are disabled for source subs */
819 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
821 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
822 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
824 [aCell setEnabled:YES];
825 if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"])
827 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]];
831 [aCell selectItemAtIndex:languagesArrayDefIndex]; // English
832 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
833 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
834 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
840 [aCell setEnabled:NO];
843 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
845 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
846 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
848 [aCell setEnabled:YES];
849 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"])
851 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]];
855 [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1
856 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
857 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
862 [aCell setEnabled:NO];
865 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
867 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
869 [aCell setEnabled:YES];
873 [aCell setEnabled:NO];
880 if (container == HB_MUX_MP4)
882 /* now remove any other tracks that are set as burned and are picturesubs */
884 int removedTracks = 0;
885 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
887 NSMutableArray *tempArrayToDelete = [NSMutableArray array];
888 BOOL removeTrack = NO;
889 while ( tempObject = [enumerator nextObject] )
892 if ([[tempObject objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
894 /* if this is the first vobsub mark it. if not, remove it */
895 if (removeTrack == NO)
897 /* make sure that this is set to be burned in */
898 [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
903 [tempArrayToDelete addObject:tempObject];
910 /* check to see if there are tracks to remove from the array */
911 if ([tempArrayToDelete count] > 0)
913 /* Popup a warning that hb only support one pic sub being burned in with mp4 */
915 status = NSRunAlertPanel(@"More than one vobsub is not supported in an mp4...",@"Your first vobsub track will now be used.", @"OK", nil, nil);
916 [NSApp requestUserAttention:NSCriticalRequest];
918 [subtitleArray removeObjectsInArray:tempArrayToDelete];
919 [aTableView reloadData];