Changeset 461

Show
Ignore:
Timestamp:
04/25/07 17:48:20 (1 year ago)
Author:
dconrad
Message:

When idle importing, only add samples to the track if the movie is paused unless necessary. Also speed up idle importing of local files considerably. Closes #143

Files:

Legend:

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

    r459 r461  
    11621162                                F5CFD2D60B5012A100616865 /* A52Codec.component */, 
    11631163                                F5CFD2D80B5012A100616865 /* AC3MovieImport.component */, 
    1164                                 F5CFD2DA0B5012A100616865 /* Preferences.app */, 
     1164                                F5CFD2DA0B5012A100616865 /* A52Preferences.app */, 
    11651165                        ); 
    11661166                        name = Products; 
     
    14301430                        sourceTree = BUILT_PRODUCTS_DIR; 
    14311431                }; 
    1432                 F5CFD2DA0B5012A100616865 /* Preferences.app */ = { 
     1432                F5CFD2DA0B5012A100616865 /* A52Preferences.app */ = { 
    14331433                        isa = PBXReferenceProxy; 
    14341434                        fileType = wrapper.application; 
    1435                         path = Preferences.app; 
     1435                        path = A52Preferences.app; 
    14361436                        remoteRef = F5CFD2D90B5012A100616865 /* PBXContainerItemProxy */; 
    14371437                        sourceTree = BUILT_PRODUCTS_DIR; 
  • trunk/ff_MovieImport.c

    r424 r461  
    398398        memset(&byteContext, 0, sizeof(byteContext)); 
    399399        result = url_open_dataref(&byteContext, dataRef, dataRefType, &storage->dataHandler, &storage->dataHandlerSupportsWideOffsets, &storage->dataSize); 
     400        storage->isStreamed = dataRefType == URLDataHandlerSubType; 
    400401        require_noerr(result, bail); 
    401402         
     
    497498                         
    498499                //import with idle. Decode a little bit of data now. 
    499                 import_with_idle(storage, inFlags, outFlags, 10, 300); 
     500                import_with_idle(storage, inFlags, outFlags, 10, 300, true); 
    500501        } else { 
    501502                //QuickTime didn't request import with idle, so do it all now. 
    502                 import_with_idle(storage, inFlags, outFlags, 0, 0);                    
     503                import_with_idle(storage, inFlags, outFlags, 0, 0, true);                      
    503504        } 
    504505         
     
    518519 
    519520ComponentResult FFAvi_MovieImportIdle(ff_global_ptr storage, long inFlags, long *outFlags) { 
    520         return(import_with_idle(storage, inFlags | movieImportWithIdle, outFlags, 0, 1000));     
     521        ComponentResult err = noErr; 
     522        TimeValue currentIdleTime = GetMovieTime(storage->movie, NULL); 
     523        TimeScale movieTimeScale = GetMovieTimeScale(storage->movie); 
     524        int addSamples = false; 
     525         
     526        storage->idlesSinceLastAdd++; 
     527         
     528        if (currentIdleTime == storage->lastIdleTime && storage->idlesSinceLastAdd > 5 ||  
     529                storage->loadedTime < currentIdleTime + 5*movieTimeScale) 
     530        { 
     531                storage->idlesSinceLastAdd = 0; 
     532                addSamples = true; 
     533        } 
     534         
     535        err = import_with_idle(storage, inFlags | movieImportWithIdle, outFlags, 0, 1000, addSamples); 
     536         
     537        storage->lastIdleTime = currentIdleTime; 
     538        return err; 
    521539} 
    522540 
  • trunk/ff_private.c

    r459 r461  
    522522                map[j].index = st->index; 
    523523                map[j].str = st; 
     524                map[j].duration = -1; 
    524525                 
    525526                if(st->codec->codec_type == CODEC_TYPE_VIDEO) { 
     
    780781 * Supports progressive importing, but will not idle if maxFrames == 0. 
    781782 */ 
    782 ComponentResult import_with_idle(ff_global_ptr storage, long inFlags, long *outFlags, int minFrames, int maxFrames) { 
     783ComponentResult import_with_idle(ff_global_ptr storage, long inFlags, long *outFlags, int minFrames, int maxFrames, bool addSamples) { 
    783784        SampleReference64Record sampleRec; 
    784785        DataHandler dataHandler; 
     
    826827                Media media = ncstream->media; 
    827828                 
    828                 if(media
     829                if(media && ncstream->duration == -1
    829830                        ncstream->duration = GetMediaDuration(media); 
    830831        } 
     
    914915                Media media = ncstream->media; 
    915916                 
    916                 if(media) { 
     917                if(media && (addSamples || readResult != 0)) { 
    917918                        Track track = GetMediaTrack(media); 
    918919                        TimeScale mediaTimeScale = GetMediaTimeScale(media); 
     
    928929                                result = InsertMediaIntoTrack(track, -1, prevDuration, addedDuration, fixed1); 
    929930                        } 
     931                        ncstream->duration = -1; 
    930932                } 
    931933        } 
     
    969971         
    970972        //tell the idle manager to idle us again in 500ms. 
    971         if(idling && storage->idleManager
     973        if(idling && storage->idleManager && storage->isStreamed
    972974                QTIdleManagerSetNextIdleTimeDelta(storage->idleManager, 1, 2); 
    973975         
  • trunk/ff_private.h

    r402 r461  
    6060        Track placeholderTrack; 
    6161        DataHandler dataHandler; 
     62        bool isStreamed; 
    6263        Boolean dataHandlerSupportsWideOffsets; 
    6364        int64_t dataSize; 
     
    6768        long movieLoadState; 
    6869        TimeValue loadedTime; 
     70        TimeValue lastIdleTime; 
     71        int idlesSinceLastAdd; 
    6972         
    7073        //the "atTime" parameter to the initial import. 
     
    100103int determine_header_offset(ff_global_ptr storage); 
    101104int import_using_index(ff_global_ptr storage, int *hadIndex, TimeValue *addedDuration); 
    102 ComponentResult import_with_idle(ff_global_ptr storage, long inFlags, long *outFlags, int minFrames, int maxFrames); 
     105ComponentResult import_with_idle(ff_global_ptr storage, long inFlags, long *outFlags, int minFrames, int maxFrames, bool addSamples); 
    103106ComponentResult create_placeholder_track(Movie movie, Track *placeholderTrack, TimeValue duration, Handle dataRef, OSType dataRefType); 
    104107void send_movie_changed_notification(Movie movie);