Changeset 164

Show
Ignore:
Timestamp:
10/15/06 18:07:02 (2 years ago)
Author:
dconrad
Message:

Add all of a track's samples in the index to the media at once. This approximately halves the time it takes to import an AVI.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ff_private.c

    r163 r164  
    512512        AVStream *stream; 
    513513        AVCodecContext *codec; 
    514         SampleReference64Record sampleRec; 
     514        SampleReference64Ptr sampleRec; 
    515515        int64_t offset,duration; 
    516516        OSStatus err; 
    517517        short flags; 
    518518        short hadIndex = 0; 
     519        int sampleNum; 
    519520         
    520521        /* process each stream in ic */ 
     
    528529                if(!ncstr->media) 
    529530                        continue; 
     531                 
     532                sampleNum = 0; 
     533                ncstr->sampleTable = calloc(stream->nb_index_entries, sizeof(SampleReference64Record)); 
    530534                 
    531535                /* now parse the index entries */ 
     
    542546                                flags |= mediaSampleNotSync; 
    543547                         
     548                        sampleRec = &ncstr->sampleTable[sampleNum++]; 
     549                         
    544550                        /* set as many fields in sampleRec as possible */ 
    545                         memset(&sampleRec, 0, sizeof(sampleRec)); 
    546                         sampleRec.dataOffset.hi = offset >> 32; 
    547                         sampleRec.dataOffset.lo = (uint32_t)offset; 
    548                         sampleRec.dataSize = stream->index_entries[k].size; 
    549                         sampleRec.sampleFlags = flags; 
     551                        sampleRec->dataOffset.hi = offset >> 32; 
     552                        sampleRec->dataOffset.lo = (uint32_t)offset; 
     553                        sampleRec->dataSize = stream->index_entries[k].size; 
     554                        sampleRec->sampleFlags = flags; 
    550555                         
    551556                        /* some samples have a data_size of zero. if that's the case, ignore them 
    552557                                * they seem to be used to stretch the frame duration & are already handled 
    553558                                * by the previous pkt */ 
    554                         if(sampleRec.dataSize <= 0) 
     559                        if(sampleRec->dataSize <= 0) { 
     560                                sampleNum--; 
    555561                                continue; 
     562                        } 
    556563                         
    557564                        /* switch for the remaining fields */ 
     
    566573                                } 
    567574                                 
    568                                 sampleRec.durationPerSample = map->base.num * duration; 
    569                                 sampleRec.numberOfSamples = 1; 
     575                                sampleRec->durationPerSample = map->base.num * duration; 
     576                                sampleRec->numberOfSamples = 1; 
    570577                        } 
    571578                        else if(codec->codec_type == CODEC_TYPE_AUDIO) { 
     
    575582                                        if(codec->frame_size == ncstr->base.num || (codec->frame_size == 0 && ncstr->base.num > 1)) { 
    576583                                                /* frame_size is set to zero for AAC and some MP3 tracks and it works this way */ 
    577                                                 sampleRec.durationPerSample = ncstr->base.num; 
    578                                                 sampleRec.numberOfSamples = 1; 
     584                                                sampleRec->durationPerSample = ncstr->base.num; 
     585                                                sampleRec->numberOfSamples = 1; 
    579586                                        } else { 
    580587                                                /* this logic seems to be needed even iff ncstr->base.num == 1, but I'm not entirely sure */ 
     
    582589                                                * Perhaps the stream's timebase is adjusted to 
    583590                                                * let that work. as the timebase has strange values...*/ 
    584                                                 sampleRec.durationPerSample = sampleRec.dataSize; 
    585                                                 sampleRec.numberOfSamples = 1; 
     591                                                sampleRec->durationPerSample = sampleRec->dataSize; 
     592                                                sampleRec->numberOfSamples = 1; 
    586593                                        } 
    587594                                } else { 
    588                                         sampleRec.durationPerSample = 1; 
    589                                         sampleRec.numberOfSamples = (stream->index_entries[k].size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket; 
     595                                        sampleRec->durationPerSample = 1; 
     596                                        sampleRec->numberOfSamples = (stream->index_entries[k].size * ncstr->asbd.mFramesPerPacket) / ncstr->asbd.mBytesPerPacket; 
    590597                                } 
    591598                        } 
    592                          
    593                         /* Add the sample to the media */ 
    594                         err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, 1, &sampleRec, NULL); 
    595599                } 
     600                /* Add all of the samples to the media */ 
     601                err = AddMediaSampleReferences64(ncstr->media, ncstr->sampleHdl, sampleNum, ncstr->sampleTable, NULL); 
     602                free(ncstr->sampleTable); 
    596603        } 
    597604        return hadIndex; 
  • trunk/ff_private.h

    r92 r164  
    3737        AVRational base; 
    3838        int64_t lastpts; 
     39        SampleReference64Ptr sampleTable; 
    3940        SampleReference64Record lastSample; 
    4041};