Changeset 666
- Timestamp:
- 02/27/07 09:04:25 (3 years ago)
- Location:
- QTSplit
- Files:
-
- 4 modified
-
QTChapter.m (modified) (1 diff)
-
QTMovie+MetaData.m (modified) (8 diffs)
-
QTSplit.xcodeproj/project.pbxproj (modified) (5 diffs)
-
TestCase.m (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
QTSplit/QTChapter.m
r665 r666 97 97 [mov setEditable: NO]; 98 98 99 [mov printMetaData];100 99 101 100 // Add meta-data to indicate title and track 102 101 [mov setMetaData: [self name] forTag: QTMetaDataName]; 103 [mov printMetaData];104 102 [mov setMetaData: [NSNumber numberWithInt: [self index] + 1] 105 103 forTag: QTMetaDataTrackNum]; -
QTSplit/QTMovie+MetaData.m
r665 r666 8 8 9 9 // This appears to be missing in Movies.h 10 #define kQTMetaData CommonKeyTrackNum 'trkn'10 #define kQTMetaDataUserDataKeyTrackNum 'trkn' 11 11 12 12 /**** Private ****/ … … 47 47 static id getMetaData(QTMetaDataRef ref, OSType key); 48 48 49 /* Sometimes when there's no metadata for a given key, QuickTime will just go 50 * nuts and give an error. This prevents those exceptions. */ 51 static id tryGetMetaData(QTMetaDataRef ref, OSType key); 52 49 53 /* Check if data is an image which can be stored in metadata. If so, return 50 54 * an appropriate data type for storing the image. Otherwise, return … … 60 64 // Dict of regexes per pat 61 65 static NSMutableDictionary *patDict = nil; 66 67 // Get the proper format for a key 68 62 69 63 70 … … 93 100 // Custom types 94 101 switch (key) { 95 case kQTMetaData CommonKeyTrackNum: { // Fix up the old data96 NSData *old = getMetaData(ref, key);102 case kQTMetaDataUserDataKeyTrackNum: { // Fix up the old data 103 NSData *old = tryGetMetaData(ref, key); 97 104 NSMutableData *new = old ? [[old mutableCopy] autorelease] 98 105 : [NSMutableData dataWithLength: 8]; … … 151 158 // Custom keys 152 159 switch (key) { 153 case kQTMetaData CommonKeyTrackNum:160 case kQTMetaDataUserDataKeyTrackNum: 154 161 return [NSNumber numberWithUnsignedInt: *(uint32_t*)[data bytes]]; 155 162 } … … 234 241 } 235 242 243 static id tryGetMetaData(QTMetaDataRef ref, OSType key) { 244 id ret; 245 @try { 246 ret = getMetaData(ref, key); 247 } @catch (NSException *exc) { 248 ret = nil; 249 } 250 return ret; 251 } 252 236 253 static id getMetaData(QTMetaDataRef ref, OSType key) { 237 254 QTMetaDataItem item; … … 274 291 addTag(QTMetaDataArtist, kQTMetaDataCommonKeyArtist); 275 292 addTag(QTMetaDataAlbum, kQTMetaDataCommonKeyAlbum); 276 addTag(QTMetaDataTrackNum, kQTMetaData CommonKeyTrackNum);293 addTag(QTMetaDataTrackNum, kQTMetaDataUserDataKeyTrackNum); 277 294 addTag(QTMetaDataCoverArt, kQTMetaDataCommonKeyArtwork); 278 295 actualTagDict = [d retain]; … … 340 357 341 358 QTMetaDataRemoveItemsWithKey(meta, kQTMetaDataStorageFormatQuickTime, 342 k QTMetaDataKeyFormatCommon, (UInt8*)&key, sizeof(key)); // Ignore errors359 keyFormat, (UInt8*)&key, sizeof(key)); // Ignore errors 343 360 344 361 QTMetaDataItem item; 345 362 OSStatus err = QTMetaDataAddItem(meta, kQTMetaDataStorageFormatQuickTime, 346 k QTMetaDataKeyFormatCommon, (UInt8*)&key, sizeof(key),363 keyFormat, (UInt8*)&key, sizeof(key), 347 364 [data bytes], [data length], type, &item); 348 365 if (err) [ErrorException raise: QTMovieMetaDataException status: err -
QTSplit/QTSplit.xcodeproj/project.pbxproj
r665 r666 14 14 595DA4FF0B9407A500E14579 /* Tempfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 595DA4FC0B94078A00E14579 /* Tempfile.m */; }; 15 15 596E1F9F0B9445D5006888A9 /* SaveChapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 596E1F9D0B9445D5006888A9 /* SaveChapter.m */; }; 16 596E21010B945B0F006888A9 /* QTMovie+MetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 592859180B9185CE007D691F /* QTMovie+MetaData.m */; }; 17 596E21030B945B25006888A9 /* ErrorException.m in Sources */ = {isa = PBXBuildFile; fileRef = 592252230B5ED657003047FF /* ErrorException.m */; }; 18 596E21040B945B2D006888A9 /* AGRegex.m in Sources */ = {isa = PBXBuildFile; fileRef = 59285CF40B922DFF007D691F /* AGRegex.m */; }; 19 596E21050B945B35006888A9 /* libpcre.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 59285C8D0B9224D8007D691F /* libpcre.dylib */; }; 20 596E210C0B945C02006888A9 /* NSString+MacTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 59E11E490B60B6EA002BF908 /* NSString+MacTypes.m */; }; 16 21 599C82740B9295B2000864BE /* QTTime+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 592255880B5F19FA003047FF /* QTTime+Extensions.m */; }; 17 22 599C82750B9295B3000864BE /* QTMovie+MetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 592859180B9185CE007D691F /* QTMovie+MetaData.m */; }; … … 108 113 buildActionMask = 2147483647; 109 114 files = ( 115 596E21050B945B35006888A9 /* libpcre.dylib in Frameworks */, 110 116 595DA0800B937C8500E14579 /* QTKit.framework in Frameworks */, 111 117 595DA0810B937C8600E14579 /* QuickTime.framework in Frameworks */, … … 335 341 files = ( 336 342 595DA08C0B937CB700E14579 /* TestCase.m in Sources */, 343 596E21010B945B0F006888A9 /* QTMovie+MetaData.m in Sources */, 344 596E21030B945B25006888A9 /* ErrorException.m in Sources */, 345 596E21040B945B2D006888A9 /* AGRegex.m in Sources */, 346 596E210C0B945C02006888A9 /* NSString+MacTypes.m in Sources */, 337 347 ); 338 348 runOnlyForDeploymentPostprocessing = 0; … … 454 464 PREBINDING = NO; 455 465 PRODUCT_NAME = TestCase; 466 USER_HEADER_SEARCH_PATHS = "$(value) $(SRCROOT)/AGRegex/pcre"; 456 467 ZERO_LINK = NO; 457 468 }; … … 476 487 PREBINDING = NO; 477 488 PRODUCT_NAME = TestCase; 489 USER_HEADER_SEARCH_PATHS = "$(value) $(SRCROOT)/AGRegex/pcre"; 478 490 ZERO_LINK = NO; 479 491 }; -
QTSplit/TestCase.m
r664 r666 1 #import <objc/objc-class.h> 2 #import <QTKit/QTKit.h> 3 4 #define Check(op) ({ \ 5 OSStatus _err = (op); \ 6 if (_err) [NSException raise: nil format: @"Err %d on line %d", \ 7 _err, __LINE__]; \ 8 }) 9 10 static void setTitle(Movie mov) { 11 NSData *data = [@"test" dataUsingEncoding: NSUTF8StringEncoding]; 12 OSType key = kQTMetaDataCommonKeyDisplayName; 13 14 QTMetaDataRef meta; 15 Check(QTCopyMovieMetaData(mov, &meta)); 16 Check(QTMetaDataAddItem(meta, kQTMetaDataStorageFormatQuickTime, 17 kQTMetaDataKeyFormatCommon, (UInt8*)&key, sizeof(key), [data bytes], 18 [data length], kQTMetaDataTypeUTF8, NULL)); 19 QTMetaDataRelease(meta); 20 } 21 22 static void removeChapterTrack(Movie mov) { 23 long count = GetMovieTrackCount(mov); 24 25 for (int i = 0; i < count; ++i) { 26 Track t = GetMovieIndTrack(mov, i + 1); 27 if (!GetTrackEnabled(t)) continue; 28 29 Track chap = GetTrackReference(t, kTrackReferenceChapterList, 1); 30 if (chap) { 31 QTTrack *t1 = [QTTrack trackWithQuickTimeTrack: chap error: nil]; 32 [t1 setTrack: nil]; 33 DisposeMovieTrack(chap); 34 return; 35 } 36 } 37 38 [NSException raise: nil format: @"Can't find chapter track"]; 39 } 40 41 static QTMovie *extractRange(QTMovie *src, QTTimeRange range) { 42 QTMovie *mov = [QTMovie movie]; 43 printf("New movie has class %s\n", [mov class]->name); 44 45 QTTime start = QTMakeTime(0, 1); 46 [mov setAttribute: [NSNumber numberWithBool: YES] 47 forKey: QTMovieEditableAttribute]; 48 [mov insertSegmentOfMovie: src timeRange: range atTime: start]; 49 50 removeChapterTrack([mov quickTimeMovie]); 51 setTitle([mov quickTimeMovie]); 52 return mov; 53 } 54 1 #import "QTMovie+MetaData.h" 55 2 56 3 /* Usage: ./TestCase mov.m4a … … 67 14 [err code], [err localizedDescription]]; 68 15 69 for (int i = 0; i < 10; ++i) { 70 QTTimeRange range = QTMakeTimeRange(QTMakeTime(i, 1), QTMakeTime(1, 1)); 71 extractRange(src, range); 72 } 16 [src printMetaData]; 73 17 74 18 [pool release];
