int i;
for(i = 0; i < hb_list_count( fTitle->list_subtitle ); i++ )
{
- NSString * trackTypeString = @"";
- int isPictureSub = 0;
subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
sub_config = subtitle->config;
- if (subtitle->format == PICTURESUB)
- {
- trackTypeString = @"- (Bitmap)";
- isPictureSub = 1;
- }
- else
- {
- trackTypeString = @"- (Text)";
- }
+ int canBeBurnedIn = subtitle->source == VOBSUB || subtitle->source == SSASUB;
+ int supportsForcedFlags = subtitle->source == VOBSUB;
/* create a dictionary of source subtitle information to store in our array */
- NSString *popupName = [NSString stringWithFormat:@"%d - %@ %@",i,[NSString stringWithUTF8String:subtitle->lang],trackTypeString];
NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
/* Subtitle Source track popup index */
[newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
- /* Subtitle Source track type */
+ /* Human-readable representation of subtitle->source */
+ NSString *subSourceName = [NSString stringWithUTF8String:hb_subsource_name( subtitle->source )];
+ NSString *bitmapOrText = subtitle->source == PICTURESUB ? @"Bitmap" : @"Text";
+ /* Subtitle Source track name */
+ NSString *popupName = [NSString stringWithFormat:@"%d - %@ - (%@) (%@)",i,[NSString stringWithUTF8String:subtitle->lang],bitmapOrText,subSourceName];
[newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
- /* Subtitle Source track type (Source, Srt, etc.) */
- [newSubtitleSourceTrack setObject:@"Source" forKey:@"sourceTrackType"];
- /* Subtitle Source track popup isPictureSub */
- [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:isPictureSub] forKey:@"sourceTrackisPictureSub"];
+ /* Subtitle Source track type (VobSub, Srt, etc.) */
+ [newSubtitleSourceTrack setObject:subSourceName forKey:@"sourceTrackType"];
+ /* Subtitle Source track canBeBurnedIn */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:canBeBurnedIn] forKey:@"sourceTrackCanBeBurnedIn"];
+ /* Subtitle Source track supportsForcedFlags */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:supportsForcedFlags] forKey:@"sourceTrackSupportsForcedFlags"];
[subtitleSourceArray addObject:newSubtitleSourceTrack];
[newSubtitleSourceTrack autorelease];
[newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
/* Subtitle Source track popup language */
[newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
- /* Subtitle Source track popup isPictureSub */
- [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
/* Subtitle track forced state */
[newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
/* Subtitle track burned state */
[newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
/* Subtitle track default state */
[newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+ /* Subtitle Source track canBeBurnedIn */
+ [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+ /* Subtitle Source track supportsForcedFlags */
+ [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
[newSubtitleTrack autorelease];
return newSubtitleTrack;
NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
/* Subtitle Source track popup index */
[newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
- /* Subtitle Source track type */
+ /* Subtitle Source track name */
[newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
- /* Subtitle Source track type (Source, Srt, etc.) */
+ /* Subtitle Source track type (VobSub, Srt, etc.) */
[newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
[newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
- /* Subtitle Source track type */
+ /* Subtitle Source file path */
[newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
- /* Subtitle Source track popup isPictureSub */
- [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
+ /* Subtitle Source track canBeBurnedIn */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
+ /* Subtitle Source track supportsForcedFlags */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
[subtitleSourceArray addObject:newSubtitleSourceTrack];
[newSubtitleSourceTrack autorelease];
[newSubtitleSrtTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
/* Subtitle Source track popup language */
[newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"];
- /* Subtitle Source track popup isPictureSub */
- [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
/* Subtitle track forced state */
[newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
/* Subtitle track burned state */
[newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
/* Subtitle track default state */
[newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+ /* Subtitle Source track canBeBurnedIn */
+ [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+ /* Subtitle Source track supportsForcedFlags */
+ [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
/* now the srt only info, Language, Chart Code and offset */
[newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
}
-- (NSMutableArray*) getSubtitleArray: (NSMutableArray *) subtitlesArray
+/* used to return the current subtitleArray to controller.m */
+- (NSMutableArray*) getSubtitleArray
{
return subtitleArray;
}
- (void)containerChanged:(int) newContainer
{
-container = newContainer;
+ container = newContainer;
+}
+
+- (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
+{
+ /* Note: we need to look for external subtitles so it can be added to the source array track.
+ * Remember the source container subs are already loaded with resetTitle which is already called
+ * so any external sub sources need to be added to our source subs here
+ */
+
+ int i = 0;
+ NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
+ id tempObject;
+ while ( tempObject = [enumerator nextObject] )
+ {
+ /* We have an srt track */
+ if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
+ {
+ NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"];
+ /* Start replicate the add new srt code above */
+ /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
+ NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
+ /* create a dictionary of source subtitle information to store in our array */
+ NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
+ /* Subtitle Source track popup index */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
+ /* Subtitle Source track name */
+ [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
+ /* Subtitle Source track type (VobSub, Srt, etc.) */
+ [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
+ [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
+ /* Subtitle Source file path */
+ [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
+ /* Subtitle Source track canBeBurnedIn */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
+ /* Subtitle Source track supportsForcedFlags */
+ [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
+
+ [subtitleSourceArray addObject:newSubtitleSourceTrack];
+ [newSubtitleSourceTrack autorelease];
+ /* END replicate the add new srt code above */
+ }
+ i++;
+ }
+
+
+ /*Set the subtitleArray to the newSubtitleArray */
+ [subtitleArray setArray:newSubtitleArray];
}
#pragma mark -
if ([anObject intValue] != 0)
{
int sourceSubtitleIndex;
- bool isPictureSub = FALSE;
if (rowIndex == 0)
{
sourceSubtitleIndex = [anObject intValue] - 1;
}
- if (rowIndex == 0 && [anObject intValue] == 1)// we are Foreign Launguage Search, which is inherently bitmap
- {
- isPictureSub = TRUE;
- }
- else
+ if(rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search, which is inherently vobsub
{
- if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackisPictureSub"] intValue] ==1)
- {
- isPictureSub = TRUE;
- }
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )] forKey:@"subtitleSourceTrackType"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
+ // foreign lang search is most useful when combined w/Forced Only - make it default
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackForced"];
}
- if (isPictureSub == TRUE)
+ /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
+ else if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackisPictureSub"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
}
else
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
- /* if we are not picture sub, then we must be a text sub, handbrake does not support burning in text subs */
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
- }
-
- /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] forKey:@"subtitleSourceTrackType"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackCanBeBurnedIn"] intValue]]
+ forKey:@"subtitleSourceTrackCanBeBurnedIn"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackSupportsForcedFlags"] intValue]]
+ forKey:@"subtitleSourceTrackSupportsForcedFlags"];
+ }
- if (rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search
+ if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
+ /* the source track cannot be burned in, so uncheck the widget */
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
}
- else
+
+ if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
{
- if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
- {
- [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
- [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
- }
- else
- {
- [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
- }
- }
-
+ /* the source track does not support forced flags, so uncheck the widget */
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
+ }
}
}
else if ([[aTableColumn identifier] isEqualToString:@"forced"])
}
else if ([[aTableColumn identifier] isEqualToString:@"burned"])
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
- /* now we need to make sure no other tracks are set to burned if we have set burned*/
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
+ if([anObject intValue] == 1)
+ {
+ /* Burned In and Default are mutually exclusive */
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+ }
+ /* now we need to make sure no other tracks are set to burned if we have set burned */
if ([anObject intValue] == 1)
{
int i = 0;
}
else if ([[aTableColumn identifier] isEqualToString:@"default"])
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
+ if([anObject intValue] == 1)
+ {
+ /* Burned In and Default are mutually exclusive */
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
+ }
/* now we need to make sure no other tracks are set to default */
if ([anObject intValue] == 1)
{
if ([[aTableColumn identifier] isEqualToString:@"track"])
{
- /* since mp4 only supports burned in vobsubs (bitmap) we need to make sure burned in is specified */
+ /* Since currently no quicktime based playback devices support soft vobsubs in mp4, we make sure "burned in" is specified
+ * by default to avoid massive confusion and anarchy. However we also want to guard against multiple burned in subtitle tracks
+ * as libhb would ignore all but the first one anyway. Plus it would probably be stupid.
+ */
if (container == HB_MUX_MP4 && [anObject intValue] != 0)
{
- /* so, if isPictureSub = TRUE and we are mp4, we now have to A) set burned-in to 1 and b) remove any other
- * tracks specified that are burned in */
- if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
+ if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )]])
{
- [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
+ /* lets see if there are currently any burned in subs specified */
+ NSEnumerator *enumerator = [subtitleArray objectEnumerator];
+ id tempObject;
+ BOOL subtrackBurnedInFound = NO;
+ while ( tempObject = [enumerator nextObject] )
+ {
+ if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
+ {
+ subtrackBurnedInFound = YES;
+ }
+ }
+ /* if we have no current vobsub set to burn it in ... burn it in by default */
+ if(!subtrackBurnedInFound)
+ {
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
+ /* Burned In and Default are mutually exclusive */
+ [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
+ }
}
}
-
/* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
* to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
*/
if ([[aTableColumn identifier] isEqualToString:@"forced"])
{
[aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
+ /* Disable the "Forced Only" checkbox if a) the track is "None" or b) the subtitle track doesn't support forced flags */
+ if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
+ [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
+ {
+ [aCell setEnabled:NO];
+ }
+ else
+ {
+ [aCell setEnabled:YES];
+ }
}
else if ([[aTableColumn identifier] isEqualToString:@"burned"])
{
[aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
- /* Disable the "Burned-In" checkbox if a) the track is "None", b) the subtitle track is text (we do not support burning in
- * text subs, or c) we are mp4 and the track is a vobsub (picture sub) */
+ /* Disable the "Burned In" checkbox if a) the track is "None" or b) the subtitle track can't be burned in */
if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
- [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 0 ||
- (container == HB_MUX_MP4 && [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1))
+ [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
{
[aCell setEnabled:NO];
}
}
}
-
-
- if (container == HB_MUX_MP4)
- {
- /* now remove any other tracks that are set as burned and are picturesubs */
- int i = 0;
- int removedTracks = 0;
- NSEnumerator *enumerator = [subtitleArray objectEnumerator];
- id tempObject;
- NSMutableArray *tempArrayToDelete = [NSMutableArray array];
- BOOL removeTrack = NO;
- while ( tempObject = [enumerator nextObject] )
- {
-
- if ([[tempObject objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
- {
- /* if this is the first vobsub mark it. if not, remove it */
- if (removeTrack == NO)
- {
- /* make sure that this is set to be burned in */
- [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
- removeTrack = YES;
- }
- else
- {
- [tempArrayToDelete addObject:tempObject];
- removedTracks ++;
- }
- }
-
- i++;
- }
- /* check to see if there are tracks to remove from the array */
- if ([tempArrayToDelete count] > 0)
- {
- /* Popup a warning that hb only support one pic sub being burned in with mp4 */
- int status;
- status = NSRunAlertPanel(@"More than one vobsub is not supported in an mp4...",@"Your first vobsub track will now be used.", @"OK", nil, nil);
- [NSApp requestUserAttention:NSCriticalRequest];
-
- [subtitleArray removeObjectsInArray:tempArrayToDelete];
- [aTableView reloadData];
- }
- }
+
}