Changeset 564

Show
Ignore:
Timestamp:
06/11/07 16:09:44 (1 year ago)
Author:
dconrad
Message:

Set an autorelease pool in MatroskaTrack::FinishTrack?() so we don't leak sub lines.
Make sure to destroy tracks if we fail at creating their media.
Pass errors in movie setup up correctly to be returned. Should fix #100.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/MatroskaImport.cpp

    r400 r564  
    235235                                                                                          long inFlags, long *outFlags) 
    236236{ 
     237        ComponentResult err = noErr; 
    237238        this->dataRef = dataRef; 
    238239        this->dataRefType = dataRefType; 
     
    251252                        return invalidMovie; 
    252253                 
    253                 SetupMovie(); 
     254                err = SetupMovie(); 
     255                if (err) return err; 
    254256                 
    255257                // SetupMovie() couldn't find any level one elements, so nothing to import 
  • trunk/MatroskaImport.h

    r476 r564  
    205205        // create all the tracks and their sample descriptions as described by the file header 
    206206        // also create chapters if any. Leaves el_l1 pointing to the first cluster, unread. 
    207         void SetupMovie(); 
     207        ComponentResult SetupMovie(); 
    208208         
    209209        // This finds the next level 1 element and both replaces the el_l1 variable with it and 
     
    212212         
    213213        // sets up timescale & file name metadata 
    214         void ReadSegmentInfo(KaxInfo &segmentInfo); 
     214        ComponentResult ReadSegmentInfo(KaxInfo &segmentInfo); 
    215215         
    216216        // sets up all the movie tracks and media 
    217         void ReadTracks(KaxTracks &trackEntries); 
     217        ComponentResult ReadTracks(KaxTracks &trackEntries); 
    218218         
    219219        // Creates a chapter track, but doesn't actually add the chapter reference to the other 
    220220        // enabled tracks in case some weird file has this element before the Tracks element 
    221         void ReadChapters(KaxChapters &chapterEntries); 
     221        ComponentResult ReadChapters(KaxChapters &chapterEntries); 
    222222         
    223223        // Activates any attached fonts, ignores other attachment types for now 
    224         void ReadAttachments(KaxAttachments &attachments); 
     224        ComponentResult ReadAttachments(KaxAttachments &attachments); 
    225225         
    226226        // Fills the levelOneElements vector with the positions of the elements in the seek head 
    227         void ReadMetaSeek(KaxSeekHead &seekHead); 
     227        ComponentResult ReadMetaSeek(KaxSeekHead &seekHead); 
    228228         
    229229        // These three are called from ReadTracks to set up a track of the specific type,  
  • trunk/MatroskaImportPrivate.cpp

    r482 r564  
    9292} 
    9393 
    94 void MatroskaImport::SetupMovie() 
    95 
     94ComponentResult MatroskaImport::SetupMovie() 
     95
     96        ComponentResult err = noErr; 
    9697        // once we've read the Tracks and Segment Info elements and Chapters if it's in the seek head, 
    9798        // we don't need to read any more of the file 
     
    99100         
    100101        el_l0 = aStream->FindNextID(KaxSegment::ClassInfos, ~0); 
    101         if (!el_l0) return;           // nothing in the file 
     102        if (!el_l0) return err;               // nothing in the file 
    102103         
    103104        segmentOffset = static_cast<KaxSegment *>(el_l0)->GetDataStart(); 
     
    111112                if (EbmlId(*el_l1) == KaxInfo::ClassInfos.GlobalId) { 
    112113                        el_l1->Read(*aStream, KaxInfo::ClassInfos.Context, upperLevel, dummyElt, true); 
    113                         ReadSegmentInfo(*static_cast<KaxInfo *>(el_l1)); 
     114                        err = ReadSegmentInfo(*static_cast<KaxInfo *>(el_l1)); 
    114115                         
    115116                } else if (EbmlId(*el_l1) == KaxTracks::ClassInfos.GlobalId) { 
    116117                        el_l1->Read(*aStream, KaxTracks::ClassInfos.Context, upperLevel, dummyElt, true); 
    117                         ReadTracks(*static_cast<KaxTracks *>(el_l1)); 
     118                        err = ReadTracks(*static_cast<KaxTracks *>(el_l1)); 
    118119                         
    119120                } else if (EbmlId(*el_l1) == KaxChapters::ClassInfos.GlobalId) { 
    120121                        el_l1->Read(*aStream, KaxChapters::ClassInfos.Context, upperLevel, dummyElt, true); 
    121                         ReadChapters(*static_cast<KaxChapters *>(el_l1)); 
     122                        err = ReadChapters(*static_cast<KaxChapters *>(el_l1)); 
    122123                         
    123124                } else if (EbmlId(*el_l1) == KaxAttachments::ClassInfos.GlobalId) { 
    124125                        el_l1->Read(*aStream, KaxAttachments::ClassInfos.Context, upperLevel, dummyElt, true); 
    125                         ReadAttachments(*static_cast<KaxAttachments *>(el_l1)); 
     126                        err = ReadAttachments(*static_cast<KaxAttachments *>(el_l1)); 
    126127                         
    127128                } else if (EbmlId(*el_l1) == KaxSeekHead::ClassInfos.GlobalId) { 
    128129                        el_l1->Read(*aStream, KaxSeekHead::ClassInfos.Context, upperLevel, dummyElt, true); 
    129                         ReadMetaSeek(*static_cast<KaxSeekHead *>(el_l1)); 
     130                        err = ReadMetaSeek(*static_cast<KaxSeekHead *>(el_l1)); 
    130131                         
    131132                } else if (EbmlId(*el_l1) == KaxCluster::ClassInfos.GlobalId) { 
     
    133134                        done = true; 
    134135                } 
     136                 
     137                if (err) return err; 
    135138        } 
    136139         
     
    144147                } 
    145148        } 
     149         
     150        return err; 
    146151} 
    147152 
     
    174179} 
    175180 
    176 void MatroskaImport::ReadSegmentInfo(KaxInfo &segmentInfo) 
     181ComponentResult MatroskaImport::ReadSegmentInfo(KaxInfo &segmentInfo) 
    177182{ 
    178183        KaxDuration & duration = GetChild<KaxDuration>(segmentInfo); 
     
    209214                QTMetaDataRelease(movieMetaData); 
    210215        } 
    211 
    212  
    213 void MatroskaImport::ReadTracks(KaxTracks &trackEntries) 
     216        return noErr; 
     217
     218 
     219ComponentResult MatroskaImport::ReadTracks(KaxTracks &trackEntries) 
    214220{ 
    215221        Track firstVideoTrack = NULL; 
    216222        Track firstAudioTrack = NULL; 
    217223        Track firstSubtitleTrack = NULL; 
     224        ComponentResult err = noErr; 
    218225         
    219226        // Since creating a subtitle track requires a video track to have already been created 
     
    237244                                case track_video: 
    238245                                        if (pass == 2) continue; 
    239                                         if (AddVideoTrack(track, mkvTrack) != noErr) continue; 
     246                                        err = AddVideoTrack(track, mkvTrack); 
     247                                        if (err) return err; 
    240248                                         
    241249                                        if (firstVideoTrack) 
     
    247255                                case track_audio: 
    248256                                        if (pass == 2) continue; 
    249                                         if (AddAudioTrack(track, mkvTrack) != noErr) continue; 
     257                                        err = AddAudioTrack(track, mkvTrack); 
     258                                        if (err) return err; 
    250259                                         
    251260                                        if (firstAudioTrack) 
     
    257266                                case track_subtitle: 
    258267                                        if (pass == 1) continue; 
    259                                         if (AddSubtitleTrack(track, mkvTrack) != noErr) continue; 
     268                                        err = AddSubtitleTrack(track, mkvTrack); 
     269                                        if (err) return err; 
    260270                                         
    261271                                        if (firstSubtitleTrack) 
     
    285295                        if (!trackName.IsDefaultValue()) { 
    286296                                QTMetaDataRef trackMetaData; 
    287                                 OSStatus err = QTCopyTrackMetaData(mkvTrack.theTrack, &trackMetaData); 
     297                                err = QTCopyTrackMetaData(mkvTrack.theTrack, &trackMetaData); 
    288298                                 
    289299                                if (err == noErr) { 
     
    317327                SetTrackEnabled(tracks[i].theTrack, tracks[i].isEnabled); 
    318328        } 
     329        return noErr; 
    319330} 
    320331 
     
    367378         
    368379        mkvTrack.theMedia = NewTrackMedia(mkvTrack.theTrack, 'vide', GetMovieTimeScale(theMovie), dataRef, dataRefType); 
    369         if (mkvTrack.theMedia == NULL) 
     380        if (mkvTrack.theMedia == NULL) { 
     381                DisposeMovieTrack(mkvTrack.theTrack); 
    370382                return GetMoviesError(); 
     383        } 
    371384         
    372385        imgDesc = (ImageDescriptionHandle) NewHandleClear(sizeof(ImageDescription)); 
     
    414427         
    415428        mkvTrack.theMedia = NewTrackMedia(mkvTrack.theTrack, 'soun', GetMovieTimeScale(theMovie), dataRef, dataRefType); 
    416         if (mkvTrack.theMedia == NULL) 
     429        if (mkvTrack.theMedia == NULL) { 
     430                DisposeMovieTrack(mkvTrack.theTrack); 
    417431                return GetMoviesError(); 
     432        } 
    418433         
    419434        KaxTrackAudio & audioTrack = GetChild<KaxTrackAudio>(kaxTrack); 
     
    534549} 
    535550 
    536 void MatroskaImport::ReadChapters(KaxChapters &chapterEntries) 
     551ComponentResult MatroskaImport::ReadChapters(KaxChapters &chapterEntries) 
    537552{ 
    538553        KaxEditionEntry & edition = GetChild<KaxEditionEntry>(chapterEntries); 
     
    542557        if (chapterTrack == NULL) { 
    543558                Codecprintf(NULL, "MKV: Error creating chapter track %d\n", GetMoviesError()); 
    544                 return
     559                return GetMoviesError()
    545560        } 
    546561         
     
    559574        if (chapterMedia == NULL) { 
    560575                Codecprintf(NULL, "MKV: Error creating chapter media %d\n", GetMoviesError()); 
    561                 return; 
     576                DisposeMovieTrack(chapterTrack); 
     577                return GetMoviesError(); 
    562578        } 
    563579         
     
    635651} 
    636652 
    637 void MatroskaImport::ReadAttachments(KaxAttachments &attachments) 
     653ComponentResult MatroskaImport::ReadAttachments(KaxAttachments &attachments) 
    638654{ 
    639655        KaxAttached *attachedFile = FindChild<KaxAttached>(attachments); 
     
    655671                attachedFile = &GetNextChild<KaxAttached>(attachments, *attachedFile); 
    656672        } 
    657 
    658  
    659 void MatroskaImport::ReadMetaSeek(KaxSeekHead &seekHead) 
     673        return noErr; 
     674
     675 
     676ComponentResult MatroskaImport::ReadMetaSeek(KaxSeekHead &seekHead) 
    660677{ 
    661678        KaxSeek *seekEntry = FindChild<KaxSeek>(seekHead); 
     
    667684                if (itr->GetID() == KaxSeekHead::ClassInfos.GlobalId &&  
    668685                        itr->segmentPos + segmentOffset == currPos) 
    669                         return
     686                        return noErr
    670687        } 
    671688         
     
    699716         
    700717        sort(levelOneElements.begin(), levelOneElements.end()); 
     718         
     719        return noErr; 
    701720} 
    702721 
     
    10591078void MatroskaTrack::FinishTrack() 
    10601079{ 
     1080        CXXAutoreleasePool pool; 
    10611081         
    10621082        if (type == track_subtitle && !is_vobsub) 
  • trunk/Perian.xcodeproj/project.pbxproj

    r560 r564  
    668668                F560DF0203D622D001ABA332 /* FFusionCodec.r */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; path = FFusionCodec.r; sourceTree = "<group>"; }; 
    669669                F57755F40B51EB1800C7D833 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; }; 
    670                 F5CFD1B40B50009000616865 /* PerianPanePListGenerator */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = PerianPanePListGenerator; sourceTree = BUILT_PRODUCTS_DIR; }; 
     670                F5CFD1B40B50009000616865 /* PerianPanePListGenerator */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = PerianPanePListGenerator; sourceTree = BUILT_PRODUCTS_DIR; }; 
    671671                F5CFD1BC0B5000CE00616865 /* GBPerianPanePListGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GBPerianPanePListGenerator.h; sourceTree = "<group>"; }; 
    672672                F5CFD1BD0B5000CE00616865 /* GBPerianPanePListGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GBPerianPanePListGenerator.m; sourceTree = "<group>"; }; 
  • trunk/SubImport.mm

    r501 r564  
    9292                        // subtitle tracks should be above the video track, which should be layer 0 
    9393                        SetTrackLayer(theTrack, -1); 
     94                } else { 
     95                        DisposeMovieTrack(theTrack); 
     96                        theTrack = NULL; 
    9497                } 
    9598        }