Changeset 666

Show
Ignore:
Timestamp:
02/27/07 09:04:25 (3 years ago)
Author:
vasi
Message:

prepare for better meta-data handling

Location:
QTSplit
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • QTSplit/QTChapter.m

    r665 r666  
    9797        [mov setEditable: NO]; 
    9898     
    99     [mov printMetaData]; 
    10099 
    101100    // Add meta-data to indicate title and track 
    102101    [mov setMetaData: [self name] forTag: QTMetaDataName]; 
    103     [mov printMetaData]; 
    104102    [mov setMetaData: [NSNumber numberWithInt: [self index] + 1] 
    105103        forTag: QTMetaDataTrackNum]; 
  • QTSplit/QTMovie+MetaData.m

    r665 r666  
    88 
    99// This appears to be missing in Movies.h 
    10 #define kQTMetaDataCommonKeyTrackNum 'trkn' 
     10#define kQTMetaDataUserDataKeyTrackNum 'trkn' 
    1111 
    1212/**** Private ****/ 
     
    4747static id getMetaData(QTMetaDataRef ref, OSType key); 
    4848 
     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. */ 
     51static id tryGetMetaData(QTMetaDataRef ref, OSType key); 
     52 
    4953/* Check if data is an image which can be stored in metadata. If so, return 
    5054 * an appropriate data type for storing the image. Otherwise, return 
     
    6064// Dict of regexes per pat 
    6165static NSMutableDictionary *patDict = nil; 
     66 
     67// Get the proper format for a key 
     68 
    6269 
    6370 
     
    93100    // Custom types 
    94101    switch (key) { 
    95         case kQTMetaDataCommonKeyTrackNum: { // Fix up the old data 
    96             NSData *old = getMetaData(ref, key); 
     102        case kQTMetaDataUserDataKeyTrackNum: { // Fix up the old data 
     103            NSData *old = tryGetMetaData(ref, key); 
    97104            NSMutableData *new = old ? [[old mutableCopy] autorelease] 
    98105                : [NSMutableData dataWithLength: 8]; 
     
    151158    // Custom keys 
    152159    switch (key) { 
    153         case kQTMetaDataCommonKeyTrackNum: 
     160        case kQTMetaDataUserDataKeyTrackNum: 
    154161            return [NSNumber numberWithUnsignedInt: *(uint32_t*)[data bytes]]; 
    155162    } 
     
    234241} 
    235242 
     243static 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 
    236253static id getMetaData(QTMetaDataRef ref, OSType key) { 
    237254    QTMetaDataItem item; 
     
    274291        addTag(QTMetaDataArtist,    kQTMetaDataCommonKeyArtist); 
    275292        addTag(QTMetaDataAlbum,     kQTMetaDataCommonKeyAlbum); 
    276         addTag(QTMetaDataTrackNum,  kQTMetaDataCommonKeyTrackNum); 
     293        addTag(QTMetaDataTrackNum,  kQTMetaDataUserDataKeyTrackNum); 
    277294        addTag(QTMetaDataCoverArt,  kQTMetaDataCommonKeyArtwork); 
    278295        actualTagDict = [d retain]; 
     
    340357     
    341358    QTMetaDataRemoveItemsWithKey(meta, kQTMetaDataStorageFormatQuickTime, 
    342         kQTMetaDataKeyFormatCommon, (UInt8*)&key, sizeof(key)); // Ignore errors 
     359        keyFormat, (UInt8*)&key, sizeof(key)); // Ignore errors 
    343360     
    344361    QTMetaDataItem item; 
    345362    OSStatus err = QTMetaDataAddItem(meta, kQTMetaDataStorageFormatQuickTime, 
    346         kQTMetaDataKeyFormatCommon, (UInt8*)&key, sizeof(key), 
     363        keyFormat, (UInt8*)&key, sizeof(key), 
    347364        [data bytes], [data length], type, &item); 
    348365    if (err) [ErrorException raise: QTMovieMetaDataException status: err 
  • QTSplit/QTSplit.xcodeproj/project.pbxproj

    r665 r666  
    1414                595DA4FF0B9407A500E14579 /* Tempfile.m in Sources */ = {isa = PBXBuildFile; fileRef = 595DA4FC0B94078A00E14579 /* Tempfile.m */; }; 
    1515                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 */; }; 
    1621                599C82740B9295B2000864BE /* QTTime+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 592255880B5F19FA003047FF /* QTTime+Extensions.m */; }; 
    1722                599C82750B9295B3000864BE /* QTMovie+MetaData.m in Sources */ = {isa = PBXBuildFile; fileRef = 592859180B9185CE007D691F /* QTMovie+MetaData.m */; }; 
     
    108113                        buildActionMask = 2147483647; 
    109114                        files = ( 
     115                                596E21050B945B35006888A9 /* libpcre.dylib in Frameworks */, 
    110116                                595DA0800B937C8500E14579 /* QTKit.framework in Frameworks */, 
    111117                                595DA0810B937C8600E14579 /* QuickTime.framework in Frameworks */, 
     
    335341                        files = ( 
    336342                                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 */, 
    337347                        ); 
    338348                        runOnlyForDeploymentPostprocessing = 0; 
     
    454464                                PREBINDING = NO; 
    455465                                PRODUCT_NAME = TestCase; 
     466                                USER_HEADER_SEARCH_PATHS = "$(value) $(SRCROOT)/AGRegex/pcre"; 
    456467                                ZERO_LINK = NO; 
    457468                        }; 
     
    476487                                PREBINDING = NO; 
    477488                                PRODUCT_NAME = TestCase; 
     489                                USER_HEADER_SEARCH_PATHS = "$(value) $(SRCROOT)/AGRegex/pcre"; 
    478490                                ZERO_LINK = NO; 
    479491                        }; 
  • 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" 
    552 
    563/* Usage: ./TestCase mov.m4a 
     
    6714        [err code], [err localizedDescription]]; 
    6815     
    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]; 
    7317     
    7418    [pool release];