Changeset 564
- Timestamp:
- 06/11/07 16:09:44 (1 year ago)
- Files:
-
- trunk/MatroskaImport.cpp (modified) (2 diffs)
- trunk/MatroskaImport.h (modified) (2 diffs)
- trunk/MatroskaImportPrivate.cpp (modified) (22 diffs)
- trunk/Perian.xcodeproj/project.pbxproj (modified) (1 diff)
- trunk/SubImport.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/MatroskaImport.cpp
r400 r564 235 235 long inFlags, long *outFlags) 236 236 { 237 ComponentResult err = noErr; 237 238 this->dataRef = dataRef; 238 239 this->dataRefType = dataRefType; … … 251 252 return invalidMovie; 252 253 253 SetupMovie(); 254 err = SetupMovie(); 255 if (err) return err; 254 256 255 257 // SetupMovie() couldn't find any level one elements, so nothing to import trunk/MatroskaImport.h
r476 r564 205 205 // create all the tracks and their sample descriptions as described by the file header 206 206 // also create chapters if any. Leaves el_l1 pointing to the first cluster, unread. 207 voidSetupMovie();207 ComponentResult SetupMovie(); 208 208 209 209 // This finds the next level 1 element and both replaces the el_l1 variable with it and … … 212 212 213 213 // sets up timescale & file name metadata 214 voidReadSegmentInfo(KaxInfo &segmentInfo);214 ComponentResult ReadSegmentInfo(KaxInfo &segmentInfo); 215 215 216 216 // sets up all the movie tracks and media 217 voidReadTracks(KaxTracks &trackEntries);217 ComponentResult ReadTracks(KaxTracks &trackEntries); 218 218 219 219 // Creates a chapter track, but doesn't actually add the chapter reference to the other 220 220 // enabled tracks in case some weird file has this element before the Tracks element 221 voidReadChapters(KaxChapters &chapterEntries);221 ComponentResult ReadChapters(KaxChapters &chapterEntries); 222 222 223 223 // Activates any attached fonts, ignores other attachment types for now 224 voidReadAttachments(KaxAttachments &attachments);224 ComponentResult ReadAttachments(KaxAttachments &attachments); 225 225 226 226 // Fills the levelOneElements vector with the positions of the elements in the seek head 227 voidReadMetaSeek(KaxSeekHead &seekHead);227 ComponentResult ReadMetaSeek(KaxSeekHead &seekHead); 228 228 229 229 // These three are called from ReadTracks to set up a track of the specific type, trunk/MatroskaImportPrivate.cpp
r482 r564 92 92 } 93 93 94 void MatroskaImport::SetupMovie() 95 { 94 ComponentResult MatroskaImport::SetupMovie() 95 { 96 ComponentResult err = noErr; 96 97 // once we've read the Tracks and Segment Info elements and Chapters if it's in the seek head, 97 98 // we don't need to read any more of the file … … 99 100 100 101 el_l0 = aStream->FindNextID(KaxSegment::ClassInfos, ~0); 101 if (!el_l0) return ; // nothing in the file102 if (!el_l0) return err; // nothing in the file 102 103 103 104 segmentOffset = static_cast<KaxSegment *>(el_l0)->GetDataStart(); … … 111 112 if (EbmlId(*el_l1) == KaxInfo::ClassInfos.GlobalId) { 112 113 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)); 114 115 115 116 } else if (EbmlId(*el_l1) == KaxTracks::ClassInfos.GlobalId) { 116 117 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)); 118 119 119 120 } else if (EbmlId(*el_l1) == KaxChapters::ClassInfos.GlobalId) { 120 121 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)); 122 123 123 124 } else if (EbmlId(*el_l1) == KaxAttachments::ClassInfos.GlobalId) { 124 125 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)); 126 127 127 128 } else if (EbmlId(*el_l1) == KaxSeekHead::ClassInfos.GlobalId) { 128 129 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)); 130 131 131 132 } else if (EbmlId(*el_l1) == KaxCluster::ClassInfos.GlobalId) { … … 133 134 done = true; 134 135 } 136 137 if (err) return err; 135 138 } 136 139 … … 144 147 } 145 148 } 149 150 return err; 146 151 } 147 152 … … 174 179 } 175 180 176 voidMatroskaImport::ReadSegmentInfo(KaxInfo &segmentInfo)181 ComponentResult MatroskaImport::ReadSegmentInfo(KaxInfo &segmentInfo) 177 182 { 178 183 KaxDuration & duration = GetChild<KaxDuration>(segmentInfo); … … 209 214 QTMetaDataRelease(movieMetaData); 210 215 } 211 } 212 213 void MatroskaImport::ReadTracks(KaxTracks &trackEntries) 216 return noErr; 217 } 218 219 ComponentResult MatroskaImport::ReadTracks(KaxTracks &trackEntries) 214 220 { 215 221 Track firstVideoTrack = NULL; 216 222 Track firstAudioTrack = NULL; 217 223 Track firstSubtitleTrack = NULL; 224 ComponentResult err = noErr; 218 225 219 226 // Since creating a subtitle track requires a video track to have already been created … … 237 244 case track_video: 238 245 if (pass == 2) continue; 239 if (AddVideoTrack(track, mkvTrack) != noErr) continue; 246 err = AddVideoTrack(track, mkvTrack); 247 if (err) return err; 240 248 241 249 if (firstVideoTrack) … … 247 255 case track_audio: 248 256 if (pass == 2) continue; 249 if (AddAudioTrack(track, mkvTrack) != noErr) continue; 257 err = AddAudioTrack(track, mkvTrack); 258 if (err) return err; 250 259 251 260 if (firstAudioTrack) … … 257 266 case track_subtitle: 258 267 if (pass == 1) continue; 259 if (AddSubtitleTrack(track, mkvTrack) != noErr) continue; 268 err = AddSubtitleTrack(track, mkvTrack); 269 if (err) return err; 260 270 261 271 if (firstSubtitleTrack) … … 285 295 if (!trackName.IsDefaultValue()) { 286 296 QTMetaDataRef trackMetaData; 287 OSStatuserr = QTCopyTrackMetaData(mkvTrack.theTrack, &trackMetaData);297 err = QTCopyTrackMetaData(mkvTrack.theTrack, &trackMetaData); 288 298 289 299 if (err == noErr) { … … 317 327 SetTrackEnabled(tracks[i].theTrack, tracks[i].isEnabled); 318 328 } 329 return noErr; 319 330 } 320 331 … … 367 378 368 379 mkvTrack.theMedia = NewTrackMedia(mkvTrack.theTrack, 'vide', GetMovieTimeScale(theMovie), dataRef, dataRefType); 369 if (mkvTrack.theMedia == NULL) 380 if (mkvTrack.theMedia == NULL) { 381 DisposeMovieTrack(mkvTrack.theTrack); 370 382 return GetMoviesError(); 383 } 371 384 372 385 imgDesc = (ImageDescriptionHandle) NewHandleClear(sizeof(ImageDescription)); … … 414 427 415 428 mkvTrack.theMedia = NewTrackMedia(mkvTrack.theTrack, 'soun', GetMovieTimeScale(theMovie), dataRef, dataRefType); 416 if (mkvTrack.theMedia == NULL) 429 if (mkvTrack.theMedia == NULL) { 430 DisposeMovieTrack(mkvTrack.theTrack); 417 431 return GetMoviesError(); 432 } 418 433 419 434 KaxTrackAudio & audioTrack = GetChild<KaxTrackAudio>(kaxTrack); … … 534 549 } 535 550 536 voidMatroskaImport::ReadChapters(KaxChapters &chapterEntries)551 ComponentResult MatroskaImport::ReadChapters(KaxChapters &chapterEntries) 537 552 { 538 553 KaxEditionEntry & edition = GetChild<KaxEditionEntry>(chapterEntries); … … 542 557 if (chapterTrack == NULL) { 543 558 Codecprintf(NULL, "MKV: Error creating chapter track %d\n", GetMoviesError()); 544 return ;559 return GetMoviesError(); 545 560 } 546 561 … … 559 574 if (chapterMedia == NULL) { 560 575 Codecprintf(NULL, "MKV: Error creating chapter media %d\n", GetMoviesError()); 561 return; 576 DisposeMovieTrack(chapterTrack); 577 return GetMoviesError(); 562 578 } 563 579 … … 635 651 } 636 652 637 voidMatroskaImport::ReadAttachments(KaxAttachments &attachments)653 ComponentResult MatroskaImport::ReadAttachments(KaxAttachments &attachments) 638 654 { 639 655 KaxAttached *attachedFile = FindChild<KaxAttached>(attachments); … … 655 671 attachedFile = &GetNextChild<KaxAttached>(attachments, *attachedFile); 656 672 } 657 } 658 659 void MatroskaImport::ReadMetaSeek(KaxSeekHead &seekHead) 673 return noErr; 674 } 675 676 ComponentResult MatroskaImport::ReadMetaSeek(KaxSeekHead &seekHead) 660 677 { 661 678 KaxSeek *seekEntry = FindChild<KaxSeek>(seekHead); … … 667 684 if (itr->GetID() == KaxSeekHead::ClassInfos.GlobalId && 668 685 itr->segmentPos + segmentOffset == currPos) 669 return ;686 return noErr; 670 687 } 671 688 … … 699 716 700 717 sort(levelOneElements.begin(), levelOneElements.end()); 718 719 return noErr; 701 720 } 702 721 … … 1059 1078 void MatroskaTrack::FinishTrack() 1060 1079 { 1080 CXXAutoreleasePool pool; 1061 1081 1062 1082 if (type == track_subtitle && !is_vobsub) trunk/Perian.xcodeproj/project.pbxproj
r560 r564 668 668 F560DF0203D622D001ABA332 /* FFusionCodec.r */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.rez; path = FFusionCodec.r; sourceTree = "<group>"; }; 669 669 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; }; 671 671 F5CFD1BC0B5000CE00616865 /* GBPerianPanePListGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GBPerianPanePListGenerator.h; sourceTree = "<group>"; }; 672 672 F5CFD1BD0B5000CE00616865 /* GBPerianPanePListGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GBPerianPanePListGenerator.m; sourceTree = "<group>"; }; trunk/SubImport.mm
r501 r564 92 92 // subtitle tracks should be above the video track, which should be layer 0 93 93 SetTrackLayer(theTrack, -1); 94 } else { 95 DisposeMovieTrack(theTrack); 96 theTrack = NULL; 94 97 } 95 98 }
