Changeset 416

Show
Ignore:
Timestamp:
12/20/07 15:53:50 (1 year ago)
Author:
gbooker
Message:

VIDEO_TS support

  • Added a file container class (0 is QT movie, 1 is Video_ts, others can be added later)
  • Directories containing a VIDEO_TS are not remembered as directories, but rather as files

Not yet tested on the ATV

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Sapphire.xcodeproj/project.pbxproj

    r414 r416  
    7373                F5B418650D0B28A200BDD361 /* main_helper.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B418640D0B28A200BDD361 /* main_helper.m */; }; 
    7474                F5B4191B0D0B2CD300BDD361 /* ImportHelper in CopyFiles */ = {isa = PBXBuildFile; fileRef = F5B4185F0D0B288700BDD361 /* ImportHelper */; }; 
     75                F5B54DFA0D1B153200880500 /* SapphireDVDLoadingController.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B54DF40D1B149500880500 /* SapphireDVDLoadingController.m */; }; 
    7576                F5B8DEE90C8F85BB00489829 /* SapphireTVDirectory.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B8DEE80C8F85BB00489829 /* SapphireTVDirectory.m */; }; 
    7677                F5C078C70CF1033C007C9A16 /* SapphireVirtualDirectory.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C078C60CF1033C007C9A16 /* SapphireVirtualDirectory.m */; }; 
     
    262263                F5B4185F0D0B288700BDD361 /* ImportHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ImportHelper; sourceTree = BUILT_PRODUCTS_DIR; }; 
    263264                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>"; }; 
    264267                F5B8DEE70C8F85BB00489829 /* SapphireTVDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SapphireTVDirectory.h; sourceTree = "<group>"; }; 
    265268                F5B8DEE80C8F85BB00489829 /* SapphireTVDirectory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SapphireTVDirectory.m; sourceTree = "<group>"; }; 
     
    477480                        isa = PBXGroup; 
    478481                        children = ( 
    479                                 F5657BDC0CD6380C0053869E /* SapphireMediaMenuController.h */, 
    480                                 F5657BDD0CD6380C0053869E /* SapphireMediaMenuController.m */, 
     482                                F5FD9F140CE27B9C00812CE5 /* BRLayerController.h */, 
     483                                F5FD9F150CE27B9C00812CE5 /* BRLayerController.m */, 
    481484                                F5657C430CD66ECA0053869E /* SapphireCenteredMenuController.h */, 
    482485                                F5657C440CD66ECB0053869E /* SapphireCenteredMenuController.m */, 
     486                                F5B54DF30D1B149500880500 /* SapphireDVDLoadingController.h */, 
     487                                F5B54DF40D1B149500880500 /* SapphireDVDLoadingController.m */, 
     488                                F5657D0F0CD6858C0053869E /* SapphireFrontRowCompat.h */, 
     489                                F5657D100CD6858F0053869E /* SapphireFrontRowCompat.m */, 
    483490                                F54D06930CD690180081D6B1 /* SapphireLayerController.h */, 
    484491                                F54D06940CD690180081D6B1 /* SapphireLayerController.m */, 
    485492                                F5657C520CD66F740053869E /* SapphireMenuController.h */, 
    486493                                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 */, 
    491496                                F51F4B160CFC8C8C00BEBAD6 /* SapphireTextWithSpinnerController.h */, 
    492497                                F51F4B170CFC8C8C00BEBAD6 /* SapphireTextWithSpinnerController.m */, 
     
    839844                                F5B418380D0B1EA100BDD361 /* SapphireImportHelper.m in Sources */, 
    840845                                FE076E410D0CCAA40053FF1A /* NSFileManager-Extensions.m in Sources */, 
     846                                F5B54DFA0D1B153200880500 /* SapphireDVDLoadingController.m in Sources */, 
    841847                        ); 
    842848                        runOnlyForDeploymentPostprocessing = 0; 
  • trunk/SapphireBrowser.m

    r411 r416  
    3333#import "SapphireApplianceController.h" 
    3434#import "SapphireFrontRowCompat.h" 
     35#import "SapphireDVDLoadingController.h" 
    3536 
    3637#import <AudioUnit/AudioUnit.h> 
     
    710711                CFPreferencesAppSynchronize(A52_DOMIAN); 
    711712                 
    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]) 
    713722                { 
    714723                        /*Video*/ 
  • trunk/SapphireMetaData.h

    r411 r416  
    8181#define META_DATA_FILE_INFO_KIND                @"MetaDataFileInfoKind" 
    8282#define FILE_CLASS_KEY                                  @"File Class" 
     83#define FILE_CONTAINER_TYPE_KEY                 @"File Container Type" 
    8384typedef enum { 
    8485        FILE_CLASS_NOT_FILE= -1, 
     
    9091        FILE_CLASS_OTHER = 5, 
    9192} FileClass; 
     93 
     94typedef enum { 
     95        FILE_CONTAINER_TYPE_QT_MOVIE = 0, 
     96        FILE_CONTAINER_TYPE_VIDEO_TS = 1, 
     97} FileContainerType; 
    9298 
    9399#define META_DATA_FILE_ADDED_NOTIFICATION                               @"MetaDataFileAdded" 
     
    663669 */ 
    664670- (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 
    665691@end 
    666692 
  • trunk/SapphireMetaData.m

    r415 r416  
    246246} 
    247247 
     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 
    248257- (BOOL)isDirectory:(NSString *)fullPath 
    249258{ 
    250259        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; 
    252268} 
    253269 
     
    760776                                [cachedMetaDirs setObject:resolvedObject forKey:name]; 
    761777                } 
    762                 else if([allExtensions containsObject:[extension lowercaseString]]
     778                else if([allExtensions containsObject:[extension lowercaseString]] || [self hasVIDEO_TS:filePath]
    763779                { 
    764780                        if(resolvedObject != nil) 
     
    14601476                return nil; 
    14611477         
     1478        if([self hasVIDEO_TS:myPath]) 
     1479                [self setFileContainerType:FILE_CONTAINER_TYPE_VIDEO_TS]; 
    14621480        [[NSNotificationCenter defaultCenter] postNotificationName:META_DATA_FILE_ADDED_NOTIFICATION object:self]; 
    14631481         
     
    15571575                [fileMeta setObject:[NSNumber numberWithInt:META_FILE_VERSION] forKey:META_VERSION_KEY]; 
    15581576                 
    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) 
    15671578                { 
    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]) 
    15721587                        { 
    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) 
    15821592                                { 
    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); 
    15871619                                } 
    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); 
    15991620                        } 
    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)  
    16221631                                {  
    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                                        }  
    16261647                                }  
    1627                         }  
    1628                 } 
     1648                        } 
     1649                } //QTMovie 
    16291650                [file addFileData:fileMeta]; 
    16301651        } 
     
    17071728- (FileClass)fileClass 
    17081729{ 
    1709         if([[metaData objectForKey:FILE_CLASS_KEY] intValue]==nil) 
    1710                 return FILE_CLASS_UNKNOWN; 
    1711         else 
    17121730        return [[metaData objectForKey:FILE_CLASS_KEY] intValue]; 
    17131731} 
     
    17171735        [metaData setObject:[NSNumber numberWithInt:fileClass] forKey:FILE_CLASS_KEY]; 
    17181736} 
     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 
    17191748 
    17201749- (NSString *)joinedFile;