Changeset 1201
- Timestamp:
- 11/18/09 23:36:02 (4 months ago)
- Files:
-
- trunk/Subtitles/SubImport.h (modified) (1 diff)
- trunk/Subtitles/SubImport.mm (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Subtitles/SubImport.h
r1086 r1201 40 40 41 41 short GetFilenameLanguage(CFStringRef filename); 42 ComponentResult LoadExternalSubtitles(const FSRef *theFile, Movie theMovie);43 42 ComponentResult LoadExternalSubtitlesFromFileDataRef(Handle dataRef, OSType dataRefType, Movie theMovie); 44 43 Track CreatePlaintextSubTrack(Movie theMovie, ImageDescriptionHandle imgDesc, TimeScale timescale, Handle dataRef, OSType dataRefType, FourCharCode subType, Handle imageExtension, Rect movieBox); trunk/Subtitles/SubImport.mm
r1190 r1201 55 55 findResult.location++; 56 56 findResult.length = CFStringGetLength(baseName) - findResult.location; 57 langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 57 58 58 59 // check for 3 char language code 59 if (findResult.length == 3) { 60 char langCStr[4] = ""; 61 62 langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 63 CFStringGetCString(langStr, langCStr, 4, kCFStringEncodingASCII); 64 lang = ISO639_2ToQTLangCode(langCStr); 65 66 CFRelease(langStr); 67 68 // and for a 2 char language code 69 } else if (findResult.length == 2) { 70 char langCStr[3] = ""; 71 72 langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 73 CFStringGetCString(langStr, langCStr, 3, kCFStringEncodingASCII); 74 lang = ISO639_1ToQTLangCode(langCStr); 75 76 CFRelease(langStr); 77 } 78 60 if (findResult.length == 3) 61 lang = ISO639_2ToQTLangCode([(NSString*)langStr UTF8String]); 62 else if (findResult.length == 2) // and for a 2 char language code 63 lang = ISO639_1ToQTLangCode([(NSString*)langStr UTF8String]); 64 65 CFRelease(langStr); 79 66 CFRelease(baseName); 80 67 return lang; … … 542 529 } 543 530 544 static ComponentResult LoadSingleTextSubtitle(const FSRef *theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack, int subtitleType, int whichTrack) 545 { 546 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 547 UInt8 path[PATH_MAX]; 548 549 FSRefMakePath(theDirectory, path, PATH_MAX); 550 NSString *nsPath = [[NSString stringWithUTF8String:(char*)path] stringByAppendingPathComponent:(NSString*)filename]; 531 static ComponentResult LoadSingleTextSubtitle(CFURLRef theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack, int subtitleType, int whichTrack) 532 { 533 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 534 NSString *nsPath = [[(NSURL*)theDirectory path] stringByAppendingPathComponent:(NSString*)filename]; 551 535 552 536 SubSerializer *ss = [[SubSerializer alloc] init]; … … 890 874 int lang = langUnspecified; 891 875 if([langStr length] == 3) 892 { 893 char langCStr[4] = ""; 894 895 CFStringGetCString((CFStringRef)langStr, langCStr, 4, kCFStringEncodingASCII); 896 lang = ISO639_2ToQTLangCode(langCStr); 897 } 876 lang = ISO639_2ToQTLangCode([langStr UTF8String]); 898 877 else if([langStr length] == 2) 899 { 900 char langCStr[3] = ""; 901 902 CFStringGetCString((CFStringRef)langStr, langCStr, 3, kCFStringEncodingASCII); 903 lang = ISO639_1ToQTLangCode(langCStr); 904 } 878 lang = ISO639_1ToQTLangCode([langStr UTF8String]); 905 879 SetMediaLanguage(trackMedia, lang); 906 880 … … 920 894 } VobSubState; 921 895 922 static ComponentResult LoadVobSubSubtitles( const FSRef *theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack)896 static ComponentResult LoadVobSubSubtitles(CFURLRef theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack) 923 897 { 924 898 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 925 UInt8 path[PATH_MAX]; 926 927 FSRefMakePath(theDirectory, path, PATH_MAX); 928 NSString *nsPath = [[NSString stringWithUTF8String:(char *)path] stringByAppendingPathComponent:(NSString *)filename]; 899 NSString *nsPath = [[(NSURL*)theDirectory path] stringByAppendingPathComponent:(NSString *)filename]; 929 900 NSString *idxContent = STLoadFileWithUnknownEncoding(nsPath); 930 901 NSData *privateData = nil; … … 1018 989 NSData *subFileData = [NSData dataWithContentsOfMappedFile:subFileName]; 1019 990 FSRef subFile; 1020 FSPathMakeRef((const UInt8 *)[subFileName fileSystemRepresentation], &subFile, NULL); 1021 FSSpec theFile; 1022 FSGetCatalogInfo(&subFile, kFSCatInfoNone, NULL, NULL, &theFile, NULL); 1023 1024 if((err = QTNewDataReferenceFromFSSpec(&theFile, 0, &dataRef, &dataRefType)) != noErr) 991 FSPathMakeRef((const UInt8*)[subFileName fileSystemRepresentation], &subFile, NULL); 992 993 if((err = QTNewDataReferenceFromFSRef(&subFile, 0, &dataRef, &dataRefType)) != noErr) 1025 994 goto bail; 1026 995 … … 1065 1034 } 1066 1035 1067 ComponentResult LoadExternalSubtitles(const FSRef *theFile, Movie theMovie)1036 static ComponentResult LoadExternalSubtitles(CFURLRef theFileURL, Movie theMovie) 1068 1037 { 1069 1038 ComponentResult err = noErr; 1070 1039 Track firstSubTrack = NULL; 1071 HFSUniStr255 hfsFilename;1072 1040 CFStringRef cfFilename = NULL; 1073 1041 FSRef parentDir; … … 1076 1044 ItemCount filesFound; 1077 1045 Boolean containerChanged; 1078 1079 if (!ShouldLoadExternalSubtitles()) return noErr; 1080 1081 err = FSGetCatalogInfo(theFile, kFSCatInfoNone, NULL, &hfsFilename, NULL, &parentDir); 1082 if (err) goto bail; 1083 1046 CFURLRef parentURL; 1047 1084 1048 // find the location of the extension 1085 cfFilename = CF StringCreateWithCharacters(NULL, hfsFilename.unicode, hfsFilename.length);1049 cfFilename = CFURLCopyLastPathComponent(theFileURL); 1086 1050 baseFilenameRange = CFStringFind(cfFilename, CFSTR("."), kCFCompareBackwards); 1087 1051 … … 1095 1059 } 1096 1060 1061 parentURL = CFURLCreateCopyDeletingLastPathComponent(NULL, theFileURL); 1062 CFURLGetFSRef(parentURL, &parentDir); 1063 1097 1064 err = FSOpenIterator(&parentDir, kFSIterateFlat, &dirItr); 1098 1065 if (err) goto bail; … … 1108 1075 if (err) goto bail; 1109 1076 1110 cfFoundFilename = CFStringCreateWithCharacters (NULL, hfsFoundFilename.unicode, hfsFoundFilename.length);1077 cfFoundFilename = CFStringCreateWithCharactersNoCopy(NULL, hfsFoundFilename.unicode, hfsFoundFilename.length, kCFAllocatorNull); 1111 1078 cmpRes = CFStringCompareWithOptions(cfFoundFilename, cfFilename, baseFilenameRange, kCFCompareCaseInsensitive); 1112 1079 … … 1134 1101 actRange = CFStringFind(cfFoundFilename, CFSTR(".idx"), kCFCompareCaseInsensitive | kCFCompareBackwards); 1135 1102 if (actRange.length && actRange.location == extRange.location) 1136 err = LoadVobSubSubtitles( &parentDir, cfFoundFilename, theMovie, &firstSubTrack);1103 err = LoadVobSubSubtitles(parentURL, cfFoundFilename, theMovie, &firstSubTrack); 1137 1104 else { 1105 // SAMI 1138 1106 actRange = CFStringFind(cfFoundFilename, CFSTR(".smi"), kCFCompareCaseInsensitive | kCFCompareBackwards); 1139 1107 if (actRange.length && actRange.location == extRange.location) … … 1145 1113 1146 1114 if (subType == kSubTypeSMI) { 1147 err = LoadSingleTextSubtitle( &parentDir, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 1);1148 if (!err) err = LoadSingleTextSubtitle( &parentDir, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 2);1115 err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 1); 1116 if (!err) err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 2); 1149 1117 } 1150 1118 else if (subType != -1) 1151 err = LoadSingleTextSubtitle( &parentDir, cfFoundFilename, theMovie, &firstSubTrack, subType, 0);1119 err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, subType, 0); 1152 1120 1153 1121 if (err) goto bail; … … 1167 1135 CFRelease(cfFilename); 1168 1136 1137 CFRelease(parentURL); 1138 1169 1139 return err; 1170 1140 } … … 1173 1143 { 1174 1144 if (dataRefType != AliasDataHandlerSubType) return noErr; 1175 1145 if (!ShouldLoadExternalSubtitles()) return noErr; 1146 1176 1147 CFStringRef cfPath = NULL; 1177 FSRef ref;1178 uint8_t path[PATH_MAX];1179 1148 1180 1149 OSErr err = QTGetDataReferenceFullPathCFString(dataRef, dataRefType, kQTPOSIXPathStyle, &cfPath); 1181 1150 if(err != noErr) return err; 1182 1183 CFStringGetCString(cfPath, (char*)path, PATH_MAX, kCFStringEncodingUTF8); 1184 err = FSPathMakeRef(path, &ref, NULL); 1151 1152 CFURLRef cfURL = CFURLCreateWithFileSystemPath(NULL, cfPath, kCFURLPOSIXPathStyle, FALSE); 1185 1153 CFRelease(cfPath); 1186 1154 1187 if(err != noErr) return err; 1188 1189 return LoadExternalSubtitles(&ref, theMovie); 1155 if (!cfURL) return noErr; 1156 1157 err = LoadExternalSubtitles(cfURL, theMovie); 1158 1159 CFRelease(cfURL); 1160 1161 return err; 1190 1162 } 1191 1163 … … 1446 1418 void CXXSubSerializer::pushLine(const char *line, size_t size, unsigned start, unsigned end) 1447 1419 { 1448 NSString *str = [[NSString alloc] initWithBytes:line length:size encoding:NSUTF8StringEncoding]; 1449 NSString *strn = [str stringByAppendingString:@"\n"]; 1450 [str release]; 1451 1452 SubLine *sl = [[SubLine alloc] initWithLine:strn start:start end:end]; 1420 NSMutableString *str = [[NSMutableString alloc] initWithBytes:line length:size encoding:NSUTF8StringEncoding]; 1421 [str appendString:@"\n"]; 1422 1423 SubLine *sl = [[SubLine alloc] initWithLine:str start:start end:end]; 1453 1424 1454 1425 [sl autorelease];
