Changeset 416
- Timestamp:
- 12/20/07 15:53:50 (1 year ago)
- Files:
-
- trunk/Sapphire.xcodeproj/project.pbxproj (modified) (4 diffs)
- trunk/SapphireBrowser.m (modified) (2 diffs)
- trunk/SapphireDVDLoadingController.h (added)
- trunk/SapphireDVDLoadingController.m (added)
- trunk/SapphireMetaData.h (modified) (3 diffs)
- trunk/SapphireMetaData.m (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Sapphire.xcodeproj/project.pbxproj
r414 r416 73 73 F5B418650D0B28A200BDD361 /* main_helper.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B418640D0B28A200BDD361 /* main_helper.m */; }; 74 74 F5B4191B0D0B2CD300BDD361 /* ImportHelper in CopyFiles */ = {isa = PBXBuildFile; fileRef = F5B4185F0D0B288700BDD361 /* ImportHelper */; }; 75 F5B54DFA0D1B153200880500 /* SapphireDVDLoadingController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B54DF40D1B149500880500 /* SapphireDVDLoadingController.m */; }; 75 76 F5B8DEE90C8F85BB00489829 /* SapphireTVDirectory.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B8DEE80C8F85BB00489829 /* SapphireTVDirectory.m */; }; 76 77 F5C078C70CF1033C007C9A16 /* SapphireVirtualDirectory.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C078C60CF1033C007C9A16 /* SapphireVirtualDirectory.m */; }; … … 262 263 F5B4185F0D0B288700BDD361 /* ImportHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ImportHelper; sourceTree = BUILT_PRODUCTS_DIR; }; 263 264 F5B418640D0B28A200BDD361 /* main_helper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main_helper.m; sourceTree = "<group>"; }; 265 F5B54DF30D1B149500880500 /* SapphireDVDLoadingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SapphireDVDLoadingController.h; sourceTree = "<group>"; }; 266 F5B54DF40D1B149500880500 /* SapphireDVDLoadingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SapphireDVDLoadingController.m; sourceTree = "<group>"; }; 264 267 F5B8DEE70C8F85BB00489829 /* SapphireTVDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SapphireTVDirectory.h; sourceTree = "<group>"; }; 265 268 F5B8DEE80C8F85BB00489829 /* SapphireTVDirectory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SapphireTVDirectory.m; sourceTree = "<group>"; }; … … 477 480 isa = PBXGroup; 478 481 children = ( 479 F5 657BDC0CD6380C0053869E /* SapphireMediaMenuController.h */,480 F5 657BDD0CD6380C0053869E /* SapphireMediaMenuController.m */,482 F5FD9F140CE27B9C00812CE5 /* BRLayerController.h */, 483 F5FD9F150CE27B9C00812CE5 /* BRLayerController.m */, 481 484 F5657C430CD66ECA0053869E /* SapphireCenteredMenuController.h */, 482 485 F5657C440CD66ECB0053869E /* SapphireCenteredMenuController.m */, 486 F5B54DF30D1B149500880500 /* SapphireDVDLoadingController.h */, 487 F5B54DF40D1B149500880500 /* SapphireDVDLoadingController.m */, 488 F5657D0F0CD6858C0053869E /* SapphireFrontRowCompat.h */, 489 F5657D100CD6858F0053869E /* SapphireFrontRowCompat.m */, 483 490 F54D06930CD690180081D6B1 /* SapphireLayerController.h */, 484 491 F54D06940CD690180081D6B1 /* SapphireLayerController.m */, 485 492 F5657C520CD66F740053869E /* SapphireMenuController.h */, 486 493 F5657C530CD66F750053869E /* SapphireMenuController.m */, 487 F5657D0F0CD6858C0053869E /* SapphireFrontRowCompat.h */, 488 F5657D100CD6858F0053869E /* SapphireFrontRowCompat.m */, 489 F5FD9F140CE27B9C00812CE5 /* BRLayerController.h */, 490 F5FD9F150CE27B9C00812CE5 /* BRLayerController.m */, 494 F5657BDC0CD6380C0053869E /* SapphireMediaMenuController.h */, 495 F5657BDD0CD6380C0053869E /* SapphireMediaMenuController.m */, 491 496 F51F4B160CFC8C8C00BEBAD6 /* SapphireTextWithSpinnerController.h */, 492 497 F51F4B170CFC8C8C00BEBAD6 /* SapphireTextWithSpinnerController.m */, … … 839 844 F5B418380D0B1EA100BDD361 /* SapphireImportHelper.m in Sources */, 840 845 FE076E410D0CCAA40053FF1A /* NSFileManager-Extensions.m in Sources */, 846 F5B54DFA0D1B153200880500 /* SapphireDVDLoadingController.m in Sources */, 841 847 ); 842 848 runOnlyForDeploymentPostprocessing = 0; trunk/SapphireBrowser.m
r411 r416 33 33 #import "SapphireApplianceController.h" 34 34 #import "SapphireFrontRowCompat.h" 35 #import "SapphireDVDLoadingController.h" 35 36 36 37 #import <AudioUnit/AudioUnit.h> … … 710 711 CFPreferencesAppSynchronize(A52_DOMIAN); 711 712 712 if([[SapphireMetaData videoExtensions] containsObject:[path pathExtension]] && [currentPlayFile hasVideo]) 713 if ([currentPlayFile fileContainerType] == FILE_CONTAINER_TYPE_VIDEO_TS) 714 { 715 BRDVDMediaAsset *asset = [[BRDVDMediaAsset alloc] initWithPath:path]; 716 SapphireDVDLoadingController *controller = [[SapphireDVDLoadingController alloc] initWithScene:[self scene] forAsset:asset]; 717 [asset release]; 718 [[self stack] pushController:controller]; 719 [controller release]; 720 } 721 else if([[SapphireMetaData videoExtensions] containsObject:[path pathExtension]] && [currentPlayFile hasVideo]) 713 722 { 714 723 /*Video*/ trunk/SapphireMetaData.h
r411 r416 81 81 #define META_DATA_FILE_INFO_KIND @"MetaDataFileInfoKind" 82 82 #define FILE_CLASS_KEY @"File Class" 83 #define FILE_CONTAINER_TYPE_KEY @"File Container Type" 83 84 typedef enum { 84 85 FILE_CLASS_NOT_FILE= -1, … … 90 91 FILE_CLASS_OTHER = 5, 91 92 } FileClass; 93 94 typedef enum { 95 FILE_CONTAINER_TYPE_QT_MOVIE = 0, 96 FILE_CONTAINER_TYPE_VIDEO_TS = 1, 97 } FileContainerType; 92 98 93 99 #define META_DATA_FILE_ADDED_NOTIFICATION @"MetaDataFileAdded" … … 663 669 */ 664 670 - (void)setFileClass:(FileClass)fileClass; 671 672 /*! 673 * @brief The file container type 674 * 675 * This indicates if the file is a QT movie or other (such as VIDEO_TS) 676 * 677 * @return The file container type 678 */ 679 - (FileContainerType)fileContainerType; 680 681 /*! 682 * @brief Sets the file container type 683 * 684 * This indicates if the file is a QT movie or other (such as VIDEO_TS) 685 * 686 * @param fileContainerType The file container type 687 */ 688 - (void)setFileContainerType:(FileContainerType)fileContainerType; 689 690 665 691 @end 666 692 trunk/SapphireMetaData.m
r415 r416 246 246 } 247 247 248 - (BOOL)hasVIDEO_TS:(NSString *)fullPath 249 { 250 BOOL isDir = NO; 251 NSFileManager *fm = [NSFileManager defaultManager]; 252 if([fm fileExistsAtPath:[fullPath stringByAppendingPathComponent:@"VIDEO_TS"] isDirectory:&isDir] && isDir) 253 return YES; 254 return NO; 255 } 256 248 257 - (BOOL)isDirectory:(NSString *)fullPath 249 258 { 250 259 BOOL isDir = NO; 251 return [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] && isDir; 260 NSFileManager *fm = [NSFileManager defaultManager]; 261 BOOL exists = [fm fileExistsAtPath:fullPath isDirectory:&isDir]; 262 if(exists && isDir) 263 { 264 if([self hasVIDEO_TS:fullPath]) 265 return NO; 266 } 267 return exists && isDir; 252 268 } 253 269 … … 760 776 [cachedMetaDirs setObject:resolvedObject forKey:name]; 761 777 } 762 else if([allExtensions containsObject:[extension lowercaseString]] )778 else if([allExtensions containsObject:[extension lowercaseString]] || [self hasVIDEO_TS:filePath]) 763 779 { 764 780 if(resolvedObject != nil) … … 1460 1476 return nil; 1461 1477 1478 if([self hasVIDEO_TS:myPath]) 1479 [self setFileContainerType:FILE_CONTAINER_TYPE_VIDEO_TS]; 1462 1480 [[NSNotificationCenter defaultCenter] postNotificationName:META_DATA_FILE_ADDED_NOTIFICATION object:self]; 1463 1481 … … 1557 1575 [fileMeta setObject:[NSNumber numberWithInt:META_FILE_VERSION] forKey:META_VERSION_KEY]; 1558 1576 1559 /*Open the movie*/ 1560 NSError *error = nil; 1561 QTMovie *movie = [QTMovie movieWithFile:path error:&error]; 1562 QTTime duration = [movie duration]; 1563 [fileMeta setObject:[NSNumber numberWithFloat:(float)duration.timeValue/(float)duration.timeScale] forKey:DURATION_KEY]; 1564 NSArray *audioTracks = [movie tracksOfMediaType:@"soun"]; 1565 NSNumber *audioSampleRate = nil; 1566 if([audioTracks count]) 1577 if([file fileContainerType] == FILE_CONTAINER_TYPE_QT_MOVIE) 1567 1578 { 1568 /*Get the audio track*/ 1569 QTTrack *track = [audioTracks objectAtIndex:0]; 1570 QTMedia *media = [track media]; 1571 if(media != nil) 1579 /*Open the movie*/ 1580 NSError *error = nil; 1581 QTMovie *movie = [QTMovie movieWithFile:path error:&error]; 1582 QTTime duration = [movie duration]; 1583 [fileMeta setObject:[NSNumber numberWithFloat:(float)duration.timeValue/(float)duration.timeScale] forKey:DURATION_KEY]; 1584 NSArray *audioTracks = [movie tracksOfMediaType:@"soun"]; 1585 NSNumber *audioSampleRate = nil; 1586 if([audioTracks count]) 1572 1587 { 1573 /*Get the audio format*/ 1574 Media qtMedia = [media quickTimeMedia]; 1575 Handle sampleDesc = NewHandle(1); 1576 GetMediaSampleDescription(qtMedia, 1, (SampleDescriptionHandle)sampleDesc); 1577 AudioStreamBasicDescription asbd; 1578 ByteCount propSize = 0; 1579 QTSoundDescriptionGetProperty((SoundDescriptionHandle)sampleDesc, kQTPropertyClass_SoundDescription, kQTSoundDescriptionPropertyID_AudioStreamBasicDescription, sizeof(asbd), &asbd, &propSize); 1580 1581 if(propSize != 0) 1588 /*Get the audio track*/ 1589 QTTrack *track = [audioTracks objectAtIndex:0]; 1590 QTMedia *media = [track media]; 1591 if(media != nil) 1582 1592 { 1583 /*Set the format and sample rate*/ 1584 NSNumber *format = [NSNumber numberWithUnsignedInt:asbd.mFormatID]; 1585 [fileMeta setObject:format forKey:AUDIO_FORMAT_KEY]; 1586 audioSampleRate = [NSNumber numberWithDouble:asbd.mSampleRate]; 1593 /*Get the audio format*/ 1594 Media qtMedia = [media quickTimeMedia]; 1595 Handle sampleDesc = NewHandle(1); 1596 GetMediaSampleDescription(qtMedia, 1, (SampleDescriptionHandle)sampleDesc); 1597 AudioStreamBasicDescription asbd; 1598 ByteCount propSize = 0; 1599 QTSoundDescriptionGetProperty((SoundDescriptionHandle)sampleDesc, kQTPropertyClass_SoundDescription, kQTSoundDescriptionPropertyID_AudioStreamBasicDescription, sizeof(asbd), &asbd, &propSize); 1600 1601 if(propSize != 0) 1602 { 1603 /*Set the format and sample rate*/ 1604 NSNumber *format = [NSNumber numberWithUnsignedInt:asbd.mFormatID]; 1605 [fileMeta setObject:format forKey:AUDIO_FORMAT_KEY]; 1606 audioSampleRate = [NSNumber numberWithDouble:asbd.mSampleRate]; 1607 } 1608 1609 CFStringRef userText = nil; 1610 propSize = 0; 1611 QTSoundDescriptionGetProperty((SoundDescriptionHandle)sampleDesc, kQTPropertyClass_SoundDescription, kQTSoundDescriptionPropertyID_UserReadableText, sizeof(userText), &userText, &propSize); 1612 if(userText != nil) 1613 { 1614 /*Set the description*/ 1615 [fileMeta setObject:(NSString *)userText forKey:AUDIO_DESC_KEY]; 1616 CFRelease(userText); 1617 } 1618 DisposeHandle(sampleDesc); 1587 1619 } 1588 1589 CFStringRef userText = nil;1590 propSize = 0;1591 QTSoundDescriptionGetProperty((SoundDescriptionHandle)sampleDesc, kQTPropertyClass_SoundDescription, kQTSoundDescriptionPropertyID_UserReadableText, sizeof(userText), &userText, &propSize);1592 if(userText != nil)1593 {1594 /*Set the description*/1595 [fileMeta setObject:(NSString *)userText forKey:AUDIO_DESC_KEY];1596 CFRelease(userText);1597 }1598 DisposeHandle(sampleDesc);1599 1620 } 1600 } 1601 /*Set the sample rate*/ 1602 if(audioSampleRate != nil) 1603 [fileMeta setObject:audioSampleRate forKey:SAMPLE_RATE_KEY]; 1604 NSArray *videoTracks = [movie tracksOfMediaType:@"vide"]; 1605 if([videoTracks count]) 1606 { 1607 /*Get the video track*/ 1608 QTTrack *track = [videoTracks objectAtIndex:0]; 1609 QTMedia *media = [track media]; 1610 if(media != nil) 1611 { 1612 /*Get the video description*/ 1613 Media qtMedia = [media quickTimeMedia]; 1614 Handle sampleDesc = NewHandle(1); 1615 GetMediaSampleDescription(qtMedia, 1, (SampleDescriptionHandle)sampleDesc); 1616 CFStringRef userText = nil; 1617 ByteCount propSize = 0; 1618 ICMImageDescriptionGetProperty((ImageDescriptionHandle)sampleDesc, kQTPropertyClass_ImageDescription, kICMImageDescriptionPropertyID_SummaryString, sizeof(userText), &userText, &propSize); 1619 DisposeHandle(sampleDesc); 1620 1621 if(userText != nil) 1621 /*Set the sample rate*/ 1622 if(audioSampleRate != nil) 1623 [fileMeta setObject:audioSampleRate forKey:SAMPLE_RATE_KEY]; 1624 NSArray *videoTracks = [movie tracksOfMediaType:@"vide"]; 1625 if([videoTracks count]) 1626 { 1627 /*Get the video track*/ 1628 QTTrack *track = [videoTracks objectAtIndex:0]; 1629 QTMedia *media = [track media]; 1630 if(media != nil) 1622 1631 { 1623 /*Set the description*/ 1624 [fileMeta setObject:(NSString *)userText forKey:VIDEO_DESC_KEY]; 1625 CFRelease(userText); 1632 /*Get the video description*/ 1633 Media qtMedia = [media quickTimeMedia]; 1634 Handle sampleDesc = NewHandle(1); 1635 GetMediaSampleDescription(qtMedia, 1, (SampleDescriptionHandle)sampleDesc); 1636 CFStringRef userText = nil; 1637 ByteCount propSize = 0; 1638 ICMImageDescriptionGetProperty((ImageDescriptionHandle)sampleDesc, kQTPropertyClass_ImageDescription, kICMImageDescriptionPropertyID_SummaryString, sizeof(userText), &userText, &propSize); 1639 DisposeHandle(sampleDesc); 1640 1641 if(userText != nil) 1642 { 1643 /*Set the description*/ 1644 [fileMeta setObject:(NSString *)userText forKey:VIDEO_DESC_KEY]; 1645 CFRelease(userText); 1646 } 1626 1647 } 1627 } 1628 } 1648 } 1649 } //QTMovie 1629 1650 [file addFileData:fileMeta]; 1630 1651 } … … 1707 1728 - (FileClass)fileClass 1708 1729 { 1709 if([[metaData objectForKey:FILE_CLASS_KEY] intValue]==nil)1710 return FILE_CLASS_UNKNOWN;1711 else1712 1730 return [[metaData objectForKey:FILE_CLASS_KEY] intValue]; 1713 1731 } … … 1717 1735 [metaData setObject:[NSNumber numberWithInt:fileClass] forKey:FILE_CLASS_KEY]; 1718 1736 } 1737 1738 - (FileContainerType)fileContainerType 1739 { 1740 return [[metaData objectForKey:FILE_CONTAINER_TYPE_KEY] intValue]; 1741 } 1742 1743 - (void)setFileContainerType:(FileContainerType)fileContainerType 1744 { 1745 [metaData setObject:[NSNumber numberWithInt:fileContainerType] forKey:FILE_CONTAINER_TYPE_KEY]; 1746 } 1747 1719 1748 1720 1749 - (NSString *)joinedFile;
